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(), Rest(Empty().Rest()), "should return rest sublist") } // generative tests func ListLengthProperty(t *testing.T) { myList := Empty() expectedSized := 0 rapid.Check(t, func(t *rapid.T) { t.Repeat(map[string]func(*rapid.T){ "conj": func(t *rapid.T) { expectedSized += 1 myList = myList.Conj(rapid.Int().Draw(t, "el")) }, "rest": func(t *rapid.T) { if !myList.IsEmpty() { expectedSized -= 1 } myList = myList.Rest() }, "": func(t *rapid.T) { assert.Equal(t, myList.Len(), expectedSized, "must be equal") }, }) }) }