// RUN: %target-resilience-test
// REQUIRES: executable_test

// Use swift-version 4.
// UNSUPPORTED: swift_test_mode_optimize_none_with_implicit_dynamic

import StdlibUnittest
import enum_change_size


var EnumChangeSizeTest = TestSuite("EnumChangeSize")

public func getMySingletonEnumValues(_ c: ChangeSize)
    -> [SingletonEnum?] {
  return [.X(c), nil]
}

EnumChangeSizeTest.test("SingletonEnum") {
  do {
    let c = ChangeSize(value: 123)
    for e in [getMySingletonEnumValues(c), getSingletonEnumValues(c)] {
      let b: [Int] = e.map {
        switch $0 {
        case .some(.X(let cc)):
          expectEqual(c.value, cc.value)
          return 0
        case .none:
          return 1
        }
      }
      expectEqual(b, [0, 1])
    }
  }
}

public func getMySinglePayloadEnumValues(_ c: ChangeSize)
    -> [SinglePayloadEnum?] {
  return [.X(c), .Y, .Z, nil]
}

EnumChangeSizeTest.test("SinglePayloadEnum") {
  do {
    let c = ChangeSize(value: 123)
    for e in [getMySinglePayloadEnumValues(c), getSinglePayloadEnumValues(c)] {
      let b: [Int] = e.map {
        switch $0 {
        case .some(.X(let cc)):
          expectEqual(c.value, cc.value)
          return 0
        case .some(.Y):
          return 1
        case .some(.Z):
          return 2
        case .none:
          return 3
        }
      }
      expectEqual(b, [0, 1, 2, 3])
    }
  }
}

public func getMyMultiPayloadEnumValues(_ c: ChangeSize, _ d: ChangeSize)
    -> [MultiPayloadEnum?] {
  return [.X(c), .Y(d), .Z, nil]
}

EnumChangeSizeTest.test("MultiPayloadEnum") {
  do {
    let c = ChangeSize(value: 123)
    let d = ChangeSize(value: 321)
    for e in [getMyMultiPayloadEnumValues(c, d), getMultiPayloadEnumValues(c, d)] {
      let b: [Int] = e.map {
        switch $0 {
        case .some(.X(let cc)):
          expectEqual(c.value, cc.value)
          return 0
        case .some(.Y(let dd)):
          expectEqual(d.value, dd.value)
          return 1
        case .some(.Z):
          return 2
        case .none:
          return 3
        }
      }
      expectEqual(b, [0, 1, 2, 3])
    }
  }
}

runAllTests()

