Updates #1235 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>main
parent
9547669787
commit
00b4c2331b
@ -0,0 +1,57 @@ |
||||
// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package words contains accessors for some nice words.
|
||||
package words |
||||
|
||||
import ( |
||||
"bytes" |
||||
_ "embed" |
||||
"strings" |
||||
"sync" |
||||
) |
||||
|
||||
//go:embed tails.txt
|
||||
var tailsTxt []byte |
||||
|
||||
//go:embed scales.txt
|
||||
var scalesTxt []byte |
||||
|
||||
var ( |
||||
once sync.Once |
||||
tails, scales []string |
||||
) |
||||
|
||||
// Tails returns words about tails.
|
||||
func Tails() []string { |
||||
once.Do(initWords) |
||||
return tails |
||||
} |
||||
|
||||
// Scales returns words about scales.
|
||||
func Scales() []string { |
||||
once.Do(initWords) |
||||
return scales |
||||
} |
||||
|
||||
func initWords() { |
||||
tails = parseWords(tailsTxt) |
||||
scales = parseWords(scalesTxt) |
||||
} |
||||
|
||||
func parseWords(txt []byte) []string { |
||||
n := bytes.Count(txt, []byte{'\n'}) |
||||
ret := make([]string, 0, n) |
||||
for len(txt) > 0 { |
||||
word := txt |
||||
i := bytes.IndexByte(txt, '\n') |
||||
if i != -1 { |
||||
word, txt = word[:i], txt[i+1:] |
||||
} |
||||
if word := strings.TrimSpace(string(word)); word != "" { |
||||
ret = append(ret, word) |
||||
} |
||||
} |
||||
return ret |
||||
} |
||||
@ -0,0 +1,39 @@ |
||||
// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package words |
||||
|
||||
import ( |
||||
"strings" |
||||
"testing" |
||||
) |
||||
|
||||
func TestWords(t *testing.T) { |
||||
test := func(t *testing.T, words []string) { |
||||
t.Helper() |
||||
if len(words) == 0 { |
||||
t.Error("no words") |
||||
} |
||||
seen := map[string]bool{} |
||||
for _, w := range words { |
||||
if seen[w] { |
||||
t.Errorf("dup word %q", w) |
||||
} |
||||
seen[w] = true |
||||
if w == "" || strings.IndexFunc(w, nonASCIILower) != -1 { |
||||
t.Errorf("malformed word %q", w) |
||||
} |
||||
} |
||||
} |
||||
t.Run("tails", func(t *testing.T) { test(t, Tails()) }) |
||||
t.Run("scales", func(t *testing.T) { test(t, Scales()) }) |
||||
t.Logf("%v tails * %v scales = %v beautiful combinations", len(Tails()), len(Scales()), len(Tails())*len(Scales())) |
||||
} |
||||
|
||||
func nonASCIILower(r rune) bool { |
||||
if 'a' <= r && r <= 'z' { |
||||
return false |
||||
} |
||||
return true |
||||
} |
||||
Loading…
Reference in new issue