210 lines
4.6 KiB
Go
210 lines
4.6 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 collate
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
|
||
|
"golang.org/x/text/internal/colltab"
|
||
|
"golang.org/x/text/language"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
defaultIgnore = ignore(colltab.Tertiary)
|
||
|
defaultTable = getTable(locales[0])
|
||
|
)
|
||
|
|
||
|
func TestOptions(t *testing.T) {
|
||
|
for i, tt := range []struct {
|
||
|
in []Option
|
||
|
out options
|
||
|
}{
|
||
|
0: {
|
||
|
out: options{
|
||
|
ignore: defaultIgnore,
|
||
|
},
|
||
|
},
|
||
|
1: {
|
||
|
in: []Option{IgnoreDiacritics},
|
||
|
out: options{
|
||
|
ignore: [colltab.NumLevels]bool{false, true, false, true, true},
|
||
|
},
|
||
|
},
|
||
|
2: {
|
||
|
in: []Option{IgnoreCase, IgnoreDiacritics},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Primary),
|
||
|
},
|
||
|
},
|
||
|
3: {
|
||
|
in: []Option{ignoreDiacritics, IgnoreWidth},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Primary),
|
||
|
caseLevel: true,
|
||
|
},
|
||
|
},
|
||
|
4: {
|
||
|
in: []Option{IgnoreWidth, ignoreDiacritics},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Primary),
|
||
|
caseLevel: true,
|
||
|
},
|
||
|
},
|
||
|
5: {
|
||
|
in: []Option{IgnoreCase, IgnoreWidth},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Secondary),
|
||
|
},
|
||
|
},
|
||
|
6: {
|
||
|
in: []Option{IgnoreCase, IgnoreWidth, Loose},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Primary),
|
||
|
},
|
||
|
},
|
||
|
7: {
|
||
|
in: []Option{Force, IgnoreCase, IgnoreWidth, Loose},
|
||
|
out: options{
|
||
|
ignore: [colltab.NumLevels]bool{false, true, true, true, false},
|
||
|
},
|
||
|
},
|
||
|
8: {
|
||
|
in: []Option{IgnoreDiacritics, IgnoreCase},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Primary),
|
||
|
},
|
||
|
},
|
||
|
9: {
|
||
|
in: []Option{Numeric},
|
||
|
out: options{
|
||
|
ignore: defaultIgnore,
|
||
|
numeric: true,
|
||
|
},
|
||
|
},
|
||
|
10: {
|
||
|
in: []Option{OptionsFromTag(language.MustParse("und-u-ks-level1"))},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Primary),
|
||
|
},
|
||
|
},
|
||
|
11: {
|
||
|
in: []Option{OptionsFromTag(language.MustParse("und-u-ks-level4"))},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Quaternary),
|
||
|
},
|
||
|
},
|
||
|
12: {
|
||
|
in: []Option{OptionsFromTag(language.MustParse("und-u-ks-identic"))},
|
||
|
out: options{},
|
||
|
},
|
||
|
13: {
|
||
|
in: []Option{
|
||
|
OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")),
|
||
|
},
|
||
|
out: options{
|
||
|
ignore: defaultIgnore,
|
||
|
caseLevel: true,
|
||
|
backwards: true,
|
||
|
numeric: true,
|
||
|
},
|
||
|
},
|
||
|
14: {
|
||
|
in: []Option{
|
||
|
OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")),
|
||
|
OptionsFromTag(language.MustParse("und-u-kn-false-kb-false-kc-false")),
|
||
|
},
|
||
|
out: options{
|
||
|
ignore: defaultIgnore,
|
||
|
},
|
||
|
},
|
||
|
15: {
|
||
|
in: []Option{
|
||
|
OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")),
|
||
|
OptionsFromTag(language.MustParse("und-u-kn-foo-kb-foo-kc-foo")),
|
||
|
},
|
||
|
out: options{
|
||
|
ignore: defaultIgnore,
|
||
|
caseLevel: true,
|
||
|
backwards: true,
|
||
|
numeric: true,
|
||
|
},
|
||
|
},
|
||
|
16: { // Normal options take precedence over tag options.
|
||
|
in: []Option{
|
||
|
Numeric, IgnoreCase,
|
||
|
OptionsFromTag(language.MustParse("und-u-kn-false-kc-true")),
|
||
|
},
|
||
|
out: options{
|
||
|
ignore: ignore(colltab.Secondary),
|
||
|
caseLevel: false,
|
||
|
numeric: true,
|
||
|
},
|
||
|
},
|
||
|
17: {
|
||
|
in: []Option{
|
||
|
OptionsFromTag(language.MustParse("und-u-ka-shifted")),
|
||
|
},
|
||
|
out: options{
|
||
|
ignore: defaultIgnore,
|
||
|
alternate: altShifted,
|
||
|
},
|
||
|
},
|
||
|
18: {
|
||
|
in: []Option{
|
||
|
OptionsFromTag(language.MustParse("und-u-ka-blanked")),
|
||
|
},
|
||
|
out: options{
|
||
|
ignore: defaultIgnore,
|
||
|
alternate: altBlanked,
|
||
|
},
|
||
|
},
|
||
|
19: {
|
||
|
in: []Option{
|
||
|
OptionsFromTag(language.MustParse("und-u-ka-posix")),
|
||
|
},
|
||
|
out: options{
|
||
|
ignore: defaultIgnore,
|
||
|
alternate: altShiftTrimmed,
|
||
|
},
|
||
|
},
|
||
|
} {
|
||
|
c := newCollator(defaultTable)
|
||
|
c.t = nil
|
||
|
c.variableTop = 0
|
||
|
c.f = 0
|
||
|
|
||
|
c.setOptions(tt.in)
|
||
|
if !reflect.DeepEqual(c.options, tt.out) {
|
||
|
t.Errorf("%d: got %v; want %v", i, c.options, tt.out)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestAlternateSortTypes(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
lang string
|
||
|
in []string
|
||
|
want []string
|
||
|
}{{
|
||
|
lang: "zh,cmn,zh-Hant-u-co-pinyin,zh-HK-u-co-pinyin,zh-pinyin",
|
||
|
in: []string{"爸爸", "妈妈", "儿子", "女儿"},
|
||
|
want: []string{"爸爸", "儿子", "妈妈", "女儿"},
|
||
|
}, {
|
||
|
lang: "zh-Hant,zh-u-co-stroke,zh-Hant-u-co-stroke",
|
||
|
in: []string{"爸爸", "妈妈", "儿子", "女儿"},
|
||
|
want: []string{"儿子", "女儿", "妈妈", "爸爸"},
|
||
|
}}
|
||
|
for _, tc := range testCases {
|
||
|
for _, tag := range strings.Split(tc.lang, ",") {
|
||
|
got := append([]string{}, tc.in...)
|
||
|
New(language.MustParse(tag)).SortStrings(got)
|
||
|
if !reflect.DeepEqual(got, tc.want) {
|
||
|
t.Errorf("New(%s).SortStrings(%v) = %v; want %v", tag, tc.in, got, tc.want)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|