From 09f87770e7dd04d068a36c53764f46dd21968d78 Mon Sep 17 00:00:00 2001 From: Martin Evans Date: Wed, 30 Nov 2022 15:59:12 +0000 Subject: [PATCH] Improved some test coverage. Fixed one small issue in the process: - Modified `wasmtime_engine_increment_epoch` to return `void` instead of `IntPtr`. Based on signature from these docs: https://docs.wasmtime.dev/c-api/engine_8h.html --- src/Engine.cs | 2 +- tests/ConfigTests.cs | 94 +++++++++++++++++++++++++++++++ tests/GlobalImportBindingTests.cs | 18 ++++++ tests/Modules/BulkMemory.wat | 9 +++ tests/Modules/MultiValue.wat | 4 ++ tests/Modules/SIMD.wat | 4 ++ tests/Modules/SharedMemory.wat | 3 + 7 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 tests/Modules/BulkMemory.wat create mode 100644 tests/Modules/MultiValue.wat create mode 100644 tests/Modules/SIMD.wat create mode 100644 tests/Modules/SharedMemory.wat diff --git a/src/Engine.cs b/src/Engine.cs index f20b3b6..f69f007 100644 --- a/src/Engine.cs +++ b/src/Engine.cs @@ -84,7 +84,7 @@ private static class Native public static extern void wasm_engine_delete(IntPtr engine); [DllImport(LibraryName)] - public static extern IntPtr wasmtime_engine_increment_epoch(IntPtr engine); + public static extern void wasmtime_engine_increment_epoch(IntPtr engine); } private readonly Handle handle; diff --git a/tests/ConfigTests.cs b/tests/ConfigTests.cs index 62c1b56..f224811 100644 --- a/tests/ConfigTests.cs +++ b/tests/ConfigTests.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using FluentAssertions; using Xunit; @@ -16,6 +17,15 @@ public void ItSetsCompilerStrategy() using var engine = new Engine(config); } + [Fact] + public void ItFailsSettingNonexistantCompilerStrategy() + { + var config = new Config(); + + var act = () => { config.WithCompilerStrategy((CompilerStrategy)123); }; + act.Should().Throw(); + } + [Fact] public void ItSetsProfilingStrategy() { @@ -26,6 +36,15 @@ public void ItSetsProfilingStrategy() using var engine = new Engine(config); } + [Fact] + public void ItFailsSettingNonexistantProfilingStrategy() + { + var config = new Config(); + + var act = () => { config.WithProfilingStrategy((ProfilingStrategy)123); }; + act.Should().Throw(); + } + [Fact] public void ItSetsOptimizationLevel() { @@ -36,6 +55,15 @@ public void ItSetsOptimizationLevel() using var engine = new Engine(config); } + [Fact] + public void ItFailsSettingNonexistantOptimizationLevel() + { + var config = new Config(); + + var act = () => { config.WithOptimizationLevel((OptimizationLevel)123); }; + act.Should().Throw(); + } + [Fact] public void ItSetsNanCanonicalization() { @@ -55,5 +83,71 @@ public void ItSetsEpochInterruption() using var engine = new Engine(config); } + + [Fact] + public void ItSetsDebugInfo() + { + var config = new Config(); + + config.WithDebugInfo(true); + + using var engine = new Engine(config); + } + + [Fact] + public void ItSetsThreads() + { + var config = new Config(); + config.WithWasmThreads(true); + + using var engine = new Engine(config); + using var module = Module.FromTextFile(engine, Path.Combine("Modules", "SharedMemory.wat")); + } + + [Fact] + public void ItSetsSIMD() + { + var config = new Config(); + config.WithSIMD(false); + + Action act = () => + { + using var engine = new Engine(config); + using var module = Module.FromTextFile(engine, Path.Combine("Modules", "SIMD.wat")); + }; + + act.Should().Throw(); + } + + [Fact] + public void ItSetsBulkMemory() + { + var config = new Config(); + config.WithBulkMemory(false); + config.WithReferenceTypes(false); + + Action act = () => + { + using var engine = new Engine(config); + using var module = Module.FromTextFile(engine, Path.Combine("Modules", "BulkMemory.wat")); + }; + + act.Should().Throw(); + } + + [Fact] + public void ItSetsMultiValue() + { + var config = new Config(); + config.WithMultiValue(false); + + Action act = () => + { + using var engine = new Engine(config); + using var module = Module.FromTextFile(engine, Path.Combine("Modules", "MultiValue.wat")); + }; + + act.Should().Throw(); + } } } diff --git a/tests/GlobalImportBindingTests.cs b/tests/GlobalImportBindingTests.cs index bd454dd..1838f2b 100644 --- a/tests/GlobalImportBindingTests.cs +++ b/tests/GlobalImportBindingTests.cs @@ -106,6 +106,24 @@ public void ItFailsToInstantiateWhenGlobalIsMut() .WithMessage("incompatible import type for `::global_i32`*"); } + [Fact] + public void ItFailsBindingGlobalsWithWrongType() + { + var global_i32_mut = new Global(Store, ValueKind.Int32, 0, Mutability.Mutable); + + global_i32_mut.Wrap().Should().BeNull(); + global_i32_mut.Wrap().Should().BeNull(); + global_i32_mut.Wrap().Should().BeNull(); + } + + [Fact] + public void ItFailsMutatingImmutableGlobal() + { + var global_i32_mut = new Global(Store, ValueKind.Int32, 0, Mutability.Immutable); + Action action = () => global_i32_mut.Wrap()!.SetValue(3); + action.Should().Throw(); + } + [Fact] public void ItBindsTheGlobalsCorrectly() { diff --git a/tests/Modules/BulkMemory.wat b/tests/Modules/BulkMemory.wat new file mode 100644 index 0000000..df08ea5 --- /dev/null +++ b/tests/Modules/BulkMemory.wat @@ -0,0 +1,9 @@ +(module + (func (param $dst i32) (param $src i32) (param $size i32) (result i32) + local.get $dst + local.get $src + local.get $size + memory.copy + local.get $dst + ) +) diff --git a/tests/Modules/MultiValue.wat b/tests/Modules/MultiValue.wat new file mode 100644 index 0000000..09938b6 --- /dev/null +++ b/tests/Modules/MultiValue.wat @@ -0,0 +1,4 @@ +(module + (func $echo_tuple2 (result i32 i32) i32.const 1 i32.const 2) + (export "$echo_tuple2" (func $echo_tuple2)) +) diff --git a/tests/Modules/SIMD.wat b/tests/Modules/SIMD.wat new file mode 100644 index 0000000..ef689b8 --- /dev/null +++ b/tests/Modules/SIMD.wat @@ -0,0 +1,4 @@ +(module + (func $echo_v128 (param v128) (result v128) local.get 0) + (export "$echo_v128" (func $echo_v128)) +) diff --git a/tests/Modules/SharedMemory.wat b/tests/Modules/SharedMemory.wat new file mode 100644 index 0000000..34d0158 --- /dev/null +++ b/tests/Modules/SharedMemory.wat @@ -0,0 +1,3 @@ +(module + (memory 1 1 shared) +)