Skip to content

Commit a2922e2

Browse files
authored
migrate variants test to new test framework (#1239)
Signed-off-by: James Sturtevant <[email protected]>
1 parent 14fdbcc commit a2922e2

File tree

14 files changed

+418
-555
lines changed

14 files changed

+418
-555
lines changed

crates/test-rust-wasm/Cargo.toml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ rust-xcrate-test = { path = './rust-xcrate-test' }
1212
test = false
1313
doctest = false
1414

15-
[[bin]]
16-
name = "variants"
17-
test = false
18-
1915
[[bin]]
2016
name = "flavorful"
2117
test = false

crates/test-rust-wasm/src/bin/variants.rs

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/runtime-new/variants/runner.c

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
#include <assert.h>
2+
#include <runner.h>
3+
#include <stddef.h>
4+
5+
int main() {
6+
{
7+
float a = 1;
8+
uint8_t r;
9+
assert(test_variants_to_test_roundtrip_option(&a, &r) && r == 1);
10+
assert(!test_variants_to_test_roundtrip_option(NULL, &r));
11+
a = 2;
12+
assert(test_variants_to_test_roundtrip_option(&a, &r) && r == 2);
13+
}
14+
15+
{
16+
test_variants_to_test_result_u32_f32_t a;
17+
double b_ok;
18+
uint8_t b_err;
19+
20+
a.is_err = false;
21+
a.val.ok = 2;
22+
assert(test_variants_to_test_roundtrip_result(&a, &b_ok, &b_err));
23+
assert(b_ok == 2.0);
24+
25+
a.val.ok = 4;
26+
assert(test_variants_to_test_roundtrip_result(&a, &b_ok, &b_err));
27+
assert(b_ok == 4);
28+
29+
a.is_err = true;
30+
a.val.err = 5.3;
31+
assert(!test_variants_to_test_roundtrip_result(&a, &b_ok, &b_err));
32+
assert(b_err == 5);
33+
}
34+
35+
assert(test_variants_to_test_roundtrip_enum(TEST_VARIANTS_TO_TEST_E1_A) == TEST_VARIANTS_TO_TEST_E1_A);
36+
assert(test_variants_to_test_roundtrip_enum(TEST_VARIANTS_TO_TEST_E1_B) == TEST_VARIANTS_TO_TEST_E1_B);
37+
38+
assert(test_variants_to_test_invert_bool(true) == false);
39+
assert(test_variants_to_test_invert_bool(false) == true);
40+
41+
{
42+
test_variants_to_test_casts_t c, ret;
43+
c.f0.tag = TEST_VARIANTS_TO_TEST_C1_A;
44+
c.f0.val.a = 1;
45+
c.f1.tag = TEST_VARIANTS_TO_TEST_C2_A;
46+
c.f1.val.a = 2;
47+
c.f2.tag = TEST_VARIANTS_TO_TEST_C3_A;
48+
c.f2.val.a = 3;
49+
c.f3.tag = TEST_VARIANTS_TO_TEST_C4_A;
50+
c.f3.val.a = 4;
51+
c.f4.tag = TEST_VARIANTS_TO_TEST_C5_A;
52+
c.f4.val.a = 5;
53+
c.f5.tag = TEST_VARIANTS_TO_TEST_C6_A;
54+
c.f5.val.a = 6;
55+
test_variants_to_test_variant_casts(&c, &ret);
56+
assert(ret.f0.tag == TEST_VARIANTS_TO_TEST_C1_A && ret.f0.val.a == 1);
57+
assert(ret.f1.tag == TEST_VARIANTS_TO_TEST_C2_A && ret.f1.val.a == 2);
58+
assert(ret.f2.tag == TEST_VARIANTS_TO_TEST_C3_A && ret.f2.val.a == 3);
59+
assert(ret.f3.tag == TEST_VARIANTS_TO_TEST_C4_A && ret.f3.val.a == 4);
60+
assert(ret.f4.tag == TEST_VARIANTS_TO_TEST_C5_A && ret.f4.val.a == 5);
61+
assert(ret.f5.tag == TEST_VARIANTS_TO_TEST_C6_A && ret.f5.val.a == 6);
62+
}
63+
64+
{
65+
test_variants_to_test_casts_t c, ret;
66+
c.f0.tag = TEST_VARIANTS_TO_TEST_C1_B;
67+
c.f0.val.b = 1;
68+
c.f1.tag = TEST_VARIANTS_TO_TEST_C2_B;
69+
c.f1.val.b = 2;
70+
c.f2.tag = TEST_VARIANTS_TO_TEST_C3_B;
71+
c.f2.val.b = 3;
72+
c.f3.tag = TEST_VARIANTS_TO_TEST_C4_B;
73+
c.f3.val.b = 4;
74+
c.f4.tag = TEST_VARIANTS_TO_TEST_C5_B;
75+
c.f4.val.b = 5;
76+
c.f5.tag = TEST_VARIANTS_TO_TEST_C6_B;
77+
c.f5.val.b = 6;
78+
test_variants_to_test_variant_casts(&c, &ret);
79+
assert(ret.f0.tag == TEST_VARIANTS_TO_TEST_C1_B && ret.f0.val.b == 1);
80+
assert(ret.f1.tag == TEST_VARIANTS_TO_TEST_C2_B && ret.f1.val.b == 2);
81+
assert(ret.f2.tag == TEST_VARIANTS_TO_TEST_C3_B && ret.f2.val.b == 3);
82+
assert(ret.f3.tag == TEST_VARIANTS_TO_TEST_C4_B && ret.f3.val.b == 4);
83+
assert(ret.f4.tag == TEST_VARIANTS_TO_TEST_C5_B && ret.f4.val.b == 5);
84+
assert(ret.f5.tag == TEST_VARIANTS_TO_TEST_C6_B && ret.f5.val.b == 6);
85+
}
86+
87+
{
88+
test_variants_to_test_zeros_t c, ret;
89+
c.f0.tag = TEST_VARIANTS_TO_TEST_Z1_A;
90+
c.f0.val.a = 1;
91+
c.f1.tag = TEST_VARIANTS_TO_TEST_Z2_A;
92+
c.f1.val.a = 2;
93+
c.f2.tag = TEST_VARIANTS_TO_TEST_Z3_A;
94+
c.f2.val.a = 3;
95+
c.f3.tag = TEST_VARIANTS_TO_TEST_Z4_A;
96+
c.f3.val.a = 4;
97+
test_variants_to_test_variant_zeros(&c, &ret);
98+
assert(ret.f0.tag == TEST_VARIANTS_TO_TEST_Z1_A && ret.f0.val.a == 1);
99+
assert(ret.f1.tag == TEST_VARIANTS_TO_TEST_Z2_A && ret.f1.val.a == 2);
100+
assert(ret.f2.tag == TEST_VARIANTS_TO_TEST_Z3_A && ret.f2.val.a == 3);
101+
assert(ret.f3.tag == TEST_VARIANTS_TO_TEST_Z4_A && ret.f3.val.a == 4);
102+
}
103+
104+
{
105+
test_variants_to_test_zeros_t c, ret;
106+
c.f0.tag = TEST_VARIANTS_TO_TEST_Z1_B;
107+
c.f1.tag = TEST_VARIANTS_TO_TEST_Z2_B;
108+
c.f2.tag = TEST_VARIANTS_TO_TEST_Z3_B;
109+
c.f3.tag = TEST_VARIANTS_TO_TEST_Z4_B;
110+
test_variants_to_test_variant_zeros(&c, &ret);
111+
assert(ret.f0.tag == TEST_VARIANTS_TO_TEST_Z1_B);
112+
assert(ret.f1.tag == TEST_VARIANTS_TO_TEST_Z2_B);
113+
assert(ret.f2.tag == TEST_VARIANTS_TO_TEST_Z3_B);
114+
assert(ret.f3.tag == TEST_VARIANTS_TO_TEST_Z4_B);
115+
}
116+
117+
{
118+
bool b = false;
119+
test_variants_to_test_result_typedef_t c;
120+
c.is_err = true;
121+
test_variants_to_test_variant_typedefs(NULL, b, &c);
122+
}
123+
124+
{
125+
test_variants_to_test_tuple3_bool_result_void_void_my_errno_t ret;
126+
test_variants_to_test_result_void_void_t b;
127+
b.is_err = false;
128+
test_variants_to_test_variant_enums(true, &b, TEST_VARIANTS_TO_TEST_MY_ERRNO_SUCCESS, &ret);
129+
assert(ret.f0 == true);
130+
assert(!ret.f1.is_err);
131+
assert(ret.f2 == TEST_VARIANTS_TO_TEST_MY_ERRNO_SUCCESS);
132+
}
133+
134+
return 0;
135+
}

tests/runtime-new/variants/runner.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System;
2+
using System.Runtime.InteropServices;
3+
using System.Diagnostics;
4+
using RunnerWorld.wit.imports.test.variants;
5+
using System.Text;
6+
using RunnerWorld;
7+
8+
public class Program
9+
{
10+
public static void Main(string[] args)
11+
{
12+
Debug.Assert(ToTestInterop.RoundtripOption(1.0f).Value == 1);
13+
Debug.Assert(ToTestInterop.RoundtripOption(null).HasValue == false);
14+
Debug.Assert(ToTestInterop.RoundtripOption(2.0f).Value == 2);
15+
16+
Debug.Assert(ToTestInterop.RoundtripResult(Result<uint, float>.Ok(2)) == 2.0);
17+
Debug.Assert(ToTestInterop.RoundtripResult(Result<uint, float>.Ok(4)) == 4.0);
18+
try
19+
{
20+
ToTestInterop.RoundtripResult(Result<uint, float>.Err(5.3f));
21+
throw new Exception();
22+
}
23+
catch (WitException e)
24+
{
25+
Debug.Assert((byte)e.Value == 5);
26+
}
27+
28+
Debug.Assert(ToTestInterop.RoundtripEnum(IToTest.E1.A) == IToTest.E1.A);
29+
Debug.Assert(ToTestInterop.RoundtripEnum(IToTest.E1.B) == IToTest.E1.B);
30+
31+
Debug.Assert(ToTestInterop.InvertBool(true) == false);
32+
Debug.Assert(ToTestInterop.InvertBool(false) == true);
33+
34+
var (a1, a2, a3, a4, a5, a6) =
35+
ToTestInterop.VariantCasts((IToTest.C1.A(1), IToTest.C2.A(2), IToTest.C3.A(3), IToTest.C4.A(4), IToTest.C5.A(5), IToTest.C6.A(6.0f)));
36+
Debug.Assert(a1.AsA == 1);
37+
Debug.Assert(a2.AsA == 2);
38+
Debug.Assert(a3.AsA == 3);
39+
Debug.Assert(a4.AsA == 4);
40+
Debug.Assert(a5.AsA == 5);
41+
Debug.Assert(a6.AsA == 6.0f);
42+
43+
var (b1, b2, b3, b4, b5, b6) =
44+
ToTestInterop.VariantCasts((IToTest.C1.B(1), IToTest.C2.B(2), IToTest.C3.B(3), IToTest.C4.B(4), IToTest.C5.B(5), IToTest.C6.B(6.0)));
45+
Debug.Assert(b1.AsB == 1);
46+
Debug.Assert(b2.AsB == 2.0f);
47+
Debug.Assert(b3.AsB == 3.0f);
48+
Debug.Assert(b4.AsB == 4.0f);
49+
Debug.Assert(b5.AsB == 5.0f);
50+
Debug.Assert(b6.AsB == 6.0);
51+
52+
var (za1, za2, za3, za4) =
53+
ToTestInterop.VariantZeros((IToTest.Z1.A(1), IToTest.Z2.A(2), IToTest.Z3.A(3.0f), IToTest.Z4.A(4.0f)));
54+
Debug.Assert(za1.AsA == 1);
55+
Debug.Assert(za2.AsA == 2);
56+
Debug.Assert(za3.AsA == 3.0f);
57+
Debug.Assert(za4.AsA == 4.0f);
58+
59+
var (zb1, zb2, zb3, zb4) =
60+
ToTestInterop.VariantZeros((IToTest.Z1.B(), IToTest.Z2.B(), IToTest.Z3.B(), IToTest.Z4.B()));
61+
//TODO: Add comparison operator to variants and None
62+
//Debug.Assert(zb1.AsB == IToTest.Z1.b());
63+
//Debug.Assert(zb2.AsB == IToTest.Z2.b());
64+
//Debug.Assert(zb3.AsB == IToTest.Z3.b());
65+
//Debug.Assert(zb4.AsB == IToTest.Z4.b());
66+
67+
ToTestInterop.VariantTypedefs(null, false, Result<uint, None>.Err(new None()));
68+
69+
var (a, b, c) = ToTestInterop.VariantEnums(true, Result<None, None>.Ok(new None()), IToTest.MyErrno.SUCCESS);
70+
Debug.Assert(a == true);
71+
var test = b.AsOk;
72+
Debug.Assert(c == IToTest.MyErrno.SUCCESS);
73+
}
74+
}

tests/runtime-new/variants/runner.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
include!(env!("BINDINGS"));
2+
3+
use crate::test::variants::to_test::*;
4+
5+
fn main() {
6+
assert_eq!(roundtrip_option(Some(1.0)), Some(1));
7+
assert_eq!(roundtrip_option(None), None);
8+
assert_eq!(roundtrip_option(Some(2.0)), Some(2));
9+
assert_eq!(roundtrip_result(Ok(2)), Ok(2.0));
10+
assert_eq!(roundtrip_result(Ok(4)), Ok(4.0));
11+
assert_eq!(roundtrip_result(Err(5.3)), Err(5));
12+
13+
assert_eq!(roundtrip_enum(E1::A), E1::A);
14+
assert_eq!(roundtrip_enum(E1::B), E1::B);
15+
16+
assert_eq!(invert_bool(true), false);
17+
assert_eq!(invert_bool(false), true);
18+
19+
let (a1, a2, a3, a4, a5, a6) =
20+
variant_casts((C1::A(1), C2::A(2), C3::A(3), C4::A(4), C5::A(5), C6::A(6.0)));
21+
assert!(matches!(a1, C1::A(1)));
22+
assert!(matches!(a2, C2::A(2)));
23+
assert!(matches!(a3, C3::A(3)));
24+
assert!(matches!(a4, C4::A(4)));
25+
assert!(matches!(a5, C5::A(5)));
26+
assert!(matches!(a6, C6::A(b) if b == 6.0));
27+
28+
let (a1, a2, a3, a4, a5, a6) = variant_casts((
29+
C1::B(1),
30+
C2::B(2.0),
31+
C3::B(3.0),
32+
C4::B(4.0),
33+
C5::B(5.0),
34+
C6::B(6.0),
35+
));
36+
assert!(matches!(a1, C1::B(1)));
37+
assert!(matches!(a2, C2::B(b) if b == 2.0));
38+
assert!(matches!(a3, C3::B(b) if b == 3.0));
39+
assert!(matches!(a4, C4::B(b) if b == 4.0));
40+
assert!(matches!(a5, C5::B(b) if b == 5.0));
41+
assert!(matches!(a6, C6::B(b) if b == 6.0));
42+
43+
let (a1, a2, a3, a4) = variant_zeros((Z1::A(1), Z2::A(2), Z3::A(3.0), Z4::A(4.0)));
44+
assert!(matches!(a1, Z1::A(1)));
45+
assert!(matches!(a2, Z2::A(2)));
46+
assert!(matches!(a3, Z3::A(b) if b == 3.0));
47+
assert!(matches!(a4, Z4::A(b) if b == 4.0));
48+
49+
let (a1, a2, a3, a4) = variant_zeros((Z1::B, Z2::B, Z3::B, Z4::B));
50+
assert!(matches!(a1, Z1::B));
51+
assert!(matches!(a2, Z2::B));
52+
assert!(matches!(a3, Z3::B));
53+
assert!(matches!(a4, Z4::B));
54+
55+
variant_typedefs(None, false, Err(()));
56+
57+
assert_eq!(
58+
variant_enums(true, Ok(()), MyErrno::Success),
59+
(true, Ok(()), MyErrno::Success)
60+
);
61+
}

tests/runtime-new/variants/test.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include <assert.h>
2+
#include <test.h>
3+
#include <stddef.h>
4+
5+
bool exports_test_variants_to_test_roundtrip_option(float *a, uint8_t *ret0) {
6+
if (a) {
7+
*ret0 = *a;
8+
}
9+
return a != NULL;
10+
}
11+
12+
bool exports_test_variants_to_test_roundtrip_result(exports_test_variants_to_test_result_u32_f32_t *a, double *ok, uint8_t *err) {
13+
if (a->is_err) {
14+
*err = a->val.err;
15+
return false;
16+
} else {
17+
*ok = a->val.ok;
18+
return true;
19+
}
20+
}
21+
22+
exports_test_variants_to_test_e1_t exports_test_variants_to_test_roundtrip_enum(exports_test_variants_to_test_e1_t a) {
23+
return a;
24+
}
25+
26+
bool exports_test_variants_to_test_invert_bool(bool a) {
27+
return !a;
28+
}
29+
30+
void exports_test_variants_to_test_variant_casts(exports_test_variants_to_test_casts_t *a, exports_test_variants_to_test_casts_t *ret) {
31+
*ret = *a;
32+
}
33+
34+
void exports_test_variants_to_test_variant_zeros(exports_test_variants_to_test_zeros_t *a, exports_test_variants_to_test_zeros_t *b) {
35+
*b = *a;
36+
}
37+
38+
void exports_test_variants_to_test_variant_typedefs(uint32_t *a, exports_test_variants_to_test_bool_typedef_t b, exports_test_variants_to_test_result_typedef_t *c) {
39+
}
40+
41+
void exports_test_variants_to_test_variant_enums(
42+
bool a,
43+
exports_test_variants_to_test_result_void_void_t *b,
44+
exports_test_variants_to_test_my_errno_t c,
45+
exports_test_variants_to_test_tuple3_bool_result_void_void_my_errno_t *ret) {
46+
ret->f0 = a;
47+
ret->f1 = *b;
48+
ret->f2 = c;
49+
}

tests/runtime-new/variants/test.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
namespace TestWorld.wit.exports.test.variants
2+
{
3+
public class ToTestImpl : ITestWorld
4+
{
5+
public static byte? RoundtripOption(float? a)
6+
{
7+
return a is null ? null : (byte)a;
8+
}
9+
10+
public static double RoundtripResult(Result<uint, float> a)
11+
{
12+
switch (a.Tag)
13+
{
14+
case Result<double, byte>.Tags.Ok: return (double)a.AsOk;
15+
case Result<double, byte>.Tags.Err: throw new WitException((byte)a.AsErr, 0);
16+
default: throw new ArgumentException();
17+
}
18+
}
19+
20+
public static IToTest.E1 RoundtripEnum(IToTest.E1 a)
21+
{
22+
return a;
23+
}
24+
25+
public static bool InvertBool(bool a)
26+
{
27+
return !a;
28+
}
29+
30+
public static (IToTest.C1, IToTest.C2, IToTest.C3, IToTest.C4, IToTest.C5, IToTest.C6)
31+
VariantCasts((IToTest.C1, IToTest.C2, IToTest.C3, IToTest.C4, IToTest.C5, IToTest.C6) a)
32+
{
33+
return a;
34+
}
35+
36+
public static (bool, Result<None, None>, IToTest.MyErrno)
37+
VariantEnums(bool a, Result<None, None> b, IToTest.MyErrno c)
38+
{
39+
return new(a, b, c);
40+
}
41+
42+
public static void VariantTypedefs(uint? a, bool b, Result<uint, None> c) { }
43+
44+
public static (IToTest.Z1, IToTest.Z2, IToTest.Z3, IToTest.Z4) VariantZeros((IToTest.Z1, IToTest.Z2, IToTest.Z3, IToTest.Z4) a)
45+
{
46+
return a;
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)