/*
 * Copyright 2008 CoreMedia AG
 * 
 * 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 net.jangaroo.test;

import net.jangaroo.jooc.Jooc;
import junit.framework.TestCase;

import java.io.File;

/**
 * An abstract base class for Jangaroo Compiler tests. Contains methods to compile JangarooScript
 * source files.
 * 
 * @author Andreas Gawecki
 */
public abstract class JooTestCase extends TestCase {

  public JooTestCase(String name) {
    super(name);
  }

  protected boolean debug = false;
  protected boolean ea = false;

  protected String sourceDir = null;
  protected String destinationDir = null;

  protected String getProperty(String name, String defaultValue) {
    return System.getProperty(name, defaultValue);
  }

  protected void setUp() throws Exception {
    sourceDir = getProperty("net.jangaroo.jooc.test.source", ".");
    destinationDir = getProperty("net.jangaroo.jooc.test.destination", null);
  }

  protected String[] concat(String[] arr1, String[] arr2) {
    String[] result = new String[arr1.length + arr2.length];
    System.arraycopy(arr1, 0, result, 0, arr1.length);
    System.arraycopy(arr2, 0, result, arr1.length, arr2.length);
    return result;
  }

  protected String[] concat(String s, String[] arr2) {
    return concat(new String[]{s}, arr2);
  }

  protected String toString(String[] arr) {
    String result = "";
    for (int i = 0; i < arr.length; i++) {
      if (i > 0)
        result += " ";
      String s = arr[i];
      result += s;
    }
    return result;
  }

  protected String[] copy(String[] arr) {
    String[] result = new String[arr.length];
    System.arraycopy(arr, 0, result, 0, arr.length);
    return result;
  }

  protected String[] prependSourceDir(String[] fileNames) {
    String[] result = copy(fileNames);
    for (int i = 0; i < result.length; i++) {
      String s = result[i];
      result[i] = (new File(sourceDir, s)).getPath();
    }
    return result;
  }

  protected int runJooc(String[] fileNames) {
    String[] args = prependSourceDir(fileNames);
    if (debug) args = concat("-g", args);
    if (ea) args = concat("-ea", args);
    if (destinationDir != null) args = concat(new String[]{"-d", destinationDir}, args);
    Jooc compiler = new Jooc();
    System.out.println("jooc " + toString(args));
    return compiler.run(args);
  }

  protected int runJooc(String filename) {
    return runJooc(new String[]{filename});
  }

  protected void expectCompileSuccess(String fileName) {
    compile(new String[]{fileName});
  }

  protected void expectCompileResult(int resultCode, String[] fileNames) {
    int actualResult = runJooc(fileNames);
    if (resultCode != actualResult) {
      fail("unexpected compilation result: expected " + resultCode + " (" + Jooc.getResultCodeDescription(resultCode) + "), " +
              "found " + actualResult + " (" + Jooc.getResultCodeDescription(actualResult) + ")");
    }
  }

  protected void compile(String[] fileNames) {
    expectCompileResult(Jooc.RESULT_CODE_OK, fileNames);
  }

  protected void compile(String fileName) {
    compile(new String[] { fileName });
  }

}
