Add structured coroutines and explicit error handling
This commit is contained in:
parent
de1262b4cf
commit
fe62e81152
31 changed files with 1701 additions and 325 deletions
67
internal/lang/nullability_test.go
Normal file
67
internal/lang/nullability_test.go
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
package lang
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSafeAccessAndNonNullAssertion(t *testing.T) {
|
||||
prog, err := Parse(`package demo
|
||||
data class User(var email: String)
|
||||
fun safe(user: *User?): String? { return user?.email }
|
||||
fun required(user: *User?): String { return user!!.email }`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
out, err := GenerateGo(prog)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, want := range []string{"if value == nil {", "return &result", "non-null assertion failed"} {
|
||||
if !strings.Contains(string(out), want) {
|
||||
t.Fatalf("missing %q:\n%s", want, out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRejectNullableDereference(t *testing.T) {
|
||||
prog, err := Parse(`package demo
|
||||
fun unsafe(user: *User?): String { return user.email }`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_, err = GenerateGo(prog)
|
||||
if err == nil || !strings.Contains(err.Error(), "requires ?. or !!") {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRejectNullForNonNullableTypes(t *testing.T) {
|
||||
for _, source := range []string{
|
||||
`package demo data class User(var email: String) fun main() { val user: *User = null }`,
|
||||
`package demo data class User(var email: String) fun use(user: *User) {} fun main() { use(null) }`,
|
||||
`package demo fun name(): String { return null }`,
|
||||
`package demo fun main() { val value = null }`,
|
||||
} {
|
||||
prog, err := Parse(source)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err = GenerateGo(prog); err == nil {
|
||||
t.Fatalf("expected nullability error for %s", source)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestNullableSmartCasts(t *testing.T) {
|
||||
prog, err := Parse(`package demo
|
||||
data class User(var email: String)
|
||||
fun guarded(user: *User?): String { if (user == null) { return "missing" }; return user.email }
|
||||
fun branched(user: *User?): String { if (user != null) { return user.email } else { return "missing" } }`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err = GenerateGo(prog); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue