1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package domain_test
4
5import (
6 "strings"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10
11 "bnema.dev/ermite/internal/domain"
12)
13
14// Groups compare like .NET's OrdinalIgnoreCase: upper-cased character by
15// character, a non-ASCII character whose upper case is ASCII keeping itself.
16func TestConcurrencyKeyFoldsLikeOrdinalIgnoreCase(t *testing.T) {
17 t.Parallel()
18 k := domain.ConcurrencyKey
19 // The three sigmas are one letter.
20 assert.Equal(t, k("Σ"), k("σ"))
21 assert.Equal(t, k("σ"), k("ς"))
22 assert.Equal(t, k("ΟΔΟΣ"), k("οδος"))
23 // ASCII and ordinary letters.
24 assert.Equal(t, k("Deploy"), k("DEPLOY"))
25 assert.Equal(t, k("É"), k("é"))
26 assert.NotEqual(t, k("a"), k("b"))
27 // The Turkish i's: i == I, but ı (dotless) and İ (dotted capital) are not I.
28 assert.Equal(t, k("i"), k("I"))
29 assert.NotEqual(t, k("ı"), k("I"))
30 assert.NotEqual(t, k("İ"), k("I"))
31 assert.NotEqual(t, k("ı"), k("i"))
32 assert.NotEqual(t, k("İ"), k("i"))
33 assert.NotEqual(t, k("ı"), k("İ"))
34 // ſ (long s) is not S.
35 assert.NotEqual(t, k("ſ"), k("S"))
36 assert.NotEqual(t, k("ſ"), k("s"))
37 // One character stays one character.
38 assert.Len(t, []rune(k("ß")), 1)
39 assert.NotEqual(t, k("ß"), k("ss"))
40}
41
42func TestConcurrencyGroupLengthCountsUTF16Units(t *testing.T) {
43 t.Parallel()
44 assert.Equal(t, 400, domain.ConcurrencyGroupLength(strings.Repeat("é", 400)), "a BMP character is one unit")
45 assert.Equal(t, 2, domain.ConcurrencyGroupLength("😀"), "a supplementary character is two")
46 assert.Equal(t, 400, domain.ConcurrencyGroupLength(strings.Repeat("😀", 200)))
47}