// RUN: rm -rf %t && mkdir -p %t // RUN: %target-build-swift -swift-version 3 %s -o %t/a.out3 && %target-run %t/a.out3 // RUN: %target-build-swift -swift-version 4 %s -o %t/a.out4 && %target-run %t/a.out4 // REQUIRES: executable_test // UNSUPPORTED: OS=macosx // REQUIRES: objc_interop import UIKit import StdlibUnittest import StdlibUnittestFoundationExtras #if swift(>=4) let UIKitTests = TestSuite("UIKit_Swift4") #else let UIKitTests = TestSuite("UIKit_Swift3") #endif #if !os(watchOS) && !os(tvOS) private func printDevice(_ o: UIDeviceOrientation) -> String { var s = "\(o.isPortrait) \(UIDeviceOrientationIsPortrait(o)), " s += "\(o.isLandscape) \(UIDeviceOrientationIsLandscape(o)), " s += "\(o.isFlat), \(o.isValidInterfaceOrientation) " s += "\(UIDeviceOrientationIsValidInterfaceOrientation(o))" return s } private func printInterface(_ o: UIInterfaceOrientation) -> String { return "\(o.isPortrait) \(UIInterfaceOrientationIsPortrait(o)), " + "\(o.isLandscape) \(UIInterfaceOrientationIsLandscape(o))" } UIKitTests.test("UIDeviceOrientation") { expectEqual("false false, false false, false, false false", printDevice(.unknown)) expectEqual("true true, false false, false, true true", printDevice(.portrait)) expectEqual("true true, false false, false, true true", printDevice(.portraitUpsideDown)) expectEqual("false false, true true, false, true true", printDevice(.landscapeLeft)) expectEqual("false false, true true, false, true true", printDevice(.landscapeRight)) expectEqual("false false, false false, true, false false", printDevice(.faceUp)) expectEqual("false false, false false, true, false false", printDevice(.faceDown)) } UIKitTests.test("UIInterfaceOrientation") { expectEqual("false false, false false", printInterface(.unknown)) expectEqual("true true, false false", printInterface(.portrait)) expectEqual("true true, false false", printInterface(.portraitUpsideDown)) expectEqual("false false, true true", printInterface(.landscapeLeft)) expectEqual("false false, true true", printInterface(.landscapeRight)) } #endif UIKitTests.test("UIEdgeInsets") { let insets = [ UIEdgeInsets(top: 1.0, left: 2.0, bottom: 3.0, right: 4.0), UIEdgeInsets(top: 1.0, left: 2.0, bottom: 3.1, right: 4.0), UIEdgeInsets.zero ] checkEquatable(insets, oracle: { $0 == $1 }) } UIKitTests.test("UIOffset") { let offsets = [ UIOffset(horizontal: 1.0, vertical: 2.0), UIOffset(horizontal: 1.0, vertical: 3.0), UIOffset.zero ] checkEquatable(offsets, oracle: { $0 == $1 }) } UIKitTests.test("UIFont.Weight") { guard #available(iOS 8.2, *) else { return } #if swift(>=4) // Swift 4 let regularFontWeight: UIFont.Weight = .regular expectTrue(regularFontWeight == .regular) expectTrue(regularFontWeight > .light) expectTrue(regularFontWeight < .heavy) expectTrue(regularFontWeight + 0.1 == 0.1 + regularFontWeight) #else // Swift 3 let regularFontWeight: UIFontWeight = UIFontWeightRegular expectTrue(regularFontWeight == UIFontWeightRegular) expectTrue(regularFontWeight > UIFontWeightLight) expectTrue(regularFontWeight < UIFontWeightHeavy) expectTrue(regularFontWeight + 0.1 == 0.1 + UIFontWeightRegular) #endif } #if !os(watchOS) UIKitTests.test("UILayoutPriority") { #if swift(>=4) // Swift 4 let lowLayoutPriority: UILayoutPriority = .defaultLow let highLayoutPriority: UILayoutPriority = .defaultHigh expectTrue(lowLayoutPriority < highLayoutPriority) expectTrue(lowLayoutPriority + 2.0 == UILayoutPriority(lowLayoutPriority.rawValue + 2.0)) expectTrue(2.0 + lowLayoutPriority == UILayoutPriority(lowLayoutPriority.rawValue + 2.0)) expectTrue(lowLayoutPriority - 2.0 == UILayoutPriority(lowLayoutPriority.rawValue - 2.0)) expectTrue(highLayoutPriority - lowLayoutPriority == highLayoutPriority.rawValue - lowLayoutPriority.rawValue) expectTrue(lowLayoutPriority + (highLayoutPriority - lowLayoutPriority) == highLayoutPriority) var mutablePriority = lowLayoutPriority mutablePriority -= 1.0 mutablePriority += 2.0 expectTrue(mutablePriority == lowLayoutPriority + 1.0) let priorotyRange = lowLayoutPriority...highLayoutPriority expectTrue(priorotyRange.contains(.defaultLow)) expectFalse(priorotyRange.contains(.required)) #else // Swift 3 let lowLayoutPriority: UILayoutPriority = UILayoutPriorityDefaultLow let highLayoutPriority: UILayoutPriority = UILayoutPriorityDefaultHigh expectTrue(lowLayoutPriority < highLayoutPriority) expectTrue(2.0 + lowLayoutPriority == lowLayoutPriority + 2.0) expectTrue(lowLayoutPriority + (highLayoutPriority - lowLayoutPriority) == highLayoutPriority) var mutablePriority = lowLayoutPriority mutablePriority -= 1.0 mutablePriority += 2.0 expectTrue(mutablePriority == lowLayoutPriority + 1.0) #endif } #endif #if !os(watchOS) class TestChildView : UIView, CustomPlaygroundQuickLookable { convenience init() { self.init(frame: CGRect(x: 0, y: 0, width: 10, height: 10)) } var customPlaygroundQuickLook: PlaygroundQuickLook { return .text("child") } } UIKitTests.test("CustomPlaygroundQuickLookable") { switch PlaygroundQuickLook(reflecting: TestChildView()) { case .text("child"): break default: expectUnreachable( "TestChildView custom quicklookable should have been invoked") } } #endif UIKitTests.test("NSValue bridging") { expectBridgeToNSValue(UIEdgeInsets(top: 17, left: 38, bottom: 6, right: 79), nsValueInitializer: { NSValue(uiEdgeInsets: $0) }, nsValueGetter: { $0.uiEdgeInsetsValue }, equal: (==)) expectBridgeToNSValue(UIOffset(horizontal: 17, vertical: 38), nsValueInitializer: { NSValue(uiOffset: $0) }, nsValueGetter: { $0.uiOffsetValue }, equal: (==)) } #if os(iOS) || os(tvOS) UIKitTests.test("UIContentSizeCategory comparison") { if #available(iOS 11.0, tvOS 11.0, *) { expectTrue(UIContentSizeCategory.large < UIContentSizeCategory.extraLarge) expectTrue(UIContentSizeCategory.large <= UIContentSizeCategory.extraLarge) expectFalse(UIContentSizeCategory.large >= UIContentSizeCategory.extraLarge) expectFalse(UIContentSizeCategory.large > UIContentSizeCategory.extraLarge) expectFalse(UIContentSizeCategory.large == UIContentSizeCategory.extraLarge) expectTrue(UIContentSizeCategory.extraLarge > UIContentSizeCategory.large) expectTrue(UIContentSizeCategory.extraLarge >= UIContentSizeCategory.large) expectFalse(UIContentSizeCategory.extraLarge < UIContentSizeCategory.large) expectFalse(UIContentSizeCategory.extraLarge <= UIContentSizeCategory.large) expectFalse(UIContentSizeCategory.extraLarge == UIContentSizeCategory.large) expectTrue(UIContentSizeCategory.large == UIContentSizeCategory.large) expectTrue(UIContentSizeCategory.large >= UIContentSizeCategory.large) expectTrue(UIContentSizeCategory.large <= UIContentSizeCategory.large) expectFalse(UIContentSizeCategory.large > UIContentSizeCategory.large) expectFalse(UIContentSizeCategory.large < UIContentSizeCategory.large) expectTrue(UIContentSizeCategory.accessibilityExtraExtraExtraLarge.isAccessibilityCategory) expectFalse(UIContentSizeCategory.extraSmall.isAccessibilityCategory) } } #endif #if os(iOS) || os(watchOS) || os(tvOS) UIKitTests.test("UIFontMetrics scaling") { if #available(iOS 11.0, watchOS 4.0, tvOS 11.0, *) { let metrics = UIFontTextStyle.headline.metrics expectTrue(metrics != nil) } } #endif #if os(iOS) || os(tvOS) UIKitTests.test("UIFocusEnvironment") { if #available(iOS 11.0, tvOS 11.0, *) { let item1 = UIView() let item2 = UIView() _ = item1.contains(item2) _ = item1.isFocused } } #endif #if os(iOS) UIKitTests.test("NSItemProviderReadingWriting support") { if #available(iOS 11.0, *) { func f(session: T) { _ = session.canLoadObjects(ofClass: String.self) _ = session.canLoadObjects(ofClass: URL.self) } func g(session: T) { _ = session.loadObjects(ofClass: String.self) { _ in ()} _ = session.loadObjects(ofClass: URL.self) { _ in () } } let pc0 = UIPasteConfiguration(forAccepting: String.self) let pc1 = UIPasteConfiguration(forAccepting: URL.self) pc0.addTypeIdentifiers(forAccepting: URL.self) pc1.addTypeIdentifiers(forAccepting: String.self) var pb = UIPasteboard.general pb.setObjects(["Hello"]) pb.setObjects([URL(string: "https://www.apple.com")!]) pb.setObjects(["Hello"], localOnly: true, expirationDate: nil) pb.setObjects([URL(string: "https://www.apple.com")!], localOnly: true, expirationDate: nil) } } #endif runAllTests()