Ejemplo n.º 1
0
        //[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);
        }
Ejemplo n.º 2
0
        // [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);
        }