package list import ( "github.com/stretchr/testify/assert" "pgregory.net/rapid" "testing" ) /* func TestListLen(t *testing.T) { assert.Equal(t, 0, Empty().Len(), "should insert at head") assert.Equal(t, 1, Empty().Conj(1).Len(), "should insert at head") assert.Equal(t, 2, Empty().Conj(1).Conj(2).Len(), "should insert at head") } func TestListString(t *testing.T) { assert.Equal(t, "()", Empty().String(), "should insert at head") } func TestListConj(t *testing.T) { var l IList assert.Equal(t, "()", Empty().String(), "should insert at head") l = New(5) assert.Equal(t, "(5)", l.String(), "should insert at head") l = Empty().Conj(4) assert.Equal(t, "(4)", l.String(), "should insert at head") } func TestListFirst(t *testing.T) { l := Empty().Conj(5).Conj(6).Conj(7) assert.Equal(t, 7, l.First(), "should return first element") assert.Equal(t, nil, Empty().First(), "should return nil") } func TestListRest(t *testing.T) { l := Empty().Conj(5).Conj(6).Conj(7) assert.Equal(t, "(6 5)", l.Rest().String(), "should return rest sublist") assert.Equal(t, "(5)", l.Rest().Rest().String(), "should return rest sublist") assert.Equal(t, "()", l.Rest().Rest().Rest().String(), "should return rest sublist") assert.Equal(t, Empty(), Empty().Rest(), "should return rest sublist") assert.Equal(t, Empty(), Empty().Rest().Rest(), "should return rest sublist") } */ func intListGen() *rapid.Generator[IList] { return 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 }) } // 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) }) }