// Copyright 2020, 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.md file. package value import ( "reflect" "strings" "testing" ) type Named struct{} var pkgPath = reflect.TypeOf(Named{}).PkgPath() func TestTypeString(t *testing.T) { tests := []struct { in interface{} want string }{{ in: bool(false), want: "bool", }, { in: int(0), want: "int", }, { in: float64(0), want: "float64", }, { in: string(""), want: "string", }, { in: Named{}, want: "$PackagePath.Named", }, { in: (chan Named)(nil), want: "chan $PackagePath.Named", }, { in: (<-chan Named)(nil), want: "<-chan $PackagePath.Named", }, { in: (chan<- Named)(nil), want: "chan<- $PackagePath.Named", }, { in: (func())(nil), want: "func()", }, { in: (func(Named))(nil), want: "func($PackagePath.Named)", }, { in: (func() Named)(nil), want: "func() $PackagePath.Named", }, { in: (func(int, Named) (int, error))(nil), want: "func(int, $PackagePath.Named) (int, error)", }, { in: (func(...Named))(nil), want: "func(...$PackagePath.Named)", }, { in: struct{}{}, want: "struct{}", }, { in: struct{ Named }{}, want: "struct{ $PackagePath.Named }", }, { in: struct { Named `tag` }{}, want: "struct{ $PackagePath.Named \"tag\" }", }, { in: struct{ Named Named }{}, want: "struct{ Named $PackagePath.Named }", }, { in: struct { Named Named `tag` }{}, want: "struct{ Named $PackagePath.Named \"tag\" }", }, { in: struct { Int int Named Named }{}, want: "struct{ Int int; Named $PackagePath.Named }", }, { in: struct { _ int x Named }{}, want: "struct{ $FieldPrefix._ int; $FieldPrefix.x $PackagePath.Named }", }, { in: []Named(nil), want: "[]$PackagePath.Named", }, { in: []*Named(nil), want: "[]*$PackagePath.Named", }, { in: [10]Named{}, want: "[10]$PackagePath.Named", }, { in: [10]*Named{}, want: "[10]*$PackagePath.Named", }, { in: map[string]string(nil), want: "map[string]string", }, { in: map[Named]Named(nil), want: "map[$PackagePath.Named]$PackagePath.Named", }, { in: (*Named)(nil), want: "*$PackagePath.Named", }, { in: (*interface{})(nil), want: "*interface{}", }, { in: (*interface{ Read([]byte) (int, error) })(nil), want: "*interface{ Read([]uint8) (int, error) }", }, { in: (*interface { F1() F2(Named) F3() Named F4(int, Named) (int, error) F5(...Named) })(nil), want: "*interface{ F1(); F2($PackagePath.Named); F3() $PackagePath.Named; F4(int, $PackagePath.Named) (int, error); F5(...$PackagePath.Named) }", }} for _, tt := range tests { typ := reflect.TypeOf(tt.in) wantShort := tt.want wantShort = strings.Replace(wantShort, "$PackagePath", "value", -1) wantShort = strings.Replace(wantShort, "$FieldPrefix.", "", -1) if gotShort := TypeString(typ, false); gotShort != wantShort { t.Errorf("TypeString(%v, false) mismatch:\ngot: %v\nwant: %v", typ, gotShort, wantShort) } wantQualified := tt.want wantQualified = strings.Replace(wantQualified, "$PackagePath", `"`+pkgPath+`"`, -1) wantQualified = strings.Replace(wantQualified, "$FieldPrefix", `"`+pkgPath+`"`, -1) if gotQualified := TypeString(typ, true); gotQualified != wantQualified { t.Errorf("TypeString(%v, true) mismatch:\ngot: %v\nwant: %v", typ, gotQualified, wantQualified) } } }