/// <summary> /// Creates a SWF string dump, saves the SWF, re-loads it and compares a new /// string dump. If the SWF files are different, it concludes that something /// went wrong. /// </summary> /// <param name="swf">The SWF to test saving/loading</param> /// <param name="name">The SWF file and dumps are saved for inspection to /// the test output folder under this name.</param> private void SaveAndVerifyPredictedOutput(SWF swf, string name, bool compressed) { string swfDump1 = this.SwfToString(swf); using (FileStream fs = new FileStream(this.TestDir + name + @".model.txt", FileMode.Create)) { byte[] dump1data = new ASCIIEncoding().GetBytes(swfDump1); fs.Write(dump1data, 0, dump1data.Length); } StringBuilder writeLog = new StringBuilder(); StringBuilder abcWriteLog = new StringBuilder(); SWFWriterOptions opts = new SWFWriterOptions() { Compressed = compressed, EnableDebugger = true }; byte[] swfData = new SWFWriter(swf, opts, writeLog, abcWriteLog).ToByteArray(); using (FileStream fs = new FileStream(this.TestDir + name + ".writelog.txt", FileMode.Create)) { byte[] writeLogData = new ASCIIEncoding().GetBytes(writeLog.ToString()); fs.Write(writeLogData, 0, writeLogData.Length); } Directory.CreateDirectory(this.TestDir + @"\abc\"); using (FileStream fs = new FileStream(this.TestDir + @"\abc\" + name + ".writelog.txt", FileMode.Create)) { byte[] writeLogData = new ASCIIEncoding().GetBytes(abcWriteLog.ToString()); fs.Write(writeLogData, 0, writeLogData.Length); } using (FileStream fs = new FileStream(this.TestDir + name + ".swf", FileMode.Create)) { fs.Write(swfData, 0, swfData.Length); } StringBuilder binDump = new StringBuilder(); string swfDump2 = null; try { swfDump2 = this.SwfToString( new SWFReader( new MemoryStream(swfData), new SWFReaderOptions() { StrictTagLength = true }, binDump, this) .ReadSWF(new SWFContext("resaved." + name))); } finally { using (FileStream fs = new FileStream(this.TestDir + name + ".bin.dump-2.txt", FileMode.Create)) { byte[] dump2bindata = new ASCIIEncoding().GetBytes(binDump.ToString()); fs.Write(dump2bindata, 0, dump2bindata.Length); } } string finalModelFile = this.TestDir + name + ".model-dump-2.txt"; using (FileStream fs = new FileStream(finalModelFile, FileMode.Create)) { byte[] dump2data = new ASCIIEncoding().GetBytes(swfDump2); fs.Write(dump2data, 0, dump2data.Length); } string predicted = TestDir + name + ".model.predict.txt"; using (Stream input = ResourceAsStream("predicted." + name + ".txt")) using (FileStream output = new FileStream(TestDir + name + ".model.predict.txt", FileMode.Create)) { Assert.IsNotNull(input, "Predicted output is missing! " + name); CopyStream(input, output); } using (StreamWriter acceptScript = new StreamWriter(new FileStream(TestDir + "accept.bat", FileMode.Create))) { acceptScript.WriteLine("copy \"" + finalModelFile + "\" \"" + new FileInfo("..\\..\\..\\SWFModellerTest\\res\\predicted\\" + name + ".txt").FullName + "\""); } using (StreamWriter viewScript = new StreamWriter(new FileStream(TestDir + "viewdiff.bat", FileMode.Create))) { /* ISSUE 44: This should be a diff tool env var */ viewScript.WriteLine("\"c:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" \"" + finalModelFile + "\" \"" + new FileInfo("..\\..\\..\\SWFModellerTest\\res\\predicted\\" + name + ".txt").FullName + "\""); } CompareFiles( predicted, finalModelFile, "Predicted output failure! These files differ: " + name + ".model.predict.txt" + ", " + name + ".model.txt"); }