elvish/pkg/eval/vals/iterate_keys_test.go
Kurtis Rader 71cd3835bc Don't dot import pkg/tt
Qualified imports of pkg/tt outnumber unqualified (27 to 24). Improve
consistency, and clarity, by changing the dot (unqualified) imports of
that package symbols to qualified.
2022-06-04 23:39:19 +01:00

63 lines
1.4 KiB
Go

package vals
import (
"testing"
"src.elv.sh/pkg/tt"
)
func vs(xs ...any) []any { return xs }
type keysIterator struct{ keys []any }
func (k keysIterator) IterateKeys(f func(any) bool) {
Feed(f, k.keys...)
}
type nonKeysIterator struct{}
func TestIterateKeys(t *testing.T) {
tt.Test(t, tt.Fn("collectKeys", collectKeys), tt.Table{
Args(MakeMap("k1", "v1", "k2", "v2")).Rets(vs("k1", "k2"), nil),
Args(keysIterator{vs("lorem", "ipsum")}).Rets(vs("lorem", "ipsum")),
Args(nonKeysIterator{}).Rets(
tt.Any, cannotIterateKeysOf{"!!vals.nonKeysIterator"}),
})
}
func TestIterateKeys_Map_Break(t *testing.T) {
var gotKey any
IterateKeys(MakeMap("k", "v", "k2", "v2"), func(k any) bool {
if gotKey != nil {
t.Errorf("callback called again after returning false")
}
gotKey = k
return false
})
if gotKey != "k" && gotKey != "k2" {
t.Errorf("got key %v, want k or k2", gotKey)
}
}
func TestIterateKeys_StructMap_Break(t *testing.T) {
var gotKey any
IterateKeys(testStructMap{}, func(k any) bool {
if gotKey != nil {
t.Errorf("callback called again after returning false")
}
gotKey = k
return false
})
if gotKey != "name" {
t.Errorf("got key %v, want name", gotKey)
}
}
func TestIterateKeys_Unsupported(t *testing.T) {
err := IterateKeys(1, func(any) bool { return true })
wantErr := cannotIterateKeysOf{"number"}
if err != wantErr {
t.Errorf("got error %v, want %v", err, wantErr)
}
}