using System; using System.IO; using GeViSetEditor.Core.Parsers; using GeViSetEditor.Core.Writers; namespace GeViSetEditor.CLI.Commands { public static class TestRoundTripCommand { public static void Execute(string inputPath) { Console.WriteLine("=== Round-Trip Conversion Test ===\n"); if (!File.Exists(inputPath)) { Console.WriteLine($"Error: File not found: {inputPath}"); return; } try { // Step 1: Read original file Console.WriteLine($"Step 1: Reading original file..."); byte[] originalData = File.ReadAllBytes(inputPath); Console.WriteLine($" Read {originalData.Length} bytes\n"); // Step 2: Parse with safe parser Console.WriteLine($"Step 2: Parsing file..."); var parser = new SafeSetFileParser(); var setFile = parser.Parse(originalData); Console.WriteLine($" Parsed successfully"); Console.WriteLine($" Found {setFile.ActionMappings.Count} action mappings\n"); // Step 3: Write back Console.WriteLine($"Step 3: Writing file back..."); var writer = new SafeSetFileWriter(); byte[] outputData = writer.Write(setFile); Console.WriteLine($" Written {outputData.Length} bytes\n"); // Step 4: Compare Console.WriteLine($"Step 4: Comparing original vs output..."); var comparison = writer.Compare(originalData, outputData); if (comparison.IsIdentical) { Console.WriteLine("\n✓✓✓ SUCCESS! Round-trip conversion is PERFECT!"); Console.WriteLine(" Original and output files are byte-for-byte identical."); Console.WriteLine(" Safe to write back to GeViServer!"); } else { Console.WriteLine($"\n✗✗✗ WARNING! Files differ in {comparison.DifferentBytes} bytes"); Console.WriteLine("\nFirst differences:"); foreach (var diff in comparison.Differences) { Console.WriteLine($" {diff}"); } Console.WriteLine("\n!!! DO NOT write to server until this is fixed !!!"); } // Step 5: Show extracted action mappings Console.WriteLine($"\n" + new string('=', 70)); Console.WriteLine("EXTRACTED ACTION MAPPINGS"); Console.WriteLine(new string('=', 70)); int count = 0; foreach (var mapping in setFile.ActionMappings) { count++; Console.WriteLine($"\nMapping #{count} at offset {mapping.FileOffset}:"); Console.WriteLine($" Actions ({mapping.Actions.Count}):"); int actionNum = 0; foreach (var action in mapping.Actions) { actionNum++; Console.WriteLine($" {actionNum}. {action}"); if (actionNum >= 5 && mapping.Actions.Count > 5) { Console.WriteLine($" ... and {mapping.Actions.Count - 5} more"); break; } } } Console.WriteLine($"\n" + new string('=', 70)); Console.WriteLine($"Total: {setFile.ActionMappings.Count} mappings"); Console.WriteLine(new string('=', 70)); } catch (Exception ex) { Console.WriteLine($"\n✗✗✗ ERROR: {ex.Message}"); Console.WriteLine($"Stack trace: {ex.StackTrace}"); } } } }