package read import ( "fmt" "mal-go/hash_map" "mal-go/list" "mal-go/symbol" "mal-go/vector" "testing" "github.com/stretchr/testify/assert" "pgregory.net/rapid" ) func TestReadInt(t *testing.T) { input := "2" sym, err, end_pos := readInt(input, 0, "user") assert.Equal(t, 2, sym, "should read ") assert.Equal(t, nil, err, "should read without error") assert.Equal(t, len(input), end_pos, "should read the whole string") } func TestReadSymbol(t *testing.T) { input := "foo" sym, err, end_pos := readSymbol(input, 0, "user") assert.Equal(t, sym, symbol.Intern("user", "foo"), "should read user/foo symbol") assert.Equal(t, err, nil, "should read without error") assert.Equal(t, end_pos, len(input), "should read the whole string") } func TestReadSymbolWithNamespace(t *testing.T) { input := "foo/bar" sym, err, end_pos := readSymbol(input, 0, "user") assert.Equal(t, sym, symbol.Intern("foo", "bar"), "should read user/foo symbol") assert.Equal(t, err, nil, "should read without error") assert.Equal(t, end_pos, len(input), "should read the whole string") } func TestReadListElem(t *testing.T) { input := "(1223)" f, err, pos := readForm(input, 1, "user") assert.Equal(t, f, 1223, "should num list") assert.Equal(t, err, nil, "should read without error") assert.Equal(t, pos, len(input)-1, "should read the whole number") assert.Equal(t, rune(input[pos]), ')', "should end pointing to ending list char") } func TestReadList(t *testing.T) { input := "(1 2 3)" l, err, pos := readList(input, 0, "user") assert.Equal(t, list.Empty().Conj(3).Conj(2).Conj(1), l, "should read list") assert.Equal(t, nil, err, "should read without error") assert.Equal(t, len(input), pos, "should read the whole string") } func StringifiedFormGen() *rapid.Generator[string] { return rapid.OneOf(rapid.Custom(func(t *rapid.T) string { myList := list.Empty() i := 0 t.Repeat(map[string]func(*rapid.T){ "conj": func(t *rapid.T) { if i < 100 { myList = myList.Conj(rapid.Int().Draw(t, "el")) } }, }) return myList.String() }), rapid.Just(list.Empty().String()), rapid.Just(hash_map.New().String()), rapid.Just(vector.New().String()), rapid.Custom(func(t *rapid.T) string { return fmt.Sprint(rapid.Int().Draw(t, "i")) }), ) } func TestRead(t *testing.T) { rapid.Check(t, func(t *rapid.T) { input := StringifiedFormGen().Draw(t, "input") _, err := ReadString(input) assert.Nil(t, err, err) }) }