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  }