// Copyright 2018 The Tulsi Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import XCTest
@testable import TulsiGenerator

class BuildSettingsTests: XCTestCase {

  func testBazelFlagsEmpty() {
    XCTAssert(BazelFlags().isEmpty)
    XCTAssertEqual(BazelFlags().toPython(""), "BazelFlags()")
  }
  func testBazelFlagsOperators() {
    let a = BazelFlags(startupStr: "a b", buildStr: "x y")
    let b = BazelFlags(startupStr: "c d", buildStr: "z 1")
    let aExplicit = BazelFlags(startup: ["a", "b"], build: ["x", "y"])
    let bExplicit = BazelFlags(startup: ["c", "d"], build: ["z", "1"])

    XCTAssertEqual(a, aExplicit)
    XCTAssertEqual(b, bExplicit)

    let c = a + b
    XCTAssertEqual(c.startup, ["a", "b", "c", "d"])
    XCTAssertEqual(c.build, ["x", "y", "z", "1"])
    XCTAssertNotEqual(c, b + a)
  }
  func testBazelFlagsPythonable() {
    let startup = ["--startup-flag"]
    let build = ["--build-flag"]
    XCTAssertEqual(BazelFlags(startup: startup, build: build).toPython(""), """
BazelFlags(
    startup = [
        '--startup-flag',
    ],
    build = [
        '--build-flag',
    ],
)
""")
  }

  func testBazelFlagsSetEmpty() {
    XCTAssert(BazelFlagsSet().isEmpty)
    XCTAssertEqual(BazelFlagsSet().toPython(""), "BazelFlagsSet()")
  }
  func testBazelFlagsSetInitializers() {
    let basicFlagsSet = BazelFlagsSet(startupFlags: ["a"], buildFlags: ["b"])
    let basicFlags = BazelFlags(startup: ["a"], build: ["b"])
    XCTAssertEqual(basicFlagsSet.release, basicFlags)
    XCTAssertEqual(basicFlagsSet.debug, basicFlags)
    XCTAssertEqual(basicFlagsSet.getFlags(forDebug: true), basicFlagsSet.debug)
    XCTAssertEqual(basicFlagsSet.getFlags(forDebug: false), basicFlagsSet.release)

    let complexFlagSet = BazelFlagsSet(debug: BazelFlags(startup: ["a"], build: ["b"]),
                                       release: BazelFlags(startup: ["x"], build: ["y"]),
                                       common: BazelFlags(startup: ["1"], build: ["2"]))
    XCTAssertEqual(complexFlagSet.debug, BazelFlags(startup: ["a", "1"], build: ["b", "2"]))
    XCTAssertEqual(complexFlagSet.release, BazelFlags(startup: ["x", "1"], build: ["y", "2"]))
  }
  func testBazelFlagsSetPythonable() {
    let basicFlagsSet = BazelFlagsSet(startupFlags: ["a"], buildFlags: ["b"])
    XCTAssertEqual(basicFlagsSet.toPython(""), """
BazelFlagsSet(
    flags = BazelFlags(
        startup = [
            'a',
        ],
        build = [
            'b',
        ],
    ),
)
""")
    let complexFlagSet = BazelFlagsSet(debug: BazelFlags(startup: ["a"], build: ["b"]),
                                       release: BazelFlags(startup: ["x"], build: ["y"]),
                                       common: BazelFlags(startup: ["1"], build: ["2"]))
    XCTAssertEqual(complexFlagSet.toPython(""), """
BazelFlagsSet(
    debug = BazelFlags(
        startup = [
            'a',
            '1',
        ],
        build = [
            'b',
            '2',
        ],
    ),
    release = BazelFlags(
        startup = [
            'x',
            '1',
        ],
        build = [
            'y',
            '2',
        ],
    ),
)
""")
  }

    func testBazelBuildSettingsPythonable() {
      let bazel = "/path/to/bazel"
      let bazelExecRoot = "__MOCK_EXEC_ROOT__"
      let defaultIdentifier = "fake_config"
      let platformConfigurationFlags = [
        "fake_config": ["a", "b"],
        "another_one": ["--x", "-c"],
      ]

      let swiftTargets: Set<String> = [
          "//dir/swiftTarget:swiftTarget",
          "//dir/nested/depOnswift:depOnswift"
      ]
      let cacheAffecting = BazelFlagsSet(startupFlags: ["--nocacheStartup"],
                                         buildFlags: ["--nocacheBuild"])
      let cacheSafe = BazelFlagsSet(startupFlags: ["--cacheSafeStartup"],
                                    buildFlags: ["--cacheSafeBuild"])
      let swift = BazelFlagsSet(buildFlags: ["--swift-only"])
      let nonSwift = BazelFlagsSet(startupFlags: ["--non-swift-only"])
      let projDefaults = BazelFlagsSet()
      let projTargetFlags = [
          "//dir/some/customized:target": BazelFlagsSet(buildFlags: ["a", "b"]),
      ]
      let swiftFeatures = [BazelSettingFeature.DebugPathNormalization.stringValue]
      let nonSwiftFeatures = [BazelSettingFeature.DebugPathNormalization.stringValue]
      let settings = BazelBuildSettings(bazel: bazel,
                                        bazelExecRoot: bazelExecRoot,
                                        defaultPlatformConfigIdentifier: defaultIdentifier,
                                        platformConfigurationFlags: platformConfigurationFlags,
                                        swiftTargets: swiftTargets,
                                        tulsiCacheAffectingFlagsSet: cacheAffecting,
                                        tulsiCacheSafeFlagSet: cacheSafe,
                                        tulsiSwiftFlagSet: swift,
                                        tulsiNonSwiftFlagSet: nonSwift,
                                        swiftFeatures: swiftFeatures,
                                        nonSwiftFeatures: nonSwiftFeatures,
                                        projDefaultFlagSet: projDefaults,
                                        projTargetFlagSets: projTargetFlags)
      XCTAssertEqual(settings.toPython(""), """
BazelBuildSettings(
    '\(bazel)',
    '\(bazelExecRoot)',
    '\(defaultIdentifier)',
    \(platformConfigurationFlags.toPython("    ")),
    \(swiftTargets.toPython("    ")),
    \(cacheAffecting.toPython("    ")),
    \(cacheSafe.toPython("    ")),
    \(swift.toPython("    ")),
    \(nonSwift.toPython("    ")),
    \(swiftFeatures.toPython("    ")),
    \(nonSwiftFeatures.toPython("    ")),
    \(projDefaults.toPython("    ")),
    \(projTargetFlags.toPython("    ")),
)
""")
  }
}
