assign_test.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package xreflect_test
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/require"
  5. "github.com/ydb-platform/ydb/library/go/x/xreflect"
  6. )
  7. type Foo struct {
  8. S string
  9. }
  10. var _ InterfaceFoo = &Foo{}
  11. func (f *Foo) FuncFoo() {}
  12. type InterfaceFoo interface {
  13. FuncFoo()
  14. }
  15. type Bar struct {
  16. I int
  17. }
  18. var _ InterfaceBar = &Bar{}
  19. func (f *Bar) FuncBar() {}
  20. type InterfaceBar interface {
  21. FuncBar()
  22. }
  23. func TestAssign(t *testing.T) {
  24. t.Run("ValueToValue", func(t *testing.T) {
  25. src := Foo{S: "S"}
  26. var dst Foo
  27. require.True(t, xreflect.Assign(src, &dst))
  28. require.Equal(t, src, dst)
  29. })
  30. t.Run("ValueToValueInvalid", func(t *testing.T) {
  31. src := Foo{S: "S"}
  32. var dst Bar
  33. require.False(t, xreflect.Assign(src, &dst))
  34. require.Equal(t, Bar{}, dst)
  35. })
  36. t.Run("ValueToInterface", func(t *testing.T) {
  37. src := Foo{S: "S"}
  38. var dst InterfaceFoo
  39. require.True(t, xreflect.Assign(&src, &dst))
  40. require.NotNil(t, dst)
  41. v, ok := dst.(*Foo)
  42. require.True(t, ok)
  43. require.Equal(t, &src, v)
  44. })
  45. t.Run("ValueToInterfaceInvalid", func(t *testing.T) {
  46. src := Bar{I: 42}
  47. var dst InterfaceFoo
  48. require.False(t, xreflect.Assign(&src, &dst))
  49. require.Nil(t, dst)
  50. })
  51. t.Run("InterfaceToInterface", func(t *testing.T) {
  52. src := InterfaceFoo(&Foo{S: "S"})
  53. var dst InterfaceFoo
  54. require.True(t, xreflect.Assign(src, &dst))
  55. require.NotNil(t, dst)
  56. require.Equal(t, src, dst)
  57. v, ok := dst.(*Foo)
  58. require.True(t, ok)
  59. require.Equal(t, src, v)
  60. })
  61. t.Run("InterfaceToInterfaceInvalid", func(t *testing.T) {
  62. src := InterfaceFoo(&Foo{S: "S"})
  63. var dst InterfaceBar
  64. require.False(t, xreflect.Assign(src, &dst))
  65. require.Nil(t, dst)
  66. })
  67. }