package parser import ( "testing" "github.com/marzeq/qk/tokeniser" ) func TestWhenParsesThroughOrdinaryGrammar(t *testing.T) { source := ` module test let choose(value: i32): i32 { when value > 0 { return value } else { return 0 } } when true { let Selected = type struct { value: i32 } } else { this is deliberately invalid } let Integer = type when true { i32 } else { u32 } let value = when true { 1 } else { 2 } ` tokens, err := tokeniser.NewTokeniser(source, "test.qk").Tokenise() if err != nil { t.Fatal(err) } _, err = NewParser(tokens).Parse() if err == nil { t.Fatal("expected invalid unselected branch to be parsed and rejected") } } func TestValidWhenContextsParse(t *testing.T) { source := ` module test @link( when true { system "c", } else { @compiler_error("unsupported") } ) when true { let selected: i32 = 1 } else { let selected: i32 = 2 } let Integer = type when true { i32 } else { u32 } let value = when true { 1 } else { 2 } let choose(): i32 { when true { return value } else { return 0 } } ` tokens, err := tokeniser.NewTokeniser(source, "test.qk").Tokenise() if err != nil { t.Fatal(err) } root, err := NewParser(tokens).Parse() if err != nil { t.Fatal(err) } if len(root.Body) != 5 { t.Fatalf("got %d top-level nodes", len(root.Body)) } }