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
5package colltab
6
7import (
8	"testing"
9)
10
11// We take the smallest, largest and an arbitrary value for each
12// of the UTF-8 sequence lengths.
13var 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.
22type trietest struct {
23	size  int
24	bytes []byte
25}
26
27var 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
51func 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
74var 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
91var 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
106var testTrie = Trie{testLookup[6*blockSize:], testValues[:], testLookup[:], testValues[:]}
107