Skip to content

Commit 83c3198

Browse files
committed
minor boundaries to logic and better tests
1 parent 4df9462 commit 83c3198

File tree

2 files changed

+36
-28
lines changed

2 files changed

+36
-28
lines changed

password/generator.go

+17-9
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,24 @@ func (g *generator) Generate() string {
6868
defer g.pool.Put(password)
6969

7070
idx := 0
71-
fillPassword := func(count int, runes []rune) {
72-
for ; count > 0 && idx < len(password); count-- {
71+
fillPassword := func(runes []rune, count int) {
72+
for ; idx < len(password) && count > 0; count-- {
7373
password[idx] = runes[g.rng.IntN(len(runes))]
7474
idx++
7575
}
7676
}
77-
fillPassword(g.minLowerCase, g.charsetCaseLower)
78-
fillPassword(g.minUpperCase, g.charsetCaseUpper)
79-
fillPassword(g.numSymbolsToGenerate(), g.charsetSymbols)
80-
fillPassword(len(password)-idx, g.charsetNonSymbols)
77+
if g.minLowerCase > 0 {
78+
fillPassword(g.charsetCaseLower, g.minLowerCase)
79+
}
80+
if g.minUpperCase > 0 {
81+
fillPassword(g.charsetCaseUpper, g.minUpperCase)
82+
}
83+
if numSymbols := g.numSymbolsToGenerate(); numSymbols > 0 {
84+
fillPassword(g.charsetSymbols, numSymbols)
85+
}
86+
if remainingChars := len(password) - idx; remainingChars > 0 {
87+
fillPassword(g.charsetNonSymbols, remainingChars)
88+
}
8189

8290
// shuffle it all
8391
g.rng.Shuffle(len(password), func(i, j int) {
@@ -119,15 +127,15 @@ func (g *generator) sanitize() (Generator, error) {
119127
if g.minUpperCase > g.numChars {
120128
return nil, ErrMinUpperCaseTooLong
121129
}
130+
if g.minSymbols > 0 && len(g.charsetSymbols) == 0 {
131+
return nil, ErrNoSymbolsInCharset
132+
}
122133
if g.minSymbols > g.numChars {
123134
return nil, ErrMinSymbolsTooLong
124135
}
125136
if g.minLowerCase+g.minUpperCase+g.minSymbols > g.numChars {
126137
return nil, ErrRequirementsNotMet
127138
}
128-
if g.minSymbols > 0 && len(g.charsetSymbols) == 0 {
129-
return nil, ErrNoSymbolsInCharset
130-
}
131139
return g, nil
132140
}
133141

password/generator_test.go

+19-19
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package password
22

33
import (
44
"fmt"
5-
"strings"
5+
"slices"
66
"testing"
77
"unicode"
88

@@ -42,19 +42,19 @@ func TestGenerator_Generate(t *testing.T) {
4242
"uCFmDFDAoLZY",
4343
"pMgNoVa9z5Vv",
4444
}
45-
sb := strings.Builder{}
45+
var actualPasswords []string
4646
for idx := 0; idx < 100; idx++ {
4747
password := g.Generate()
4848
assert.NotEmpty(t, password)
4949
if idx < len(expectedPasswords) {
50+
actualPasswords = append(actualPasswords, password)
5051
assert.Equal(t, expectedPasswords[idx], password)
51-
if expectedPasswords[idx] != password {
52-
sb.WriteString(fmt.Sprintf("%#v,\n", password))
53-
}
5452
}
5553
}
56-
if sb.Len() > 0 {
57-
fmt.Println(sb.String())
54+
if !slices.Equal(expectedPasswords, actualPasswords) {
55+
for _, pw := range actualPasswords {
56+
fmt.Printf("%#v,\n", pw)
57+
}
5858
}
5959
}
6060

@@ -81,15 +81,13 @@ func TestGenerator_Generate_WithAMixOfEverything(t *testing.T) {
8181
"bVrPjBRC<bqy",
8282
"f?orrWDzVYjx",
8383
}
84-
sb := strings.Builder{}
84+
var actualPasswords []string
8585
for idx := 0; idx < 100; idx++ {
8686
password := g.Generate()
8787
assert.NotEmpty(t, password)
8888
if idx < len(expectedPasswords) {
89+
actualPasswords = append(actualPasswords, password)
8990
assert.Equal(t, expectedPasswords[idx], password)
90-
if expectedPasswords[idx] != password {
91-
sb.WriteString(fmt.Sprintf("%#v,\n", password))
92-
}
9391
}
9492

9593
numLowerCase := len(filterRunes([]rune(password), unicode.IsLower))
@@ -99,8 +97,10 @@ func TestGenerator_Generate_WithAMixOfEverything(t *testing.T) {
9997
numSymbols := len(filterRunes([]rune(password), Symbols.Contains))
10098
assert.True(t, numSymbols == 1, password)
10199
}
102-
if sb.Len() > 0 {
103-
fmt.Println(sb.String())
100+
if !slices.Equal(expectedPasswords, actualPasswords) {
101+
for _, pw := range actualPasswords {
102+
fmt.Printf("%#v,\n", pw)
103+
}
104104
}
105105
}
106106

@@ -126,22 +126,22 @@ func TestGenerator_Generate_WithSymbols(t *testing.T) {
126126
"-e3a6cda4#!1",
127127
"162e6bb#ee53",
128128
}
129-
sb := strings.Builder{}
129+
var actualPasswords []string
130130
for idx := 0; idx < 100; idx++ {
131131
password := g.Generate()
132132
assert.NotEmpty(t, password)
133133
if idx < len(expectedPasswords) {
134+
actualPasswords = append(actualPasswords, password)
134135
assert.Equal(t, expectedPasswords[idx], password)
135-
if expectedPasswords[idx] != password {
136-
sb.WriteString(fmt.Sprintf("%#v,\n", password))
137-
}
138136
}
139137

140138
numSymbols := getNumSymbols(password)
141139
assert.True(t, numSymbols >= 0 && numSymbols <= 3, password)
142140
}
143-
if sb.Len() > 0 {
144-
fmt.Println(sb.String())
141+
if !slices.Equal(expectedPasswords, actualPasswords) {
142+
for _, pw := range actualPasswords {
143+
fmt.Printf("%#v,\n", pw)
144+
}
145145
}
146146
})
147147

0 commit comments

Comments
 (0)