// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

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

// RUN: %target-build-swift %s 2> %t.warnings.txt
// RUN: %FileCheck -check-prefix=CHECK-WARNINGS %s < %t.warnings.txt

import StdlibUnittest

import Foundation

var tests = TestSuite("NSError")

tests.test("user info") {
  let error = NSError(domain: "MyDomain", code: 1, userInfo: [
      // CHECK-WARNINGS: warning: 'localizedDescriptionKey' is deprecated: renamed to 'NSLocalizedDescriptionKey'
      // CHECK-WARNINGS: note: use 'NSLocalizedDescriptionKey' instead
        AnyHashable(ErrorUserInfoKey.localizedDescriptionKey.rawValue): "description",
        AnyHashable(NSLocalizedFailureReasonErrorKey): "reason"
      ])
  expectEqual("description", error.userInfo[NSLocalizedDescriptionKey]! as! String)

  expectEqual("reason", error.userInfo[ErrorUserInfoKey.localizedFailureReasonErrorKey.rawValue]! as! String)

  // TODO: Without the 'as NSObject' conversion, this produces nil.
  // We may need to forward _CustomAnyHashable through swift_newtypes.
  expectEqual("reason", error.userInfo[ErrorUserInfoKey.localizedFailureReasonErrorKey as NSObject]! as! String)
}

tests.test("convenience") {
    let error1 = CocoaError.error(.fileNoSuchFile)
    expectNotNil((error1 as NSError).localizedDescription)
    expectEqual(CocoaError.Code.fileNoSuchFile.rawValue, (error1 as NSError).code)
    
    let url = URL(string: "file:///tmp/bar/foo")
    let error2 = CocoaError.error(.fileNoSuchFile, url: url)
    expectEqual(url, (error2 as! CocoaError).url)
    expectNotNil((error2 as NSError).localizedDescription)
    expectEqual(url, (error2 as NSError).userInfo[NSURLErrorKey] as? URL)
    
    let error3 = CocoaError.error(.fileNoSuchFile, userInfo: ["foo" : "bar"], url: url)
    expectEqual(url, (error3 as! CocoaError).url)
    expectNotNil((error3 as NSError).localizedDescription)
    expectEqual(url, (error3 as NSError).userInfo[NSURLErrorKey] as? URL)
    expectEqual("bar", (error3 as NSError).userInfo["foo"] as? String)
}

tests.test("Hashable") {
  checkHashable([CocoaError.Code.fileNoSuchFile, .fileReadUnknown, .keyValueValidation], equalityOracle: { $0 == $1 })
  checkHashable([URLError.Code.unknown, .cancelled, .badURL], equalityOracle: { $0 == $1 })
}

runAllTests()
