xref: /aosp_15_r20/external/go-cmp/cmp/internal/value/name_test.go (revision 88d15eac089d7f20c739ff1001d56b91872b21a1)
1// Copyright 2020, 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
5package value
6
7import (
8	"reflect"
9	"strings"
10	"testing"
11)
12
13type Named struct{}
14
15var pkgPath = reflect.TypeOf(Named{}).PkgPath()
16
17func TestTypeString(t *testing.T) {
18	tests := []struct {
19		in   interface{}
20		want string
21	}{{
22		in:   bool(false),
23		want: "bool",
24	}, {
25		in:   int(0),
26		want: "int",
27	}, {
28		in:   float64(0),
29		want: "float64",
30	}, {
31		in:   string(""),
32		want: "string",
33	}, {
34		in:   Named{},
35		want: "$PackagePath.Named",
36	}, {
37		in:   (chan Named)(nil),
38		want: "chan $PackagePath.Named",
39	}, {
40		in:   (<-chan Named)(nil),
41		want: "<-chan $PackagePath.Named",
42	}, {
43		in:   (chan<- Named)(nil),
44		want: "chan<- $PackagePath.Named",
45	}, {
46		in:   (func())(nil),
47		want: "func()",
48	}, {
49		in:   (func(Named))(nil),
50		want: "func($PackagePath.Named)",
51	}, {
52		in:   (func() Named)(nil),
53		want: "func() $PackagePath.Named",
54	}, {
55		in:   (func(int, Named) (int, error))(nil),
56		want: "func(int, $PackagePath.Named) (int, error)",
57	}, {
58		in:   (func(...Named))(nil),
59		want: "func(...$PackagePath.Named)",
60	}, {
61		in:   struct{}{},
62		want: "struct{}",
63	}, {
64		in:   struct{ Named }{},
65		want: "struct{ $PackagePath.Named }",
66	}, {
67		in: struct {
68			Named `tag`
69		}{},
70		want: "struct{ $PackagePath.Named \"tag\" }",
71	}, {
72		in:   struct{ Named Named }{},
73		want: "struct{ Named $PackagePath.Named }",
74	}, {
75		in: struct {
76			Named Named `tag`
77		}{},
78		want: "struct{ Named $PackagePath.Named \"tag\" }",
79	}, {
80		in: struct {
81			Int   int
82			Named Named
83		}{},
84		want: "struct{ Int int; Named $PackagePath.Named }",
85	}, {
86		in: struct {
87			_ int
88			x Named
89		}{},
90		want: "struct{ $FieldPrefix._ int; $FieldPrefix.x $PackagePath.Named }",
91	}, {
92		in:   []Named(nil),
93		want: "[]$PackagePath.Named",
94	}, {
95		in:   []*Named(nil),
96		want: "[]*$PackagePath.Named",
97	}, {
98		in:   [10]Named{},
99		want: "[10]$PackagePath.Named",
100	}, {
101		in:   [10]*Named{},
102		want: "[10]*$PackagePath.Named",
103	}, {
104		in:   map[string]string(nil),
105		want: "map[string]string",
106	}, {
107		in:   map[Named]Named(nil),
108		want: "map[$PackagePath.Named]$PackagePath.Named",
109	}, {
110		in:   (*Named)(nil),
111		want: "*$PackagePath.Named",
112	}, {
113		in:   (*interface{})(nil),
114		want: "*any",
115	}, {
116		in:   (*interface{ Read([]byte) (int, error) })(nil),
117		want: "*interface{ Read([]uint8) (int, error) }",
118	}, {
119		in: (*interface {
120			F1()
121			F2(Named)
122			F3() Named
123			F4(int, Named) (int, error)
124			F5(...Named)
125		})(nil),
126		want: "*interface{ F1(); F2($PackagePath.Named); F3() $PackagePath.Named; F4(int, $PackagePath.Named) (int, error); F5(...$PackagePath.Named) }",
127	}}
128
129	for _, tt := range tests {
130		typ := reflect.TypeOf(tt.in)
131		wantShort := tt.want
132		wantShort = strings.Replace(wantShort, "$PackagePath", "value", -1)
133		wantShort = strings.Replace(wantShort, "$FieldPrefix.", "", -1)
134		if gotShort := TypeString(typ, false); gotShort != wantShort {
135			t.Errorf("TypeString(%v, false) mismatch:\ngot:  %v\nwant: %v", typ, gotShort, wantShort)
136		}
137		wantQualified := tt.want
138		wantQualified = strings.Replace(wantQualified, "$PackagePath", `"`+pkgPath+`"`, -1)
139		wantQualified = strings.Replace(wantQualified, "$FieldPrefix", `"`+pkgPath+`"`, -1)
140		if gotQualified := TypeString(typ, true); gotQualified != wantQualified {
141			t.Errorf("TypeString(%v, true) mismatch:\ngot:  %v\nwant: %v", typ, gotQualified, wantQualified)
142		}
143	}
144}
145