mirror of
https://github.com/miniflux/v2.git
synced 2024-08-31 00:27:24 +02:00
160 lines
4.0 KiB
Go
160 lines
4.0 KiB
Go
// 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)
|
||
}
|
||
}
|