//[DataRow("lang_ar_text.archive")] //[DataRow("lang_cs_text.archive")] //[DataRow("lang_de_text.archive")] //[DataRow("lang_en_text.archive")] //[DataRow("lang_en_voice.archive")] //[DataRow("lang_es-es_text.archive")] //[DataRow("lang_es-mx_text.archive")] //[DataRow("lang_fr_text.archive")] //[DataRow("lang_hu_text.archive")] //[DataRow("lang_it_text.archive")] //[DataRow("lang_ja_text.archive")] //[DataRow("lang_ko_text.archive")] //[DataRow("lang_pl_text.archive")] //[DataRow("lang_pt_text.archive")] //[DataRow("lang_ru_text.archive")] //[DataRow("lang_th_text.archive")] //[DataRow("lang_tr_text.archive")] //[DataRow("lang_zh-cn_text.archive")] //[DataRow("lang_zh-tw_text.archive")] public void Test_Unbundle(string archivename) { var resultDir = Path.Combine(Environment.CurrentDirectory, s_testResultsDirectory); Directory.CreateDirectory(resultDir); var totalCount = s_bm.Items.Count(); var results = new ConcurrentBag <ArchiveTestResult>(); var archiveFullName = Path.Combine(s_gameDirectoryPath, "archive", "pc", "content", archivename); var archive = s_bm.Archives[archiveFullName] as Archive; Parallel.ForEach(archive.Files, keyvalue => { var(hash, _) = keyvalue; try { using (var ms = new MemoryStream()) { ModTools.ExtractSingleToStream(archive, hash, ms); } results.Add(new ArchiveTestResult() { ArchiveName = archivename, Hash = hash.ToString(), Success = true }); } catch (Exception e) { results.Add(new ArchiveTestResult() { ArchiveName = archivename, Hash = hash.ToString(), Success = false, ExceptionType = e.GetType(), Message = $"{e.Message}" }); } }); // Check success var successCount = results.Count(r => r.Success); var sb = new StringBuilder(); sb.AppendLine($"Successfully unbundled: {successCount} / {totalCount} ({(int)(successCount / (double)totalCount * 100)}%)"); var success = results.All(r => r.Success); if (success) { return; } var msg = $"Successful Writes: {successCount} / {totalCount}. "; Assert.Fail(msg); }
// [DataRow("basegame_2_mainmenu.archive")] // [DataRow("basegame_3_nightcity.archive")] // [DataRow("basegame_3_nightcity_gi.archive")] // [DataRow("basegame_3_nightcity_terrain.archive")] // [DataRow("basegame_4_animation.archive")] // [DataRow("basegame_4_appearance.archive")] // [DataRow("basegame_4_gamedata.archive")] public void Test_Cr2wSerialize(string archivename) { var parsers = ServiceLocator.Default.ResolveType <Red4ParserService>(); var resultDir = Path.Combine(Environment.CurrentDirectory, s_testResultsDirectory); Directory.CreateDirectory(resultDir); var totalCount = s_bm.Items.Count(); var results = new ConcurrentBag <ArchiveTestResult>(); var archiveFullName = Path.Combine(s_gameDirectoryPath, "archive", "pc", "content", archivename); var archive = s_bm.Archives[archiveFullName] as Archive; Parallel.ForEach(archive.Files, keyvalue => { var(hash, file) = keyvalue; try { #region serialize using var ms = new MemoryStream(); ModTools.ExtractSingleToStream(archive, hash, ms); var cr2w = parsers.TryReadCr2WFile(ms); if (cr2w == null) { return; } var dto = new Red4W2rcFileDto(cr2w); var json = JsonConvert.SerializeObject( dto, Formatting.Indented ); if (string.IsNullOrEmpty(json)) { throw new SerializationException(); } #endregion #region deserialize var newdto = JsonConvert.DeserializeObject <Red4W2rcFileDto>(json); if (newdto == null) { throw new SerializationException(); } var w2rc = newdto.ToW2rc(); using var newms = new MemoryStream(); using var bw = new BinaryWriter(newms); w2rc.Write(bw); #endregion #region compare var newbytes = newms.ToByteArray(); var oldbytes = ms.ToByteArray(); if (!oldbytes.SequenceEqual(newbytes)) { throw new SerializationException(); } else { } #endregion results.Add(new ArchiveTestResult() { ArchiveName = archivename, Hash = hash.ToString(), Success = true }); } catch (Exception e) { results.Add(new ArchiveTestResult() { ArchiveName = archivename, Hash = hash.ToString(), Success = false, ExceptionType = e.GetType(), Message = $"{e.Message}" }); } }); // Check success var successCount = results.Count(r => r.Success); var sb = new StringBuilder(); sb.AppendLine($"Successfully serialized: {successCount} / {totalCount} ({(int)(successCount / (double)totalCount * 100)}%)"); var success = results.All(r => r.Success); if (success) { return; } var msg = $"Successful serialized: {successCount} / {totalCount}. "; Assert.Fail(msg); }