github.com/sohaha/zlsgo@v1.7.13-0.20240501141223-10dd1a906f76/zdi/inject_test.go (about)

     1  package zdi_test
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/sohaha/zlsgo"
     9  	"github.com/sohaha/zlsgo/zdi"
    10  	"github.com/sohaha/zlsgo/ztime"
    11  )
    12  
    13  type testSt2 struct {
    14  	Name string
    15  }
    16  
    17  func (t *testSt2) String() string {
    18  	return t.Name
    19  }
    20  
    21  type Itest interface {
    22  	String() string
    23  }
    24  
    25  func TestInterfaceOf(t *testing.T) {
    26  	tt := zlsgo.NewTest(t)
    27  	di := zdi.New()
    28  
    29  	val := time.Now()
    30  	_ = di.Map(val)
    31  
    32  	ok := "is ok"
    33  	invoke, err := di.Invoke(func(s Itest) string {
    34  		tt.Equal(s.String(), val.String())
    35  		return ok
    36  	})
    37  	tt.NoError(err)
    38  	tt.Equal(ok, invoke[0].String())
    39  
    40  	val2 := &testSt2{Name: "val"}
    41  	o := di.Map(val2, zdi.WithInterface((*Itest)(nil)))
    42  	tt.EqualNil(o)
    43  
    44  	invoke, err = di.Invoke(func(s Itest) string {
    45  		tt.Equal(s.String(), "val")
    46  		return ok
    47  	})
    48  	tt.NoError(err)
    49  	tt.Equal(ok, invoke[0].String())
    50  
    51  	_, err = di.Invoke(func(s Itest, t time.Time) string {
    52  		tt.Equal(s.String(), "val")
    53  		tt.Equal(t.String(), val.String())
    54  		return ok
    55  	})
    56  	tt.NoError(err)
    57  
    58  	invoke, err = di.Invoke(func(t time.Time) string {
    59  		return ok
    60  	})
    61  	tt.NoError(err)
    62  	tt.Equal(ok, invoke[0].String())
    63  }
    64  
    65  func TestInvoke(t *testing.T) {
    66  	tt := zlsgo.NewTest(t)
    67  	di := zdi.New()
    68  
    69  	test := &testSt{Msg: ztime.Now(), Num: 666}
    70  	_ = di.Map(test)
    71  
    72  	ok := "is ok"
    73  	invoke, err := di.Invoke(func(s *testSt) string {
    74  		tt.Equal(s, test)
    75  		return ok
    76  	})
    77  	tt.NoError(err)
    78  	tt.Equal(ok, invoke[0].String())
    79  
    80  	invoke, err = di.Invoke(func(s testSt) string {
    81  		tt.Equal(s, test)
    82  		return ok
    83  	})
    84  	tt.EqualTrue(err != nil)
    85  	t.Log(err, invoke)
    86  
    87  	test2 := testSt{Msg: ztime.Now(), Num: 666}
    88  	_ = di.Map(test2)
    89  	invoke, err = di.Invoke(func(s testSt, rs *testSt) int64 {
    90  		tt.Equal(s, test2)
    91  		tt.Equal(rs, test)
    92  		return 18
    93  	})
    94  	tt.NoError(err)
    95  	tt.Equal(int64(18), int64(invoke[0].Int()))
    96  }
    97  
    98  func TestInvokeWithErrorOnly(t *testing.T) {
    99  	tt := zlsgo.NewTest(t)
   100  	di := zdi.New()
   101  
   102  	test := &testSt{Msg: ztime.Now(), Num: 666}
   103  	_ = di.Map(test)
   104  
   105  	{
   106  		err := di.InvokeWithErrorOnly(func(s *testSt) {})
   107  		tt.NoError(err)
   108  	}
   109  
   110  	{
   111  		err := di.InvokeWithErrorOnly(func(s *testSt) error {
   112  			return nil
   113  		})
   114  		tt.NoError(err)
   115  	}
   116  
   117  	{
   118  		err := di.InvokeWithErrorOnly(func(s *testSt) error {
   119  			return errors.New("test error")
   120  		})
   121  		tt.Equal("test error", err.Error())
   122  	}
   123  
   124  	{
   125  		err := di.InvokeWithErrorOnly(func(s *testSt) error {
   126  			panic("test panic")
   127  			return nil
   128  		})
   129  		tt.Equal("test panic", err.Error())
   130  	}
   131  
   132  	{
   133  		err := di.InvokeWithErrorOnly(func(s *testSt) (int, error) {
   134  			return 0, errors.New("test error")
   135  		})
   136  		tt.Equal("test error", err.Error())
   137  	}
   138  }