//[DataRow(ECookedFileFormat.mlmask)] //// [DataRow(ECookedFileFormat.morphtarget)] //[DataRow(ECookedFileFormat.texarray)] //[DataRow(ECookedFileFormat.wem)] //[DataRow(ECookedFileFormat.xbm)] public void Test_Uncook(ECookedFileFormat extension) { Environment.SetEnvironmentVariable("WOLVENKIT_ENVIRONMENT", "Testing", EnvironmentVariableTarget.Process); var ext = $".{extension.ToString()}"; var infiles = s_groupedFiles[ext].ToList(); var modtools = ServiceLocator.Default.ResolveType <ModTools>(); var resultDir = new DirectoryInfo(Path.Combine(Environment.CurrentDirectory, s_testResultsDirectory, "temp")); if (!resultDir.Exists) { Directory.CreateDirectory(resultDir.FullName); } var logDir = new DirectoryInfo(Path.Combine(Environment.CurrentDirectory, s_testResultsDirectory, "logs")); if (!logDir.Exists) { Directory.CreateDirectory(logDir.FullName); } var exportArgs = new GlobalExportArgs().Register( new XbmExportArgs() { UncookExtension = EUncookExtension.png, Flip = false } ); var uncookfails = new List <FileEntry>(); // random tests var random = new Random(); var limit = Math.Min(int.Parse(s_config.GetSection(s_LIMIT).Value), infiles.Count); var filesToTest = infiles.OrderBy(a => random.Next()).Take(limit).ToList(); Parallel.ForEach(filesToTest, fileEntry => //foreach (var fileEntry in filesToTest) { // skip files without buffers var hasBuffers = (fileEntry.SegmentsEnd - fileEntry.SegmentsStart) > 1; if (!hasBuffers) { //continue; return; } // uncook var resUncook = modtools.UncookSingle(fileEntry.Archive as Archive, fileEntry.Key, resultDir, exportArgs, resultDir); if (!resUncook) { uncookfails.Add(fileEntry); } } ); if (uncookfails.Count > 0) { foreach (var fileEntry in uncookfails) { Console.WriteLine($"Failed to uncook - {fileEntry.FileName}"); } } Assert.AreEqual(limit, limit - uncookfails.Count); }
public void Test_ImportExport(ECookedFileFormat extension) { var ext = $".{extension.ToString()}"; var infiles = s_groupedFiles[ext].ToList(); var modtools = ServiceLocator.Default.ResolveType <ModTools>(); var resultDir = new DirectoryInfo(Path.Combine(Environment.CurrentDirectory, s_testResultsDirectory, "temp")); if (!resultDir.Exists) { Directory.CreateDirectory(resultDir.FullName); } var logDir = new DirectoryInfo(Path.Combine(Environment.CurrentDirectory, s_testResultsDirectory, "logs")); if (!logDir.Exists) { Directory.CreateDirectory(logDir.FullName); } var isKeep = bool.Parse(s_config.GetSection(s_KEEP).Value); var isettings = new GlobalImportArgs().Register( new XbmImportArgs() { Keep = isKeep }, new MeshImportArgs() { Keep = isKeep }, new CommonImportArgs() { Keep = isKeep } ); var esettings = new GlobalExportArgs(); var uncookfails = new List <FileEntry>(); var importfails = new List <FileEntry>(); var equalfails = new List <FileEntry>(); // random tests var random = new Random(); var limit = Math.Min(int.Parse(s_config.GetSection(s_LIMIT).Value), infiles.Count); var filesToTest = infiles.OrderBy(a => random.Next()).Take(limit).ToList(); for (var i = 0; i < filesToTest.Count; i++) { var fileEntry = filesToTest[i]; // skip files without buffers var hasBuffers = (fileEntry.SegmentsEnd - fileEntry.SegmentsStart) > 1; if (!hasBuffers) { continue; } var ar = fileEntry.Archive as Archive; using var cr2wstream = new MemoryStream(); ar.CopyFileToStream(cr2wstream, fileEntry.NameHash64, false); var originalBytes = cr2wstream.ToByteArray(); // uncook var resUncook = modtools.UncookSingle(fileEntry.Archive as Archive, fileEntry.Key, resultDir, esettings, resultDir); if (!resUncook) { uncookfails.Add(fileEntry); Cleanup(); continue; } // rebuild var allfiles = resultDir.GetFiles("*", SearchOption.AllDirectories); var rawfile = allfiles.FirstOrDefault(_ => _.Extension != ext); if (rawfile == null) { Assert.Fail($"No raw file found in {resultDir}"); } var redrelative = new RedRelativePath(rawfile.Directory, rawfile.Name); var resImport = modtools.Import(redrelative, isettings); if (!resImport) { importfails.Add(fileEntry); Cleanup(); continue; } // compare var redfile = allfiles.FirstOrDefault(_ => _.Extension == ext); if (redfile == null) { Assert.Fail($"No red file found in {resultDir}"); } var newbytes = File.ReadAllBytes(redfile.FullName); if (!originalBytes.SequenceEqual(newbytes)) { equalfails.Add(fileEntry); var filename = Path.GetFileName(fileEntry.FileName); var dbgOriginalFile = Path.Combine(logDir.FullName, filename); var dbgNewFile = Path.Combine(logDir.FullName, $"{filename}.new"); File.WriteAllBytes(dbgOriginalFile, originalBytes); File.WriteAllBytes(dbgNewFile, newbytes); } else { } // clean temp dir Cleanup(); } if (uncookfails.Count > 0) { foreach (var fileEntry in uncookfails) { Console.WriteLine($"Failed to uncook - {fileEntry.FileName}"); } } if (importfails.Count > 0) { foreach (var fileEntry in importfails) { Console.WriteLine($"Failed to import - {fileEntry.FileName}"); } } if (equalfails.Count > 0) { foreach (var fileEntry in equalfails) { Console.WriteLine($"Not binary equal - {fileEntry.FileName}"); } } Assert.AreEqual(0, uncookfails.Count + importfails.Count + equalfails.Count); // cleanup var allf = resultDir.GetFiles("*", SearchOption.AllDirectories); foreach (var fileInfo in allf) { fileInfo.Delete(); } var alld = resultDir.GetDirectories(); foreach (var directoryInfo in alld) { directoryInfo.Delete(true); } void Cleanup() { var allfiles = resultDir.GetFiles("*", SearchOption.AllDirectories); try { foreach (var fileInfo in allfiles) { fileInfo.Delete(); } } catch (Exception e) { Console.WriteLine(e); throw; } } }