// // ASLayoutSpecUtilitiesTests.m // AsyncDisplayKitTests // // Copyright (c) Pinterest, Inc. All rights reserved. // Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0 // #import #import "ASLayoutSpecUtilities.h" @interface ASLayoutSpecUtilitiesTests : XCTestCase @end @implementation ASLayoutSpecUtilitiesTests - (void)testMapVectorPrimitive { std::vector a = {3, 1, 4}; std::vector b = AS::map(a, ^int(int i) { return i * 2; }); std::vector c = {6, 2, 8}; XCTAssertEqual(b, c); } - (void)testMapVectorNSObject { std::vector a = {@"2.16", @"3.14"}; std::vector b = AS::map(a, ^float(NSString *str) { return str.floatValue; }); std::vector c = {2.16, 3.14}; XCTAssertEqual(b, c); } - (void)testMapVectorStruct { struct TestStruct { NSString *value; bool operator==(const TestStruct& rhs) const { return [value isEqualToString:rhs.value]; } }; std::vector a = { {.value = @"2"}, {.value = @"1"}, {.value = @"6"} }; std::vector b = AS::map(a, ^NSInteger(TestStruct s) { return s.value.integerValue; }); std::vector c = {2, 1, 6}; XCTAssertEqual(b, c); } - (void)testMapVectorClass { class TestClass { private: NSString *_value; public: TestClass (NSString *value) { _value = value; } NSString *getValue() const noexcept { return _value; } void setValue(NSString *value) noexcept { _value = value; } bool operator==(const TestClass& rhs) const noexcept { return [getValue() isEqualToString:rhs.getValue()]; } }; std::vector a = { TestClass(@"2"), TestClass(@"1"), TestClass(@"6") }; std::vector b = AS::map(a, ^NSInteger(TestClass c) { return c.getValue().integerValue; }); std::vector c = {2, 1, 6}; XCTAssertEqual(b, c); } - (void)testMapVectorEmpty { std::vector a = {}; std::vector b = AS::map(a, ^int(NSString *str) { return str.intValue; }); std::vector c = {}; XCTAssertEqual(b, c); } - (void)testMapNSFastEnumeration { struct TestStruct { NSString *value; bool operator==(const TestStruct& rhs) const { return [value isEqualToString:rhs.value]; } }; NSArray *a = @[@1, @2, @3]; std::vector b = AS::map(a, ^TestStruct(NSNumber *num) { return {.value = num.stringValue}; }); std::vector c = { {.value = @"1"}, {.value = @"2"}, {.value = @"3"} }; XCTAssertEqual(b, c); } - (void)testMapNSFastEnumerationEmpty { NSArray *a = @[]; std::vector b = AS::map(a, ^int(NSNumber *num) { return num.intValue; }); std::vector c = {}; XCTAssertEqual(b, c); } - (void)testFilterVectorPrimitive { std::vector a = {1, 2, 3, 4}; std::vector b = AS::filter(a, ^BOOL(int num) { return num < 3; }); std::vector c = {1, 2}; XCTAssertEqual(b, c); } - (void)testFilterVectorNSObject { std::vector a = {@"9", @"2", @"6"}; std::vector b = AS::filter(a, ^BOOL(NSString *str) { return str.integerValue % 2 == 0; }); std::vector c = {@"2", @"6"}; XCTAssertEqual(b, c); } - (void)testFilterVectorStruct { struct TestStruct { NSString *value; bool operator==(const TestStruct& rhs) const { return [value isEqualToString:rhs.value]; } }; std::vector a = { {.value = @"6"}, {.value = @"8"}, {.value = @"3"}, {.value = @"9"} }; std::vector b = AS::filter(a, ^BOOL(TestStruct s) { return s.value.integerValue == 3; }); std::vector c = { {.value = @"3"} }; XCTAssertEqual(b, c); } - (void)testFilterVectorClass { class TestClass { private: NSString *_value; public: TestClass (NSString *value) { _value = value; } NSString *getValue() const noexcept { return _value; } void setValue(NSString *value) noexcept { _value = value; } bool operator==(const TestClass& rhs) const noexcept { return [getValue() isEqualToString:rhs.getValue()]; } }; std::vector a = { TestClass(@"2"), TestClass(@"1"), TestClass(@"6") }; std::vector b = AS::filter(a, ^BOOL(TestClass c) { return c.getValue().integerValue > 1; }); std::vector c = { TestClass(@"2"), TestClass(@"6") }; XCTAssertEqual(b, c); } - (void)testFilterVectorEmpty { std::vector a = {}; std::vector b = AS::filter(a, ^BOOL(int num) { return num < 2; }); std::vector c = {}; XCTAssertEqual(b, c); } @end