commit
7f4b273a05
@ -0,0 +1,29 @@
|
|||||||
|
package cli
|
||||||
|
|
||||||
|
import "unicode"
|
||||||
|
|
||||||
|
// lexicographicLess compares strings alphabetically considering case.
|
||||||
|
func lexicographicLess(i, j string) bool {
|
||||||
|
iRunes := []rune(i)
|
||||||
|
jRunes := []rune(j)
|
||||||
|
|
||||||
|
lenShared := len(iRunes)
|
||||||
|
if lenShared > len(jRunes) {
|
||||||
|
lenShared = len(jRunes)
|
||||||
|
}
|
||||||
|
|
||||||
|
for index := 0; index < lenShared; index++ {
|
||||||
|
ir := iRunes[index]
|
||||||
|
jr := jRunes[index]
|
||||||
|
|
||||||
|
if lir, ljr := unicode.ToLower(ir), unicode.ToLower(jr); lir != ljr {
|
||||||
|
return lir < ljr
|
||||||
|
}
|
||||||
|
|
||||||
|
if ir != jr {
|
||||||
|
return ir < jr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return i < j
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package cli
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
var lexicographicLessTests = []struct {
|
||||||
|
i string
|
||||||
|
j string
|
||||||
|
expected bool
|
||||||
|
}{
|
||||||
|
{"", "a", true},
|
||||||
|
{"a", "", false},
|
||||||
|
{"a", "a", false},
|
||||||
|
{"a", "A", false},
|
||||||
|
{"A", "a", true},
|
||||||
|
{"aa", "a", false},
|
||||||
|
{"a", "aa", true},
|
||||||
|
{"a", "b", true},
|
||||||
|
{"a", "B", true},
|
||||||
|
{"A", "b", true},
|
||||||
|
{"A", "B", true},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLexicographicLess(t *testing.T) {
|
||||||
|
for _, test := range lexicographicLessTests {
|
||||||
|
actual := lexicographicLess(test.i, test.j)
|
||||||
|
if test.expected != actual {
|
||||||
|
t.Errorf(`expected string "%s" to come before "%s"`, test.i, test.j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue