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 }