blob: 8487bcdde826219b7dc1e6f7e5fd7b14db28c0a9 [file] [log] [blame]
// 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..<count).map(MinimalEquatableValue.init)
MinimalEquatableValue.equalImpl.value = { $0 == $1 }
checkEquatable(
xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) })
}
}
AssertionsTestSuite.test("checkEquatable/BrokenReflexivity/1") {
let xs: [MinimalEquatableValue] = (0..<2).map(MinimalEquatableValue.init)
MinimalEquatableValue.equalImpl.value = {
i, j in
return i == 0 && j == 0
}
expectFailure {
checkEquatable(
xs, oracle: { MinimalEquatableValue($0) == MinimalEquatableValue($1) })
}
}
// CHECK: stdout>>> 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()