| // RUN: %target-run-simple-swiftgyb |
| // REQUIRES: executable_test |
| |
| import StdlibUnittest |
| |
| |
| var TupleTestSuite = TestSuite("Tuple") |
| |
| // Test tuple comparison operators |
| // all the tuple types use the same basic implementation for the operators |
| // so testing any arity tests the logic for them all. |
| // Include at least one invocation for all arities as a sanity check. |
| |
| % maxArity = 6 # the highest arity the operators are defined for |
| |
| func testEquality<A : Equatable, B : Equatable, C : Equatable>( |
| _ lhs: (A, B, C), equal: Bool, to rhs: (A, B, C), |
| //===--- TRACE boilerplate ----------------------------------------------===// |
| _ message: @autoclosure () -> String = "", |
| showFrame: Bool = true, |
| stackTrace: SourceLocStack = SourceLocStack(), |
| file: String = #file, line: UInt = #line |
| ) { |
| let trace = stackTrace.pushIf(showFrame, file: file, line: line) |
| expectEqual(equal, lhs == rhs, stackTrace: trace) |
| expectEqual(equal, rhs == lhs, stackTrace: trace) |
| expectEqual(!equal, lhs != rhs, stackTrace: trace) |
| expectEqual(!equal, rhs != lhs, stackTrace: trace) |
| } |
| |
| TupleTestSuite.test("Tuple/equality") { |
| testEquality((1,2,3), equal: true, to: (1,2,3)) |
| testEquality((1,2,3), equal: false, to: (1,2,4)) |
| testEquality((1,2,3), equal: false, to: (1,3,3)) |
| testEquality((1,2,3), equal: false, to: (2,2,3)) |
| testEquality((1,"2",3), equal: true, to: (1,"2",3)) |
| testEquality((1,"2",3), equal: false, to: (1,"3",3)) |
| testEquality(("one", 2.2, 3..<5), equal: true, to: ("one", 2.2, 3..<5)) |
| |
| testEquality((1.0, 2.0, 3.0), equal: false, to: (1.0, 2.0, .nan)) |
| testEquality((1.0, 2.0, 3.0), equal: false, to: (1.0, .nan, 3.0)) |
| testEquality((1.0, 2.0, 3.0), equal: false, to: (.nan, 2.0, 3.0)) |
| testEquality((1.0, 2.0, 3.0), equal: false, to: (.nan, .nan, .nan)) |
| testEquality((1.0, 2.0, Float.nan), equal: false, to: (1.0, 2.0, 3.0)) |
| testEquality((1.0, 2.0, Float.nan), equal: false, to: (1.0, 2.0, Float.nan)) |
| testEquality((Float.nan, Float.nan, Float.nan), equal: false, to: (.nan, .nan, .nan)) |
| testEquality((Float.nan, Float.nan, Float.nan), equal: false, to: (1.0, 2.0, 3.0)) |
| |
| expectTrue((1,2) == (1,2)) |
| expectTrue((1,2) != (1,3)) |
| expectTrue((1,2,3,4) == (1,2,3,4)) |
| expectTrue((1,2,3,4) != (1,2,3,3)) |
| expectTrue((1,2,3,4,5) == (1,2,3,4,5)) |
| expectTrue((1,2,3,4,5) != (1,2,3,4,4)) |
| expectTrue((1,2,3,4,5,6) == (1,2,3,4,5,6)) |
| expectTrue((1,2,3,4,5,6) != (1,2,3,4,5,5)) |
| } |
| |
| TupleTestSuite.test("Tuple/equality/sanity-check") { |
| // sanity check all arities |
| |
| expectTrue(() == ()) |
| expectFalse(() != ()) |
| expectFalse(() < ()) |
| expectTrue(() <= ()) |
| expectFalse(() > ()) |
| expectTrue(() >= ()) |
| |
| % for arity in range(2, maxArity + 1): |
| % a = str(tuple(range(1, arity + 1))) |
| % b = "({}, 0)".format(", ".join([str(i) for i in range(1, arity)])) |
| % c = "(0, {})".format(", ".join([str(i) for i in range(2, arity + 1)])) |
| expectTrue(${a} == ${a}) |
| expectTrue(${a} != ${b}) |
| expectTrue(${b} != ${a}) |
| expectTrue(${a} != ${c}) |
| expectTrue(${c} != ${a}) |
| % end |
| } |
| |
| enum Ordering : Equatable { |
| case LessThan |
| case EqualTo |
| case GreaterThan |
| case UnorderedWith // Comparable defines strict total order, but Float disobeys that with NaN |
| |
| var isLT: Bool { |
| return self == .LessThan |
| } |
| var isEQ: Bool { |
| return self == .EqualTo |
| } |
| var isGT: Bool { |
| return self == .GreaterThan |
| } |
| } |
| |
| func testOrdering<A : Comparable, B : Comparable, C : Comparable>( |
| _ lhs: (A, B, C), _ ordering: Ordering, _ rhs: (A, B, C), |
| //===--- TRACE boilerplate ----------------------------------------------===// |
| _ message: @autoclosure () -> String = "", |
| showFrame: Bool = true, |
| stackTrace: SourceLocStack = SourceLocStack(), |
| file: String = #file, line: UInt = #line |
| ) { |
| let trace = stackTrace.pushIf(showFrame, file: file, line: line) |
| expectEqual(ordering.isLT, lhs < rhs, stackTrace: trace) |
| expectEqual(ordering.isLT, rhs > lhs, stackTrace: trace) |
| expectEqual(ordering.isLT || ordering.isEQ, lhs <= rhs, stackTrace: trace) |
| expectEqual(ordering.isLT || ordering.isEQ, rhs >= lhs, stackTrace: trace) |
| expectEqual(ordering.isGT, lhs > rhs, stackTrace: trace) |
| expectEqual(ordering.isGT, rhs < lhs, stackTrace: trace) |
| expectEqual(ordering.isGT || ordering.isEQ, lhs >= rhs, stackTrace: trace) |
| expectEqual(ordering.isGT || ordering.isEQ, rhs <= lhs, stackTrace: trace) |
| } |
| |
| TupleTestSuite.test("Tuple/comparison") { |
| testOrdering((1,2,3), .EqualTo, (1,2,3)) |
| testOrdering((1,2,3), .LessThan, (1,2,4)) |
| testOrdering((1,2,3), .GreaterThan, (1,2,2)) |
| testOrdering((1,3,2), .GreaterThan, (1,2,3)) |
| testOrdering((0,2,3), .LessThan, (1,2,3)) |
| testOrdering((3,2,1), .GreaterThan, (1,2,3)) |
| |
| testOrdering(("one", 2, 3.3), .EqualTo, ("one", 2, 3.3)) |
| testOrdering(("one", 2, 3.3), .LessThan, ("one", 2, 3.4)) |
| testOrdering(("on", 2, 3.3), .LessThan, ("one", 1, 3.2)) |
| |
| testOrdering((1, 2, Float.nan), .UnorderedWith, (1, 2, .nan)) |
| testOrdering((1, Float.nan, 3), .UnorderedWith, (1, 2, 3)) |
| testOrdering((Double.nan, 2, 3), .UnorderedWith, (.nan, 2, 3)) |
| testOrdering((Float.nan, Float.nan, Float.nan), .UnorderedWith, (1, 2, 3)) |
| testOrdering((1, 2, 3.0), .UnorderedWith, (1, 2, .nan)) |
| testOrdering((1, 2, 3.0), .LessThan, (1, 3, .nan)) |
| testOrdering((1, 2, 3.0), .GreaterThan, (1, 1, .nan)) |
| testOrdering((1, 2.0, 3), .LessThan, (2, .nan, 3)) |
| testOrdering((1, 2.0, 3), .GreaterThan, (0, .nan, 3)) |
| testOrdering((1, 2, Float.nan), .LessThan, (1, 3, 3.0)) |
| testOrdering((1, Float.nan, 3), .GreaterThan, (0, 2.0, 3)) |
| testOrdering(("one", "two", 3.0), .GreaterThan, ("a", "b", .nan)) |
| testOrdering(("one", "two", .nan), .GreaterThan, ("a", "b", 3.0)) |
| testOrdering((1.0, "two", "three"), .UnorderedWith, (.nan, "two", "four")) |
| testOrdering((.nan, "two", "three"), .UnorderedWith, (1.0, "two", "four")) |
| } |
| |
| TupleTestSuite.test("Tuple/comparison/sanity-check") { |
| // sanity check all arities |
| % for arity in range(2, maxArity + 1): |
| % a = str(tuple(range(1, arity + 1))) |
| % b = "({}, 0)".format(", ".join([str(i) for i in range(1, arity)])) |
| % c = "(0, {})".format(", ".join([str(i) for i in range(2, arity + 1)])) |
| expectTrue(${b} < ${a}) |
| expectTrue(${b} <= ${a}) |
| expectTrue(${a} > ${c}) |
| expectTrue(${a} >= ${c}) |
| % end |
| } |
| |
| runAllTests() |