// 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 TulsiProjectTests: XCTestCase {
  let projectName = "TestProject"
  let projectBundleURL = URL(fileURLWithPath: "/test/project/tulsiproject/")
  let workspaceRootURL = URL(fileURLWithPath: "/test/project/root/")
  // Relative path from projectBundleURL to workspaceRootURL.
  let relativeRootPath = "../root"
  let bazelPackages = [
      "some/package",
      "another/package",
      "package",
  ]

  var project: TulsiProject! = nil

  override func setUp() {
    super.setUp()
    project = TulsiProject(projectName: projectName,
                           projectBundleURL: projectBundleURL,
                           workspaceRootURL: workspaceRootURL,
                           bazelPackages: bazelPackages)
  }


  func testSave() {
    do {
      let data = try project.save()
      let dict = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions()) as! [String: Any]
      XCTAssertEqual(dict["packages"] as! [String], bazelPackages)
      XCTAssertEqual(dict["projectName"] as! String, projectName)
      XCTAssertEqual(dict["workspaceRoot"] as! String, relativeRootPath)
    } catch {
      XCTFail("Unexpected assertion")
    }
  }

  func testLoad() {
    do {
      let dict = [
        "packages": bazelPackages,
        "projectName": projectName,
        "workspaceRoot": relativeRootPath,
      ] as [String : Any]
      let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions())
      project = try TulsiProject(data: data, projectBundleURL: projectBundleURL)

      XCTAssertEqual(project.bazelPackages, bazelPackages)
      XCTAssertEqual(project.projectName, projectName)
      XCTAssertEqual(project.workspaceRootURL, workspaceRootURL)
    } catch {
      XCTFail("Unexpected assertion")
    }
  }

  func testLoadWithTrailingSlash() {
    do {
      let dict = [
        "packages": bazelPackages,
        "projectName": projectName,
        "workspaceRoot": relativeRootPath + "/",
      ] as [String : Any]
      let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions())
      project = try TulsiProject(data: data, projectBundleURL: projectBundleURL)

      XCTAssertEqual(project.bazelPackages, bazelPackages)
      XCTAssertEqual(project.projectName, projectName)
      XCTAssertEqual(project.workspaceRootURL, workspaceRootURL)
    } catch {
      XCTFail("Unexpected assertion")
    }
  }

  func testLoadWithNoWorkspaceRoot() {
    do {
      let dict = [
        "packages": bazelPackages,
        "projectName": projectName,
      ] as [String : Any]
      let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions())
      let _ = try TulsiProject(data: data, projectBundleURL: projectBundleURL)
      XCTFail("Unexpectedly succeeded without a workspace root")
    } catch TulsiProject.ProjectError.deserializationFailed {
      // Expected.
    } catch {
      XCTFail("Unexpected assertion type")
    }
  }

  func testLoadWithAbsoluteWorkspaceRoot() {
    do {
      let dict = [
        "packages": bazelPackages,
        "projectName": projectName,
        "workspaceRoot": "/invalid/absolute/path",
      ] as [String : Any]
      let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions())
      let _ = try TulsiProject(data: data, projectBundleURL: projectBundleURL)
      XCTFail("Unexpectedly succeeded with an invalid workspace root")
    } catch TulsiProject.ProjectError.deserializationFailed {
      // Expected.
    } catch {
      XCTFail("Unexpected assertion type")
    }
  }
}
