├── activity.png
├── xcode832.xcodeproj
├── xcuserdata
│ └── pte05.xcuserdatad
│ │ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── xcode832.xcscheme
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcuserdata
│ │ └── pte05.xcuserdatad
│ │ ├── UserInterfaceState.xcuserstate
│ │ └── IDEFindNavigatorScopes.plist
└── project.pbxproj
├── xcode832UITests
├── Info.plist
├── helpers
│ └── Helpers.swift
└── xcode832UITests.swift
├── Service.swift
├── xcode832
├── Info.plist
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── AppDelegate.swift
└── ViewController.swift
└── README.md
/activity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mvemjsun/Xcode83/HEAD/activity.png
--------------------------------------------------------------------------------
/xcode832.xcodeproj/xcuserdata/pte05.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/xcode832.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/xcode832.xcodeproj/project.xcworkspace/xcuserdata/pte05.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mvemjsun/Xcode83/HEAD/xcode832.xcodeproj/project.xcworkspace/xcuserdata/pte05.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/xcode832.xcodeproj/project.xcworkspace/xcuserdata/pte05.xcuserdatad/IDEFindNavigatorScopes.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/xcode832.xcodeproj/xcuserdata/pte05.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | xcode832.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | D10FDE0B1ED82A860007A9E7
16 |
17 | primary
18 |
19 |
20 | D10FDE1F1ED82A860007A9E7
21 |
22 | primary
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/xcode832UITests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSAppTransportSecurity
6 |
7 | NSAllowsArbitraryLoads
8 |
9 |
10 | CFBundleIdentifier
11 | $(PRODUCT_BUNDLE_IDENTIFIER)
12 | CFBundleShortVersionString
13 | 1.0
14 | CFBundleName
15 | $(PRODUCT_NAME)
16 | CFBundleInfoDictionaryVersion
17 | 6.0
18 | CFBundleDevelopmentRegion
19 | en
20 | CFBundleExecutable
21 | $(EXECUTABLE_NAME)
22 | CFBundlePackageType
23 | BNDL
24 | CFBundleVersion
25 | 1
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Service.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Service.swift
3 | // xcode832
4 | //
5 | // Created by mvemjsun on 31/05/2017.
6 | // Copyright © 2017 . All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct CountryData {
12 | var messages : Set = []
13 | var name: String?
14 | var alpha2Code: String?
15 | var alpha3Code: String?
16 | }
17 |
18 | extension CountryData {
19 |
20 | init?(json: [String: Any]) {
21 | if let countryDataJson = json["RestResponse"] as? [String: Any] {
22 | let countryData = countryDataJson["result"] as? [String: Any]
23 | name = countryData?["name"] as? String
24 | alpha2Code = countryData?["alpha2_code"] as? String
25 | alpha3Code = countryData?["alpha3_code"] as? String
26 | for messageData in (countryDataJson["messages"] as? [String])! {
27 | messages.insert(messageData)
28 | }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/xcode832UITests/helpers/Helpers.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Helpers.swift
3 | // xcode832UITests
4 | //
5 | // Created by mvemjsun on 12/06/2017.
6 | // Copyright © 2017 NowTV. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import XCTest
11 |
12 | extension XCTest {
13 |
14 | func Given(_ text: String, step: () -> Void ) {
15 | XCTContext.runActivity(named: #function + " " + text) { _ in
16 | step()
17 | }
18 | }
19 |
20 | func When(_ text: String, step: () -> Void ) {
21 | XCTContext.runActivity(named: #function + " " + text) { _ in
22 | step()
23 | }
24 | }
25 |
26 | func Then(_ text: String, step: () -> Void ) {
27 | XCTContext.runActivity(named: #function + " " + text) { _ in
28 | step()
29 | }
30 | }
31 |
32 | func And(_ text: String, step: () -> Void ) {
33 | XCTContext.runActivity(named: #function + " " + text) { _ in
34 | step()
35 | }
36 | }
37 |
38 | func But(_ text: String, step: () -> Void ) {
39 | XCTContext.runActivity(named: #function + " " + text) { _ in
40 | step()
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/xcode832/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | NSAppTransportSecurity
24 |
25 | NSAllowsArbitraryLoads
26 |
27 |
28 | UILaunchStoryboardName
29 | LaunchScreen
30 | UIMainStoryboardFile
31 | Main
32 | UIRequiredDeviceCapabilities
33 |
34 | armv7
35 |
36 | UISupportedInterfaceOrientations
37 |
38 | UIInterfaceOrientationPortrait
39 |
40 | UISupportedInterfaceOrientations~ipad
41 |
42 | UIInterfaceOrientationPortrait
43 | UIInterfaceOrientationPortraitUpsideDown
44 | UIInterfaceOrientationLandscapeLeft
45 | UIInterfaceOrientationLandscapeRight
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/xcode832/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/xcode832/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/xcode832/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // xcode832
4 | //
5 | // Created by mvemjsun on 26/05/2017.
6 | // Copyright © 2017 . All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 | static var resumedFromBackground = false
16 |
17 |
18 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
19 | // Override point for customization after application launch.
20 | return true
21 | }
22 |
23 | func applicationWillResignActive(_ application: UIApplication) {
24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
25 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
26 | }
27 |
28 | func applicationDidEnterBackground(_ application: UIApplication) {
29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
31 | AppDelegate.resumedFromBackground = true
32 | // print("applicationDidEnterBackground")
33 | }
34 |
35 | func applicationWillEnterForeground(_ application: UIApplication) {
36 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
37 |
38 | // print("applicationWillEnterForeground")
39 | }
40 |
41 | func applicationDidBecomeActive(_ application: UIApplication) {
42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
43 | // print("applicationDidBecomeActive")
44 | }
45 |
46 | func applicationWillTerminate(_ application: UIApplication) {
47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
48 | }
49 |
50 |
51 | }
52 |
53 |
--------------------------------------------------------------------------------
/xcode832/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // xcode832
4 | //
5 | // Created by mvemjsun on 26/05/2017.
6 | // Copyright © 2017. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class ViewController: UIViewController {
12 | @IBOutlet weak var label: UILabel!
13 |
14 | @IBOutlet weak var textField: UITextField!
15 |
16 | @IBOutlet weak var buttonGetCountry: UIButton!
17 |
18 | @IBOutlet weak var countryInfo: UITextField!
19 |
20 | @IBOutlet weak var messages: UITextView!
21 |
22 | override func viewDidLoad() {
23 | super.viewDidLoad()
24 | // Do any additional setup after loading the view, typically from a nib.
25 |
26 | // Simulate a delay
27 | let when = DispatchTime.now() + 1
28 | DispatchQueue.main.asyncAfter(deadline: when) {
29 | self.label.text = "Country Name from ISO3 code"
30 | }
31 |
32 | // Simulate a delay
33 | let when2 = when + 1
34 | DispatchQueue.main.asyncAfter(deadline: when2) {
35 | self.textField.text = "Enter 3 letter Country Code"
36 | }
37 | }
38 |
39 | @IBAction func getCountryInfo(_ sender: UIButton) {
40 | if let cc = textField.text {
41 | getCountryDetails(country: cc.uppercased())
42 | } else {
43 | countryInfo.text = "Please enter a 3 letter country code."
44 | }
45 | }
46 |
47 | @IBAction func editCountryCode(_ sender: Any) {
48 | textField.text = ""
49 | messages.text = ""
50 | countryInfo.text = ""
51 | }
52 | override func didReceiveMemoryWarning() {
53 | super.didReceiveMemoryWarning()
54 | // Dispose of any resources that can be recreated.
55 | }
56 |
57 | func getCountryDetails(country: String) {
58 | var url : URL
59 |
60 | if let safeUrl = URL(string: "http://services.groupkt.com/country/get/iso3code/" + country.uppercased()) {
61 | url = safeUrl
62 |
63 | let session = URLSession.shared
64 | let request = URLRequest(url: url)
65 | session.dataTask(with: request, completionHandler: completion).resume()
66 | }
67 | }
68 |
69 | func completion(data: Data?, response: URLResponse? , error: Error?) {
70 | if let data = data,
71 | let jsonData = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
72 | let country = CountryData(json: jsonData!)
73 | let when = DispatchTime.now() + 1
74 | // Below done to simulate a delay
75 | DispatchQueue.main.asyncAfter(deadline: when) {
76 | self.countryInfo?.text = country?.name
77 | self.messages.text = country?.messages.first
78 |
79 | if let safeMessages = country?.messages {
80 | for message in safeMessages {
81 | self.messages.text = self.messages.text + " ," + message
82 | }
83 | }
84 |
85 | }
86 |
87 | print(String(describing: country))
88 | } else {
89 | DispatchQueue.main.async {
90 | self.countryInfo.text = "Could not get data"
91 | }
92 | }
93 | }
94 |
95 | }
96 |
--------------------------------------------------------------------------------
/xcode832UITests/xcode832UITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // xcode832UITests.swift
3 | // xcode832UITests
4 | //
5 | // Created by mvemjsun on 26/05/2017.
6 | // Copyright © 2017 . All rights reserved.
7 | //
8 |
9 | import XCTest
10 |
11 | class xcode832UITests: XCTestCase {
12 |
13 | override func setUp() {
14 | super.setUp()
15 | continueAfterFailure = false
16 | XCUIApplication().launch()
17 | }
18 |
19 | override func tearDown() {
20 | super.tearDown()
21 | }
22 |
23 | // Siri and Activities
24 | func testLaunchAndSendToBG() {
25 | let element1 = XCUIApplication().staticTexts["Country Name from ISO3 code"]
26 | let element2 = XCUIApplication().textFields["Enter 3 letter Country Code"]
27 |
28 | Given("I wait for the screen header to Appear") { _ in
29 | let result1 = waitForElementToExist(element: element1)
30 | XCTAssertTrue(result1)
31 | }
32 |
33 | When("I press the home button") { _ in
34 | XCUIDevice.shared().press(XCUIDeviceButton.home)
35 | }
36 |
37 | And("I ask Siri to open my App") { _ in
38 | XCUIDevice.shared().siriService.activate(voiceRecognitionText: "open xcode832")
39 | }
40 |
41 | Then("I should see the text Enter 3 letter Country Code") { _ in
42 | let result2 = waitForElementToExist(element: element2)
43 | XCTAssertTrue(result2)
44 | }
45 | }
46 |
47 | // Screen shots
48 | func testGetAValidCountryCode() {
49 | let countryCodeTextInputElement = XCUIApplication().textFields.matching(identifier: "countryCodeField").element(boundBy: 0)
50 | let countryDescription = XCUIApplication().textFields["Australia"]
51 | let getInfoButton = XCUIApplication().buttons.matching(identifier: "getCountryInfo").element(boundBy: 0)
52 | let readyToInput = XCUIApplication().staticTexts["Enter 3 letter Country Code"]
53 |
54 | _ = waitForElementToExist(element: readyToInput)
55 | countryCodeTextInputElement.tap()
56 | countryCodeTextInputElement.typeText("AUS")
57 | getInfoButton.tap()
58 | XCTAssertTrue(waitForElementToExist(element: countryDescription))
59 |
60 | // Capture Screenshot
61 | XCTContext.runActivity(named: "Capture screenshot") { activity in
62 | let screen = XCUIScreen.main
63 | let screenShot = screen.screenshot()
64 | let attachment = XCTAttachment(screenshot: screenShot)
65 | attachment.lifetime = .keepAlways // Keep even if test fails, else xcode deletes it.
66 | activity.add(attachment)
67 | }
68 | }
69 |
70 | func testGetAnInvalidCountryCode() {
71 | let countryCodeTextInputElement = XCUIApplication().textFields.matching(identifier: "countryCodeField").element(boundBy: 0)
72 | let readyToInput = XCUIApplication().staticTexts["Enter 3 letter Country Code"]
73 | let getInfoButton = XCUIApplication().buttons.matching(identifier: "getCountryInfo").element(boundBy: 0)
74 |
75 | _ = waitForElementToExist(element: readyToInput)
76 | countryCodeTextInputElement.tap()
77 | countryCodeTextInputElement.typeText("XXX")
78 | getInfoButton.tap()
79 | }
80 |
81 | // Waiting for expectations
82 | func waitForElementToExist(element e: XCUIElement) -> Bool {
83 | let p = NSPredicate(format: "exists == true")
84 | let e1 = XCTNSPredicateExpectation(predicate: p, object: e)
85 | let result = XCTWaiter.wait(for: [e1], timeout: 10)
86 | return (result == .completed)
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/xcode832.xcodeproj/xcuserdata/pte05.xcuserdatad/xcschemes/xcode832.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
49 |
50 |
51 |
52 |
53 |
54 |
64 |
66 |
72 |
73 |
74 |
75 |
76 |
77 |
83 |
85 |
91 |
92 |
93 |
94 |
96 |
97 |
100 |
101 |
102 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Sample XCode project demonstrating new UITesting features in XCode 8.3/9
2 |
3 | The sample app is a very simple app that demonstrates some of the interesting new features of the XCode 8.3 (and onwards) UI testing API. The app screen loads a lable whose text changes asynchronously to simulate a delay. There are 2 text fields , one to enter a 3 letter country code and another that displays its name from the API. There is a text view to display informational message and finally a button. The API http://services.groupkt.com/country/get/iso3code is used to retrieve country code info.
4 |
5 | ## Siri Service and Activities
6 |
7 | The Siri service API now helps to integrate the AI features of iOS for use to UI testing. One of the immidiate uses of this API is to bring the App to the foreground from background without needing to relaunch the app. App features that rely on backgrounding and foregrounding can now easily be tested.
8 |
9 | [Siri API] (https://developer.apple.com/reference/xctest/xcuisiriservice)
10 |
11 | ```swift
12 |
13 | func testLaunchAndSendToBG() {
14 | let element1 = XCUIApplication().staticTexts["Country Name from ISO3 code"]
15 | let element2 = XCUIApplication().textFields["Enter 3 letter Country Code"]
16 |
17 | Given("I wait for the screen header to Appear") { _ in
18 | let result1 = waitForElementToExist(element: element1)
19 | XCTAssertTrue(result1)
20 | }
21 |
22 | When("I press the home button") { _ in
23 | XCUIDevice.shared().press(XCUIDeviceButton.home)
24 | }
25 |
26 | And("I ask Siri to open my App") { _ in
27 | XCUIDevice.shared().siriService.activate(voiceRecognitionText: "open xcode832")
28 | }
29 |
30 | Then("I should see the text Enter 3 letter Country Code") { _ in
31 | let result2 = waitForElementToExist(element: element2)
32 | XCTAssertTrue(result2)
33 | }
34 | }
35 |
36 | // Gherkin style Wrapper around `XCTContext.runActivity`
37 |
38 | import Foundation
39 | import XCTest
40 |
41 | extension XCTest {
42 |
43 | func Given(_ text: String, step: () -> Void ) {
44 | XCTContext.runActivity(named: #function + " " + text) { _ in
45 | step()
46 | }
47 | }
48 |
49 | func When(_ text: String, step: () -> Void ) {
50 | XCTContext.runActivity(named: #function + " " + text) { _ in
51 | step()
52 | }
53 | }
54 |
55 | func Then(_ text: String, step: () -> Void ) {
56 | XCTContext.runActivity(named: #function + " " + text) { _ in
57 | step()
58 | }
59 | }
60 |
61 | func And(_ text: String, step: () -> Void ) {
62 | XCTContext.runActivity(named: #function + " " + text) { _ in
63 | step()
64 | }
65 | }
66 |
67 | func But(_ text: String, step: () -> Void ) {
68 | XCTContext.runActivity(named: #function + " " + text) { _ in
69 | step()
70 | }
71 | }
72 | }
73 | ```
74 |
75 | 
76 |
77 | The above code also demonstrates the use of `Activities` that allow us to group a group of statements in a named block of code. This causes the test result report to be formatted in a more conscise way so that its more readable.
78 |
79 | ## Waiting APIs
80 | The new version of XCode and XCTest has introduced new waiting API's that let us wait for an array of expectations. Its also possible to use this so that the order in which the expectations are satistfied is also checked.
81 |
82 | [Waiting API] (https://developer.apple.com/reference/xctest/xctwaiter)
83 |
84 | ```swift
85 | func waitFor(element e: XCUIElement) -> Bool {
86 | let p = NSPredicate(format: "exists == true")
87 | let e1 = XCTNSPredicateExpectation(predicate: p, object: e)
88 | let result = XCTWaiter.wait(for: [e1], timeout: 10)
89 | return (result == .completed)
90 | }
91 | ```
92 |
93 | ## Screenshots & Attachments
94 | Screenshots can now be taken using the new APIs. Xcode deletes screenshots if the tests are success bu default, how ever this can be overridded through APIs. The API offers to capture screenshots of the whole screen or of an individual UI element.
95 |
96 | [Screenshot API] (https://developer.apple.com/documentation/xctest/xcuiscreen)
97 | ``````swift
98 | func testGetAValidCountryCode() {
99 | let countryCodeTextInputElement = XCUIApplication().textFields.matching(identifier: "countryCodeField").element(boundBy: 0)
100 | let countryDescription = XCUIApplication().textFields["Australia"]
101 | let getInfoButton = XCUIApplication().buttons.matching(identifier: "getCountryInfo").element(boundBy: 0)
102 | let readyToInput = XCUIApplication().staticTexts["Enter 3 letter Country Code"]
103 |
104 | _ = waitForElementToExist(element: readyToInput)
105 | countryCodeTextInputElement.tap()
106 | countryCodeTextInputElement.typeText("AUS")
107 | getInfoButton.tap()
108 | XCTAssertTrue(waitForElementToExist(element: countryDescription))
109 |
110 | // Capture Screenshot
111 | XCTContext.runActivity(named: "Capture screenshot") { activity in
112 | let screen = XCUIScreen.main
113 | let screenShot = screen.screenshot()
114 | let attachment = XCTAttachment(screenshot: screenShot)
115 | attachment.lifetime = .keepAlways // Keep even if test fails, else xcode deletes it.
116 | activity.add(attachment)
117 | }
118 | }
119 | ``````
120 |
--------------------------------------------------------------------------------
/xcode832/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
45 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
--------------------------------------------------------------------------------
/xcode832.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | D10FDE101ED82A860007A9E7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10FDE0F1ED82A860007A9E7 /* AppDelegate.swift */; };
11 | D10FDE121ED82A860007A9E7 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10FDE111ED82A860007A9E7 /* ViewController.swift */; };
12 | D10FDE151ED82A860007A9E7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D10FDE131ED82A860007A9E7 /* Main.storyboard */; };
13 | D10FDE171ED82A860007A9E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D10FDE161ED82A860007A9E7 /* Assets.xcassets */; };
14 | D10FDE1A1ED82A860007A9E7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D10FDE181ED82A860007A9E7 /* LaunchScreen.storyboard */; };
15 | D10FDE251ED82A860007A9E7 /* xcode832UITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10FDE241ED82A860007A9E7 /* xcode832UITests.swift */; };
16 | D11F31DB1EDEEAFE006C91AC /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = D11F31DA1EDEEAFE006C91AC /* Service.swift */; };
17 | D1959F3F1EE19FC50063EF99 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = D1959F3E1EE19FC50063EF99 /* README.md */; };
18 | D1B4AD461EEEF740001315C7 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1B4AD451EEEF740001315C7 /* Helpers.swift */; };
19 | /* End PBXBuildFile section */
20 |
21 | /* Begin PBXContainerItemProxy section */
22 | D10FDE211ED82A860007A9E7 /* PBXContainerItemProxy */ = {
23 | isa = PBXContainerItemProxy;
24 | containerPortal = D10FDE041ED82A860007A9E7 /* Project object */;
25 | proxyType = 1;
26 | remoteGlobalIDString = D10FDE0B1ED82A860007A9E7;
27 | remoteInfo = xcode832;
28 | };
29 | /* End PBXContainerItemProxy section */
30 |
31 | /* Begin PBXFileReference section */
32 | D10FDE0C1ED82A860007A9E7 /* xcode832.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = xcode832.app; sourceTree = BUILT_PRODUCTS_DIR; };
33 | D10FDE0F1ED82A860007A9E7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
34 | D10FDE111ED82A860007A9E7 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
35 | D10FDE141ED82A860007A9E7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
36 | D10FDE161ED82A860007A9E7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
37 | D10FDE191ED82A860007A9E7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
38 | D10FDE1B1ED82A860007A9E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
39 | D10FDE201ED82A860007A9E7 /* xcode832UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = xcode832UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
40 | D10FDE241ED82A860007A9E7 /* xcode832UITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = xcode832UITests.swift; sourceTree = ""; };
41 | D10FDE261ED82A860007A9E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
42 | D11F31DA1EDEEAFE006C91AC /* Service.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; };
43 | D1959F3E1EE19FC50063EF99 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
44 | D1B4AD451EEEF740001315C7 /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; };
45 | /* End PBXFileReference section */
46 |
47 | /* Begin PBXFrameworksBuildPhase section */
48 | D10FDE091ED82A860007A9E7 /* Frameworks */ = {
49 | isa = PBXFrameworksBuildPhase;
50 | buildActionMask = 2147483647;
51 | files = (
52 | );
53 | runOnlyForDeploymentPostprocessing = 0;
54 | };
55 | D10FDE1D1ED82A860007A9E7 /* Frameworks */ = {
56 | isa = PBXFrameworksBuildPhase;
57 | buildActionMask = 2147483647;
58 | files = (
59 | );
60 | runOnlyForDeploymentPostprocessing = 0;
61 | };
62 | /* End PBXFrameworksBuildPhase section */
63 |
64 | /* Begin PBXGroup section */
65 | D10FDE031ED82A860007A9E7 = {
66 | isa = PBXGroup;
67 | children = (
68 | D1959F3E1EE19FC50063EF99 /* README.md */,
69 | D11F31D91EDEEA84006C91AC /* classes */,
70 | D10FDE0E1ED82A860007A9E7 /* xcode832 */,
71 | D10FDE231ED82A860007A9E7 /* xcode832UITests */,
72 | D10FDE0D1ED82A860007A9E7 /* Products */,
73 | );
74 | sourceTree = "";
75 | };
76 | D10FDE0D1ED82A860007A9E7 /* Products */ = {
77 | isa = PBXGroup;
78 | children = (
79 | D10FDE0C1ED82A860007A9E7 /* xcode832.app */,
80 | D10FDE201ED82A860007A9E7 /* xcode832UITests.xctest */,
81 | );
82 | name = Products;
83 | sourceTree = "";
84 | };
85 | D10FDE0E1ED82A860007A9E7 /* xcode832 */ = {
86 | isa = PBXGroup;
87 | children = (
88 | D10FDE0F1ED82A860007A9E7 /* AppDelegate.swift */,
89 | D10FDE111ED82A860007A9E7 /* ViewController.swift */,
90 | D10FDE131ED82A860007A9E7 /* Main.storyboard */,
91 | D10FDE161ED82A860007A9E7 /* Assets.xcassets */,
92 | D10FDE181ED82A860007A9E7 /* LaunchScreen.storyboard */,
93 | D10FDE1B1ED82A860007A9E7 /* Info.plist */,
94 | );
95 | path = xcode832;
96 | sourceTree = "";
97 | };
98 | D10FDE231ED82A860007A9E7 /* xcode832UITests */ = {
99 | isa = PBXGroup;
100 | children = (
101 | D1B4AD441EEEF720001315C7 /* helpers */,
102 | D10FDE241ED82A860007A9E7 /* xcode832UITests.swift */,
103 | D10FDE261ED82A860007A9E7 /* Info.plist */,
104 | );
105 | path = xcode832UITests;
106 | sourceTree = "";
107 | };
108 | D11F31D91EDEEA84006C91AC /* classes */ = {
109 | isa = PBXGroup;
110 | children = (
111 | D11F31DA1EDEEAFE006C91AC /* Service.swift */,
112 | );
113 | name = classes;
114 | sourceTree = "";
115 | };
116 | D1B4AD441EEEF720001315C7 /* helpers */ = {
117 | isa = PBXGroup;
118 | children = (
119 | D1B4AD451EEEF740001315C7 /* Helpers.swift */,
120 | );
121 | path = helpers;
122 | sourceTree = "";
123 | };
124 | /* End PBXGroup section */
125 |
126 | /* Begin PBXNativeTarget section */
127 | D10FDE0B1ED82A860007A9E7 /* xcode832 */ = {
128 | isa = PBXNativeTarget;
129 | buildConfigurationList = D10FDE291ED82A860007A9E7 /* Build configuration list for PBXNativeTarget "xcode832" */;
130 | buildPhases = (
131 | D10FDE081ED82A860007A9E7 /* Sources */,
132 | D10FDE091ED82A860007A9E7 /* Frameworks */,
133 | D10FDE0A1ED82A860007A9E7 /* Resources */,
134 | );
135 | buildRules = (
136 | );
137 | dependencies = (
138 | );
139 | name = xcode832;
140 | productName = xcode832;
141 | productReference = D10FDE0C1ED82A860007A9E7 /* xcode832.app */;
142 | productType = "com.apple.product-type.application";
143 | };
144 | D10FDE1F1ED82A860007A9E7 /* xcode832UITests */ = {
145 | isa = PBXNativeTarget;
146 | buildConfigurationList = D10FDE2C1ED82A860007A9E7 /* Build configuration list for PBXNativeTarget "xcode832UITests" */;
147 | buildPhases = (
148 | D10FDE1C1ED82A860007A9E7 /* Sources */,
149 | D10FDE1D1ED82A860007A9E7 /* Frameworks */,
150 | D10FDE1E1ED82A860007A9E7 /* Resources */,
151 | );
152 | buildRules = (
153 | );
154 | dependencies = (
155 | D10FDE221ED82A860007A9E7 /* PBXTargetDependency */,
156 | );
157 | name = xcode832UITests;
158 | productName = xcode832UITests;
159 | productReference = D10FDE201ED82A860007A9E7 /* xcode832UITests.xctest */;
160 | productType = "com.apple.product-type.bundle.ui-testing";
161 | };
162 | /* End PBXNativeTarget section */
163 |
164 | /* Begin PBXProject section */
165 | D10FDE041ED82A860007A9E7 /* Project object */ = {
166 | isa = PBXProject;
167 | attributes = {
168 | LastSwiftUpdateCheck = 0830;
169 | LastUpgradeCheck = 0830;
170 | ORGANIZATIONNAME = NowTV;
171 | TargetAttributes = {
172 | D10FDE0B1ED82A860007A9E7 = {
173 | CreatedOnToolsVersion = 8.3.2;
174 | DevelopmentTeam = 6EH25JGH8T;
175 | ProvisioningStyle = Automatic;
176 | };
177 | D10FDE1F1ED82A860007A9E7 = {
178 | CreatedOnToolsVersion = 8.3.2;
179 | DevelopmentTeam = 6EH25JGH8T;
180 | ProvisioningStyle = Automatic;
181 | TestTargetID = D10FDE0B1ED82A860007A9E7;
182 | };
183 | };
184 | };
185 | buildConfigurationList = D10FDE071ED82A860007A9E7 /* Build configuration list for PBXProject "xcode832" */;
186 | compatibilityVersion = "Xcode 3.2";
187 | developmentRegion = English;
188 | hasScannedForEncodings = 0;
189 | knownRegions = (
190 | en,
191 | Base,
192 | );
193 | mainGroup = D10FDE031ED82A860007A9E7;
194 | productRefGroup = D10FDE0D1ED82A860007A9E7 /* Products */;
195 | projectDirPath = "";
196 | projectRoot = "";
197 | targets = (
198 | D10FDE0B1ED82A860007A9E7 /* xcode832 */,
199 | D10FDE1F1ED82A860007A9E7 /* xcode832UITests */,
200 | );
201 | };
202 | /* End PBXProject section */
203 |
204 | /* Begin PBXResourcesBuildPhase section */
205 | D10FDE0A1ED82A860007A9E7 /* Resources */ = {
206 | isa = PBXResourcesBuildPhase;
207 | buildActionMask = 2147483647;
208 | files = (
209 | D10FDE1A1ED82A860007A9E7 /* LaunchScreen.storyboard in Resources */,
210 | D10FDE171ED82A860007A9E7 /* Assets.xcassets in Resources */,
211 | D10FDE151ED82A860007A9E7 /* Main.storyboard in Resources */,
212 | );
213 | runOnlyForDeploymentPostprocessing = 0;
214 | };
215 | D10FDE1E1ED82A860007A9E7 /* Resources */ = {
216 | isa = PBXResourcesBuildPhase;
217 | buildActionMask = 2147483647;
218 | files = (
219 | );
220 | runOnlyForDeploymentPostprocessing = 0;
221 | };
222 | /* End PBXResourcesBuildPhase section */
223 |
224 | /* Begin PBXSourcesBuildPhase section */
225 | D10FDE081ED82A860007A9E7 /* Sources */ = {
226 | isa = PBXSourcesBuildPhase;
227 | buildActionMask = 2147483647;
228 | files = (
229 | D10FDE121ED82A860007A9E7 /* ViewController.swift in Sources */,
230 | D10FDE101ED82A860007A9E7 /* AppDelegate.swift in Sources */,
231 | D1959F3F1EE19FC50063EF99 /* README.md in Sources */,
232 | D11F31DB1EDEEAFE006C91AC /* Service.swift in Sources */,
233 | );
234 | runOnlyForDeploymentPostprocessing = 0;
235 | };
236 | D10FDE1C1ED82A860007A9E7 /* Sources */ = {
237 | isa = PBXSourcesBuildPhase;
238 | buildActionMask = 2147483647;
239 | files = (
240 | D10FDE251ED82A860007A9E7 /* xcode832UITests.swift in Sources */,
241 | D1B4AD461EEEF740001315C7 /* Helpers.swift in Sources */,
242 | );
243 | runOnlyForDeploymentPostprocessing = 0;
244 | };
245 | /* End PBXSourcesBuildPhase section */
246 |
247 | /* Begin PBXTargetDependency section */
248 | D10FDE221ED82A860007A9E7 /* PBXTargetDependency */ = {
249 | isa = PBXTargetDependency;
250 | target = D10FDE0B1ED82A860007A9E7 /* xcode832 */;
251 | targetProxy = D10FDE211ED82A860007A9E7 /* PBXContainerItemProxy */;
252 | };
253 | /* End PBXTargetDependency section */
254 |
255 | /* Begin PBXVariantGroup section */
256 | D10FDE131ED82A860007A9E7 /* Main.storyboard */ = {
257 | isa = PBXVariantGroup;
258 | children = (
259 | D10FDE141ED82A860007A9E7 /* Base */,
260 | );
261 | name = Main.storyboard;
262 | sourceTree = "";
263 | };
264 | D10FDE181ED82A860007A9E7 /* LaunchScreen.storyboard */ = {
265 | isa = PBXVariantGroup;
266 | children = (
267 | D10FDE191ED82A860007A9E7 /* Base */,
268 | );
269 | name = LaunchScreen.storyboard;
270 | sourceTree = "";
271 | };
272 | /* End PBXVariantGroup section */
273 |
274 | /* Begin XCBuildConfiguration section */
275 | D10FDE271ED82A860007A9E7 /* Debug */ = {
276 | isa = XCBuildConfiguration;
277 | buildSettings = {
278 | ALWAYS_SEARCH_USER_PATHS = NO;
279 | CLANG_ANALYZER_NONNULL = YES;
280 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
281 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
282 | CLANG_CXX_LIBRARY = "libc++";
283 | CLANG_ENABLE_MODULES = YES;
284 | CLANG_ENABLE_OBJC_ARC = YES;
285 | CLANG_WARN_BOOL_CONVERSION = YES;
286 | CLANG_WARN_CONSTANT_CONVERSION = YES;
287 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
288 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
289 | CLANG_WARN_EMPTY_BODY = YES;
290 | CLANG_WARN_ENUM_CONVERSION = YES;
291 | CLANG_WARN_INFINITE_RECURSION = YES;
292 | CLANG_WARN_INT_CONVERSION = YES;
293 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
294 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
295 | CLANG_WARN_UNREACHABLE_CODE = YES;
296 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
297 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
298 | COPY_PHASE_STRIP = NO;
299 | DEBUG_INFORMATION_FORMAT = dwarf;
300 | ENABLE_STRICT_OBJC_MSGSEND = YES;
301 | ENABLE_TESTABILITY = YES;
302 | GCC_C_LANGUAGE_STANDARD = gnu99;
303 | GCC_DYNAMIC_NO_PIC = NO;
304 | GCC_NO_COMMON_BLOCKS = YES;
305 | GCC_OPTIMIZATION_LEVEL = 0;
306 | GCC_PREPROCESSOR_DEFINITIONS = (
307 | "DEBUG=1",
308 | "$(inherited)",
309 | );
310 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
311 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
312 | GCC_WARN_UNDECLARED_SELECTOR = YES;
313 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
314 | GCC_WARN_UNUSED_FUNCTION = YES;
315 | GCC_WARN_UNUSED_VARIABLE = YES;
316 | IPHONEOS_DEPLOYMENT_TARGET = 10.3;
317 | MTL_ENABLE_DEBUG_INFO = YES;
318 | ONLY_ACTIVE_ARCH = YES;
319 | SDKROOT = iphoneos;
320 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
321 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
322 | TARGETED_DEVICE_FAMILY = "1,2";
323 | };
324 | name = Debug;
325 | };
326 | D10FDE281ED82A860007A9E7 /* Release */ = {
327 | isa = XCBuildConfiguration;
328 | buildSettings = {
329 | ALWAYS_SEARCH_USER_PATHS = NO;
330 | CLANG_ANALYZER_NONNULL = YES;
331 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
332 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
333 | CLANG_CXX_LIBRARY = "libc++";
334 | CLANG_ENABLE_MODULES = YES;
335 | CLANG_ENABLE_OBJC_ARC = YES;
336 | CLANG_WARN_BOOL_CONVERSION = YES;
337 | CLANG_WARN_CONSTANT_CONVERSION = YES;
338 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
339 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
340 | CLANG_WARN_EMPTY_BODY = YES;
341 | CLANG_WARN_ENUM_CONVERSION = YES;
342 | CLANG_WARN_INFINITE_RECURSION = YES;
343 | CLANG_WARN_INT_CONVERSION = YES;
344 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
345 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
346 | CLANG_WARN_UNREACHABLE_CODE = YES;
347 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
348 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
349 | COPY_PHASE_STRIP = NO;
350 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
351 | ENABLE_NS_ASSERTIONS = NO;
352 | ENABLE_STRICT_OBJC_MSGSEND = YES;
353 | GCC_C_LANGUAGE_STANDARD = gnu99;
354 | GCC_NO_COMMON_BLOCKS = YES;
355 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
356 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
357 | GCC_WARN_UNDECLARED_SELECTOR = YES;
358 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
359 | GCC_WARN_UNUSED_FUNCTION = YES;
360 | GCC_WARN_UNUSED_VARIABLE = YES;
361 | IPHONEOS_DEPLOYMENT_TARGET = 10.3;
362 | MTL_ENABLE_DEBUG_INFO = NO;
363 | SDKROOT = iphoneos;
364 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
365 | TARGETED_DEVICE_FAMILY = "1,2";
366 | VALIDATE_PRODUCT = YES;
367 | };
368 | name = Release;
369 | };
370 | D10FDE2A1ED82A860007A9E7 /* Debug */ = {
371 | isa = XCBuildConfiguration;
372 | buildSettings = {
373 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
374 | DEVELOPMENT_TEAM = 6EH25JGH8T;
375 | INFOPLIST_FILE = xcode832/Info.plist;
376 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
377 | PRODUCT_BUNDLE_IDENTIFIER = uk.bskyb.xcode832;
378 | PRODUCT_NAME = "$(TARGET_NAME)";
379 | SWIFT_VERSION = 3.0;
380 | };
381 | name = Debug;
382 | };
383 | D10FDE2B1ED82A860007A9E7 /* Release */ = {
384 | isa = XCBuildConfiguration;
385 | buildSettings = {
386 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
387 | DEVELOPMENT_TEAM = 6EH25JGH8T;
388 | INFOPLIST_FILE = xcode832/Info.plist;
389 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
390 | PRODUCT_BUNDLE_IDENTIFIER = uk.bskyb.xcode832;
391 | PRODUCT_NAME = "$(TARGET_NAME)";
392 | SWIFT_VERSION = 3.0;
393 | };
394 | name = Release;
395 | };
396 | D10FDE2D1ED82A860007A9E7 /* Debug */ = {
397 | isa = XCBuildConfiguration;
398 | buildSettings = {
399 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
400 | DEVELOPMENT_TEAM = 6EH25JGH8T;
401 | INFOPLIST_FILE = xcode832UITests/Info.plist;
402 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
403 | PRODUCT_BUNDLE_IDENTIFIER = uk.bskyb.xcode832UITests;
404 | PRODUCT_NAME = "$(TARGET_NAME)";
405 | SWIFT_VERSION = 3.0;
406 | TEST_TARGET_NAME = xcode832;
407 | };
408 | name = Debug;
409 | };
410 | D10FDE2E1ED82A860007A9E7 /* Release */ = {
411 | isa = XCBuildConfiguration;
412 | buildSettings = {
413 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
414 | DEVELOPMENT_TEAM = 6EH25JGH8T;
415 | INFOPLIST_FILE = xcode832UITests/Info.plist;
416 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
417 | PRODUCT_BUNDLE_IDENTIFIER = uk.bskyb.xcode832UITests;
418 | PRODUCT_NAME = "$(TARGET_NAME)";
419 | SWIFT_VERSION = 3.0;
420 | TEST_TARGET_NAME = xcode832;
421 | };
422 | name = Release;
423 | };
424 | /* End XCBuildConfiguration section */
425 |
426 | /* Begin XCConfigurationList section */
427 | D10FDE071ED82A860007A9E7 /* Build configuration list for PBXProject "xcode832" */ = {
428 | isa = XCConfigurationList;
429 | buildConfigurations = (
430 | D10FDE271ED82A860007A9E7 /* Debug */,
431 | D10FDE281ED82A860007A9E7 /* Release */,
432 | );
433 | defaultConfigurationIsVisible = 0;
434 | defaultConfigurationName = Release;
435 | };
436 | D10FDE291ED82A860007A9E7 /* Build configuration list for PBXNativeTarget "xcode832" */ = {
437 | isa = XCConfigurationList;
438 | buildConfigurations = (
439 | D10FDE2A1ED82A860007A9E7 /* Debug */,
440 | D10FDE2B1ED82A860007A9E7 /* Release */,
441 | );
442 | defaultConfigurationIsVisible = 0;
443 | defaultConfigurationName = Release;
444 | };
445 | D10FDE2C1ED82A860007A9E7 /* Build configuration list for PBXNativeTarget "xcode832UITests" */ = {
446 | isa = XCConfigurationList;
447 | buildConfigurations = (
448 | D10FDE2D1ED82A860007A9E7 /* Debug */,
449 | D10FDE2E1ED82A860007A9E7 /* Release */,
450 | );
451 | defaultConfigurationIsVisible = 0;
452 | defaultConfigurationName = Release;
453 | };
454 | /* End XCConfigurationList section */
455 | };
456 | rootObject = D10FDE041ED82A860007A9E7 /* Project object */;
457 | }
458 |
--------------------------------------------------------------------------------