diff --git a/changelog/build_unittest.dd b/changelog/build_unittest.dd new file mode 100644 index 0000000..13825b8 --- /dev/null +++ b/changelog/build_unittest.dd @@ -0,0 +1,5 @@ +Building the special test runner configuration + +`dub build --config=unittest --build=unittest[-cov]` can now be used to +mimic building the test runner executable of `dub test [--coverage]`. +Note that this doesn't require an existing `unittest` configuration. diff --git a/source/dub/commandline.d b/source/dub/commandline.d index d7be6fe..3fa87b2 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -1015,7 +1015,8 @@ m_defaultConfig = null; enforce (loadSpecificPackage(dub, package_name, ver), "Failed to load package."); - if (m_buildConfig.length != 0 && !dub.configurations.canFind(m_buildConfig)) + if (m_buildConfig.length != 0 && !dub.configurations.canFind(m_buildConfig) && + m_buildConfig != "unittest") { string msg = "Unknown build configuration: "~m_buildConfig; enum distance = 3; @@ -1181,8 +1182,16 @@ gensettings.single = m_single; logDiagnostic("Generating using %s", m_generator); - dub.generateProject(m_generator, gensettings); + + // With an explicitly requested `unittest` config, switch to the special test + // runner config (which doesn't require an existing `unittest` configuration). + if (m_buildConfig == "unittest") + dub.testProject(m_generator, gensettings, null, NativePath()); + else + dub.generateProject(m_generator, gensettings); + if (m_buildType == "ddox") dub.runDdox(gensettings.run, app_args); + return 0; } } @@ -1403,7 +1412,7 @@ settings.runArgs = app_args; settings.single = m_single; - dub.testProject(settings, m_buildConfig, NativePath(m_mainFile)); + dub.testProject("build", settings, m_buildConfig, NativePath(m_mainFile)); return 0; } } diff --git a/source/dub/dub.d b/source/dub/dub.d index 0bc56eb..8e1b609 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -646,11 +646,11 @@ generator.generate(settings); } - /** Executes tests on the current project. + /** Generate project files using the special test runner (`dub test`) configuration. - Throws an exception, if unittests failed. + Any existing project files will be overridden. */ - void testProject(GeneratorSettings settings, string config, NativePath custom_main_file) + void testProject(string ide, GeneratorSettings settings, string config, NativePath custom_main_file) { if (!custom_main_file.empty && !custom_main_file.absolute) custom_main_file = getWorkingDirectory() ~ custom_main_file; @@ -665,7 +665,7 @@ if (!config.length) config = m_project.getDefaultConfiguration(settings.platform, true); } - auto generator = createProjectGenerator("build", m_project); + auto generator = createProjectGenerator(ide, m_project); auto test_config = format("%s-test-%s", m_project.rootPackage.name.replace(".", "-").replace(":", "-"), config); @@ -673,16 +673,16 @@ m_project.addBuildSettings(lbuildsettings, settings, config, null, true); if (lbuildsettings.targetType == TargetType.none) { - logInfo(`Configuration '%s' has target type "none". Skipping test.`, config); + logInfo(`Configuration '%s' has target type "none". Skipping test runner build.`, config); return; } if (lbuildsettings.targetType == TargetType.executable && config == "unittest") { - logInfo("Running custom 'unittest' configuration.", config); + logInfo("Building custom 'unittest' configuration.", config); if (!custom_main_file.empty) logWarn("Ignoring custom main file."); settings.config = config; } else if (lbuildsettings.sourceFiles.empty) { - logInfo(`No source files found in configuration '%s'. Falling back to "dub -b unittest".`, config); + logInfo(`No source files found in configuration '%s'. Falling back to default configuration.`, config); if (!custom_main_file.empty) logWarn("Ignoring custom main file."); settings.config = m_project.getDefaultConfiguration(settings.platform); } else { @@ -787,6 +787,7 @@ settings.config = test_config; } + if (m_dryRun) return; // TODO: pass m_dryRun to the generator generator.generate(settings); } diff --git a/test/issue1856-build-unittest.sh b/test/issue1856-build-unittest.sh new file mode 100755 index 0000000..7db7f1c --- /dev/null +++ b/test/issue1856-build-unittest.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +set -euo pipefail + +TMPDIR=$(mktemp -d "$(basename "$0").XXXXXX") + +function cleanup { + rm -rf "$TMPDIR" +} +trap cleanup EXIT + +# no unittest config +cat > "$TMPDIR/no_ut.d" < "$TMPDIR/partial_ut.d" < "$TMPDIR/full_ut.d" <