interoptopus_csharp 0.16.0-alpha.19

The C# backend for Interoptopus.
Documentation
using My.Company;
using My.Company.Common;
using Xunit;
using Interop = My.Company.Interop;

public class TestPatternStrings
{
    [Fact]
    public void pattern_ascii_pointer_1()
    {
        var x = Utf8String.From("hello world");
        Assert.Equal(11u, Interop.pattern_ascii_pointer_1("hello world"));
    }

    [Fact]
    public void pattern_ascii_pointer_2()
    {
        var rval = Interop.pattern_ascii_pointer_2();
        Assert.Equal(rval, "hello.world");
    }

    [Fact]
    public void pattern_string_1()
    {
        Assert.Equal("hello world", Interop.pattern_string_1("hello world".Utf8()).String);
        Assert.Equal("hello world", Interop.pattern_string_1("hello world".Utf8()).String);
    }

    [Fact]
    public void pattern_string_2()
    {
        Assert.Equal(11u, Interop.pattern_string_2("hello world".Utf8()));
    }

    [Fact]
    public void pattern_string_3()
    {
        Assert.Equal("pattern_string_3", Interop.pattern_string_3().String);
    }

    [Fact]
    public void pattern_string_4()
    {
        var w = new UseString { s1 = "hello".Utf8(), s2 = "world".Utf8() };
        var s = Interop.pattern_string_4(w);
        Assert.Equal("hello", s.s1.String);
        Assert.Equal("world", s.s2.String);
    }

    [Fact]
    public void pattern_string_6()
    {
        var r1 = new UseString { s1 = "hello".Utf8(), s2 = "world".Utf8() };
        Interop.pattern_string_6a(ref r1);

        var y = new UseString { s1 = "".Utf8(), s2 = "".Utf8() };
        Interop.pattern_string_6b(ref y).AsOk();
        Assert.Equal("s1", y.s1.String);
        Assert.Equal("s2", y.s2.String);
    }

    [Fact]
    public void pattern_string_7()
    {
        var slice = SliceUtf8String.From(["hello".Utf8(), "world".Utf8()]);
        var r1 = Interop.pattern_string_7(slice, 0).AsOk();
        var r2 = Interop.pattern_string_7(slice, 1).AsOk();
        Assert.Equal("hello", r1.String);
        Assert.Equal("world", r2.String);
    }

    [Fact]
    public void pattern_string_8()
    {
        var x = new UseString[]
        {
            new() { s1 = "hello1".Utf8(), s2 = "world1".Utf8() },
            new() { s1 = "hello2".Utf8(), s2 = "world2".Utf8() }
        };

        var slice = SliceUseString.From(x);

        var r1 = Interop.pattern_string_8(slice, 0).AsOk();
        var r2 = Interop.pattern_string_8(slice, 1).AsOk();

        Assert.Equal("hello1", r1.s1.String);
        Assert.Equal("world2", r2.s2.String);
    }

    [Fact]
    public void pattern_string_9()
    {
        var rval = Interop.pattern_string_9();

        // Should not crash attempting to de-serialize a non-existing string

        Assert.Equal(rval.AsErr(), Error.Fail);
    }

    [Fact]
    public void pattern_string_10()
    {
        var s = "hello world".Utf8();
        Interop.pattern_string_10(s);
    }

    [Fact]
    public void pattern_string_11()
    {
        var s = "hello world".Utf8();
        Interop.pattern_string_11(ref s);
        s.Dispose();
    }

    [Fact]
    public void pattern_string_12()
    {
        var rval = Interop.pattern_string_12(s1 => s1 + "world", "hello");
        Assert.Equal(rval, "helloworld");
    }

    [Fact]
    public void pattern_string_13()
    {
    }


    [Fact]
    public void string_by_ref_dont_leak()
    {
        // TODO - Can we somehow measure memory use?
        var w = new UseString { s1 = "hello".Utf8(), s2 = "world".Utf8() };
        for (var i = 0; i < 1024 * 1024; i++) Interop.pattern_string_6a(ref w);
    }

    [Fact]
    public void string_by_out_dont_leak()
    {
        // TODO - Can we somehow measure memory use?
        for (var i = 0; i < 1024 * 1024; i++)
        {
            var w = new UseString { s1 = "hello".Utf8(), s2 = "world".Utf8() };
            var r2 = Interop.pattern_string_6b(ref w);
        }
    }

    [Fact]
    public void string_clones()
    {
        using var s1 = "hello".Utf8();

        for (var i = 0; i < 1000; i++)
        {
            using var s2 = s1.Clone();
            Assert.Equal(s1.String, s2.String);
        }
    }

    [Fact]
    public void string_multiple_dispose()
    {
        var s1 = "hello".Utf8();
        s1.Dispose();
        s1.Dispose();
        s1.Dispose();
    }
}