From 0c0210f8c681e8e2fae190554dfc29744a122a8f Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Tue, 23 Aug 2022 19:17:51 +0300 Subject: [PATCH 01/19] [skip-ci] WIP --- .../save/core/config/SaveOverrides.kt | 34 ++++++++++++++ .../save/core/config/TomlReader.kt | 2 + .../save/core/plugin/PluginConfig.kt | 2 +- .../save/core/config/TomlReader.kt | 45 +++++++++++++++++++ .../save/core/config/TomlReaderTest.kt | 11 +++++ .../resources/save-overrides.toml | 9 ++++ 6 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt create mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt create mode 100644 save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt create mode 100644 save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/config/TomlReaderTest.kt create mode 100644 save-core/src/commonNonJsTest/resources/save-overrides.toml diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt new file mode 100644 index 000000000..1d7e0edca --- /dev/null +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt @@ -0,0 +1,34 @@ +package com.saveourtool.save.core.config + +import kotlinx.serialization.Serializable + +data class SaveOverrides( + val execCmd: String?, + val execFlags: String?, + val batchSize: Int, + val batchSeparator: String, +) { + constructor(nullable: Nullable) : this( + execCmd = nullable.execCmd, + execFlags = nullable.execFlags, + batchSize = nullable.batchSize ?: 1, + batchSeparator = nullable.batchSeparator ?: ", ", + ) + + @Serializable + data class Nullable( + val execCmd: String? = null, + val execFlags: String? = null, + val batchSize: Int? = null, + val batchSeparator: String? = null + ) { + fun merge(override: Nullable): Nullable { + return Nullable( + override.execCmd ?: execCmd, + override.execFlags ?: execFlags, + override.batchSize ?: batchSize, + override.batchSeparator ?: batchSeparator, + ) + } + } +} diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt new file mode 100644 index 000000000..a4f934c4a --- /dev/null +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt @@ -0,0 +1,2 @@ +package com.saveourtool.save.core.config + diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfig.kt index 0fa865712..fc12a5fc6 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfig.kt @@ -17,7 +17,7 @@ import kotlinx.serialization.Transient import kotlinx.serialization.UseSerializers /** - * Core interface for plugin configuration (like warnPlugin/fixPluin/e.t.c) + * Core interface for plugin configuration (like warnPlugin/fixPlugin/e.t.c) */ interface PluginConfig { /** diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt new file mode 100644 index 000000000..748fe41e9 --- /dev/null +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt @@ -0,0 +1,45 @@ +package com.saveourtool.save.core.config + +import com.akuleshov7.ktoml.Toml +import com.saveourtool.save.core.files.fs +import com.saveourtool.save.core.files.readFile +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.properties.Properties +import kotlinx.serialization.properties.decodeFromMap +import kotlinx.serialization.serializer +import okio.Path + +@OptIn(ExperimentalSerializationApi::class) +class TomlReader { + inline fun read(filePath: Path): T { + fs.read(filePath) { + val serializer = Toml.serializersModule.serializer() + serializer.descriptor. + val map: Map = Toml.decodeFromString(this.readUtf8()) + return Properties.decodeFromMap(map as Map) + } + } + + private fun customDeserizer(kSerializer: KSerializer): KSerializer { + return object : KSerializer { + override val descriptor: SerialDescriptor + get() = kSerializer.descriptor + + override fun deserialize(decoder: Decoder): T { + TODO("Not yet implemented") + decoder.beginStructure() + } + + override fun serialize(encoder: Encoder, value: T) { + TODO("Not yet implemented") + } + + } + } +} \ No newline at end of file diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/config/TomlReaderTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/config/TomlReaderTest.kt new file mode 100644 index 000000000..ae1463aff --- /dev/null +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/config/TomlReaderTest.kt @@ -0,0 +1,11 @@ +package com.saveourtool.save.core.config + +import okio.Path.Companion.toPath +import kotlin.test.Test + +class TomlReaderTest { + @Test + fun `general case`() { + val saveOverrides: SaveOverrides = TomlReader().read("src/commonNonJsTest/resources/save-overrides.toml".toPath()) + } +} \ No newline at end of file diff --git a/save-core/src/commonNonJsTest/resources/save-overrides.toml b/save-core/src/commonNonJsTest/resources/save-overrides.toml new file mode 100644 index 000000000..76e3dff90 --- /dev/null +++ b/save-core/src/commonNonJsTest/resources/save-overrides.toml @@ -0,0 +1,9 @@ +execCmd = "sh -c" +execFlags = "--encode" + +[fix] +execCmd = "sh -a && source .env" + +[warn] +execFlags = "--warn" +batchSize = 4 \ No newline at end of file From 59fa340439a3cf10cd48571053ac88239f0521b0 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Wed, 24 Aug 2022 18:32:05 +0300 Subject: [PATCH 02/19] [skip-ci] WIP #2 --- .../save/core/config/EvaluatedToolConfig.kt | 6 +-- .../saveourtool/save/core/config/Interim.kt | 20 ++++++++ .../save/core/config/SaveOverrides.kt | 46 +++++++++++-------- .../save/core/config/TestConfig.kt | 6 +++ .../saveourtool/save/core/plugin/Plugin.kt | 4 +- .../save/core/plugin/PluginConfigOverrides.kt | 14 ++++++ .../kotlin/com/saveourtool/save/core/Save.kt | 35 ++++++++------ .../save/core/config/TomlReader.kt | 45 ------------------ .../save/core/files/ConfigDetector.kt | 13 ++++-- .../saveourtool/save/core/utils/TomlUtils.kt | 38 +++++++++++++++ .../save/core/config/TomlReaderTest.kt | 11 ----- .../save/core/utils/TomlUtilsTest.kt | 40 ++++++++++++++++ .../fixandwarn/FixAndWarnPluginTest.kt | 2 +- .../saveourtool/save/plugins/fix/FixPlugin.kt | 13 ++++-- .../plugins/fix/FixPluginConfigOverrides.kt | 27 +++++++++++ .../save/plugins/fix/FixPluginTest.kt | 4 +- .../save/plugin/warn/WarnPlugin.kt | 7 +-- .../save/plugin/warn/WarnPluginTest.kt | 2 +- 18 files changed, 220 insertions(+), 113 deletions(-) create mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/Interim.kt create mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfigOverrides.kt delete mode 100644 save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt delete mode 100644 save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/config/TomlReaderTest.kt create mode 100644 save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/utils/TomlUtilsTest.kt create mode 100644 save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPluginConfigOverrides.kt diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/EvaluatedToolConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/EvaluatedToolConfig.kt index 9f4d56ffa..00f4abf4a 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/EvaluatedToolConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/EvaluatedToolConfig.kt @@ -1,16 +1,12 @@ package com.saveourtool.save.core.config /** - * Configuration for an evaluated tool, that is read from test suite configuration file (toml config) or cli + * Configuration for an evaluated tool, that is read from cli * - * @property execCmd - * @property execFlags * @property batchSize it controls how many files execCmd will process at a time * @property batchSeparator A separator to join test files to string if the tested tool supports processing of file batches (`batch-size` > 1) */ data class EvaluatedToolConfig( - val execCmd: String?, - val execFlags: String?, val batchSize: Int, val batchSeparator: String, ) diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/Interim.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/Interim.kt new file mode 100644 index 000000000..a744710ce --- /dev/null +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/Interim.kt @@ -0,0 +1,20 @@ +package com.saveourtool.save.core.config + +/** + * An interface for interim result during reading from TOML file + * + * @param I class represents interim result + * @param R class represents result + */ +interface Interim> { + /** + * @param overrides + * @return result with values are overridden by values from [overrides] + */ + fun merge(overrides: I) : I + + /** + * @return result with values from interim object + */ + fun build(): R +} \ No newline at end of file diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt index 1d7e0edca..ffd732ebe 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt @@ -2,33 +2,43 @@ package com.saveourtool.save.core.config import kotlinx.serialization.Serializable +/** + * @property execCmd + * @property execFlags + * @property batchSize + * @property batchSeparator + */ data class SaveOverrides( val execCmd: String?, val execFlags: String?, val batchSize: Int, val batchSeparator: String, ) { - constructor(nullable: Nullable) : this( - execCmd = nullable.execCmd, - execFlags = nullable.execFlags, - batchSize = nullable.batchSize ?: 1, - batchSeparator = nullable.batchSeparator ?: ", ", - ) - + /** + * @property execCmd + * @property execFlags + * @property batchSize + * @property batchSeparator + */ @Serializable - data class Nullable( + data class SaveOverridesInterim ( val execCmd: String? = null, val execFlags: String? = null, - val batchSize: Int? = null, + val batchSize: Long? = null, val batchSeparator: String? = null - ) { - fun merge(override: Nullable): Nullable { - return Nullable( - override.execCmd ?: execCmd, - override.execFlags ?: execFlags, - override.batchSize ?: batchSize, - override.batchSeparator ?: batchSeparator, - ) - } + ) : Interim { + override fun merge(overrides: SaveOverridesInterim) = SaveOverridesInterim( + overrides.execCmd ?: execCmd, + overrides.execFlags ?: execFlags, + overrides.batchSize ?: batchSize, + overrides.batchSeparator ?: batchSeparator, + ) + + override fun build() = SaveOverrides( + execCmd = execCmd, + execFlags = execFlags, + batchSize = batchSize?.toInt() ?: 1, + batchSeparator = batchSeparator ?: ", ", + ) } } diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index a0dc39538..a11af6b41 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -15,6 +15,7 @@ import okio.FileSystem import okio.Path import okio.Path.Companion.toPath import kotlin.js.JsName +import kotlin.reflect.cast /** * Configuration for a test suite, that is read from test suite configuration file (toml config) @@ -235,3 +236,8 @@ fun Path.isSaveTomlConfig() = name == "save.toml" * @return a file (save.toml) in current directory */ fun Path.resolveSaveTomlConfig() = this / "save.toml" + +/** + * @return a file (save-overrides.toml) in current directory + */ +fun Path.resolveSaveOverridesTomlConfig() = this / "save-overrides.toml" diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt index 233945dfe..e7f61c7fd 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt @@ -1,8 +1,6 @@ package com.saveourtool.save.core.plugin -import com.saveourtool.save.core.config.EvaluatedToolConfig -import com.saveourtool.save.core.config.TestConfig -import com.saveourtool.save.core.config.isSaveTomlConfig +import com.saveourtool.save.core.config.* import com.saveourtool.save.core.files.createRelativePathToTheRoot import com.saveourtool.save.core.files.findDescendantDirectoriesBy import com.saveourtool.save.core.files.parentsWithSelf diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfigOverrides.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfigOverrides.kt new file mode 100644 index 000000000..78f1cd54e --- /dev/null +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfigOverrides.kt @@ -0,0 +1,14 @@ +package com.saveourtool.save.core.plugin + +import com.saveourtool.save.core.config.TestConfigSections +import okio.Path + +interface PluginConfigOverrides { + val type: TestConfigSections + val execCmd: String? + val execFlags: String? + + interface Factory { + fun read(path: Path): T + } +} diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt index f59ce8ea6..770783d59 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt @@ -1,13 +1,7 @@ package com.saveourtool.save.core -import com.saveourtool.save.core.config.EvaluatedToolConfig -import com.saveourtool.save.core.config.OutputStreamType -import com.saveourtool.save.core.config.ReportType +import com.saveourtool.save.core.config.* import com.saveourtool.save.core.config.SAVE_VERSION -import com.saveourtool.save.core.config.SaveProperties -import com.saveourtool.save.core.config.TestConfig -import com.saveourtool.save.core.config.isSaveTomlConfig -import com.saveourtool.save.core.config.resolveSaveTomlConfig import com.saveourtool.save.core.files.ConfigDetector import com.saveourtool.save.core.files.StdStreamsSink import com.saveourtool.save.core.logging.logDebug @@ -26,6 +20,7 @@ import com.saveourtool.save.core.result.Pass import com.saveourtool.save.core.result.TestResult import com.saveourtool.save.core.utils.buildActivePlugins import com.saveourtool.save.core.utils.processInPlace +import com.saveourtool.save.core.utils.readFromFile import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPlugin import com.saveourtool.save.plugins.fix.FixPluginConfig @@ -75,14 +70,28 @@ class Save( // create config for evaluated tool from cli args val evaluatedToolConfig = EvaluatedToolConfig( - execCmd = saveProperties.overrideExecCmd, - execFlags = saveProperties.overrideExecFlags, batchSize = saveProperties.batchSize, batchSeparator = saveProperties.batchSeparator, ) + // create config for evaluated tool from cli args + val saveOverridesPath = testRootPath.resolveSaveOverridesTomlConfig() + val pluginConfigOverrides = if (fs.exists(saveOverridesPath)) { + TestConfigSections.values() + .filterNot(TestConfigSections.GENERAL::equals) + .associateWith { + readFromFile( + saveOverridesPath, + it.name.lowercase(), + "" + ) + } + } else { + emptyMap() + } + // get all toml configs in file system - val testConfigs = ConfigDetector(fs) + val testConfigs = ConfigDetector(fs, evaluatedToolConfig, pluginConfigOverrides) .configFromFile(rootTestConfigPath) .getAllTestConfigsForFiles(requestedConfigs) var atLeastOneExecutionProvided = false @@ -106,7 +115,7 @@ class Save( ?.forEach { atLeastOneExecutionProvided = true // execute created plugins - executePlugin(evaluatedToolConfig, it, reporter) + executePlugin(saveOverrides, it, reporter) } ?.also { reporter.onSuiteEnd(testConfig.getGeneralConfig()?.suiteName!!) @@ -156,7 +165,7 @@ class Save( } private fun executePlugin( - evaluatedToolConfig: EvaluatedToolConfig, + saveOverrides: Map, plugin: Plugin, reporter: Reporter ) { @@ -164,7 +173,7 @@ class Save( logDebug("=> Executing plugin: ${plugin::class.simpleName} for [${plugin.testConfig.location}]") reporter.onPluginExecutionStart(plugin) try { - plugin.execute(evaluatedToolConfig) + plugin.execute(saveOverrides) .onEach { event -> // calculate relative paths, because reporters don't need paths higher than root dir val resourcesRelative = event.resources.withRelativePaths(testRootPath) diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt deleted file mode 100644 index 748fe41e9..000000000 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.saveourtool.save.core.config - -import com.akuleshov7.ktoml.Toml -import com.saveourtool.save.core.files.fs -import com.saveourtool.save.core.files.readFile -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.KSerializer -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.properties.Properties -import kotlinx.serialization.properties.decodeFromMap -import kotlinx.serialization.serializer -import okio.Path - -@OptIn(ExperimentalSerializationApi::class) -class TomlReader { - inline fun read(filePath: Path): T { - fs.read(filePath) { - val serializer = Toml.serializersModule.serializer() - serializer.descriptor. - val map: Map = Toml.decodeFromString(this.readUtf8()) - return Properties.decodeFromMap(map as Map) - } - } - - private fun customDeserizer(kSerializer: KSerializer): KSerializer { - return object : KSerializer { - override val descriptor: SerialDescriptor - get() = kSerializer.descriptor - - override fun deserialize(decoder: Decoder): T { - TODO("Not yet implemented") - decoder.beginStructure() - } - - override fun serialize(encoder: Encoder, value: T) { - TODO("Not yet implemented") - } - - } - } -} \ No newline at end of file diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt index bb3d119c0..f0de37ab2 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt @@ -1,10 +1,11 @@ package com.saveourtool.save.core.files -import com.saveourtool.save.core.config.TestConfig -import com.saveourtool.save.core.config.isSaveTomlConfig +import com.saveourtool.save.core.config.* import com.saveourtool.save.core.logging.logDebug import com.saveourtool.save.core.logging.logError import com.saveourtool.save.core.logging.logTrace +import com.saveourtool.save.core.plugin.PluginConfigOverrides +import com.saveourtool.save.plugins.fix.FixPluginConfigOverrides import okio.FileSystem import okio.Path @@ -12,9 +13,13 @@ import okio.Path /** * A class that is capable of discovering config files hierarchy. */ -class ConfigDetector(private val fs: FileSystem) { +class ConfigDetector( + private val fs: FileSystem, + private val evaluatedToolConfig: EvaluatedToolConfig, + private val pluginConfigOverrides: Map, +) { /** - * Try to create SAVE config file from [file]. + * Try to create SAVE config file from [testConfig]. * * @param testConfig - testing configuration (save.toml) from which SAVE config file should be built * @return [TestConfig] or null if no suitable config file has been found. diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt index c3b5c43b4..f08bcc353 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt @@ -19,11 +19,15 @@ import com.akuleshov7.ktoml.exceptions.TomlDecodingException import com.akuleshov7.ktoml.file.TomlFileReader import com.akuleshov7.ktoml.parsers.TomlParser import com.akuleshov7.ktoml.tree.TomlTable +import com.saveourtool.save.core.config.Interim +import com.saveourtool.save.core.files.fs +import com.saveourtool.save.core.plugin.PluginConfigOverrides import okio.FileSystem import okio.Path import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.serializer +import okio.Path.Companion.toPath private fun Path.testConfigFactory(table: TomlTable) = when (table.fullTableName.uppercase().replace("\"", "")) { @@ -80,6 +84,10 @@ fun createPluginConfigListFromToml(testConfigPath: Path, fs: FileSystem): List

() +} + /** * @param testConfigPath path to the test config * @param fs FileSystem for file reading @@ -90,3 +98,33 @@ fun getTopLevelTomlTables(testConfigPath: Path, fs: FileSystem): List .children .filterIsInstance() .filter { !it.isSynthetic } + +/** + * @param filePath path to the TOML file + * @param specificTableName table name to deserialize [T] + * @param generalTableName table name for default values of [T] + * @param I interim type of [T] + */ +inline fun > readFromFile( + filePath: Path, + specificTableName: String, + generalTableName: String +): T { + val serializer = serializer() + val tomlInputConfigGeneralConfig = TomlInputConfig(ignoreUnknownNames = true) + return fs.read(filePath) { + val content = generateSequence { this.readUtf8Line() }.toList() + val generic: I = if (generalTableName.isNotEmpty()) { + TomlFileReader.partiallyDecodeFromString( + serializer, + content, + generalTableName, + tomlInputConfigGeneralConfig + ) + } else { + TomlFileReader.decodeFromString(serializer, content, tomlInputConfigGeneralConfig) + } + val specific: I = TomlFileReader.partiallyDecodeFromString(serializer, content, specificTableName, TomlInputConfig()) + generic.merge(specific).build() + } +} \ No newline at end of file diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/config/TomlReaderTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/config/TomlReaderTest.kt deleted file mode 100644 index ae1463aff..000000000 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/config/TomlReaderTest.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.saveourtool.save.core.config - -import okio.Path.Companion.toPath -import kotlin.test.Test - -class TomlReaderTest { - @Test - fun `general case`() { - val saveOverrides: SaveOverrides = TomlReader().read("src/commonNonJsTest/resources/save-overrides.toml".toPath()) - } -} \ No newline at end of file diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/utils/TomlUtilsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/utils/TomlUtilsTest.kt new file mode 100644 index 000000000..5ac1bea6c --- /dev/null +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/utils/TomlUtilsTest.kt @@ -0,0 +1,40 @@ +package com.saveourtool.save.core.utils + +import com.saveourtool.save.core.config.SaveOverrides +import okio.Path.Companion.toPath +import kotlin.test.Test +import kotlin.test.assertEquals + +class TomlUtilsTest { + @Test + fun `read save overrides`() { + val testPath = "src/commonNonJsTest/resources/save-overrides.toml".toPath() + val fix = readFromFile( + testPath, + "fix", + "" + ) + assertEquals("sh -a && source .env", fix.execCmd) + assertEquals("--encode", fix.execFlags) + assertEquals(1, fix.batchSize) + assertEquals(", ", fix.batchSeparator) + val warn = readFromFile( + testPath, + "warn", + "" + ) + assertEquals("sh -c", warn.execCmd) + assertEquals("--warn", warn.execFlags) + assertEquals(4, warn.batchSize) + assertEquals(", ", warn.batchSeparator) + val fixAndWarn = readFromFile( + testPath, + "fix and warn", + "" + ) + assertEquals(null, fixAndWarn.execCmd) + assertEquals(null, fixAndWarn.execFlags) + assertEquals(1, fixAndWarn.batchSize) + assertEquals(", ", fixAndWarn.batchSeparator) + } +} \ No newline at end of file diff --git a/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt b/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt index 426b1055c..8924b0fbc 100644 --- a/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt +++ b/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt @@ -90,7 +90,7 @@ class FixAndWarnPluginTest { fs, useInternalRedirections = false ) - val results = fixAndWarnPlugin.execute(EvaluatedToolConfig(null, null, 1, ", ")).toList() + val results = fixAndWarnPlugin.execute(EvaluatedToolConfig(1, ", ")).toList() println("Results $results") assertEquals(1, results.count(), "Size of results should equal number of pairs") diff --git a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt index 87cd36b86..57517b90e 100644 --- a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt +++ b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt @@ -1,7 +1,9 @@ package com.saveourtool.save.plugins.fix import com.saveourtool.save.core.config.EvaluatedToolConfig +import com.saveourtool.save.core.config.SaveOverrides import com.saveourtool.save.core.config.TestConfig +import com.saveourtool.save.core.config.TestConfigSections import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.createRelativePathToTheRoot import com.saveourtool.save.core.files.myDeleteRecursively @@ -74,14 +76,15 @@ class FixPlugin( val generalConfig = testConfig.pluginConfigs.filterIsInstance().single() extraFlagsExtractor = ExtraFlagsExtractor(generalConfig, fs) + val overrides = requireNotNull(saveOverrides[TestConfigSections.FIX]) return files.map { it as FixTestFiles } - .chunked(evaluatedToolConfig.batchSize) + .chunked(overrides.batchSize) .map { chunk -> val copyPaths = chunk.map { it.test } val extraFlagsList = copyPaths.mapNotNull { path -> extraFlagsExtractor.extractExtraFlagsFrom(path) }.distinct() require(extraFlagsList.size <= 1) { - "Extra flags for all files in a batch should be same, but you have batchSize=${evaluatedToolConfig.batchSize}" + + "Extra flags for all files in a batch should be same, but you have batchSize=${overrides.batchSize}" + " and there are ${extraFlagsList.size} different sets of flags inside it, namely $extraFlagsList" } val extraFlags = extraFlagsList.singleOrNull() ?: ExtraFlags("", "") @@ -91,11 +94,11 @@ class FixPlugin( createTestFile(test, generalConfig, fixPluginConfig) to expected } val testCopyNames = - pathCopyMap.joinToString(separator = evaluatedToolConfig.batchSeparator) { (testCopy, _) -> testCopy.toString() } + pathCopyMap.joinToString(separator = overrides.batchSeparator) { (testCopy, _) -> testCopy.toString() } - val execFlags = evaluatedToolConfig.execFlags ?: fixPluginConfig.execFlags + val execFlags = overrides.execFlags ?: fixPluginConfig.execFlags val execFlagsAdjusted = resolvePlaceholdersFrom(execFlags, extraFlags, testCopyNames) - val execCmdWithoutFlags = evaluatedToolConfig.execCmd ?: generalConfig.execCmd + val execCmdWithoutFlags = overrides.execCmd ?: generalConfig.execCmd val execCmd = "$execCmdWithoutFlags $execFlagsAdjusted" val time = generalConfig.timeOutMillis!!.times(pathMap.size) diff --git a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPluginConfigOverrides.kt b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPluginConfigOverrides.kt new file mode 100644 index 000000000..830abdaec --- /dev/null +++ b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPluginConfigOverrides.kt @@ -0,0 +1,27 @@ +package com.saveourtool.save.plugins.fix + +import com.saveourtool.save.core.config.TestConfigSections +import com.saveourtool.save.core.plugin.PluginConfigOverrides + +data class FixPluginConfigOverrides( + override val execCmd: String?, + override val execFlags: String?, +) : PluginConfigOverrides { + override val type: TestConfigSections + get() = TestConfigSections.FIX + + data class Interim( + val execCmd: String?, + val execFlags: String?, + ) : com.saveourtool.save.core.config.Interim { + override fun merge(overrides: Interim) = Interim( + overrides.execCmd ?: execCmd, + overrides.execFlags ?: execFlags, + ) + + override fun build() = FixPluginConfigOverrides( + execCmd, + execFlags + ) + } +} \ No newline at end of file diff --git a/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt b/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt index a8df0e3f3..9f0e3542d 100644 --- a/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt +++ b/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt @@ -87,7 +87,7 @@ class FixPluginTest { fs, useInternalRedirections = false ) - val results = fixPlugin.execute(EvaluatedToolConfig(null, null, 1, ", ")).toList() + val results = fixPlugin.execute(EvaluatedToolConfig(1, ", ")).toList() assertEquals(1, results.size, "Size of results should equal number of pairs") val testResult = results.single() @@ -149,7 +149,7 @@ class FixPluginTest { useInternalRedirections = false ) val batchSeparator = if (isCurrentOsWindows()) ", " else " " - val results = fixPlugin.execute(EvaluatedToolConfig(null, null, 2, batchSeparator)).toList() + val results = fixPlugin.execute(EvaluatedToolConfig(2, batchSeparator)).toList() // We call ProcessBuilder ourselves, because the command ">" does not work for the list of files ProcessBuilder(false, fs).exec("echo Expected file > $testFile2", "", null, 10_000L) diff --git a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt index 8d3494b87..51f4fa3a9 100644 --- a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt +++ b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt @@ -1,9 +1,6 @@ package com.saveourtool.save.plugin.warn -import com.saveourtool.save.core.config.ActualWarningsFormat -import com.saveourtool.save.core.config.EvaluatedToolConfig -import com.saveourtool.save.core.config.ExpectedWarningsFormat -import com.saveourtool.save.core.config.TestConfig +import com.saveourtool.save.core.config.* import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.getWorkingDirectory import com.saveourtool.save.core.files.readLines @@ -62,7 +59,7 @@ class WarnPlugin( private lateinit var extraFlagsExtractor: ExtraFlagsExtractor private lateinit var tmpDirName: String - override fun handleFiles(evaluatedToolConfig: EvaluatedToolConfig, files: Sequence): Sequence { + override fun handleFiles(evaluatedToolConfig: EvaluatedToolConfig, saveOverrides: Map, files: Sequence): Sequence { testConfig.validateAndSetDefaults() val warnPluginConfig = testConfig.pluginConfigs.filterIsInstance().single() val generalConfig = testConfig.pluginConfigs.filterIsInstance().single() diff --git a/save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt b/save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt index b922994b6..669830cdd 100644 --- a/save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt +++ b/save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt @@ -428,7 +428,7 @@ class WarnPluginTest { testFiles = emptyList(), fs ) - .execute(EvaluatedToolConfig(null, null, batchSize, ", ")) + .execute(EvaluatedToolConfig(batchSize, ", ")) .toList() assertion(results) } From 2b26c3a8e25c7ce8473665a50848e3a183d3839a Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 11:52:06 +0300 Subject: [PATCH 03/19] [skip-ci] WIP #3 --- .../com/saveourtool/save/plugin/MockPlugin.kt | 9 +++- .../save/core/config/SaveOverrides.kt | 44 ------------------- .../save/core/config/TestConfig.kt | 29 +++++++++--- .../saveourtool/save/core/plugin/Plugin.kt | 8 ++-- .../kotlin/com/saveourtool/save/core/Save.kt | 18 +++----- .../save/core/files/ConfigDetector.kt | 9 ++-- .../saveourtool/save/core/utils/TomlUtils.kt | 4 -- .../saveourtool/save/core/MergeConfigsTest.kt | 30 +++++++------ .../save/core/utils/TomlUtilsTest.kt | 40 ----------------- .../plugins/fixandwarn/FixAndWarnPlugin.kt | 9 ++-- .../saveourtool/save/plugins/fix/FixPlugin.kt | 17 +++---- .../save/plugin/warn/WarnPlugin.kt | 15 +++---- 12 files changed, 79 insertions(+), 153 deletions(-) delete mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt delete mode 100644 save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/utils/TomlUtilsTest.kt diff --git a/save-common-test/src/commonNonJsMain/kotlin/com/saveourtool/save/plugin/MockPlugin.kt b/save-common-test/src/commonNonJsMain/kotlin/com/saveourtool/save/plugin/MockPlugin.kt index 7c1ac709e..fe6263da3 100644 --- a/save-common-test/src/commonNonJsMain/kotlin/com/saveourtool/save/plugin/MockPlugin.kt +++ b/save-common-test/src/commonNonJsMain/kotlin/com/saveourtool/save/plugin/MockPlugin.kt @@ -15,13 +15,18 @@ internal expect val fs: FileSystem * No-op implementation of [Plugin] that can be used to test reporters, which expect only a class name of the plugin. */ class MockPlugin(baseDir: Path, testFiles: List = emptyList()) : Plugin( - TestConfig((baseDir / "save.toml").also { fs.createFile(it) }, null, fs = fs), + TestConfig( + (baseDir / "save.toml").also { fs.createFile(it) }, + null, + EvaluatedToolConfig(1, ""), + overridesPluginConfigs = emptyList(), + fs = fs), testFiles, fs, useInternalRedirections = true, redirectTo = null ) { - override fun handleFiles(evaluatedToolConfig: EvaluatedToolConfig, files: Sequence): Sequence = emptySequence() + override fun handleFiles(files: Sequence): Sequence = emptySequence() override fun rawDiscoverTestFiles(resourceDirectories: Sequence): Sequence = emptySequence() diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt deleted file mode 100644 index ffd732ebe..000000000 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/SaveOverrides.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.saveourtool.save.core.config - -import kotlinx.serialization.Serializable - -/** - * @property execCmd - * @property execFlags - * @property batchSize - * @property batchSeparator - */ -data class SaveOverrides( - val execCmd: String?, - val execFlags: String?, - val batchSize: Int, - val batchSeparator: String, -) { - /** - * @property execCmd - * @property execFlags - * @property batchSize - * @property batchSeparator - */ - @Serializable - data class SaveOverridesInterim ( - val execCmd: String? = null, - val execFlags: String? = null, - val batchSize: Long? = null, - val batchSeparator: String? = null - ) : Interim { - override fun merge(overrides: SaveOverridesInterim) = SaveOverridesInterim( - overrides.execCmd ?: execCmd, - overrides.execFlags ?: execFlags, - overrides.batchSize ?: batchSize, - overrides.batchSeparator ?: batchSeparator, - ) - - override fun build() = SaveOverrides( - execCmd = execCmd, - execFlags = execFlags, - batchSize = batchSize?.toInt() ?: 1, - batchSeparator = batchSeparator ?: ", ", - ) - } -} diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index a11af6b41..f217da9af 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -15,20 +15,23 @@ import okio.FileSystem import okio.Path import okio.Path.Companion.toPath import kotlin.js.JsName -import kotlin.reflect.cast /** * Configuration for a test suite, that is read from test suite configuration file (toml config) * @property location [Path] denoting the location of this file * @property parentConfig parent config in the hierarchy of configs, `null` if this config is root. + * @property evaluatedToolConfig a configuration for evaluated tool * @property pluginConfigs list of configurations for plugins that are active in this config + * @property overridesPluginConfigs list of configurations for plugins that overrides [pluginConfigs] * @property fs filesystem which can access test configs */ @Suppress("TYPE_ALIAS", "TooManyFunctions") data class TestConfig( val location: Path, val parentConfig: TestConfig?, + val evaluatedToolConfig: EvaluatedToolConfig, val pluginConfigs: MutableList = mutableListOf(), + val overridesPluginConfigs: List, val fs: FileSystem, ) { /** @@ -128,10 +131,11 @@ data class TestConfig( // discover plugins from the test configuration createPluginConfigList(this).forEach { logTrace("Discovered new pluginConfig: $it") - this.pluginConfigs.merge(it) + this.pluginConfigs.mergeOrOverride(it) } // merge configurations with parents this.mergeConfigWithParent() + overrideConfig() return this } @@ -177,12 +181,19 @@ data class TestConfig( // return from the function if we stay at the root element of the plugin tree val parentalPlugins = parentConfig.pluginConfigs parentalPlugins.forEach { parentalPluginConfig -> - this.pluginConfigs.merge(parentalPluginConfig) + this.pluginConfigs.mergeOrOverride(parentalPluginConfig) } } return this } + private fun overrideConfig() { + logDebug("Overriding configs for $location") + overridesPluginConfigs.forEach { overridesPluginConfig -> + pluginConfigs.mergeOrOverride(overridesPluginConfig, false) + } + } + /** * Method, which validates all plugin configs and set default values, if possible */ @@ -194,7 +205,7 @@ data class TestConfig( "(${pluginConfigs.map { it.type }.filterNot { it == TestConfigSections.GENERAL }})") } - private fun MutableList.merge(parentalPluginConfig: PluginConfig) { + private fun MutableList.mergeOrOverride(parentalPluginConfig: PluginConfig, merge: Boolean = true) { val childConfigs = this.filter { it.type == parentalPluginConfig.type } if (childConfigs.isEmpty()) { // if we haven't found a plugin from parent in a current list of plugins - we will simply copy it @@ -206,8 +217,14 @@ data class TestConfig( val childConfig = childConfigs.single() // else, we will merge plugin with a corresponding plugin from a parent config // we expect that there is only one plugin of such type, otherwise we will throw an exception - logTrace("Merging process of ${parentalPluginConfig.type} from $parentalPluginConfig into $childConfig") - this[this.indexOf(childConfig)] = childConfig.mergeWith(parentalPluginConfig) + + this[this.indexOf(childConfig)] = if (merge) { + logTrace("Merging process of ${parentalPluginConfig.type} from $parentalPluginConfig into $childConfig") + childConfig.mergeWith(parentalPluginConfig) + } else { + logTrace("Overriding process of ${parentalPluginConfig.type} from $parentalPluginConfig into $childConfig") + parentalPluginConfig.mergeWith(childConfig) + } } } } diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt index e7f61c7fd..149734523 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt @@ -42,10 +42,9 @@ abstract class Plugin( /** * Perform plugin's work. * - * @param evaluatedToolConfig a configuration for evaluated tool * @return a sequence of [TestResult]s for each group of test resources */ - fun execute(evaluatedToolConfig: EvaluatedToolConfig): Sequence { + fun execute(): Sequence { clean() val testFilesList = discoverTestFiles(testConfig.directory).toList() @@ -69,7 +68,7 @@ abstract class Plugin( val excludedTestResults = excludedTestFiles.map { TestResult(it, Ignored("Excluded by configuration")) } - handleFiles(evaluatedToolConfig, actualTestFiles.asSequence()) + excludedTestResults + handleFiles(actualTestFiles.asSequence()) + excludedTestResults } else { emptySequence() } @@ -78,11 +77,10 @@ abstract class Plugin( /** * Perform plugin's work on a set of files. * - * @param evaluatedToolConfig a configuration for evaluated tool * @param files a sequence of file groups, corresponding to tests. * @return a sequence of [TestResult]s for each group of test resources */ - abstract fun handleFiles(evaluatedToolConfig: EvaluatedToolConfig, files: Sequence): Sequence + abstract fun handleFiles(files: Sequence): Sequence /** * Discover groups of resource files which will be used to run tests, applying additional filtering diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt index 770783d59..69c6a2737 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt @@ -19,6 +19,7 @@ import com.saveourtool.save.core.result.Ignored import com.saveourtool.save.core.result.Pass import com.saveourtool.save.core.result.TestResult import com.saveourtool.save.core.utils.buildActivePlugins +import com.saveourtool.save.core.utils.createPluginConfigListFromToml import com.saveourtool.save.core.utils.processInPlace import com.saveourtool.save.core.utils.readFromFile import com.saveourtool.save.plugin.warn.WarnPluginConfig @@ -77,17 +78,9 @@ class Save( // create config for evaluated tool from cli args val saveOverridesPath = testRootPath.resolveSaveOverridesTomlConfig() val pluginConfigOverrides = if (fs.exists(saveOverridesPath)) { - TestConfigSections.values() - .filterNot(TestConfigSections.GENERAL::equals) - .associateWith { - readFromFile( - saveOverridesPath, - it.name.lowercase(), - "" - ) - } + createPluginConfigListFromToml(saveOverridesPath, fs) } else { - emptyMap() + emptyList() } // get all toml configs in file system @@ -115,7 +108,7 @@ class Save( ?.forEach { atLeastOneExecutionProvided = true // execute created plugins - executePlugin(saveOverrides, it, reporter) + executePlugin(it, reporter) } ?.also { reporter.onSuiteEnd(testConfig.getGeneralConfig()?.suiteName!!) @@ -165,7 +158,6 @@ class Save( } private fun executePlugin( - saveOverrides: Map, plugin: Plugin, reporter: Reporter ) { @@ -173,7 +165,7 @@ class Save( logDebug("=> Executing plugin: ${plugin::class.simpleName} for [${plugin.testConfig.location}]") reporter.onPluginExecutionStart(plugin) try { - plugin.execute(saveOverrides) + plugin.execute() .onEach { event -> // calculate relative paths, because reporters don't need paths higher than root dir val resourcesRelative = event.resources.withRelativePaths(testRootPath) diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt index f0de37ab2..bcde75c7f 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt @@ -4,8 +4,7 @@ import com.saveourtool.save.core.config.* import com.saveourtool.save.core.logging.logDebug import com.saveourtool.save.core.logging.logError import com.saveourtool.save.core.logging.logTrace -import com.saveourtool.save.core.plugin.PluginConfigOverrides -import com.saveourtool.save.plugins.fix.FixPluginConfigOverrides +import com.saveourtool.save.core.plugin.PluginConfig import okio.FileSystem import okio.Path @@ -16,7 +15,7 @@ import okio.Path class ConfigDetector( private val fs: FileSystem, private val evaluatedToolConfig: EvaluatedToolConfig, - private val pluginConfigOverrides: Map, + private val pluginConfigsOverrides: List, ) { /** * Try to create SAVE config file from [testConfig]. @@ -66,6 +65,8 @@ class ConfigDetector( TestConfig( path, parentConfig, + evaluatedToolConfig, + overridesPluginConfigs = pluginConfigsOverrides, fs = fs, ) ) @@ -116,6 +117,8 @@ class ConfigDetector( return TestConfig( file, parentConfig, + evaluatedToolConfig, + overridesPluginConfigs = pluginConfigsOverrides, fs = fs, ) } diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt index f08bcc353..ffe13114a 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt @@ -84,10 +84,6 @@ fun createPluginConfigListFromToml(testConfigPath: Path, fs: FileSystem): List

() -} - /** * @param testConfigPath path to the test config * @param fs FileSystem for file reading diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt index 4831bc0d5..8c7974f06 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt @@ -1,5 +1,6 @@ package com.saveourtool.save.core +import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.myDeleteRecursively @@ -53,12 +54,13 @@ class MergeConfigsTest { private val fixConfig2 = FixPluginConfig("fixCmd2") private val fixConfig3 = FixPluginConfig("fixCmd3", null) private val fixConfig4 = FixPluginConfig("fixCmd4") + private val evaluatedToolConfig = EvaluatedToolConfig(1, "") @Test fun `merge general configs`() { createTomlFiles() - val config1 = TestConfig(toml1, null, mutableListOf(generalConfig1), fs) - val config2 = TestConfig(toml2, config1, mutableListOf(generalConfig2), fs) + val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig1), emptyList(), fs) + val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2), emptyList(), fs) config2.mergeConfigWithParent() @@ -75,8 +77,8 @@ class MergeConfigsTest { @Test fun `merge two incomplete configs`() { createTomlFiles() - val config1 = TestConfig(toml1, null, mutableListOf(generalConfig1, warnConfig1), fs) - val config2 = TestConfig(toml2, config1, mutableListOf(generalConfig2), fs) + val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig1, warnConfig1), emptyList(), fs) + val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2), emptyList(), fs) config2.mergeConfigWithParent() @@ -95,8 +97,8 @@ class MergeConfigsTest { @Test fun `merge two incomplete configs 2`() { createTomlFiles() - val config1 = TestConfig(toml1, null, mutableListOf(), fs) - val config2 = TestConfig(toml2, config1, mutableListOf(generalConfig2, warnConfig1), fs) + val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(), emptyList(), fs) + val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2, warnConfig1), emptyList(), fs) config2.mergeConfigWithParent() @@ -112,8 +114,8 @@ class MergeConfigsTest { @Test fun `merge two configs with different fields`() { createTomlFiles() - val config1 = TestConfig(toml1, null, mutableListOf(generalConfig1, warnConfig2, fixConfig1), fs) - val config2 = TestConfig(toml2, config1, mutableListOf(generalConfig2, warnConfig3, fixConfig2), fs) + val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig1, warnConfig2, fixConfig1), emptyList(), fs) + val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2, warnConfig3, fixConfig2), emptyList(), fs) config2.mergeConfigWithParent() @@ -137,10 +139,10 @@ class MergeConfigsTest { @Test fun `merge configs with many parents`() { createTomlFiles() - val config1 = TestConfig(toml1, null, mutableListOf(generalConfig1, warnConfig1, fixConfig1), fs) - val config2 = TestConfig(toml2, config1, mutableListOf(generalConfig2, warnConfig2, fixConfig2), fs) - val config3 = TestConfig(toml3, config2, mutableListOf(generalConfig3, warnConfig3, fixConfig3), fs) - val config4 = TestConfig(toml4, config3, mutableListOf(generalConfig4, warnConfig4, fixConfig4), fs) + val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig1, warnConfig1, fixConfig1), emptyList(), fs) + val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2, warnConfig2, fixConfig2), emptyList(), fs) + val config3 = TestConfig(toml3, config2, evaluatedToolConfig, mutableListOf(generalConfig3, warnConfig3, fixConfig3), emptyList(), fs) + val config4 = TestConfig(toml4, config3, evaluatedToolConfig, mutableListOf(generalConfig4, warnConfig4, fixConfig4), emptyList(), fs) config1.mergeConfigWithParent() config2.mergeConfigWithParent() @@ -186,8 +188,8 @@ class MergeConfigsTest { assertEquals(listOf(""), childGeneralConfig.tags) assertEquals(null, childWarnConfig.execFlags) - val testConfig1 = TestConfig(toml1.toPath(), null, configList1.toMutableList(), fs) - val testConfig2 = TestConfig(toml2.toPath(), testConfig1, configList2.toMutableList(), fs) + val testConfig1 = TestConfig(toml1.toPath(), null, evaluatedToolConfig, configList1.toMutableList(), emptyList(), fs) + val testConfig2 = TestConfig(toml2.toPath(), testConfig1, evaluatedToolConfig, configList2.toMutableList(), emptyList(), fs) val mergedTestConfig = testConfig2.mergeConfigWithParent() testConfig2.validateAndSetDefaults() diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/utils/TomlUtilsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/utils/TomlUtilsTest.kt deleted file mode 100644 index 5ac1bea6c..000000000 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/utils/TomlUtilsTest.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.saveourtool.save.core.utils - -import com.saveourtool.save.core.config.SaveOverrides -import okio.Path.Companion.toPath -import kotlin.test.Test -import kotlin.test.assertEquals - -class TomlUtilsTest { - @Test - fun `read save overrides`() { - val testPath = "src/commonNonJsTest/resources/save-overrides.toml".toPath() - val fix = readFromFile( - testPath, - "fix", - "" - ) - assertEquals("sh -a && source .env", fix.execCmd) - assertEquals("--encode", fix.execFlags) - assertEquals(1, fix.batchSize) - assertEquals(", ", fix.batchSeparator) - val warn = readFromFile( - testPath, - "warn", - "" - ) - assertEquals("sh -c", warn.execCmd) - assertEquals("--warn", warn.execFlags) - assertEquals(4, warn.batchSize) - assertEquals(", ", warn.batchSeparator) - val fixAndWarn = readFromFile( - testPath, - "fix and warn", - "" - ) - assertEquals(null, fixAndWarn.execCmd) - assertEquals(null, fixAndWarn.execFlags) - assertEquals(1, fixAndWarn.batchSize) - assertEquals(", ", fixAndWarn.batchSeparator) - } -} \ No newline at end of file diff --git a/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt b/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt index ebd548518..733b71824 100644 --- a/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt +++ b/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.plugins.fixandwarn -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.readLines import com.saveourtool.save.core.plugin.GeneralConfig @@ -67,14 +66,16 @@ class FixAndWarnPlugin( private fun createTestConfigForPlugins(pluginConfig: PluginConfig) = TestConfig( testConfig.location, testConfig.parentConfig, + testConfig.evaluatedToolConfig, mutableListOf( generalConfig, pluginConfig ), + testConfig.overridesPluginConfigs, fs, ) - override fun handleFiles(evaluatedToolConfig: EvaluatedToolConfig, files: Sequence): Sequence { + override fun handleFiles(files: Sequence): Sequence { testConfig.validateAndSetDefaults() // Need to update private fields after validation initOrUpdateConfigs() @@ -84,7 +85,7 @@ class FixAndWarnPlugin( // fixme: should be performed on copies of files val filesAndTheirWarningsMap = removeWarningsFromExpectedFiles(expectedFiles) - val fixTestResults = fixPlugin.handleFiles(evaluatedToolConfig, files).toList() + val fixTestResults = fixPlugin.handleFiles(files).toList() val (fixTestResultsPassed, fixTestResultsFailed) = fixTestResults.partition { it.status is Pass } @@ -110,7 +111,7 @@ class FixAndWarnPlugin( // TODO: then warn plugin should look at the fix plugin output for actual warnings, and not execute command one more time. // TODO: However it's required changes in warn plugin logic (it's should be able to compare expected and actual warnings from different places), // TODO: this probably could be obtained after https://github.com/saveourtool/save/issues/164, - val warnTestResults = warnPlugin.handleFiles(evaluatedToolConfig, expectedFilesWithPass.map { Test(it) }) + val warnTestResults = warnPlugin.handleFiles(expectedFilesWithPass.map { Test(it) }) val fixAndWarnTestResults = fixTestResultsFailed.asSequence() + warnTestResults.map { testResult -> files.map { it as FixPlugin.FixTestFiles } diff --git a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt index 57517b90e..bf60772ee 100644 --- a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt +++ b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt @@ -1,9 +1,6 @@ package com.saveourtool.save.plugins.fix -import com.saveourtool.save.core.config.EvaluatedToolConfig -import com.saveourtool.save.core.config.SaveOverrides import com.saveourtool.save.core.config.TestConfig -import com.saveourtool.save.core.config.TestConfigSections import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.createRelativePathToTheRoot import com.saveourtool.save.core.files.myDeleteRecursively @@ -70,21 +67,21 @@ class FixPlugin( private lateinit var extraFlagsExtractor: ExtraFlagsExtractor @Suppress("TOO_LONG_FUNCTION") - override fun handleFiles(evaluatedToolConfig: EvaluatedToolConfig, files: Sequence): Sequence { + override fun handleFiles(files: Sequence): Sequence { testConfig.validateAndSetDefaults() val fixPluginConfig = testConfig.pluginConfigs.filterIsInstance().single() val generalConfig = testConfig.pluginConfigs.filterIsInstance().single() extraFlagsExtractor = ExtraFlagsExtractor(generalConfig, fs) - val overrides = requireNotNull(saveOverrides[TestConfigSections.FIX]) + val evaluatedToolConfig = testConfig.evaluatedToolConfig return files.map { it as FixTestFiles } - .chunked(overrides.batchSize) + .chunked(evaluatedToolConfig.batchSize) .map { chunk -> val copyPaths = chunk.map { it.test } val extraFlagsList = copyPaths.mapNotNull { path -> extraFlagsExtractor.extractExtraFlagsFrom(path) }.distinct() require(extraFlagsList.size <= 1) { - "Extra flags for all files in a batch should be same, but you have batchSize=${overrides.batchSize}" + + "Extra flags for all files in a batch should be same, but you have batchSize=${evaluatedToolConfig.batchSize}" + " and there are ${extraFlagsList.size} different sets of flags inside it, namely $extraFlagsList" } val extraFlags = extraFlagsList.singleOrNull() ?: ExtraFlags("", "") @@ -94,11 +91,11 @@ class FixPlugin( createTestFile(test, generalConfig, fixPluginConfig) to expected } val testCopyNames = - pathCopyMap.joinToString(separator = overrides.batchSeparator) { (testCopy, _) -> testCopy.toString() } + pathCopyMap.joinToString(separator = evaluatedToolConfig.batchSeparator) { (testCopy, _) -> testCopy.toString() } - val execFlags = overrides.execFlags ?: fixPluginConfig.execFlags + val execFlags = fixPluginConfig.execFlags val execFlagsAdjusted = resolvePlaceholdersFrom(execFlags, extraFlags, testCopyNames) - val execCmdWithoutFlags = overrides.execCmd ?: generalConfig.execCmd + val execCmdWithoutFlags = generalConfig.execCmd val execCmd = "$execCmdWithoutFlags $execFlagsAdjusted" val time = generalConfig.timeOutMillis!!.times(pathMap.size) diff --git a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt index 51f4fa3a9..fea7f33d2 100644 --- a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt +++ b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt @@ -59,7 +59,7 @@ class WarnPlugin( private lateinit var extraFlagsExtractor: ExtraFlagsExtractor private lateinit var tmpDirName: String - override fun handleFiles(evaluatedToolConfig: EvaluatedToolConfig, saveOverrides: Map, files: Sequence): Sequence { + override fun handleFiles(files: Sequence): Sequence { testConfig.validateAndSetDefaults() val warnPluginConfig = testConfig.pluginConfigs.filterIsInstance().single() val generalConfig = testConfig.pluginConfigs.filterIsInstance().single() @@ -70,10 +70,10 @@ class WarnPlugin( // // In case, when user doesn't want to use directory mode, he needs simply not to pass [wildCardInDirectoryMode] and it will be null return warnPluginConfig.wildCardInDirectoryMode?.let { - handleTestFile(files.map { it.test }.toList(), evaluatedToolConfig, warnPluginConfig, generalConfig).asSequence() + handleTestFile(files.map { it.test }.toList(), warnPluginConfig, generalConfig).asSequence() } ?: run { - files.chunked(evaluatedToolConfig.batchSize).flatMap { chunk -> - handleTestFile(chunk.map { it.test }, evaluatedToolConfig, warnPluginConfig, generalConfig) + files.chunked(testConfig.evaluatedToolConfig.batchSize).flatMap { chunk -> + handleTestFile(chunk.map { it.test }, warnPluginConfig, generalConfig) } } } @@ -106,7 +106,6 @@ class WarnPlugin( ) private fun handleTestFile( originalPaths: List, - evaluatedToolConfig: EvaluatedToolConfig, warnPluginConfig: WarnPluginConfig, generalConfig: GeneralConfig ): Sequence { @@ -123,9 +122,9 @@ class WarnPlugin( copyPaths, extraFlagsExtractor, pb, - evaluatedToolConfig.execCmd ?: generalConfig.execCmd, - evaluatedToolConfig.execFlags ?: warnPluginConfig.execFlags, - evaluatedToolConfig.batchSeparator, + generalConfig.execCmd, + warnPluginConfig.execFlags, + testConfig.evaluatedToolConfig.batchSeparator, warnPluginConfig, testConfig, fs, From a78e4f0c6998304a1238b97ea8725c2f0aee2a9a Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 12:03:18 +0300 Subject: [PATCH 04/19] cleanup --- .../saveourtool/save/core/config/Interim.kt | 20 ----------- .../save/core/config/TomlReader.kt | 2 -- .../saveourtool/save/core/plugin/Plugin.kt | 3 +- .../save/core/plugin/PluginConfigOverrides.kt | 14 -------- .../kotlin/com/saveourtool/save/core/Save.kt | 10 ++++-- .../save/core/files/ConfigDetector.kt | 4 ++- .../saveourtool/save/core/utils/TomlUtils.kt | 34 ------------------- .../saveourtool/save/core/ValidationTest.kt | 18 +++++----- .../resources/save-overrides.toml | 7 ++-- .../plugins/fix/FixPluginConfigOverrides.kt | 27 --------------- .../save/plugin/warn/WarnPlugin.kt | 4 ++- 11 files changed, 29 insertions(+), 114 deletions(-) delete mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/Interim.kt delete mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt delete mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfigOverrides.kt delete mode 100644 save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPluginConfigOverrides.kt diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/Interim.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/Interim.kt deleted file mode 100644 index a744710ce..000000000 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/Interim.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.saveourtool.save.core.config - -/** - * An interface for interim result during reading from TOML file - * - * @param I class represents interim result - * @param R class represents result - */ -interface Interim> { - /** - * @param overrides - * @return result with values are overridden by values from [overrides] - */ - fun merge(overrides: I) : I - - /** - * @return result with values from interim object - */ - fun build(): R -} \ No newline at end of file diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt deleted file mode 100644 index a4f934c4a..000000000 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TomlReader.kt +++ /dev/null @@ -1,2 +0,0 @@ -package com.saveourtool.save.core.config - diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt index 149734523..d53785318 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt @@ -1,6 +1,7 @@ package com.saveourtool.save.core.plugin -import com.saveourtool.save.core.config.* +import com.saveourtool.save.core.config.TestConfig +import com.saveourtool.save.core.config.isSaveTomlConfig import com.saveourtool.save.core.files.createRelativePathToTheRoot import com.saveourtool.save.core.files.findDescendantDirectoriesBy import com.saveourtool.save.core.files.parentsWithSelf diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfigOverrides.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfigOverrides.kt deleted file mode 100644 index 78f1cd54e..000000000 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfigOverrides.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.saveourtool.save.core.plugin - -import com.saveourtool.save.core.config.TestConfigSections -import okio.Path - -interface PluginConfigOverrides { - val type: TestConfigSections - val execCmd: String? - val execFlags: String? - - interface Factory { - fun read(path: Path): T - } -} diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt index 69c6a2737..ef117eea2 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt @@ -1,7 +1,14 @@ package com.saveourtool.save.core -import com.saveourtool.save.core.config.* +import com.saveourtool.save.core.config.EvaluatedToolConfig +import com.saveourtool.save.core.config.OutputStreamType +import com.saveourtool.save.core.config.ReportType import com.saveourtool.save.core.config.SAVE_VERSION +import com.saveourtool.save.core.config.SaveProperties +import com.saveourtool.save.core.config.TestConfig +import com.saveourtool.save.core.config.isSaveTomlConfig +import com.saveourtool.save.core.config.resolveSaveOverridesTomlConfig +import com.saveourtool.save.core.config.resolveSaveTomlConfig import com.saveourtool.save.core.files.ConfigDetector import com.saveourtool.save.core.files.StdStreamsSink import com.saveourtool.save.core.logging.logDebug @@ -21,7 +28,6 @@ import com.saveourtool.save.core.result.TestResult import com.saveourtool.save.core.utils.buildActivePlugins import com.saveourtool.save.core.utils.createPluginConfigListFromToml import com.saveourtool.save.core.utils.processInPlace -import com.saveourtool.save.core.utils.readFromFile import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPlugin import com.saveourtool.save.plugins.fix.FixPluginConfig diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt index bcde75c7f..fa556c758 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt @@ -1,6 +1,8 @@ package com.saveourtool.save.core.files -import com.saveourtool.save.core.config.* +import com.saveourtool.save.core.config.EvaluatedToolConfig +import com.saveourtool.save.core.config.TestConfig +import com.saveourtool.save.core.config.isSaveTomlConfig import com.saveourtool.save.core.logging.logDebug import com.saveourtool.save.core.logging.logError import com.saveourtool.save.core.logging.logTrace diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt index ffe13114a..c3b5c43b4 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TomlUtils.kt @@ -19,15 +19,11 @@ import com.akuleshov7.ktoml.exceptions.TomlDecodingException import com.akuleshov7.ktoml.file.TomlFileReader import com.akuleshov7.ktoml.parsers.TomlParser import com.akuleshov7.ktoml.tree.TomlTable -import com.saveourtool.save.core.config.Interim -import com.saveourtool.save.core.files.fs -import com.saveourtool.save.core.plugin.PluginConfigOverrides import okio.FileSystem import okio.Path import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.serializer -import okio.Path.Companion.toPath private fun Path.testConfigFactory(table: TomlTable) = when (table.fullTableName.uppercase().replace("\"", "")) { @@ -94,33 +90,3 @@ fun getTopLevelTomlTables(testConfigPath: Path, fs: FileSystem): List .children .filterIsInstance() .filter { !it.isSynthetic } - -/** - * @param filePath path to the TOML file - * @param specificTableName table name to deserialize [T] - * @param generalTableName table name for default values of [T] - * @param I interim type of [T] - */ -inline fun > readFromFile( - filePath: Path, - specificTableName: String, - generalTableName: String -): T { - val serializer = serializer() - val tomlInputConfigGeneralConfig = TomlInputConfig(ignoreUnknownNames = true) - return fs.read(filePath) { - val content = generateSequence { this.readUtf8Line() }.toList() - val generic: I = if (generalTableName.isNotEmpty()) { - TomlFileReader.partiallyDecodeFromString( - serializer, - content, - generalTableName, - tomlInputConfigGeneralConfig - ) - } else { - TomlFileReader.decodeFromString(serializer, content, tomlInputConfigGeneralConfig) - } - val specific: I = TomlFileReader.partiallyDecodeFromString(serializer, content, specificTableName, TomlInputConfig()) - generic.merge(specific).build() - } -} \ No newline at end of file diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt index 0fdf3f15e..35b48a021 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt @@ -1,5 +1,6 @@ package com.saveourtool.save.core +import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.plugin.GeneralConfig import com.saveourtool.save.plugin.warn.WarnPluginConfig @@ -15,12 +16,13 @@ import kotlin.test.assertTrue @Suppress("LONG_LINE") class ValidationTest { private val fs: FileSystem = FileSystem.SYSTEM + private val evaluatedToolConfig = EvaluatedToolConfig(1, "") @Test fun `set defaults to general section`() { createTomlFiles() val generalConfig = GeneralConfig("exeCmd", tags = listOf("Tag11", "Tag12"), description = "Description1", suiteName = "suiteName1") - val config = TestConfig(toml1, null, mutableListOf(generalConfig), fs) + val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig), emptyList(), fs) config.validateAndSetDefaults() @@ -34,7 +36,7 @@ class ValidationTest { fun `invalid general section`() { createTomlFiles() val generalConfig = GeneralConfig() - val config = TestConfig(toml1, null, mutableListOf(generalConfig), fs) + val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig), emptyList(), fs) generalConfig.configLocation = config.location try { config.validateAndSetDefaults() @@ -54,7 +56,7 @@ class ValidationTest { fun `set defaults to warn section`() { createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", messageCaptureGroup = 4) - val config = TestConfig(toml1, null, mutableListOf(warnConfig), fs) + val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) config.validateAndSetDefaults() @@ -81,7 +83,7 @@ class ValidationTest { fun `validate warn section`() { createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", warningTextHasLine = true, warningTextHasColumn = false) - val config = TestConfig(toml1, null, mutableListOf(warnConfig), fs) + val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) config.validateAndSetDefaults() @@ -99,7 +101,7 @@ class ValidationTest { fun `validate warn section 2`() { createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", warningTextHasLine = false, lineCaptureGroup = 1) - val config = TestConfig(toml1, null, mutableListOf(warnConfig), fs) + val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) config.validateAndSetDefaults() @@ -117,7 +119,7 @@ class ValidationTest { fun `validate warn section 3`() { createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", lineCaptureGroup = 5) - val config = TestConfig(toml1, null, mutableListOf(warnConfig), fs) + val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) config.validateAndSetDefaults() @@ -135,7 +137,7 @@ class ValidationTest { fun `validate warn section 4`() { createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", lineCaptureGroup = -127) - val config = TestConfig(toml1, null, mutableListOf(warnConfig), fs) + val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) warnConfig.configLocation = config.location try { config.validateAndSetDefaults() @@ -153,7 +155,7 @@ class ValidationTest { fun `set defaults to fix section`() { createTomlFiles() val fixConfig = FixPluginConfig(execFlags = "execFlags") - val config = TestConfig(toml1, null, mutableListOf(fixConfig), fs) + val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(fixConfig), emptyList(), fs) config.validateAndSetDefaults() diff --git a/save-core/src/commonNonJsTest/resources/save-overrides.toml b/save-core/src/commonNonJsTest/resources/save-overrides.toml index 76e3dff90..ffced3d1d 100644 --- a/save-core/src/commonNonJsTest/resources/save-overrides.toml +++ b/save-core/src/commonNonJsTest/resources/save-overrides.toml @@ -1,9 +1,8 @@ +[general] execCmd = "sh -c" -execFlags = "--encode" [fix] -execCmd = "sh -a && source .env" +execFlags = "--encode" [warn] -execFlags = "--warn" -batchSize = 4 \ No newline at end of file +execFlags = "--warn" \ No newline at end of file diff --git a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPluginConfigOverrides.kt b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPluginConfigOverrides.kt deleted file mode 100644 index 830abdaec..000000000 --- a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPluginConfigOverrides.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.saveourtool.save.plugins.fix - -import com.saveourtool.save.core.config.TestConfigSections -import com.saveourtool.save.core.plugin.PluginConfigOverrides - -data class FixPluginConfigOverrides( - override val execCmd: String?, - override val execFlags: String?, -) : PluginConfigOverrides { - override val type: TestConfigSections - get() = TestConfigSections.FIX - - data class Interim( - val execCmd: String?, - val execFlags: String?, - ) : com.saveourtool.save.core.config.Interim { - override fun merge(overrides: Interim) = Interim( - overrides.execCmd ?: execCmd, - overrides.execFlags ?: execFlags, - ) - - override fun build() = FixPluginConfigOverrides( - execCmd, - execFlags - ) - } -} \ No newline at end of file diff --git a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt index fea7f33d2..6660de4f0 100644 --- a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt +++ b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt @@ -1,6 +1,8 @@ package com.saveourtool.save.plugin.warn -import com.saveourtool.save.core.config.* +import com.saveourtool.save.core.config.ActualWarningsFormat +import com.saveourtool.save.core.config.ExpectedWarningsFormat +import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.getWorkingDirectory import com.saveourtool.save.core.files.readLines From 83a753c46a2a8571f15efb5f82182f99db5470c0 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 14:53:31 +0300 Subject: [PATCH 05/19] cleanup #2 + refatoring tests (no need to create TestConfig) --- OptionsTable.md | 2 - .../src/main/resources/config-options.json | 16 --- .../save/cli/config/SavePropertiesExt.kt | 12 -- .../save/core/config/TestConfig.kt | 42 ++---- .../saveourtool/save/core/plugin/Plugin.kt | 4 +- .../save/core/utils/PluginConfigUtils.kt | 72 ++++++++++ .../save/core/files/ConfigDetector.kt | 6 +- .../save/core/ConfigDetectorRegressionTest.kt | 9 +- .../save/core/ConfigDetectorTest.kt | 7 +- .../saveourtool/save/core/MergeConfigsTest.kt | 135 +++++++----------- .../saveourtool/save/core/ValidationTest.kt | 68 ++++----- .../plugins/fixandwarn/FixAndWarnPlugin.kt | 9 +- .../saveourtool/save/plugins/fix/FixPlugin.kt | 5 +- .../save/plugin/warn/WarnPlugin.kt | 11 +- 14 files changed, 178 insertions(+), 220 deletions(-) create mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/PluginConfigUtils.kt diff --git a/OptionsTable.md b/OptionsTable.md index d257f3802..94954535f 100644 --- a/OptionsTable.md +++ b/OptionsTable.md @@ -13,7 +13,5 @@ Most (except for `-h` and `-prop`) of the options below can be passed to a SAVE | l | language | Language that you are developing analyzer for | UNDEFINED | | out | result-output | Data output stream | STDOUT | | - | report-dir | Path to directory, where to store output (when `resultOutput` is set to `FILE`) | save-reports | -| - | override-exec-cmd | A temporary workaround for save-cloud to override `execCmd` in `save.toml` | - | -| - | override-exec-flags | A temporary workaround for save-cloud to override `execFlags` in `save.toml` | - | | - | batch-size | Number of files execCmd will process at a time | 1 | | - | batch-separator | A separator to join test files to string if the tested tool supports processing of file batches (`batch-size` > 1) | , | \ No newline at end of file diff --git a/buildSrc/src/main/resources/config-options.json b/buildSrc/src/main/resources/config-options.json index d6a98157e..8c55759b5 100644 --- a/buildSrc/src/main/resources/config-options.json +++ b/buildSrc/src/main/resources/config-options.json @@ -79,22 +79,6 @@ "description" : "Path to directory, where to store output (when `resultOutput` is set to `FILE`)", "default" : "save-reports" }, - "overrideExecCmd" : { - "argType": "ArgType.String", - "kotlinType": "kotlin.String", - "fullName": "override-exec-cmd", - "shortName" : "", - "description" : "A temporary workaround for save-cloud to override `execCmd` in `save.toml`", - "default" : null - }, - "overrideExecFlags" : { - "argType": "ArgType.String", - "kotlinType": "kotlin.String", - "fullName": "override-exec-flags", - "shortName" : "", - "description" : "A temporary workaround for save-cloud to override `execFlags` in `save.toml`", - "default" : null - }, "batchSize" : { "argType" : "ArgType.Int", "kotlinType": "kotlin.Int", diff --git a/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt b/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt index 661b9a1a7..1d41191ba 100644 --- a/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt +++ b/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt @@ -57,18 +57,6 @@ private fun SaveProperties.validate(): SaveProperties { ExitCodes.INVALID_CONFIGURATION, "Property `batch-size` should be more or equal to 1." ) } - overrideExecCmd?.also { - logWarn { - "Property `override-exec-cmd` is a temporary workaround for `save-cloud`, " + - "please be aware this property can be removed in future versions" - } - } - overrideExecFlags?.also { - logWarn { - "Property `override-exec-flags` is a temporary workaround for `save-cloud`, " + - "please be aware this property can be removed in future versions" - } - } return this } diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index f217da9af..d45435578 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -10,6 +10,9 @@ import com.saveourtool.save.core.logging.logTrace import com.saveourtool.save.core.plugin.GeneralConfig import com.saveourtool.save.core.plugin.Plugin import com.saveourtool.save.core.plugin.PluginConfig +import com.saveourtool.save.core.utils.singleIsInstanceOrNull +import com.saveourtool.save.core.utils.mergeWith +import com.saveourtool.save.core.utils.overrideBy import okio.FileSystem import okio.Path @@ -82,7 +85,7 @@ data class TestConfig( * * @return [GeneralConfig] or `null` if not found */ - fun getGeneralConfig() = pluginConfigs.filterIsInstance().singleOrNull() + fun getGeneralConfig() = pluginConfigs.singleIsInstanceOrNull() /** * @param withSelf if true, include this config as the first element of the sequence or start with parent config otherwise @@ -131,7 +134,7 @@ data class TestConfig( // discover plugins from the test configuration createPluginConfigList(this).forEach { logTrace("Discovered new pluginConfig: $it") - this.pluginConfigs.mergeOrOverride(it) + this.pluginConfigs.add(it) } // merge configurations with parents this.mergeConfigWithParent() @@ -176,22 +179,16 @@ data class TestConfig( fun mergeConfigWithParent(): TestConfig { logDebug("Merging configs (with parental configs from higher directory level) for ${this.location}") - if (parentConfig != null) { + parentConfig?.let { logTrace("Using parental config ${parentConfig.location} to merge it with child config: ${this.location}") - // return from the function if we stay at the root element of the plugin tree - val parentalPlugins = parentConfig.pluginConfigs - parentalPlugins.forEach { parentalPluginConfig -> - this.pluginConfigs.mergeOrOverride(parentalPluginConfig) - } + this.pluginConfigs.mergeWith(parentConfig.pluginConfigs) } return this } private fun overrideConfig() { logDebug("Overriding configs for $location") - overridesPluginConfigs.forEach { overridesPluginConfig -> - pluginConfigs.mergeOrOverride(overridesPluginConfig, false) - } + pluginConfigs.overrideBy(overridesPluginConfigs) } /** @@ -204,29 +201,6 @@ data class TestConfig( logDebug("Validated plugin configuration for [$location] " + "(${pluginConfigs.map { it.type }.filterNot { it == TestConfigSections.GENERAL }})") } - - private fun MutableList.mergeOrOverride(parentalPluginConfig: PluginConfig, merge: Boolean = true) { - val childConfigs = this.filter { it.type == parentalPluginConfig.type } - if (childConfigs.isEmpty()) { - // if we haven't found a plugin from parent in a current list of plugins - we will simply copy it - this.add(parentalPluginConfig) - } else { - require(childConfigs.size == 1) { - "Duplicate config with type ${parentalPluginConfig.type} in $this" - } - val childConfig = childConfigs.single() - // else, we will merge plugin with a corresponding plugin from a parent config - // we expect that there is only one plugin of such type, otherwise we will throw an exception - - this[this.indexOf(childConfig)] = if (merge) { - logTrace("Merging process of ${parentalPluginConfig.type} from $parentalPluginConfig into $childConfig") - childConfig.mergeWith(parentalPluginConfig) - } else { - logTrace("Overriding process of ${parentalPluginConfig.type} from $parentalPluginConfig into $childConfig") - parentalPluginConfig.mergeWith(childConfig) - } - } - } } /** diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt index d53785318..83c22e45b 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/Plugin.kt @@ -11,6 +11,7 @@ import com.saveourtool.save.core.result.Ignored import com.saveourtool.save.core.result.TestResult import com.saveourtool.save.core.utils.PathSerializer import com.saveourtool.save.core.utils.ProcessBuilder +import com.saveourtool.save.core.utils.singleIsInstanceOrNull import okio.FileSystem import okio.Path @@ -51,8 +52,7 @@ abstract class Plugin( val excludedTests = testConfig .pluginConfigs - .filterIsInstance() - .singleOrNull() + .singleIsInstanceOrNull() ?.excludedTests if (!excludedTests.isNullOrEmpty()) { diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/PluginConfigUtils.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/PluginConfigUtils.kt new file mode 100644 index 000000000..16be40244 --- /dev/null +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/PluginConfigUtils.kt @@ -0,0 +1,72 @@ +/** + * This file contains util methods for [PluginConfig] + */ + +package com.saveourtool.save.core.utils + +import com.saveourtool.save.core.logging.logTrace +import com.saveourtool.save.core.plugin.PluginConfig + +/** + * @return original list of configuration for plugins after validation and merged with default values + */ +fun MutableList.validateAndSetDefaults() { + forEachIndexed { index, config -> + this[index] = config.validateAndSetDefaults() + } +} + +/** + * @param otherPluginConfigs list of configurations for plugins that are merged to current list + * @return original list of configuration for plugins merged with [otherPluginConfigs] + */ +fun MutableList.mergeWith(otherPluginConfigs: List) { + otherPluginConfigs.forEach { otherPluginConfig -> + this.mergeOrOverride(otherPluginConfig) + } +} + +/** + * @param otherPluginConfigs list of configurations for plugins that overrides current list + * @return original list of configuration for plugins overridden by [otherPluginConfigs] + */ +fun MutableList.overrideBy(otherPluginConfigs: List) { + otherPluginConfigs.forEach { otherPluginConfig -> + this.mergeOrOverride(otherPluginConfig, merge = false) + } +} + +private fun MutableList.mergeOrOverride(otherPluginConfig: PluginConfig, merge: Boolean = true) { + val childConfigsWithIndex = this.withIndex().filter { (_, value) -> value.type == otherPluginConfig.type } + if (childConfigsWithIndex.isEmpty()) { + // if we haven't found a plugin from parent in a current list of plugins - we will simply copy it + this.add(otherPluginConfig) + } else { + require(childConfigsWithIndex.size == 1) { + "Duplicate config with type ${otherPluginConfig.type} in $this" + } + val (childIndex, childConfig) = childConfigsWithIndex.single() + // else, we will merge plugin with a corresponding plugin from a parent config + // we expect that there is only one plugin of such type, otherwise we will throw an exception + + this[childIndex] = if (merge) { + logTrace("Merging process of ${otherPluginConfig.type} from $otherPluginConfig into $childConfig") + childConfig.mergeWith(otherPluginConfig) + } else { + logTrace("Overriding process of ${otherPluginConfig.type} from $otherPluginConfig into $childConfig") + otherPluginConfig.mergeWith(childConfig) + } + } +} + +/** + * @return a single [PluginConfig] with type [P] from current list + */ +inline fun List.singleIsInstance() = requireNotNull(this.singleIsInstanceOrNull

()) { + "Not found an element with type ${P::class}" +} + +/** + * @return a single [PluginConfig] with type [P] from current list or null + */ +inline fun List.singleIsInstanceOrNull() = this.filterIsInstance

().singleOrNull() diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt index fa556c758..9c519a26a 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt @@ -17,7 +17,7 @@ import okio.Path class ConfigDetector( private val fs: FileSystem, private val evaluatedToolConfig: EvaluatedToolConfig, - private val pluginConfigsOverrides: List, + private val overridesPluginConfigs: List, ) { /** * Try to create SAVE config file from [testConfig]. @@ -68,7 +68,7 @@ class ConfigDetector( path, parentConfig, evaluatedToolConfig, - overridesPluginConfigs = pluginConfigsOverrides, + overridesPluginConfigs = overridesPluginConfigs, fs = fs, ) ) @@ -120,7 +120,7 @@ class ConfigDetector( file, parentConfig, evaluatedToolConfig, - overridesPluginConfigs = pluginConfigsOverrides, + overridesPluginConfigs = overridesPluginConfigs, fs = fs, ) } diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorRegressionTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorRegressionTest.kt index 43d7206b2..ba80eb58d 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorRegressionTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorRegressionTest.kt @@ -1,15 +1,16 @@ package com.saveourtool.save.core +import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.files.ConfigDetector +import com.saveourtool.save.core.files.fs -import okio.FileSystem import okio.Path.Companion.toPath import kotlin.test.Test import kotlin.test.assertEquals class ConfigDetectorRegressionTest { - private val fs: FileSystem = FileSystem.SYSTEM + private val evaluatedToolConfig = EvaluatedToolConfig(1, "") @Test fun `config detector regression test on directories`() { @@ -20,14 +21,14 @@ class ConfigDetectorRegressionTest { "$baseDir/highlevel/suite2/inner/save.toml" ) - val actual1 = ConfigDetector(fs) + val actual1 = ConfigDetector(fs, evaluatedToolConfig, emptyList()) .configFromFile(baseDir.toPath()) .getAllTestConfigs() .map { it.location.toString() } assertEquals(expected, actual1) - val actual2 = ConfigDetector(fs) + val actual2 = ConfigDetector(fs, evaluatedToolConfig, emptyList()) .configFromFile("$baseDir/save.toml".toPath()) .getAllTestConfigs() .map { it.location.toString() } diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorTest.kt index 0e975e1d7..cac312108 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorTest.kt @@ -1,11 +1,11 @@ package com.saveourtool.save.core +import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.files.ConfigDetector import com.saveourtool.save.core.files.createFile +import com.saveourtool.save.core.files.fs import com.saveourtool.save.createTempDir -import okio.FileSystem - import kotlin.test.AfterTest import kotlin.test.Test import kotlin.test.assertEquals @@ -14,9 +14,8 @@ import kotlin.test.assertNotNull import kotlin.test.assertTrue class ConfigDetectorTest { - private val fs = FileSystem.SYSTEM private val tmpDir = fs.createTempDir(ConfigDetectorTest::class.simpleName!!) - private val configDetector = ConfigDetector(fs) + private val configDetector = ConfigDetector(fs, EvaluatedToolConfig(1, ""), emptyList()) @Test fun `should detect single file`() { diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt index 8c7974f06..bf696d992 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt @@ -2,30 +2,20 @@ package com.saveourtool.save.core import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig -import com.saveourtool.save.core.files.createFile -import com.saveourtool.save.core.files.myDeleteRecursively +import com.saveourtool.save.core.files.fs import com.saveourtool.save.core.plugin.GeneralConfig +import com.saveourtool.save.core.plugin.PluginConfig import com.saveourtool.save.core.utils.createPluginConfigListFromToml +import com.saveourtool.save.core.utils.mergeWith +import com.saveourtool.save.core.utils.singleIsInstance import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPluginConfig -import okio.FileSystem import okio.Path.Companion.toPath -import kotlin.test.AfterTest import kotlin.test.Test import kotlin.test.assertEquals -internal val fs = FileSystem.SYSTEM -internal val tmpDir = (FileSystem.SYSTEM_TEMPORARY_DIRECTORY / MergeConfigsTest::class.simpleName!!) - -internal val toml1 = tmpDir / "save.toml" -internal val nestedDir1 = tmpDir / "nestedDir1" -internal val toml2 = nestedDir1 / "save.toml" -internal val nestedDir2 = tmpDir / "nestedDir1" / "nestedDir2" -internal val toml3 = nestedDir2 / "save.toml" -internal val toml4 = nestedDir2 / "nestedDir3" / "nestedDir4" / "save.toml" - @Suppress( "TOO_LONG_FUNCTION", "LOCAL_VARIABLE_EARLY_DECLARATION", @@ -58,37 +48,34 @@ class MergeConfigsTest { @Test fun `merge general configs`() { - createTomlFiles() - val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig1), emptyList(), fs) - val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2), emptyList(), fs) + val parent = mutableListOf(generalConfig1) + val child = mutableListOf(generalConfig2) - config2.mergeConfigWithParent() + child.mergeWith(parent) - assertEquals(1, config2.pluginConfigs.size) + assertEquals(1, child.size) val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - val actualGeneralConfig = config2.pluginConfigs.filterIsInstance().first() - + val actualGeneralConfig = child.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) } @Test fun `merge two incomplete configs`() { - createTomlFiles() - val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig1, warnConfig1), emptyList(), fs) - val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2), emptyList(), fs) + val parent = mutableListOf(generalConfig1, warnConfig1) + val child = mutableListOf(generalConfig2) - config2.mergeConfigWithParent() + child.mergeWith(parent) - assertEquals(2, config2.pluginConfigs.size) + assertEquals(2, child.size) val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - val actualGeneralConfig = config2.pluginConfigs.filterIsInstance().first() - val actualWarnConfig = config2.pluginConfigs.filterIsInstance().first() + val actualGeneralConfig = child.singleIsInstance() + val actualWarnConfig = child.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(warnConfig1, actualWarnConfig) @@ -96,16 +83,15 @@ class MergeConfigsTest { @Test fun `merge two incomplete configs 2`() { - createTomlFiles() - val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(), emptyList(), fs) - val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2, warnConfig1), emptyList(), fs) + val parent = mutableListOf() + val child = mutableListOf(generalConfig2, warnConfig1) - config2.mergeConfigWithParent() + child.mergeWith(parent) - assertEquals(2, config2.pluginConfigs.size) + assertEquals(2, child.size) - val actualGeneralConfig = config2.pluginConfigs.filterIsInstance().first() - val actualWarnConfig = config2.pluginConfigs.filterIsInstance().first() + val actualGeneralConfig = child.singleIsInstance() + val actualWarnConfig = child.singleIsInstance() assertEquals(generalConfig2, actualGeneralConfig) assertEquals(warnConfig1, actualWarnConfig) @@ -113,13 +99,12 @@ class MergeConfigsTest { @Test fun `merge two configs with different fields`() { - createTomlFiles() - val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig1, warnConfig2, fixConfig1), emptyList(), fs) - val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2, warnConfig3, fixConfig2), emptyList(), fs) + val parent = mutableListOf(generalConfig1, warnConfig2, fixConfig1) + val child = mutableListOf(generalConfig2, warnConfig3, fixConfig2) - config2.mergeConfigWithParent() + child.mergeWith(parent) - assertEquals(3, config2.pluginConfigs.size) + assertEquals(3, child.size) val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) @@ -127,9 +112,9 @@ class MergeConfigsTest { true, false, 3, 3, 3, 1, 1, 3, 3, 3, 3, true, null) val expectedFixConfig = FixPluginConfig("fixCmd2", "Suffix") - val actualGeneralConfig = config2.pluginConfigs.filterIsInstance().first() - val actualWarnConfig = config2.pluginConfigs.filterIsInstance().first() - val actualFixConfig = config2.pluginConfigs.filterIsInstance().first() + val actualGeneralConfig = child.singleIsInstance() + val actualWarnConfig = child.singleIsInstance() + val actualFixConfig = child.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(expectedWarnConfig, actualWarnConfig) @@ -138,27 +123,26 @@ class MergeConfigsTest { @Test fun `merge configs with many parents`() { - createTomlFiles() - val config1 = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig1, warnConfig1, fixConfig1), emptyList(), fs) - val config2 = TestConfig(toml2, config1, evaluatedToolConfig, mutableListOf(generalConfig2, warnConfig2, fixConfig2), emptyList(), fs) - val config3 = TestConfig(toml3, config2, evaluatedToolConfig, mutableListOf(generalConfig3, warnConfig3, fixConfig3), emptyList(), fs) - val config4 = TestConfig(toml4, config3, evaluatedToolConfig, mutableListOf(generalConfig4, warnConfig4, fixConfig4), emptyList(), fs) - - config1.mergeConfigWithParent() - config2.mergeConfigWithParent() - config3.mergeConfigWithParent() - config4.mergeConfigWithParent() - - assertEquals(3, config4.pluginConfigs.size) + val config1 = mutableListOf(generalConfig1, warnConfig1, fixConfig1) + val config2 = mutableListOf(generalConfig2, warnConfig2, fixConfig2) + val config3 = mutableListOf(generalConfig3, warnConfig3, fixConfig3) + val config4 = mutableListOf(generalConfig4, warnConfig4, fixConfig4) + + config1.mergeWith(emptyList()) + config2.mergeWith(config1) + config3.mergeWith(config2) + config4.mergeWith(config3) + + assertEquals(3, config4.size) val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21", "Tag31", "Tag32"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) val expectedWarnConfig = WarnPluginConfig("execCmd4", warningsOutputPattern2, true, false, 4, 4, 4, 1, 1, 4, 4, 4, 4, true, null) val expectedFixConfig = FixPluginConfig("fixCmd4", "Suffix") - val actualGeneralConfig = config4.pluginConfigs.filterIsInstance().first() - val actualWarnConfig = config4.pluginConfigs.filterIsInstance().first() - val actualFixConfig = config4.pluginConfigs.filterIsInstance().first() + val actualGeneralConfig = config4.singleIsInstance() + val actualWarnConfig = config4.singleIsInstance() + val actualFixConfig = config4.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(expectedWarnConfig, actualWarnConfig) @@ -167,14 +151,11 @@ class MergeConfigsTest { @Test fun `merge real toml configs with empty execFlag in child`() { - // stub, since tearDown should delete it anyway - createTomlFiles() - val toml1 = "src/commonNonJsTest/resources/merge_configs/save.toml" val configList1 = createPluginConfigListFromToml(toml1.toPath(), fs) - val parentGeneralConfig = configList1.filterIsInstance().first() - val parentWarnConfig = configList1.filterIsInstance().first() + val parentGeneralConfig = configList1.singleIsInstance() + val parentWarnConfig = configList1.singleIsInstance() assertEquals("echo hello world", parentGeneralConfig.execCmd) assertEquals(listOf("Tag"), parentGeneralConfig.tags) assertEquals(null, parentWarnConfig.execFlags) @@ -182,8 +163,8 @@ class MergeConfigsTest { val toml2 = "src/commonNonJsTest/resources/merge_configs/inner/save.toml" val configList2 = createPluginConfigListFromToml(toml2.toPath(), fs) - val childGeneralConfig = configList2.filterIsInstance().first() - val childWarnConfig = configList2.filterIsInstance().first() + val childGeneralConfig = configList2.singleIsInstance() + val childWarnConfig = configList2.singleIsInstance() assertEquals(listOf(""), childGeneralConfig.tags) assertEquals(null, childWarnConfig.execFlags) @@ -194,31 +175,11 @@ class MergeConfigsTest { val mergedTestConfig = testConfig2.mergeConfigWithParent() testConfig2.validateAndSetDefaults() - val mergedGeneralConfig = mergedTestConfig.pluginConfigs.filterIsInstance().first() - val mergedWarnConfig = mergedTestConfig.pluginConfigs.filterIsInstance().first() + val mergedGeneralConfig = mergedTestConfig.pluginConfigs.singleIsInstance() + val mergedWarnConfig = mergedTestConfig.pluginConfigs.singleIsInstance() assertEquals(listOf("Tag", ""), mergedGeneralConfig.tags) // execFlags should be empty, not `"null"` assertEquals("", mergedWarnConfig.execFlags) } - - @AfterTest - fun tearDown() { - fs.deleteRecursively(tmpDir) - } -} - -internal fun createTomlFiles() { - if (fs.exists(tmpDir)) { - fs.myDeleteRecursively(tmpDir) - } - fs.createDirectory(tmpDir) - fs.createFile(toml1) - fs.createDirectory(nestedDir1) - fs.createFile(toml2) - fs.createDirectory(nestedDir2) - fs.createFile(toml3) - fs.createDirectory(nestedDir2 / "nestedDir3") - fs.createDirectory(nestedDir2 / "nestedDir3" / "nestedDir4") - fs.createFile(toml4) } diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt index 35b48a021..0a63fe823 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt @@ -1,43 +1,38 @@ package com.saveourtool.save.core -import com.saveourtool.save.core.config.EvaluatedToolConfig -import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.plugin.GeneralConfig +import com.saveourtool.save.core.plugin.PluginConfig +import com.saveourtool.save.core.utils.singleIsInstance +import com.saveourtool.save.core.utils.validateAndSetDefaults import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPluginConfig -import okio.FileSystem +import okio.Path.Companion.toPath -import kotlin.test.AfterTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @Suppress("LONG_LINE") class ValidationTest { - private val fs: FileSystem = FileSystem.SYSTEM - private val evaluatedToolConfig = EvaluatedToolConfig(1, "") - @Test fun `set defaults to general section`() { - createTomlFiles() val generalConfig = GeneralConfig("exeCmd", tags = listOf("Tag11", "Tag12"), description = "Description1", suiteName = "suiteName1") - val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig), emptyList(), fs) + val config = mutableListOf(generalConfig) config.validateAndSetDefaults() - assertEquals(1, config.pluginConfigs.size) + assertEquals(1, config.size) - val actualGeneralConfig1 = config.pluginConfigs.filterIsInstance().first() + val actualGeneralConfig1 = config.singleIsInstance() assertEquals(emptyList(), actualGeneralConfig1.excludedTests) } @Test fun `invalid general section`() { - createTomlFiles() val generalConfig = GeneralConfig() - val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(generalConfig), emptyList(), fs) - generalConfig.configLocation = config.location + val config = mutableListOf(generalConfig) + generalConfig.configLocation = "./some-path".toPath() try { config.validateAndSetDefaults() } catch (ex: IllegalArgumentException) { @@ -54,15 +49,14 @@ class ValidationTest { @Test fun `set defaults to warn section`() { - createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", messageCaptureGroup = 4) - val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) + val config = mutableListOf(warnConfig) config.validateAndSetDefaults() - assertEquals(1, config.pluginConfigs.size) + assertEquals(1, config.size) - val actualWarnConfig = config.pluginConfigs.filterIsInstance().first() + val actualWarnConfig = config.singleIsInstance() assertEquals(Regex("(.+):(\\d*):(\\d*): (.+)").toString(), actualWarnConfig.actualWarningsPattern.toString()) assertEquals(true, actualWarnConfig.warningTextHasLine) assertEquals(true, actualWarnConfig.warningTextHasColumn) @@ -81,15 +75,14 @@ class ValidationTest { // `warningTextHasLine` `warningTextHasColumn` @Test fun `validate warn section`() { - createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", warningTextHasLine = true, warningTextHasColumn = false) - val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) + val config = mutableListOf(warnConfig) config.validateAndSetDefaults() - assertEquals(1, config.pluginConfigs.size) + assertEquals(1, config.size) - val actualWarnConfig = config.pluginConfigs.filterIsInstance().first() + val actualWarnConfig = config.singleIsInstance() assertEquals(true, actualWarnConfig.warningTextHasLine) assertEquals(false, actualWarnConfig.warningTextHasColumn) assertEquals(1, actualWarnConfig.lineCaptureGroup) @@ -99,15 +92,14 @@ class ValidationTest { // Provided incorrect values `warningTextHasLine = false` but `lineCaptureGroup = 2`; validate it @Test fun `validate warn section 2`() { - createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", warningTextHasLine = false, lineCaptureGroup = 1) - val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) + val config = mutableListOf(warnConfig) config.validateAndSetDefaults() - assertEquals(1, config.pluginConfigs.size) + assertEquals(1, config.size) - val actualWarnConfig = config.pluginConfigs.filterIsInstance().first() + val actualWarnConfig = config.singleIsInstance() assertEquals(false, actualWarnConfig.warningTextHasLine) assertEquals(true, actualWarnConfig.warningTextHasColumn) assertEquals(null, actualWarnConfig.lineCaptureGroup) @@ -117,15 +109,14 @@ class ValidationTest { // `lineCaptureGroup` provided, but `warningTextHasLine` is absent; validate it @Test fun `validate warn section 3`() { - createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", lineCaptureGroup = 5) - val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) + val config = mutableListOf(warnConfig) config.validateAndSetDefaults() - assertEquals(1, config.pluginConfigs.size) + assertEquals(1, config.size) - val actualWarnConfig = config.pluginConfigs.filterIsInstance().first() + val actualWarnConfig = config.singleIsInstance() assertEquals(true, actualWarnConfig.warningTextHasLine) assertEquals(true, actualWarnConfig.warningTextHasColumn) assertEquals(5, actualWarnConfig.lineCaptureGroup) @@ -135,10 +126,9 @@ class ValidationTest { // `lineCaptureGroup` provided, but incorrect -- error @Test fun `validate warn section 4`() { - createTomlFiles() val warnConfig = WarnPluginConfig(execFlags = "execFlags", lineCaptureGroup = -127) - val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(warnConfig), emptyList(), fs) - warnConfig.configLocation = config.location + val config = mutableListOf(warnConfig) + warnConfig.configLocation = "./some-location".toPath() try { config.validateAndSetDefaults() } catch (ex: IllegalArgumentException) { @@ -153,21 +143,15 @@ class ValidationTest { @Test fun `set defaults to fix section`() { - createTomlFiles() val fixConfig = FixPluginConfig(execFlags = "execFlags") - val config = TestConfig(toml1, null, evaluatedToolConfig, mutableListOf(fixConfig), emptyList(), fs) + val config = mutableListOf(fixConfig) config.validateAndSetDefaults() - assertEquals(1, config.pluginConfigs.size) + assertEquals(1, config.size) - val actualFixConfig = config.pluginConfigs.filterIsInstance().first() + val actualFixConfig = config.singleIsInstance() assertEquals("Test", actualFixConfig.resourceNameTest) assertEquals("Expected", actualFixConfig.resourceNameExpected) } - - @AfterTest - fun tearDown() { - fs.deleteRecursively(tmpDir) - } } diff --git a/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt b/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt index 733b71824..6db27bfc7 100644 --- a/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt +++ b/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt @@ -7,6 +7,7 @@ import com.saveourtool.save.core.plugin.Plugin import com.saveourtool.save.core.plugin.PluginConfig import com.saveourtool.save.core.result.Pass import com.saveourtool.save.core.result.TestResult +import com.saveourtool.save.core.utils.singleIsInstance import com.saveourtool.save.plugin.warn.WarnPlugin import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPlugin @@ -37,16 +38,14 @@ class FixAndWarnPlugin( ) { private val fixPluginConfig: FixPluginConfig = testConfig.pluginConfigs - .filterIsInstance() - .single() + .singleIsInstance() .fix private val warnPluginConfig: WarnPluginConfig = testConfig.pluginConfigs - .filterIsInstance() - .single() + .singleIsInstance() .warn private val generalConfig: GeneralConfig = - testConfig.pluginConfigs.filterIsInstance().single() + testConfig.pluginConfigs.singleIsInstance() @Suppress("MISSING_KDOC_CLASS_ELEMENTS") internal lateinit var fixPlugin: FixPlugin diff --git a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt index bf60772ee..a6557920e 100644 --- a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt +++ b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt @@ -20,6 +20,7 @@ import com.saveourtool.save.core.result.TestResult import com.saveourtool.save.core.utils.PathSerializer import com.saveourtool.save.core.utils.ProcessExecutionException import com.saveourtool.save.core.utils.ProcessTimeoutException +import com.saveourtool.save.core.utils.singleIsInstance import io.github.petertrr.diffutils.diff import io.github.petertrr.diffutils.patch.ChangeDelta @@ -69,8 +70,8 @@ class FixPlugin( @Suppress("TOO_LONG_FUNCTION") override fun handleFiles(files: Sequence): Sequence { testConfig.validateAndSetDefaults() - val fixPluginConfig = testConfig.pluginConfigs.filterIsInstance().single() - val generalConfig = testConfig.pluginConfigs.filterIsInstance().single() + val fixPluginConfig = testConfig.pluginConfigs.singleIsInstance() + val generalConfig = testConfig.pluginConfigs.singleIsInstance() extraFlagsExtractor = ExtraFlagsExtractor(generalConfig, fs) val evaluatedToolConfig = testConfig.evaluatedToolConfig diff --git a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt index 6660de4f0..2cba159d3 100644 --- a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt +++ b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt @@ -16,10 +16,7 @@ import com.saveourtool.save.core.plugin.Plugin import com.saveourtool.save.core.result.DebugInfo import com.saveourtool.save.core.result.Fail import com.saveourtool.save.core.result.TestResult -import com.saveourtool.save.core.utils.ExecutionResult -import com.saveourtool.save.core.utils.ProcessExecutionException -import com.saveourtool.save.core.utils.ProcessTimeoutException -import com.saveourtool.save.core.utils.SarifParsingException +import com.saveourtool.save.core.utils.* import com.saveourtool.save.plugin.warn.sarif.toWarnings import com.saveourtool.save.plugin.warn.utils.CmdExecutorWarn import com.saveourtool.save.plugin.warn.utils.ResultsChecker @@ -63,8 +60,8 @@ class WarnPlugin( override fun handleFiles(files: Sequence): Sequence { testConfig.validateAndSetDefaults() - val warnPluginConfig = testConfig.pluginConfigs.filterIsInstance().single() - val generalConfig = testConfig.pluginConfigs.filterIsInstance().single() + val warnPluginConfig = testConfig.pluginConfigs.singleIsInstance() + val generalConfig = testConfig.pluginConfigs.singleIsInstance() extraFlagsExtractor = ExtraFlagsExtractor(generalConfig, fs) // Special trick to handle cases when tested tool is able to process directories. @@ -81,7 +78,7 @@ class WarnPlugin( } override fun rawDiscoverTestFiles(resourceDirectories: Sequence): Sequence { - val warnPluginConfig = testConfig.pluginConfigs.filterIsInstance().single() + val warnPluginConfig = testConfig.pluginConfigs.singleIsInstance() val regex = warnPluginConfig.resourceNamePattern // returned sequence is a sequence of groups of size 1 return resourceDirectories.flatMap { directory -> From d821439c476b954e6a243ba4cb9b480ead01010c Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 14:59:07 +0300 Subject: [PATCH 06/19] renamed fields back --- .../saveourtool/save/core/MergeConfigsTest.kt | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt index bf696d992..f7ba3b624 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt @@ -48,34 +48,34 @@ class MergeConfigsTest { @Test fun `merge general configs`() { - val parent = mutableListOf(generalConfig1) - val child = mutableListOf(generalConfig2) + val config1 = mutableListOf(generalConfig1) + val config2 = mutableListOf(generalConfig2) - child.mergeWith(parent) + config2.mergeWith(config1) - assertEquals(1, child.size) + assertEquals(1, config2.size) val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - val actualGeneralConfig = child.singleIsInstance() + val actualGeneralConfig = config2.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) } @Test fun `merge two incomplete configs`() { - val parent = mutableListOf(generalConfig1, warnConfig1) - val child = mutableListOf(generalConfig2) + val config1 = mutableListOf(generalConfig1, warnConfig1) + val config2 = mutableListOf(generalConfig2) - child.mergeWith(parent) + config2.mergeWith(config1) - assertEquals(2, child.size) + assertEquals(2, config2.size) val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - val actualGeneralConfig = child.singleIsInstance() - val actualWarnConfig = child.singleIsInstance() + val actualGeneralConfig = config2.singleIsInstance() + val actualWarnConfig = config2.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(warnConfig1, actualWarnConfig) @@ -83,15 +83,15 @@ class MergeConfigsTest { @Test fun `merge two incomplete configs 2`() { - val parent = mutableListOf() - val child = mutableListOf(generalConfig2, warnConfig1) + val config1 = mutableListOf() + val config2 = mutableListOf(generalConfig2, warnConfig1) - child.mergeWith(parent) + config2.mergeWith(config1) - assertEquals(2, child.size) + assertEquals(2, config2.size) - val actualGeneralConfig = child.singleIsInstance() - val actualWarnConfig = child.singleIsInstance() + val actualGeneralConfig = config2.singleIsInstance() + val actualWarnConfig = config2.singleIsInstance() assertEquals(generalConfig2, actualGeneralConfig) assertEquals(warnConfig1, actualWarnConfig) @@ -99,12 +99,12 @@ class MergeConfigsTest { @Test fun `merge two configs with different fields`() { - val parent = mutableListOf(generalConfig1, warnConfig2, fixConfig1) - val child = mutableListOf(generalConfig2, warnConfig3, fixConfig2) + val config1 = mutableListOf(generalConfig1, warnConfig2, fixConfig1) + val config2 = mutableListOf(generalConfig2, warnConfig3, fixConfig2) - child.mergeWith(parent) + config2.mergeWith(config1) - assertEquals(3, child.size) + assertEquals(3, config2.size) val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) @@ -112,9 +112,9 @@ class MergeConfigsTest { true, false, 3, 3, 3, 1, 1, 3, 3, 3, 3, true, null) val expectedFixConfig = FixPluginConfig("fixCmd2", "Suffix") - val actualGeneralConfig = child.singleIsInstance() - val actualWarnConfig = child.singleIsInstance() - val actualFixConfig = child.singleIsInstance() + val actualGeneralConfig = config2.singleIsInstance() + val actualWarnConfig = config2.singleIsInstance() + val actualFixConfig = config2.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(expectedWarnConfig, actualWarnConfig) From 38a1c8775b20f85636a65c9c73d68f6f20cd3a39 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 15:58:42 +0300 Subject: [PATCH 07/19] added test for override --- .../save/core/MergeAndOverrideConfigsTest.kt | 327 ++++++++++++++++++ ...eConfigsTest.kt => OverrideConfigsTest.kt} | 7 +- .../override_configs/save-overrides.toml | 8 + .../resources/override_configs/save.toml | 8 + 4 files changed, 347 insertions(+), 3 deletions(-) create mode 100644 save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt rename save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/{MergeConfigsTest.kt => OverrideConfigsTest.kt} (98%) create mode 100644 save-core/src/commonNonJsTest/resources/override_configs/save-overrides.toml create mode 100644 save-core/src/commonNonJsTest/resources/override_configs/save.toml diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt new file mode 100644 index 000000000..fe7dbcaee --- /dev/null +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -0,0 +1,327 @@ +package com.saveourtool.save.core + +import com.saveourtool.save.core.config.EvaluatedToolConfig +import com.saveourtool.save.core.config.TestConfig +import com.saveourtool.save.core.config.resolveSaveOverridesTomlConfig +import com.saveourtool.save.core.config.resolveSaveTomlConfig +import com.saveourtool.save.core.files.fs +import com.saveourtool.save.core.plugin.GeneralConfig +import com.saveourtool.save.core.plugin.PluginConfig +import com.saveourtool.save.core.utils.createPluginConfigListFromToml +import com.saveourtool.save.core.utils.mergeWith +import com.saveourtool.save.core.utils.overrideBy +import com.saveourtool.save.core.utils.singleIsInstance +import com.saveourtool.save.plugin.warn.WarnPluginConfig +import com.saveourtool.save.plugins.fix.FixPluginConfig + +import okio.Path.Companion.toPath + +import kotlin.test.Test +import kotlin.test.assertEquals + +@Suppress( + "TOO_LONG_FUNCTION", + "LOCAL_VARIABLE_EARLY_DECLARATION", + "LONG_LINE", +) +class MergeAndOverrideConfigsTest { + private val extraFlagsPattern1 = Regex("// RUN: (.*)") + private val extraFlagsPattern2 = Regex("## RUN: (.*)") + private val generalConfig1 = GeneralConfig("", listOf("Tag11", "Tag12"), "Description1", "suiteName1", "Kotlin", listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2) + private val generalConfig2 = GeneralConfig("", listOf("Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) + private val generalConfig3 = GeneralConfig("", listOf("Tag21", "Tag31", "Tag32"), "Description2", "suiteName3", "Kotlin", listOf("excludedTests: test5", "includedTests: test6"), runConfigPattern = extraFlagsPattern2) + private val generalConfig4 = GeneralConfig("", listOf("Tag11", "Tag21"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) + private val warningsOutputPattern1 = Regex(".*") + private val warningsOutputPattern2 = Regex("\\w+ - (\\d+)/(\\d+) - (.*)$") + private val warnConfig1 = WarnPluginConfig("execCmd1", warningsOutputPattern2, + false, false, 1, 1, 1, 1, 1, 1, 1, 1, 1, false, null) + private val warnConfig2 = WarnPluginConfig("execCmd2", warningsOutputPattern1, + true, true, 2, 2, 2, 1, 1, 2, 2, 2, 2, true, null) + private val warnConfig3 = WarnPluginConfig("execCmd3", warningsOutputPattern2, + warningTextHasColumn = false, lineCaptureGroup = 3, columnCaptureGroup = 3, messageCaptureGroup = 3, + fileNameCaptureGroupOut = 3, lineCaptureGroupOut = 3, columnCaptureGroupOut = 3, messageCaptureGroupOut = 3) + private val warnConfig4 = WarnPluginConfig("execCmd4", warningsOutputPattern2, + lineCaptureGroup = 4, columnCaptureGroup = 4, messageCaptureGroup = 4, + fileNameCaptureGroupOut = 4, lineCaptureGroupOut = 4, columnCaptureGroupOut = 4, messageCaptureGroupOut = 4) + private val fixConfig1 = FixPluginConfig("fixCmd1", "Suffix") + private val fixConfig2 = FixPluginConfig("fixCmd2") + private val fixConfig3 = FixPluginConfig("fixCmd3", null) + private val fixConfig4 = FixPluginConfig("fixCmd4") + + @Test + fun `merge and override general configs`() { + val config1 = listOf(generalConfig1) + + val config2ForMerge = mutableListOf(generalConfig2) + config2ForMerge.mergeWith(config1) + assertEquals(1, config2ForMerge.size) + assertEquals( + GeneralConfig( + execCmd = "", + tags = listOf("Tag11", "Tag12", "Tag21"), + description = "Description2", + suiteName = "suiteName2", + language = "Kotlin", + excludedTests = listOf("excludedTests: test3"), + runConfigPattern = extraFlagsPattern1 + ), + config2ForMerge.singleIsInstance() + ) + + val config2ForOverride = mutableListOf(generalConfig2) + config2ForOverride.overrideBy(config1) + assertEquals(1, config2ForOverride.size) + assertEquals( + GeneralConfig( + execCmd = "", + tags = listOf("Tag21", "Tag11", "Tag12"), + description = "Description1", + suiteName = "suiteName1", + language = "Kotlin", + excludedTests = listOf("excludedTests: test1"), + runConfigPattern = extraFlagsPattern2 + ), + config2ForOverride.singleIsInstance() + ) + } + + @Test + fun `merge and override two incomplete configs`() { + val config1 = listOf(generalConfig1, warnConfig1) + + val config2ForMerge = mutableListOf(generalConfig2) + config2ForMerge.mergeWith(config1) + assertEquals(2, config2ForMerge.size) + assertEquals( + GeneralConfig( + execCmd = "", + tags = listOf("Tag11", "Tag12", "Tag21"), + description = "Description2", + suiteName = "suiteName2", + language = "Kotlin", + excludedTests = listOf("excludedTests: test3"), + runConfigPattern = extraFlagsPattern1 + ), + config2ForMerge.singleIsInstance() + ) + assertEquals(warnConfig1, config2ForMerge.singleIsInstance()) + + val config2ForOverride = mutableListOf(generalConfig2) + config2ForOverride.overrideBy(config1) + assertEquals(2, config2ForOverride.size) + assertEquals( + GeneralConfig( + execCmd = "", + tags = listOf("Tag21", "Tag11", "Tag12"), + description = "Description1", + suiteName = "suiteName1", + language = "Kotlin", + excludedTests = listOf("excludedTests: test1"), + runConfigPattern = extraFlagsPattern2 + ), + config2ForOverride.singleIsInstance() + ) + assertEquals(warnConfig1, config2ForOverride.singleIsInstance()) + } + + @Test + fun `merge and override two incomplete configs 2`() { + val config1 = listOf() + + val config2ForMerge = mutableListOf(generalConfig2, warnConfig1) + config2ForMerge.mergeWith(config1) + assertEquals(2, config2ForMerge.size) + assertEquals(generalConfig2, config2ForMerge.singleIsInstance()) + assertEquals(warnConfig1, config2ForMerge.singleIsInstance()) + + val config2ForOverride = mutableListOf(generalConfig2, warnConfig1) + config2ForOverride.overrideBy(config1) + assertEquals(2, config2ForOverride.size) + assertEquals(generalConfig2, config2ForOverride.singleIsInstance()) + assertEquals(warnConfig1, config2ForOverride.singleIsInstance()) + } + + @Test + fun `merge and override two configs with different fields`() { + val config1 = listOf(generalConfig1, warnConfig2, fixConfig1) + + val config2ForMerge = mutableListOf(generalConfig2, warnConfig3, fixConfig2) + config2ForMerge.mergeWith(config1) + assertEquals(3, config2ForMerge.size) + assertEquals( + GeneralConfig( + execCmd = "", + tags = listOf("Tag11", "Tag12", "Tag21"), + description = "Description2", + suiteName = "suiteName2", + language = "Kotlin", + excludedTests = listOf("excludedTests: test3"), + runConfigPattern = extraFlagsPattern1 + ), + config2ForMerge.singleIsInstance() + ) + assertEquals( + WarnPluginConfig( + execFlags = "execCmd3", + actualWarningsPattern = warningsOutputPattern2, + warningTextHasLine = true, + warningTextHasColumn = false, + lineCaptureGroup = 3, + columnCaptureGroup = 3, + messageCaptureGroup = 3, + messageCaptureGroupMiddle = 1, + messageCaptureGroupEnd = 1, + fileNameCaptureGroupOut = 3, + lineCaptureGroupOut = 3, + columnCaptureGroupOut = 3, + messageCaptureGroupOut = 3, + exactWarningsMatch = true, + testNameRegex = null + ), + config2ForMerge.singleIsInstance() + ) + assertEquals( + FixPluginConfig("fixCmd2", "Suffix"), + config2ForMerge.singleIsInstance()) + + val config2ForOverride = mutableListOf(generalConfig2, warnConfig3, fixConfig2) + config2ForOverride.overrideBy(config1) + assertEquals(3, config2ForOverride.size) + assertEquals( + GeneralConfig( + execCmd = "", + tags = listOf("Tag21", "Tag11", "Tag12"), + description = "Description1", + suiteName = "suiteName1", + language = "Kotlin", + excludedTests = listOf("excludedTests: test1"), + runConfigPattern = extraFlagsPattern2, + ), + config2ForOverride.singleIsInstance() + ) + assertEquals( + WarnPluginConfig( + execFlags = "execCmd2", + actualWarningsPattern = warningsOutputPattern1, + warningTextHasLine = true, + warningTextHasColumn = true, + lineCaptureGroup = 2, + columnCaptureGroup = 2, + messageCaptureGroup = 2, + messageCaptureGroupMiddle = 1, + messageCaptureGroupEnd = 1, + fileNameCaptureGroupOut = 2, + lineCaptureGroupOut = 2, + columnCaptureGroupOut = 2, + messageCaptureGroupOut = 2, + exactWarningsMatch = true, + testNameRegex = null, + ), + config2ForOverride.singleIsInstance() + ) + assertEquals( + FixPluginConfig( + execFlags = "fixCmd1", + resourceNameTestSuffix = "Suffix", + ), + config2ForOverride.singleIsInstance()) + } + + @Test + fun `merge configs with many parents`() { + val config1 = mutableListOf(generalConfig1, warnConfig1, fixConfig1) + val config2 = mutableListOf(generalConfig2, warnConfig2, fixConfig2) + val config3 = mutableListOf(generalConfig3, warnConfig3, fixConfig3) + val config4 = mutableListOf(generalConfig4, warnConfig4, fixConfig4) + + config1.mergeWith(emptyList()) + config2.mergeWith(config1) + config3.mergeWith(config2) + config4.mergeWith(config3) + + assertEquals(3, config4.size) + val expectedGeneralConfig = + GeneralConfig("", listOf("Tag11", "Tag12", "Tag21", "Tag31", "Tag32"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) + val expectedWarnConfig = WarnPluginConfig("execCmd4", warningsOutputPattern2, + true, false, 4, 4, 4, 1, 1, 4, 4, 4, 4, true, null) + val expectedFixConfig = FixPluginConfig("fixCmd4", "Suffix") + + val actualGeneralConfig = config4.singleIsInstance() + val actualWarnConfig = config4.singleIsInstance() + val actualFixConfig = config4.singleIsInstance() + + assertEquals(expectedGeneralConfig, actualGeneralConfig) + assertEquals(expectedWarnConfig, actualWarnConfig) + assertEquals(expectedFixConfig, actualFixConfig) + } + + @Test + fun `merge real toml configs with empty execFlag in child`() { + val evaluatedToolConfig = EvaluatedToolConfig(1, "") + + val toml1 = "src/commonNonJsTest/resources/merge_configs/save.toml" + val configList1 = createPluginConfigListFromToml(toml1.toPath(), fs) + + val parentGeneralConfig = configList1.singleIsInstance() + val parentWarnConfig = configList1.singleIsInstance() + assertEquals("echo hello world", parentGeneralConfig.execCmd) + assertEquals(listOf("Tag"), parentGeneralConfig.tags) + assertEquals(null, parentWarnConfig.execFlags) + + val toml2 = "src/commonNonJsTest/resources/merge_configs/inner/save.toml" + val configList2 = createPluginConfigListFromToml(toml2.toPath(), fs) + + val childGeneralConfig = configList2.singleIsInstance() + val childWarnConfig = configList2.singleIsInstance() + + assertEquals(listOf(""), childGeneralConfig.tags) + assertEquals(null, childWarnConfig.execFlags) + + val testConfig1 = TestConfig(toml1.toPath(), null, evaluatedToolConfig, configList1.toMutableList(), emptyList(), fs) + val testConfig2 = TestConfig(toml2.toPath(), testConfig1, evaluatedToolConfig, configList2.toMutableList(), emptyList(), fs) + + val mergedTestConfig = testConfig2.mergeConfigWithParent() + testConfig2.validateAndSetDefaults() + + val mergedGeneralConfig = mergedTestConfig.pluginConfigs.singleIsInstance() + val mergedWarnConfig = mergedTestConfig.pluginConfigs.singleIsInstance() + + assertEquals(listOf("Tag", ""), mergedGeneralConfig.tags) + // execFlags should be empty, not `"null"` + assertEquals("", mergedWarnConfig.execFlags) + } + + @Test + fun `override real toml configs`() { + val saveToml = "src/commonNonJsTest/resources/override_configs".toPath().resolveSaveTomlConfig() + val configs = createPluginConfigListFromToml(saveToml, fs) + + val saveOverridesToml = "src/commonNonJsTest/resources/override_configs".toPath().resolveSaveOverridesTomlConfig() + val overrides = createPluginConfigListFromToml(saveOverridesToml, fs) + + val result = configs.toMutableList() + result.overrideBy(overrides) + assertEquals(3, result.size) + + assertEquals( + GeneralConfig( + execCmd = "java -jar tool.jar", + tags = listOf("Tag"), + description = "My description", + suiteName = "DocsCheck", + ), + result.singleIsInstance() + ) + assertEquals( + WarnPluginConfig( + execFlags = "--warn", + ), + result.singleIsInstance() + ) + assertEquals( + FixPluginConfig( + execFlags = "--fix", + ), + result.singleIsInstance()) + } +} diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt similarity index 98% rename from save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt rename to save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt index f7ba3b624..cca91be02 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt @@ -7,6 +7,7 @@ import com.saveourtool.save.core.plugin.GeneralConfig import com.saveourtool.save.core.plugin.PluginConfig import com.saveourtool.save.core.utils.createPluginConfigListFromToml import com.saveourtool.save.core.utils.mergeWith +import com.saveourtool.save.core.utils.overrideBy import com.saveourtool.save.core.utils.singleIsInstance import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPluginConfig @@ -21,7 +22,7 @@ import kotlin.test.assertEquals "LOCAL_VARIABLE_EARLY_DECLARATION", "LONG_LINE", ) -class MergeConfigsTest { +class OverrideConfigsTest { private val extraFlagsPattern1 = Regex("// RUN: (.*)") private val extraFlagsPattern2 = Regex("## RUN: (.*)") private val generalConfig1 = GeneralConfig("", listOf("Tag11", "Tag12"), "Description1", "suiteName1", "Kotlin", listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2) @@ -47,11 +48,11 @@ class MergeConfigsTest { private val evaluatedToolConfig = EvaluatedToolConfig(1, "") @Test - fun `merge general configs`() { + fun `override general configs`() { val config1 = mutableListOf(generalConfig1) val config2 = mutableListOf(generalConfig2) - config2.mergeWith(config1) + config2.overrideBy(config1) assertEquals(1, config2.size) diff --git a/save-core/src/commonNonJsTest/resources/override_configs/save-overrides.toml b/save-core/src/commonNonJsTest/resources/override_configs/save-overrides.toml new file mode 100644 index 000000000..a301cbd44 --- /dev/null +++ b/save-core/src/commonNonJsTest/resources/override_configs/save-overrides.toml @@ -0,0 +1,8 @@ +[general] +execCmd = "java -jar tool.jar" + +[fix] +execFlags = "--fix" + +[warn] +execFlags = "--warn" \ No newline at end of file diff --git a/save-core/src/commonNonJsTest/resources/override_configs/save.toml b/save-core/src/commonNonJsTest/resources/override_configs/save.toml new file mode 100644 index 000000000..536c7280e --- /dev/null +++ b/save-core/src/commonNonJsTest/resources/override_configs/save.toml @@ -0,0 +1,8 @@ +[general] +execCmd = "echo hello world" +tags = ["Tag"] +description = "My description" +suiteName = "DocsCheck" + +[warn] + From 3ba8c07391a438232145dfd46894a181d895da3c Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 16:17:58 +0300 Subject: [PATCH 08/19] diktatFix --- .../save/cli/config/SavePropertiesExt.kt | 1 - .../save/core/config/TestConfig.kt | 3 +- .../save/core/utils/PluginConfigUtils.kt | 24 +++---- .../save/core/MergeAndOverrideConfigsTest.kt | 66 +++++++++---------- .../save/core/OverrideConfigsTest.kt | 40 +++++------ .../saveourtool/save/core/ValidationTest.kt | 28 ++++---- .../saveourtool/save/plugins/fix/FixPlugin.kt | 4 +- .../save/plugin/warn/WarnPlugin.kt | 12 ++-- 8 files changed, 91 insertions(+), 87 deletions(-) diff --git a/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt b/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt index 1d41191ba..8ef36b4bd 100644 --- a/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt +++ b/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt @@ -7,7 +7,6 @@ package com.saveourtool.save.cli.config import com.saveourtool.save.cli.ExitCodes import com.saveourtool.save.cli.fs import com.saveourtool.save.cli.logging.logErrorAndExit -import com.saveourtool.save.cli.logging.logWarn import com.saveourtool.save.core.config.SaveProperties import com.saveourtool.save.core.config.resolveSaveTomlConfig import com.saveourtool.save.core.logging.logDebug diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index d45435578..f8f9ffb0b 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -10,13 +10,14 @@ import com.saveourtool.save.core.logging.logTrace import com.saveourtool.save.core.plugin.GeneralConfig import com.saveourtool.save.core.plugin.Plugin import com.saveourtool.save.core.plugin.PluginConfig -import com.saveourtool.save.core.utils.singleIsInstanceOrNull import com.saveourtool.save.core.utils.mergeWith import com.saveourtool.save.core.utils.overrideBy +import com.saveourtool.save.core.utils.singleIsInstanceOrNull import okio.FileSystem import okio.Path import okio.Path.Companion.toPath + import kotlin.js.JsName /** diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/PluginConfigUtils.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/PluginConfigUtils.kt index 16be40244..0b556a27d 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/PluginConfigUtils.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/PluginConfigUtils.kt @@ -36,6 +36,18 @@ fun MutableList.overrideBy(otherPluginConfigs: List) } } +/** + * @return a single [PluginConfig] with type [P] from current list + */ +inline fun List.singleIsInstance(): P = requireNotNull(this.singleIsInstanceOrNull()) { + "Not found an element with type ${P::class}" +} + +/** + * @return a single [PluginConfig] with type [P] from current list or null + */ +inline fun List.singleIsInstanceOrNull(): P? = this.filterIsInstance

().singleOrNull() + private fun MutableList.mergeOrOverride(otherPluginConfig: PluginConfig, merge: Boolean = true) { val childConfigsWithIndex = this.withIndex().filter { (_, value) -> value.type == otherPluginConfig.type } if (childConfigsWithIndex.isEmpty()) { @@ -58,15 +70,3 @@ private fun MutableList.mergeOrOverride(otherPluginConfig: PluginC } } } - -/** - * @return a single [PluginConfig] with type [P] from current list - */ -inline fun List.singleIsInstance() = requireNotNull(this.singleIsInstanceOrNull

()) { - "Not found an element with type ${P::class}" -} - -/** - * @return a single [PluginConfig] with type [P] from current list or null - */ -inline fun List.singleIsInstanceOrNull() = this.filterIsInstance

().singleOrNull() diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt index fe7dbcaee..ce15ab601 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -52,7 +52,7 @@ class MergeAndOverrideConfigsTest { fun `merge and override general configs`() { val config1 = listOf(generalConfig1) - val config2ForMerge = mutableListOf(generalConfig2) + val config2ForMerge: MutableList = mutableListOf(generalConfig2) config2ForMerge.mergeWith(config1) assertEquals(1, config2ForMerge.size) assertEquals( @@ -65,10 +65,10 @@ class MergeAndOverrideConfigsTest { excludedTests = listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1 ), - config2ForMerge.singleIsInstance() + config2ForMerge.singleIsInstance() ) - val config2ForOverride = mutableListOf(generalConfig2) + val config2ForOverride: MutableList = mutableListOf(generalConfig2) config2ForOverride.overrideBy(config1) assertEquals(1, config2ForOverride.size) assertEquals( @@ -81,7 +81,7 @@ class MergeAndOverrideConfigsTest { excludedTests = listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2 ), - config2ForOverride.singleIsInstance() + config2ForOverride.singleIsInstance() ) } @@ -89,7 +89,7 @@ class MergeAndOverrideConfigsTest { fun `merge and override two incomplete configs`() { val config1 = listOf(generalConfig1, warnConfig1) - val config2ForMerge = mutableListOf(generalConfig2) + val config2ForMerge: MutableList = mutableListOf(generalConfig2) config2ForMerge.mergeWith(config1) assertEquals(2, config2ForMerge.size) assertEquals( @@ -102,11 +102,11 @@ class MergeAndOverrideConfigsTest { excludedTests = listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1 ), - config2ForMerge.singleIsInstance() + config2ForMerge.singleIsInstance() ) - assertEquals(warnConfig1, config2ForMerge.singleIsInstance()) + assertEquals(warnConfig1, config2ForMerge.singleIsInstance()) - val config2ForOverride = mutableListOf(generalConfig2) + val config2ForOverride: MutableList = mutableListOf(generalConfig2) config2ForOverride.overrideBy(config1) assertEquals(2, config2ForOverride.size) assertEquals( @@ -119,26 +119,26 @@ class MergeAndOverrideConfigsTest { excludedTests = listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2 ), - config2ForOverride.singleIsInstance() + config2ForOverride.singleIsInstance() ) - assertEquals(warnConfig1, config2ForOverride.singleIsInstance()) + assertEquals(warnConfig1, config2ForOverride.singleIsInstance()) } @Test fun `merge and override two incomplete configs 2`() { - val config1 = listOf() + val config1: List = emptyList() val config2ForMerge = mutableListOf(generalConfig2, warnConfig1) config2ForMerge.mergeWith(config1) assertEquals(2, config2ForMerge.size) - assertEquals(generalConfig2, config2ForMerge.singleIsInstance()) - assertEquals(warnConfig1, config2ForMerge.singleIsInstance()) + assertEquals(generalConfig2, config2ForMerge.singleIsInstance()) + assertEquals(warnConfig1, config2ForMerge.singleIsInstance()) val config2ForOverride = mutableListOf(generalConfig2, warnConfig1) config2ForOverride.overrideBy(config1) assertEquals(2, config2ForOverride.size) - assertEquals(generalConfig2, config2ForOverride.singleIsInstance()) - assertEquals(warnConfig1, config2ForOverride.singleIsInstance()) + assertEquals(generalConfig2, config2ForOverride.singleIsInstance()) + assertEquals(warnConfig1, config2ForOverride.singleIsInstance()) } @Test @@ -158,7 +158,7 @@ class MergeAndOverrideConfigsTest { excludedTests = listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1 ), - config2ForMerge.singleIsInstance() + config2ForMerge.singleIsInstance() ) assertEquals( WarnPluginConfig( @@ -178,11 +178,11 @@ class MergeAndOverrideConfigsTest { exactWarningsMatch = true, testNameRegex = null ), - config2ForMerge.singleIsInstance() + config2ForMerge.singleIsInstance() ) assertEquals( FixPluginConfig("fixCmd2", "Suffix"), - config2ForMerge.singleIsInstance()) + config2ForMerge.singleIsInstance()) val config2ForOverride = mutableListOf(generalConfig2, warnConfig3, fixConfig2) config2ForOverride.overrideBy(config1) @@ -197,7 +197,7 @@ class MergeAndOverrideConfigsTest { excludedTests = listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2, ), - config2ForOverride.singleIsInstance() + config2ForOverride.singleIsInstance() ) assertEquals( WarnPluginConfig( @@ -217,14 +217,14 @@ class MergeAndOverrideConfigsTest { exactWarningsMatch = true, testNameRegex = null, ), - config2ForOverride.singleIsInstance() + config2ForOverride.singleIsInstance() ) assertEquals( FixPluginConfig( execFlags = "fixCmd1", resourceNameTestSuffix = "Suffix", ), - config2ForOverride.singleIsInstance()) + config2ForOverride.singleIsInstance()) } @Test @@ -246,9 +246,9 @@ class MergeAndOverrideConfigsTest { true, false, 4, 4, 4, 1, 1, 4, 4, 4, 4, true, null) val expectedFixConfig = FixPluginConfig("fixCmd4", "Suffix") - val actualGeneralConfig = config4.singleIsInstance() - val actualWarnConfig = config4.singleIsInstance() - val actualFixConfig = config4.singleIsInstance() + val actualGeneralConfig: GeneralConfig = config4.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config4.singleIsInstance() + val actualFixConfig: FixPluginConfig = config4.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(expectedWarnConfig, actualWarnConfig) @@ -262,8 +262,8 @@ class MergeAndOverrideConfigsTest { val toml1 = "src/commonNonJsTest/resources/merge_configs/save.toml" val configList1 = createPluginConfigListFromToml(toml1.toPath(), fs) - val parentGeneralConfig = configList1.singleIsInstance() - val parentWarnConfig = configList1.singleIsInstance() + val parentGeneralConfig: GeneralConfig = configList1.singleIsInstance() + val parentWarnConfig: WarnPluginConfig = configList1.singleIsInstance() assertEquals("echo hello world", parentGeneralConfig.execCmd) assertEquals(listOf("Tag"), parentGeneralConfig.tags) assertEquals(null, parentWarnConfig.execFlags) @@ -271,8 +271,8 @@ class MergeAndOverrideConfigsTest { val toml2 = "src/commonNonJsTest/resources/merge_configs/inner/save.toml" val configList2 = createPluginConfigListFromToml(toml2.toPath(), fs) - val childGeneralConfig = configList2.singleIsInstance() - val childWarnConfig = configList2.singleIsInstance() + val childGeneralConfig: GeneralConfig = configList2.singleIsInstance() + val childWarnConfig: WarnPluginConfig = configList2.singleIsInstance() assertEquals(listOf(""), childGeneralConfig.tags) assertEquals(null, childWarnConfig.execFlags) @@ -283,8 +283,8 @@ class MergeAndOverrideConfigsTest { val mergedTestConfig = testConfig2.mergeConfigWithParent() testConfig2.validateAndSetDefaults() - val mergedGeneralConfig = mergedTestConfig.pluginConfigs.singleIsInstance() - val mergedWarnConfig = mergedTestConfig.pluginConfigs.singleIsInstance() + val mergedGeneralConfig: GeneralConfig = mergedTestConfig.pluginConfigs.singleIsInstance() + val mergedWarnConfig: WarnPluginConfig = mergedTestConfig.pluginConfigs.singleIsInstance() assertEquals(listOf("Tag", ""), mergedGeneralConfig.tags) // execFlags should be empty, not `"null"` @@ -310,18 +310,18 @@ class MergeAndOverrideConfigsTest { description = "My description", suiteName = "DocsCheck", ), - result.singleIsInstance() + result.singleIsInstance() ) assertEquals( WarnPluginConfig( execFlags = "--warn", ), - result.singleIsInstance() + result.singleIsInstance() ) assertEquals( FixPluginConfig( execFlags = "--fix", ), - result.singleIsInstance()) + result.singleIsInstance()) } } diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt index cca91be02..90eb1b133 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt @@ -50,7 +50,7 @@ class OverrideConfigsTest { @Test fun `override general configs`() { val config1 = mutableListOf(generalConfig1) - val config2 = mutableListOf(generalConfig2) + val config2: MutableList = mutableListOf(generalConfig2) config2.overrideBy(config1) @@ -59,14 +59,14 @@ class OverrideConfigsTest { val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - val actualGeneralConfig = config2.singleIsInstance() + val actualGeneralConfig: GeneralConfig = config2.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) } @Test fun `merge two incomplete configs`() { val config1 = mutableListOf(generalConfig1, warnConfig1) - val config2 = mutableListOf(generalConfig2) + val config2: MutableList = mutableListOf(generalConfig2) config2.mergeWith(config1) @@ -75,8 +75,8 @@ class OverrideConfigsTest { val expectedGeneralConfig = GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - val actualGeneralConfig = config2.singleIsInstance() - val actualWarnConfig = config2.singleIsInstance() + val actualGeneralConfig: GeneralConfig = config2.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config2.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(warnConfig1, actualWarnConfig) @@ -84,15 +84,15 @@ class OverrideConfigsTest { @Test fun `merge two incomplete configs 2`() { - val config1 = mutableListOf() + val config1: List = emptyList() val config2 = mutableListOf(generalConfig2, warnConfig1) config2.mergeWith(config1) assertEquals(2, config2.size) - val actualGeneralConfig = config2.singleIsInstance() - val actualWarnConfig = config2.singleIsInstance() + val actualGeneralConfig: GeneralConfig = config2.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config2.singleIsInstance() assertEquals(generalConfig2, actualGeneralConfig) assertEquals(warnConfig1, actualWarnConfig) @@ -113,9 +113,9 @@ class OverrideConfigsTest { true, false, 3, 3, 3, 1, 1, 3, 3, 3, 3, true, null) val expectedFixConfig = FixPluginConfig("fixCmd2", "Suffix") - val actualGeneralConfig = config2.singleIsInstance() - val actualWarnConfig = config2.singleIsInstance() - val actualFixConfig = config2.singleIsInstance() + val actualGeneralConfig: GeneralConfig = config2.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config2.singleIsInstance() + val actualFixConfig: FixPluginConfig = config2.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(expectedWarnConfig, actualWarnConfig) @@ -141,9 +141,9 @@ class OverrideConfigsTest { true, false, 4, 4, 4, 1, 1, 4, 4, 4, 4, true, null) val expectedFixConfig = FixPluginConfig("fixCmd4", "Suffix") - val actualGeneralConfig = config4.singleIsInstance() - val actualWarnConfig = config4.singleIsInstance() - val actualFixConfig = config4.singleIsInstance() + val actualGeneralConfig: GeneralConfig = config4.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config4.singleIsInstance() + val actualFixConfig: FixPluginConfig = config4.singleIsInstance() assertEquals(expectedGeneralConfig, actualGeneralConfig) assertEquals(expectedWarnConfig, actualWarnConfig) @@ -155,8 +155,8 @@ class OverrideConfigsTest { val toml1 = "src/commonNonJsTest/resources/merge_configs/save.toml" val configList1 = createPluginConfigListFromToml(toml1.toPath(), fs) - val parentGeneralConfig = configList1.singleIsInstance() - val parentWarnConfig = configList1.singleIsInstance() + val parentGeneralConfig: GeneralConfig = configList1.singleIsInstance() + val parentWarnConfig: WarnPluginConfig = configList1.singleIsInstance() assertEquals("echo hello world", parentGeneralConfig.execCmd) assertEquals(listOf("Tag"), parentGeneralConfig.tags) assertEquals(null, parentWarnConfig.execFlags) @@ -164,8 +164,8 @@ class OverrideConfigsTest { val toml2 = "src/commonNonJsTest/resources/merge_configs/inner/save.toml" val configList2 = createPluginConfigListFromToml(toml2.toPath(), fs) - val childGeneralConfig = configList2.singleIsInstance() - val childWarnConfig = configList2.singleIsInstance() + val childGeneralConfig: GeneralConfig = configList2.singleIsInstance() + val childWarnConfig: WarnPluginConfig = configList2.singleIsInstance() assertEquals(listOf(""), childGeneralConfig.tags) assertEquals(null, childWarnConfig.execFlags) @@ -176,8 +176,8 @@ class OverrideConfigsTest { val mergedTestConfig = testConfig2.mergeConfigWithParent() testConfig2.validateAndSetDefaults() - val mergedGeneralConfig = mergedTestConfig.pluginConfigs.singleIsInstance() - val mergedWarnConfig = mergedTestConfig.pluginConfigs.singleIsInstance() + val mergedGeneralConfig: GeneralConfig = mergedTestConfig.pluginConfigs.singleIsInstance() + val mergedWarnConfig: WarnPluginConfig = mergedTestConfig.pluginConfigs.singleIsInstance() assertEquals(listOf("Tag", ""), mergedGeneralConfig.tags) // execFlags should be empty, not `"null"` diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt index 0a63fe823..235d955ae 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt @@ -18,20 +18,20 @@ class ValidationTest { @Test fun `set defaults to general section`() { val generalConfig = GeneralConfig("exeCmd", tags = listOf("Tag11", "Tag12"), description = "Description1", suiteName = "suiteName1") - val config = mutableListOf(generalConfig) + val config: MutableList = mutableListOf(generalConfig) config.validateAndSetDefaults() assertEquals(1, config.size) - val actualGeneralConfig1 = config.singleIsInstance() + val actualGeneralConfig1: GeneralConfig = config.singleIsInstance() assertEquals(emptyList(), actualGeneralConfig1.excludedTests) } @Test fun `invalid general section`() { val generalConfig = GeneralConfig() - val config = mutableListOf(generalConfig) + val config: MutableList = mutableListOf(generalConfig) generalConfig.configLocation = "./some-path".toPath() try { config.validateAndSetDefaults() @@ -50,13 +50,13 @@ class ValidationTest { @Test fun `set defaults to warn section`() { val warnConfig = WarnPluginConfig(execFlags = "execFlags", messageCaptureGroup = 4) - val config = mutableListOf(warnConfig) + val config: MutableList = mutableListOf(warnConfig) config.validateAndSetDefaults() assertEquals(1, config.size) - val actualWarnConfig = config.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config.singleIsInstance() assertEquals(Regex("(.+):(\\d*):(\\d*): (.+)").toString(), actualWarnConfig.actualWarningsPattern.toString()) assertEquals(true, actualWarnConfig.warningTextHasLine) assertEquals(true, actualWarnConfig.warningTextHasColumn) @@ -76,13 +76,13 @@ class ValidationTest { @Test fun `validate warn section`() { val warnConfig = WarnPluginConfig(execFlags = "execFlags", warningTextHasLine = true, warningTextHasColumn = false) - val config = mutableListOf(warnConfig) + val config: MutableList = mutableListOf(warnConfig) config.validateAndSetDefaults() assertEquals(1, config.size) - val actualWarnConfig = config.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config.singleIsInstance() assertEquals(true, actualWarnConfig.warningTextHasLine) assertEquals(false, actualWarnConfig.warningTextHasColumn) assertEquals(1, actualWarnConfig.lineCaptureGroup) @@ -93,13 +93,13 @@ class ValidationTest { @Test fun `validate warn section 2`() { val warnConfig = WarnPluginConfig(execFlags = "execFlags", warningTextHasLine = false, lineCaptureGroup = 1) - val config = mutableListOf(warnConfig) + val config: MutableList = mutableListOf(warnConfig) config.validateAndSetDefaults() assertEquals(1, config.size) - val actualWarnConfig = config.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config.singleIsInstance() assertEquals(false, actualWarnConfig.warningTextHasLine) assertEquals(true, actualWarnConfig.warningTextHasColumn) assertEquals(null, actualWarnConfig.lineCaptureGroup) @@ -110,13 +110,13 @@ class ValidationTest { @Test fun `validate warn section 3`() { val warnConfig = WarnPluginConfig(execFlags = "execFlags", lineCaptureGroup = 5) - val config = mutableListOf(warnConfig) + val config: MutableList = mutableListOf(warnConfig) config.validateAndSetDefaults() assertEquals(1, config.size) - val actualWarnConfig = config.singleIsInstance() + val actualWarnConfig: WarnPluginConfig = config.singleIsInstance() assertEquals(true, actualWarnConfig.warningTextHasLine) assertEquals(true, actualWarnConfig.warningTextHasColumn) assertEquals(5, actualWarnConfig.lineCaptureGroup) @@ -127,7 +127,7 @@ class ValidationTest { @Test fun `validate warn section 4`() { val warnConfig = WarnPluginConfig(execFlags = "execFlags", lineCaptureGroup = -127) - val config = mutableListOf(warnConfig) + val config: MutableList = mutableListOf(warnConfig) warnConfig.configLocation = "./some-location".toPath() try { config.validateAndSetDefaults() @@ -144,13 +144,13 @@ class ValidationTest { @Test fun `set defaults to fix section`() { val fixConfig = FixPluginConfig(execFlags = "execFlags") - val config = mutableListOf(fixConfig) + val config: MutableList = mutableListOf(fixConfig) config.validateAndSetDefaults() assertEquals(1, config.size) - val actualFixConfig = config.singleIsInstance() + val actualFixConfig: FixPluginConfig = config.singleIsInstance() assertEquals("Test", actualFixConfig.resourceNameTest) assertEquals("Expected", actualFixConfig.resourceNameExpected) } diff --git a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt index a6557920e..82a3bd7ff 100644 --- a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt +++ b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt @@ -70,8 +70,8 @@ class FixPlugin( @Suppress("TOO_LONG_FUNCTION") override fun handleFiles(files: Sequence): Sequence { testConfig.validateAndSetDefaults() - val fixPluginConfig = testConfig.pluginConfigs.singleIsInstance() - val generalConfig = testConfig.pluginConfigs.singleIsInstance() + val fixPluginConfig: FixPluginConfig = testConfig.pluginConfigs.singleIsInstance() + val generalConfig: GeneralConfig = testConfig.pluginConfigs.singleIsInstance() extraFlagsExtractor = ExtraFlagsExtractor(generalConfig, fs) val evaluatedToolConfig = testConfig.evaluatedToolConfig diff --git a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt index 2cba159d3..4a7775986 100644 --- a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt +++ b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt @@ -16,7 +16,11 @@ import com.saveourtool.save.core.plugin.Plugin import com.saveourtool.save.core.result.DebugInfo import com.saveourtool.save.core.result.Fail import com.saveourtool.save.core.result.TestResult -import com.saveourtool.save.core.utils.* +import com.saveourtool.save.core.utils.ExecutionResult +import com.saveourtool.save.core.utils.ProcessExecutionException +import com.saveourtool.save.core.utils.ProcessTimeoutException +import com.saveourtool.save.core.utils.SarifParsingException +import com.saveourtool.save.core.utils.singleIsInstance import com.saveourtool.save.plugin.warn.sarif.toWarnings import com.saveourtool.save.plugin.warn.utils.CmdExecutorWarn import com.saveourtool.save.plugin.warn.utils.ResultsChecker @@ -60,8 +64,8 @@ class WarnPlugin( override fun handleFiles(files: Sequence): Sequence { testConfig.validateAndSetDefaults() - val warnPluginConfig = testConfig.pluginConfigs.singleIsInstance() - val generalConfig = testConfig.pluginConfigs.singleIsInstance() + val warnPluginConfig: WarnPluginConfig = testConfig.pluginConfigs.singleIsInstance() + val generalConfig: GeneralConfig = testConfig.pluginConfigs.singleIsInstance() extraFlagsExtractor = ExtraFlagsExtractor(generalConfig, fs) // Special trick to handle cases when tested tool is able to process directories. @@ -78,7 +82,7 @@ class WarnPlugin( } override fun rawDiscoverTestFiles(resourceDirectories: Sequence): Sequence { - val warnPluginConfig = testConfig.pluginConfigs.singleIsInstance() + val warnPluginConfig: WarnPluginConfig = testConfig.pluginConfigs.singleIsInstance() val regex = warnPluginConfig.resourceNamePattern // returned sequence is a sequence of groups of size 1 return resourceDirectories.flatMap { directory -> From 533d3bd8e895e77c7cd157ae72a7d25c5944eaa7 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 16:51:59 +0300 Subject: [PATCH 09/19] fix test --- .../save/core/config/TestConfig.kt | 2 +- .../save/core/files/FileUtilsTest.kt | 1 - .../fixandwarn/FixAndWarnPluginTest.kt | 6 ++- .../save/plugins/fix/FixPluginTest.kt | 51 +++++++++++++------ .../save/plugin/warn/WarnPluginTest.kt | 15 ++++-- .../warn/sarif/SarifWarningAdapterTest.kt | 0 6 files changed, 51 insertions(+), 24 deletions(-) rename save-plugins/warn-plugin/src/{commonTest => commonNonJsTest}/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt (97%) rename save-plugins/warn-plugin/src/{commonTest => commonNonJsTest}/kotlin/com/saveourtool/save/plugin/warn/sarif/SarifWarningAdapterTest.kt (100%) diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index f8f9ffb0b..28eb5972f 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -86,7 +86,7 @@ data class TestConfig( * * @return [GeneralConfig] or `null` if not found */ - fun getGeneralConfig() = pluginConfigs.singleIsInstanceOrNull() + fun getGeneralConfig(): GeneralConfig? = pluginConfigs.singleIsInstanceOrNull() /** * @param withSelf if true, include this config as the first element of the sequence or start with parent config otherwise diff --git a/save-common/src/commonNonJsTest/kotlin/com/saveourtool/save/core/files/FileUtilsTest.kt b/save-common/src/commonNonJsTest/kotlin/com/saveourtool/save/core/files/FileUtilsTest.kt index e8a4765ba..98e8f0fae 100644 --- a/save-common/src/commonNonJsTest/kotlin/com/saveourtool/save/core/files/FileUtilsTest.kt +++ b/save-common/src/commonNonJsTest/kotlin/com/saveourtool/save/core/files/FileUtilsTest.kt @@ -10,7 +10,6 @@ import kotlin.test.assertEquals import kotlin.test.assertTrue class FileUtilsTest { - private val fs = FileSystem.SYSTEM private lateinit var tmpDir: Path @BeforeTest diff --git a/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt b/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt index 8924b0fbc..ec9785930 100644 --- a/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt +++ b/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt @@ -3,6 +3,7 @@ package com.saveourtool.save.plugins.fixandwarn import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.createFile +import com.saveourtool.save.core.files.fs import com.saveourtool.save.core.plugin.GeneralConfig import com.saveourtool.save.core.result.Pass import com.saveourtool.save.core.utils.isCurrentOsWindows @@ -19,7 +20,6 @@ import kotlin.test.assertEquals import kotlin.test.assertTrue class FixAndWarnPluginTest { - private val fs = FileSystem.SYSTEM private val tmpDir = (FileSystem.SYSTEM_TEMPORARY_DIRECTORY / "${FixAndWarnPluginTest::class.simpleName!!}-${Random.nextInt()}") private val defaultExtraConfigPattern = Regex("(.+):(\\d+):(\\d+): (.+)") @@ -74,6 +74,7 @@ class FixAndWarnPluginTest { TestConfig( config, null, + EvaluatedToolConfig(1, ", "), mutableListOf( FixAndWarnPluginConfig( FixPluginConfig(fixExecutionCmd), @@ -84,13 +85,14 @@ class FixAndWarnPluginTest { ), GeneralConfig("", listOf(""), "", "", expectedWarningsPattern = Regex("// ;warn:(\\d+):(\\d+): (.*)"), runConfigPattern = defaultExtraConfigPattern) ), + emptyList(), fs, ), testFiles = emptyList(), fs, useInternalRedirections = false ) - val results = fixAndWarnPlugin.execute(EvaluatedToolConfig(1, ", ")).toList() + val results = fixAndWarnPlugin.execute().toList() println("Results $results") assertEquals(1, results.count(), "Size of results should equal number of pairs") diff --git a/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt b/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt index 9f0e3542d..4532aec8f 100644 --- a/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt +++ b/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt @@ -77,17 +77,23 @@ class FixPluginTest { val diskWithTmpDir = if (isCurrentOsWindows()) "${tmpDir.toString().substringBefore("\\").lowercase()} && " else "" val executionCmd = "${diskWithTmpDir}cd $tmpDir && echo Expected file >" - val fixPlugin = FixPlugin(TestConfig(config, - null, - mutableListOf( - FixPluginConfig(executionCmd), - GeneralConfig("", listOf(""), "", "") - ), fs), + val fixPlugin = FixPlugin( + TestConfig( + config, + null, + EvaluatedToolConfig(1, ", "), + mutableListOf( + FixPluginConfig(executionCmd), + GeneralConfig("", listOf(""), "", "") + ), + emptyList(), + fs + ), testFiles = emptyList(), fs, useInternalRedirections = false ) - val results = fixPlugin.execute(EvaluatedToolConfig(1, ", ")).toList() + val results = fixPlugin.execute().toList() assertEquals(1, results.size, "Size of results should equal number of pairs") val testResult = results.single() @@ -138,18 +144,24 @@ class FixPluginTest { val fixPluginConfig = FixPluginConfig(executionCmd) - val fixPlugin = FixPlugin(TestConfig(config, - null, - mutableListOf( - fixPluginConfig, - GeneralConfig("", listOf(""), "", "") - ), fs), + val batchSeparator = if (isCurrentOsWindows()) ", " else " " + val fixPlugin = FixPlugin( + TestConfig( + config, + null, + EvaluatedToolConfig(2, batchSeparator), + mutableListOf( + fixPluginConfig, + GeneralConfig("", listOf(""), "", "") + ), + emptyList(), + fs + ), testFiles = emptyList(), fs, useInternalRedirections = false ) - val batchSeparator = if (isCurrentOsWindows()) ", " else " " - val results = fixPlugin.execute(EvaluatedToolConfig(2, batchSeparator)).toList() + val results = fixPlugin.execute().toList() // We call ProcessBuilder ourselves, because the command ">" does not work for the list of files ProcessBuilder(false, fs).exec("echo Expected file > $testFile2", "", null, 10_000L) @@ -167,7 +179,14 @@ class FixPluginTest { } internal fun discoverFilePairs() = FixPlugin( - TestConfig(tmpDir / "save.toml", null, mutableListOf(FixPluginConfig("")), fs), + TestConfig( + tmpDir / "save.toml", + null, + EvaluatedToolConfig(1, ""), + mutableListOf(FixPluginConfig("")), + emptyList(), + fs + ), testFiles = emptyList(), fs, useInternalRedirections = false diff --git a/save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt b/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt similarity index 97% rename from save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt rename to save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt index 669830cdd..5e8b43c79 100644 --- a/save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt +++ b/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt @@ -3,6 +3,7 @@ package com.saveourtool.save.plugin.warn import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.createFile +import com.saveourtool.save.core.files.fs import com.saveourtool.save.core.plugin.GeneralConfig import com.saveourtool.save.core.plugin.ResourceFormatException import com.saveourtool.save.core.result.Pass @@ -21,7 +22,6 @@ import kotlin.test.assertFailsWith import kotlin.test.assertTrue class WarnPluginTest { - private val fs = FileSystem.SYSTEM private val tmpDir = (FileSystem.SYSTEM_TEMPORARY_DIRECTORY / WarnPluginTest::class.simpleName!!) private val catCmd = if (isCurrentOsWindows()) "type" else "cat" private val mockScriptFile = tmpDir / "resource" @@ -199,7 +199,7 @@ class WarnPluginTest { assertEquals(1, results.size) assertTrue(results.single().status is Pass) val nameWarn = - "(UNEXPECTED WARNINGS): [Warning(message=Variable name should be in lowerCamelCase, line=5, column=8, fileName=Test1Test.java)]" + "(UNEXPECTED WARNINGS): [Warning(message=Variable name should be in lowerCamelCase, line=5, column=8, fileName=Test1Test.java)]" assertEquals(nameWarn, (results.single().status as Pass).message) } } @@ -424,11 +424,18 @@ class WarnPluginTest { } val results = WarnPlugin( - TestConfig(config, null, mutableListOf(warnPluginConfig, generalConfig), fs), + TestConfig( + config, + null, + EvaluatedToolConfig(batchSize, ", "), + mutableListOf(warnPluginConfig, generalConfig), + emptyList(), + fs + ), testFiles = emptyList(), fs ) - .execute(EvaluatedToolConfig(batchSize, ", ")) + .execute() .toList() assertion(results) } diff --git a/save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/sarif/SarifWarningAdapterTest.kt b/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/sarif/SarifWarningAdapterTest.kt similarity index 100% rename from save-plugins/warn-plugin/src/commonTest/kotlin/com/saveourtool/save/plugin/warn/sarif/SarifWarningAdapterTest.kt rename to save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/sarif/SarifWarningAdapterTest.kt From 4f68e4a653982ff7c50e1d2e8eb28145de98dbd5 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 17:05:42 +0300 Subject: [PATCH 10/19] com.saveourtool.save.core.config.TestConfig.mergeConfigWithParent is private now --- .../save/core/config/TestConfig.kt | 4 +- .../save/core/MergeAndOverrideConfigsTest.kt | 41 +++- .../save/core/OverrideConfigsTest.kt | 186 ------------------ .../plugins/fixandwarn/FixAndWarnPlugin.kt | 2 +- 4 files changed, 35 insertions(+), 198 deletions(-) delete mode 100644 save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index 28eb5972f..55eb06949 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -170,14 +170,14 @@ data class TestConfig( * * @return all plugin configs without general config */ - fun pluginConfigsWithoutGeneralConfig() = pluginConfigs.filterNot { it is GeneralConfig } + private fun pluginConfigsWithoutGeneralConfig() = pluginConfigs.filterNot { it is GeneralConfig } /** * Merge parent list of plugins with the current list * * @return merged test config */ - fun mergeConfigWithParent(): TestConfig { + private fun mergeConfigWithParent(): TestConfig { logDebug("Merging configs (with parental configs from higher directory level) for ${this.location}") parentConfig?.let { diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt index ce15ab601..29ffc3d5b 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -257,7 +257,6 @@ class MergeAndOverrideConfigsTest { @Test fun `merge real toml configs with empty execFlag in child`() { - val evaluatedToolConfig = EvaluatedToolConfig(1, "") val toml1 = "src/commonNonJsTest/resources/merge_configs/save.toml" val configList1 = createPluginConfigListFromToml(toml1.toPath(), fs) @@ -277,14 +276,27 @@ class MergeAndOverrideConfigsTest { assertEquals(listOf(""), childGeneralConfig.tags) assertEquals(null, childWarnConfig.execFlags) - val testConfig1 = TestConfig(toml1.toPath(), null, evaluatedToolConfig, configList1.toMutableList(), emptyList(), fs) - val testConfig2 = TestConfig(toml2.toPath(), testConfig1, evaluatedToolConfig, configList2.toMutableList(), emptyList(), fs) - - val mergedTestConfig = testConfig2.mergeConfigWithParent() + val evaluatedToolConfig = EvaluatedToolConfig(1, "") + val testConfig1 = TestConfig(toml1.toPath(), null, evaluatedToolConfig, mutableListOf(), emptyList(), fs) + val testConfig2 = TestConfig(toml2.toPath(), testConfig1, evaluatedToolConfig, mutableListOf(), emptyList(), fs) + + testConfig2.processInPlace { + when (it) { + testConfig1 -> { + configList1.toMutableList() + } + testConfig2 -> { + configList2.toMutableList() + } + else -> { + throw IllegalArgumentException("Not expected testConfig: $it") + } + } + } testConfig2.validateAndSetDefaults() - val mergedGeneralConfig: GeneralConfig = mergedTestConfig.pluginConfigs.singleIsInstance() - val mergedWarnConfig: WarnPluginConfig = mergedTestConfig.pluginConfigs.singleIsInstance() + val mergedGeneralConfig: GeneralConfig = testConfig2.pluginConfigs.singleIsInstance() + val mergedWarnConfig: WarnPluginConfig = testConfig2.pluginConfigs.singleIsInstance() assertEquals(listOf("Tag", ""), mergedGeneralConfig.tags) // execFlags should be empty, not `"null"` @@ -299,8 +311,19 @@ class MergeAndOverrideConfigsTest { val saveOverridesToml = "src/commonNonJsTest/resources/override_configs".toPath().resolveSaveOverridesTomlConfig() val overrides = createPluginConfigListFromToml(saveOverridesToml, fs) - val result = configs.toMutableList() - result.overrideBy(overrides) + val evaluatedToolConfig = EvaluatedToolConfig(1, "") + val testConfig = TestConfig( + location = saveToml, + parentConfig = null, + evaluatedToolConfig = evaluatedToolConfig, + pluginConfigs = mutableListOf(), + overridesPluginConfigs = overrides, + fs = fs + ) + testConfig.processInPlace { + configs + } + val result = testConfig.pluginConfigs assertEquals(3, result.size) assertEquals( diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt deleted file mode 100644 index 90eb1b133..000000000 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/OverrideConfigsTest.kt +++ /dev/null @@ -1,186 +0,0 @@ -package com.saveourtool.save.core - -import com.saveourtool.save.core.config.EvaluatedToolConfig -import com.saveourtool.save.core.config.TestConfig -import com.saveourtool.save.core.files.fs -import com.saveourtool.save.core.plugin.GeneralConfig -import com.saveourtool.save.core.plugin.PluginConfig -import com.saveourtool.save.core.utils.createPluginConfigListFromToml -import com.saveourtool.save.core.utils.mergeWith -import com.saveourtool.save.core.utils.overrideBy -import com.saveourtool.save.core.utils.singleIsInstance -import com.saveourtool.save.plugin.warn.WarnPluginConfig -import com.saveourtool.save.plugins.fix.FixPluginConfig - -import okio.Path.Companion.toPath - -import kotlin.test.Test -import kotlin.test.assertEquals - -@Suppress( - "TOO_LONG_FUNCTION", - "LOCAL_VARIABLE_EARLY_DECLARATION", - "LONG_LINE", -) -class OverrideConfigsTest { - private val extraFlagsPattern1 = Regex("// RUN: (.*)") - private val extraFlagsPattern2 = Regex("## RUN: (.*)") - private val generalConfig1 = GeneralConfig("", listOf("Tag11", "Tag12"), "Description1", "suiteName1", "Kotlin", listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2) - private val generalConfig2 = GeneralConfig("", listOf("Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - private val generalConfig3 = GeneralConfig("", listOf("Tag21", "Tag31", "Tag32"), "Description2", "suiteName3", "Kotlin", listOf("excludedTests: test5", "includedTests: test6"), runConfigPattern = extraFlagsPattern2) - private val generalConfig4 = GeneralConfig("", listOf("Tag11", "Tag21"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) - private val warningsOutputPattern1 = Regex(".*") - private val warningsOutputPattern2 = Regex("\\w+ - (\\d+)/(\\d+) - (.*)$") - private val warnConfig1 = WarnPluginConfig("execCmd1", warningsOutputPattern2, - false, false, 1, 1, 1, 1, 1, 1, 1, 1, 1, false, null) - private val warnConfig2 = WarnPluginConfig("execCmd2", warningsOutputPattern1, - true, true, 2, 2, 2, 1, 1, 2, 2, 2, 2, true, null) - private val warnConfig3 = WarnPluginConfig("execCmd3", warningsOutputPattern2, - warningTextHasColumn = false, lineCaptureGroup = 3, columnCaptureGroup = 3, messageCaptureGroup = 3, - fileNameCaptureGroupOut = 3, lineCaptureGroupOut = 3, columnCaptureGroupOut = 3, messageCaptureGroupOut = 3) - private val warnConfig4 = WarnPluginConfig("execCmd4", warningsOutputPattern2, - lineCaptureGroup = 4, columnCaptureGroup = 4, messageCaptureGroup = 4, - fileNameCaptureGroupOut = 4, lineCaptureGroupOut = 4, columnCaptureGroupOut = 4, messageCaptureGroupOut = 4) - private val fixConfig1 = FixPluginConfig("fixCmd1", "Suffix") - private val fixConfig2 = FixPluginConfig("fixCmd2") - private val fixConfig3 = FixPluginConfig("fixCmd3", null) - private val fixConfig4 = FixPluginConfig("fixCmd4") - private val evaluatedToolConfig = EvaluatedToolConfig(1, "") - - @Test - fun `override general configs`() { - val config1 = mutableListOf(generalConfig1) - val config2: MutableList = mutableListOf(generalConfig2) - - config2.overrideBy(config1) - - assertEquals(1, config2.size) - - val expectedGeneralConfig = - GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - - val actualGeneralConfig: GeneralConfig = config2.singleIsInstance() - assertEquals(expectedGeneralConfig, actualGeneralConfig) - } - - @Test - fun `merge two incomplete configs`() { - val config1 = mutableListOf(generalConfig1, warnConfig1) - val config2: MutableList = mutableListOf(generalConfig2) - - config2.mergeWith(config1) - - assertEquals(2, config2.size) - - val expectedGeneralConfig = - GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - - val actualGeneralConfig: GeneralConfig = config2.singleIsInstance() - val actualWarnConfig: WarnPluginConfig = config2.singleIsInstance() - - assertEquals(expectedGeneralConfig, actualGeneralConfig) - assertEquals(warnConfig1, actualWarnConfig) - } - - @Test - fun `merge two incomplete configs 2`() { - val config1: List = emptyList() - val config2 = mutableListOf(generalConfig2, warnConfig1) - - config2.mergeWith(config1) - - assertEquals(2, config2.size) - - val actualGeneralConfig: GeneralConfig = config2.singleIsInstance() - val actualWarnConfig: WarnPluginConfig = config2.singleIsInstance() - - assertEquals(generalConfig2, actualGeneralConfig) - assertEquals(warnConfig1, actualWarnConfig) - } - - @Test - fun `merge two configs with different fields`() { - val config1 = mutableListOf(generalConfig1, warnConfig2, fixConfig1) - val config2 = mutableListOf(generalConfig2, warnConfig3, fixConfig2) - - config2.mergeWith(config1) - - assertEquals(3, config2.size) - - val expectedGeneralConfig = - GeneralConfig("", listOf("Tag11", "Tag12", "Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - val expectedWarnConfig = WarnPluginConfig("execCmd3", warningsOutputPattern2, - true, false, 3, 3, 3, 1, 1, 3, 3, 3, 3, true, null) - val expectedFixConfig = FixPluginConfig("fixCmd2", "Suffix") - - val actualGeneralConfig: GeneralConfig = config2.singleIsInstance() - val actualWarnConfig: WarnPluginConfig = config2.singleIsInstance() - val actualFixConfig: FixPluginConfig = config2.singleIsInstance() - - assertEquals(expectedGeneralConfig, actualGeneralConfig) - assertEquals(expectedWarnConfig, actualWarnConfig) - assertEquals(expectedFixConfig, actualFixConfig) - } - - @Test - fun `merge configs with many parents`() { - val config1 = mutableListOf(generalConfig1, warnConfig1, fixConfig1) - val config2 = mutableListOf(generalConfig2, warnConfig2, fixConfig2) - val config3 = mutableListOf(generalConfig3, warnConfig3, fixConfig3) - val config4 = mutableListOf(generalConfig4, warnConfig4, fixConfig4) - - config1.mergeWith(emptyList()) - config2.mergeWith(config1) - config3.mergeWith(config2) - config4.mergeWith(config3) - - assertEquals(3, config4.size) - val expectedGeneralConfig = - GeneralConfig("", listOf("Tag11", "Tag12", "Tag21", "Tag31", "Tag32"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) - val expectedWarnConfig = WarnPluginConfig("execCmd4", warningsOutputPattern2, - true, false, 4, 4, 4, 1, 1, 4, 4, 4, 4, true, null) - val expectedFixConfig = FixPluginConfig("fixCmd4", "Suffix") - - val actualGeneralConfig: GeneralConfig = config4.singleIsInstance() - val actualWarnConfig: WarnPluginConfig = config4.singleIsInstance() - val actualFixConfig: FixPluginConfig = config4.singleIsInstance() - - assertEquals(expectedGeneralConfig, actualGeneralConfig) - assertEquals(expectedWarnConfig, actualWarnConfig) - assertEquals(expectedFixConfig, actualFixConfig) - } - - @Test - fun `merge real toml configs with empty execFlag in child`() { - val toml1 = "src/commonNonJsTest/resources/merge_configs/save.toml" - val configList1 = createPluginConfigListFromToml(toml1.toPath(), fs) - - val parentGeneralConfig: GeneralConfig = configList1.singleIsInstance() - val parentWarnConfig: WarnPluginConfig = configList1.singleIsInstance() - assertEquals("echo hello world", parentGeneralConfig.execCmd) - assertEquals(listOf("Tag"), parentGeneralConfig.tags) - assertEquals(null, parentWarnConfig.execFlags) - - val toml2 = "src/commonNonJsTest/resources/merge_configs/inner/save.toml" - val configList2 = createPluginConfigListFromToml(toml2.toPath(), fs) - - val childGeneralConfig: GeneralConfig = configList2.singleIsInstance() - val childWarnConfig: WarnPluginConfig = configList2.singleIsInstance() - - assertEquals(listOf(""), childGeneralConfig.tags) - assertEquals(null, childWarnConfig.execFlags) - - val testConfig1 = TestConfig(toml1.toPath(), null, evaluatedToolConfig, configList1.toMutableList(), emptyList(), fs) - val testConfig2 = TestConfig(toml2.toPath(), testConfig1, evaluatedToolConfig, configList2.toMutableList(), emptyList(), fs) - - val mergedTestConfig = testConfig2.mergeConfigWithParent() - testConfig2.validateAndSetDefaults() - - val mergedGeneralConfig: GeneralConfig = mergedTestConfig.pluginConfigs.singleIsInstance() - val mergedWarnConfig: WarnPluginConfig = mergedTestConfig.pluginConfigs.singleIsInstance() - - assertEquals(listOf("Tag", ""), mergedGeneralConfig.tags) - // execFlags should be empty, not `"null"` - assertEquals("", mergedWarnConfig.execFlags) - } -} diff --git a/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt b/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt index 6db27bfc7..ec6aa1106 100644 --- a/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt +++ b/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt @@ -45,7 +45,7 @@ class FixAndWarnPlugin( .singleIsInstance() .warn private val generalConfig: GeneralConfig = - testConfig.pluginConfigs.singleIsInstance() + testConfig.pluginConfigs.singleIsInstance() @Suppress("MISSING_KDOC_CLASS_ELEMENTS") internal lateinit var fixPlugin: FixPlugin From f59584ddd08e79f58bb7f9100416631cf51bb7d4 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 17:07:26 +0300 Subject: [PATCH 11/19] diktatFix --- .../save/core/MergeAndOverrideConfigsTest.kt | 13 +++---------- .../saveourtool/save/plugin/warn/WarnPluginTest.kt | 2 +- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt index 29ffc3d5b..e9baa5fd9 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -257,7 +257,6 @@ class MergeAndOverrideConfigsTest { @Test fun `merge real toml configs with empty execFlag in child`() { - val toml1 = "src/commonNonJsTest/resources/merge_configs/save.toml" val configList1 = createPluginConfigListFromToml(toml1.toPath(), fs) @@ -282,15 +281,9 @@ class MergeAndOverrideConfigsTest { testConfig2.processInPlace { when (it) { - testConfig1 -> { - configList1.toMutableList() - } - testConfig2 -> { - configList2.toMutableList() - } - else -> { - throw IllegalArgumentException("Not expected testConfig: $it") - } + testConfig1 -> configList1.toMutableList() + testConfig2 -> configList2.toMutableList() + else -> throw IllegalArgumentException("Not expected testConfig: $it") } } testConfig2.validateAndSetDefaults() diff --git a/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt b/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt index 5e8b43c79..c16d2f867 100644 --- a/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt +++ b/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt @@ -199,7 +199,7 @@ class WarnPluginTest { assertEquals(1, results.size) assertTrue(results.single().status is Pass) val nameWarn = - "(UNEXPECTED WARNINGS): [Warning(message=Variable name should be in lowerCamelCase, line=5, column=8, fileName=Test1Test.java)]" + "(UNEXPECTED WARNINGS): [Warning(message=Variable name should be in lowerCamelCase, line=5, column=8, fileName=Test1Test.java)]" assertEquals(nameWarn, (results.single().status as Pass).message) } } From d723118cc71b2ed76c5f9aadb249d140a4a1304d Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 18:34:20 +0300 Subject: [PATCH 12/19] fix multiple parent processing --- .../saveourtool/save/core/config/TestConfig.kt | 18 ++++++++++++------ .../kotlin/com/saveourtool/save/core/Save.kt | 4 ++++ .../save/core/utils/TestConfigUtils.kt | 3 ++- .../save/core/MergeAndOverrideConfigsTest.kt | 4 ++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index 55eb06949..f6afa7d8b 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -126,16 +126,22 @@ data class TestConfig( /** * Walk all descendant configs and merge them with their parents * + * @param processParent flag that controls processing of parent of current [TestConfig] * @param createPluginConfigList a function which can create a list of [PluginConfig]s for this [TestConfig] * @return an update this [TestConfig] */ - fun processInPlace(createPluginConfigList: (TestConfig) -> List): TestConfig { - // need to process parent first - this.parentConfig?.processInPlace(createPluginConfigList) + fun processInPlace(processParent: Boolean, createPluginConfigList: (TestConfig) -> List): TestConfig { + // need to process parent first, if it wasn't processed already + if (processParent) { + this.parentConfig?.processInPlace(processParent, createPluginConfigList) + } // discover plugins from the test configuration - createPluginConfigList(this).forEach { - logTrace("Discovered new pluginConfig: $it") - this.pluginConfigs.add(it) + createPluginConfigList(this).forEach { pluginConfig -> + logTrace("Discovered new pluginConfig: $pluginConfig") + require(this.pluginConfigs.none { it.type == pluginConfig.type }) { + "Found duplicate for $pluginConfig" + } + this.pluginConfigs.add(pluginConfig) } // merge configurations with parents this.mergeConfigWithParent() diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt index ef117eea2..3b76a69a2 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt @@ -92,6 +92,10 @@ class Save( // get all toml configs in file system val testConfigs = ConfigDetector(fs, evaluatedToolConfig, pluginConfigOverrides) .configFromFile(rootTestConfigPath) + .also { testConfig -> + // need to process all parents (if there is a parent) + testConfig.parentConfig?.processInPlace(true) + } .getAllTestConfigsForFiles(requestedConfigs) var atLeastOneExecutionProvided = false testConfigs.forEach { testConfig -> diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt index 633a63abe..eef392ba1 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt @@ -14,9 +14,10 @@ import com.saveourtool.save.plugins.fixandwarn.FixAndWarnPlugin /** * Evaluate all descendants of [this] config, reading individual plugin configurations from TOML file. * + * @param processParent flag that controls processing of parent TestConfig * @return [this] config with all descendants being evaluated (`pluginConfigs` are filled with data and merged with parents) */ -fun TestConfig.processInPlace() = processInPlace { +fun TestConfig.processInPlace(processParent: Boolean = false) = processInPlace(processParent) { createPluginConfigListFromToml(it.location, fs) } diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt index e9baa5fd9..097037199 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -279,7 +279,7 @@ class MergeAndOverrideConfigsTest { val testConfig1 = TestConfig(toml1.toPath(), null, evaluatedToolConfig, mutableListOf(), emptyList(), fs) val testConfig2 = TestConfig(toml2.toPath(), testConfig1, evaluatedToolConfig, mutableListOf(), emptyList(), fs) - testConfig2.processInPlace { + testConfig2.processInPlace(true) { when (it) { testConfig1 -> configList1.toMutableList() testConfig2 -> configList2.toMutableList() @@ -313,7 +313,7 @@ class MergeAndOverrideConfigsTest { overridesPluginConfigs = overrides, fs = fs ) - testConfig.processInPlace { + testConfig.processInPlace(true) { configs } val result = testConfig.pluginConfigs From 826cf4963dcc59d5a22b6a7de03407a551989d8e Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 18:45:56 +0300 Subject: [PATCH 13/19] refactoring processing of parent of TestConfig --- .../saveourtool/save/core/config/TestConfig.kt | 7 +------ .../kotlin/com/saveourtool/save/core/Save.kt | 3 ++- .../save/core/utils/TestConfigUtils.kt | 15 +++++++++++++-- .../save/core/MergeAndOverrideConfigsTest.kt | 11 +++-------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index f6afa7d8b..8136e0b35 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -126,15 +126,10 @@ data class TestConfig( /** * Walk all descendant configs and merge them with their parents * - * @param processParent flag that controls processing of parent of current [TestConfig] * @param createPluginConfigList a function which can create a list of [PluginConfig]s for this [TestConfig] * @return an update this [TestConfig] */ - fun processInPlace(processParent: Boolean, createPluginConfigList: (TestConfig) -> List): TestConfig { - // need to process parent first, if it wasn't processed already - if (processParent) { - this.parentConfig?.processInPlace(processParent, createPluginConfigList) - } + fun processInPlace(createPluginConfigList: (TestConfig) -> List): TestConfig { // discover plugins from the test configuration createPluginConfigList(this).forEach { pluginConfig -> logTrace("Discovered new pluginConfig: $pluginConfig") diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt index 3b76a69a2..976092f16 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt @@ -28,6 +28,7 @@ import com.saveourtool.save.core.result.TestResult import com.saveourtool.save.core.utils.buildActivePlugins import com.saveourtool.save.core.utils.createPluginConfigListFromToml import com.saveourtool.save.core.utils.processInPlace +import com.saveourtool.save.core.utils.processWithParentsInPlace import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPlugin import com.saveourtool.save.plugins.fix.FixPluginConfig @@ -94,7 +95,7 @@ class Save( .configFromFile(rootTestConfigPath) .also { testConfig -> // need to process all parents (if there is a parent) - testConfig.parentConfig?.processInPlace(true) + testConfig.parentConfig?.processWithParentsInPlace() } .getAllTestConfigsForFiles(requestedConfigs) var atLeastOneExecutionProvided = false diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt index eef392ba1..e1a8068ac 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt @@ -14,13 +14,24 @@ import com.saveourtool.save.plugins.fixandwarn.FixAndWarnPlugin /** * Evaluate all descendants of [this] config, reading individual plugin configurations from TOML file. * - * @param processParent flag that controls processing of parent TestConfig * @return [this] config with all descendants being evaluated (`pluginConfigs` are filled with data and merged with parents) */ -fun TestConfig.processInPlace(processParent: Boolean = false) = processInPlace(processParent) { +fun TestConfig.processInPlace() = processInPlace { createPluginConfigListFromToml(it.location, fs) } +/** + * Process current and all parents of [this] config, reading individual plugin configurations from TOML file. + * + * @return [this] config with all descendants being evaluated (`pluginConfigs` are filled with data and merged with parents) + */ +fun TestConfig.processWithParentsInPlace(): TestConfig { + parentConfig?.let { + this.processInPlace() + } + return processInPlace() +} + /** * Creates a list of plugins according to [this] config, choosing plugin implementation from the list of available ones. * diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt index 097037199..552173ef6 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -279,13 +279,8 @@ class MergeAndOverrideConfigsTest { val testConfig1 = TestConfig(toml1.toPath(), null, evaluatedToolConfig, mutableListOf(), emptyList(), fs) val testConfig2 = TestConfig(toml2.toPath(), testConfig1, evaluatedToolConfig, mutableListOf(), emptyList(), fs) - testConfig2.processInPlace(true) { - when (it) { - testConfig1 -> configList1.toMutableList() - testConfig2 -> configList2.toMutableList() - else -> throw IllegalArgumentException("Not expected testConfig: $it") - } - } + testConfig1.processInPlace { configList1 } + testConfig2.processInPlace { configList2 } testConfig2.validateAndSetDefaults() val mergedGeneralConfig: GeneralConfig = testConfig2.pluginConfigs.singleIsInstance() @@ -313,7 +308,7 @@ class MergeAndOverrideConfigsTest { overridesPluginConfigs = overrides, fs = fs ) - testConfig.processInPlace(true) { + testConfig.processInPlace { configs } val result = testConfig.pluginConfigs From 19f0d9241b5f1587c7c78429e741f0c07e2ce9de Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 25 Aug 2022 19:09:57 +0300 Subject: [PATCH 14/19] fix for processing of parent --- .../kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt index e1a8068ac..0888defc5 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt @@ -26,9 +26,7 @@ fun TestConfig.processInPlace() = processInPlace { * @return [this] config with all descendants being evaluated (`pluginConfigs` are filled with data and merged with parents) */ fun TestConfig.processWithParentsInPlace(): TestConfig { - parentConfig?.let { - this.processInPlace() - } + parentConfig?.processInPlace() return processInPlace() } From 5d32e74f7993784c8bccc1e9ee038c74ad71f82d Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Fri, 26 Aug 2022 18:58:49 +0300 Subject: [PATCH 15/19] moved batchSize and batchSeparator to GeneralConfig --- .../src/main/resources/config-options.json | 16 -------- .../com/saveourtool/save/plugin/MockPlugin.kt | 2 - .../save/core/config/EvaluatedToolConfig.kt | 12 ------ .../save/core/config/TestConfig.kt | 4 +- .../save/core/plugin/PluginConfig.kt | 38 ++++++++---------- .../save/core/utils/ValidationUtils.kt | 40 +++++++++++++++++++ .../kotlin/com/saveourtool/save/core/Save.kt | 9 +---- .../save/core/files/ConfigDetector.kt | 4 -- .../save/core/ConfigDetectorRegressionTest.kt | 7 +--- .../save/core/ConfigDetectorTest.kt | 3 +- .../save/core/MergeAndOverrideConfigsTest.kt | 18 ++++----- .../plugins/fixandwarn/FixAndWarnPlugin.kt | 1 - .../fixandwarn/FixAndWarnPluginTest.kt | 4 +- .../saveourtool/save/plugins/fix/FixPlugin.kt | 13 ++++-- .../save/plugins/fix/FixPluginTest.kt | 8 +--- .../save/plugin/warn/WarnPlugin.kt | 17 +++++--- .../save/plugin/warn/WarnPluginConfig.kt | 26 ++++-------- .../save/plugin/warn/WarnPluginTest.kt | 6 +-- 18 files changed, 102 insertions(+), 126 deletions(-) delete mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/EvaluatedToolConfig.kt create mode 100644 save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/ValidationUtils.kt diff --git a/buildSrc/src/main/resources/config-options.json b/buildSrc/src/main/resources/config-options.json index 8c55759b5..ca30723f8 100644 --- a/buildSrc/src/main/resources/config-options.json +++ b/buildSrc/src/main/resources/config-options.json @@ -78,21 +78,5 @@ "shortName" : "", "description" : "Path to directory, where to store output (when `resultOutput` is set to `FILE`)", "default" : "save-reports" - }, - "batchSize" : { - "argType" : "ArgType.Int", - "kotlinType": "kotlin.Int", - "fullName" : "batch-size", - "shortName" : "", - "description" : "Number of files execCmd will process at a time", - "default" : "1" - }, - "batchSeparator" : { - "argType": "ArgType.String", - "kotlinType": "kotlin.String", - "fullName": "batch-separator", - "shortName" : "", - "description" : "A separator to join test files to string if the tested tool supports processing of file batches (`batch-size` > 1)", - "default" : ", " } } \ No newline at end of file diff --git a/save-common-test/src/commonNonJsMain/kotlin/com/saveourtool/save/plugin/MockPlugin.kt b/save-common-test/src/commonNonJsMain/kotlin/com/saveourtool/save/plugin/MockPlugin.kt index fe6263da3..cc6bcca48 100644 --- a/save-common-test/src/commonNonJsMain/kotlin/com/saveourtool/save/plugin/MockPlugin.kt +++ b/save-common-test/src/commonNonJsMain/kotlin/com/saveourtool/save/plugin/MockPlugin.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.plugin -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.plugin.Plugin @@ -18,7 +17,6 @@ class MockPlugin(baseDir: Path, testFiles: List = emptyList()) : Plugin( TestConfig( (baseDir / "save.toml").also { fs.createFile(it) }, null, - EvaluatedToolConfig(1, ""), overridesPluginConfigs = emptyList(), fs = fs), testFiles, diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/EvaluatedToolConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/EvaluatedToolConfig.kt deleted file mode 100644 index 00f4abf4a..000000000 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/EvaluatedToolConfig.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.saveourtool.save.core.config - -/** - * Configuration for an evaluated tool, that is read from cli - * - * @property batchSize it controls how many files execCmd will process at a time - * @property batchSeparator A separator to join test files to string if the tested tool supports processing of file batches (`batch-size` > 1) - */ -data class EvaluatedToolConfig( - val batchSize: Int, - val batchSeparator: String, -) diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index 8136e0b35..f9821d5fd 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -24,7 +24,6 @@ import kotlin.js.JsName * Configuration for a test suite, that is read from test suite configuration file (toml config) * @property location [Path] denoting the location of this file * @property parentConfig parent config in the hierarchy of configs, `null` if this config is root. - * @property evaluatedToolConfig a configuration for evaluated tool * @property pluginConfigs list of configurations for plugins that are active in this config * @property overridesPluginConfigs list of configurations for plugins that overrides [pluginConfigs] * @property fs filesystem which can access test configs @@ -33,7 +32,6 @@ import kotlin.js.JsName data class TestConfig( val location: Path, val parentConfig: TestConfig?, - val evaluatedToolConfig: EvaluatedToolConfig, val pluginConfigs: MutableList = mutableListOf(), val overridesPluginConfigs: List, val fs: FileSystem, @@ -139,7 +137,7 @@ data class TestConfig( this.pluginConfigs.add(pluginConfig) } // merge configurations with parents - this.mergeConfigWithParent() + mergeConfigWithParent() overrideConfig() return this } diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfig.kt index fc12a5fc6..08bb43e24 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/plugin/PluginConfig.kt @@ -8,6 +8,8 @@ package com.saveourtool.save.core.plugin import com.saveourtool.save.core.config.TestConfigSections import com.saveourtool.save.core.utils.RegexSerializer +import com.saveourtool.save.core.utils.requireNotNull +import com.saveourtool.save.core.utils.requirePositive import okio.Path import okio.Path.Companion.toPath @@ -61,6 +63,8 @@ interface PluginConfig { * The logic of the default value processing will be provided in stage of validation * * @property execCmd a command that will be executed to check resources + * @property batchSize it controls how many files execCmd will process at a time + * @property batchSeparator A separator to join test files to string if the tested tool supports processing of file batches (`batch-size` > 1) * @property tags special labels that can be used for splitting tests into groups * @property description free text with a description * @property suiteName name of test suite that can be visible from save-cloud @@ -75,6 +79,8 @@ interface PluginConfig { @Serializable data class GeneralConfig( val execCmd: String? = null, + val batchSize: Long? = null, + val batchSeparator: String? = null, val tags: List? = null, val description: String? = null, val suiteName: String? = null, @@ -104,6 +110,8 @@ data class GeneralConfig( return GeneralConfig( this.execCmd ?: other.execCmd, + this.batchSize ?: other.batchSize, + this.batchSeparator ?: other.batchSeparator, mergedTag, this.description ?: other.description, this.suiteName ?: other.suiteName, @@ -119,23 +127,16 @@ data class GeneralConfig( @Suppress("MagicNumber") override fun validateAndSetDefaults(): GeneralConfig { - requireNotNull(execCmd) { - errorMsgForRequireCheck("execCmd") - } - requireNotNull(tags) { - errorMsgForRequireCheck("tags") - } - requireNotNull(description) { - errorMsgForRequireCheck("description") - } - requireNotNull(suiteName) { - errorMsgForRequireCheck("suiteName") + batchSize?.also { + requirePositive("batchSize", it) } return GeneralConfig( - execCmd, - tags, - description, - suiteName, + requireNotNull("execCmd", execCmd), + batchSize ?: 1, + batchSeparator ?: ", ", + requireNotNull("tags", tags), + requireNotNull("description", description), + requireNotNull("suiteName", suiteName), language, excludedTests ?: emptyList(), expectedWarningsPattern ?: defaultExpectedWarningPattern, @@ -146,13 +147,6 @@ data class GeneralConfig( ).also { it.configLocation = this.configLocation } } - private fun errorMsgForRequireCheck(field: String) = - """ - Error: Couldn't find `$field` in [general] section of `$configLocation` config. - Current configuration: ${this.toString().substringAfter("(").substringBefore(")")} - Please provide it in this, or at least in one of the parent configs. - """.trimIndent() - companion object { /** * Default regex for expected warnings in test resources, e.g. diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/ValidationUtils.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/ValidationUtils.kt new file mode 100644 index 000000000..86230c022 --- /dev/null +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/ValidationUtils.kt @@ -0,0 +1,40 @@ +/** + * This file contains utils methods to validate PluginConfig + */ + +package com.saveourtool.save.core.utils + +import com.saveourtool.save.core.plugin.PluginConfig + +/** + * Validate [value] that [field] is not null + * + * @param field + * @param value + * @return [value] as not null + */ +fun T.requireNotNull(field: String, value: R?) = requireNotNull(value) { + """ + Error: Couldn't find `$field` in [$type] section of `$configLocation` config. + Current configuration: ${this.currentConfiguration()} + Please provide it in this, or at least in one of the parent configs. + """.trimIndent() +} + +/** + * Validate [value] that [field] positive + * + * @param field + * @param value + * @return nothing + */ +fun T.requirePositive(field: String, value: Long) = require(value >= 0) { + """ + [Configuration Error]: `$field` in [$type] section of `$configLocation` config should be positive! + Current configuration: ${this.currentConfiguration()} + """.trimIndent() +} + +private fun T.currentConfiguration() = toString() + .substringAfter("(") + .substringBefore(")") diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt index 976092f16..fd585574c 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/Save.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.core -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.OutputStreamType import com.saveourtool.save.core.config.ReportType import com.saveourtool.save.core.config.SAVE_VERSION @@ -76,12 +75,6 @@ class Save( reporter.beforeAll() - // create config for evaluated tool from cli args - val evaluatedToolConfig = EvaluatedToolConfig( - batchSize = saveProperties.batchSize, - batchSeparator = saveProperties.batchSeparator, - ) - // create config for evaluated tool from cli args val saveOverridesPath = testRootPath.resolveSaveOverridesTomlConfig() val pluginConfigOverrides = if (fs.exists(saveOverridesPath)) { @@ -91,7 +84,7 @@ class Save( } // get all toml configs in file system - val testConfigs = ConfigDetector(fs, evaluatedToolConfig, pluginConfigOverrides) + val testConfigs = ConfigDetector(fs, pluginConfigOverrides) .configFromFile(rootTestConfigPath) .also { testConfig -> // need to process all parents (if there is a parent) diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt index 9c519a26a..55d21e3a4 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/files/ConfigDetector.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.core.files -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.config.isSaveTomlConfig import com.saveourtool.save.core.logging.logDebug @@ -16,7 +15,6 @@ import okio.Path */ class ConfigDetector( private val fs: FileSystem, - private val evaluatedToolConfig: EvaluatedToolConfig, private val overridesPluginConfigs: List, ) { /** @@ -67,7 +65,6 @@ class ConfigDetector( TestConfig( path, parentConfig, - evaluatedToolConfig, overridesPluginConfigs = overridesPluginConfigs, fs = fs, ) @@ -119,7 +116,6 @@ class ConfigDetector( return TestConfig( file, parentConfig, - evaluatedToolConfig, overridesPluginConfigs = overridesPluginConfigs, fs = fs, ) diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorRegressionTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorRegressionTest.kt index ba80eb58d..1be5d9f4e 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorRegressionTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorRegressionTest.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.core -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.files.ConfigDetector import com.saveourtool.save.core.files.fs @@ -10,8 +9,6 @@ import kotlin.test.Test import kotlin.test.assertEquals class ConfigDetectorRegressionTest { - private val evaluatedToolConfig = EvaluatedToolConfig(1, "") - @Test fun `config detector regression test on directories`() { val baseDir = "../examples/discovery-test" @@ -21,14 +18,14 @@ class ConfigDetectorRegressionTest { "$baseDir/highlevel/suite2/inner/save.toml" ) - val actual1 = ConfigDetector(fs, evaluatedToolConfig, emptyList()) + val actual1 = ConfigDetector(fs, emptyList()) .configFromFile(baseDir.toPath()) .getAllTestConfigs() .map { it.location.toString() } assertEquals(expected, actual1) - val actual2 = ConfigDetector(fs, evaluatedToolConfig, emptyList()) + val actual2 = ConfigDetector(fs, emptyList()) .configFromFile("$baseDir/save.toml".toPath()) .getAllTestConfigs() .map { it.location.toString() } diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorTest.kt index cac312108..7290efc03 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ConfigDetectorTest.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.core -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.files.ConfigDetector import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.fs @@ -15,7 +14,7 @@ import kotlin.test.assertTrue class ConfigDetectorTest { private val tmpDir = fs.createTempDir(ConfigDetectorTest::class.simpleName!!) - private val configDetector = ConfigDetector(fs, EvaluatedToolConfig(1, ""), emptyList()) + private val configDetector = ConfigDetector(fs, emptyList()) @Test fun `should detect single file`() { diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt index 552173ef6..a5ca06555 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.core -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.config.resolveSaveOverridesTomlConfig import com.saveourtool.save.core.config.resolveSaveTomlConfig @@ -27,10 +26,10 @@ import kotlin.test.assertEquals class MergeAndOverrideConfigsTest { private val extraFlagsPattern1 = Regex("// RUN: (.*)") private val extraFlagsPattern2 = Regex("## RUN: (.*)") - private val generalConfig1 = GeneralConfig("", listOf("Tag11", "Tag12"), "Description1", "suiteName1", "Kotlin", listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2) - private val generalConfig2 = GeneralConfig("", listOf("Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - private val generalConfig3 = GeneralConfig("", listOf("Tag21", "Tag31", "Tag32"), "Description2", "suiteName3", "Kotlin", listOf("excludedTests: test5", "includedTests: test6"), runConfigPattern = extraFlagsPattern2) - private val generalConfig4 = GeneralConfig("", listOf("Tag11", "Tag21"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) + private val generalConfig1 = GeneralConfig("", 1, ", ", listOf("Tag11", "Tag12"), "Description1", "suiteName1", "Kotlin", listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2) + private val generalConfig2 = GeneralConfig("", 1, ", ", listOf("Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) + private val generalConfig3 = GeneralConfig("", 1, ", ", listOf("Tag21", "Tag31", "Tag32"), "Description2", "suiteName3", "Kotlin", listOf("excludedTests: test5", "includedTests: test6"), runConfigPattern = extraFlagsPattern2) + private val generalConfig4 = GeneralConfig("", 1, ", ", listOf("Tag11", "Tag21"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) private val warningsOutputPattern1 = Regex(".*") private val warningsOutputPattern2 = Regex("\\w+ - (\\d+)/(\\d+) - (.*)$") private val warnConfig1 = WarnPluginConfig("execCmd1", warningsOutputPattern2, @@ -241,7 +240,7 @@ class MergeAndOverrideConfigsTest { assertEquals(3, config4.size) val expectedGeneralConfig = - GeneralConfig("", listOf("Tag11", "Tag12", "Tag21", "Tag31", "Tag32"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) + GeneralConfig("", 1, ", ", listOf("Tag11", "Tag12", "Tag21", "Tag31", "Tag32"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) val expectedWarnConfig = WarnPluginConfig("execCmd4", warningsOutputPattern2, true, false, 4, 4, 4, 1, 1, 4, 4, 4, 4, true, null) val expectedFixConfig = FixPluginConfig("fixCmd4", "Suffix") @@ -275,9 +274,8 @@ class MergeAndOverrideConfigsTest { assertEquals(listOf(""), childGeneralConfig.tags) assertEquals(null, childWarnConfig.execFlags) - val evaluatedToolConfig = EvaluatedToolConfig(1, "") - val testConfig1 = TestConfig(toml1.toPath(), null, evaluatedToolConfig, mutableListOf(), emptyList(), fs) - val testConfig2 = TestConfig(toml2.toPath(), testConfig1, evaluatedToolConfig, mutableListOf(), emptyList(), fs) + val testConfig1 = TestConfig(toml1.toPath(), null, mutableListOf(), emptyList(), fs) + val testConfig2 = TestConfig(toml2.toPath(), testConfig1, mutableListOf(), emptyList(), fs) testConfig1.processInPlace { configList1 } testConfig2.processInPlace { configList2 } @@ -299,11 +297,9 @@ class MergeAndOverrideConfigsTest { val saveOverridesToml = "src/commonNonJsTest/resources/override_configs".toPath().resolveSaveOverridesTomlConfig() val overrides = createPluginConfigListFromToml(saveOverridesToml, fs) - val evaluatedToolConfig = EvaluatedToolConfig(1, "") val testConfig = TestConfig( location = saveToml, parentConfig = null, - evaluatedToolConfig = evaluatedToolConfig, pluginConfigs = mutableListOf(), overridesPluginConfigs = overrides, fs = fs diff --git a/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt b/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt index ec6aa1106..da781d564 100644 --- a/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt +++ b/save-plugins/fix-and-warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPlugin.kt @@ -65,7 +65,6 @@ class FixAndWarnPlugin( private fun createTestConfigForPlugins(pluginConfig: PluginConfig) = TestConfig( testConfig.location, testConfig.parentConfig, - testConfig.evaluatedToolConfig, mutableListOf( generalConfig, pluginConfig diff --git a/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt b/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt index ec9785930..457960daf 100644 --- a/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt +++ b/save-plugins/fix-and-warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fixandwarn/FixAndWarnPluginTest.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.plugins.fixandwarn -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.fs @@ -74,7 +73,6 @@ class FixAndWarnPluginTest { TestConfig( config, null, - EvaluatedToolConfig(1, ", "), mutableListOf( FixAndWarnPluginConfig( FixPluginConfig(fixExecutionCmd), @@ -83,7 +81,7 @@ class FixAndWarnPluginTest { true, true, 1, 2, 3, 1, 1, 1, 2, 3, 4 ) ), - GeneralConfig("", listOf(""), "", "", expectedWarningsPattern = Regex("// ;warn:(\\d+):(\\d+): (.*)"), runConfigPattern = defaultExtraConfigPattern) + GeneralConfig("", 1, ", ", listOf(""), "", "", expectedWarningsPattern = Regex("// ;warn:(\\d+):(\\d+): (.*)"), runConfigPattern = defaultExtraConfigPattern) ), emptyList(), fs, diff --git a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt index 82a3bd7ff..9c42298c6 100644 --- a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt +++ b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt @@ -72,17 +72,22 @@ class FixPlugin( testConfig.validateAndSetDefaults() val fixPluginConfig: FixPluginConfig = testConfig.pluginConfigs.singleIsInstance() val generalConfig: GeneralConfig = testConfig.pluginConfigs.singleIsInstance() + val batchSize = requireNotNull(generalConfig.batchSize) { + "`batchSize` is not set" + }.toInt() + val batchSeparator = requireNotNull(generalConfig.batchSeparator) { + "`batchSeparator` is not set" + } extraFlagsExtractor = ExtraFlagsExtractor(generalConfig, fs) - val evaluatedToolConfig = testConfig.evaluatedToolConfig return files.map { it as FixTestFiles } - .chunked(evaluatedToolConfig.batchSize) + .chunked(batchSize) .map { chunk -> val copyPaths = chunk.map { it.test } val extraFlagsList = copyPaths.mapNotNull { path -> extraFlagsExtractor.extractExtraFlagsFrom(path) }.distinct() require(extraFlagsList.size <= 1) { - "Extra flags for all files in a batch should be same, but you have batchSize=${evaluatedToolConfig.batchSize}" + + "Extra flags for all files in a batch should be same, but you have batchSize=$batchSize" + " and there are ${extraFlagsList.size} different sets of flags inside it, namely $extraFlagsList" } val extraFlags = extraFlagsList.singleOrNull() ?: ExtraFlags("", "") @@ -92,7 +97,7 @@ class FixPlugin( createTestFile(test, generalConfig, fixPluginConfig) to expected } val testCopyNames = - pathCopyMap.joinToString(separator = evaluatedToolConfig.batchSeparator) { (testCopy, _) -> testCopy.toString() } + pathCopyMap.joinToString(separator = batchSeparator) { (testCopy, _) -> testCopy.toString() } val execFlags = fixPluginConfig.execFlags val execFlagsAdjusted = resolvePlaceholdersFrom(execFlags, extraFlags, testCopyNames) diff --git a/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt b/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt index 4532aec8f..25850f52f 100644 --- a/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt +++ b/save-plugins/fix-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugins/fix/FixPluginTest.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.plugins.fix -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.fs @@ -81,10 +80,9 @@ class FixPluginTest { TestConfig( config, null, - EvaluatedToolConfig(1, ", "), mutableListOf( FixPluginConfig(executionCmd), - GeneralConfig("", listOf(""), "", "") + GeneralConfig("", 1, ", ", listOf(""), "", "") ), emptyList(), fs @@ -149,10 +147,9 @@ class FixPluginTest { TestConfig( config, null, - EvaluatedToolConfig(2, batchSeparator), mutableListOf( fixPluginConfig, - GeneralConfig("", listOf(""), "", "") + GeneralConfig("", 2, batchSeparator, listOf(""), "", "") ), emptyList(), fs @@ -182,7 +179,6 @@ class FixPluginTest { TestConfig( tmpDir / "save.toml", null, - EvaluatedToolConfig(1, ""), mutableListOf(FixPluginConfig("")), emptyList(), fs diff --git a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt index 4a7775986..96ff1ee2f 100644 --- a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt +++ b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPlugin.kt @@ -66,6 +66,12 @@ class WarnPlugin( testConfig.validateAndSetDefaults() val warnPluginConfig: WarnPluginConfig = testConfig.pluginConfigs.singleIsInstance() val generalConfig: GeneralConfig = testConfig.pluginConfigs.singleIsInstance() + val batchSize = requireNotNull(generalConfig.batchSize) { + "`batchSize` is not set" + }.toInt() + val batchSeparator = requireNotNull(generalConfig.batchSeparator) { + "`batchSeparator` is not set" + } extraFlagsExtractor = ExtraFlagsExtractor(generalConfig, fs) // Special trick to handle cases when tested tool is able to process directories. @@ -73,10 +79,10 @@ class WarnPlugin( // // In case, when user doesn't want to use directory mode, he needs simply not to pass [wildCardInDirectoryMode] and it will be null return warnPluginConfig.wildCardInDirectoryMode?.let { - handleTestFile(files.map { it.test }.toList(), warnPluginConfig, generalConfig).asSequence() + handleTestFile(files.map { it.test }.toList(), warnPluginConfig, generalConfig, batchSeparator).asSequence() } ?: run { - files.chunked(testConfig.evaluatedToolConfig.batchSize).flatMap { chunk -> - handleTestFile(chunk.map { it.test }, warnPluginConfig, generalConfig) + files.chunked(batchSize).flatMap { chunk -> + handleTestFile(chunk.map { it.test }, warnPluginConfig, generalConfig, batchSeparator) } } } @@ -110,7 +116,8 @@ class WarnPlugin( private fun handleTestFile( originalPaths: List, warnPluginConfig: WarnPluginConfig, - generalConfig: GeneralConfig + generalConfig: GeneralConfig, + batchSeparator: String, ): Sequence { // extracting all warnings from test resource files val copyPaths: List = createTestFiles(originalPaths, warnPluginConfig) @@ -127,7 +134,7 @@ class WarnPlugin( pb, generalConfig.execCmd, warnPluginConfig.execFlags, - testConfig.evaluatedToolConfig.batchSeparator, + batchSeparator, warnPluginConfig, testConfig, fs, diff --git a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPluginConfig.kt b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPluginConfig.kt index d41d825ff..49181ce17 100644 --- a/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPluginConfig.kt +++ b/save-plugins/warn-plugin/src/commonMain/kotlin/com/saveourtool/save/plugin/warn/WarnPluginConfig.kt @@ -8,6 +8,7 @@ import com.saveourtool.save.core.config.ExpectedWarningsFormat import com.saveourtool.save.core.config.TestConfigSections import com.saveourtool.save.core.plugin.PluginConfig import com.saveourtool.save.core.utils.RegexSerializer +import com.saveourtool.save.core.utils.requirePositive import okio.Path import okio.Path.Companion.toPath @@ -150,13 +151,13 @@ data class WarnPluginConfig( "TOO_LONG_FUNCTION" ) override fun validateAndSetDefaults(): WarnPluginConfig { - requirePositiveIfNotNull(lineCaptureGroup) - requirePositiveIfNotNull(columnCaptureGroup) - requirePositiveIfNotNull(messageCaptureGroup) - requirePositiveIfNotNull(fileNameCaptureGroupOut) - requirePositiveIfNotNull(lineCaptureGroupOut) - requirePositiveIfNotNull(columnCaptureGroupOut) - requirePositiveIfNotNull(messageCaptureGroupOut) + lineCaptureGroup?.let { requirePositive("lineCaptureGroup", it) } + columnCaptureGroup?.let { requirePositive("columnCaptureGroup", it) } + messageCaptureGroup?.let { requirePositive("messageCaptureGroup", it) } + fileNameCaptureGroupOut?.let { requirePositive("fileNameCaptureGroupOut", it) } + lineCaptureGroupOut?.let { requirePositive("lineCaptureGroupOut", it) } + columnCaptureGroupOut?.let { requirePositive("columnCaptureGroupOut", it) } + messageCaptureGroupOut?.let { requirePositive("messageCaptureGroupOut", it) } requireValidPatternForRegexInWarning() val expectedWarningsFormat = expectedWarningsFormat ?: ExpectedWarningsFormat.IN_PLACE @@ -210,17 +211,6 @@ data class WarnPluginConfig( } } - private fun requirePositiveIfNotNull(value: Long?) { - value?.let { - require(value >= 0) { - """ - [Configuration Error]: All integer values in [warn] section of `$configLocation` config should be positive! - Current configuration: ${this.toString().substringAfter("(").substringBefore(")")} - """.trimIndent() - } - } - } - private fun requireValidPatternForRegexInWarning() { patternForRegexInWarning?.let { require(patternForRegexInWarning.size == 2) { diff --git a/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt b/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt index c16d2f867..77b112cb8 100644 --- a/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt +++ b/save-plugins/warn-plugin/src/commonNonJsTest/kotlin/com/saveourtool/save/plugin/warn/WarnPluginTest.kt @@ -1,6 +1,5 @@ package com.saveourtool.save.plugin.warn -import com.saveourtool.save.core.config.EvaluatedToolConfig import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.fs @@ -412,7 +411,7 @@ class WarnPluginTest { texts: List, warnPluginConfig: WarnPluginConfig, generalConfig: GeneralConfig, - batchSize: Int = 1, + batchSize: Long = 1, assertion: (List) -> Unit, ) { val config = fs.createFile(tmpDir / "save.toml") @@ -427,8 +426,7 @@ class WarnPluginTest { TestConfig( config, null, - EvaluatedToolConfig(batchSize, ", "), - mutableListOf(warnPluginConfig, generalConfig), + mutableListOf(warnPluginConfig, generalConfig.copy(batchSize = batchSize)), emptyList(), fs ), From 5862b0895c020af29c788b2ebf39a180d3e39943 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Fri, 26 Aug 2022 19:00:08 +0300 Subject: [PATCH 16/19] updated OptionsTable.md --- OptionsTable.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/OptionsTable.md b/OptionsTable.md index 94954535f..b69af8126 100644 --- a/OptionsTable.md +++ b/OptionsTable.md @@ -12,6 +12,4 @@ Most (except for `-h` and `-prop`) of the options below can be passed to a SAVE | i | include-suites | Test suites, only which ones will be checked | - | | l | language | Language that you are developing analyzer for | UNDEFINED | | out | result-output | Data output stream | STDOUT | -| - | report-dir | Path to directory, where to store output (when `resultOutput` is set to `FILE`) | save-reports | -| - | batch-size | Number of files execCmd will process at a time | 1 | -| - | batch-separator | A separator to join test files to string if the tested tool supports processing of file batches (`batch-size` > 1) | , | \ No newline at end of file +| - | report-dir | Path to directory, where to store output (when `resultOutput` is set to `FILE`) | save-reports | \ No newline at end of file From 1d365f8707a5903e631548b3a21cf5c52d546df3 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Fri, 26 Aug 2022 19:56:47 +0300 Subject: [PATCH 17/19] detekt + compilation error + fixes in README.md --- .../com/saveourtool/save/cli/config/SavePropertiesExt.kt | 6 ------ .../kotlin/com/saveourtool/save/core/config/TestConfig.kt | 2 +- save-plugins/fix-and-warn-plugin/README.md | 4 ++-- save-plugins/fix-plugin/README.md | 4 ++-- .../kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt | 2 +- save-plugins/warn-plugin/README.md | 4 ++-- 6 files changed, 8 insertions(+), 14 deletions(-) diff --git a/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt b/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt index 8ef36b4bd..da2ce78b0 100644 --- a/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt +++ b/save-cli/src/commonNonJsMain/kotlin/com/saveourtool/save/cli/config/SavePropertiesExt.kt @@ -51,12 +51,6 @@ private fun SaveProperties.validate(): SaveProperties { " Please provide a valid path to the test config via command-line or using the file with properties." ) } - if (batchSize < 1) { - return logErrorAndExit( - ExitCodes.INVALID_CONFIGURATION, "Property `batch-size` should be more or equal to 1." - ) - } - return this } diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt index f9821d5fd..c78a417a8 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/config/TestConfig.kt @@ -177,7 +177,7 @@ data class TestConfig( * @return merged test config */ private fun mergeConfigWithParent(): TestConfig { - logDebug("Merging configs (with parental configs from higher directory level) for ${this.location}") + logDebug("Merging configs (with parental configs from higher directory level) for ${this.location}") parentConfig?.let { logTrace("Using parental config ${parentConfig.location} to merge it with child config: ${this.location}") diff --git a/save-plugins/fix-and-warn-plugin/README.md b/save-plugins/fix-and-warn-plugin/README.md index d8bafacfa..c41d84de1 100644 --- a/save-plugins/fix-and-warn-plugin/README.md +++ b/save-plugins/fix-and-warn-plugin/README.md @@ -18,14 +18,14 @@ their configuration as a subsections of `[fix and warn]` plugin. ```toml [general] execCmd="./ktlint -R diktat-0.4.2.jar" +batchSize = 1 +batchSeparator = ", " description = "My suite description" suiteName = "DocsCheck" [fix and warn] [fix and warn.fix] execFlags="-F" - batchSize = 1 - batchSeparator = ", " resourceNameTestSuffix = "Test" resourceNameExpectedSuffix = "Expected" [fix and warn.warn] diff --git a/save-plugins/fix-plugin/README.md b/save-plugins/fix-plugin/README.md index 540c6d47b..9d2fb31f3 100644 --- a/save-plugins/fix-plugin/README.md +++ b/save-plugins/fix-plugin/README.md @@ -39,13 +39,13 @@ language=kotlin ```toml [general] execCmd="./ktlint -R diktat-0.4.2.jar" +batchSize = 1 # (default value) +batchSeparator = ", " # (default value) description = "My suite description" suiteName = "DocsCheck" [fix] execFlags="-F" -batchSize = 1 # (default value) -batchSeparator = ", " # (default value) resourceNameTestSuffix = "Test" # (default value) resourceNameExpectedSuffix = "Expected" #(default value) ``` diff --git a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt index 9c42298c6..b4daa5b54 100644 --- a/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt +++ b/save-plugins/fix-plugin/src/commonMain/kotlin/com/saveourtool/save/plugins/fix/FixPlugin.kt @@ -67,7 +67,7 @@ class FixPlugin( private var tmpDirectory: Path? = null private lateinit var extraFlagsExtractor: ExtraFlagsExtractor - @Suppress("TOO_LONG_FUNCTION") + @Suppress("TOO_LONG_FUNCTION", "LongMethod") override fun handleFiles(files: Sequence): Sequence { testConfig.validateAndSetDefaults() val fixPluginConfig: FixPluginConfig = testConfig.pluginConfigs.singleIsInstance() diff --git a/save-plugins/warn-plugin/README.md b/save-plugins/warn-plugin/README.md index 63c30b378..1489b739d 100644 --- a/save-plugins/warn-plugin/README.md +++ b/save-plugins/warn-plugin/README.md @@ -79,6 +79,8 @@ you will need the following SAVE configuration: ```toml [general] execCmd = "./detekt" +batchSize = 1 # (default value) +batchSeparator = ", " # (default value) description = "My suite description" suiteName = "DocsCheck" language = "Kotlin" @@ -123,8 +125,6 @@ messageCaptureGroupEnd = 1 # (default value) warningTextHasColumn = true # (default value) warningTextHasLine = true # (default value) testNameRegex = ".*Test.*" # (default value) -batchSize = 1 # (default value) -batchSeparator = ", " # (default value) linePlaceholder = "$line" # (default value) patternForRegexInWarning = ["{{", "}}"] # if true - the regex created from expected warning will be wrapped with '.*': .*warn.*. From fa9ef3e9751146a82688db7d310ab4d5bb4d8d82 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Mon, 29 Aug 2022 10:31:23 +0300 Subject: [PATCH 18/19] fix tests --- .../save/core/utils/ValidationUtils.kt | 4 +- .../save/core/MergeAndOverrideConfigsTest.kt | 198 ++++++++++++++---- .../saveourtool/save/core/ValidationTest.kt | 61 ++++-- 3 files changed, 203 insertions(+), 60 deletions(-) diff --git a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/ValidationUtils.kt b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/ValidationUtils.kt index 86230c022..ffb6c00fa 100644 --- a/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/ValidationUtils.kt +++ b/save-common/src/commonMain/kotlin/com/saveourtool/save/core/utils/ValidationUtils.kt @@ -15,7 +15,7 @@ import com.saveourtool.save.core.plugin.PluginConfig */ fun T.requireNotNull(field: String, value: R?) = requireNotNull(value) { """ - Error: Couldn't find `$field` in [$type] section of `$configLocation` config. + Error: Couldn't find `$field` in [${type.name.lowercase()}] section of `$configLocation` config. Current configuration: ${this.currentConfiguration()} Please provide it in this, or at least in one of the parent configs. """.trimIndent() @@ -30,7 +30,7 @@ fun T.requireNotNull(field: String, value: R?) = req */ fun T.requirePositive(field: String, value: Long) = require(value >= 0) { """ - [Configuration Error]: `$field` in [$type] section of `$configLocation` config should be positive! + [Configuration Error]: `$field` in [${type.name.lowercase()}] section of `$configLocation` config should be positive! Current configuration: ${this.currentConfiguration()} """.trimIndent() } diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt index a5ca06555..e0286fb37 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -1,3 +1,8 @@ +@file:Suppress( + "FILE_IS_TOO_LONG", + "TOO_LONG_FUNCTION", +) + package com.saveourtool.save.core import com.saveourtool.save.core.config.TestConfig @@ -18,34 +23,116 @@ import okio.Path.Companion.toPath import kotlin.test.Test import kotlin.test.assertEquals -@Suppress( - "TOO_LONG_FUNCTION", - "LOCAL_VARIABLE_EARLY_DECLARATION", - "LONG_LINE", -) class MergeAndOverrideConfigsTest { private val extraFlagsPattern1 = Regex("// RUN: (.*)") private val extraFlagsPattern2 = Regex("## RUN: (.*)") - private val generalConfig1 = GeneralConfig("", 1, ", ", listOf("Tag11", "Tag12"), "Description1", "suiteName1", "Kotlin", listOf("excludedTests: test1"), runConfigPattern = extraFlagsPattern2) - private val generalConfig2 = GeneralConfig("", 1, ", ", listOf("Tag21"), "Description2", "suiteName2", "Kotlin", listOf("excludedTests: test3"), runConfigPattern = extraFlagsPattern1) - private val generalConfig3 = GeneralConfig("", 1, ", ", listOf("Tag21", "Tag31", "Tag32"), "Description2", "suiteName3", "Kotlin", listOf("excludedTests: test5", "includedTests: test6"), runConfigPattern = extraFlagsPattern2) - private val generalConfig4 = GeneralConfig("", 1, ", ", listOf("Tag11", "Tag21"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) + private val generalConfig1 = GeneralConfig( + execCmd = "execCmd1", + batchSize = 1, + batchSeparator = ", ", + tags = listOf("Tag11", "Tag12"), + description = "Description1", + suiteName = "suiteName1", + language = "Kotlin", + excludedTests = listOf("excludedTests: test1"), + runConfigPattern = extraFlagsPattern2 + ) + private val generalConfig2 = GeneralConfig( + execCmd = "execCmd2", + batchSize = 2, + batchSeparator = "; ", + tags = listOf("Tag21"), + description = "Description2", + suiteName = "suiteName2", + language = "Kotlin", + excludedTests = listOf("excludedTests: test3"), + runConfigPattern = extraFlagsPattern1 + ) + private val generalConfig3 = GeneralConfig( + execCmd = "execCmd3", + batchSize = 3, + batchSeparator = " ", + tags = listOf("Tag21", "Tag31", "Tag32"), + description = "Description2", + suiteName = "suiteName3", + language = "Kotlin", + excludedTests = listOf("excludedTests: test5", "includedTests: test6"), + runConfigPattern = extraFlagsPattern2 + ) + private val generalConfig4 = GeneralConfig( + execCmd = null, + batchSize = null, + batchSeparator = null, + tags = listOf("Tag11", "Tag21"), + description = "Description2", + suiteName = "suiteName4", + language = "Kotlin", + excludedTests = listOf("excludedTests: test7"), + runConfigPattern = extraFlagsPattern2 + ) private val warningsOutputPattern1 = Regex(".*") private val warningsOutputPattern2 = Regex("\\w+ - (\\d+)/(\\d+) - (.*)$") - private val warnConfig1 = WarnPluginConfig("execCmd1", warningsOutputPattern2, - false, false, 1, 1, 1, 1, 1, 1, 1, 1, 1, false, null) - private val warnConfig2 = WarnPluginConfig("execCmd2", warningsOutputPattern1, - true, true, 2, 2, 2, 1, 1, 2, 2, 2, 2, true, null) - private val warnConfig3 = WarnPluginConfig("execCmd3", warningsOutputPattern2, - warningTextHasColumn = false, lineCaptureGroup = 3, columnCaptureGroup = 3, messageCaptureGroup = 3, - fileNameCaptureGroupOut = 3, lineCaptureGroupOut = 3, columnCaptureGroupOut = 3, messageCaptureGroupOut = 3) - private val warnConfig4 = WarnPluginConfig("execCmd4", warningsOutputPattern2, - lineCaptureGroup = 4, columnCaptureGroup = 4, messageCaptureGroup = 4, - fileNameCaptureGroupOut = 4, lineCaptureGroupOut = 4, columnCaptureGroupOut = 4, messageCaptureGroupOut = 4) - private val fixConfig1 = FixPluginConfig("fixCmd1", "Suffix") - private val fixConfig2 = FixPluginConfig("fixCmd2") - private val fixConfig3 = FixPluginConfig("fixCmd3", null) - private val fixConfig4 = FixPluginConfig("fixCmd4") + private val warnConfig1 = WarnPluginConfig( + execFlags = "warnExecFlags1", + actualWarningsPattern = warningsOutputPattern2, + warningTextHasLine = false, + warningTextHasColumn = false, + lineCaptureGroup = 1, + columnCaptureGroup = 1, + messageCaptureGroup = 1, + messageCaptureGroupMiddle = 1, + messageCaptureGroupEnd = 1, + fileNameCaptureGroupOut = 1, + lineCaptureGroupOut = 1, + columnCaptureGroupOut = 1, + messageCaptureGroupOut = 1, + exactWarningsMatch = false, + testNameRegex = null + ) + private val warnConfig2 = WarnPluginConfig( + execFlags = "warnExecFlags2", + actualWarningsPattern = warningsOutputPattern1, + warningTextHasLine = true, + warningTextHasColumn = true, + lineCaptureGroup = 2, + columnCaptureGroup = 2, + messageCaptureGroup = 2, + messageCaptureGroupMiddle = 1, + messageCaptureGroupEnd = 1, + fileNameCaptureGroupOut = 2, + lineCaptureGroupOut = 2, + columnCaptureGroupOut = 2, + messageCaptureGroupOut = 2, + exactWarningsMatch = true, + testNameRegex = null + ) + private val warnConfig3 = WarnPluginConfig( + execFlags = "warnExecFlags3", + actualWarningsPattern = warningsOutputPattern2, + warningTextHasColumn = false, + lineCaptureGroup = 3, + columnCaptureGroup = 3, + messageCaptureGroup = 3, + fileNameCaptureGroupOut = 3, + lineCaptureGroupOut = 3, + columnCaptureGroupOut = 3, + messageCaptureGroupOut = 3 + ) + private val warnConfig4 = WarnPluginConfig( + execFlags = "warnExecFlags4", + actualWarningsPattern = warningsOutputPattern2, + lineCaptureGroup = 4, + columnCaptureGroup = 4, + messageCaptureGroup = 4, + fileNameCaptureGroupOut = 4, + lineCaptureGroupOut = 4, + columnCaptureGroupOut = 4, + messageCaptureGroupOut = 4 + ) + private val fixConfig1 = FixPluginConfig(execFlags = "fixExecFlags1", resourceNameTestSuffix = "Suffix") + private val fixConfig2 = FixPluginConfig(execFlags = "fixExecFlags2") + private val fixConfig3 = FixPluginConfig(execFlags = "fixExecFlags3", resourceNameTestSuffix = null) + private val fixConfig4 = FixPluginConfig(execFlags = "fixExecFlags4") @Test fun `merge and override general configs`() { @@ -56,7 +143,9 @@ class MergeAndOverrideConfigsTest { assertEquals(1, config2ForMerge.size) assertEquals( GeneralConfig( - execCmd = "", + execCmd = "execCmd2", + batchSize = 2, + batchSeparator = "; ", tags = listOf("Tag11", "Tag12", "Tag21"), description = "Description2", suiteName = "suiteName2", @@ -72,7 +161,9 @@ class MergeAndOverrideConfigsTest { assertEquals(1, config2ForOverride.size) assertEquals( GeneralConfig( - execCmd = "", + execCmd = "execCmd1", + batchSize = 1, + batchSeparator = ", ", tags = listOf("Tag21", "Tag11", "Tag12"), description = "Description1", suiteName = "suiteName1", @@ -93,7 +184,9 @@ class MergeAndOverrideConfigsTest { assertEquals(2, config2ForMerge.size) assertEquals( GeneralConfig( - execCmd = "", + execCmd = "execCmd2", + batchSize = 2, + batchSeparator = "; ", tags = listOf("Tag11", "Tag12", "Tag21"), description = "Description2", suiteName = "suiteName2", @@ -110,7 +203,9 @@ class MergeAndOverrideConfigsTest { assertEquals(2, config2ForOverride.size) assertEquals( GeneralConfig( - execCmd = "", + execCmd = "execCmd1", + batchSize = 1, + batchSeparator = ", ", tags = listOf("Tag21", "Tag11", "Tag12"), description = "Description1", suiteName = "suiteName1", @@ -149,7 +244,9 @@ class MergeAndOverrideConfigsTest { assertEquals(3, config2ForMerge.size) assertEquals( GeneralConfig( - execCmd = "", + execCmd = "execCmd2", + batchSize = 2, + batchSeparator = "; ", tags = listOf("Tag11", "Tag12", "Tag21"), description = "Description2", suiteName = "suiteName2", @@ -161,7 +258,7 @@ class MergeAndOverrideConfigsTest { ) assertEquals( WarnPluginConfig( - execFlags = "execCmd3", + execFlags = "warnExecFlags3", actualWarningsPattern = warningsOutputPattern2, warningTextHasLine = true, warningTextHasColumn = false, @@ -180,7 +277,7 @@ class MergeAndOverrideConfigsTest { config2ForMerge.singleIsInstance() ) assertEquals( - FixPluginConfig("fixCmd2", "Suffix"), + FixPluginConfig("fixExecFlags2", "Suffix"), config2ForMerge.singleIsInstance()) val config2ForOverride = mutableListOf(generalConfig2, warnConfig3, fixConfig2) @@ -188,7 +285,9 @@ class MergeAndOverrideConfigsTest { assertEquals(3, config2ForOverride.size) assertEquals( GeneralConfig( - execCmd = "", + execCmd = "execCmd1", + batchSize = 1, + batchSeparator = ", ", tags = listOf("Tag21", "Tag11", "Tag12"), description = "Description1", suiteName = "suiteName1", @@ -200,7 +299,7 @@ class MergeAndOverrideConfigsTest { ) assertEquals( WarnPluginConfig( - execFlags = "execCmd2", + execFlags = "warnExecFlags2", actualWarningsPattern = warningsOutputPattern1, warningTextHasLine = true, warningTextHasColumn = true, @@ -220,7 +319,7 @@ class MergeAndOverrideConfigsTest { ) assertEquals( FixPluginConfig( - execFlags = "fixCmd1", + execFlags = "fixExecFlags1", resourceNameTestSuffix = "Suffix", ), config2ForOverride.singleIsInstance()) @@ -240,10 +339,35 @@ class MergeAndOverrideConfigsTest { assertEquals(3, config4.size) val expectedGeneralConfig = - GeneralConfig("", 1, ", ", listOf("Tag11", "Tag12", "Tag21", "Tag31", "Tag32"), "Description2", "suiteName4", "Kotlin", listOf("excludedTests: test7"), runConfigPattern = extraFlagsPattern2) - val expectedWarnConfig = WarnPluginConfig("execCmd4", warningsOutputPattern2, - true, false, 4, 4, 4, 1, 1, 4, 4, 4, 4, true, null) - val expectedFixConfig = FixPluginConfig("fixCmd4", "Suffix") + GeneralConfig( + execCmd = "execCmd3", + batchSize = 3, + batchSeparator = " ", + tags = listOf("Tag11", "Tag12", "Tag21", "Tag31", "Tag32"), + description = "Description2", + suiteName = "suiteName4", + language = "Kotlin", + excludedTests = listOf("excludedTests: test7"), + runConfigPattern = extraFlagsPattern2 + ) + val expectedWarnConfig = WarnPluginConfig( + execFlags = "warnExecFlags4", + actualWarningsPattern = warningsOutputPattern2, + warningTextHasLine = true, + warningTextHasColumn = false, + lineCaptureGroup = 4, + columnCaptureGroup = 4, + messageCaptureGroup = 4, + messageCaptureGroupMiddle = 1, + messageCaptureGroupEnd = 1, + fileNameCaptureGroupOut = 4, + lineCaptureGroupOut = 4, + columnCaptureGroupOut = 4, + messageCaptureGroupOut = 4, + exactWarningsMatch = true, + testNameRegex = null + ) + val expectedFixConfig = FixPluginConfig(execFlags = "fixExecFlags4", resourceNameTestSuffix = "Suffix") val actualGeneralConfig: GeneralConfig = config4.singleIsInstance() val actualWarnConfig: WarnPluginConfig = config4.singleIsInstance() diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt index 235d955ae..b70b830cd 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/ValidationTest.kt @@ -8,12 +8,10 @@ import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPluginConfig import okio.Path.Companion.toPath - import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.test.assertTrue +import kotlin.test.fail -@Suppress("LONG_LINE") class ValidationTest { @Test fun `set defaults to general section`() { @@ -26,16 +24,17 @@ class ValidationTest { val actualGeneralConfig1: GeneralConfig = config.singleIsInstance() assertEquals(emptyList(), actualGeneralConfig1.excludedTests) + assertEquals(1, actualGeneralConfig1.batchSize) + assertEquals(", ", actualGeneralConfig1.batchSeparator) } @Test fun `invalid general section`() { - val generalConfig = GeneralConfig() - val config: MutableList = mutableListOf(generalConfig) - generalConfig.configLocation = "./some-path".toPath() - try { - config.validateAndSetDefaults() - } catch (ex: IllegalArgumentException) { + val generalConfig = GeneralConfig().apply { + configLocation = "./some-path".toPath() + } + + assertException(generalConfig) { ex -> assertEquals( """ Error: Couldn't find `execCmd` in [general] section of `${generalConfig.configLocation}` config. @@ -45,6 +44,17 @@ class ValidationTest { ex.message ) } + + val generalConfigWithInvalidBatchSize = generalConfig.copy(execCmd = "execCmd", batchSize = -1) + assertException(generalConfigWithInvalidBatchSize) { ex -> + assertEquals( + """ + [Configuration Error]: `batchSize` in [general] section of `${generalConfigWithInvalidBatchSize.configLocation}` config should be positive! + Current configuration: ${generalConfigWithInvalidBatchSize.toString().substringAfter("(").substringBefore(")")} + """.trimIndent(), + ex.message + ) + } } @Test @@ -126,18 +136,17 @@ class ValidationTest { // `lineCaptureGroup` provided, but incorrect -- error @Test fun `validate warn section 4`() { - val warnConfig = WarnPluginConfig(execFlags = "execFlags", lineCaptureGroup = -127) - val config: MutableList = mutableListOf(warnConfig) - warnConfig.configLocation = "./some-location".toPath() - try { - config.validateAndSetDefaults() - } catch (ex: IllegalArgumentException) { - assertTrue("Exception message content incorrect: ${ex.message}") { - ex.message!!.startsWith( - "[Configuration Error]: All integer values in [warn] section of `${warnConfig.configLocation}` config should be positive!" + - "\nCurrent configuration: " - ) - } + val warnConfig = WarnPluginConfig(execFlags = "execFlags", lineCaptureGroup = -127).apply { + configLocation = "./some-location".toPath() + } + assertException(warnConfig) { ex -> + assertEquals( + """ + [Configuration Error]: `lineCaptureGroup` in [warn] section of `${warnConfig.configLocation}` config should be positive! + Current configuration: ${warnConfig.toString().substringAfter("(").substringBefore(")")} + """.trimIndent(), + ex.message + ) } } @@ -154,4 +163,14 @@ class ValidationTest { assertEquals("Test", actualFixConfig.resourceNameTest) assertEquals("Expected", actualFixConfig.resourceNameExpected) } + + private fun assertException(pluginConfig: PluginConfig, validation: (IllegalArgumentException) -> Unit) { + try { + val config: MutableList = mutableListOf(pluginConfig) + config.validateAndSetDefaults() + fail("Expect exception with type ${IllegalArgumentException::class}") + } catch (ex: IllegalArgumentException) { + validation(ex) + } + } } From f351e7d69348ad03b6d43d21d19b69008e28655c Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Mon, 29 Aug 2022 13:09:50 +0300 Subject: [PATCH 19/19] fix parent processing + added a test for it --- .../save/core/utils/TestConfigUtils.kt | 2 +- .../save/core/MergeAndOverrideConfigsTest.kt | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt index 0888defc5..b60ee9d8c 100644 --- a/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt +++ b/save-core/src/commonNonJsMain/kotlin/com/saveourtool/save/core/utils/TestConfigUtils.kt @@ -26,7 +26,7 @@ fun TestConfig.processInPlace() = processInPlace { * @return [this] config with all descendants being evaluated (`pluginConfigs` are filled with data and merged with parents) */ fun TestConfig.processWithParentsInPlace(): TestConfig { - parentConfig?.processInPlace() + parentConfig?.processWithParentsInPlace() return processInPlace() } diff --git a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt index e0286fb37..a79a7703a 100644 --- a/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt +++ b/save-core/src/commonNonJsTest/kotlin/com/saveourtool/save/core/MergeAndOverrideConfigsTest.kt @@ -8,13 +8,16 @@ package com.saveourtool.save.core import com.saveourtool.save.core.config.TestConfig import com.saveourtool.save.core.config.resolveSaveOverridesTomlConfig import com.saveourtool.save.core.config.resolveSaveTomlConfig +import com.saveourtool.save.core.files.createFile import com.saveourtool.save.core.files.fs import com.saveourtool.save.core.plugin.GeneralConfig import com.saveourtool.save.core.plugin.PluginConfig import com.saveourtool.save.core.utils.createPluginConfigListFromToml import com.saveourtool.save.core.utils.mergeWith import com.saveourtool.save.core.utils.overrideBy +import com.saveourtool.save.core.utils.processWithParentsInPlace import com.saveourtool.save.core.utils.singleIsInstance +import com.saveourtool.save.createTempDir import com.saveourtool.save.plugin.warn.WarnPluginConfig import com.saveourtool.save.plugins.fix.FixPluginConfig @@ -455,4 +458,57 @@ class MergeAndOverrideConfigsTest { ), result.singleIsInstance()) } + + @Test + fun `load save toml from middle hierarchy`() { + val tmpDir = fs.createTempDir() + val generalConfig1 = GeneralConfig( + execCmd = "execCmd" + ) + val testConfig1 = TestConfig( + location = tmpDir.resolveSaveTomlConfig() + .also { fs.createFile(it) }, + parentConfig = null, + pluginConfigs = mutableListOf( + generalConfig1 + ), + overridesPluginConfigs = emptyList(), + fs = fs + ) + val testConfig2 = TestConfig( + location = tmpDir.resolve("sub-folder") + .also { fs.createDirectories(it) } + .resolveSaveTomlConfig() + .also { fs.createFile(it) }, + parentConfig = testConfig1, + pluginConfigs = mutableListOf(), + overridesPluginConfigs = emptyList(), + fs = fs + ) + val testConfig3 = TestConfig( + location = tmpDir.resolve("sub-folder").resolve("sub-sub-folder") + .also { fs.createDirectories(it) } + .resolveSaveTomlConfig() + .also { fs.createFile(it) }, + parentConfig = testConfig2, + pluginConfigs = mutableListOf(), + overridesPluginConfigs = emptyList(), + fs = fs + ) + val testConfig4 = TestConfig( + location = tmpDir.resolve("sub-folder").resolve("sub-sub-folder").resolve("sub-sub-sub-folder") + .also { fs.createDirectories(it) } + .resolveSaveTomlConfig() + .also { fs.createFile(it) }, + parentConfig = testConfig3, + pluginConfigs = mutableListOf(), + overridesPluginConfigs = emptyList(), + fs = fs + ) + + testConfig4.processWithParentsInPlace() + + assertEquals(generalConfig1, testConfig4.getGeneralConfig()) + fs.deleteRecursively(tmpDir) + } }