using System; using System.Collections.Generic; using System.Linq; using System.Runtime; using Alphaleonis.Win32.Filesystem; using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting.Logging; using VFS; using Wabbajack.Common; namespace Wabbajack.Test { [TestClass] public class SanityTests { public TestContext TestContext { get; set; } private TestUtils utils { get; set; } [TestInitialize] public void TestInitialize() { Consts.TestMode = true; utils = new TestUtils(); utils.GameName = "Skyrim Special Edition"; Utils.SetStatusFn((f, idx) => { }); Utils.SetLoggerFn(f => TestContext.WriteLine(f)); WorkQueue.Init((x, y, z) => { }, (min, max) => { }); } [TestCleanup] public void TestCleanup() { utils.Dispose(); } [TestMethod] public void TestDirectMatch() { var profile = utils.AddProfile(); var mod = utils.AddMod(); var test_pex = utils.AddModFile(mod, @"Data\scripts\test.pex", 10); utils.Configure(); utils.AddManualDownload( new Dictionary {{"/baz/biz.pex", File.ReadAllBytes(test_pex)}}); CompileAndInstall(profile); utils.VerifyInstalledFile(mod, @"Data\scripts\test.pex"); } [TestMethod] public void UnmodifiedInlinedFilesArePulledFromArchives() { var profile = utils.AddProfile(); var mod = utils.AddMod(); var ini = utils.AddModFile(mod, @"foo.ini", 10); utils.Configure(); utils.AddManualDownload( new Dictionary { { "/baz/biz.pex", File.ReadAllBytes(ini) } }); var modlist = CompileAndInstall(profile); var directive = modlist.Directives.Where(m => m.To == $"mods\\{mod}\\foo.ini").FirstOrDefault(); Assert.IsNotNull(directive); Assert.IsInstanceOfType(directive, typeof(FromArchive)); } [TestMethod] public void ModifiedIniFilesArePatchedAgainstFileWithSameName() { var profile = utils.AddProfile(); var mod = utils.AddMod(); var ini = utils.AddModFile(mod, @"foo.ini", 10); utils.Configure(); utils.AddManualDownload( new Dictionary { { "/baz/foo.ini", File.ReadAllBytes(ini) } }); // Modify after creating mod archive in the downloads folder File.WriteAllText(ini, "Wabbajack, Wabbajack, Wabbajack!"); var modlist = CompileAndInstall(profile); var directive = modlist.Directives.Where(m => m.To == $"mods\\{mod}\\foo.ini").FirstOrDefault(); Assert.IsNotNull(directive); Assert.IsInstanceOfType(directive, typeof(PatchedFromArchive)); } private ModList CompileAndInstall(string profile) { var compiler = ConfigureAndRunCompiler(profile); Install(compiler); return compiler.ModList; } private void Install(Compiler compiler) { var modlist = Installer.LoadFromFile(compiler.ModListOutputFile); var installer = new Installer(compiler.ModListOutputFile, modlist, utils.InstallFolder); installer.DownloadFolder = utils.DownloadsFolder; installer.GameFolder = utils.GameFolder; installer.Install(); } private Compiler ConfigureAndRunCompiler(string profile) { VirtualFileSystem.Reconfigure(utils.TestFolder); var compiler = new Compiler(utils.MO2Folder); compiler.VFS.Reset(); compiler.MO2Profile = profile; compiler.ShowReportWhenFinished = false; Assert.IsTrue(compiler.Compile()); return compiler; } } }