map_elem_eface_test.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package tests
  2. import (
  3. "github.com/modern-go/reflect2"
  4. "github.com/modern-go/test/must"
  5. "testing"
  6. "context"
  7. "github.com/modern-go/test"
  8. )
  9. func Test_map_elem_eface(t *testing.T) {
  10. var pInt = func(val int) *int {
  11. return &val
  12. }
  13. t.Run("SetIndex", testOp(func(api reflect2.API) interface{} {
  14. obj := map[int]interface{}{}
  15. valType := api.TypeOf(obj).(reflect2.MapType)
  16. elem1 := interface{}(4)
  17. valType.SetIndex(&obj, pInt(2), &elem1)
  18. elem2 := interface{}(nil)
  19. valType.SetIndex(&obj, pInt(3), &elem2)
  20. return obj
  21. }))
  22. t.Run("GetIndex", testOp(func(api reflect2.API) interface{} {
  23. obj := map[int]interface{}{3: 9, 2: nil}
  24. valType := api.TypeOf(obj).(reflect2.MapType)
  25. return []interface{}{
  26. valType.GetIndex(&obj, pInt(3)),
  27. valType.GetIndex(&obj, pInt(2)),
  28. valType.GetIndex(&obj, pInt(0)),
  29. }
  30. }))
  31. t.Run("TryGetIndex", test.Case(func(ctx context.Context) {
  32. obj := map[int]interface{}{3: 9, 2: nil}
  33. valType := reflect2.TypeOf(obj).(reflect2.MapType)
  34. elem, found := valType.TryGetIndex(&obj, pInt(3))
  35. must.Equal(9, *elem.(*interface{}))
  36. must.Pass(found)
  37. elem, found = valType.TryGetIndex(&obj, pInt(2))
  38. must.Nil(*elem.(*interface{}))
  39. must.Pass(found)
  40. elem, found = valType.TryGetIndex(&obj, pInt(0))
  41. must.Nil(elem)
  42. must.Pass(!found)
  43. }))
  44. t.Run("Iterate", testOp(func(api reflect2.API) interface{} {
  45. obj := map[int]interface{}{2: 4}
  46. valType := api.TypeOf(obj).(reflect2.MapType)
  47. iter := valType.Iterate(&obj)
  48. must.Pass(iter.HasNext(), "api", api)
  49. key1, elem1 := iter.Next()
  50. must.Pass(!iter.HasNext(), "api", api)
  51. return []interface{}{key1, elem1}
  52. }))
  53. }