| // Copyright 2016 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 TulsiGeneratorConfigTests: XCTestCase { |
| let projectName = "TestProject" |
| let projectBundleURL = URL(fileURLWithPath: "/test/project/tulsiproject/") |
| let projectBazelURL = URL(fileURLWithPath: "/test/project/path/to/bazel") |
| let workspaceRootURL = URL(fileURLWithPath: "/test/project/root/") |
| let bazelPackages = [ |
| "a/package", |
| "b/where/are/we", |
| "missingno/c", |
| ] |
| |
| let buildTargetLabels = ["build/target/label:1", "build/target/label:2"] |
| let pathFilters = Set<String>(["build/target/path/1", |
| "build/target/path/2", |
| "source/target/path"]) |
| let additionalFilePaths = ["path/to/file", "path/to/another/file"] |
| |
| |
| var project: TulsiProject! = nil |
| |
| override func setUp() { |
| super.setUp() |
| project = TulsiProject(projectName: projectName, |
| projectBundleURL: projectBundleURL, |
| workspaceRootURL: workspaceRootURL, |
| bazelPackages: bazelPackages) |
| project.bazelURL = projectBazelURL |
| } |
| |
| func testSave() { |
| do { |
| let bazelURL = TulsiParameter(value: URL(fileURLWithPath: ""), |
| source: .explicitlyProvided) |
| let config = TulsiGeneratorConfig(projectName: projectName, |
| buildTargetLabels: buildTargetLabels.map({ BuildLabel($0) }), |
| pathFilters: pathFilters, |
| additionalFilePaths: additionalFilePaths, |
| options: TulsiOptionSet(), |
| bazelURL: bazelURL) |
| let data = try config.save() |
| let dict = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions()) as! [String: Any] |
| XCTAssertEqual(dict["additionalFilePaths"] as! [String], additionalFilePaths) |
| XCTAssertEqual(dict["buildTargets"] as! [String], buildTargetLabels) |
| XCTAssertEqual(dict["projectName"] as! String, projectName) |
| XCTAssertEqual(dict["sourceFilters"] as! [String], [String](pathFilters).sorted()) |
| } catch { |
| XCTFail("Unexpected assertion") |
| } |
| } |
| |
| func testLoad() { |
| do { |
| let dict = [ |
| "additionalFilePaths": additionalFilePaths, |
| "buildTargets": buildTargetLabels, |
| "projectName": projectName, |
| "sourceFilters": [String](pathFilters), |
| ] as [String : Any] |
| let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions()) |
| let bazelURL = URL(fileURLWithPath: "/path/to/bazel") |
| let config = try TulsiGeneratorConfig(data: data, bazelURL: bazelURL) |
| |
| XCTAssertEqual(config.additionalFilePaths ?? [], additionalFilePaths) |
| XCTAssertEqual(config.buildTargetLabels, buildTargetLabels.map({ BuildLabel($0) })) |
| XCTAssertEqual(config.projectName, projectName) |
| XCTAssertEqual(config.pathFilters, pathFilters) |
| } catch { |
| XCTFail("Unexpected assertion") |
| } |
| } |
| |
| func testLoadWithBuildLabelSourceFilters() { |
| do { |
| let sourceFilters = pathFilters.map() { "//\($0)" } |
| let dict = [ |
| "additionalFilePaths": additionalFilePaths, |
| "buildTargets": buildTargetLabels, |
| "projectName": projectName, |
| "sourceFilters": sourceFilters, |
| ] as [String : Any] |
| let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions()) |
| let bazelURL = URL(fileURLWithPath: "/path/to/bazel") |
| let config = try TulsiGeneratorConfig(data: data, bazelURL: bazelURL) |
| |
| XCTAssertEqual(config.additionalFilePaths ?? [], additionalFilePaths) |
| XCTAssertEqual(config.buildTargetLabels, buildTargetLabels.map({ BuildLabel($0) })) |
| XCTAssertEqual(config.projectName, projectName) |
| XCTAssertEqual(config.pathFilters, pathFilters) |
| } catch { |
| XCTFail("Unexpected assertion") |
| } |
| } |
| |
| func testLoadWithInvalidAdditionalFilePaths() { |
| do { |
| let dict = [ |
| "additionalFilePaths": ["//path/to/file"], |
| "buildTargets": buildTargetLabels, |
| "projectName": projectName, |
| ] as [String : Any] |
| let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions()) |
| _ = try TulsiGeneratorConfig(data: data) |
| |
| XCTFail("Unexpectedly succeeded with an invalid file path") |
| } catch TulsiGeneratorConfig.ConfigError.deserializationFailed(let message) { |
| XCTAssert(message.contains("//path/to/file")) |
| } catch { |
| XCTFail("Unexpected assertion") |
| } |
| } |
| |
| func testExplicitlyProvidedURL() { |
| do { |
| let dict = [ |
| "projectName": projectName, |
| ] as [String : Any] |
| let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions()) |
| let bazelURL = URL(fileURLWithPath: "/path/to/bazel") |
| let config = try TulsiGeneratorConfig(data: data, bazelURL: bazelURL) |
| |
| XCTAssertEqual(config.bazelURL, bazelURL) |
| } catch { |
| XCTFail("Unexpected assertion") |
| } |
| } |
| |
| func testExplicitlyProvidedURLOverridesProjectAndOptionsSetting() { |
| do { |
| let dict = [ |
| "projectName": projectName, |
| ] as [String : Any] |
| let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions()) |
| let bazelURL = URL(fileURLWithPath: "/path/to/bazel") |
| let optionsURL = URL(fileURLWithPath: "/options/path/to/bazel") |
| let options = [ |
| "optionSet": [ "BazelPath": [ "p": optionsURL.path ]], |
| ] as [String: Any] |
| let optionData = try JSONSerialization.data(withJSONObject: options, options: JSONSerialization.WritingOptions()) |
| |
| var config = try TulsiGeneratorConfig(data: data, |
| additionalOptionData: optionData, |
| bazelURL: bazelURL) |
| config = config.configByResolvingInheritedSettingsFromProject(project) |
| |
| XCTAssertEqual(config.bazelURL, bazelURL) |
| } catch { |
| XCTFail("Unexpected assertion") |
| } |
| } |
| |
| func testOptionsURL() { |
| do { |
| let dict = [ |
| "projectName": projectName, |
| ] as [String : Any] |
| let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions()) |
| |
| let optionsURL = URL(fileURLWithPath: "/options/path/to/bazel") |
| let options = [ |
| "optionSet": [ "BazelPath": [ "p": optionsURL.path ]], |
| ] as [String: Any] |
| let optionData = try JSONSerialization.data(withJSONObject: options, options: JSONSerialization.WritingOptions()) |
| |
| let config = try TulsiGeneratorConfig(data: data, |
| additionalOptionData: optionData) |
| XCTAssertEqual(config.bazelURL, optionsURL) |
| } catch { |
| XCTFail("Unexpected assertion") |
| } |
| } |
| |
| func testOptionsURLOverridesProjectSetting() { |
| do { |
| let dict = [ |
| "projectName": projectName, |
| ] as [String : Any] |
| let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions()) |
| |
| let optionsURL = URL(fileURLWithPath: "/options/path/to/bazel") |
| let options = [ |
| "optionSet": [ "BazelPath": [ "p": optionsURL.path ]], |
| ] as [String: Any] |
| let optionData = try JSONSerialization.data(withJSONObject: options, options: JSONSerialization.WritingOptions()) |
| |
| var config = try TulsiGeneratorConfig(data: data, |
| additionalOptionData: optionData) |
| config = config.configByResolvingInheritedSettingsFromProject(project) |
| XCTAssertEqual(config.bazelURL, optionsURL) |
| } catch { |
| XCTFail("Unexpected assertion") |
| } |
| } |
| } |