words: add accessors and tests for a few of our favorite words

Updates #1235

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
pull/2655/head
Brad Fitzpatrick 3 years ago
parent 9547669787
commit 00b4c2331b

@ -18,7 +18,6 @@ lion
tapir tapir
anteater anteater
monkey monkey
lemur
snake snake
scorpion scorpion
jerboa jerboa
@ -35,7 +34,6 @@ moose
alligator alligator
salamander salamander
tadpole tadpole
giraffe
astrapia astrapia
pug pug
greyhound greyhound
@ -75,7 +73,6 @@ warbler
penguin penguin
snowfinch snowfinch
broadbill broadbill
finch
thrush thrush
bishop bishop
swallow swallow
@ -91,7 +88,6 @@ vulture
rat rat
takaya takaya
skunk skunk
turtle
tuxedo tuxedo
turkey turkey
elephant elephant
@ -109,7 +105,6 @@ bandicoot
beagle beagle
beago beago
collie collie
beaver
tiger tiger
liger liger
rhino rhino
@ -117,14 +112,11 @@ bobcat
corgi corgi
dachshund dachshund
giraffe giraffe
elephant
rhino
bonobo bonobo
cetacean cetacean
bear bear
hyena hyena
burmese burmese
lynx
caracal caracal
goat goat
chameleon chameleon
@ -157,7 +149,6 @@ pig
prairiedog prairiedog
puma puma
hippo hippo
marmoset
quokka quokka
quoll quoll
bunny bunny
@ -176,7 +167,6 @@ vaquita
wallaby wallaby
walrus walrus
weasel weasel
corgi
wolf wolf
zebra zebra
zonkey zonkey
@ -186,7 +176,6 @@ zebu
cuttlefish cuttlefish
unicorn unicorn
meerkat meerkat
lynx
jackalope jackalope
heron heron
fawn fawn
@ -199,7 +188,6 @@ werewolf
tahr tahr
fossa fossa
xerus xerus
raccoon
centaur centaur
raptor raptor
long long

@ -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…
Cancel
Save