12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- // Copyright 2021 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 strings_test
- import (
- "reflect"
- "strings"
- "testing"
- "unsafe"
- )
- var emptyString string
- func TestClone(t *testing.T) {
- var cloneTests = []string{
- "",
- strings.Clone(""),
- strings.Repeat("a", 42)[:0],
- "short",
- strings.Repeat("a", 42),
- }
- for _, input := range cloneTests {
- clone := strings.Clone(input)
- if clone != input {
- t.Errorf("Clone(%q) = %q; want %q", input, clone, input)
- }
- inputHeader := (*reflect.StringHeader)(unsafe.Pointer(&input))
- cloneHeader := (*reflect.StringHeader)(unsafe.Pointer(&clone))
- if len(input) != 0 && cloneHeader.Data == inputHeader.Data {
- t.Errorf("Clone(%q) return value should not reference inputs backing memory.", input)
- }
- emptyHeader := (*reflect.StringHeader)(unsafe.Pointer(&emptyString))
- if len(input) == 0 && cloneHeader.Data != emptyHeader.Data {
- t.Errorf("Clone(%#v) return value should be equal to empty string.", inputHeader)
- }
- }
- }
- func BenchmarkClone(b *testing.B) {
- var str = strings.Repeat("a", 42)
- b.ReportAllocs()
- for i := 0; i < b.N; i++ {
- stringSink = strings.Clone(str)
- }
- }
|