/*
 * Copyright 2010 Google Inc.
 * 
 * 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.
 */
package com.google.gwt.user.tools;

import com.google.gwt.user.tools.WebAppCreator.ArgProcessor;

import junit.framework.TestCase;

import java.io.File;
import java.io.IOException;

/**
 * Test Class for WebAppCreator.
 */
public class WebAppCreatorTest extends TestCase {

  private static final String MY_PROJECT = "com.foo.Hello";
  private String mockJar;
  private String projectFolder;
  private File tempFolder;
  private String tempPath;

  @Override
  public void setUp() throws Exception {
    // Create a temporary folder for the test
    tempFolder = File.createTempFile("gwt-test-webappcreator-", "");
    assertTrue(tempFolder.delete());
    assertTrue(tempFolder.mkdir());
    tempPath = tempFolder.getAbsolutePath();

    // Generate an empty .jar
    mockJar = tempPath + File.separatorChar + "mock-junit.jar";
    assertTrue(new File(mockJar).createNewFile());

    // Verify that project folder doesn't exist
    projectFolder = tempPath + File.separatorChar + "project";
    assertFalse(new File(projectFolder).exists());
  }

  @Override
  public void tearDown() {
    // Delete temporary folder
    deleteDir(tempFolder);
  }

  /**
   * Default options, generate ant and eclipse files.
   */
  public void testAppCreatorAnt() throws IOException {
    runCreator("-out", projectFolder, MY_PROJECT);
    assertFileExists(".project");
    assertFileExists(".classpath");
    assertFileExists("build.xml");
    assertFileExists("README.txt");
    assertFileExists("Hello.launch");
    assertFileExists("war/Hello.html");
    assertFileExists("war/Hello.css");
    assertFileExists("war/WEB-INF/web.xml");
    assertFileExists("src/com/foo/Hello.gwt.xml");
    assertFileExists("src/com/foo/client/GreetingServiceAsync.java");
    assertFileExists("src/com/foo/client/GreetingService.java");
    assertFileExists("src/com/foo/client/Hello.java");
    assertFileExists("src/com/foo/shared/FieldVerifier.java");
    assertFileExists("src/com/foo/server/GreetingServiceImpl.java");
    assertFileDoesNotExist("HelloTest-dev.launch");
    assertFileDoesNotExist("HelloTest-prod.launch");
    assertFileDoesNotExist("test/com/foo/HelloJUnit.gwt.xml");
    assertFileDoesNotExist("test/com/foo/client/HelloTest.java");
  }

  /**
   * Adding a valid junit.jar, the test stuff is generated.
   */
  public void testCreatorAntJunit() throws IOException {
    runCreator("-out", projectFolder, "-junit", mockJar, MY_PROJECT);
    assertFileExists(".project");
    assertFileExists(".classpath");
    assertFileExists("build.xml");
    assertFileExists("README.txt");
    assertFileExists("Hello.launch");
    assertFileExists("HelloTest-dev.launch");
    assertFileExists("HelloTest-prod.launch");
    assertFileExists("war/Hello.html");
    assertFileExists("war/Hello.css");
    assertFileExists("war/WEB-INF/web.xml");
    assertFileExists("src/com/foo/Hello.gwt.xml");
    assertFileExists("src/com/foo/client/GreetingServiceAsync.java");
    assertFileExists("src/com/foo/client/GreetingService.java");
    assertFileExists("src/com/foo/client/Hello.java");
    assertFileExists("src/com/foo/shared/FieldVerifier.java");
    assertFileExists("src/com/foo/server/GreetingServiceImpl.java");
    assertFileExists("test/com/foo/HelloJUnit.gwt.xml");
    assertFileExists("test/com/foo/client/HelloTest.java");
  }

