aboutsummaryrefslogtreecommitdiff
path: root/internal/norm/norm_test.go
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-09-12 01:22:12 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-09-12 01:22:12 +0200
commit3b36a48b7ce5a53a9366f3b31f94311f178e2553 (patch)
treeecbb277ff916b719f2ee45fba017792b85d5faf9 /internal/norm/norm_test.go
parent42b02c47be9b285099203e44a2570636d4ca6f03 (diff)
downloadkrino-3b36a48b7ce5a53a9366f3b31f94311f178e2553.tar.gz
krino-3b36a48b7ce5a53a9366f3b31f94311f178e2553.zip
krino: matching — scan, ignore, conditions, extraction, duplicates, explain, dry run
Diffstat (limited to 'internal/norm/norm_test.go')
-rw-r--r--internal/norm/norm_test.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/internal/norm/norm_test.go b/internal/norm/norm_test.go
new file mode 100644
index 0000000..2fc35b6
--- /dev/null
+++ b/internal/norm/norm_test.go
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package norm
+
+import "testing"
+
+func TestFold(t *testing.T) {
+ tests := map[string]string{
+ "": "",
+ "plain ASCII 123": "plain ASCII 123",
+ "spółka z ograniczoną odpowiedzialnością": "spolka z ograniczona odpowiedzialnoscia",
+ "Łódź": "Lodz",
+ "ZAŻÓŁĆ GĘŚLĄ JAŹŃ": "ZAZOLC GESLA JAZN",
+ "Straße": "Strasse",
+ "Øresund": "Oresund",
+ "Ærø": "AEro",
+ "œuvre": "oeuvre",
+ "déjà vu": "deja vu",
+ "Đakovo": "Dakovo",
+ "ħelp": "help",
+ }
+ for in, want := range tests {
+ if got := Fold(in); got != want {
+ t.Errorf("Fold(%q) = %q, want %q", in, got, want)
+ }
+ }
+}
+
+func TestText(t *testing.T) {
+ tests := []struct {
+ in string
+ ignoreCase, fold bool
+ want string
+ }{
+ {" Hello\n\tWORLD ", true, false, "hello world"},
+ {"A B\r\nC", false, false, "A B C"},
+ {"ZAŻÓŁĆ gęślą", true, true, "zazolc gesla"},
+ {"Spółka", false, true, "Spolka"},
+ {"Faktura\u00A0VAT", true, false, "faktura vat"},
+ {"", true, true, ""},
+ {" ", true, true, ""},
+ }
+ for _, tt := range tests {
+ if got := Text(tt.in, tt.ignoreCase, tt.fold); got != tt.want {
+ t.Errorf("Text(%q, %v, %v) = %q, want %q", tt.in, tt.ignoreCase, tt.fold, got, tt.want)
+ }
+ }
+}
+
+func TestTextIdempotent(t *testing.T) {
+ for _, s := range []string{" Łódź\n\nMIASTO ", "a\tb", "Ærø Œuvre"} {
+ once := Text(s, true, true)
+ if twice := Text(once, true, true); twice != once {
+ t.Errorf("Text not idempotent on %q: %q then %q", s, once, twice)
+ }
+ }
+}
+
+func TestName(t *testing.T) {
+ if got := Name("Spółka.PDF", true); got != "Spolka.PDF" {
+ t.Errorf("Name fold = %q", got)
+ }
+ if got := Name("Spółka.PDF", false); got != "Spółka.PDF" {
+ t.Errorf("Name no fold = %q", got)
+ }
+}
+
+func TestFoldASCIINoAlloc(t *testing.T) {
+ s := "already plain ascii text"
+ if n := testing.AllocsPerRun(100, func() { _ = Fold(s) }); n != 0 {
+ t.Errorf("Fold allocates %v times on ASCII input", n)
+ }
+}