github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/test/testdata/string_test.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // string_ssa.go tests string operations.
     6  package main
     7  
     8  import "testing"
     9  
    10  //go:noinline
    11  func testStringSlice1_ssa(a string, i, j int) string {
    12  	return a[i:]
    13  }
    14  
    15  //go:noinline
    16  func testStringSlice2_ssa(a string, i, j int) string {
    17  	return a[:j]
    18  }
    19  
    20  //go:noinline
    21  func testStringSlice12_ssa(a string, i, j int) string {
    22  	return a[i:j]
    23  }
    24  
    25  func testStringSlice(t *testing.T) {
    26  	tests := [...]struct {
    27  		fn        func(string, int, int) string
    28  		s         string
    29  		low, high int
    30  		want      string
    31  	}{
    32  		// -1 means the value is not used.
    33  		{testStringSlice1_ssa, "foobar", 0, -1, "foobar"},
    34  		{testStringSlice1_ssa, "foobar", 3, -1, "bar"},
    35  		{testStringSlice1_ssa, "foobar", 6, -1, ""},
    36  		{testStringSlice2_ssa, "foobar", -1, 0, ""},
    37  		{testStringSlice2_ssa, "foobar", -1, 3, "foo"},
    38  		{testStringSlice2_ssa, "foobar", -1, 6, "foobar"},
    39  		{testStringSlice12_ssa, "foobar", 0, 6, "foobar"},
    40  		{testStringSlice12_ssa, "foobar", 0, 0, ""},
    41  		{testStringSlice12_ssa, "foobar", 6, 6, ""},
    42  		{testStringSlice12_ssa, "foobar", 1, 5, "ooba"},
    43  		{testStringSlice12_ssa, "foobar", 3, 3, ""},
    44  		{testStringSlice12_ssa, "", 0, 0, ""},
    45  	}
    46  
    47  	for i, test := range tests {
    48  		if got := test.fn(test.s, test.low, test.high); test.want != got {
    49  			t.Errorf("#%d %s[%d,%d] = %s, want %s", i, test.s, test.low, test.high, got, test.want)
    50  		}
    51  	}
    52  }
    53  
    54  type prefix struct {
    55  	prefix string
    56  }
    57  
    58  func (p *prefix) slice_ssa() {
    59  	p.prefix = p.prefix[:3]
    60  }
    61  
    62  //go:noinline
    63  func testStructSlice(t *testing.T) {
    64  	p := &prefix{"prefix"}
    65  	p.slice_ssa()
    66  	if "pre" != p.prefix {
    67  		t.Errorf("wrong field slice: wanted %s got %s", "pre", p.prefix)
    68  	}
    69  }
    70  
    71  func testStringSlicePanic(t *testing.T) {
    72  	defer func() {
    73  		if r := recover(); r != nil {
    74  			//println("panicked as expected")
    75  		}
    76  	}()
    77  
    78  	str := "foobar"
    79  	t.Errorf("got %s and expected to panic, but didn't", testStringSlice12_ssa(str, 3, 9))
    80  }
    81  
    82  const _Accuracy_name = "BelowExactAbove"
    83  
    84  var _Accuracy_index = [...]uint8{0, 5, 10, 15}
    85  
    86  //go:noinline
    87  func testSmallIndexType_ssa(i int) string {
    88  	return _Accuracy_name[_Accuracy_index[i]:_Accuracy_index[i+1]]
    89  }
    90  
    91  func testSmallIndexType(t *testing.T) {
    92  	tests := []struct {
    93  		i    int
    94  		want string
    95  	}{
    96  		{0, "Below"},
    97  		{1, "Exact"},
    98  		{2, "Above"},
    99  	}
   100  
   101  	for i, test := range tests {
   102  		if got := testSmallIndexType_ssa(test.i); got != test.want {
   103  			t.Errorf("#%d got %s wanted %s", i, got, test.want)
   104  		}
   105  	}
   106  }
   107  
   108  //go:noinline
   109  func testInt64Index_ssa(s string, i int64) byte {
   110  	return s[i]
   111  }
   112  
   113  //go:noinline
   114  func testInt64Slice_ssa(s string, i, j int64) string {
   115  	return s[i:j]
   116  }
   117  
   118  func testInt64Index(t *testing.T) {
   119  	tests := []struct {
   120  		i int64
   121  		j int64
   122  		b byte
   123  		s string
   124  	}{
   125  		{0, 5, 'B', "Below"},
   126  		{5, 10, 'E', "Exact"},
   127  		{10, 15, 'A', "Above"},
   128  	}
   129  
   130  	str := "BelowExactAbove"
   131  	for i, test := range tests {
   132  		if got := testInt64Index_ssa(str, test.i); got != test.b {
   133  			t.Errorf("#%d got %d wanted %d", i, got, test.b)
   134  		}
   135  		if got := testInt64Slice_ssa(str, test.i, test.j); got != test.s {
   136  			t.Errorf("#%d got %s wanted %s", i, got, test.s)
   137  		}
   138  	}
   139  }
   140  
   141  func testInt64IndexPanic(t *testing.T) {
   142  	defer func() {
   143  		if r := recover(); r != nil {
   144  			//println("panicked as expected")
   145  		}
   146  	}()
   147  
   148  	str := "foobar"
   149  	t.Errorf("got %d and expected to panic, but didn't", testInt64Index_ssa(str, 1<<32+1))
   150  }
   151  
   152  func testInt64SlicePanic(t *testing.T) {
   153  	defer func() {
   154  		if r := recover(); r != nil {
   155  			//println("panicked as expected")
   156  		}
   157  	}()
   158  
   159  	str := "foobar"
   160  	t.Errorf("got %s and expected to panic, but didn't", testInt64Slice_ssa(str, 1<<32, 1<<32+1))
   161  }
   162  
   163  //go:noinline
   164  func testStringElem_ssa(s string, i int) byte {
   165  	return s[i]
   166  }
   167  
   168  func testStringElem(t *testing.T) {
   169  	tests := []struct {
   170  		s string
   171  		i int
   172  		n byte
   173  	}{
   174  		{"foobar", 3, 98},
   175  		{"foobar", 0, 102},
   176  		{"foobar", 5, 114},
   177  	}
   178  	for _, test := range tests {
   179  		if got := testStringElem_ssa(test.s, test.i); got != test.n {
   180  			t.Errorf("testStringElem \"%s\"[%d] = %d, wanted %d", test.s, test.i, got, test.n)
   181  		}
   182  	}
   183  }
   184  
   185  //go:noinline
   186  func testStringElemConst_ssa(i int) byte {
   187  	s := "foobar"
   188  	return s[i]
   189  }
   190  
   191  func testStringElemConst(t *testing.T) {
   192  	if got := testStringElemConst_ssa(3); got != 98 {
   193  		t.Errorf("testStringElemConst= %d, wanted 98", got)
   194  	}
   195  }
   196  
   197  func TestString(t *testing.T) {
   198  	testStringSlice(t)
   199  	testStringSlicePanic(t)
   200  	testStructSlice(t)
   201  	testSmallIndexType(t)
   202  	testStringElem(t)
   203  	testStringElemConst(t)
   204  	testInt64Index(t)
   205  	testInt64IndexPanic(t)
   206  	testInt64SlicePanic(t)
   207  }