compare_strings_test.go (2000B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package compare 15 16 import ( 17 "sort" 18 "strings" 19 "testing" 20 21 qt "github.com/frankban/quicktest" 22 ) 23 24 func TestCompare(t *testing.T) { 25 c := qt.New(t) 26 for _, test := range []struct { 27 a string 28 b string 29 }{ 30 {"a", "a"}, 31 {"A", "a"}, 32 {"Ab", "Ac"}, 33 {"az", "Za"}, 34 {"C", "D"}, 35 {"B", "a"}, 36 {"C", ""}, 37 {"", ""}, 38 {"αβδC", "ΑΒΔD"}, 39 {"αβδC", "ΑΒΔ"}, 40 {"αβδ", "ΑΒΔD"}, 41 {"αβδ", "ΑΒΔ"}, 42 {"β", "δ"}, 43 {"好", strings.ToLower("好")}, 44 } { 45 46 expect := strings.Compare(strings.ToLower(test.a), strings.ToLower(test.b)) 47 got := compareFold(test.a, test.b) 48 49 c.Assert(got, qt.Equals, expect) 50 51 } 52 } 53 54 func TestLexicographicSort(t *testing.T) { 55 c := qt.New(t) 56 57 s := []string{"b", "Bz", "ba", "A", "Ba", "ba"} 58 59 sort.Slice(s, func(i, j int) bool { 60 return LessStrings(s[i], s[j]) 61 }) 62 63 c.Assert(s, qt.DeepEquals, []string{"A", "b", "Ba", "ba", "ba", "Bz"}) 64 } 65 66 func BenchmarkStringSort(b *testing.B) { 67 prototype := []string{"b", "Bz", "zz", "ba", "αβδ αβδ αβδ", "A", "Ba", "ba", "nnnnasdfnnn", "AAgæåz", "αβδC"} 68 b.Run("LessStrings", func(b *testing.B) { 69 ss := make([][]string, b.N) 70 for i := 0; i < b.N; i++ { 71 ss[i] = make([]string, len(prototype)) 72 copy(ss[i], prototype) 73 } 74 b.ResetTimer() 75 for i := 0; i < b.N; i++ { 76 sss := ss[i] 77 sort.Slice(sss, func(i, j int) bool { 78 return LessStrings(sss[i], sss[j]) 79 }) 80 } 81 }) 82 83 }