public void TestTLKs() { GlobalTest.Init(); Console.WriteLine(@"Testing TLK operations"); var tlksDir = Path.Combine(GlobalTest.FindDirectoryInParentDirectories(GlobalTest.TESTDATA_FOLDER_NAME), "tlk", "me3"); var tlksToTestOn = Directory.GetFiles(tlksDir, "*.tlk", SearchOption.AllDirectories); foreach (var tlk in tlksToTestOn) { TalkFile talkFileMe2 = new TalkFile(); talkFileMe2.LoadTlkData(tlk); var tlkStream = ME3ExplorerCore.TLK.ME2ME3.HuffmanCompression.SaveToTlkStream(talkFileMe2.StringRefs); var reloadedTlk = new TalkFile(); tlkStream.Position = 0; reloadedTlk.LoadTlkDataFromStream(tlkStream); foreach (var v in talkFileMe2.StringRefs) { var fd = reloadedTlk.findDataById(v.StringID); if (fd == "\"Male\"") { continue; //Male/Female, we don't have way to distinguish these } Assert.AreEqual($"\"{v.Data}\"", fd); } } }
public void ValidateArchiveModLoading() { GlobalTest.Init(); Console.WriteLine("Fetching third party services"); App.ThirdPartyImportingService = OnlineContent.FetchThirdPartyImportingService(); App.ThirdPartyIdentificationService = OnlineContent.FetchThirdPartyIdentificationManifest(); var compressedModsDirectory = Path.Combine(GlobalTest.FindDirectoryInParentDirectories(GlobalTest.TESTDATA_FOLDER_NAME), "compressedmods"); List <Mod> modsFoundInArchive = new List <Mod>(); void addModCallback(Mod m) { Console.WriteLine($"Found mod in archive: {m.ModName}"); modsFoundInArchive.Add(m); } void failedModCallback(Mod m) { Console.WriteLine($"A mod failed to load. This may be expected: {m.ModName}"); } void logMessageCallback(string m) { Console.WriteLine(m); } foreach (var archive in Directory.GetFiles(compressedModsDirectory)) { modsFoundInArchive.Clear(); var realArchiveInfo = GlobalTest.ParseRealArchiveAttributes(archive); Console.WriteLine($"Inspecting archive: { archive}"); ModArchiveImporter.InspectArchive(archive, addModCallback, failedModCallback, logMessageCallback, forcedMD5: realArchiveInfo.md5, forcedSize: realArchiveInfo.size); Assert.AreEqual(realArchiveInfo.nummodsexpected, modsFoundInArchive.Count(x => x.ValidMod), $"{archive} did not parse correct amount of mods."); foreach (var v in modsFoundInArchive) { var cookedName = v.Game == MEGame.ME3 ? @"CookedPCConsole" : "CookedPC"; // Check nothing has FilesToInstall containing two 'CookedPCConsole' items in the string. // This is fun edge case due to TESTPATCH having two names DLC_TestPatch and TESTPATCH foreach (var mj in v.InstallationJobs) { foreach (var fti in mj.FilesToInstall) { var numAppearances = Regex.Matches(fti.Key, cookedName).Count; if (numAppearances > 1) { Assert.Fail($@"Found more than 1 instance of {cookedName} in FilesToInstall targetpath item {fti.Key}! This indicates queue building was wrong. Mod: {v.ModName}, file {archive}"); } } } } } }
public void InitialUILoadTest() { GlobalTest.Init(); App app = new App(); //Pre boot var xamlPaths = Path.Combine(GlobalTest.FindDirectoryInParentDirectories("MassEffectModManagerCore"), "modmanager", "localizations"); var files = Directory.GetFiles(xamlPaths, "*.xaml"); foreach (var filepath in files) { // Will throw exception if there's an error loading the file Console.WriteLine($@"Loading localization file {filepath}"); XamlReader.Load(new XmlTextReader(filepath)); } //Thread thread = new Thread(() => //{ // app.InitializeComponent(); // app.Run(); //}); //thread.SetApartmentState(ApartmentState.STA); //thread.Start(); //thread.Join(); //var shutdownTimer = new System.Timers.Timer(); //shutdownTimer.Interval = 15000; //shutdownTimer.Elapsed += (o, e) => //{ // app.Shutdown(); // app = null; //}; //shutdownTimer.Start(); //while (app != null) //{ // Thread.Sleep(1000); //} }
public void ValidateArchiveModLoading() { GlobalTest.Init(); Console.WriteLine("Fetching third party services"); App.ThirdPartyImportingService = OnlineContent.FetchThirdPartyImportingService(); App.ThirdPartyIdentificationService = OnlineContent.FetchThirdPartyIdentificationManifest(); var compressedModsDirectory = Path.Combine(GlobalTest.FindDirectoryInParentDirectories(GlobalTest.TESTDATA_FOLDER_NAME), "compressedmods"); List <Mod> modsFoundInArchive = new List <Mod>(); void addModCallback(Mod m) { Console.WriteLine($"Found mod in archive: {m.ModName}"); modsFoundInArchive.Add(m); } void failedModCallback(Mod m) { Console.WriteLine($"A mod failed to load. This may be expected: {m.ModName}"); } void logMessageCallback(string m) { Console.WriteLine(m); } foreach (var archive in Directory.GetFiles(compressedModsDirectory)) { modsFoundInArchive.Clear(); var realArchiveInfo = GlobalTest.ParseRealArchiveAttributes(archive); Console.WriteLine($"Inspecting archive: { archive}"); ModArchiveImporter.InspectArchive(archive, addModCallback, failedModCallback, logMessageCallback, forcedMD5: realArchiveInfo.md5, forcedSize: realArchiveInfo.size); Assert.AreEqual(realArchiveInfo.nummodsexpected, modsFoundInArchive.Count(x => x.ValidMod), $"{archive} did not parse correct amount of mods."); } }
public void TestBuildingExtractionQueues() { GlobalTest.Init(); Console.WriteLine("Fetching third party services"); App.ThirdPartyImportingService = OnlineContent.FetchThirdPartyImportingService(); App.ThirdPartyIdentificationService = OnlineContent.FetchThirdPartyIdentificationManifest(); var compressedModsDirectory = Path.Combine(GlobalTest.FindDirectoryInParentDirectories(GlobalTest.TESTDATA_FOLDER_NAME), "compressedmods"); List <Mod> modsFoundInArchive = new List <Mod>(); void addModCallback(Mod m) { Console.WriteLine($"Found mod in archive: {m.ModName}"); modsFoundInArchive.Add(m); } void failedModCallback(Mod m) { //Console.WriteLine($"A mod failed to load. This may be expected: {m.ModName}"); } void logMessageCallback(string m) { Console.WriteLine(m); } #region Get Targets List <GameTarget> targets = new List <GameTarget>(); var root = GlobalTest.GetTestGameFoldersDirectory(Mod.MEGame.ME1); foreach (var d in Directory.GetDirectories(root)) { GameTarget gt = new GameTarget(Mod.MEGame.ME1, d, false, false); gt.ValidateTarget(); if (gt.IsValid) { targets.Add(gt); } } root = GlobalTest.GetTestGameFoldersDirectory(Mod.MEGame.ME2); foreach (var d in Directory.GetDirectories(root)) { GameTarget gt = new GameTarget(Mod.MEGame.ME2, d, false, false); gt.ValidateTarget(); if (gt.IsValid) { targets.Add(gt); } } root = GlobalTest.GetTestGameFoldersDirectory(Mod.MEGame.ME3); foreach (var d in Directory.GetDirectories(root)) { GameTarget gt = new GameTarget(Mod.MEGame.ME3, d, false, false); gt.ValidateTarget(); if (gt.IsValid) { targets.Add(gt); } } #endregion //Compressed Mods foreach (var archive in Directory.GetFiles(compressedModsDirectory)) { modsFoundInArchive.Clear(); var realArchiveInfo = GlobalTest.ParseRealArchiveAttributes(archive); Console.WriteLine($@"Inspecting archive: { archive}"); ModArchiveImporter.InspectArchive(archive, addModCallback, failedModCallback, logMessageCallback, forcedMD5: realArchiveInfo.md5, forcedSize: realArchiveInfo.size); var archiveZ = new SevenZipExtractor(archive); foreach (var mod in modsFoundInArchive) { bool altsOn = false; while (true) { if (altsOn) { foreach (var job in mod.InstallationJobs) { List <string> selectedGroups = new List <string>(); foreach (var altfile in job.AlternateFiles) { if (altfile.GroupName != null) { if (selectedGroups.Contains(altfile.GroupName)) { continue; //we already did first time of this. I know that's a weak test case... } selectedGroups.Add(altfile.GroupName); } altfile.IsSelected = true; } } } var refs = mod.GetAllRelativeReferences(!mod.IsVirtualized, archiveZ); //test //validate references are actually in this archive foreach (var fileREf in refs) { var expectedPath = FilesystemInterposer.PathCombine(mod.IsInArchive, mod.ModPath, fileREf); //var expectedPath = fileREf; var inArchiveFile = archiveZ.ArchiveFileData.FirstOrDefault(x => x.FileName == expectedPath); Assert.IsNotNull(inArchiveFile.FileName, "Relative referenced file was not found in archive: " + fileREf); } //size test Assert.AreNotEqual(0, mod.SizeRequiredtoExtract, "Archive extraction size is zero! For file " + archive); var targetsForMod = targets.Where(x => x.Game == mod.Game).ToList(); foreach (var target in targetsForMod) { var queue = mod.GetInstallationQueues(target); foreach (var jobMapping in queue.Item1) { foreach (var unpackedItem in jobMapping.Value.unpackedJobMapping) { string sourceFile; if (jobMapping.Key.JobDirectory == null || unpackedItem.Value.IsFullRelativeFilePath) { sourceFile = FilesystemInterposer.PathCombine(mod.IsInArchive, mod.ModPath, unpackedItem.Value.FilePath); } else { sourceFile = FilesystemInterposer.PathCombine(mod.IsInArchive, mod.ModPath, jobMapping.Key.JobDirectory, unpackedItem.Value.FilePath); } Assert.IsTrue(archiveZ.ArchiveFileNames.Contains(sourceFile), "Archive should contain a file specified by mod (mod is valid) but does not appear to. File: " + sourceFile); } } } if (!altsOn) { altsOn = true; } else { break; } } } } //EXE mods var exeModsDirectory = Path.Combine(GlobalTest.FindDirectoryInParentDirectories(GlobalTest.TESTDATA_FOLDER_NAME), "exemods"); if (Directory.Exists(exeModsDirectory)) { foreach (var exe in Directory.GetFiles(exeModsDirectory)) { modsFoundInArchive.Clear(); //var realArchiveInfo = GlobalTest.ParseRealArchiveAttributes(exe); Console.WriteLine($@"Inspecting exe: { exe}"); ModArchiveImporter.InspectArchive(exe, addModCallback, failedModCallback, logMessageCallback); var archiveZ = new SevenZipExtractor(exe, InArchiveFormat.Nsis); foreach (var mod in modsFoundInArchive) { foreach (var job in mod.InstallationJobs) { List <string> selectedGroups = new List <string>(); foreach (var altfile in job.AlternateFiles) { if (altfile.GroupName != null) { if (selectedGroups.Contains(altfile.GroupName)) { continue; //we already did first time of this. I know that's a weak test case... } selectedGroups.Add(altfile.GroupName); } altfile.IsSelected = true; } } var refs = mod.GetAllRelativeReferences(false, archiveZ); //test and get refs. exe mods will always be virtualized as they won't have a moddesc.ini file. //exe mods remap to subconetns //same code as Mod-Extraction.cs foreach (var fileREf in refs) { var expectedPath = FilesystemInterposer.PathCombine(mod.IsInArchive, mod.ModPath, fileREf); //var expectedPath = fileREf; var inArchiveFile = archiveZ.ArchiveFileData.FirstOrDefault(x => x.FileName == expectedPath); Assert.IsNotNull(inArchiveFile.FileName, "Relative referenced file was not found in archive: " + fileREf); } mod.ExtractFromArchive(exe, "", false, testRun: true); } } } else { Console.WriteLine("No exemods directory found. This section of testing will be skipped"); } }