| // Copyright 2024 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package test | |
| import ( | |
| "reflect" | |
| "testing" | |
| ) | |
| //go:noinline | |
| func foo() string { return "foofoofoofoofoofo" } // len == 17 | |
| //go:noinline | |
| func empty() string { return "" } | |
| func TestConcatBytes(t *testing.T) { | |
| empty := empty() | |
| s := foo() | |
| tests := map[string]struct { | |
| got []byte | |
| want []byte | |
| }{ | |
| "two empty elements": {got: []byte(empty + empty), want: []byte{}}, | |
| "two nonempty elements": {got: []byte(s + s), want: append([]byte(foo()), foo()...)}, | |
| "one empty and one nonempty element": {got: []byte(s + empty), want: []byte(foo())}, | |
| "multiple empty elements": {got: []byte(empty + empty + empty + empty + empty + empty), want: []byte{}}, | |
| "multiple nonempty elements": {got: []byte("1" + "2" + "3" + "4" + "5" + "6"), want: []byte("123456")}, | |
| } | |
| for name, test := range tests { | |
| if !reflect.DeepEqual(test.got, test.want) { | |
| t.Errorf("[%s] got: %s, want: %s", name, test.got, test.want) | |
| } | |
| } | |
| } | |
| func TestConcatBytesAllocations(t *testing.T) { | |
| empty := empty() | |
| s := foo() | |
| tests := map[string]struct { | |
| f func() []byte | |
| allocs float64 | |
| }{ | |
| "two empty elements": {f: func() []byte { return []byte(empty + empty) }, allocs: 0}, | |
| "multiple empty elements": {f: func() []byte { return []byte(empty + empty + empty + empty + empty + empty) }, allocs: 0}, | |
| "two elements": {f: func() []byte { return []byte(s + s) }, allocs: 1}, | |
| "three elements": {f: func() []byte { return []byte(s + s + s) }, allocs: 1}, | |
| "four elements": {f: func() []byte { return []byte(s + s + s + s) }, allocs: 1}, | |
| "five elements": {f: func() []byte { return []byte(s + s + s + s + s) }, allocs: 1}, | |
| "one empty and one nonempty element": {f: func() []byte { return []byte(s + empty) }, allocs: 1}, | |
| "two empty and two nonempty element": {f: func() []byte { return []byte(s + empty + s + empty) }, allocs: 1}, | |
| } | |
| for name, test := range tests { | |
| allocs := testing.AllocsPerRun(100, func() { test.f() }) | |
| if allocs != test.allocs { | |
| t.Errorf("concatbytes [%s]: %v allocs, want %v", name, allocs, test.allocs) | |
| } | |
| } | |
| } |