123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- // Copyright 2014 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 (
- "reflect"
- "strings"
- "testing"
- "golang.org/x/text/internal/testtext"
- )
- const (
- digSec = defaultSecondary
- digTert = defaultTertiary
- )
- var tPlus3 = e(0, 50, digTert+3)
- // numWeighter is a testWeighter used for testing numericWeighter.
- var numWeighter = testWeighter{
- "0": p(100),
- "0": []Elem{e(100, digSec, digTert+1)}, // U+FF10 FULLWIDTH DIGIT ZERO
- "₀": []Elem{e(100, digSec, digTert+5)}, // U+2080 SUBSCRIPT ZERO
- "1": p(101),
- // Allow non-primary collation elements to be inserted.
- "١": append(p(101), tPlus3), // U+0661 ARABIC-INDIC DIGIT ONE
- // Allow varying tertiary weight if the number is Nd.
- "1": []Elem{e(101, digSec, digTert+1)}, // U+FF11 FULLWIDTH DIGIT ONE
- "2": p(102),
- // Allow non-primary collation elements to be inserted.
- "٢": append(p(102), tPlus3), // U+0662 ARABIC-INDIC DIGIT TWO
- // Varying tertiary weights should be ignored.
- "2": []Elem{e(102, digSec, digTert+3)}, // U+FF12 FULLWIDTH DIGIT TWO
- "3": p(103),
- "4": p(104),
- "5": p(105),
- "6": p(106),
- "7": p(107),
- // Weights must be strictly monotonically increasing, but do not need to be
- // consecutive.
- "8": p(118),
- "9": p(119),
- // Allow non-primary collation elements to be inserted.
- "٩": append(p(119), tPlus3), // U+0669 ARABIC-INDIC DIGIT NINE
- // Varying tertiary weights should be ignored.
- "9": []Elem{e(119, digSec, digTert+1)}, // U+FF19 FULLWIDTH DIGIT NINE
- "₉": []Elem{e(119, digSec, digTert+5)}, // U+2089 SUBSCRIPT NINE
- "a": p(5),
- "b": p(6),
- "c": p(8, 2),
- "klm": p(99),
- "nop": p(121),
- "x": p(200),
- "y": p(201),
- }
- func p(w ...int) (elems []Elem) {
- for _, x := range w {
- e, _ := MakeElem(x, digSec, digTert, 0)
- elems = append(elems, e)
- }
- return elems
- }
- func TestNumericAppendNext(t *testing.T) {
- for _, tt := range []struct {
- in string
- w []Elem
- }{
- {"a", p(5)},
- {"klm", p(99)},
- {"aa", p(5, 5)},
- {"1", p(120, 1, 101)},
- {"0", p(120, 0)},
- {"01", p(120, 1, 101)},
- {"0001", p(120, 1, 101)},
- {"10", p(120, 2, 101, 100)},
- {"99", p(120, 2, 119, 119)},
- {"9999", p(120, 4, 119, 119, 119, 119)},
- {"1a", p(120, 1, 101, 5)},
- {"0b", p(120, 0, 6)},
- {"01c", p(120, 1, 101, 8, 2)},
- {"10x", p(120, 2, 101, 100, 200)},
- {"99y", p(120, 2, 119, 119, 201)},
- {"9999nop", p(120, 4, 119, 119, 119, 119, 121)},
- // Allow follow-up collation elements if they have a zero non-primary.
- {"١٢٩", []Elem{e(120), e(3), e(101), tPlus3, e(102), tPlus3, e(119), tPlus3}},
- {
- "129",
- []Elem{
- e(120), e(3),
- e(101, digSec, digTert+1),
- e(102, digSec, digTert+3),
- e(119, digSec, digTert+1),
- },
- },
- // Ensure AppendNext* adds to the given buffer.
- {"a10", p(5, 120, 2, 101, 100)},
- } {
- nw := NewNumericWeighter(numWeighter)
- b := []byte(tt.in)
- got := []Elem(nil)
- for n, sz := 0, 0; n < len(b); {
- got, sz = nw.AppendNext(got, b[n:])
- n += sz
- }
- if !reflect.DeepEqual(got, tt.w) {
- t.Errorf("AppendNext(%q) =\n%v; want\n%v", tt.in, got, tt.w)
- }
- got = nil
- for n, sz := 0, 0; n < len(tt.in); {
- got, sz = nw.AppendNextString(got, tt.in[n:])
- n += sz
- }
- if !reflect.DeepEqual(got, tt.w) {
- t.Errorf("AppendNextString(%q) =\n%v; want\n%v", tt.in, got, tt.w)
- }
- }
- }
- func TestNumericOverflow(t *testing.T) {
- manyDigits := strings.Repeat("9", maxDigits+1) + "a"
- nw := NewNumericWeighter(numWeighter)
- got, n := nw.AppendNextString(nil, manyDigits)
- if n != maxDigits {
- t.Errorf("n: got %d; want %d", n, maxDigits)
- }
- if got[1].Primary() != maxDigits {
- t.Errorf("primary(e[1]): got %d; want %d", n, maxDigits)
- }
- }
- func TestNumericWeighterAlloc(t *testing.T) {
- buf := make([]Elem, 100)
- w := NewNumericWeighter(numWeighter)
- s := "1234567890a"
- nNormal := testtext.AllocsPerRun(3, func() { numWeighter.AppendNextString(buf, s) })
- nNumeric := testtext.AllocsPerRun(3, func() { w.AppendNextString(buf, s) })
- if n := nNumeric - nNormal; n > 0 {
- t.Errorf("got %f; want 0", n)
- }
- }
|