85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
|
package pwgen
|
||
|
|
||
|
import (
|
||
|
"math/rand"
|
||
|
"reflect"
|
||
|
"testing"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
func Test_alphabet(t *testing.T) {
|
||
|
type args struct {
|
||
|
start rune
|
||
|
end rune
|
||
|
}
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
args args
|
||
|
wantResult []rune
|
||
|
}{
|
||
|
{
|
||
|
name: "Lowercase runes",
|
||
|
args: args{
|
||
|
start: 'a',
|
||
|
end: 'z',
|
||
|
},
|
||
|
//lowercase runes a to z
|
||
|
wantResult: []rune{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'},
|
||
|
},
|
||
|
{
|
||
|
name: "Uppercase runes",
|
||
|
args: args{
|
||
|
start: 'A',
|
||
|
end: 'Z',
|
||
|
},
|
||
|
wantResult: []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),
|
||
|
},
|
||
|
{
|
||
|
name: "Digit runes",
|
||
|
args: args{
|
||
|
start: '0',
|
||
|
end: '9',
|
||
|
},
|
||
|
wantResult: []rune("0123456789"),
|
||
|
},
|
||
|
}
|
||
|
for _, tt := range tests {
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
if gotResult := alphabet(tt.args.start, tt.args.end); !reflect.DeepEqual(gotResult, tt.wantResult) {
|
||
|
t.Errorf("alphabet() = %v, want %v", gotResult, tt.wantResult)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Fuzz_shuffle(f *testing.F) {
|
||
|
defaultPrng := rand.New(rand.NewSource(1))
|
||
|
|
||
|
f.Add("hello, world")
|
||
|
f.Add("a")
|
||
|
f.Add("aa")
|
||
|
f.Add("abcdef")
|
||
|
f.Add("01234")
|
||
|
|
||
|
f.Fuzz(func(t *testing.T, input string) {
|
||
|
in := []rune(input)
|
||
|
out := shuffle(in, defaultPrng)
|
||
|
|
||
|
if sliceReferenceEqual(in, out) {
|
||
|
t.Logf("returned the same input")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if len(input) > 1 && string(out) == input {
|
||
|
t.Errorf("shuffle() = %s, input %s", string(out), input)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func sliceReferenceEqual[T any](a, b []T) bool {
|
||
|
ah := (*reflect.SliceHeader)(unsafe.Pointer(&a))
|
||
|
bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
|
||
|
|
||
|
return ah.Data == bh.Data
|
||
|
}
|