#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

create()
{
   testMethodName="test$1$2";
   echo -e "public void $testMethodName() throws Exception {" >>$output;
   echo -e "    log(\"$testMethodName() start\");" >>$output;
   echo -e "    PrintWriter outputWriter  = null;" >>$output;
   echo -e "    PrintWriter logWriter = null;" >>$output;
   echo -e "    try {" >>$output;
   echo -e "        outputWriter  = new PrintWriter(getRef());" >>$output;
   echo -e "        logWriter = new PrintWriter(getLog());" >>$output;
   echo -e "        new CompletionTest().test(outputWriter, logWriter, \"$text\", $sorted, getDataDir(), \"$project\", \"$sourcefile\", $lineinsource);" >>$output;
   echo -e "    } finally {" >>$output;
   echo -e "        if (outputWriter != null) {" >>$output;
   echo -e "            outputWriter.flush();" >>$output;
   echo -e "        }" >>$output;
   echo -e "        if (logWriter != null) {" >>$output;
   echo -e "            logWriter.flush();" >>$output;
   echo -e "        }" >>$output;
   echo -e "      log(\"$testMethodName() end\");" >>$output;
   echo -e "    }\n" >>$output;
   echo -e "    assertFile(\"Output does not match golden file.\", resolveGoldenFile(\"$proposedGoldenFile\"), new File(getWorkDir(), this.getName() + \".ref\"), null, new LineDiff(false));" >>$output;
   echo -e "}" >>$output;

   testMethodNames="$testMethodNames $testMethodName";
}

go() 
{
   output="CompletionTestPerformer.java";


   rm -f $output;
   touch $output;
   cat >>$output <<END_OF_SOURCE
//This class is automatically generated - DO NOT MODIFY (ever)
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.netbeans.test.java.editor.completion;
import java.io.PrintWriter;

import org.openide.filesystems.*;

import org.netbeans.junit.NbTestCase;
import org.netbeans.junit.NbTestSuite;
import org.netbeans.jellytools.JellyTestCase;
import org.netbeans.test.editor.LineDiff;
import java.io.File;

/**This class is automatically generated from <I>config.txt</I> using bash
 * script <I>create</I>. For any changes, change the code generating script
 * and re-generate.
 *
 * Althought this class is runned as a test, there is no real code. This class
 * is only wrapper between xtest and harness independet test code. Main information
 * source is <B>CompletionTest</B> class ({@link CompletionTest}).
 *
 * @see CompletionTest
 */
public class CompletionTestPerformer extends NbTestCase {

    /** Need to be defined because of JUnit */
    public CompletionTestPerformer(String name) {
        super(name);
    }

    protected void setUp() {
        log("CompletionTestPerformer.setUp started.");
        log("CompletionTestPerformer.setUp finished.");
    }

    private String getJDKVersionCode() {
        String specVersion = System.getProperty("java.version");
        
        if (specVersion.startsWith("1.4"))
            return "jdk14";
        
        if (specVersion.startsWith("1.5"))
            return "jdk15";
        
        throw new IllegalStateException("Specification version: " + specVersion + " not recognized.");
    }

    private File resolveGoldenFile(String proposedGoldenFileName) {
        if ("@".equals(proposedGoldenFileName.trim()))
            return getGoldenFile(getJDKVersionCode() + "-" + getName() + ".pass");
        else
            return getGoldenFile(getJDKVersionCode() + "-" + proposedGoldenFileName + ".pass");
    }

END_OF_SOURCE

    testMethodNames="";
while read line; do
   echo $line >/tmp/line.tmp
   name=`cut -d ':' -f 1 </tmp/line.tmp`;
   echo "Creating test case: $name";
   text=`cut -d ':' -f 2 </tmp/line.tmp`;
   sorted=`cut -d ':' -f 3 </tmp/line.tmp`;
   proposedGoldenFile=`cut -d ':' -f 4 </tmp/line.tmp`;
   project=`cut -d ':' -f 5 </tmp/line.tmp`;
   sourcefile=`cut -d ':' -f 6 </tmp/line.tmp`;
   lineinsource=`cut -d ':' -f 7 </tmp/line.tmp`;
   if test "$sorted" == "true"; then
      create $name "sorted";
   else
      if test "$sorted" == "false"; then
          create $name "unsorted";
      else
         echo "Unknown sorted modifier: \"$sorted\"" 1>&2;
      fi;
   fi; 
done;

#   echo -e "    public static NbTestSuite suite() {\nNbTestSuite suite = new NbTestSuite();" >>$output;
#   for method in $testMethodNames; do
#      echo -e "suite.addTest(new CompletionTestPerformer(\"$method\"));" >>$output;
#   done;
#   echo -e "return suite;\n}" >>$output;

   echo -e "}" >>$output;

}

grep -v <config.cfg "^#" | go
