OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / text / internal / colltab / trie_test.go
1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package colltab
6
7 import (
8         "testing"
9 )
10
11 // We take the smallest, largest and an arbitrary value for each
12 // of the UTF-8 sequence lengths.
13 var testRunes = []rune{
14         0x01, 0x0C, 0x7F, // 1-byte sequences
15         0x80, 0x100, 0x7FF, // 2-byte sequences
16         0x800, 0x999, 0xFFFF, // 3-byte sequences
17         0x10000, 0x10101, 0x10FFFF, // 4-byte sequences
18         0x200, 0x201, 0x202, 0x210, 0x215, // five entries in one sparse block
19 }
20
21 // Test cases for illegal runes.
22 type trietest struct {
23         size  int
24         bytes []byte
25 }
26
27 var tests = []trietest{
28         // illegal runes
29         {1, []byte{0x80}},
30         {1, []byte{0xFF}},
31         {1, []byte{t2, tx - 1}},
32         {1, []byte{t2, t2}},
33         {2, []byte{t3, tx, tx - 1}},
34         {2, []byte{t3, tx, t2}},
35         {1, []byte{t3, tx - 1, tx}},
36         {3, []byte{t4, tx, tx, tx - 1}},
37         {3, []byte{t4, tx, tx, t2}},
38         {1, []byte{t4, t2, tx, tx - 1}},
39         {2, []byte{t4, tx, t2, tx - 1}},
40
41         // short runes
42         {0, []byte{t2}},
43         {0, []byte{t3, tx}},
44         {0, []byte{t4, tx, tx}},
45
46         // we only support UTF-8 up to utf8.UTFMax bytes (4 bytes)
47         {1, []byte{t5, tx, tx, tx, tx}},
48         {1, []byte{t6, tx, tx, tx, tx, tx}},
49 }
50
51 func TestLookupTrie(t *testing.T) {
52         for i, r := range testRunes {
53                 b := []byte(string(r))
54                 v, sz := testTrie.lookup(b)
55                 if int(v) != i {
56                         t.Errorf("lookup(%U): found value %#x, expected %#x", r, v, i)
57                 }
58                 if sz != len(b) {
59                         t.Errorf("lookup(%U): found size %d, expected %d", r, sz, len(b))
60                 }
61         }
62         for i, tt := range tests {
63                 v, sz := testTrie.lookup(tt.bytes)
64                 if int(v) != 0 {
65                         t.Errorf("lookup of illegal rune, case %d: found value %#x, expected 0", i, v)
66                 }
67                 if sz != tt.size {
68                         t.Errorf("lookup of illegal rune, case %d: found size %d, expected %d", i, sz, tt.size)
69                 }
70         }
71 }
72
73 // test data is taken from exp/collate/locale/build/trie_test.go
74 var testValues = [832]uint32{
75         0x000c: 0x00000001,
76         0x007f: 0x00000002,
77         0x00c0: 0x00000003,
78         0x0100: 0x00000004,
79         0x0140: 0x0000000c, 0x0141: 0x0000000d, 0x0142: 0x0000000e,
80         0x0150: 0x0000000f,
81         0x0155: 0x00000010,
82         0x01bf: 0x00000005,
83         0x01c0: 0x00000006,
84         0x0219: 0x00000007,
85         0x027f: 0x00000008,
86         0x0280: 0x00000009,
87         0x02c1: 0x0000000a,
88         0x033f: 0x0000000b,
89 }
90
91 var testLookup = [640]uint16{
92         0x0e0: 0x05, 0x0e6: 0x06,
93         0x13f: 0x07,
94         0x140: 0x08, 0x144: 0x09,
95         0x190: 0x03,
96         0x1ff: 0x0a,
97         0x20f: 0x05,
98         0x242: 0x01, 0x244: 0x02,
99         0x248: 0x03,
100         0x25f: 0x04,
101         0x260: 0x01,
102         0x26f: 0x02,
103         0x270: 0x04, 0x274: 0x06,
104 }
105
106 var testTrie = Trie{testLookup[6*blockSize:], testValues[:], testLookup[:], testValues[:]}