File: ArgumentParser.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (72 lines) | stat: -rw-r--r-- 2,576 bytes parent folder | download | duplicates (2)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// This source file is part of the Swift.org open source project
//
// Copyright (c) 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
//
//
//  ArgumentParser.swift
//  Tools for parsing test execution configuration from command line arguments.
//

/// Utility for converting command line arguments into a strongly-typed
/// representation of the passed-in options
internal struct ArgumentParser {

    /// The basic operations that can be performed by an XCTest runner executable
    enum ExecutionMode {
        /// Run tests or test cases, printing results to stdout and exiting with
        /// a non-0 return code if any tests failed. The names of tests or test cases
        /// may be provided to only run a subset of them.
        case run(selectedTestNames: [String]?)

        /// The different ways that the tests can be represented when they are listed
        enum ListType {
            /// A flat list of the tests that can be run. The lines in this
            /// output are valid test names for the `run` mode.
            case humanReadable

            /// A JSON representation of the test suite, intended for consumption
            /// by other tools
            case json
        }

        /// Print a list of all the tests in the suite.
        case list(type: ListType)

        /// Print Help
        case help(invalidOption: String?)

        var selectedTestNames: [String]? {
            if case .run(let names) = self {
                return names
            } else {
                return nil
            }
        }
    }

    private let arguments: [String]

    init(arguments: [String]) {
        self.arguments = arguments
    }

    var executionMode: ExecutionMode {
        if arguments.count <= 1 {
            return .run(selectedTestNames: nil)
        } else if arguments[1] == "--list-tests" || arguments[1] == "-l" {
            return .list(type: .humanReadable)
        } else if arguments[1] == "--dump-tests-json" {
            return .list(type: .json)
        } else if arguments[1] == "--help" || arguments[1] == "-h" {
            return .help(invalidOption: nil)
        } else if let fst = arguments[1].first, fst == "-" {
            return .help(invalidOption: arguments[1])
        } else {
            return .run(selectedTestNames: arguments[1].split(separator: ",").map(String.init))
        }
    }
}