| // Copyright 2015 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 colltab |
| |
| import ( |
| "testing" |
| ) |
| |
| func TestDoNorm(t *testing.T) { |
| const div = -1 // The insertion point of the next block. |
| tests := []struct { |
| in, out []int |
| }{{ |
| in: []int{4, div, 3}, |
| out: []int{3, 4}, |
| }, { |
| in: []int{4, div, 3, 3, 3}, |
| out: []int{3, 3, 3, 4}, |
| }, { |
| in: []int{0, 4, div, 3}, |
| out: []int{0, 3, 4}, |
| }, { |
| in: []int{0, 0, 4, 5, div, 3, 3}, |
| out: []int{0, 0, 3, 3, 4, 5}, |
| }, { |
| in: []int{0, 0, 1, 4, 5, div, 3, 3}, |
| out: []int{0, 0, 1, 3, 3, 4, 5}, |
| }, { |
| in: []int{0, 0, 1, 4, 5, div, 4, 4}, |
| out: []int{0, 0, 1, 4, 4, 4, 5}, |
| }, |
| } |
| for j, tt := range tests { |
| i := Iter{} |
| var w, p int |
| for k, cc := range tt.in { |
| |
| if cc == div { |
| w = 100 |
| p = k |
| continue |
| } |
| i.Elems = append(i.Elems, makeCE([]int{w, defaultSecondary, 2, cc})) |
| } |
| i.doNorm(p, i.Elems[p].CCC()) |
| if len(i.Elems) != len(tt.out) { |
| t.Errorf("%d: length was %d; want %d", j, len(i.Elems), len(tt.out)) |
| } |
| prevCCC := uint8(0) |
| for k, ce := range i.Elems { |
| if int(ce.CCC()) != tt.out[k] { |
| t.Errorf("%d:%d: unexpected CCC. Was %d; want %d", j, k, ce.CCC(), tt.out[k]) |
| } |
| if k > 0 && ce.CCC() == prevCCC && i.Elems[k-1].Primary() > ce.Primary() { |
| t.Errorf("%d:%d: normalization crossed across CCC boundary.", j, k) |
| } |
| } |
| } |
| |
| // Combining rune overflow is tested in search/pattern_test.go. |
| } |