// 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("    ")),
)
"""
    )
  }
}
