package list import ( "regexp" "strings" "testing" "github.com/stretchr/testify/assert" "pgregory.net/rapid" ) func intListGen() *rapid.Generator[IList] { return rapid.OneOf(rapid.Custom(func(t *rapid.T) IList { myList := Empty() t.Repeat(map[string]func(*rapid.T){ "conj": func(t *rapid.T) { myList = myList.Conj(rapid.Int().Draw(t, "el")) }, }) return myList }), rapid.Just(Empty())) } // generative tests func TestConjIncreasesLength(t *testing.T) { rapid.Check(t, func(t *rapid.T) { myList := intListGen().Draw(t, "myList") assert.Equal(t, myList.Len()+1, myList.Conj(42).Len()) }) } func TestRestDecreasesLengthForNonEmptyList(t *testing.T) { rapid.Check(t, func(t *rapid.T) { myList := intListGen().Filter(func(l IList) bool { return !l.IsEmpty() }).Draw(t, "myList") assert.Equal(t, myList.Len()-1, myList.Rest().Len()) }) } func TestFirstIsNilWhenEmpty(t *testing.T) { rapid.Check(t, func(t *rapid.T) { myList := intListGen().Draw(t, "myList") assert.Equal(t, myList.IsEmpty(), myList.First() == nil) }) } func TestStringifyIntList(t *testing.T) { assert.Equal(t, "(1 2 3)", New(3).Conj(2).Conj(1).String()) rapid.Check(t, func(t *rapid.T) { myList := intListGen().Draw(t, "myList") s := myList.String() r := regexp.MustCompile(`\(.*\)`) assert.Equal(t, true, r.Match([]byte(s))) if !myList.IsEmpty() { assert.Equal(t, myList.Len(), strings.Count(s, " ")+1) } else { assert.Equal(t, 0, strings.Count(s, " ")) } }) }