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