public static void RoundTripTest(string baseDir) { var mapping = AssetMapping.Global; // TODO: Base game mapping. var saveDir = Path.Combine(baseDir, "re", "TestSaves"); var regex = new Regex(@"\.[0-9][0-9][0-9]$"); foreach (var file in Directory.EnumerateFiles(saveDir)) { if (!regex.IsMatch(file)) { continue; } Console.WriteLine("Round-trip testing " + file); using var stream = File.Open(file, FileMode.Open); using var br = new BinaryReader(stream); using var ar = new AlbionReader(br, stream.Length); var save = SavedGame.Serdes(null, mapping, ar); using var ms = new MemoryStream(); using var bw = new BinaryWriter(ms); using var aw = new AlbionWriter(bw); SavedGame.Serdes(save, mapping, aw); br.BaseStream.Position = 0; var originalBytes = br.ReadBytes((int)stream.Length); var roundTripBytes = ms.ToArray(); //* Save round-tripped and annotated text output for debugging File.WriteAllBytes(file + ".bin", roundTripBytes); using var ts = new MemoryStream(); using var tw = new StreamWriter(ts); using var afw = new AnnotatedFormatWriter(tw); SavedGame.Serdes(save, mapping, afw); ts.Position = 0; File.WriteAllBytes(file + ".txt", ts.ToArray()); //*/ ApiUtil.Assert(originalBytes.Length == roundTripBytes.Length); ApiUtil.Assert(originalBytes.SequenceEqual(roundTripBytes)); var sw = new StringWriter(); using var jw = new JsonWriter(sw); SavedGame.Serdes(save, mapping, jw); File.WriteAllText(file + ".json", sw.ToString()); break; } Console.WriteLine("Done"); Console.ReadLine(); }
static int WithSerializer(SerializerMode mode, MemoryStream stream, Action <ISerializer> func, ISerializer parentSerializer, ref int fakeOffset) { switch (mode) { case SerializerMode.Writing: { using var bw = new BinaryWriter(stream, Encoding.GetEncoding(850), true); var s = new AlbionWriter(bw); func(s); return((int)s.Offset); } case SerializerMode.WritingAnnotated: { using var tw = new StreamWriter(stream, Encoding.GetEncoding(850), 1024, true); using var s = new AnnotatedFormatWriter(tw, (AnnotatedFormatWriter)parentSerializer); s.Seek(fakeOffset); func(s); int length = (int)s.Offset - fakeOffset; fakeOffset = (int)s.Offset; return(length); } case SerializerMode.WritingJson: { using var tw = new StreamWriter(stream, Encoding.GetEncoding(850), 1024, true); using var s = new JsonWriter(tw, (JsonWriter)parentSerializer); s.Seek(fakeOffset); func(s); int length = (int)s.Offset - fakeOffset; fakeOffset = (int)s.Offset; return(length); } default: throw new InvalidOperationException(); } }