changes_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package aggregator
  2. import (
  3. "reflect"
  4. "testing"
  5. "time"
  6. )
  7. func TestChangesAggregator_Value(t *testing.T) {
  8. time1 := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC)
  9. time2 := time.Date(1, 1, 1, 0, 1, 0, 0, time.UTC)
  10. time3 := time.Date(1, 1, 1, 0, 2, 0, 0, time.UTC)
  11. time4 := time.Date(1, 1, 1, 0, 3, 0, 0, time.UTC)
  12. type update struct {
  13. value float64
  14. timestamp time.Time
  15. }
  16. tests := map[string]struct {
  17. updates []update
  18. want []MetricValue
  19. }{
  20. "no update": {
  21. updates: []update{},
  22. want: []MetricValue{{Value: 0}},
  23. },
  24. "single sample is zero changes": {
  25. updates: []update{{value: 13, timestamp: time1}},
  26. want: []MetricValue{{Value: 0}},
  27. },
  28. "constant value is zero changes": {
  29. updates: []update{
  30. {value: 0, timestamp: time1},
  31. {value: 0, timestamp: time2},
  32. {value: 0, timestamp: time3},
  33. },
  34. want: []MetricValue{{Value: 0}},
  35. },
  36. "each transition counts": {
  37. updates: []update{
  38. {value: 0, timestamp: time1},
  39. {value: 13, timestamp: time2},
  40. {value: 13, timestamp: time3},
  41. {value: 31, timestamp: time4},
  42. },
  43. want: []MetricValue{{Value: 2}},
  44. },
  45. "out of order updates are ignored": {
  46. updates: []update{
  47. {value: 0, timestamp: time2},
  48. {value: 13, timestamp: time1},
  49. },
  50. want: []MetricValue{{Value: 0}},
  51. },
  52. "duplicate timestamp is ignored": {
  53. updates: []update{
  54. {value: 0, timestamp: time1},
  55. {value: 13, timestamp: time1},
  56. },
  57. want: []MetricValue{{Value: 0}},
  58. },
  59. }
  60. for name, tt := range tests {
  61. t.Run(name, func(t *testing.T) {
  62. agg := Changes([]string{})
  63. for _, u := range tt.updates {
  64. agg.Update(u.value, u.timestamp, nil)
  65. }
  66. if got := agg.Value(); !reflect.DeepEqual(got, tt.want) {
  67. t.Errorf("Value() = %v, want %v", got, tt.want)
  68. }
  69. })
  70. }
  71. }