package org.eclipse.jdt.debug.tests.eval.generator;

/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v0.5
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v05.html

Contributors:
    IBM Corporation - Initial implementation
*********************************************************************/

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class OtherTestsGenerator extends TestGenerator {

	public static void main(String[] args) throws Exception {
		
		genTestsOperators1();
		genTestsOperators2();
		genTestsArray();
		genTestsNestedTypes1();
		genTestsNestedTypes2();
		genTestsTypeHierarchy1();
		genTestsTypeHierarchy2();
		genTestNumberLiteral();
		
		genInstanceOfTests();

		System.out.println("done");
	}

	public static void genTestsOperators1() throws Exception {
		StringBuffer code= new StringBuffer();
		
		genTestTypeBinaryOpTypeBinaryPromotion(T_int, Op_plus, T_int, code);
		genTestTypeBinaryOpTypeBinaryPromotion(T_String, Op_plus, T_String, code);
		genTestLocalVarValue(T_int, code);
		genTestLocalVarValue(T_String, code);
		
		createJavaFile(code, "TestsOperators1", "EvalSimpleTests", 37, 1, 1);
	}

	public static void genTestsOperators2() throws Exception {
		StringBuffer code= new StringBuffer();
		
		genTestLocalVarAssignment(T_int, code);
		genTestLocalVarAssignment(T_String, code);
		genTestTypeAssignmentOpType(T_int, Op_plusAss, T_int, code);
		genTestTypeAssignmentOpType(T_String, Op_plusAss, T_String, code);
		
		createJavaFile(code, "TestsOperators2", "EvalSimpleTests", 37, 1, 1);
	}
	
	public static void genTestsArray() throws Exception {
		StringBuffer code= new StringBuffer();
		
		genTestArrayValue(T_int, code);
		genTestArrayLength(T_int, code);
		genTestArrayAssignment(T_int, code);
		genTestArrayInitialization(T_int, code);

		genTestArrayValue(T_String, code);
		genTestArrayLength(T_String, code);
		genTestArrayAssignment(T_String, code);
		genTestArrayInitialization(T_String, code);
		
		createJavaFile(code, "TestsArrays", "EvalArrayTests", 37, 1, 1);
	}

	public static void genTestsNestedTypes1() throws Exception {
		StringBuffer code= new StringBuffer();
		
		NestedTypeTestGenerator.createTest('a', 2, code);
		NestedTypeTestGenerator.createTest('d', 2, code);
		NestedTypeTestGenerator.createTest('e', 2, code);
		NestedTypeTestGenerator.createTest('h', 2, code);
		NestedTypeTestGenerator.createTest('i', 2, code);
		NestedTypeTestGenerator.createTestThis('c', 2, code);
		NestedTypeTestGenerator.createTestThis('f', 2, code);
		NestedTypeTestGenerator.createTestThis('j', 2, code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T, 'b', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_A, 'd', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_A, 'd', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_A_AA, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_A_AB, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_A_AA, 'j', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_A_AB, 'j', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_B, 'h', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_B, 'd', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_B_BB, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_B_BB, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_BB, 'j', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_B_this, 'c', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_B_this, 'h', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_this, 'a', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_this, 'd', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_this, 'e', code);

		createJavaFile(code, "TestsNestedTypes1", "EvalNestedTypeTests",  252, 4, 1);
	}

	public static void genTestsNestedTypes2() throws Exception {
		StringBuffer code= new StringBuffer();
		
		NestedTypeTestGenerator.createTest('f', 0, code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T, 'b', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_A, 'd', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_A, 'd', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_A_AA, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_A_AB, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_A_AA, 'j', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_A_AB, 'j', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_B, 'h', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_B, 'd', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_T_B_BB, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.T_B_BB, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.I_A, 'h', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.I_AA, 'c', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.I_AA, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.I_AA, 'j', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.I_AB, 'c', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.I_AB, 'f', code);
		NestedTypeTestGenerator.createTestQualifier(NestedTypeTestGenerator.I_AB, 'i', code);

		createJavaFile(code, "TestsNestedTypes2", "EvalNestedTypeTests",  739, 2, 1);
	}


	public static void genTestsTypeHierarchy1() throws Exception {
		StringBuffer code= new StringBuffer();
		
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.IAA, TypeHierarchyTestsGenerator.M1, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.AA, TypeHierarchyTestsGenerator.M2, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.AB, TypeHierarchyTestsGenerator.S2, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.AC, TypeHierarchyTestsGenerator.M1, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.IBB, TypeHierarchyTestsGenerator.M3, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.IBC, TypeHierarchyTestsGenerator.M1, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.BB, TypeHierarchyTestsGenerator.M1, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.BB, TypeHierarchyTestsGenerator.M3, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.BC, TypeHierarchyTestsGenerator.S2, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.BC, TypeHierarchyTestsGenerator.S4, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.ICC, TypeHierarchyTestsGenerator.M3, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.CC, TypeHierarchyTestsGenerator.M2, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.CC, TypeHierarchyTestsGenerator.M4, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.CC, TypeHierarchyTestsGenerator.M6, code);
		
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_A, TypeHierarchyTestsGenerator.M1, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_B, TypeHierarchyTestsGenerator.M1, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_B, TypeHierarchyTestsGenerator.M2, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_B, TypeHierarchyTestsGenerator.S4, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_C, TypeHierarchyTestsGenerator.M1, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_C, TypeHierarchyTestsGenerator.M4, code);
		TypeHierarchyTestsGenerator.createTestQualifier(TypeHierarchyTestsGenerator.N_C, TypeHierarchyTestsGenerator.S6, code);

		createJavaFile(code, "TestsTypeHierarchy1", "EvalTypeHierarchyTests",   146, 1, 1);
	}

	public static void genTestsTypeHierarchy2() throws Exception {
		StringBuffer code= new StringBuffer();

		TypeHierarchyTestsGenerator.createTest_TestC(code, TypeHierarchyTestsGenerator.CC);
		
		createJavaFile(code, "TestsTypeHierarchy2", "EvalTypeHierarchyTests",   119, 2, 1);
	}

	/**
	 * Method genTestNumberLiteral.
	 */
	private static void genTestNumberLiteral() throws Exception {
		StringBuffer code= new StringBuffer();

		createTestNumberLiteral1("0", T_int, code);
		createTestNumberLiteral1("00", T_int, code);
		createTestNumberLiteral1("0x0", T_int, code);
		createTestNumberLiteral1("-1", T_int, code);
		createTestNumberLiteral1("1", T_int, code);
		createTestNumberLiteral1("2147483647", T_int, code);
		createTestNumberLiteral1("-2147483648", T_int, code);
		createTestNumberLiteral1("0x7fffffff", T_int, code);
		createTestNumberLiteral1("0x80000000", T_int, code);
		createTestNumberLiteral1("0xffffffff", T_int, code);
		createTestNumberLiteral1("017777777777", T_int, code);
		createTestNumberLiteral1("020000000000", T_int, code);
		createTestNumberLiteral1("037777777777", T_int, code);
		createTestNumberLiteral1("2", T_int, code);
		createTestNumberLiteral1("0372", T_int, code);
		createTestNumberLiteral1("0xDadaCafe", T_int, code);
		createTestNumberLiteral1("1996", T_int, code);
		createTestNumberLiteral1("0x00FF00FF", T_int, code);
		
		createTestNumberLiteral1("0L", T_long, code);
		createTestNumberLiteral1("00L", T_long, code);
		createTestNumberLiteral1("0x0L", T_long, code);
		createTestNumberLiteral1("-1L", T_long, code);
		createTestNumberLiteral1("1L", T_long, code);
		createTestNumberLiteral1("9223372036854775807L", T_long, code);
		createTestNumberLiteral1("-9223372036854775808L", T_long, code);
		createTestNumberLiteral1("0x7fffffffffffffffL", T_long, code);
		createTestNumberLiteral1("0x8000000000000000L", T_long, code);
		createTestNumberLiteral1("0xffffffffffffffffL", T_long, code);
		createTestNumberLiteral1("0777777777777777777777L", T_long, code);
		createTestNumberLiteral1("01000000000000000000000L", T_long, code);
		createTestNumberLiteral1("01777777777777777777777L", T_long, code);
		createTestNumberLiteral1("0777l", T_long, code);
		createTestNumberLiteral1("0x100000000L", T_long, code);
		createTestNumberLiteral1("2147483648L", T_long, code);
		createTestNumberLiteral1("0xC0B0L", T_long, code);
		
		createTestNumberLiteral2("3.40282347e+38f", T_float, code);
		createTestNumberLiteral2("1.40239846e-45f", T_float, code);
		createTestNumberLiteral2("1e1f", T_float, code);
		createTestNumberLiteral2("2.f", T_float, code);
		createTestNumberLiteral2(".3f", T_float, code);
		createTestNumberLiteral2("0f", T_float, code);
		createTestNumberLiteral2("3.14f", T_float, code);
		createTestNumberLiteral2("6.022137e+23f", T_float, code);

		createTestNumberLiteral2("1.79769313486231570e+308", T_double, code);
		createTestNumberLiteral2("4.94065645841246544e-324", T_double, code);
		createTestNumberLiteral2("1e1", T_double, code);
		createTestNumberLiteral2("2.", T_double, code);
		createTestNumberLiteral2(".3", T_double, code);
		createTestNumberLiteral2("0.0", T_double, code);
		createTestNumberLiteral2("3.14", T_double, code);
		createTestNumberLiteral2("1e-9d", T_double, code);
		createTestNumberLiteral2("1e137", T_double, code);

		createJavaFile(code, "TestsNumberLiteral", "EvalSimpleTests", 5, 1, 1);
	}

	/**
	 * Method createTestNumberLiteral.
	 */
	private static void createTestNumberLiteral1(String literal, int type, StringBuffer code) {
		String tName= typeName[type];
		
		code.append("\tpublic void test" + literal.replace('-', 'N').replace('.', '_').replace('+', 'P') + "() throws Throwable {\n");
		tryBlockBegin(code);
		genCodeEval("\"" + literal + '"', true, code);
		genCodeReturnTypeCheck(literal, tName, true, code);
		genCodeReturnValueCheckPrimitiveType(literal, tName, typeUpperName[type], literal, true, code);
		tryBlockEnd(code);
		code.append("\t}\n\n");
	}

	/**
	 * Method createTestNumberLiteral.
	 */
	private static void createTestNumberLiteral2(String literal, int type, StringBuffer code) {
		String tName= typeName[type];
		
		code.append("\tpublic void test" + literal.replace('-', 'N').replace('.', '_').replace('+', 'P') + "() throws Throwable {\n");
		tryBlockBegin(code);
		genCodeEval("\"" + literal + '"', true, code);
		genCodeReturnTypeCheck(literal, tName, true, code);
		genCodeReturnValueCheckFloatDoubleType(literal, tName, typeUpperName[type], literal, true, code);
		tryBlockEnd(code);
		code.append("\t}\n\n");
	}

	public static void genInstanceOfTests() throws Exception {
	}


	public static void createJavaFile(StringBuffer tests, String className, String testClass, int lineNumber, int numberFrames, int hitCount) throws Exception {
		
		StringBuffer code= new StringBuffer();
		
		code.append("package org.eclipse.jdt.debug.tests.eval;\n\n");
		code.append("/**********************************************************************\n");
		code.append("Copyright (c) 2000, 2002 IBM Corp. and others.\n");
		code.append("All rights reserved. This program and the accompanying materials\n");
		code.append("are made available under the terms of the Common Public License v0.5\n");
		code.append("which accompanies this distribution, and is available at\n");
		code.append("http://www.eclipse.org/legal/cpl-v05.html\n\n");
		code.append("Contributors:\n");
		code.append("    IBM Corporation - Initial implementation\n");
		code.append("*********************************************************************/\n");
		code.append("import org.eclipse.jdt.debug.core.IJavaPrimitiveValue;\n\n");
		code.append("import org.eclipse.debug.core.model.IValue;\n");
		code.append("import org.eclipse.jdt.internal.debug.core.model.JDIObjectValue;\n\n");
		code.append("public class " + className + " extends Tests {\n");
		code.append("\t/**\n");
		code.append("\t * Constructor for TypeHierarchy.\n");
		code.append("\t * @param name\n");
		code.append("\t */\n");
		code.append("\tpublic " + className + "(String name) {\n");
		code.append("\t\tsuper(name);\n");
		code.append("\t}\n\n");
		code.append("\tpublic void init() throws Exception {\n");
		code.append("\t\tinitializeFrame(\"" + testClass + "\", " + lineNumber + ", " + numberFrames + ", " + hitCount + ");\n");
		code.append("\t}\n\n");
		code.append("\tprotected void end() throws Exception {\n");
		code.append("\t\tdestroyFrame();\n");
		code.append("\t}\n\n");
		
		code.append(tests.toString());
		
		code.append("}\n");
		
		Writer file = new FileWriter(new File(className + ".java").getAbsoluteFile());
		
		file.write(code.toString());
		
		file.close();
		
	}
}
