// 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()

