diff --git a/source/dub/dub.d b/source/dub/dub.d index e06b1c0..3ad3e56 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -194,76 +194,82 @@ { if (custom_main_file.length && !custom_main_file.absolute) custom_main_file = getWorkingDirectory() ~ custom_main_file; - auto test_config = format("__test__%s__", config); - - BuildSettings lbuildsettings = build_settings; - m_project.addBuildSettings(lbuildsettings, platform, config); - enforce(lbuildsettings.targetType != TargetType.executable && lbuildsettings.targetType != TargetType.none, - "Can only test configurations with a library target type."); - enforce(lbuildsettings.mainSourceFile.length, `A "mainSourceFile" is required for testing, but none was set or inferred.`); - - BuildSettingsTemplate tcinfo = m_project.mainPackage.info.getConfiguration(config).buildSettings; - tcinfo.targetType = TargetType.executable; - tcinfo.targetName = test_config; - tcinfo.versions[""] ~= "VibeCustomMain"; // HACK for vibe.d's legacy main() behavior - string custommodname; - if (custom_main_file.length) { - import std.path; - tcinfo.sourceFiles[""] ~= custom_main_file.relativeTo(m_project.mainPackage.path).toNativeString(); - tcinfo.importPaths[""] ~= custom_main_file.parentPath.toNativeString(); - custommodname = custom_main_file.head.toString().baseName(".d"); - } - - auto mainmodname = lbuildsettings.determineModuleName(Path(lbuildsettings.mainSourceFile), m_project.mainPackage.path); - - // generate main file - Path mainfile = getTempDir() ~ "test_main.d"; - tcinfo.sourceFiles[""] ~= mainfile.toNativeString(); - tcinfo.mainSourceFile = mainfile.toNativeString(); - if (!m_dryRun) { - auto fil = openFile(mainfile, FileMode.CreateTrunc); - scope(exit) fil.close(); - if (custommodname.length) { - fil.write(format(q{ - module test_main; - import %s; - import %s; - }, mainmodname, custommodname)); - } else { - fil.write(format(q{ - module test_main; - import %s; - import std.stdio; - import core.runtime; - - void main() { writeln("All unit tests were successful."); } - shared static this() { - version (Have_tested) { - import core.runtime; - Runtime.moduleUnitTester = () => true; - //runUnitTests!app(new JsonTestResultWriter("results.json")); - assert(runUnitTests!%s(new ConsoleTestResultWriter), "Unit tests failed."); - } - } - }, mainmodname, mainmodname)); - } - } - m_project.mainPackage.info.configurations ~= ConfigurationInfo(test_config, tcinfo); - m_project = new Project(m_packageManager, m_project.mainPackage); - - BuildSettings tbuildsettings = build_settings; - m_project.addBuildSettings(tbuildsettings, platform, test_config); - auto generator = createProjectGenerator("build", m_project, m_packageManager); GeneratorSettings settings; settings.platform = platform; settings.compiler = getCompiler(platform.compilerBinary); - settings.config = test_config; settings.buildType = "unittest"; - settings.buildSettings = tbuildsettings; + settings.buildSettings = build_settings; settings.run = true; settings.runArgs = run_args; - if (m_dryRun) return; + + auto test_config = format("__test__%s__", config); + + BuildSettings lbuildsettings = build_settings; + m_project.addBuildSettings(lbuildsettings, platform, config); + if (lbuildsettings.targetType == TargetType.none) { + logInfo(`Configuration '%s' has target type "none". Skipping test.`, config); + return; + } + + if (lbuildsettings.targetType == TargetType.executable) { + logInfo(`Configuration '%s' does not output a library. Running "dub build -b unittest" instead.`, config); + settings.config = config; + } else { + enforce(lbuildsettings.mainSourceFile.length, `A "mainSourceFile" is required for testing, but none was set or inferred.`); + + BuildSettingsTemplate tcinfo = m_project.mainPackage.info.getConfiguration(config).buildSettings; + tcinfo.targetType = TargetType.executable; + tcinfo.targetName = test_config; + tcinfo.versions[""] ~= "VibeCustomMain"; // HACK for vibe.d's legacy main() behavior + string custommodname; + if (custom_main_file.length) { + import std.path; + tcinfo.sourceFiles[""] ~= custom_main_file.relativeTo(m_project.mainPackage.path).toNativeString(); + tcinfo.importPaths[""] ~= custom_main_file.parentPath.toNativeString(); + custommodname = custom_main_file.head.toString().baseName(".d"); + } + + auto mainmodname = lbuildsettings.determineModuleName(Path(lbuildsettings.mainSourceFile), m_project.mainPackage.path); + + // generate main file + Path mainfile = getTempDir() ~ "test_main.d"; + tcinfo.sourceFiles[""] ~= mainfile.toNativeString(); + tcinfo.mainSourceFile = mainfile.toNativeString(); + if (!m_dryRun) { + auto fil = openFile(mainfile, FileMode.CreateTrunc); + scope(exit) fil.close(); + if (custommodname.length) { + fil.write(format(q{ + module test_main; + import %s; + import %s; + }, mainmodname, custommodname)); + } else { + fil.write(format(q{ + module test_main; + import %s; + import std.stdio; + import core.runtime; + + void main() { writeln("All unit tests were successful."); } + shared static this() { + version (Have_tested) { + import core.runtime; + Runtime.moduleUnitTester = () => true; + //runUnitTests!app(new JsonTestResultWriter("results.json")); + assert(runUnitTests!%s(new ConsoleTestResultWriter), "Unit tests failed."); + } + } + }, mainmodname, mainmodname)); + } + } + m_project.mainPackage.info.configurations ~= ConfigurationInfo(test_config, tcinfo); + m_project = new Project(m_packageManager, m_project.mainPackage); + + settings.config = test_config; + } + generator.generateProject(settings); }