1
1
package gson
2
2
3
+ import "sort"
3
4
import "bytes"
5
+ import "strings"
4
6
import "testing"
5
7
import "reflect"
6
8
9
+ import "golang.org/x/text/collate"
10
+ import "golang.org/x/text/language"
11
+
7
12
func TestCollateReset (t * testing.T ) {
8
13
config := NewDefaultConfig ()
9
14
clt := config .NewCollate (make ([]byte , 0 , 1024 ))
@@ -49,6 +54,117 @@ func TestCollateEmpty(t *testing.T) {
49
54
}()
50
55
}
51
56
57
+ func TestAlternateSortTypes (t * testing.T ) {
58
+ testCases := []struct {
59
+ lang string
60
+ in testtxtclts
61
+ want []string
62
+ }{{
63
+ lang : "zh,cmn,zh-Hant-u-co-pinyin,zh-HK-u-co-pinyin,zh-pinyin" ,
64
+ in : testtxtclts {
65
+ & testtxtclt {in : "爸爸" }, & testtxtclt {in : "妈妈" },
66
+ & testtxtclt {in : "儿子" }, & testtxtclt {in : "女儿" },
67
+ },
68
+ want : []string {"爸爸" , "儿子" , "妈妈" , "女儿" },
69
+ }, {
70
+ lang : "zh-Hant,zh-u-co-stroke,zh-Hant-u-co-stroke" ,
71
+ in : testtxtclts {
72
+ & testtxtclt {in : "爸爸" }, & testtxtclt {in : "妈妈" },
73
+ & testtxtclt {in : "儿子" }, & testtxtclt {in : "女儿" },
74
+ },
75
+ want : []string {"儿子" , "女儿" , "妈妈" , "爸爸" },
76
+ }}
77
+
78
+ for _ , tc := range testCases {
79
+ for _ , tag := range strings .Split (tc .lang , "," ) {
80
+ collator := collate .New (language .MustParse (tag ))
81
+ config := NewDefaultConfig ().SetTextCollator (collator )
82
+ for _ , item := range tc .in {
83
+ item .collate (config )
84
+ }
85
+ sort .Sort (tc .in )
86
+ got := []string {}
87
+ for _ , item := range tc .in {
88
+ got = append (got , item .in )
89
+ }
90
+ if ! reflect .DeepEqual (got , tc .want ) {
91
+ t .Errorf ("%v %v expected %v; got %v" , tag , tc .in , tc .want , got )
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ func TestTextNocase (t * testing.T ) {
98
+ testCases := []struct {
99
+ lang string
100
+ in testtxtclts
101
+ want []string
102
+ }{{
103
+ lang : "en" ,
104
+ in : testtxtclts {
105
+ & testtxtclt {in : "B" }, & testtxtclt {in : "b" },
106
+ & testtxtclt {in : "a" }, & testtxtclt {in : "A" },
107
+ },
108
+ want : []string {"a" , "A" , "B" , "b" },
109
+ }}
110
+
111
+ for _ , tc := range testCases {
112
+ for _ , tag := range strings .Split (tc .lang , "," ) {
113
+ collator := collate .New (language .MustParse (tag ))
114
+ config := NewDefaultConfig ().SetTextCollator (collator )
115
+ for _ , item := range tc .in {
116
+ item .collate (config )
117
+ }
118
+ sort .Sort (tc .in )
119
+ got := []string {}
120
+ for _ , item := range tc .in {
121
+ got = append (got , item .in )
122
+ }
123
+ if ! reflect .DeepEqual (got , tc .want ) {
124
+ t .Errorf ("%v %v expected %v; got %v" , tag , tc .in , tc .want , got )
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ func TestTextGermanSwedish (t * testing.T ) {
131
+ testCases := []struct {
132
+ lang string
133
+ in testtxtclts
134
+ want []string
135
+ }{{
136
+ lang : "de" ,
137
+ in : testtxtclts {
138
+ & testtxtclt {in : "a" }, & testtxtclt {in : "z" }, & testtxtclt {in : "ä" },
139
+ },
140
+ want : []string {"a" , "ä" , "z" },
141
+ }, {
142
+ lang : "sv" ,
143
+ in : testtxtclts {
144
+ & testtxtclt {in : "a" }, & testtxtclt {in : "z" }, & testtxtclt {in : "ä" },
145
+ },
146
+ want : []string {"a" , "z" , "ä" },
147
+ }}
148
+
149
+ for _ , tc := range testCases {
150
+ for _ , tag := range strings .Split (tc .lang , "," ) {
151
+ collator := collate .New (language .MustParse (tag ))
152
+ config := NewDefaultConfig ().SetTextCollator (collator )
153
+ for _ , item := range tc .in {
154
+ item .collate (config )
155
+ }
156
+ sort .Sort (tc .in )
157
+ got := []string {}
158
+ for _ , item := range tc .in {
159
+ got = append (got , item .in )
160
+ }
161
+ if ! reflect .DeepEqual (got , tc .want ) {
162
+ t .Errorf ("%v %v expected %v; got %v" , tag , tc .in , tc .want , got )
163
+ }
164
+ }
165
+ }
166
+ }
167
+
52
168
// sort type for slice of []byte
53
169
54
170
type ByteSlices [][]byte
@@ -64,3 +180,27 @@ func (bs ByteSlices) Less(i, j int) bool {
64
180
func (bs ByteSlices ) Swap (i , j int ) {
65
181
bs [i ], bs [j ] = bs [j ], bs [i ]
66
182
}
183
+
184
+ type testtxtclt struct {
185
+ in string
186
+ clt []byte
187
+ }
188
+
189
+ func (item * testtxtclt ) collate (config * Config ) {
190
+ val := config .NewValue (item .in )
191
+ item .clt = val .Tocollate (config .NewCollate (nil )).Bytes ()
192
+ }
193
+
194
+ type testtxtclts []* testtxtclt
195
+
196
+ func (items testtxtclts ) Len () int {
197
+ return len (items )
198
+ }
199
+
200
+ func (items testtxtclts ) Less (i , j int ) bool {
201
+ return bytes .Compare (items [i ].clt , items [j ].clt ) < 0
202
+ }
203
+
204
+ func (items testtxtclts ) Swap (i , j int ) {
205
+ items [i ], items [j ] = items [j ], items [i ]
206
+ }
0 commit comments