From 6c23c093efed511b227ec19b123bc44530e86d1f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 10 Jul 2012 14:02:03 +0400 Subject: [PATCH] Generate proper suite methods - test classes now nest as directories - TestGenerator doesn't hold file extensions - TestClassModel tells whether it is empty --- .../ReadJavaBinaryClassTestGenerator.java | 1 - .../lazy/LazyResolveTestGenerator.java | 2 - .../generator/DelegatingTestClassModel.java | 9 ++ .../test/generator/SimpleTestClassModel.java | 111 +++++++++++------- .../jet/test/generator/TestClassModel.java | 6 + .../jet/test/generator/TestGenerator.java | 109 +++++++++++------ 6 files changed, 157 insertions(+), 81 deletions(-) diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerator.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerator.java index b0027d894fc..55bca1e6913 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerator.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerator.java @@ -32,7 +32,6 @@ public class ReadJavaBinaryClassTestGenerator { String extension = "java"; new TestGenerator( "compiler/tests/", - extension, aPackage, "ReadJavaBinaryClassTestGenerated", aPackage, diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestGenerator.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestGenerator.java index 9a94e87c3dc..224fbf4ada0 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestGenerator.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestGenerator.java @@ -39,7 +39,6 @@ public class LazyResolveTestGenerator { private static void generateRendererTests() throws IOException { new TestGenerator( "compiler/tests/", - TEST_DATA_FILE_EXTENSION, TARGET_PACKAGE, "LazyResolveDescriptorRendererTestGenerated", TARGET_PACKAGE, @@ -61,7 +60,6 @@ public class LazyResolveTestGenerator { private static void generateNamespaceComparingTests() throws IOException { new TestGenerator( "compiler/tests/", - TEST_DATA_FILE_EXTENSION, TARGET_PACKAGE, "LazyResolveNamespaceComparingTestGenerated", TARGET_PACKAGE, diff --git a/compiler/tests/org/jetbrains/jet/test/generator/DelegatingTestClassModel.java b/compiler/tests/org/jetbrains/jet/test/generator/DelegatingTestClassModel.java index 3bdba93b6cb..299865e05cc 100644 --- a/compiler/tests/org/jetbrains/jet/test/generator/DelegatingTestClassModel.java +++ b/compiler/tests/org/jetbrains/jet/test/generator/DelegatingTestClassModel.java @@ -16,6 +16,8 @@ package org.jetbrains.jet.test.generator; +import org.jetbrains.annotations.NotNull; + import java.util.Collection; /** @@ -33,16 +35,23 @@ public class DelegatingTestClassModel implements TestClassModel { return delegate.getName(); } + @NotNull @Override public Collection getInnerTestClasses() { return delegate.getInnerTestClasses(); } + @NotNull @Override public Collection getTestMethods() { return delegate.getTestMethods(); } + @Override + public boolean isEmpty() { + return delegate.isEmpty(); + } + @Override public String getDataString() { return delegate.getDataString(); diff --git a/compiler/tests/org/jetbrains/jet/test/generator/SimpleTestClassModel.java b/compiler/tests/org/jetbrains/jet/test/generator/SimpleTestClassModel.java index df5212e9b78..ec9ca12ccd1 100644 --- a/compiler/tests/org/jetbrains/jet/test/generator/SimpleTestClassModel.java +++ b/compiler/tests/org/jetbrains/jet/test/generator/SimpleTestClassModel.java @@ -36,6 +36,9 @@ public class SimpleTestClassModel implements TestClassModel { private final String doTestMethodName; private final String testClassName; + private Collection innerTestClasses; + private Collection testMethods; + public SimpleTestClassModel(@NotNull File rootFile, boolean recursive, @NotNull String extension, @NotNull String doTestMethodName) { this.rootFile = rootFile; this.recursive = recursive; @@ -44,62 +47,56 @@ public class SimpleTestClassModel implements TestClassModel { this.testClassName = StringUtil.capitalize(TestGeneratorUtil.escapeForJavaIdentifier(rootFile.getName())); } + @NotNull @Override public Collection getInnerTestClasses() { if (!rootFile.isDirectory() || !recursive) { return Collections.emptyList(); } - List children = Lists.newArrayList(); - File[] files = rootFile.listFiles(); - if (files != null) { - for (File file : files) { - if (file.isDirectory()) { - children.add(new SimpleTestClassModel(file, recursive, extension, doTestMethodName)); + if (innerTestClasses == null) { + List children = Lists.newArrayList(); + File[] files = rootFile.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isDirectory()) { + children.add(new SimpleTestClassModel(file, recursive, extension, doTestMethodName)); + } } } + innerTestClasses = children; } - return children; + return innerTestClasses; + } + + @NotNull + @Override + public Collection getTestMethods() { + if (testMethods == null) { + if (!rootFile.isDirectory()) { + testMethods = Collections.singletonList(new SimpleTestMethodModel(rootFile, rootFile, doTestMethodName)); + } + else { + List result = Lists.newArrayList(); + + result.add(new TestAllFilesPresentMethodModel()); + + File[] listFiles = rootFile.listFiles(); + if (listFiles != null) { + for (File file : listFiles) { + if (!file.isDirectory() && file.getName().endsWith("." + extension)) { + result.add(new SimpleTestMethodModel(rootFile, file, doTestMethodName)); + } + } + } + testMethods = result; + } + } + return testMethods; } @Override - public Collection getTestMethods() { - if (!rootFile.isDirectory()) { - return Collections.singletonList(new SimpleTestMethodModel(rootFile, rootFile, doTestMethodName)); - } - List result = Lists.newArrayList(); - - result.add(new TestMethodModel() { - @Override - public String getName() { - return "testAllFilesPresentIn" + testClassName; - } - - @Override - public void generateBody(@NotNull Printer p, @NotNull String generatorClassFqName) { - p.println("JetTestUtils.assertAllTestsPresentByMetadata(" + - "this.getClass(), " + - "\"", generatorClassFqName, "\", " + - "new File(\"", JetTestUtils.getFilePath(rootFile) + "\"), \"", - extension, - "\", ", false, - ");"); - } - - @Override - public String getDataString() { - return null; - } - }); - - File[] listFiles = rootFile.listFiles(); - if (listFiles != null) { - for (File file : listFiles) { - if (!file.isDirectory() && file.getName().endsWith("." + extension)) { - result.add(new SimpleTestMethodModel(rootFile, file, doTestMethodName)); - } - } - } - return result; + public boolean isEmpty() { + return getTestMethods().size() == 1 && getInnerTestClasses().isEmpty(); } @Override @@ -111,4 +108,28 @@ public class SimpleTestClassModel implements TestClassModel { public String getName() { return testClassName; } + + private class TestAllFilesPresentMethodModel implements TestMethodModel { + + @Override + public String getName() { + return "testAllFilesPresentIn" + testClassName; + } + + @Override + public void generateBody(@NotNull Printer p, @NotNull String generatorClassFqName) { + p.println("JetTestUtils.assertAllTestsPresentByMetadata(" + + "this.getClass(), " + + "\"", generatorClassFqName, "\", " + + "new File(\"", JetTestUtils.getFilePath(rootFile) + "\"), \"", + extension, + "\", ", false, + ");"); + } + + @Override + public String getDataString() { + return null; + } + } } diff --git a/compiler/tests/org/jetbrains/jet/test/generator/TestClassModel.java b/compiler/tests/org/jetbrains/jet/test/generator/TestClassModel.java index 92a910f6b0b..77080cae689 100644 --- a/compiler/tests/org/jetbrains/jet/test/generator/TestClassModel.java +++ b/compiler/tests/org/jetbrains/jet/test/generator/TestClassModel.java @@ -16,6 +16,8 @@ package org.jetbrains.jet.test.generator; +import org.jetbrains.annotations.NotNull; + import java.util.Collection; /** @@ -23,7 +25,11 @@ import java.util.Collection; */ public interface TestClassModel extends TestEntityModel { + @NotNull Collection getInnerTestClasses(); + @NotNull Collection getTestMethods(); + + boolean isEmpty(); } diff --git a/compiler/tests/org/jetbrains/jet/test/generator/TestGenerator.java b/compiler/tests/org/jetbrains/jet/test/generator/TestGenerator.java index 57511524306..598b8e6db36 100644 --- a/compiler/tests/org/jetbrains/jet/test/generator/TestGenerator.java +++ b/compiler/tests/org/jetbrains/jet/test/generator/TestGenerator.java @@ -16,15 +16,13 @@ package org.jetbrains.jet.test.generator; +import com.google.common.collect.Lists; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; +import java.util.*; /** * @author abreslav @@ -127,32 +125,29 @@ public class TestGenerator { } private final String baseDir; - private final String testDataFileExtension; private final String suiteClassPackage; private final String suiteClassName; private final String baseTestClassPackage; private final String baseTestClassName; - private final Collection testClassModels; + private final Collection testClassModels; private final String generatorName; private final TargetTestFramework targetTestFramework; public TestGenerator( - @NotNull String baseDir, - @NotNull String testDataFileExtension, - @NotNull String suiteClassPackage, - @NotNull String suiteClassName, - @NotNull String baseTestClassPackage, - @NotNull String baseTestClassName, - @NotNull Collection testClassModels, - @NotNull String generatorName + @NotNull String baseDir, + @NotNull String suiteClassPackage, + @NotNull String suiteClassName, + @NotNull String baseTestClassPackage, + @NotNull String baseTestClassName, + @NotNull Collection testClassModels, + @NotNull String generatorName ) { - this(baseDir, testDataFileExtension, suiteClassPackage, suiteClassName, baseTestClassPackage, baseTestClassName, testClassModels, + this(baseDir, suiteClassPackage, suiteClassName, baseTestClassPackage, baseTestClassName, testClassModels, generatorName, TargetTestFrameworks.JUNIT_4); } public TestGenerator( @NotNull String baseDir, - @NotNull String testDataFileExtension, @NotNull String suiteClassPackage, @NotNull String suiteClassName, @NotNull String baseTestClassPackage, @@ -162,12 +157,11 @@ public class TestGenerator { @NotNull TargetTestFramework targetTestFramework ) { this.baseDir = baseDir; - this.testDataFileExtension = testDataFileExtension; this.suiteClassPackage = suiteClassPackage; this.suiteClassName = suiteClassName; this.baseTestClassPackage = baseTestClassPackage; this.baseTestClassName = baseTestClassName; - this.testClassModels = testClassModels; + this.testClassModels = Lists.newArrayList(testClassModels); this.generatorName = generatorName; this.targetTestFramework = targetTestFramework; } @@ -208,18 +202,34 @@ public class TestGenerator { }, false); } else { - p.println("public class ", suiteClassName, " {"); - p.pushIndent(); + generateTestClass(p, new TestClassModel() { + @NotNull + @Override + public Collection getInnerTestClasses() { + return testClassModels; + } - for (TestClassModel testDataSource : testClassModels) { - generateTestClass(p, testDataSource, true); - p.println(); - } + @NotNull + @Override + public Collection getTestMethods() { + return Collections.emptyList(); + } - targetTestFramework.generateExtraSuiteClassMethods(this, p); + @Override + public boolean isEmpty() { + return false; + } - p.popIndent(); - p.println("}"); + @Override + public String getName() { + return suiteClassName; + } + + @Override + public String getDataString() { + return null; + } + }, false); } String testSourceFilePath = baseDir + "/" + suiteClassPackage.replace(".", "/") + "/" + suiteClassName + ".java"; @@ -228,24 +238,57 @@ public class TestGenerator { System.out.println("Output written to file:\n" + testSourceFile.getAbsolutePath()); } - private void generateTestClass(Printer p, TestClassModel testDataSource, boolean isStatic) { + private void generateTestClass(Printer p, TestClassModel testClassModel, boolean isStatic) { String staticModifier = isStatic ? "static " : ""; - generateMetadata(p, testDataSource); - p.println("public " + staticModifier + "class ", testDataSource.getName(), " extends ", baseTestClassName, " {"); + generateMetadata(p, testClassModel); + p.println("public " + staticModifier + "class ", testClassModel.getName(), " extends ", baseTestClassName, " {"); p.pushIndent(); - Collection testMethods = testDataSource.getTestMethods(); + Collection testMethods = testClassModel.getTestMethods(); for (TestMethodModel testMethodModel : testMethods) { generateTestMethod(p, testMethodModel); p.println(); } - Collection innerTestClasses = testDataSource.getInnerTestClasses(); + Collection innerTestClasses = testClassModel.getInnerTestClasses(); for (TestClassModel innerTestClass : innerTestClasses) { + if (innerTestClass.isEmpty()) { + continue; + } generateTestClass(p, innerTestClass, true); + p.println(); } + if (!innerTestClasses.isEmpty()) { + generateSuiteMethod(p, testClassModel); + } + + p.popIndent(); + p.println("}"); + } + + private static void generateSuiteMethod(Printer p, TestClassModel testClassModel) { + p.println("public static Test suite() {"); + p.pushIndent(); + + p.println("TestSuite suite = new TestSuite(\"", testClassModel.getName(), "\");"); + if (!testClassModel.getTestMethods().isEmpty()) { + p.println("suite.addTestSuite(", testClassModel.getName(), ".class);"); + } + for (TestClassModel innerTestClass : testClassModel.getInnerTestClasses()) { + if (innerTestClass.isEmpty()) { + continue; + } + if (innerTestClass.getInnerTestClasses().isEmpty()) { + p.println("suite.addTestSuite(", innerTestClass.getName(), ".class);"); + } + else { + p.println("suite.addTest(", innerTestClass.getName(), ".suite());"); + } + } + p.println("return suite;"); + p.popIndent(); p.println("}"); } @@ -268,4 +311,4 @@ public class TestGenerator { p.println("@TestMetadata(\"", dataString, "\")"); } } -} +} \ No newline at end of file