github.com/RevenueMonster/sqlike@v1.0.6/reflext/cache_test.go (about) 1 package reflext 2 3 import ( 4 "reflect" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 type dbStruct struct { 11 Name string `db:"name"` 12 skip bool 13 Email *string 14 } 15 16 func TestMapper(t *testing.T) { 17 var ( 18 mapper = NewMapperFunc("db", func(str string) string { 19 return str 20 }) 21 ok bool 22 ) 23 24 tmp := dbStruct{Name: "John"} 25 v := reflect.ValueOf(&tmp) 26 fv := mapper.FieldByName(v, "name") 27 require.NotNil(t, fv) 28 29 require.Panics(t, func() { 30 mapper.FieldByName(reflect.ValueOf(0), "unknown") 31 mapper.FieldByName(reflect.ValueOf(""), "unknown") 32 }) 33 require.Panics(t, func() { 34 mapper.FieldByName(v, "unknown") 35 }) 36 37 // FieldByIndexesReadOnly will not initialise the field even if it's nil 38 { 39 fv := mapper.FieldByIndexesReadOnly(v, []int{0}) 40 require.Equal(t, reflect.String, fv.Kind()) 41 require.Equal(t, "John", fv.Interface().(string)) 42 43 fv = mapper.FieldByIndexesReadOnly(v, []int{2}) 44 require.Nil(t, fv.Interface()) 45 46 require.Panics(t, func() { 47 mapper.FieldByIndexesReadOnly(v, []int{1000000}) 48 }) 49 } 50 51 // FieldByIndexes will initialise if the field is nil 52 { 53 fv := mapper.FieldByIndexes(v, []int{2}) 54 require.NotNil(t, fv.Interface()) 55 require.Equal(t, "", fv.Elem().Interface().(string)) 56 57 require.Panics(t, func() { 58 mapper.FieldByIndexes(v, []int{1000000}) 59 }) 60 } 61 62 { 63 fv, ok := mapper.LookUpFieldByName(v, "name") 64 require.True(t, ok) 65 require.Equal(t, "John", fv.Interface().(string)) 66 67 fv, ok = mapper.LookUpFieldByName(v, "unknown") 68 require.False(t, ok) 69 require.Equal(t, v.Elem(), fv) 70 } 71 72 codec := mapper.CodecByType(v.Type()) 73 74 // lookup an existed field 75 { 76 _, ok = codec.LookUpFieldByName("name") 77 require.True(t, ok) 78 } 79 80 // lookup unexists field 81 { 82 _, ok = codec.LookUpFieldByName("Unknown") 83 require.False(t, ok) 84 } 85 86 // lookup private field 87 { 88 _, ok = codec.LookUpFieldByName("skip") 89 require.False(t, ok) 90 } 91 92 }