// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//



#if DEPLOYMENT_RUNTIME_OBJC || os(Linux)
    import Foundation
    import XCTest
#else
    import SwiftFoundation
    import SwiftXCTest
#endif



class TestNotification : XCTestCase {

    static var allTests: [(String, (TestNotification) -> () throws -> Void)] {
        return [
            ("test_customReflection", test_customReflection),
        ]
    }

    func test_customReflection() {
        let someName = "somenotifname"
        let targetObject = NSObject()
        let userInfo = ["hello": "world", "indexThis": 350] as [AnyHashable: Any]
        let notif = Notification(name: Notification.Name(rawValue: someName), object: targetObject, userInfo: userInfo)
        let mirror = notif.customMirror

        XCTAssertEqual(mirror.displayStyle, .class)
        XCTAssertNil(mirror.superclassMirror)

        var children = Array(mirror.children).makeIterator()
        let firstChild = children.next()
        let secondChild = children.next()
        let thirdChild = children.next()
        XCTAssertEqual(firstChild?.label, "name")
        XCTAssertEqual(firstChild?.value as? String, someName)

        XCTAssertEqual(secondChild?.label, "object")
        XCTAssertEqual(secondChild?.value as? NSObject, targetObject)

        XCTAssertEqual(thirdChild?.label, "userInfo")
        XCTAssertEqual((thirdChild?.value as? [AnyHashable: Any])?["hello"] as? String, "world")
        XCTAssertEqual((thirdChild?.value as? [AnyHashable: Any])?["indexThis"] as? Int, 350)

    }

}