  /**
   * Check illegal argument combinations.
   */
  public void testCreatorBadArguments() {

    ArgProcessor argProcessor = new WebAppCreator().new ArgProcessor();
    assertFalse(argProcessor.processArgs("-out", projectFolder,
        "unknown_parameter", MY_PROJECT));

    argProcessor = new WebAppCreator().new ArgProcessor();
    assertFalse(argProcessor.processArgs("-out", projectFolder,
        "wrong_project_name"));

    argProcessor = new WebAppCreator().new ArgProcessor();
    assertFalse(argProcessor.processArgs("-out", projectFolder, "-ignore",
        "-overwrite", MY_PROJECT));

    argProcessor = new WebAppCreator().new ArgProcessor();
    assertFalse(argProcessor.processArgs("-out", projectFolder, "-overwrite",
        "-ignore", MY_PROJECT));
  }

  /**
   * Do not generate eclipse files.
   */
  public void testCreatorNoAnt() throws IOException {
    runCreator("-out", projectFolder, "-noant", "-junit", mockJar, MY_PROJECT);
    assertFileExists(".project");
    assertFileExists(".classpath");
    assertFileDoesNotExist("build.xml");
    assertFileExists("README.txt");
    assertFileExists("Hello.launch");
    assertFileExists("HelloTest-dev.launch");
    assertFileExists("HelloTest-prod.launch");
    assertFileExists("war/Hello.html");
    assertFileExists("war/Hello.css");
    assertFileExists("war/WEB-INF/web.xml");
    assertFileExists("src/com/foo/Hello.gwt.xml");
    assertFileExists("src/com/foo/client/GreetingServiceAsync.java");
    assertFileExists("src/com/foo/client/GreetingService.java");
    assertFileExists("src/com/foo/client/Hello.java");
    assertFileExists("src/com/foo/shared/FieldVerifier.java");
    assertFileExists("src/com/foo/server/GreetingServiceImpl.java");
    assertFileExists("test/com/foo/HelloJUnit.gwt.xml");
    assertFileExists("test/com/foo/client/HelloTest.java");
  }

  /**
   * Do not generate eclipse files.
   */
  public void testCreatorNoEclipse() throws IOException {
    runCreator("-out", projectFolder, "-XnoEclipse", "-junit", mockJar,
        MY_PROJECT);
    assertFileDoesNotExist(".project");
    assertFileDoesNotExist(".classpath");
    assertFileExists("build.xml");
    assertFileExists("README.txt");
    assertFileDoesNotExist("Hello.launch");
    assertFileDoesNotExist("HelloTest-dev.launch");
    assertFileDoesNotExist("HelloTest-prod.launch");
    assertFileExists("war/Hello.html");
    assertFileExists("war/Hello.css");
    assertFileExists("war/WEB-INF/web.xml");
    assertFileExists("src/com/foo/Hello.gwt.xml");
    assertFileExists("src/com/foo/client/GreetingServiceAsync.java");
    assertFileExists("src/com/foo/client/GreetingService.java");
    assertFileExists("src/com/foo/client/Hello.java");
    assertFileExists("src/com/foo/shared/FieldVerifier.java");
    assertFileExists("src/com/foo/server/GreetingServiceImpl.java");
    assertFileExists("test/com/foo/HelloJUnit.gwt.xml");
    assertFileExists("test/com/foo/client/HelloTest.java");
  }

  /**
   * Generate a maven2 project. Note that -junit option is not needed.
   */
  public void testCreatorMaven() throws IOException {
    runCreator("-out", projectFolder, "-maven", MY_PROJECT);
    assertFileExists(".project");
    assertFileExists(".classpath");
    assertFileExists("build.xml");
    assertFileExists("pom.xml");
    assertFileExists("README.txt");
    assertFileExists("src/main/java/com/foo/shared/FieldVerifier.java");
    assertFileExists("src/main/java/com/foo/server");
    assertFileExists("src/main/java/com/foo/server/GreetingServiceImpl.java");
    assertFileExists("src/main/java/com/foo/Hello.gwt.xml");
    assertFileExists("src/main/java/com/foo/client");
    assertFileExists("src/main/java/com/foo/client/Hello.java");
    assertFileExists("src/main/java/com/foo/client/GreetingServiceAsync.java");
    assertFileExists("src/main/java/com/foo/client/GreetingService.java");
    assertFileExists("src/main/webapp/Hello.html");
    assertFileExists("src/main/webapp/Hello.css");
    assertFileExists("src/main/webapp/WEB-INF/web.xml");
    assertFileExists("src/test/java/com/foo/client/HelloTest.java");
    assertFileExists("src/test/java/com/foo/HelloJUnit.gwt.xml");
    assertFileExists("Hello.launch");
    assertFileExists("HelloTest-dev.launch");
    assertFileExists("HelloTest-prod.launch");
  }

