Skip to content
Merged
Prev Previous commit
Next Next commit
Add tests
  • Loading branch information
radical committed Nov 30, 2022
commit 8ea288423fc9202c17b012549bc79f5f85b3e89a
67 changes: 67 additions & 0 deletions src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Xunit;
using Xunit.Abstractions;

Expand Down Expand Up @@ -551,6 +552,72 @@ public void BuildNativeInNonEnglishCulture(BuildArgs buildArgs, string culture,
Assert.Contains("square: 25", output);
}

[Theory]
[BuildAndRun(host: RunHost.Chrome, parameters: new object[] { new object[] {
"with-hyphen",
"with#hash-and-hyphen",
"with.per.iod",
"with🚀unicode#"
} })]

public void BuildLibraryWithInvalidCharacters(BuildArgs buildArgs, string[] libraryNames, RunHost host, string id)
{
buildArgs = ExpandBuildArgs(buildArgs,
extraItems: @$"<NativeFileReference Include=""*.c"" />",
extraProperties: buildArgs.AOT
? string.Empty
: "<WasmBuildNative>true</WasmBuildNative>");

int baseArg = 10;
(_, string output) = BuildProject(buildArgs,
id: id,
new BuildProjectOptions(
InitProject: () => GenerateSourceFiles(_projectDir!, baseArg),
Publish: buildArgs.AOT,
DotnetWasmFromRuntimePack: false
));

output = RunAndTestWasmApp(buildArgs,
buildDir: _projectDir,
expectedExitCode: 42,
host: host,
id: id);

for (int i = 0; i < libraryNames.Length; i ++)
{
Assert.Contains($"square_{i}: {(i + baseArg) * (i + baseArg)}", output);
}

void GenerateSourceFiles(string outputPath, int baseArg)
{
StringBuilder csBuilder = new($@"
using System;
using System.Runtime.InteropServices;
");

StringBuilder dllImportsBuilder = new();
for (int i = 0; i < libraryNames.Length; i ++)
{
dllImportsBuilder.AppendLine($"[DllImport(\"{libraryNames[i]}\")] static extern int square_{i}(int x);");
csBuilder.AppendLine($@"Console.WriteLine($""square_{i}: {{square_{i}({i + baseArg})}}"");");

string nativeCode = $@"
#include <stdarg.h>

int square_{i}(int x)
{{
return x * x;
}}";
File.WriteAllText(Path.Combine(outputPath, $"{libraryNames[i]}.c"), nativeCode);
}

csBuilder.AppendLine("return 42;");
csBuilder.Append(dllImportsBuilder);

File.WriteAllText(Path.Combine(outputPath, "Program.cs"), csBuilder.ToString());
}
}

private (BuildArgs, string) BuildForVariadicFunctionTests(string programText, BuildArgs buildArgs, string id, string? verbosity = null, string extraProperties = "")
{
extraProperties += "<AllowUnsafeBlocks>true</AllowUnsafeBlocks><_WasmDevel>true</_WasmDevel>";
Expand Down