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
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…
Reference in New Issue