64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
// 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.
|
|
}
|