// RUN: %target-run-simple-swift
// REQUIRES: executable_test
// REQUIRES: stress_test
// REQUIRES: objc_interop
// UNSUPPORTED: nonatomic_rc

import SwiftPrivate
import StdlibUnittest
import Foundation


enum SomeError : Error {
  case GoneToFail
}

struct ErrorAsNSErrorRaceTest : RaceTestWithPerTrialData {
  class RaceData {
    let error: Error

    init(error: Error) {
      self.error = error
    }
  }

  func makeRaceData() -> RaceData {
    return RaceData(error: SomeError.GoneToFail)
  }

  func makeThreadLocalData() {}

  func thread1(_ raceData: RaceData, _: inout Void) -> Observation3Int {
    let ns = raceData.error as NSError
    // Use valueForKey to bypass bridging, so we can verify that the identity
    // of the unbridged NSString object is stable.
    let domainInt: Int = unsafeBitCast(ns.value(forKey: "domain").map { $0 as AnyObject },
                                       to: Int.self)
    let code: Int = ns.code
    let userInfoInt: Int = unsafeBitCast(ns.value(forKey: "userInfo").map { $0 as AnyObject },
                                         to: Int.self)
    return Observation3Int(domainInt, code, userInfoInt)
  }

  func evaluateObservations(
    _ observations: [Observation3Int],
    _ sink: (RaceTestObservationEvaluation) -> Void
  ) {
    sink(evaluateObservationsAllEqual(observations))
  }
}

var ErrorRaceTestSuite = TestSuite("Error races")
ErrorRaceTestSuite.test("NSError bridging") {
  runRaceTest(ErrorAsNSErrorRaceTest.self, operations: 1000)
}
runAllTests()
