Exemplo n.º 1
0
        public void Module_CustomSectionRoundTrip()
        {
            var content = BitConverter.DoubleToInt64Bits(Math.PI);
            var toWrite = new Module();

            toWrite.CustomSections.Add(new CustomSection
            {
                Content = BitConverter.GetBytes(content),
                Name    = "Test",
            });

            Module toRead;

            using (var memory = new MemoryStream())
            {
                toWrite.WriteToBinary(memory);
                memory.Position = 0;

                toRead = Module.ReadFromBinary(memory);
            }

            Assert.IsNotNull(toRead);
            Assert.AreNotSame(toWrite, toRead);
            Assert.IsNotNull(toRead.CustomSections);
            Assert.AreEqual(1, toRead.CustomSections.Count);

            var custom = toRead.CustomSections[0];

            Assert.IsNotNull(custom);
            Assert.AreEqual("Test", custom.Name);
            Assert.IsNotNull(custom.Content);
            Assert.AreEqual(8, custom.Content.Count);
            Assert.AreEqual(content, BitConverter.ToInt64(custom.Content.ToArray(), 0));
        }
Exemplo n.º 2
0
        public void Module_TypeRoundTrip()
        {
            var source = new Module
            {
                Types = new Type[]
                {
                    new Type
                    {
                        Parameters = new[] { ValueType.Int32, ValueType.Float32 },
                        Returns    = new[] { ValueType.Int64 }
                    }
                }
            };;

            Module destination;

            using (var stream = new MemoryStream())
            {
                source.WriteToBinary(stream);
                stream.Position = 0;

                destination = Module.ReadFromBinary(stream);
            }

            Assert.IsNotNull(destination.Types);
            Assert.AreNotSame(source.Types, destination.Types);
            Assert.AreEqual(1, destination.Types.Count);
            Assert.IsTrue(source.Types[0].Equals(destination.Types[0]));
        }
Exemplo n.º 3
0
        public void Module_ReadFromBinaryStream()
        {
            Assert.AreEqual("input", Assert.ThrowsException <ArgumentNullException>(() => Module.ReadFromBinary((Stream)null)).ParamName);

            using (var sample = new MemoryStream())
            {
                var utf8 = new UTF8Encoding(false, false);

                using (var writer = new BinaryWriter(sample, utf8, true))
                {
                    writer.Write(0x6e736100); //Bad magic number.
                }
                sample.Position = 0;
                Assert.IsTrue(Assert.ThrowsException <ModuleLoadException>(() => Module.ReadFromBinary(sample)).Message.ToLowerInvariant().Contains("magic"));
                Assert.IsTrue(sample.CanSeek, "Stream was closed but should have been left open.");

                sample.Position = 0;
                using (var writer = new BinaryWriter(sample, utf8, true))
                {
                    writer.Write(0x6d736100);
                    //Missing version.
                }
                sample.Position = 0;
                Assert.IsInstanceOfType(Assert.ThrowsException <ModuleLoadException>(() => Module.ReadFromBinary(sample)).InnerException, typeof(EndOfStreamException));

                sample.Position = 0;
                using (var writer = new BinaryWriter(sample, utf8, true))
                {
                    writer.Write(0x6d736100);
                    writer.Write(0x0); //Bad version
                }
                sample.Position = 0;
                Assert.IsTrue(Assert.ThrowsException <ModuleLoadException>(() => Module.ReadFromBinary(sample)).Message.ToLowerInvariant().Contains("version"));

                sample.Position = 0;
                using (var writer = new BinaryWriter(sample, utf8, true))
                {
                    //Shouldn't fail, this is the bare minimum WASM binary file.
                    writer.Write(0x6d736100);
                    writer.Write(0x1);
                }
                sample.Position = 0;
                Assert.IsNotNull(Module.ReadFromBinary(sample));

                sample.Position = 0;
                using (var writer = new BinaryWriter(sample, utf8, true))
                {
                    //Shouldn't fail, this is the bare minimum WASM binary file.
                    writer.Write(0x6d736100);
                    writer.Write(0xd); //Pre-release version, binary format is otherwise identical to first release.
                }
                sample.Position = 0;
                Assert.IsNotNull(Module.ReadFromBinary(sample));
            }
        }
        public static Module BinaryRoundTrip(this Module module)
        {
            using (var memory = new MemoryStream())
            {
                module.WriteToBinary(memory);

                memory.Position = 0;
                var result = Module.ReadFromBinary(memory);
                return(result);
            }
        }
        public static Module BinaryRoundTrip(this Module module)
        {
            Assert.IsNotNull(module);

            using var memory = new MemoryStream();
            module.WriteToBinary(memory);
            Assert.AreNotEqual(0, memory.Position);

            memory.Position = 0;
            var result = Module.ReadFromBinary(memory);

            Assert.IsNotNull(result);
            return(result);
        }
