diff --git a/docs/internal/testing.md b/docs/internal/testing.md index cd4d89d304..3686b24939 100644 --- a/docs/internal/testing.md +++ b/docs/internal/testing.md @@ -35,6 +35,8 @@ failure. Changes affecting generated code require updating existing "reference" files, even if no new "smoke" tests are created. This ensures "smoke" tests are passing, and also demonstrates the changes to "real" code to the reviewers of the change. +To update smoke tests automatically with new generated files the following command can be run: `DUMP_ACTUAL_DIR=$(pwd)/gluecodium/src/test/resources/smoke ./gradlew test`. + Functional tests ---------------- diff --git a/gluecodium/src/test/java/com/here/gluecodium/SmokeTest.kt b/gluecodium/src/test/java/com/here/gluecodium/SmokeTest.kt index 3b2d61567d..c81c292e45 100644 --- a/gluecodium/src/test/java/com/here/gluecodium/SmokeTest.kt +++ b/gluecodium/src/test/java/com/here/gluecodium/SmokeTest.kt @@ -45,6 +45,7 @@ import java.util.Locale @RunWith(Parameterized::class) class SmokeTest( private val featureDirectory: File, + private val dumpDirectory: File, private val generatorName: String, @Suppress("UNUSED_PARAMETER") featureName: String ) { @@ -90,6 +91,7 @@ class SmokeTest( val inputDirectory = File(featureDirectory, FEATURE_INPUT_FOLDER) val auxDirectory = File(featureDirectory, FEATURE_AUX_FOLDER) val outputDirectory = File(featureDirectory, FEATURE_OUTPUT_FOLDER) + val dumpDirectoryOutput = File(dumpDirectory, FEATURE_OUTPUT_FOLDER) val validationShouldFail = File(inputDirectory, "validationfail.txt").exists() val generatorDirectories = listOf(generatorName) + (ADDITIONAL_GENERATOR_DIRS[generatorName] ?: emptyList()) @@ -122,11 +124,21 @@ class SmokeTest( if (generatedContent != null) { val expected = it.readText() + val expectedWithImportantDifferences = ignoreUnimportantDifferences(expected) + val generatedWithImportantDifferences = ignoreUnimportantDifferences(generatedContent) + errorCollector.checkEquals( "File content differs for file: $relativePath", - ignoreUnimportantDifferences(expected), - ignoreUnimportantDifferences(generatedContent) + expectedWithImportantDifferences, + generatedWithImportantDifferences ) + + if (expectedWithImportantDifferences != generatedWithImportantDifferences) { + val dumpFile = File(dumpDirectoryOutput, relativePath) + if (dumpFile.canonicalFile != it.canonicalFile) { + dumpFile.writeText(generatedContent) + } + } } } } @@ -166,6 +178,9 @@ class SmokeTest( return emptyList() } + val dumpActualDirEnv = System.getenv("DUMP_ACTUAL_DIR") + val dumpActualDir = dumpActualDirEnv?.let { File(dumpActualDirEnv) }?:testResourcesDirectory + val featureDirectoryResources = testResourcesDirectory.listFiles() if (featureDirectoryResources == null) { fail("No test features were found") @@ -177,6 +192,7 @@ class SmokeTest( generatorNames.map { generatorName -> arrayOf( directory, + File(dumpActualDir, directory.name), generatorName, getFeatureName(testResourcesDirectory, directory) )