blob: ea83fa37a829760874ab118b7d0aae55b9da03b9 [file] [log] [blame]
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001package db
2
3import (
Philipp Schrader83fc2722022-03-10 21:59:20 -08004 "fmt"
Philipp Schrader7365d322022-03-06 16:40:08 -08005 "log"
Philipp Schrader4953cc32022-02-25 18:09:02 -08006 "os"
Philipp Schrader7365d322022-03-06 16:40:08 -08007 "os/exec"
Sabina Leaverc5fd2772022-01-29 17:00:23 -08008 "reflect"
9 "testing"
Philipp Schrader7365d322022-03-06 16:40:08 -080010 "time"
Philipp Schradereecb8962022-06-01 21:02:42 -070011
12 "github.com/davecgh/go-spew/spew"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080013)
14
Philipp Schrader83fc2722022-03-10 21:59:20 -080015// Shortcut for error checking. If the specified error is non-nil, print the
16// error message and exit the test.
17func check(t *testing.T, err error, message string) {
18 if err != nil {
19 t.Fatal(message, ":", err)
20 }
21}
22
Philipp Schrader7365d322022-03-06 16:40:08 -080023type dbFixture struct {
24 db *Database
25 server *exec.Cmd
26}
27
28func (fixture dbFixture) TearDown() {
29 fixture.db.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -080030 log.Println("Shutting down testdb")
31 fixture.server.Process.Signal(os.Interrupt)
32 fixture.server.Process.Wait()
33 log.Println("Successfully shut down testdb")
34}
35
36func createDatabase(t *testing.T) dbFixture {
37 var fixture dbFixture
38
39 log.Println("Starting up postgres.")
40 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
41 fixture.server.Stdout = os.Stdout
42 fixture.server.Stderr = os.Stderr
43 err := fixture.server.Start()
44 check(t, err, "Failed to run postgres")
45
46 // Wait until the server is ready. We cannot rely on the TCP socket
47 // alone because postgres creates the socket before it's actually ready
48 // to service requests.
49 for {
50 fixture.db, err = NewDatabase("test", "password", 5432)
51 if err == nil {
52 break
53 }
54 time.Sleep(50 * time.Millisecond)
55 }
56 log.Println("Connected to postgres.")
57
Philipp Schradereecb8962022-06-01 21:02:42 -070058 fixture.db.SetDebugLogLevel()
59
Philipp Schrader7365d322022-03-06 16:40:08 -080060 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080061}
62
Philipp Schradereecb8962022-06-01 21:02:42 -070063func checkDeepEqual(t *testing.T, expected interface{}, actual interface{}) {
64 if !reflect.DeepEqual(expected, actual) {
65 t.Fatalf(spew.Sprintf("Got %#v,\nbut expected %#v.", actual, expected))
66 }
67}
68
Philipp Schrader4953cc32022-02-25 18:09:02 -080069func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080070 fixture := createDatabase(t)
71 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080072
Emily Markovabf24c9e2023-02-08 20:31:11 -080073 correct := []TeamMatch{
74 TeamMatch{
75 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070076 Alliance: "R", AlliancePosition: 1, TeamNumber: "9999",
Emily Markovabf24c9e2023-02-08 20:31:11 -080077 },
78 TeamMatch{
79 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070080 Alliance: "R", AlliancePosition: 2, TeamNumber: "1000",
Emily Markovabf24c9e2023-02-08 20:31:11 -080081 },
82 TeamMatch{
83 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070084 Alliance: "R", AlliancePosition: 3, TeamNumber: "777",
Emily Markovabf24c9e2023-02-08 20:31:11 -080085 },
86 TeamMatch{
87 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070088 Alliance: "B", AlliancePosition: 1, TeamNumber: "0000",
Emily Markovabf24c9e2023-02-08 20:31:11 -080089 },
90 TeamMatch{
91 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070092 Alliance: "B", AlliancePosition: 2, TeamNumber: "4321",
Emily Markovabf24c9e2023-02-08 20:31:11 -080093 },
94 TeamMatch{
95 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070096 Alliance: "B", AlliancePosition: 3, TeamNumber: "1234",
Philipp Schrader83fc2722022-03-10 21:59:20 -080097 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -080098 }
Philipp Schrader83fc2722022-03-10 21:59:20 -080099
Emily Markovabf24c9e2023-02-08 20:31:11 -0800100 for _, match := range correct {
101 err := fixture.db.AddToMatch(match)
102 check(t, err, "Failed to add match data")
103 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800104
Philipp Schrader7365d322022-03-06 16:40:08 -0800105 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800106 check(t, err, "Failed ReturnMatches()")
107
Philipp Schradereecb8962022-06-01 21:02:42 -0700108 checkDeepEqual(t, correct, got)
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800109}
110
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700111func TestAddOrUpdateRankingsDB(t *testing.T) {
112 fixture := createDatabase(t)
113 defer fixture.TearDown()
114
115 correct := []Ranking{
116 Ranking{
117 TeamNumber: 123,
118 Losses: 1, Wins: 7, Ties: 0,
119 Rank: 2, Dq: 0,
120 },
121 Ranking{
122 TeamNumber: 125,
123 Losses: 2, Wins: 4, Ties: 0,
124 Rank: 2, Dq: 0,
125 },
126 }
127
128 for i := 0; i < len(correct); i++ {
129 err := fixture.db.AddOrUpdateRankings(correct[i])
130 check(t, err, "Failed to add ranking data")
131 }
132
133 got, err := fixture.db.ReturnRankings()
134 check(t, err, "Failed ReturnRankings()")
135
136 if !reflect.DeepEqual(correct, got) {
137 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
138 }
139}
140
Emily Markova290147d2023-03-03 22:40:06 -0800141func TestAddToStats2023DB(t *testing.T) {
142 fixture := createDatabase(t)
143 defer fixture.TearDown()
144
145 correct := []Stats2023{
146 Stats2023{
147 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
148 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
149 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
150 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
151 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
152 HighCubes: 1, CubesDropped: 0, LowCones: 0,
153 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700154 AvgCycle: 0, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700155 BalanceAttemptAuto: false, Docked: false, Engaged: false,
156 BalanceAttempt: false, CollectedBy: "emma",
Emily Markova290147d2023-03-03 22:40:06 -0800157 },
158 Stats2023{
159 TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
160 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
161 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
162 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
163 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
164 HighCubes: 0, CubesDropped: 1, LowCones: 0,
165 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700166 AvgCycle: 0, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700167 BalanceAttemptAuto: true, Docked: true, Engaged: true,
168 BalanceAttempt: false, CollectedBy: "tyler",
Emily Markova290147d2023-03-03 22:40:06 -0800169 },
170 Stats2023{
171 TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
172 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
173 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
174 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
175 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
176 HighCubes: 2, CubesDropped: 1, LowCones: 1,
177 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700178 AvgCycle: 0, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700179 BalanceAttemptAuto: false, Docked: false, Engaged: false,
180 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800181 },
182 Stats2023{
183 TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
184 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
185 MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
186 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
187 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 1,
188 HighCubes: 2, CubesDropped: 1, LowCones: 0,
189 MiddleCones: 1, HighCones: 0, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700190 AvgCycle: 0, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700191 BalanceAttemptAuto: true, Docked: false, Engaged: false,
192 BalanceAttempt: true, CollectedBy: "will",
Emily Markova290147d2023-03-03 22:40:06 -0800193 },
194 Stats2023{
195 TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
196 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
197 MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
198 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
199 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
200 HighCubes: 0, CubesDropped: 2, LowCones: 1,
201 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700202 AvgCycle: 0, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700203 BalanceAttemptAuto: false, Docked: true, Engaged: false,
204 BalanceAttempt: false, CollectedBy: "unkown",
Emily Markova290147d2023-03-03 22:40:06 -0800205 },
206 }
207
208 matches := []TeamMatch{
209 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700210 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Emily Markova290147d2023-03-03 22:40:06 -0800211 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700212 Alliance: "R", AlliancePosition: 2, TeamNumber: "7454"},
Emily Markova290147d2023-03-03 22:40:06 -0800213 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700214 Alliance: "R", AlliancePosition: 3, TeamNumber: "4354"},
Emily Markova290147d2023-03-03 22:40:06 -0800215 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700216 Alliance: "B", AlliancePosition: 1, TeamNumber: "6533"},
Emily Markova290147d2023-03-03 22:40:06 -0800217 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700218 Alliance: "B", AlliancePosition: 2, TeamNumber: "8354"},
Emily Markova290147d2023-03-03 22:40:06 -0800219 }
220
221 for _, match := range matches {
222 err := fixture.db.AddToMatch(match)
223 check(t, err, "Failed to add match")
224 }
225
226 for i := 0; i < len(correct); i++ {
227 err := fixture.db.AddToStats2023(correct[i])
228 check(t, err, "Failed to add 2023stats to DB")
229 }
230
231 got, err := fixture.db.ReturnStats2023()
232 check(t, err, "Failed ReturnStats2023()")
233
234 if !reflect.DeepEqual(correct, got) {
235 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
236 }
237}
238
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800239func TestQueryingStats2023ByTeam(t *testing.T) {
240 fixture := createDatabase(t)
241 defer fixture.TearDown()
242
243 stats := []Stats2023{
244 Stats2023{
245 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
246 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
247 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
248 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
249 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
250 HighCubes: 1, CubesDropped: 0, LowCones: 0,
251 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700252 AvgCycle: 0, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700253 BalanceAttemptAuto: false, Docked: false, Engaged: false,
254 BalanceAttempt: false, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800255 },
256 Stats2023{
257 TeamNumber: "7454", MatchNumber: 4, SetNumber: 1,
258 CompLevel: "qm", StartingQuadrant: 2, LowCubesAuto: 1,
259 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
260 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
261 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
262 HighCubes: 0, CubesDropped: 1, LowCones: 0,
263 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700264 AvgCycle: 0, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700265 BalanceAttemptAuto: true, Docked: false, Engaged: false,
266 BalanceAttempt: false, CollectedBy: "tyler",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800267 },
268 Stats2023{
269 TeamNumber: "6344", MatchNumber: 5, SetNumber: 1,
270 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
271 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
272 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
273 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
274 HighCubes: 1, CubesDropped: 0, LowCones: 0,
275 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700276 AvgCycle: 0, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700277 BalanceAttemptAuto: false, Docked: true, Engaged: false,
278 BalanceAttempt: true, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800279 },
280 }
281
282 matches := []TeamMatch{
283 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700284 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800285 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700286 Alliance: "R", AlliancePosition: 1, TeamNumber: "7454"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800287 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700288 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800289 }
290
291 for _, match := range matches {
292 err := fixture.db.AddToMatch(match)
293 check(t, err, "Failed to add match")
294 }
295
296 for i := range stats {
297 err := fixture.db.AddToStats2023(stats[i])
298 check(t, err, "Failed to add 2023stats to DB")
299 }
300
301 // Validate that requesting status for a single team gets us the
302 // expected data.
303 statsFor6344, err := fixture.db.ReturnStats2023ForTeam("6344", 3, 1, "qm")
304 check(t, err, "Failed ReturnStats2023()")
305
306 if !reflect.DeepEqual([]Stats2023{stats[0]}, statsFor6344) {
307 t.Errorf("Got %#v,\nbut expected %#v.", statsFor6344, stats[0])
308 }
309
310 // Validate that requesting team data for a non-existent match returns
311 // nothing.
312 statsForMissing, err := fixture.db.ReturnStats2023ForTeam("6344", 9, 1, "qm")
313 check(t, err, "Failed ReturnStats2023()")
314
315 if !reflect.DeepEqual([]Stats2023{}, statsForMissing) {
316 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2023{})
317 }
318}
319
Emily Markova6b551e02023-02-18 17:37:40 -0800320func TestDeleteFromStats(t *testing.T) {
321 fixture := createDatabase(t)
322 defer fixture.TearDown()
323
324 startingStats := []Stats2023{
325 Stats2023{
326 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
327 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
328 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
329 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
330 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
331 HighCubes: 2, CubesDropped: 1, LowCones: 1,
332 MiddleCones: 0, HighCones: 1, ConesDropped: 2,
Emily Markova46a69bf2023-03-22 20:45:52 -0700333 AvgCycle: 58, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700334 BalanceAttemptAuto: true, Docked: true, Engaged: true,
335 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova6b551e02023-02-18 17:37:40 -0800336 },
337 Stats2023{
338 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
339 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
340 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
341 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
342 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
343 HighCubes: 1, CubesDropped: 0, LowCones: 0,
344 MiddleCones: 2, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700345 AvgCycle: 34, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700346 BalanceAttemptAuto: false, Docked: true, Engaged: false,
347 BalanceAttempt: false, CollectedBy: "simon",
Emily Markova6b551e02023-02-18 17:37:40 -0800348 },
349 Stats2023{
350 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
351 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
352 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
353 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
354 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
355 HighCubes: 0, CubesDropped: 0, LowCones: 2,
356 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700357 AvgCycle: 50, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700358 BalanceAttemptAuto: true, Docked: false, Engaged: false,
359 BalanceAttempt: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800360 },
361 Stats2023{
362 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
363 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
364 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
365 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
366 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
367 HighCubes: 2, CubesDropped: 1, LowCones: 0,
368 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700369 AvgCycle: 49, DockedAuto: true, EngagedAuto: false,
370 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova6b551e02023-02-18 17:37:40 -0800371 },
372 Stats2023{
373 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
374 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
375 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
376 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
377 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
378 HighCubes: 0, CubesDropped: 0, LowCones: 1,
379 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700380 AvgCycle: 70, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700381 BalanceAttemptAuto: false, Docked: false, Engaged: false,
382 BalanceAttempt: true, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800383 },
384 }
385
386 correct := []Stats2023{
387 Stats2023{
388 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
389 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
390 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
391 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
392 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
393 HighCubes: 0, CubesDropped: 0, LowCones: 2,
394 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700395 AvgCycle: 50, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700396 BalanceAttemptAuto: true, Docked: false, Engaged: false,
397 BalanceAttempt: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800398 },
399 Stats2023{
400 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
401 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
402 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
403 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
404 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
405 HighCubes: 0, CubesDropped: 0, LowCones: 1,
406 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700407 AvgCycle: 70, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700408 BalanceAttemptAuto: false, Docked: false, Engaged: false,
409 BalanceAttempt: true, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800410 },
411 }
412
413 originalMatches := []TeamMatch{
414 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700415 Alliance: "R", AlliancePosition: 1, TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800416 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700417 Alliance: "B", AlliancePosition: 1, TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800418 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700419 Alliance: "R", AlliancePosition: 3, TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800420 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700421 Alliance: "B", AlliancePosition: 2, TeamNumber: "2454"},
Emily Markova6b551e02023-02-18 17:37:40 -0800422 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700423 Alliance: "B", AlliancePosition: 3, TeamNumber: "3242"},
Emily Markova6b551e02023-02-18 17:37:40 -0800424 }
425
426 // Matches for which we want to delete the stats.
427 matches := []TeamMatch{
428 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700429 TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800430 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700431 TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800432 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700433 TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800434 }
435
436 for _, match := range originalMatches {
437 err := fixture.db.AddToMatch(match)
438 check(t, err, "Failed to add match")
439 fmt.Println("Match has been added : ", match.TeamNumber)
440 }
441
442 for _, stat := range startingStats {
443 err := fixture.db.AddToStats2023(stat)
444 check(t, err, "Failed to add stat")
445 }
446
447 for _, match := range matches {
Emily Markovab8551572023-03-22 19:49:39 -0700448 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
Emily Markova6b551e02023-02-18 17:37:40 -0800449 check(t, err, "Failed to delete stat")
450 }
451
452 got, err := fixture.db.ReturnStats2023()
453 check(t, err, "Failed ReturnStats()")
454
455 if !reflect.DeepEqual(correct, got) {
456 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
457 }
458}
459
Milo Lina72e2002022-04-06 20:31:13 -0700460func TestQueryShiftDB(t *testing.T) {
461 fixture := createDatabase(t)
462 defer fixture.TearDown()
463
464 testDatabase := []Shift{
465 Shift{
466 MatchNumber: 1,
467 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
468 },
469 Shift{
470 MatchNumber: 2,
471 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
472 },
473 }
474
475 for i := 0; i < len(testDatabase); i++ {
476 err := fixture.db.AddToShift(testDatabase[i])
477 check(t, err, fmt.Sprint("Failed to add shift", i))
478 }
479
480 correct := []Shift{
481 Shift{
482 MatchNumber: 1,
483 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
484 },
485 }
486
487 got, err := fixture.db.QueryAllShifts(1)
488 check(t, err, "Failed to query shift for match 1")
489
490 if !reflect.DeepEqual(correct, got) {
491 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
492 }
493}
494
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700495func TestQueryRankingsDB(t *testing.T) {
496 fixture := createDatabase(t)
497 defer fixture.TearDown()
498
499 testDatabase := []Ranking{
500 Ranking{
501 TeamNumber: 123,
502 Losses: 1, Wins: 7, Ties: 2,
503 Rank: 2, Dq: 0,
504 },
505 Ranking{
506 TeamNumber: 124,
507 Losses: 3, Wins: 4, Ties: 0,
508 Rank: 4, Dq: 2,
509 },
510 Ranking{
511 TeamNumber: 125,
512 Losses: 5, Wins: 2, Ties: 0,
513 Rank: 17, Dq: 0,
514 },
515 Ranking{
516 TeamNumber: 126,
517 Losses: 0, Wins: 7, Ties: 0,
518 Rank: 5, Dq: 0,
519 },
520 }
521
522 for i := 0; i < len(testDatabase); i++ {
523 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
524 check(t, err, fmt.Sprint("Failed to add rankings ", i))
525 }
526
527 correct := []Ranking{
528 Ranking{
529 TeamNumber: 126,
530 Losses: 0, Wins: 7, Ties: 0,
531 Rank: 5, Dq: 0,
532 },
533 }
534
535 got, err := fixture.db.QueryRankings(126)
536 check(t, err, "Failed QueryRankings()")
537
538 if !reflect.DeepEqual(correct, got) {
539 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
540 }
541}
542
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800543func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800544 fixture := createDatabase(t)
545 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800546
Emily Markovabf24c9e2023-02-08 20:31:11 -0800547 correct := []TeamMatch{
548 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700549 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: "6835"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800550 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700551 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "4834"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800552 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700553 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "9824"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800554 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700555 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800556 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700557 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800558 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800559
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800560 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800561 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800562 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800563 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800564
Philipp Schrader7365d322022-03-06 16:40:08 -0800565 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800566 check(t, err, "Failed ReturnMatches()")
567
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800568 if !reflect.DeepEqual(correct, got) {
569 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
570 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800571}
572
Philipp Schraderfe583842022-04-08 19:47:07 -0700573func TestOverwriteNewMatchData(t *testing.T) {
574 fixture := createDatabase(t)
575 defer fixture.TearDown()
576
Emily Markovabf24c9e2023-02-08 20:31:11 -0800577 testDatabase := []TeamMatch{
578 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700579 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "4464"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800580 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700581 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800582 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700583 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700584 }
585
586 for i := 0; i < len(testDatabase); i++ {
587 err := fixture.db.AddToMatch(testDatabase[i])
588 check(t, err, fmt.Sprint("Failed to add match", i))
589 }
590
Emily Markovabf24c9e2023-02-08 20:31:11 -0800591 correct := []TeamMatch{
592 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700593 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800594 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700595 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700596 }
597
598 got, err := fixture.db.ReturnMatches()
599 check(t, err, "Failed to get match list")
600
601 if !reflect.DeepEqual(correct, got) {
602 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
603 }
604}
605
Milo Lina72e2002022-04-06 20:31:13 -0700606func TestAddReturnShiftDB(t *testing.T) {
607 fixture := createDatabase(t)
608 defer fixture.TearDown()
609
610 correct := []Shift{
611 Shift{
612 MatchNumber: 1,
613 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
614 },
615 Shift{
616 MatchNumber: 2,
617 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
618 },
619 }
620
621 for i := 0; i < len(correct); i++ {
622 err := fixture.db.AddToShift(correct[i])
623 check(t, err, fmt.Sprint("Failed to add shift", i))
624 }
625
626 got, err := fixture.db.ReturnAllShifts()
627 check(t, err, "Failed ReturnAllShifts()")
628
629 if !reflect.DeepEqual(correct, got) {
630 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
631 }
632}
633
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700634func TestReturnRankingsDB(t *testing.T) {
635 fixture := createDatabase(t)
636 defer fixture.TearDown()
637
638 correct := []Ranking{
639 Ranking{
640 TeamNumber: 123,
641 Losses: 1, Wins: 7, Ties: 2,
642 Rank: 2, Dq: 0,
643 },
644 Ranking{
645 TeamNumber: 124,
646 Losses: 3, Wins: 4, Ties: 0,
647 Rank: 4, Dq: 2,
648 },
649 Ranking{
650 TeamNumber: 125,
651 Losses: 5, Wins: 2, Ties: 0,
652 Rank: 17, Dq: 0,
653 },
654 Ranking{
655 TeamNumber: 126,
656 Losses: 0, Wins: 7, Ties: 0,
657 Rank: 5, Dq: 0,
658 },
659 }
660
661 for i := 0; i < len(correct); i++ {
662 err := fixture.db.AddOrUpdateRankings(correct[i])
663 check(t, err, fmt.Sprint("Failed to add rankings", i))
664 }
665
666 got, err := fixture.db.ReturnRankings()
667 check(t, err, "Failed ReturnRankings()")
668
669 if !reflect.DeepEqual(correct, got) {
670 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
671 }
672}
673
Emily Markova290147d2023-03-03 22:40:06 -0800674func TestReturnStats2023DB(t *testing.T) {
675 fixture := createDatabase(t)
676 defer fixture.TearDown()
677
678 correct := []Stats2023{
679 Stats2023{
680 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
681 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
682 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
683 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
684 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
685 HighCubes: 1, CubesDropped: 0, LowCones: 2,
686 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700687 AvgCycle: 51, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700688 BalanceAttemptAuto: false, Docked: false, Engaged: false,
689 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800690 },
691 Stats2023{
692 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
693 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
694 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
695 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
696 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
697 HighCubes: 1, CubesDropped: 0, LowCones: 1,
698 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700699 AvgCycle: 39, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700700 BalanceAttemptAuto: true, Docked: false, Engaged: false,
701 BalanceAttempt: false, CollectedBy: "jack",
Emily Markova290147d2023-03-03 22:40:06 -0800702 },
703 Stats2023{
704 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
705 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
706 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
707 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
708 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
709 HighCubes: 0, CubesDropped: 0, LowCones: 1,
710 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700711 AvgCycle: 45, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700712 BalanceAttemptAuto: true, Docked: false, Engaged: false,
713 BalanceAttempt: true, CollectedBy: "martin",
Emily Markova290147d2023-03-03 22:40:06 -0800714 },
715 Stats2023{
716 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
717 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
718 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
719 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
720 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
721 HighCubes: 0, CubesDropped: 0, LowCones: 2,
722 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700723 AvgCycle: 34, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700724 BalanceAttemptAuto: false, Docked: true, Engaged: false,
725 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800726 },
727 }
728
729 matches := []TeamMatch{
730 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700731 Alliance: "R", AlliancePosition: 1, TeamNumber: "2343"},
Emily Markova290147d2023-03-03 22:40:06 -0800732 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700733 Alliance: "R", AlliancePosition: 2, TeamNumber: "5443"},
Emily Markova290147d2023-03-03 22:40:06 -0800734 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700735 Alliance: "R", AlliancePosition: 3, TeamNumber: "5436"},
Emily Markova290147d2023-03-03 22:40:06 -0800736 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700737 Alliance: "B", AlliancePosition: 1, TeamNumber: "5643"},
Emily Markova290147d2023-03-03 22:40:06 -0800738 }
739
740 for _, match := range matches {
741 err := fixture.db.AddToMatch(match)
742 check(t, err, "Failed to add match")
743 }
744
745 for i := 0; i < len(correct); i++ {
746 err := fixture.db.AddToStats2023(correct[i])
747 check(t, err, fmt.Sprint("Failed to add stats ", i))
748 }
749
750 got, err := fixture.db.ReturnStats2023()
751 check(t, err, "Failed ReturnStats()")
752
753 if !reflect.DeepEqual(correct, got) {
754 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
755 }
756}
757
Sabina Leaver759090b2023-01-14 20:42:56 -0800758func TestReturnActionsDB(t *testing.T) {
759 fixture := createDatabase(t)
760 defer fixture.TearDown()
761 correct := []Action{
762 Action{
763 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
764 CompletedAction: []byte(""), TimeStamp: 0000, CollectedBy: "",
765 },
766 Action{
767 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
768 CompletedAction: []byte(""), TimeStamp: 0321, CollectedBy: "",
769 },
770 Action{
771 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
772 CompletedAction: []byte(""), TimeStamp: 0222, CollectedBy: "",
773 },
774 Action{
775 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
776 CompletedAction: []byte(""), TimeStamp: 0110, CollectedBy: "",
777 },
778 Action{
779 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
780 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
781 },
782 Action{
783 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
784 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
785 },
786 }
787
Emily Markovabf24c9e2023-02-08 20:31:11 -0800788 matches := []TeamMatch{
789 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700790 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800791 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700792 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800793 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700794 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800795 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700796 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800797 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700798 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800799 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700800 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800801 }
802
803 for _, match := range matches {
804 err := fixture.db.AddToMatch(match)
805 check(t, err, "Failed to add match")
806 }
Sabina Leaver759090b2023-01-14 20:42:56 -0800807
808 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800809 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -0800810 check(t, err, fmt.Sprint("Failed to add to actions ", i))
811 }
812
813 got, err := fixture.db.ReturnActions()
814 check(t, err, "Failed ReturnActions()")
815
816 if !reflect.DeepEqual(correct, got) {
817 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
818 }
819}
820
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700821func TestRankingsDbUpdate(t *testing.T) {
822 fixture := createDatabase(t)
823 defer fixture.TearDown()
824
825 testDatabase := []Ranking{
826 Ranking{
827 TeamNumber: 123,
828 Losses: 1, Wins: 7, Ties: 2,
829 Rank: 2, Dq: 0,
830 },
831 Ranking{
832 TeamNumber: 124,
833 Losses: 3, Wins: 4, Ties: 0,
834 Rank: 4, Dq: 2,
835 },
836 Ranking{
837 TeamNumber: 125,
838 Losses: 5, Wins: 2, Ties: 0,
839 Rank: 17, Dq: 0,
840 },
841 Ranking{
842 TeamNumber: 126,
843 Losses: 0, Wins: 7, Ties: 0,
844 Rank: 5, Dq: 0,
845 },
846 Ranking{
847 TeamNumber: 125,
848 Losses: 2, Wins: 4, Ties: 1,
849 Rank: 5, Dq: 0,
850 },
851 }
852
853 for i := 0; i < len(testDatabase); i++ {
854 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
855 check(t, err, fmt.Sprint("Failed to add rankings ", i))
856 }
857
858 correct := []Ranking{
859 Ranking{
860 TeamNumber: 125,
861 Losses: 2, Wins: 4, Ties: 1,
862 Rank: 5, Dq: 0,
863 },
864 }
865
866 got, err := fixture.db.QueryRankings(125)
867 check(t, err, "Failed QueryRankings()")
868
Philipp Schradereecb8962022-06-01 21:02:42 -0700869 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700870}
871
Alex Perry871eab92022-03-12 17:43:52 -0800872func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800873 fixture := createDatabase(t)
874 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800875
Philipp Schradereecb8962022-06-01 21:02:42 -0700876 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -0800877
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700878 err := fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 1", GoodDriving: true, BadDriving: false, SolidPickup: false, SketchyPlacing: true, GoodDefense: false, BadDefense: true, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -0800879 check(t, err, "Failed to add Note")
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700880 err = fixture.db.AddNotes(NotesData{TeamNumber: 1235, Notes: "Note 2", GoodDriving: false, BadDriving: true, SolidPickup: false, SketchyPlacing: true, GoodDefense: false, BadDefense: false, EasilyDefended: false})
Alex Perry871eab92022-03-12 17:43:52 -0800881 check(t, err, "Failed to add Note")
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700882 err = fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 3", GoodDriving: true, BadDriving: false, SolidPickup: false, SketchyPlacing: true, GoodDefense: true, BadDefense: false, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -0800883 check(t, err, "Failed to add Note")
884
Philipp Schrader7365d322022-03-06 16:40:08 -0800885 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800886 check(t, err, "Failed to get Notes")
887
888 if !reflect.DeepEqual(expected, actual) {
889 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
890 }
891}
Filip Kujawa210a03b2022-11-24 14:41:11 -0800892
893func TestDriverRanking(t *testing.T) {
894 fixture := createDatabase(t)
895 defer fixture.TearDown()
896
897 expected := []DriverRankingData{
898 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
899 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
900 }
901
902 err := fixture.db.AddDriverRanking(
903 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
904 )
905 check(t, err, "Failed to add Driver Ranking")
906 err = fixture.db.AddDriverRanking(
907 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
908 )
909 check(t, err, "Failed to add Driver Ranking")
910 err = fixture.db.AddDriverRanking(
911 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
912 )
913 check(t, err, "Failed to add Driver Ranking")
914
915 actual, err := fixture.db.QueryDriverRanking(12)
916 check(t, err, "Failed to get Driver Ranking")
917
918 if !reflect.DeepEqual(expected, actual) {
919 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
920 }
921}
Philipp Schradera8955fb2023-03-05 15:47:19 -0800922
923func TestParsedDriverRanking(t *testing.T) {
924 fixture := createDatabase(t)
925 defer fixture.TearDown()
926
927 expected := []ParsedDriverRankingData{
928 {TeamNumber: "1234", Score: 100},
929 {TeamNumber: "1235", Score: 110},
930 {TeamNumber: "1236", Score: 90},
931 }
932
933 for i := range expected {
934 err := fixture.db.AddParsedDriverRanking(expected[i])
935 check(t, err, "Failed to add Parsed Driver Ranking")
936 }
937
938 actual, err := fixture.db.ReturnAllParsedDriverRankings()
939 check(t, err, "Failed to get Parsed Driver Ranking")
940 if !reflect.DeepEqual(expected, actual) {
941 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
942 }
943
944 // Now update one of the rankings and make sure we get the properly
945 // merged result.
946 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
947 TeamNumber: "1235", Score: 200,
948 })
949 check(t, err, "Failed to add Parsed Driver Ranking")
950
951 expected = []ParsedDriverRankingData{
952 {TeamNumber: "1234", Score: 100},
953 {TeamNumber: "1236", Score: 90},
954 {TeamNumber: "1235", Score: 200},
955 }
956
957 actual, err = fixture.db.ReturnAllParsedDriverRankings()
958 check(t, err, "Failed to get Parsed Driver Ranking")
959 if !reflect.DeepEqual(expected, actual) {
960 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
961 }
962}