mal-go/list/list_test.go
ajet 6155074b77
All checks were successful
Go / test (push) Successful in 3s
never go full pbt ;)
2025-11-04 17:36:18 -10:00

62 lines
1.5 KiB
Go

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, " "))
}
})
}