// RUN: %target-run-simple-swiftgyb > %t.stdout 2>&1 // RUN: %FileCheck %s < %t.stdout // REQUIRES: executable_test import StdlibUnittest // Also import modules which are used by StdlibUnittest internally. This // workaround is needed to link all required libraries in case we compile // StdlibUnittest with -sil-serialize-all. import SwiftPrivate #if _runtime(_ObjC) import ObjectiveC #endif var AssertionsTestSuite = TestSuite("Assertions") AssertionsTestSuite.test("checkEquatable/Good") { do { let xs: [MinimalEquatableValue] = [] checkEquatable(xs, oracle: { _, _ in fatalError(); () }) } do { let xs: [MinimalEquatableValue] = (0..<1).map(MinimalEquatableValue.init) checkEquatable(xs, oracle: { _, _ in true }) } for count in [1, 2, 3, 4, 20] { let xs = (0..>> bad oracle: broken reflexivity at index 1 // CHECK: [ OK ] Assertions.checkEquatable/BrokenReflexivity/1 AssertionsTestSuite.test("checkEquatable/BrokenSymmetry/1") { let xs: [MinimalEquatableValue] = (0..<2).map(MinimalEquatableValue.init) MinimalEquatableValue.equalImpl.value = { i, j in return i == j || (i == 0 && j == 1) } expectFailure { checkEquatable( xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) }) } } // CHECK: stdout>>> bad oracle: broken symmetry between indices 0, 1 // CHECK: stdout>>> bad oracle: broken symmetry between indices 1, 0 // CHECK: [ OK ] Assertions.checkEquatable/BrokenSymmetry/1 AssertionsTestSuite.test("checkEquatable/BrokenTransitivity/1") { let xs: [MinimalEquatableValue] = (0..<3).map(MinimalEquatableValue.init) MinimalEquatableValue.equalImpl.value = { i, j in switch (min(i, j), max(i, j)) { case (0, 0), (1, 1), (2, 2), (0, 1), (1, 2): return true default: return false } } expectFailure { checkEquatable( xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) }) } checkEquatable( xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) }, allowBrokenTransitivity: true) } // CHECK: stdout>>> bad oracle: broken transitivity at indices 1, 2, 0 // CHECK: [ OK ] Assertions.checkEquatable/BrokenTransitivity/1 AssertionsTestSuite.test("checkEquatable/BrokenTransitivity/2") { let xs: [MinimalEquatableValue] = (0..<10).map(MinimalEquatableValue.init) MinimalEquatableValue.equalImpl.value = { i, j in switch (min(i, j), max(i, j)) { case (1, 4), (4, 7): return true case (let i, let j) where i == j: return true default: return false } } expectFailure { checkEquatable( xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) }) } checkEquatable( xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) }, allowBrokenTransitivity: true) } // CHECK: stdout>>> bad oracle: broken transitivity at indices 4, 7, 1 // CHECK: [ OK ] Assertions.checkEquatable/BrokenTransitivity/2 AssertionsTestSuite.test("checkEquatable/BrokenTransitivity/3") { let xs: [MinimalEquatableValue] = (0..<10).map(MinimalEquatableValue.init) MinimalEquatableValue.equalImpl.value = { i, j in switch (min(i, j), max(i, j)) { case (1, 7): return false default: return true } } expectFailure { checkEquatable( xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) }) } checkEquatable( xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) }, allowBrokenTransitivity: true) } // CHECK: stdout>>> bad oracle: broken transitivity at indices 0, 7, 1 // CHECK: [ OK ] Assertions.checkEquatable/BrokenTransitivity/3 runAllTests()