Ejemplo n.º 1
0
        private static bool TryDoFlowScriptDisassembly()
        {
            // load binary file
            Logger.Info("Loading binary FlowScript file...");

            FlowScriptBinary script = null;
            var format = GetFlowScriptFormatVersion();

            if (!TryPerformAction("Failed to load flow script from file.", () =>
            {
                script = FlowScriptBinary.FromFile(InputFilePath, (BinaryFormatVersion)format);
            }))
            {
                return(false);
            }

            Logger.Info("Disassembling FlowScript...");
            if (!TryPerformAction("Failed to disassemble flow script to file.", () =>
            {
                var disassembler = new FlowScriptBinaryDisassembler(OutputFilePath);
                disassembler.Disassemble(script);
                disassembler.Dispose();
            }))
            {
                return(false);
            }

            return(true);
        }
        private void FromFile_ResultNotNullAndFormatIsEqualToParameter(BinaryFormatVersion version, BinaryFormatVersion actualVersion)
        {
            var script = FlowScriptBinary.FromFile($"TestResources\\{actualVersion}.bf", version);

            Assert.IsNotNull(script, "Script object should not be null");
            Assert.AreEqual(actualVersion, script.FormatVersion);
        }
        public void DisassembleTest()
        {
            var script = FlowScriptBinary.FromFile("TestResources\\Version1.bf");

            using (var disassembler = new FlowScriptBinaryDisassembler(new StringWriter()))
                disassembler.Disassemble(script);
        }
        private void DisassembleToFileTestBase(string path)
        {
            var script = FlowScriptBinary.FromFile(path, BinaryFormatVersion.Unknown);

            using (var disassembler = new FlowScriptBinaryDisassembler(Path.ChangeExtension(path, "asm")))
                disassembler.Disassemble(script);
        }
        public void FromFileTest_Batch()
        {
            foreach (var path in Directory.EnumerateFiles("TestResources\\Batch\\", "*.bf"))
            {
                var script = FlowScriptBinary.FromFile(path, BinaryFormatVersion.Version3BigEndian);

                Assert.IsNotNull(script);
            }
        }
Ejemplo n.º 6
0
        public void FromBinary_ContentsShouldMatchThatOfBinary_Version3BigEndian()
        {
            var binary = FlowScriptBinary.FromFile("TestResources\\Version3BigEndian.bf", BinaryFormatVersion.Version3BigEndian);
            var script = FlowScript.FromBinary(binary);

            Assert.AreEqual(script.UserId, binary.Header.UserId);

            // Compare label names
            for (int i = 0; i < script.Procedures.Count; i++)
            {
                Assert.AreEqual(binary.ProcedureLabelSection[i].Name, script.Procedures[i].Name);
            }

            /*
             * for ( int i = 0; i < script.JumpLabels.Count; i++ )
             * {
             *  Assert.AreEqual( binary.JumpLabelSection[i].Name, script.JumpLabels[i].Name );
             * }
             */

            // Compare instructions
            int binaryIndex = 0;

            foreach (var instruction in script.EnumerateInstructions())
            {
                var binaryInstruction = binary.TextSection[binaryIndex++];
                Assert.AreEqual(binaryInstruction.Opcode, instruction.Opcode);

                if (instruction.Operand != null)
                {
                    switch (instruction.Operand.Kind)
                    {
                    case Operand.ValueKind.Int16:
                        if (instruction.Opcode != Opcode.IF && instruction.Opcode != Opcode.GOTO)
                        {
                            Assert.AreEqual(binaryInstruction.OperandShort, instruction.Operand.Int16Value);
                        }
                        break;

                    case Operand.ValueKind.Int32:
                        Assert.AreEqual(binary.TextSection[binaryIndex++].OperandInt, instruction.Operand.Int32Value);
                        break;

                    case Operand.ValueKind.Single:
                        Assert.AreEqual(binary.TextSection[binaryIndex++].OperandFloat, instruction.Operand.SingleValue);
                        break;

                    case Operand.ValueKind.String:
                        break;
                    }
                }
            }
        }
 public void FromFileTest_InvalidFileFormat_Big()
 {
     Assert.ThrowsException <InvalidDataException>(() => FlowScriptBinary.FromFile("TestResources\\dummy_big.bin", BinaryFormatVersion.Unknown));
 }
Ejemplo n.º 8
0
        public void ToBinary_ContentsShouldMatchThatOfSourceBinary_Version3BigEndian()
        {
            var binaryIn  = FlowScriptBinary.FromFile("TestResources\\Version3BigEndian.bf");
            var script    = FlowScript.FromBinary(binaryIn);
            var binaryOut = script.ToBinary();

            // Compare headers
            Assert.AreEqual(binaryIn.Header.FileType, binaryOut.Header.FileType);
            Assert.AreEqual(binaryIn.Header.Compressed, binaryOut.Header.Compressed);
            Assert.AreEqual(binaryIn.Header.UserId, binaryOut.Header.UserId);
            Assert.AreEqual(binaryIn.Header.FileSize, binaryOut.Header.FileSize);
            Assert.IsTrue(binaryIn.Header.Magic.SequenceEqual(binaryOut.Header.Magic));
            Assert.AreEqual(binaryIn.Header.Field0C, binaryOut.Header.Field0C);
            Assert.AreEqual(binaryIn.Header.SectionCount, binaryOut.Header.SectionCount);
            Assert.AreEqual(binaryIn.Header.LocalIntVariableCount, binaryOut.Header.LocalIntVariableCount);
            Assert.AreEqual(binaryIn.Header.LocalFloatVariableCount, binaryOut.Header.LocalFloatVariableCount);
            Assert.AreEqual(binaryIn.Header.Endianness, binaryOut.Header.Endianness);
            Assert.AreEqual(binaryIn.Header.Field1A, binaryOut.Header.Field1A);
            Assert.AreEqual(binaryIn.Header.Padding, binaryOut.Header.Padding);

            // Compare section headers
            for (int i = 0; i < binaryIn.SectionHeaders.Count; i++)
            {
                Assert.AreEqual(binaryIn.SectionHeaders[i].SectionType, binaryOut.SectionHeaders[i].SectionType);
                Assert.AreEqual(binaryIn.SectionHeaders[i].ElementSize, binaryOut.SectionHeaders[i].ElementSize);
                Assert.AreEqual(binaryIn.SectionHeaders[i].ElementCount, binaryOut.SectionHeaders[i].ElementCount);
                Assert.AreEqual(binaryIn.SectionHeaders[i].FirstElementAddress, binaryOut.SectionHeaders[i].FirstElementAddress);
            }

            // Compare labels
            for (int i = 0; i < binaryIn.ProcedureLabelSection.Count; i++)
            {
                Assert.AreEqual(binaryIn.ProcedureLabelSection[i].Name, binaryOut.ProcedureLabelSection[i].Name);
                Assert.AreEqual(binaryIn.ProcedureLabelSection[i].InstructionIndex, binaryOut.ProcedureLabelSection[i].InstructionIndex);
                Assert.AreEqual(binaryIn.ProcedureLabelSection[i].Reserved, binaryOut.ProcedureLabelSection[i].Reserved);
            }

            for (int i = 0; i < binaryIn.JumpLabelSection.Count; i++)
            {
                Assert.AreEqual(binaryIn.JumpLabelSection[i].Name, binaryOut.JumpLabelSection[i].Name);
                Assert.AreEqual(binaryIn.JumpLabelSection[i].InstructionIndex, binaryOut.JumpLabelSection[i].InstructionIndex);
                Assert.AreEqual(binaryIn.JumpLabelSection[i].Reserved, binaryOut.JumpLabelSection[i].Reserved);
            }

            // Compare instructions
            for (int i = 0; i < binaryIn.TextSection.Count; i++)
            {
                var inInstruction  = binaryIn.TextSection[i];
                var outInstruction = binaryOut.TextSection[i];

                Assert.AreEqual(inInstruction.Opcode, outInstruction.Opcode);

                if (inInstruction.Opcode == Opcode.PUSHI || inInstruction.Opcode == Opcode.PUSHF)
                {
                    ++i;
                    continue;
                }

                if (inInstruction.Opcode == Opcode.IF || inInstruction.Opcode == Opcode.GOTO)
                {
                    Assert.AreEqual(binaryIn.JumpLabelSection[inInstruction.OperandShort].Name, binaryOut.JumpLabelSection[outInstruction.OperandShort].Name);
                }
                else
                {
                    Assert.AreEqual(inInstruction.OperandShort, outInstruction.OperandShort);
                }
            }

            // Compare message script
            //Assert.IsTrue(binaryIn.MessageScriptSection.SequenceEqual(binaryOut.MessageScriptSection));

            // Compare strings
            Assert.IsTrue(binaryIn.StringSection.SequenceEqual(binaryOut.StringSection));
        }