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.
11 "golang.org/x/text/internal/colltab"
14 type entryTest struct {
15 f func(in []int) (uint32, error)
20 // makeList returns a list of entries of length n+2, with n normal
21 // entries plus a leading and trailing anchor.
22 func makeList(n int) []*entry {
23 es := make([]*entry, n+2)
24 weights := []rawCE{{w: []int{100, 20, 5, 0}}}
26 runes := []rune{rune(i)}
31 weights = nextWeight(colltab.Primary, weights)
33 for i := 1; i < len(es); i++ {
36 _, es[i-1].level = compareWeights(es[i-1].elems, es[i].elems)
39 es[0].logical = firstAnchor
40 es[len(es)-1].exclude = true
41 es[len(es)-1].logical = lastAnchor
45 func TestNextIndexed(t *testing.T) {
48 for i := int64(0); i < 1<<n; i++ {
49 mask := strconv.FormatInt(i+(1<<n), 2)
50 for i, c := range mask {
51 es[i].exclude = c == '1'
54 for i, c := range mask {
56 e, _ = e.nextIndexed()
58 t.Errorf("%d: expected entry %d; found %d", i, es[i].elems, e.elems)
62 if e, _ = e.nextIndexed(); e != nil {
63 t.Errorf("%d: expected nil entry; found %d", i, e.elems)
68 func TestRemove(t *testing.T) {
70 for i := int64(0); i < 1<<n; i++ {
72 mask := strconv.FormatInt(i+(1<<n), 2)
73 for i, c := range mask {
79 for i, c := range mask {
82 t.Errorf("%d: expected entry %d; found %d", i, es[i].elems, e.elems)
84 e, _ = e.nextIndexed()
88 t.Errorf("%d: expected nil entry; found %d", i, e.elems)
93 // nextPerm generates the next permutation of the array. The starting
94 // permutation is assumed to be a list of integers sorted in increasing order.
95 // It returns false if there are no more permuations left.
96 func nextPerm(a []int) bool {
106 for j := len(a) - 1; j >= i; j-- {
108 a[i], a[j] = a[j], a[i]
112 for j := i + 1; j < (len(a)+i+1)/2; j++ {
113 a[j], a[len(a)+i-j] = a[len(a)+i-j], a[j]
118 func TestInsertAfter(t *testing.T) {
121 perm := make([]int, n)
122 for i := range perm {
125 for ok := true; ok; ok = nextPerm(perm) {
128 for _, i := range perm {
129 last.insertAfter(es[i])
132 for _, e := range es {
133 e.elems = es[0].elems
136 for _, i := range perm {
137 e, _ = e.nextIndexed()
138 if e.runes[0] != orig[i].runes[0] {
139 t.Errorf("%d:%d: expected entry %X; found %X", perm, i, orig[i].runes, e.runes)
146 func TestInsertBefore(t *testing.T) {
149 perm := make([]int, n)
150 for i := range perm {
153 for ok := true; ok; ok = nextPerm(perm) {
155 last := es[len(es)-1]
156 for _, i := range perm {
157 last.insertBefore(es[i])
160 for _, e := range es {
161 e.elems = es[0].elems
164 for i := n - 1; i >= 0; i-- {
165 e, _ = e.nextIndexed()
166 if e.runes[0] != rune(perm[i]) {
167 t.Errorf("%d:%d: expected entry %X; found %X", perm, i, orig[i].runes, e.runes)
174 type entryLessTest struct {
180 w1 = []rawCE{{w: []int{100, 20, 5, 5}}}
181 w2 = []rawCE{{w: []int{101, 20, 5, 5}}}
184 var entryLessTests = []entryLessTest{
185 {&entry{str: "a", elems: w1},
186 &entry{str: "a", elems: w1},
189 {&entry{str: "a", elems: w1},
190 &entry{str: "a", elems: w2},
193 {&entry{str: "a", elems: w1},
194 &entry{str: "b", elems: w1},
197 {&entry{str: "a", elems: w2},
198 &entry{str: "a", elems: w1},
201 {&entry{str: "c", elems: w1},
202 &entry{str: "b", elems: w1},
205 {&entry{str: "a", elems: w1, logical: firstAnchor},
206 &entry{str: "a", elems: w1},
209 {&entry{str: "a", elems: w1},
210 &entry{str: "b", elems: w1, logical: firstAnchor},
213 {&entry{str: "b", elems: w1},
214 &entry{str: "a", elems: w1, logical: lastAnchor},
217 {&entry{str: "a", elems: w1, logical: lastAnchor},
218 &entry{str: "c", elems: w1},
223 func TestEntryLess(t *testing.T) {
224 for i, tt := range entryLessTests {
225 if res := entryLess(tt.a, tt.b); res != tt.res {
226 t.Errorf("%d: was %v; want %v", i, res, tt.res)