  /**
   * Running generator on existing projects.
   */
  public void testCreatorMultipleTimes() throws IOException {
    // Create the project
    runCreator("-out", projectFolder, MY_PROJECT);

    // Try create the project again without -ignore nor -overwrite
    try {
      runCreator("-out", projectFolder, MY_PROJECT);
      fail("webAppCreator can not be run twice");
    } catch (IOException e) {
    }

    // Check -ignore flag
    try {
      runCreator("-out", projectFolder, "-ignore", MY_PROJECT);
    } catch (IOException e) {
      fail("webAppCreator should not faild with -ignore option when is executed twice");
    }

    // Check -overwrite flag
    try {
      runCreator("-out", projectFolder, "-overwrite", MY_PROJECT);
    } catch (IOException e) {
      fail("webAppCreator should not faild with -ignore option when is executed twice");
    }
  }

  /**
   * Generate only eclipse stuff.
   */
  public void testCreatorOnlyEclipse() throws IOException {
    runCreator("-out", projectFolder, "-XonlyEclipse", "-junit", mockJar,
        MY_PROJECT);
    assertFileExists(".project");
    assertFileExists(".classpath");
    assertFileDoesNotExist("build.xml");
    assertFileDoesNotExist("README.txt");
    assertFileExists("Hello.launch");
    assertFileExists("HelloTest-dev.launch");
    assertFileExists("HelloTest-prod.launch");
    assertFileDoesNotExist("war/Hello.html");
    assertFileDoesNotExist("war/Hello.css");
    assertFileDoesNotExist("war/WEB-INF/web.xml");
    assertFileDoesNotExist("src/com/foo/Hello.gwt.xml");
    assertFileDoesNotExist("src/com/foo/client/GreetingServiceAsync.java");
    assertFileDoesNotExist("src/com/foo/client/GreetingService.java");
    assertFileDoesNotExist("src/com/foo/client/Hello.java");
    assertFileDoesNotExist("src/com/foo/shared/FieldVerifier.java");
    assertFileDoesNotExist("src/com/foo/server/GreetingServiceImpl.java");
    assertFileDoesNotExist("test/com/foo/HelloJUnit.gwt.xml");
    assertFileDoesNotExist("test/com/foo/client/HelloTest.java");
  }

  /**
   * Test the main method.
   */
  public void testMain() {
    // This property overrides the default gwt installation path
    // Note: this only can be set once because Utility.getInstallPath caches it
    System.setProperty("gwt.devjar", mockJar);
    assertTrue(WebAppCreator.doMain("-out", projectFolder, MY_PROJECT));
    assertFalse(WebAppCreator.doMain());
  }

  private void assertFileDoesNotExist(String file) {
    assertFalse(new File(projectFolder + File.separatorChar + file).exists());
  }

  private void assertFileExists(String file) {
    assertTrue(new File(projectFolder + File.separatorChar + file).exists());
  }

  /**
   * Delete a folder recursively.
   */
  private boolean deleteDir(File dir) {
    if (dir.isDirectory()) {
      String[] children = dir.list();
      for (String child : children) {
        if (!deleteDir(new File(dir, child))) {
          return false;
        }
      }
    }
    return dir.delete();
  }

  /**
   * run appWebCreator.
   */
  private void runCreator(String... args) throws IOException {
    WebAppCreator creator = new WebAppCreator();
    ArgProcessor argProcessor = creator.new ArgProcessor();
    if (!argProcessor.processArgs(args)) {
      throw new IllegalArgumentException();
    }
    creator.doRun(tempPath);
  }
}
