blob: 7ce8effa1b198ab423c1e6e47891dc2e0346b6f1 [file] [log] [blame]
<!DOCTYPE html>
<html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Enums.</title>
<script src="js/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.failTrickyDoubleZero = async () => {
const program = `
enum E {
F,
G = -2,
H,
I // should get zero, and that's a dupe.
}
int foo()
{
E e = E.Foo;
return 42;
}
`;
await checkFail(program);
};
whlslTests.simpleDeclaration = async () => {
const program = `
enum E {
Foo,
Bar
}
int foo()
{
E e = E.Foo;
return 42;
}
`;
assert_equals(await callIntFunction(program, "foo", []), 42);
};
whlslTests.enumWithUintBase = async () => {
let program = `
enum Foo : uint {
War,
Famine,
Pestilence,
Death
}
Foo _war()
{
return Foo.War;
}
bool war()
{
return _war() == Foo.War;
}
Foo _famine()
{
return Foo.Famine;
}
bool famine()
{
return _famine() == Foo.Famine;
}
Foo _pestilence()
{
return Foo.Pestilence;
}
bool pestilence()
{
return _pestilence() == Foo.Pestilence;
}
Foo _death()
{
return Foo.Death;
}
bool death()
{
return _death() == Foo.Death;
}
bool _equals(Foo a, Foo b)
{
return a == b;
}
bool _notEquals(Foo a, Foo b)
{
return a != b;
}
bool testSimpleEqual()
{
return _equals(Foo.War, Foo.War);
}
bool testAnotherEqual()
{
return _equals(Foo.Pestilence, Foo.Pestilence);
}
bool testNotEqual()
{
return _equals(Foo.Famine, Foo.Death);
}
bool testSimpleNotEqual()
{
return _notEquals(Foo.War, Foo.War);
}
bool testAnotherNotEqual()
{
return _notEquals(Foo.Pestilence, Foo.Pestilence);
}
bool testNotNotEqual()
{
return _notEquals(Foo.Famine, Foo.Death);
}
uint _uintWar()
{
return uint(_war());
}
uint uintWar()
{
return _uintWar();
}
uint _uintFamine()
{
return uint(_famine());
}
uint uintFamine()
{
return _uintFamine();
}
uint _uintPestilence()
{
return uint(_pestilence());
}
uint uintPestilence()
{
return _uintPestilence();
}
uint _uintDeath()
{
return uint(_death());
}
uint uintDeath()
{
return _uintDeath();
}
bool uintWarBackwards()
{
return Foo(_uintWar()) == Foo.War;
}
bool uintFamineBackwards()
{
return Foo(_uintFamine()) == Foo.Famine;
}
bool uintPestilenceBackwards()
{
return Foo(_uintPestilence()) == Foo.Pestilence;
}
bool uintDeathBackwards()
{
return Foo(_uintDeath()) == Foo.Death;
}
`;
assert_equals(await callBoolFunction(program, "war", []), true);
assert_equals(await callBoolFunction(program, "famine", []), true);
assert_equals(await callBoolFunction(program, "pestilence", []), true);
assert_equals(await callBoolFunction(program, "death", []), true);
assert_equals(await callBoolFunction(program, "testSimpleEqual", []), true);
assert_equals(await callBoolFunction(program, "testAnotherEqual", []), true);
assert_equals(await callBoolFunction(program, "testNotEqual", []), false);
assert_equals(await callBoolFunction(program, "testSimpleNotEqual", []), false);
assert_equals(await callBoolFunction(program, "testAnotherNotEqual", []), false);
assert_equals(await callBoolFunction(program, "testNotNotEqual", []), true);
assert_equals(await callUintFunction(program, "uintWar", []), 0);
assert_equals(await callUintFunction(program, "uintFamine", []), 1);
assert_equals(await callUintFunction(program, "uintPestilence", []), 2);
assert_equals(await callUintFunction(program, "uintDeath", []), 3);
assert_equals(await callBoolFunction(program, "uintWarBackwards", []), true);
assert_equals(await callBoolFunction(program, "uintFamineBackwards", []), true);
assert_equals(await callBoolFunction(program, "uintPestilenceBackwards", []), true);
assert_equals(await callBoolFunction(program, "uintDeathBackwards", []), true);
};
whlslTests.enumWithoutZero = async () => {
await checkFail(
`
enum Foo {
War = 72,
Famine = 64,
Pestilence = 23,
Death = -42
}
`);
};
whlslTests.enumNegativeUint = async () => {
await checkFail(
`
enum Foo : uint {
War,
Famine,
Pestilence,
Death = -42
}
`);
};
whlslTests.pastIntMax = async () => {
await checkFail(
`
enum Foo : int {
War = 2147483647,
Famine,
Pestilence = 0,
Death
}
`);
};
whlslTests.enumWithSomeManualValues = async () => {
let program = `
enum Foo {
War = 72,
Famine,
Pestilence = 0,
Death
}
int war()
{
return int(Foo.War);
}
int famine()
{
return int(Foo.Famine);
}
int pestilence()
{
return int(Foo.Pestilence);
}
int death()
{
return int(Foo.Death);
}
`;
assert_equals(await callIntFunction(program, "war", []), 72);
assert_equals(await callIntFunction(program, "famine", []), 73);
assert_equals(await callIntFunction(program, "pestilence", []), 0);
assert_equals(await callIntFunction(program, "death", []), 1);
};
whlslTests.enumSwitchBreakExhaustive = async () => {
let program = `
enum Foo {
A, B, C
}
int foo(int x)
{
int result = 0;
switch (Foo(x)) {
case Foo.A:
result += 27;
break;
case Foo.B:
result += 7624;
break;
case Foo.C:
result += 49;
break;
}
return result;
}
`;
assert_equals(await callIntFunction(program, "foo", [makeInt(0)]), 27);
assert_equals(await callIntFunction(program, "foo", [makeInt(1)]), 7624);
assert_equals(await callIntFunction(program, "foo", [makeInt(2)]), 49);
}
whlslTests.enumSwitchBreakNotQuiteExhaustiveWithDefault = async () => {
let program = `
enum Foo {
A, B, C
}
int foo(int x)
{
int result = 0;
switch (Foo(x)) {
case Foo.A:
result += 27;
break;
case Foo.B:
result += 7624;
break;
default:
result += 49;
break;
}
return result;
}
`;
assert_equals(await callIntFunction(program, "foo", [makeInt(0)]), 27);
assert_equals(await callIntFunction(program, "foo", [makeInt(1)]), 7624);
assert_equals(await callIntFunction(program, "foo", [makeInt(2)]), 49);
}
whlslTests.enumWithManualValues = async () => {
let program = `
enum Foo {
War = 72,
Famine = 0,
Pestilence = 23,
Death = -42
}
int war()
{
return int(Foo.War);
}
int famine()
{
return int(Foo.Famine);
}
int pestilence()
{
return int(Foo.Pestilence);
}
int death()
{
return int(Foo.Death);
}
`;
assert_equals(await callIntFunction(program, "war", []), 72);
assert_equals(await callIntFunction(program, "famine", []), 0);
assert_equals(await callIntFunction(program, "pestilence", []), 23);
assert_equals(await callIntFunction(program, "death", []), -42);
};
whlslTests.enumSwitchBreakNotQuiteExhaustive = async () => {
await checkFail(
`
enum Foo {
A, B, C, D
}
int foo(Foo x)
{
int result = 0;
switch (x) {
case Foo.A:
result += 27;
break;
case Foo.B:
result += 7624;
break;
case Foo.C:
result += 49;
break;
}
return result;
}
`);
};
whlslTests.copyConstructors = async () => {
const program = `
enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Pizzaday
}
int foo()
{
Weekday x = Weekday.Monday;
Weekday y = Weekday(x);
float4 z = float4(1, 2, 3, 4);
float4 w = float4(z);
float2x2 p;
float2x2 q = float2x2(p);
return 42;
}
`;
assert_equals(await callIntFunction(program, "foo", []), 42);
};
runTests(whlslTests);
</script>
</html>