/*
 * Copyright (c) 2012 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf.ui.protoc.command;

import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.*;

import java.io.File;

import org.junit.*;
import org.junit.rules.TemporaryFolder;

/**
 * Tests for <code>{@link ImportRootsProtocOption#singleImportRoot(File, File)}</code>
 *
 * @author alruiz@google.com (Alex Ruiz)
 */
public class ImportRootsProtocOption_singleImportRoot_Test {
  @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();

  private File project;

  @Before public void setUp() {
    project = temporaryFolder.newFolder("project");
  }

  @Test public void should_return_project_directory_if_file_is_underneath_it() {
    File protoFile = new File(project, "test.proto");
    String singleImportRoot = ImportRootsProtocOption.singleImportRoot(project, protoFile);
    assertThat(singleImportRoot, equalTo(project.toString()));
  }

  @Test public void should_return_parent_directory_directly_below_project() {
    File srcDirectory = createDirectory(project, "src");
    File protoFile = new File(createDirectory(srcDirectory, "proto"), "test.proto");
    String singleImportRoot = ImportRootsProtocOption.singleImportRoot(project, protoFile);
    assertThat(singleImportRoot, equalTo(srcDirectory.toString()));
  }

  private File createDirectory(File parent, String name) {
    File directory = new File(parent, name);
    assertTrue(directory.mkdir());
    return directory;
  }
}
