示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }