From 00b4c2331b78a9ee041aca6f9b9b220f9fb443ae Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 13 Aug 2021 15:27:34 -0700 Subject: [PATCH] words: add accessors and tests for a few of our favorite words Updates #1235 Signed-off-by: Brad Fitzpatrick --- words/tails.txt | 12 ---------- words/words.go | 57 +++++++++++++++++++++++++++++++++++++++++++++ words/words_test.go | 39 +++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 words/words.go create mode 100644 words/words_test.go diff --git a/words/tails.txt b/words/tails.txt index 32cdda414..536e673eb 100644 --- a/words/tails.txt +++ b/words/tails.txt @@ -18,7 +18,6 @@ lion tapir anteater monkey -lemur snake scorpion jerboa @@ -35,7 +34,6 @@ moose alligator salamander tadpole -giraffe astrapia pug greyhound @@ -75,7 +73,6 @@ warbler penguin snowfinch broadbill -finch thrush bishop swallow @@ -91,7 +88,6 @@ vulture rat takaya skunk -turtle tuxedo turkey elephant @@ -109,7 +105,6 @@ bandicoot beagle beago collie -beaver tiger liger rhino @@ -117,14 +112,11 @@ bobcat corgi dachshund giraffe -elephant -rhino bonobo cetacean bear hyena burmese -lynx caracal goat chameleon @@ -157,7 +149,6 @@ pig prairiedog puma hippo -marmoset quokka quoll bunny @@ -176,7 +167,6 @@ vaquita wallaby walrus weasel -corgi wolf zebra zonkey @@ -186,7 +176,6 @@ zebu cuttlefish unicorn meerkat -lynx jackalope heron fawn @@ -199,7 +188,6 @@ werewolf tahr fossa xerus -raccoon centaur raptor long diff --git a/words/words.go b/words/words.go new file mode 100644 index 000000000..6668249f7 --- /dev/null +++ b/words/words.go @@ -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 +} diff --git a/words/words_test.go b/words/words_test.go new file mode 100644 index 000000000..e2e77e59b --- /dev/null +++ b/words/words_test.go @@ -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 +}