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))
}
}