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

import StdlibUnittest
import Foundation
import CoreFoundation
import CoreLocation

let DemangleToMetadataTests = TestSuite("DemangleToMetadataObjC")

@objc class C : NSObject { }
@objc enum E: Int { case a }
@objc protocol P1 { }
protocol P2 { }

DemangleToMetadataTests.test("@objc classes") {
  expectEqual(type(of: C()), _typeByMangledName("4main1CC")!)
}

DemangleToMetadataTests.test("@objc enums") {
  expectEqual(type(of: E.a), _typeByMangledName("4main1EO")!)
}

func f1_composition_objc_protocol(_: P1) { }

DemangleToMetadataTests.test("@objc protocols") {
  expectEqual(type(of: f1_composition_objc_protocol),
              _typeByMangledName("yy4main2P1_pc")!)
}

DemangleToMetadataTests.test("Objective-C classes") {
  expectEqual(type(of: NSObject()), _typeByMangledName("So8NSObjectC")!)
}

func f1_composition_NSCoding(_: NSCoding) { }

DemangleToMetadataTests.test("Objective-C protocols") {
  expectEqual(type(of: f1_composition_NSCoding), _typeByMangledName("yySo8NSCoding_pc")!)
}

DemangleToMetadataTests.test("Classes that don't exist") {
  expectNil(_typeByMangledName("4main4BoomC"))
}

DemangleToMetadataTests.test("CoreFoundation classes") {
  expectEqual(CFArray.self, _typeByMangledName("So10CFArrayRefa")!)
}

DemangleToMetadataTests.test("Imported error types") {
  expectEqual(URLError.self, _typeByMangledName("10Foundation8URLErrorV")!)
  expectEqual(URLError.Code.self,
    _typeByMangledName("10Foundation8URLErrorV4CodeV")!)
}

DemangleToMetadataTests.test("Imported swift_wrapper types") {
  expectEqual(URLFileResourceType.self,
    _typeByMangledName("So21NSURLFileResourceTypea")!)
}

DemangleToMetadataTests.test("Imported enum types") {
  expectEqual(NSURLSessionTask.State.self,
    _typeByMangledName("So21NSURLSessionTaskStateV")!)
}

class CG4<T: P1, U: P2> { }
extension C : P1 { }
extension C : P2 { }

class D: P2 { }

DemangleToMetadataTests.test("@objc protocol conformances") {
  expectEqual(CG4<C, C>.self,
    _typeByMangledName("4main3CG4CyAA1CCAA1CCG")!)
  expectNil(_typeByMangledName("4main3CG4CyAA1DCAA1DCG"))
}

DemangleToMetadataTests.test("synthesized declarations") {
  expectEqual(CLError.self, _typeByMangledName("SC7CLErrorLeV")!)
  expectNil(_typeByMangledName("SC7CLErrorV"))
  expectEqual(CLError.Code.self, _typeByMangledName("So7CLErrorV")!)

  let error = NSError(domain: NSCocoaErrorDomain, code: 0)
  let reflectionString = String(reflecting: CLError(_nsError: error))
  expectTrue(reflectionString.hasPrefix("__C_Synthesized.related decl 'e' for CLError(_nsError:"))
}

runAllTests()

