github.com/go-spring/spring-base@v1.1.3/util/value_test.go (about)

     1  /*
     2   * Copyright 2012-2019 the original author or authors.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *      https://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package util_test
    18  
    19  import (
    20  	"reflect"
    21  	"testing"
    22  
    23  	"github.com/go-spring/spring-base/assert"
    24  	"github.com/go-spring/spring-base/util"
    25  	"github.com/go-spring/spring-base/util/testdata"
    26  )
    27  
    28  func TestPatchValue(t *testing.T) {
    29  	var r struct{ v int }
    30  	v := reflect.ValueOf(&r)
    31  	v = v.Elem().Field(0)
    32  	assert.Panic(t, func() {
    33  		v.SetInt(4)
    34  	}, "using value obtained using unexported field")
    35  	v = util.PatchValue(v)
    36  	v.SetInt(4)
    37  }
    38  
    39  func TestIndirect(t *testing.T) {
    40  	var r struct{ v int }
    41  	typ := reflect.TypeOf(r)
    42  	assert.Equal(t, util.Indirect(typ), reflect.TypeOf(r))
    43  	typ = reflect.TypeOf(&r)
    44  	assert.Equal(t, util.Indirect(typ), reflect.TypeOf(r))
    45  }
    46  
    47  func fnNoArgs() {}
    48  
    49  func fnWithArgs(i int) {}
    50  
    51  type receiver struct{}
    52  
    53  func (r receiver) fnNoArgs() {}
    54  
    55  func (r receiver) fnWithArgs(i int) {}
    56  
    57  func (r *receiver) ptrFnNoArgs() {}
    58  
    59  func (r *receiver) ptrFnWithArgs(i int) {}
    60  
    61  func TestFileLine(t *testing.T) {
    62  	offset := 62
    63  	testcases := []struct {
    64  		fn     interface{}
    65  		file   string
    66  		line   int
    67  		fnName string
    68  	}{
    69  		{
    70  			fn:     fnNoArgs,
    71  			file:   "spring-base/util/value_test.go",
    72  			line:   offset - 15,
    73  			fnName: "fnNoArgs",
    74  		},
    75  		{
    76  			fnWithArgs,
    77  			"spring-base/util/value_test.go",
    78  			offset - 13,
    79  			"fnWithArgs",
    80  		},
    81  		{
    82  			receiver{}.fnNoArgs,
    83  			"spring-base/util/value_test.go",
    84  			offset - 9,
    85  			"receiver.fnNoArgs",
    86  		},
    87  		{
    88  			receiver.fnNoArgs,
    89  			"spring-base/util/value_test.go",
    90  			offset - 9,
    91  			"receiver.fnNoArgs",
    92  		},
    93  		{
    94  			receiver{}.fnWithArgs,
    95  			"spring-base/util/value_test.go",
    96  			offset - 7,
    97  			"receiver.fnWithArgs",
    98  		},
    99  		{
   100  			receiver.fnWithArgs,
   101  			"spring-base/util/value_test.go",
   102  			offset - 7,
   103  			"receiver.fnWithArgs",
   104  		},
   105  		{
   106  			(&receiver{}).ptrFnNoArgs,
   107  			"spring-base/util/value_test.go",
   108  			offset - 5,
   109  			"(*receiver).ptrFnNoArgs",
   110  		},
   111  		{
   112  			(*receiver).ptrFnNoArgs,
   113  			"spring-base/util/value_test.go",
   114  			offset - 5,
   115  			"(*receiver).ptrFnNoArgs",
   116  		},
   117  		{
   118  			(&receiver{}).ptrFnWithArgs,
   119  			"spring-base/util/value_test.go",
   120  			offset - 3,
   121  			"(*receiver).ptrFnWithArgs",
   122  		},
   123  		{
   124  			(*receiver).ptrFnWithArgs,
   125  			"spring-base/util/value_test.go",
   126  			offset - 3,
   127  			"(*receiver).ptrFnWithArgs",
   128  		},
   129  		{
   130  			testdata.FnNoArgs,
   131  			"spring-base/util/testdata/pkg.go",
   132  			19,
   133  			"FnNoArgs",
   134  		},
   135  		{
   136  			testdata.FnWithArgs,
   137  			"spring-base/util/testdata/pkg.go",
   138  			21,
   139  			"FnWithArgs",
   140  		},
   141  		{
   142  			testdata.Receiver{}.FnNoArgs,
   143  			"spring-base/util/testdata/pkg.go",
   144  			25,
   145  			"Receiver.FnNoArgs",
   146  		},
   147  		{
   148  			testdata.Receiver{}.FnWithArgs,
   149  			"spring-base/util/testdata/pkg.go",
   150  			27,
   151  			"Receiver.FnWithArgs",
   152  		},
   153  		{
   154  			(&testdata.Receiver{}).PtrFnNoArgs,
   155  			"spring-base/util/testdata/pkg.go",
   156  			29,
   157  			"(*Receiver).PtrFnNoArgs",
   158  		},
   159  		{
   160  			(&testdata.Receiver{}).PtrFnWithArgs,
   161  			"spring-base/util/testdata/pkg.go",
   162  			31,
   163  			"(*Receiver).PtrFnWithArgs",
   164  		},
   165  		{
   166  			testdata.Receiver.FnNoArgs,
   167  			"spring-base/util/testdata/pkg.go",
   168  			25,
   169  			"Receiver.FnNoArgs",
   170  		},
   171  		{
   172  			testdata.Receiver.FnWithArgs,
   173  			"spring-base/util/testdata/pkg.go",
   174  			27,
   175  			"Receiver.FnWithArgs",
   176  		},
   177  		{
   178  			(*testdata.Receiver).PtrFnNoArgs,
   179  			"spring-base/util/testdata/pkg.go",
   180  			29,
   181  			"(*Receiver).PtrFnNoArgs",
   182  		},
   183  		{
   184  			(*testdata.Receiver).PtrFnWithArgs,
   185  			"spring-base/util/testdata/pkg.go",
   186  			31,
   187  			"(*Receiver).PtrFnWithArgs",
   188  		},
   189  	}
   190  	for _, c := range testcases {
   191  		file, line, fnName := util.FileLine(c.fn)
   192  		assert.String(t, file).HasSuffix(c.file)
   193  		assert.Equal(t, line, c.line)
   194  		assert.Equal(t, fnName, c.fnName)
   195  	}
   196  }