helper_test.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a MIT license found in the LICENSE file.
  3. package codec
  4. // All non-std package dependencies related to testing live in this file,
  5. // so porting to different environment is easy (just update functions).
  6. import (
  7. "errors"
  8. "reflect"
  9. )
  10. // --- these functions are used by both benchmarks and tests
  11. func deepEqual(v1, v2 interface{}) (err error) {
  12. if !reflect.DeepEqual(v1, v2) {
  13. err = errors.New("Not Match")
  14. }
  15. return
  16. }
  17. func approxDataSize(rv reflect.Value) (sum int) {
  18. switch rk := rv.Kind(); rk {
  19. case reflect.Invalid:
  20. case reflect.Ptr, reflect.Interface:
  21. sum += int(rv.Type().Size())
  22. sum += approxDataSize(rv.Elem())
  23. case reflect.Slice:
  24. sum += int(rv.Type().Size())
  25. for j := 0; j < rv.Len(); j++ {
  26. sum += approxDataSize(rv.Index(j))
  27. }
  28. case reflect.String:
  29. sum += int(rv.Type().Size())
  30. sum += rv.Len()
  31. case reflect.Map:
  32. sum += int(rv.Type().Size())
  33. for _, mk := range rv.MapKeys() {
  34. sum += approxDataSize(mk)
  35. sum += approxDataSize(rv.MapIndex(mk))
  36. }
  37. case reflect.Struct:
  38. //struct size already includes the full data size.
  39. //sum += int(rv.Type().Size())
  40. for j := 0; j < rv.NumField(); j++ {
  41. sum += approxDataSize(rv.Field(j))
  42. }
  43. default:
  44. //pure value types
  45. sum += int(rv.Type().Size())
  46. }
  47. return
  48. }