public void TestOutputFileSwitch() { var obj = new EmAr { OutputFile = new TaskItem("ABC.a") }; var result = WriteSwitchesToString(obj); var mockFileLoc = Environment.CurrentDirectory; Assert.AreEqual($@" rc {mockFileLoc}\ABC.a", result); obj.OutputFile = new TaskItem("Z:/Some Space / Separated Drive/A B C.a"); var result1 = WriteSwitchesToString(obj); Assert.AreEqual(" rc \"Z:\\Some Space \\ Separated Drive\\A B C.a\"", result1); }
private static ITaskItem[] MergeObjectFiles(EmCxx[] objects, EmAr lib = null) { var items = new ITaskItem[objects.Length + (lib != null ? 1 : 0)]; var i = 0; foreach (var obj in objects) { items[i] = new TaskItem(obj.ObjectFileName); ++i; } if (lib != null) { items[i] = new TaskItem(lib.OutputFile); } return(items); }
public void TestDefaults() { var obj = new EmAr(); // EmTask Settings Assert.AreEqual(null, obj.BuildEngine); Assert.AreEqual(null, obj.HostObject); Assert.AreEqual(null, obj.TrackerLogDirectory); Assert.AreNotEqual(null, obj.TLogReadFiles); Assert.AreNotEqual(null, obj.TLogWriteFiles); Assert.AreEqual(@"EmAr.read.1.tlog", obj.TLogReadFiles[0].ItemSpec); Assert.AreEqual(@"EmAr.write.1.tlog", obj.TLogWriteFiles[0].ItemSpec); Assert.AreEqual(null, obj.Sources); Assert.AreEqual(true, obj.MinimalRebuildFromTracking); Assert.AreEqual(null, obj.DebugProp1); Assert.AreEqual(null, obj.DebugProp2); Assert.AreEqual(false, obj.DebugProp3); Assert.AreEqual(false, obj.SkippedExecution); Assert.AreEqual(false, obj.Verbose); Assert.AreEqual(false, obj.EchoCommandLines); Assert.AreEqual(null, obj.AllSource); // Points to static data, so it's dependent on the whole test set // and is valid only if ValidateSdk is called. It's not public, so... if (obj.EmscriptenDirectory != null) { Assert.IsTrue(obj.EmscriptenDirectory.Contains(@"\upstream\emscripten")); } if (obj.EmccTool != null) { Assert.IsTrue(obj.EmccTool.EndsWith("emcc.bat")); } // EmAr Assert.AreEqual(null, obj.OutputFile); }
public void MultiDependencyRebuild() { ClearIfExists(IntDir); var engine = new EmptyBuildEngine(); TLogSub = "StaticObjectLogs"; var objects = SetupStaticLibrary(engine); CompileObjectFiles(objects); var ar = new EmAr { BuildEngine = engine, TrackerLogDirectory = TLogDirectory, OutputFile = new TaskItem($@"{CurrentDirectory}\{IntDir}\libInput.a"), Sources = MergeObjectFiles(objects), }; ExecuteAndAssertUpToDate(ar); Assert.IsTrue(File.Exists(ar.OutputFile.ItemSpec)); File.Delete(ar.OutputFile.ItemSpec); Assert.IsTrue(ar.Execute()); Assert.IsTrue(File.Exists(ar.OutputFile.ItemSpec)); TLogSub = "ExecutableLogs"; var exeObjects = SetupExecutable(engine); CompileObjectFiles(exeObjects); var lnk = new EmLink { ConfigurationType = "Application", BuildEngine = engine, TrackerLogDirectory = TLogDirectory, OutputFile = new TaskItem($@"{CurrentDirectory}\{IntDir}\mdr.wasm"), Sources = MergeObjectFiles(exeObjects, ar), }; ExecuteAndAssertUpToDate(lnk); Assert.IsTrue(File.Exists(lnk.OutputFile.ItemSpec)); File.Delete(lnk.OutputFile.ItemSpec); Assert.IsTrue(!File.Exists(lnk.OutputFile.ItemSpec)); Assert.IsTrue(lnk.Execute()); Assert.IsTrue(!lnk.SkippedExecution); Assert.IsTrue(File.Exists(lnk.OutputFile.ItemSpec)); // delete the archive and attempt to rebuild File.Delete(ar.OutputFile.ItemSpec); Assert.AreEqual(false, lnk.Execute(), "EmLink.Execute did not fail with invalid input"); // regenerate the archive ExecuteAndAssertUpToDate(ar); // it should link again ExecuteAndAssertUpToDate(lnk); var output = Spawn(Wavm, $"run {lnk.OutputFile.ItemSpec}"); Assert.AreEqual("Called SomePrototypeInTheExecutableSource\n" + "Called Input1PrototypeInTheStaticLibrarySource\n" + "Called Input2PrototypeInTheStaticLibrarySource\n" + "Called Input3PrototypeInTheStaticLibrarySource\n", output); // modify the source files and assert that everything rebuilds SwapStringInFiles(objects, "PrototypeInTheStaticLibrarySource", "__Swapped_Text__"); CompileObjectFiles(objects); ExecuteAndAssertUpToDate(ar); ExecuteAndAssertUpToDate(lnk); output = Spawn(Wavm, $"run {lnk.OutputFile.ItemSpec}"); Assert.AreEqual("Called SomePrototypeInTheExecutableSource\n" + "Called Input1__Swapped_Text__\n" + "Called Input2__Swapped_Text__\n" + "Called Input3__Swapped_Text__\n", output); // swap it back to create a cycle SwapStringInFiles(objects, "__Swapped_Text__", "PrototypeInTheStaticLibrarySource"); CompileObjectFiles(objects); ExecuteAndAssertUpToDate(ar); ExecuteAndAssertUpToDate(lnk); output = Spawn(Wavm, $"run {lnk.OutputFile.ItemSpec}"); Assert.AreEqual("Called SomePrototypeInTheExecutableSource\n" + "Called Input1PrototypeInTheStaticLibrarySource\n" + "Called Input2PrototypeInTheStaticLibrarySource\n" + "Called Input3PrototypeInTheStaticLibrarySource\n", output); }