// 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
//
//
//  XCTestSuiteRun.swift
//  A test run for an `XCTestSuite`.
//

/// A test run for an `XCTestSuite`.
open class XCTestSuiteRun: XCTestRun {
    /// The combined `testDuration` of each test case run in the suite.
    open override var totalDuration: TimeInterval {
        return testRuns.reduce(TimeInterval(0.0)) { $0 + $1.totalDuration }
    }

    /// The combined execution count of each test case run in the suite.
    open override var executionCount: Int {
        return testRuns.reduce(0) { $0 + $1.executionCount }
    }

    /// The combined failure count of each test case run in the suite.
    open override var failureCount: Int {
        return testRuns.reduce(0) { $0 + $1.failureCount }
    }

    /// The combined unexpected failure count of each test case run in the
    /// suite.
    open override var unexpectedExceptionCount: Int {
        return testRuns.reduce(0) { $0 + $1.unexpectedExceptionCount }
    }

    open override func start() {
        super.start()
        XCTestObservationCenter.shared.testSuiteWillStart(testSuite)
    }

    open override func stop() {
        super.stop()
        XCTestObservationCenter.shared.testSuiteDidFinish(testSuite)
    }

    /// The test run for each of the tests in this suite.
    /// Depending on what kinds of tests this suite is composed of, these could
    /// be some combination of `XCTestCaseRun` and `XCTestSuiteRun` objects.
    open private(set) var testRuns = [XCTestRun]()

    /// Add a test run to the collection of `testRuns`.
    /// - Note: It is rare to call this method outside of XCTest itself.
    open func addTestRun(_ testRun: XCTestRun) {
        testRuns.append(testRun)
    }

    private var testSuite: XCTestSuite {
        return test as! XCTestSuite
    }
}
