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 }
187 }
189 func ts(hour, min, sec int) sysdb.Time {
190 return sysdb.Time(time.Date(2016, 1, 1, hour, min, sec, 0, time.UTC))
191 }
193 // vim: set tw=78 sw=4 sw=4 noexpandtab :