Code

graph: Align time-series before grouping them.
[sysdb/webui.git] / graph / graph_test.go
1 //
2 // Copyright (C) 2016 Sebastian 'tokkee' Harl <sh@tokkee.org>
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions
7 // are met:
8 // 1. Redistributions of source code must retain the above copyright
9 //    notice, this list of conditions and the following disclaimer.
10 // 2. Redistributions in binary form must reproduce the above copyright
11 //    notice, this list of conditions and the following disclaimer in the
12 //    documentation and/or other materials provided with the distribution.
13 //
14 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 // ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
16 // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
18 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 package graph
28 import (
29         "reflect"
30         "testing"
31         "time"
33         "github.com/sysdb/go/sysdb"
34 )
36 func TestAlign(t *testing.T) {
37         for _, test := range []struct {
38                 ts1, ts2 *sysdb.Timeseries
39                 want     *sysdb.Timeseries
40         }{
41                 {
42                         ts1: &sysdb.Timeseries{
43                                 Start: ts(4, 5, 0),
44                                 End:   ts(4, 10, 0),
45                                 Data: map[string][]sysdb.DataPoint{
46                                         "value": []sysdb.DataPoint{
47                                                 {ts(4, 5, 0), 0.0},
48                                                 {ts(4, 6, 0), 0.0},
49                                                 {ts(4, 7, 0), 1.0},
50                                                 {ts(4, 8, 0), 1.0},
51                                                 {ts(4, 9, 0), 0.0},
52                                                 {ts(4, 10, 0), 0.0},
53                                         },
54                                 },
55                         },
56                         ts2: &sysdb.Timeseries{
57                                 Start: ts(4, 7, 0),
58                                 End:   ts(4, 8, 0),
59                                 Data: map[string][]sysdb.DataPoint{
60                                         "value": []sysdb.DataPoint{
61                                                 {ts(4, 7, 0), 1.0},
62                                                 {ts(4, 8, 0), 1.0},
63                                         },
64                                 },
65                         },
66                         want: &sysdb.Timeseries{
67                                 Start: ts(4, 7, 0),
68                                 End:   ts(4, 8, 0),
69                                 Data: map[string][]sysdb.DataPoint{
70                                         "value": []sysdb.DataPoint{
71                                                 {ts(4, 7, 0), 1.0},
72                                                 {ts(4, 8, 0), 1.0},
73                                         },
74                                 },
75                         },
76                 },
77                 {
78                         ts1: &sysdb.Timeseries{
79                                 Start: ts(4, 7, 0),
80                                 End:   ts(4, 8, 0),
81                                 Data: map[string][]sysdb.DataPoint{
82                                         "value": []sysdb.DataPoint{
83                                                 {ts(4, 7, 0), 1.0},
84                                                 {ts(4, 8, 0), 1.0},
85                                         },
86                                 },
87                         },
88                         ts2: &sysdb.Timeseries{
89                                 Start: ts(4, 7, 0),
90                                 End:   ts(4, 8, 0),
91                                 Data: map[string][]sysdb.DataPoint{
92                                         "value": []sysdb.DataPoint{
93                                                 {ts(4, 7, 0), 1.0},
94                                                 {ts(4, 8, 0), 1.0},
95                                         },
96                                 },
97                         },
98                         want: &sysdb.Timeseries{
99                                 Start: ts(4, 7, 0),
100                                 End:   ts(4, 8, 0),
101                                 Data: map[string][]sysdb.DataPoint{
102                                         "value": []sysdb.DataPoint{
103                                                 {ts(4, 7, 0), 1.0},
104                                                 {ts(4, 8, 0), 1.0},
105                                         },
106                                 },
107                         },
108                 },
109                 {
110                         ts1: &sysdb.Timeseries{
111                                 Start: ts(4, 5, 0),
112                                 End:   ts(4, 10, 0),
113                                 Data: map[string][]sysdb.DataPoint{
114                                         "value": []sysdb.DataPoint{
115                                                 {ts(4, 5, 0), 0.0},
116                                                 {ts(4, 6, 0), 0.0},
117                                                 {ts(4, 7, 0), 0.0},
118                                                 {ts(4, 8, 0), 1.0},
119                                                 {ts(4, 9, 0), 1.0},
120                                                 {ts(4, 10, 0), 1.0},
121                                         },
122                                 },
123                         },
124                         ts2: &sysdb.Timeseries{
125                                 Start: ts(4, 8, 0),
126                                 End:   ts(4, 12, 0),
127                                 Data: map[string][]sysdb.DataPoint{
128                                         "value": []sysdb.DataPoint{
129                                                 {ts(4, 8, 0), 1.0},
130                                                 {ts(4, 9, 0), 1.0},
131                                                 {ts(4, 10, 0), 1.0},
132                                                 {ts(4, 11, 0), 0.0},
133                                                 {ts(4, 12, 0), 0.0},
134                                         },
135                                 },
136                         },
137                         want: &sysdb.Timeseries{
138                                 Start: ts(4, 8, 0),
139                                 End:   ts(4, 10, 0),
140                                 Data: map[string][]sysdb.DataPoint{
141                                         "value": []sysdb.DataPoint{
142                                                 {ts(4, 8, 0), 1.0},
143                                                 {ts(4, 9, 0), 1.0},
144                                                 {ts(4, 10, 0), 1.0},
145                                         },
146                                 },
147                         },
148                 },
149                 {
150                         ts1: &sysdb.Timeseries{
151                                 Start: ts(4, 7, 0),
152                                 End:   ts(4, 7, 0),
153                                 Data: map[string][]sysdb.DataPoint{
154                                         "value": []sysdb.DataPoint{
155                                                 {ts(4, 7, 0), 1.0},
156                                         },
157                                 },
158                         },
159                         ts2: &sysdb.Timeseries{
160                                 Start: ts(4, 7, 0),
161                                 End:   ts(4, 7, 0),
162                                 Data: map[string][]sysdb.DataPoint{
163                                         "value": []sysdb.DataPoint{
164                                                 {ts(4, 7, 0), 1.0},
165                                         },
166                                 },
167                         },
168                         want: &sysdb.Timeseries{
169                                 Start: ts(4, 7, 0),
170                                 End:   ts(4, 7, 0),
171                                 Data: map[string][]sysdb.DataPoint{
172                                         "value": []sysdb.DataPoint{
173                                                 {ts(4, 7, 0), 1.0},
174                                         },
175                                 },
176                         },
177                 },
178         } {
179                 if err := align(test.ts1, test.ts2); err != nil {
180                         t.Errorf("align(%v, %v) = %v; want <nil>", test.ts1, test.ts2, err)
181                 }
183                 if !reflect.DeepEqual(test.ts1, test.want) || !reflect.DeepEqual(test.ts2, test.want) {
184                         t.Errorf("align() unexpected result %v, %v; want %v", test.ts1, test.ts2, test.want)
185                 }
186         }
189 func ts(hour, min, sec int) sysdb.Time {
190         return sysdb.Time(time.Date(2016, 1, 1, hour, min, sec, 0, time.UTC))
193 // vim: set tw=78 sw=4 sw=4 noexpandtab :