forked from rosa/hakurei
internal/rosa/azalea: implement nil identifier
This also implements a nil-capable string type. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -100,15 +100,79 @@ func TestEvaluate(t *testing.T) {
|
||||
Err: UndefinedError("f"),
|
||||
}},
|
||||
|
||||
{"error wrap deep", `f { v = nil; }`, makeStackCheck(func(
|
||||
{"error wrap deep", `f { v = nonexistent; }`, makeStackCheck(func(
|
||||
FArgs,
|
||||
) (any, error) {
|
||||
panic("unreachable")
|
||||
}), "", EvaluationError{
|
||||
Expr: Ident("nil"),
|
||||
Err: UndefinedError("nil"),
|
||||
Expr: Ident("nonexistent"),
|
||||
Err: UndefinedError("nonexistent"),
|
||||
}},
|
||||
|
||||
{"nil", `f { v = nil; }`, checkArgs(FArgs{
|
||||
{K: unique.Make(Ident("v")), V: Nil{}},
|
||||
}), "\xfd", nil},
|
||||
|
||||
{"apply nil string", `f { v = nil; }`, makeStackCheck(func(
|
||||
args FArgs,
|
||||
) (v any, err error) {
|
||||
var s string
|
||||
err = args.Apply(map[unique.Handle[Ident]]any{
|
||||
unique.Make(Ident("v")): &s,
|
||||
})
|
||||
v = s
|
||||
return
|
||||
}), "", EvaluationError{
|
||||
Expr: Func{
|
||||
Ident: Ident("f"),
|
||||
Args: []Arg{
|
||||
{K: []Ident{"v"}, V: Val{Ident("nil")}},
|
||||
},
|
||||
},
|
||||
Err: NilError{Type: reflect.TypeFor[string]()},
|
||||
}},
|
||||
|
||||
{"apply nil AString", `f { v = nil; }`, makeStackCheck(func(
|
||||
args FArgs,
|
||||
) (v any, err error) {
|
||||
s := AString{}
|
||||
err = args.Apply(map[unique.Handle[Ident]]any{
|
||||
unique.Make(Ident("v")): &s,
|
||||
})
|
||||
v = s.V
|
||||
if !s.Nil {
|
||||
err = fmt.Errorf("got non-nil string %q", s.V)
|
||||
}
|
||||
return
|
||||
}), "", nil},
|
||||
|
||||
{"apply AString", `f { v = "\xfd"; }`, makeStackCheck(func(
|
||||
args FArgs,
|
||||
) (v any, err error) {
|
||||
s := AString{}
|
||||
err = args.Apply(map[unique.Handle[Ident]]any{
|
||||
unique.Make(Ident("v")): &s,
|
||||
})
|
||||
v = s.V
|
||||
if s.Nil {
|
||||
err = fmt.Errorf("unexpected nil %q", s.V)
|
||||
}
|
||||
return
|
||||
}), "\xfd", nil},
|
||||
|
||||
{"apply nil", `f { v = nil; }`, makeStackCheck(func(
|
||||
args FArgs,
|
||||
) (v any, err error) {
|
||||
s := make([]struct{}, 9)
|
||||
err = args.Apply(map[unique.Handle[Ident]]any{
|
||||
unique.Make(Ident("v")): &s,
|
||||
})
|
||||
if s != nil {
|
||||
err = fmt.Errorf("got non-nil value %#v", s)
|
||||
}
|
||||
return
|
||||
}), "", nil},
|
||||
|
||||
{"common inputs", `package name { inputs, v = []; }`, nil, "", EvaluationError{
|
||||
Expr: Func{
|
||||
Ident: Ident("name"),
|
||||
@@ -214,8 +278,8 @@ func TestEvaluate(t *testing.T) {
|
||||
}
|
||||
|
||||
var errEquals bool
|
||||
if _, ok := errors.AsType[TypeError](err); ok {
|
||||
errEquals = errors.Is(err, tc.err)
|
||||
if e, ok := errors.AsType[TypeError](err); ok {
|
||||
errEquals = e.Is(tc.err)
|
||||
} else {
|
||||
errEquals = reflect.DeepEqual(err, tc.err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user