Exemplo n.º 6
0
        public void Parse_Sample_Issue7()
        {
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("WebAssembly.Samples.Issue7.wasm"))
            {
                var module = Module.ReadFromBinary(stream);

                Assert.AreEqual(2, module.Codes.Count);
                Assert.AreEqual(9, module.CustomSections.Count);
                Assert.AreEqual(0, module.Data.Count);
                Assert.AreEqual(0, module.Elements.Count);
                Assert.AreEqual(4, module.Exports.Count);
                Assert.AreEqual(2, module.Functions.Count);
                Assert.AreEqual(1, module.Imports.Count);
                Assert.AreEqual(1, module.Memories.Count);
                Assert.IsNull(module.Start);
                Assert.AreEqual(1, module.Tables.Count);
                Assert.AreEqual(3, module.Types.Count);
            }
        }
Exemplo n.º 7
0
        public void Module_FunctionBodyRoundTrip()
        {
            var source = new Module
            {
                Codes = new[]
                {
                    new FunctionBody
                    {
                        Locals = new[]
                        {
                            new Local
                            {
                                Count = 2,
                                Type  = ValueType.Float64
                            }
                        },
                        Code = new Instruction[]
                        {
                            new Instructions.End()
                        }
                    }
                }
            };

            Module destination;

            using (var stream = new MemoryStream())
            {
                source.WriteToBinary(stream);
                stream.Position = 0;

                destination = Module.ReadFromBinary(stream);
            }

            Assert.IsNotNull(destination.Codes);
            Assert.AreNotSame(source.Codes, destination.Codes);
            TestUtility.AreEqual(source.Codes[0], destination.Codes[0]);
        }
Exemplo n.º 8
0
        public void Module_ImportRoundTrip()
        {
            var source = new Module
            {
                Imports = new Import[]
                {
                    new Import.Function
                    {
                        Module    = "A",
                        Field     = "1",
                        TypeIndex = 2,
                    },
                    new Import.Table
                    {
                        Module     = "B",
                        Field      = "2",
                        Definition = new Table
                        {
                            ElementType     = ElementType.AnyFunction,
                            ResizableLimits = new ResizableLimits(1, 2),
                        },
                    },
                    new Import.Memory
                    {
                        Module = "C",
                        Field  = "3",
                        Type   = new Memory(4, 5),
                    },
                    new Import.Global
                    {
                        Module = "D",
                        Field  = "4",
                    },
                }
            };

            Module destination;

            using (var stream = new MemoryStream())
            {
                source.WriteToBinary(stream);
                stream.Position = 0;

                destination = Module.ReadFromBinary(stream);
            }

            Assert.IsNotNull(destination);
            Assert.AreNotSame(source, destination);
            Assert.IsNotNull(destination.Imports);
            var imports = destination.Imports;

            Assert.AreNotSame(source.Imports, imports);
            Assert.AreEqual(4, imports.Count);

            Assert.IsInstanceOfType(imports[0], typeof(Import.Function));
            {
                var function = (Import.Function)imports[0];
                Assert.AreEqual("A", function.Module);
                Assert.AreEqual("1", function.Field);
                Assert.AreEqual(2u, function.TypeIndex);
            }

            Assert.IsInstanceOfType(imports[1], typeof(Import.Table));
            {
                var table = (Import.Table)imports[1];
                Assert.AreEqual("B", table.Module);
                Assert.AreEqual("2", table.Field);
                Assert.IsNotNull(table.Definition);
                Assert.AreEqual(ElementType.AnyFunction, table.Definition.ElementType);
                Assert.IsNotNull(table.Definition.ResizableLimits);
                Assert.AreEqual(1u, table.Definition.ResizableLimits.Minimum);
                Assert.AreEqual(2u, table.Definition.ResizableLimits.Maximum.GetValueOrDefault());
            }

            Assert.IsInstanceOfType(imports[2], typeof(Import.Memory));
            {
                var memory = (Import.Memory)imports[2];
                Assert.AreEqual("C", memory.Module);
                Assert.AreEqual("3", memory.Field);
                Assert.IsNotNull(memory.Type);
                Assert.IsNotNull(memory.Type.ResizableLimits);
                Assert.AreEqual(4u, memory.Type.ResizableLimits.Minimum);
                Assert.AreEqual(5u, memory.Type.ResizableLimits.Maximum.GetValueOrDefault());
            }

            Assert.IsInstanceOfType(imports[3], typeof(Import.Global));
            {
                var global = (Import.Global)imports[3];
                Assert.AreEqual("D", global.Module);
                Assert.AreEqual("4", global.Field);
            }
        }