blob: 12fe95040bd0337a6254548fae87fd0da14bef07 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
import junit.framework.Test;
import java.io.*;
import junit.framework.Assert;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException;
public class ClassFileComparatorTest extends AbstractRegressionTest {
private static final String SOURCE_DIRECTORY = Util.getOutputDirectory() + File.separator + "source";
private static final String EVAL_DIRECTORY = Util.getOutputDirectory() + File.separator + "eval";
public ClassFileComparatorTest(String name) {
super(name);
}
public static Test suite() {
return setupSuite(testClass());
}
public static Class testClass() {
return ClassFileComparatorTest.class;
}
public void removeTempClass(String className) {
File dir = new File(SOURCE_DIRECTORY);
String[] fileNames = dir.list();
if (fileNames != null) {
for (int i = 0, max = fileNames.length; i < max; i++) {
if (fileNames[i].indexOf(className) != -1) {
new File(SOURCE_DIRECTORY + File.separator + fileNames[i]).delete();
}
}
}
dir = new File(EVAL_DIRECTORY);
fileNames = dir.list();
if (fileNames != null) {
for (int i = 0, max = fileNames.length; i < max; i++) {
if (fileNames[i].indexOf(className) != -1) {
new File(EVAL_DIRECTORY + File.separator + fileNames[i]).delete();
}
}
}
}
public void compileAndDeploy(String source, String className) {
File directory = new File(SOURCE_DIRECTORY);
if (!directory.exists()) {
if (!directory.mkdirs()) {
System.out.println("Could not create " + SOURCE_DIRECTORY);
return;
}
}
String fileName = SOURCE_DIRECTORY + File.separator + className + ".java";
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
writer.write(source);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
StringBuffer buffer = new StringBuffer();
buffer
.append("\"")
.append(fileName)
.append("\" -d \"")
.append(EVAL_DIRECTORY)
.append("\" -nowarn -g -classpath \"")
.append(Util.getJREDirectory() + "/lib/rt.jar;")
.append(SOURCE_DIRECTORY)
.append("\"");
org.eclipse.jdt.internal.compiler.batch.Main.compile(buffer.toString());
}
public boolean areStructurallyDifferent(String classFile1, String classFile2, boolean orderRequired, boolean excludeSynthetic) {
try {
ClassFileReader reader = ClassFileReader.read(EVAL_DIRECTORY + File.separator + classFile1 + ".class");
int fileLength;
File file = new File(EVAL_DIRECTORY + File.separator + classFile2 + ".class");
byte classFileBytes[] = new byte[fileLength = (int) file.length()];
java.io.FileInputStream stream = new java.io.FileInputStream(file);
int bytesRead = 0;
int lastReadSize = 0;
while ((lastReadSize != -1) && (bytesRead != fileLength)) {
lastReadSize = stream.read(classFileBytes, bytesRead, fileLength - bytesRead);
bytesRead += lastReadSize;
}
stream.close();
return reader.hasStructuralChanges(classFileBytes, orderRequired, excludeSynthetic);
} catch(IOException e) {
return true;
} catch(ClassFormatException e) {
return true;
}
}
public void test001() {
try {
String sourceA001 =
"public class A001 {\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
" public String toString() {\n" +
" return \"hello\";\n" +
" }\n" +
"}";
compileAndDeploy(sourceA001, "A001");
String sourceA001_2 =
"public class A001_2 {\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
" public String toString() {\n" +
" return \"hello\";\n" +
" }\n" +
"}";
compileAndDeploy(sourceA001_2, "A001_2");
Assert.assertTrue(!areStructurallyDifferent("A001", "A001_2", false, false));
} finally {
removeTempClass("A001");
}
}
public void test002() {
try {
String sourceA002 =
"public class A002 {\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
"}";
compileAndDeploy(sourceA002, "A002");
String sourceA002_2 =
"public class A002_2 {\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
" public String toString() {\n" +
" return \"hello\";\n" +
" }\n" +
"}";
compileAndDeploy(sourceA002_2, "A002_2");
Assert.assertTrue(areStructurallyDifferent("A002", "A002_2", false, false));
} finally {
removeTempClass("A002");
}
}
public void test003() {
try {
String sourceA003 =
"public class A003 {\n" +
"public static final int II = 5;\n" +
"}";
compileAndDeploy(sourceA003, "A003");
String sourceA003_2 =
"public class A003_2 {\n" +
"public static final int II = 6;\n" +
"}";
compileAndDeploy(sourceA003_2, "A003_2");
Assert.assertTrue(areStructurallyDifferent("A003", "A003_2", false, false));
} finally {
removeTempClass("A003");
}
}
public void test004() {
try {
String sourceA004 =
"public class A004 {\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
" public String toString() {\n" +
" return \"hello\";\n" +
" }\n" +
"}";
compileAndDeploy(sourceA004, "A004");
String sourceA004_2 =
"public class A004_2 {\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
" public String toString() {\n" +
" return \"hello\";\n" +
" }\n" +
"}";
compileAndDeploy(sourceA004_2, "A004_2");
Assert.assertTrue(!areStructurallyDifferent("A004", "A004_2", true, true));
} finally {
removeTempClass("A004");
}
}
public void test005() {
try {
String sourceA005 =
"public class A005 {\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
"}";
compileAndDeploy(sourceA005, "A005");
String sourceA005_2 =
"public class A005_2 {\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
" public String toString() {\n" +
" return \"hello\";\n" +
" }\n" +
"}";
compileAndDeploy(sourceA005_2, "A005_2");
Assert.assertTrue(areStructurallyDifferent("A005", "A005_2", true, true));
} finally {
removeTempClass("A005");
}
}
public void test006() {
try {
String sourceA006 =
"public class A006 {\n" +
"public static final int II = 5;\n" +
"}";
compileAndDeploy(sourceA006, "A006");
String sourceA006_2 =
"public class A006_2 {\n" +
"public static final int II = 6;\n" +
"}";
compileAndDeploy(sourceA006_2, "A006_2");
Assert.assertTrue(areStructurallyDifferent("A006", "A006_2", true, true));
} finally {
removeTempClass("A006");
}
}
public void test007() {
try {
String sourceA007 =
"public class A007 {\n" +
"public static final int II = 6;\n" +
"public Runnable foo() {\n" +
"\treturn null;\n"+
"}\n" +
"}";
compileAndDeploy(sourceA007, "A007");
String sourceA007_2 =
"public class A007_2 {\n" +
"public static final int II = 6;\n" +
"public Runnable foo() {\n" +
"\treturn new Runnable() {public void run() {}};\n"+
"}\n" +
"}";
compileAndDeploy(sourceA007_2, "A007_2");
Assert.assertTrue(!areStructurallyDifferent("A007", "A007_2", true, true));
} finally {
removeTempClass("A007");
}
}
public void test008() {
try {
String sourceA008 =
"public class A008 {\n" +
"private int i = 6;\n" +
"public int foo() {\n" +
"\treturn i;\n"+
"}\n" +
"}";
compileAndDeploy(sourceA008, "A008");
String sourceA008_2 =
"public class A008_2 {\n" +
"private int i = 6;\n" +
"public int foo() {\n" +
"\treturn 2;\n"+
"}\n" +
"}";
compileAndDeploy(sourceA008_2, "A008_2");
Assert.assertTrue(!areStructurallyDifferent("A008", "A008_2", true, false));
} finally {
removeTempClass("A008");
}
}
public void test009() {
try {
String sourceA009 =
"public class A009 {\n" +
"private int i = 6;\n" +
"public int foo() {\n" +
"\tclass A {\n" +
"\t\tint get() {\n" +
"\t\t\treturn i;\n" +
"\t\t}\n" +
"\t}\n" +
"\treturn new A().get();\n" +
"}\n" +
"}";
compileAndDeploy(sourceA009, "A009");
String sourceA009_2 =
"public class A009_2 {\n" +
"private int i = 6;\n" +
"public int foo() {\n" +
"\treturn 2;\n"+
"}\n" +
"}";
compileAndDeploy(sourceA009_2, "A009_2");
Assert.assertTrue(areStructurallyDifferent("A009", "A009_2", true, false));
} finally {
removeTempClass("A009");
}
}
public void test010() {
try {
String sourceA010 =
"public class A010 {\n" +
"private int i = 6;\n" +
"public int foo() {\n" +
"\tclass A {\n" +
"\t\tint get() {\n" +
"\t\t\treturn i;\n" +
"\t\t}\n" +
"\t}\n" +
"\treturn new A().get();\n" +
"}\n" +
"}";
compileAndDeploy(sourceA010, "A010");
String sourceA010_2 =
"public class A010_2 {\n" +
"private int i = 6;\n" +
"public int foo() {\n" +
"\treturn 2;\n"+
"}\n" +
"}";
compileAndDeploy(sourceA010_2, "A010_2");
Assert.assertTrue(!areStructurallyDifferent("A010", "A010_2", true, true));
} finally {
removeTempClass("A010");
}
}
public void test011() {
try {
String sourceA011 =
"public class A011 {\n" +
"private int i = 6;\n" +
"public int foo() {\n" +
"\tclass A {\n" +
"\t\tint get() {\n" +
"\t\t\treturn i;\n" +
"\t\t}\n" +
"\t}\n" +
"\treturn new A().get();\n" +
"}\n" +
"}";
compileAndDeploy(sourceA011, "A011");
String sourceA011_2 =
"public class A011_2 {\n" +
"private int i = 6;\n" +
"public int foo() {\n" +
"\treturn 2;\n"+
"}\n" +
"}";
compileAndDeploy(sourceA011_2, "A011_2");
Assert.assertTrue(!areStructurallyDifferent("A011", "A011_2", false, true));
} finally {
removeTempClass("A011");
}
}
public void test012() {
try {
String sourceA012 =
"public class A012 {\n" +
"public Class foo() {\n" +
"\treturn null;\n" +
"}\n" +
"}";
compileAndDeploy(sourceA012, "A012");
String sourceA012_2 =
"public class A012_2 {\n" +
"public Class foo() {\n" +
"\treturn A012_2.class;\n" +
"}\n" +
"}";
compileAndDeploy(sourceA012_2, "A012_2");
Assert.assertTrue(areStructurallyDifferent("A012", "A012_2", false, false));
} finally {
removeTempClass("A012");
}
}
public void test013() {
try {
String sourceA013 =
"public class A013 {\n" +
"public Class foo() {\n" +
"\treturn null;\n" +
"}\n" +
"}";
compileAndDeploy(sourceA013, "A013");
String sourceA013_2 =
"public class A013_2 {\n" +
"public Class foo() {\n" +
"\treturn A013_2.class;\n" +
"}\n" +
"}";
compileAndDeploy(sourceA013_2, "A013_2");
Assert.assertTrue(!areStructurallyDifferent("A013", "A013_2", false, true));
} finally {
removeTempClass("A013");
}
}
public void test014() {
try {
String sourceA014 =
"public class A014 {\n" +
"public Class foo() {\n" +
"\treturn null;\n" +
"}\n" +
"}";
compileAndDeploy(sourceA014, "A014");
String sourceA014_2 =
"public class A014_2 {\n" +
"public Class foo() {\n" +
"\treturn A014_2.class;\n" +
"}\n" +
"}";
compileAndDeploy(sourceA014_2, "A014_2");
Assert.assertTrue(!areStructurallyDifferent("A014", "A014_2", true, true));
} finally {
removeTempClass("A014");
}
}
public void test015() {
try {
String sourceA015 =
"public class A015 {\n" +
" public class B {\n" +
" }\n" +
" public int foo() {\n" +
" return 2;\n" +
" }\n" +
" public String toString() {\n" +
" return \"hello\";\n" +
" }\n" +
"}";
compileAndDeploy(sourceA015, "A015");
Assert.assertTrue(!areStructurallyDifferent("A015$B", "A015$B", false, false));
} finally {
removeTempClass("A015");
}
}
public void test016() {
try {
String sourceA016 =
"public class A016 {\n" +
"public void boo() {\n" +
"}\n" +
"}";
compileAndDeploy(sourceA016, "A016");
String sourceA016_2 =
"public class A016_2 {\n" +
"public void foo() {\n" +
"}\n" +
"}";
compileAndDeploy(sourceA016_2, "A016_2");
Assert.assertTrue(areStructurallyDifferent("A016", "A016_2", false, false));
} finally {
removeTempClass("A016");
}
}
}