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  }