| <!DOCTYPE html> |
| <html> |
| <meta charset=utf-8> |
| <meta name="timeout" content="long"> |
| <title>Test structs.</title> |
| <script src="js/whlsl-test-harness.js"></script> |
| <script src="js/webgpu-functions.js"></script> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script> |
| const whlslTests = {}; |
| |
| whlslTests.setterWithMatchedType = async () => |
| { |
| const program = ` |
| int operator.foo(int) |
| { |
| return 5; |
| } |
| int operator.foo=(int, int) |
| { |
| return 543; |
| } |
| int foo() { |
| int x; |
| x.foo = 42; |
| return x; |
| } |
| int bar() { |
| int x; |
| return x.foo; |
| } |
| `; |
| |
| assert_equals(await callIntFunction(program, "foo", []), 543); |
| //assert_equals(await callIntFunction(program, "bar", []), 5); |
| } |
| |
| whlslTests.setterWithNoGetterOverload = async () => |
| { |
| await checkFail( |
| ` |
| struct Foo { } |
| struct Bar { } |
| int operator.foo(Foo) |
| { |
| return 534; |
| } |
| Bar operator.foo=(Bar, int) |
| { |
| return Bar(); |
| } |
| `); |
| |
| } |
| |
| whlslTests.setterWithNoGetterOverloadFixed = async () => |
| { |
| const program =` |
| struct Bar { } |
| int operator.foo(Bar) |
| { |
| return 534; |
| } |
| Bar operator.foo=(Bar, int) |
| { |
| return Bar(); |
| } |
| int foo() { |
| Bar bar; |
| return bar.foo; |
| } |
| int bar() { |
| Bar bar; |
| bar.foo = 52; |
| return bar.foo; |
| } |
| `; |
| assert_equals(await callIntFunction(program, "foo", []), 534); |
| assert_equals(await callIntFunction(program, "bar", []), 534); |
| } |
| |
| whlslTests.recursiveSetters = async () => |
| { |
| let program = ` |
| struct Foo { |
| int x; |
| int y; |
| } |
| struct Bar { |
| int a; |
| int b; |
| } |
| int operator.c(Bar bar) { return bar.a; } |
| Bar operator.bar(Foo foo) { Bar b; b.a = foo.x; b.b = foo.y; return b; } |
| Bar operator.c=(Bar bar, int newval) { bar.a = newval; return bar; } |
| Foo operator.bar=(Foo foo, Bar newval) { foo.x = newval.a; foo.y = newval.b; return foo; } |
| int f() { |
| Foo foo; |
| foo.x = foo.y = 3; |
| foo.bar.c = 8; |
| return foo.x*10 + foo.y; |
| } |
| `; |
| assert_equals(await callIntFunction(program, "f", []), 83); |
| } |
| |
| whlslTests.loneSetter = async () => |
| { |
| await checkFail( |
| ` |
| int operator.foo=(int, int) |
| { |
| return 543; |
| } |
| `); |
| |
| } |
| |
| whlslTests.loneSetterPointer = async () => |
| { |
| await checkFail( |
| ` |
| thread int* operator.foo=(thread int* ptr, int) |
| { |
| return ptr; |
| } |
| `); |
| |
| } |
| |
| runTests(whlslTests); |
| </script> |
| </html> |