github.com/benhoyt/goawk@v1.8.1/internal/strutil/strutil_test.go (about) 1 // Tests for the strutil package 2 3 package strutil_test 4 5 import ( 6 "strings" 7 "testing" 8 9 "github.com/benhoyt/goawk/internal/strutil" 10 ) 11 12 const space = "\t\v\r\f\n\u0085\u00a0\u2000\u3000" 13 14 func TestTrimSpace(t *testing.T) { 15 tests := []struct { 16 in, out string 17 }{ 18 {"", ""}, 19 {"abc", "abc"}, 20 {space + "abc" + space, "abc"}, 21 {" ", ""}, 22 {" \t\r\n \t\t\r\r\n\n ", ""}, 23 {" \t\r\n x\t\t\r\r\n\n ", "x"}, 24 {" \u2000\t\r\n x\t\t\r\r\ny\n \u3000", "x\t\t\r\r\ny"}, 25 {"1 \t\r\n2", "1 \t\r\n2"}, 26 {" x\x80", "x\x80"}, 27 {" x\xc0", "x\xc0"}, 28 {"x \xc0\xc0 ", "x \xc0\xc0"}, 29 {"x \xc0", "x \xc0"}, 30 {"x \xc0 ", "x \xc0"}, 31 {"x \xc0\xc0 ", "x \xc0\xc0"}, 32 {"x ☺\xc0\xc0 ", "x ☺\xc0\xc0"}, 33 {"x ☺ ", "x ☺"}, 34 {" ☺ x ", "☺ x"}, 35 {" x ", "x"}, 36 {" xy ", "xy"}, 37 {"xy", "xy"}, 38 {" ☺ ", "☺"}, 39 } 40 41 for _, test := range tests { 42 t.Run(test.in, func(t *testing.T) { 43 out := strutil.TrimSpace(test.in) 44 if out != test.out { 45 t.Errorf("expected %q, got %q", test.out, out) 46 } 47 }) 48 } 49 } 50 51 func BenchmarkStrutilTrimNoTrim(b *testing.B) { 52 for i := 0; i < b.N; i++ { 53 _ = strutil.TrimSpace("typical") 54 } 55 } 56 57 func BenchmarkStdlibTrimNoTrim(b *testing.B) { 58 for i := 0; i < b.N; i++ { 59 _ = strings.TrimSpace("typical") 60 } 61 } 62 63 func BenchmarkStrutilTrimASCII(b *testing.B) { 64 for i := 0; i < b.N; i++ { 65 _ = strutil.TrimSpace(" foo bar ") 66 } 67 } 68 69 func BenchmarkStdlibTrimASCII(b *testing.B) { 70 for i := 0; i < b.N; i++ { 71 _ = strings.TrimSpace(" foo bar ") 72 } 73 } 74 75 func BenchmarkStrutilTrimSomeUnicode(b *testing.B) { 76 for i := 0; i < b.N; i++ { 77 _ = strutil.TrimSpace(" \u2000\t\r\n x\t\t\r\r\ny\n \u3000 ") 78 } 79 } 80 81 func BenchmarkStdlibTrimSomeUnicode(b *testing.B) { 82 for i := 0; i < b.N; i++ { 83 _ = strings.TrimSpace(" \u2000\t\r\n x\t\t\r\r\ny\n \u3000 ") 84 } 85 } 86 87 func BenchmarkStrutilTrimJustUnicode(b *testing.B) { 88 for i := 0; i < b.N; i++ { 89 _ = strutil.TrimSpace("\u2000\t\r\n x\t\t\r\r\ny\n \u3000") 90 } 91 } 92 93 func BenchmarkStdlibTrimJustUnicode(b *testing.B) { 94 for i := 0; i < b.N; i++ { 95 _ = strings.TrimSpace("\u2000\t\r\n x\t\t\r\r\ny\n \u3000") 96 } 97 }