OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / golang.org / x / text / internal / triegen / example_test.go
diff --git a/vendor/golang.org/x/text/internal/triegen/example_test.go b/vendor/golang.org/x/text/internal/triegen/example_test.go
new file mode 100644 (file)
index 0000000..557a152
--- /dev/null
@@ -0,0 +1,148 @@
+// Copyright 2014 The Go 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 triegen_test
+
+import (
+       "fmt"
+       "io/ioutil"
+       "math/rand"
+       "unicode"
+
+       "golang.org/x/text/internal/triegen"
+)
+
+const seed = 0x12345
+
+var genWriter = ioutil.Discard
+
+func randomRunes() map[rune]uint8 {
+       rnd := rand.New(rand.NewSource(seed))
+       m := map[rune]uint8{}
+       for len(m) < 100 {
+               // Only set our random rune if it is a valid Unicode code point.
+               if r := rune(rnd.Int31n(unicode.MaxRune + 1)); []rune(string(r))[0] == r {
+                       m[r] = 1
+               }
+       }
+       return m
+}
+
+// Example_build shows how to build a simple trie. It assigns the value 1 to
+// 100 random runes generated by randomRunes.
+func Example_build() {
+       t := triegen.NewTrie("rand")
+
+       for r, _ := range randomRunes() {
+               t.Insert(r, 1)
+       }
+       sz, err := t.Gen(genWriter)
+
+       fmt.Printf("Trie size: %d bytes\n", sz)
+       fmt.Printf("Error:     %v\n", err)
+
+       // Output:
+       // Trie size: 9280 bytes
+       // Error:     <nil>
+}
+
+// Example_lookup demonstrates how to use the trie generated by Example_build.
+func Example_lookup() {
+       trie := newRandTrie(0)
+
+       // The same set of runes used by Example_build.
+       runes := randomRunes()
+
+       // Verify the right value is returned for all runes.
+       for r := rune(0); r <= unicode.MaxRune; r++ {
+               // Note that the return type of lookup is uint8.
+               if v, _ := trie.lookupString(string(r)); v != runes[r] {
+                       fmt.Println("FAILURE")
+                       return
+               }
+       }
+       fmt.Println("SUCCESS")
+
+       // Output:
+       // SUCCESS
+}
+
+// runeValues generates some random values for a set of interesting runes.
+func runeValues() map[rune]uint64 {
+       rnd := rand.New(rand.NewSource(seed))
+       m := map[rune]uint64{}
+       for p := 4; p <= unicode.MaxRune; p <<= 1 {
+               for d := -1; d <= 1; d++ {
+                       m[rune(p+d)] = uint64(rnd.Int63())
+               }
+       }
+       return m
+}
+
+// ExampleGen_build demonstrates the creation of multiple tries sharing common
+// blocks. ExampleGen_lookup demonstrates how to use the generated tries.
+func ExampleGen_build() {
+       var tries []*triegen.Trie
+
+       rv := runeValues()
+       for _, c := range []struct {
+               include func(rune) bool
+               name    string
+       }{
+               {func(r rune) bool { return true }, "all"},
+               {func(r rune) bool { return r < 0x80 }, "ASCII only"},
+               {func(r rune) bool { return r < 0x80 }, "ASCII only 2"},
+               {func(r rune) bool { return r <= 0xFFFF }, "BMP only"},
+               {func(r rune) bool { return r > 0xFFFF }, "No BMP"},
+       } {
+               t := triegen.NewTrie(c.name)
+               tries = append(tries, t)
+
+               for r, v := range rv {
+                       if c.include(r) {
+                               t.Insert(r, v)
+                       }
+               }
+       }
+       sz, err := triegen.Gen(genWriter, "multi", tries)
+
+       fmt.Printf("Trie size: %d bytes\n", sz)
+       fmt.Printf("Error:     %v\n", err)
+
+       // Output:
+       // Trie size: 18250 bytes
+       // Error:     <nil>
+}
+
+// ExampleGen_lookup shows how to look up values in the trie generated by
+// ExampleGen_build.
+func ExampleGen_lookup() {
+       rv := runeValues()
+       for i, include := range []func(rune) bool{
+               func(r rune) bool { return true },        // all
+               func(r rune) bool { return r < 0x80 },    // ASCII only
+               func(r rune) bool { return r < 0x80 },    // ASCII only 2
+               func(r rune) bool { return r <= 0xFFFF }, // BMP only
+               func(r rune) bool { return r > 0xFFFF },  // No BMP
+       } {
+               t := newMultiTrie(i)
+
+               for r := rune(0); r <= unicode.MaxRune; r++ {
+                       x := uint64(0)
+                       if include(r) {
+                               x = rv[r]
+                       }
+                       // As we convert from a valid rune, we know it is safe to use
+                       // lookupStringUnsafe.
+                       if v := t.lookupStringUnsafe(string(r)); x != v {
+                               fmt.Println("FAILURE")
+                               return
+                       }
+               }
+       }
+       fmt.Println("SUCCESS")
+
+       // Output:
+       // SUCCESS
+}