blob: b5e9a38d8ded74e10164dc41ded0bacc2941536b [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"
Emily Markova6b551e02023-02-18 17:37:40 -08009 "strconv"
Philipp Schraderf117fae2022-04-08 20:14:57 -070010 "strings"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080011 "testing"
Philipp Schrader7365d322022-03-06 16:40:08 -080012 "time"
Philipp Schradereecb8962022-06-01 21:02:42 -070013
14 "github.com/davecgh/go-spew/spew"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080015)
16
Philipp Schrader83fc2722022-03-10 21:59:20 -080017// Shortcut for error checking. If the specified error is non-nil, print the
18// error message and exit the test.
19func check(t *testing.T, err error, message string) {
20 if err != nil {
21 t.Fatal(message, ":", err)
22 }
23}
24
Philipp Schrader7365d322022-03-06 16:40:08 -080025type dbFixture struct {
26 db *Database
27 server *exec.Cmd
28}
29
30func (fixture dbFixture) TearDown() {
31 fixture.db.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -080032 log.Println("Shutting down testdb")
33 fixture.server.Process.Signal(os.Interrupt)
34 fixture.server.Process.Wait()
35 log.Println("Successfully shut down testdb")
36}
37
38func createDatabase(t *testing.T) dbFixture {
39 var fixture dbFixture
40
41 log.Println("Starting up postgres.")
42 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
43 fixture.server.Stdout = os.Stdout
44 fixture.server.Stderr = os.Stderr
45 err := fixture.server.Start()
46 check(t, err, "Failed to run postgres")
47
48 // Wait until the server is ready. We cannot rely on the TCP socket
49 // alone because postgres creates the socket before it's actually ready
50 // to service requests.
51 for {
52 fixture.db, err = NewDatabase("test", "password", 5432)
53 if err == nil {
54 break
55 }
56 time.Sleep(50 * time.Millisecond)
57 }
58 log.Println("Connected to postgres.")
59
Philipp Schradereecb8962022-06-01 21:02:42 -070060 fixture.db.SetDebugLogLevel()
61
Philipp Schrader7365d322022-03-06 16:40:08 -080062 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080063}
64
Philipp Schradereecb8962022-06-01 21:02:42 -070065func checkDeepEqual(t *testing.T, expected interface{}, actual interface{}) {
66 if !reflect.DeepEqual(expected, actual) {
67 t.Fatalf(spew.Sprintf("Got %#v,\nbut expected %#v.", actual, expected))
68 }
69}
70
Philipp Schrader4953cc32022-02-25 18:09:02 -080071func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080072 fixture := createDatabase(t)
73 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080074
Emily Markovabf24c9e2023-02-08 20:31:11 -080075 correct := []TeamMatch{
76 TeamMatch{
77 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
78 Alliance: "R", AlliancePosition: 1, TeamNumber: 9999,
79 },
80 TeamMatch{
81 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
82 Alliance: "R", AlliancePosition: 2, TeamNumber: 1000,
83 },
84 TeamMatch{
85 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
86 Alliance: "R", AlliancePosition: 3, TeamNumber: 777,
87 },
88 TeamMatch{
89 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
90 Alliance: "B", AlliancePosition: 1, TeamNumber: 0000,
91 },
92 TeamMatch{
93 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
94 Alliance: "B", AlliancePosition: 2, TeamNumber: 4321,
95 },
96 TeamMatch{
97 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
98 Alliance: "B", AlliancePosition: 3, TeamNumber: 1234,
Philipp Schrader83fc2722022-03-10 21:59:20 -080099 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800100 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800101
Emily Markovabf24c9e2023-02-08 20:31:11 -0800102 for _, match := range correct {
103 err := fixture.db.AddToMatch(match)
104 check(t, err, "Failed to add match data")
105 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800106
Philipp Schrader7365d322022-03-06 16:40:08 -0800107 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800108 check(t, err, "Failed ReturnMatches()")
109
Philipp Schradereecb8962022-06-01 21:02:42 -0700110 checkDeepEqual(t, correct, got)
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800111}
112
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700113func TestAddOrUpdateRankingsDB(t *testing.T) {
114 fixture := createDatabase(t)
115 defer fixture.TearDown()
116
117 correct := []Ranking{
118 Ranking{
119 TeamNumber: 123,
120 Losses: 1, Wins: 7, Ties: 0,
121 Rank: 2, Dq: 0,
122 },
123 Ranking{
124 TeamNumber: 125,
125 Losses: 2, Wins: 4, Ties: 0,
126 Rank: 2, Dq: 0,
127 },
128 }
129
130 for i := 0; i < len(correct); i++ {
131 err := fixture.db.AddOrUpdateRankings(correct[i])
132 check(t, err, "Failed to add ranking data")
133 }
134
135 got, err := fixture.db.ReturnRankings()
136 check(t, err, "Failed ReturnRankings()")
137
138 if !reflect.DeepEqual(correct, got) {
139 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
140 }
141}
142
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800143func TestAddToStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800144 fixture := createDatabase(t)
145 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800146
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800147 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800148 Stats{
149 TeamNumber: 1236, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700150 StartingQuadrant: 2,
151 AutoBallPickedUp: [5]bool{false, false, false, true, false},
152 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800153 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700154 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
155 Comment: "this is a comment", CollectedBy: "josh",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800156 },
157 Stats{
158 TeamNumber: 1001, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700159 StartingQuadrant: 3,
160 AutoBallPickedUp: [5]bool{true, false, true, true, false},
161 ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800162 ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700163 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
164 Comment: "another comment", CollectedBy: "rupert",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800165 },
166 Stats{
167 TeamNumber: 777, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700168 StartingQuadrant: 4,
169 AutoBallPickedUp: [5]bool{false, true, true, true, false},
170 ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800171 ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700172 PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
173 Comment: "and another", CollectedBy: "felix",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800174 },
175 Stats{
176 TeamNumber: 1000, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700177 StartingQuadrant: 1,
178 AutoBallPickedUp: [5]bool{false, false, false, false, false},
179 ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800180 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700181 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
182 Comment: "and another one", CollectedBy: "thea",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800183 },
184 Stats{
185 TeamNumber: 4321, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700186 StartingQuadrant: 2,
187 AutoBallPickedUp: [5]bool{true, false, false, false, false},
188 ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800189 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700190 PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
191 Comment: "more comment", CollectedBy: "amy",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800192 },
193 Stats{
194 TeamNumber: 1234, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700195 StartingQuadrant: 3,
196 AutoBallPickedUp: [5]bool{false, false, false, false, true},
197 ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800198 ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700199 PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
200 Comment: "final comment", CollectedBy: "beth",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800201 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800202 }
Emily Markovabf24c9e2023-02-08 20:31:11 -0800203 matches := []TeamMatch{
204 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
205 Alliance: "R", AlliancePosition: 1, TeamNumber: 1236},
206 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
207 Alliance: "R", AlliancePosition: 2, TeamNumber: 1001},
208 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
209 Alliance: "R", AlliancePosition: 3, TeamNumber: 777},
210 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
211 Alliance: "B", AlliancePosition: 1, TeamNumber: 1000},
212 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
213 Alliance: "B", AlliancePosition: 2, TeamNumber: 4321},
214 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
215 Alliance: "B", AlliancePosition: 3, TeamNumber: 1234},
216 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800217
Emily Markovabf24c9e2023-02-08 20:31:11 -0800218 for _, match := range matches {
219 err := fixture.db.AddToMatch(match)
220 check(t, err, "Failed to add match")
221 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800222
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800223 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800224 err := fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800225 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800226 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800227
Philipp Schrader7365d322022-03-06 16:40:08 -0800228 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800229 check(t, err, "Failed ReturnStats()")
230
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800231 if !reflect.DeepEqual(correct, got) {
232 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
233 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800234}
235
Emily Markova290147d2023-03-03 22:40:06 -0800236func TestAddToStats2023DB(t *testing.T) {
237 fixture := createDatabase(t)
238 defer fixture.TearDown()
239
240 correct := []Stats2023{
241 Stats2023{
242 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
243 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
244 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
245 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
246 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
247 HighCubes: 1, CubesDropped: 0, LowCones: 0,
248 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
249 AvgCycle: 0, CollectedBy: "emma",
250 },
251 Stats2023{
252 TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
253 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
254 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
255 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
256 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
257 HighCubes: 0, CubesDropped: 1, LowCones: 0,
258 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
259 AvgCycle: 0, CollectedBy: "tyler",
260 },
261 Stats2023{
262 TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
263 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
264 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
265 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
266 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
267 HighCubes: 2, CubesDropped: 1, LowCones: 1,
268 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
269 AvgCycle: 0, CollectedBy: "isaac",
270 },
271 Stats2023{
272 TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
273 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
274 MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
275 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
276 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 1,
277 HighCubes: 2, CubesDropped: 1, LowCones: 0,
278 MiddleCones: 1, HighCones: 0, ConesDropped: 0,
279 AvgCycle: 0, CollectedBy: "will",
280 },
281 Stats2023{
282 TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
283 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
284 MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
285 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
286 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
287 HighCubes: 0, CubesDropped: 2, LowCones: 1,
288 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
289 AvgCycle: 0, CollectedBy: "unkown",
290 },
291 }
292
293 matches := []TeamMatch{
294 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
295 Alliance: "R", AlliancePosition: 1, TeamNumber: 6344},
296 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
297 Alliance: "R", AlliancePosition: 2, TeamNumber: 7454},
298 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
299 Alliance: "R", AlliancePosition: 3, TeamNumber: 4354},
300 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
301 Alliance: "B", AlliancePosition: 1, TeamNumber: 6533},
302 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
303 Alliance: "B", AlliancePosition: 2, TeamNumber: 8354},
304 }
305
306 for _, match := range matches {
307 err := fixture.db.AddToMatch(match)
308 check(t, err, "Failed to add match")
309 }
310
311 for i := 0; i < len(correct); i++ {
312 err := fixture.db.AddToStats2023(correct[i])
313 check(t, err, "Failed to add 2023stats to DB")
314 }
315
316 got, err := fixture.db.ReturnStats2023()
317 check(t, err, "Failed ReturnStats2023()")
318
319 if !reflect.DeepEqual(correct, got) {
320 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
321 }
322}
323
Philipp Schraderf117fae2022-04-08 20:14:57 -0700324func TestAddDuplicateStats(t *testing.T) {
325 fixture := createDatabase(t)
326 defer fixture.TearDown()
327
328 stats := Stats{
329 TeamNumber: 1236, MatchNumber: 7,
Philipp Schradereecb8962022-06-01 21:02:42 -0700330 SetNumber: 1, CompLevel: "qual",
Philipp Schraderf117fae2022-04-08 20:14:57 -0700331 StartingQuadrant: 2,
332 AutoBallPickedUp: [5]bool{false, false, false, true, false},
333 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
334 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
335 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
336 Comment: "this is a comment", CollectedBy: "josh",
337 }
338
Emily Markovabf24c9e2023-02-08 20:31:11 -0800339 matches := []TeamMatch{
340 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
341 Alliance: "R", AlliancePosition: 1, TeamNumber: 1236},
342 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
343 Alliance: "R", AlliancePosition: 2, TeamNumber: 1001},
344 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
345 Alliance: "R", AlliancePosition: 3, TeamNumber: 777},
346 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
347 Alliance: "B", AlliancePosition: 1, TeamNumber: 1000},
348 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
349 Alliance: "B", AlliancePosition: 2, TeamNumber: 4321},
350 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
351 Alliance: "B", AlliancePosition: 3, TeamNumber: 1234},
352 }
353
354 for _, match := range matches {
355 err := fixture.db.AddToMatch(match)
356 check(t, err, "Failed to add match")
357 }
Philipp Schraderf117fae2022-04-08 20:14:57 -0700358
359 // Add stats. This should succeed.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800360 err := fixture.db.AddToStats(stats)
Philipp Schraderf117fae2022-04-08 20:14:57 -0700361 check(t, err, "Failed to add stats to DB")
362
363 // Try again. It should fail this time.
364 err = fixture.db.AddToStats(stats)
365 if err == nil {
366 t.Fatal("Failed to get error when adding duplicate stats.")
367 }
368 if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
369 t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
370 }
371}
372
Emily Markova6b551e02023-02-18 17:37:40 -0800373func TestDeleteFromStats(t *testing.T) {
374 fixture := createDatabase(t)
375 defer fixture.TearDown()
376
377 startingStats := []Stats2023{
378 Stats2023{
379 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
380 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
381 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
382 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
383 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
384 HighCubes: 2, CubesDropped: 1, LowCones: 1,
385 MiddleCones: 0, HighCones: 1, ConesDropped: 2,
386 AvgCycle: 58, CollectedBy: "unknown",
387 },
388 Stats2023{
389 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
390 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
391 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
392 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
393 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
394 HighCubes: 1, CubesDropped: 0, LowCones: 0,
395 MiddleCones: 2, HighCones: 1, ConesDropped: 0,
396 AvgCycle: 34, CollectedBy: "simon",
397 },
398 Stats2023{
399 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
400 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
401 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
402 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
403 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
404 HighCubes: 0, CubesDropped: 0, LowCones: 2,
405 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
406 AvgCycle: 50, CollectedBy: "eliza",
407 },
408 Stats2023{
409 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
410 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
411 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
412 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
413 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
414 HighCubes: 2, CubesDropped: 1, LowCones: 0,
415 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
416 AvgCycle: 49, CollectedBy: "isaac",
417 },
418 Stats2023{
419 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
420 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
421 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
422 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
423 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
424 HighCubes: 0, CubesDropped: 0, LowCones: 1,
425 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
426 AvgCycle: 70, CollectedBy: "sam",
427 },
428 }
429
430 correct := []Stats2023{
431 Stats2023{
432 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
433 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
434 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
435 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
436 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
437 HighCubes: 0, CubesDropped: 0, LowCones: 2,
438 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
439 AvgCycle: 50, CollectedBy: "eliza",
440 },
441 Stats2023{
442 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
443 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
444 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
445 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
446 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
447 HighCubes: 0, CubesDropped: 0, LowCones: 1,
448 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
449 AvgCycle: 70, CollectedBy: "sam",
450 },
451 }
452
453 originalMatches := []TeamMatch{
454 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
455 Alliance: "R", AlliancePosition: 1, TeamNumber: 1111},
456 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
457 Alliance: "B", AlliancePosition: 1, TeamNumber: 2314},
458 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
459 Alliance: "R", AlliancePosition: 3, TeamNumber: 1742},
460 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
461 Alliance: "B", AlliancePosition: 2, TeamNumber: 2454},
462 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
463 Alliance: "B", AlliancePosition: 3, TeamNumber: 3242},
464 }
465
466 // Matches for which we want to delete the stats.
467 matches := []TeamMatch{
468 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
469 TeamNumber: 1111},
470 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
471 TeamNumber: 2314},
472 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
473 TeamNumber: 1742},
474 }
475
476 for _, match := range originalMatches {
477 err := fixture.db.AddToMatch(match)
478 check(t, err, "Failed to add match")
479 fmt.Println("Match has been added : ", match.TeamNumber)
480 }
481
482 for _, stat := range startingStats {
483 err := fixture.db.AddToStats2023(stat)
484 check(t, err, "Failed to add stat")
485 }
486
487 for _, match := range matches {
488 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, strconv.Itoa(int(match.TeamNumber)))
489 check(t, err, "Failed to delete stat")
490 }
491
492 got, err := fixture.db.ReturnStats2023()
493 check(t, err, "Failed ReturnStats()")
494
495 if !reflect.DeepEqual(correct, got) {
496 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
497 }
498}
499
Milo Lina72e2002022-04-06 20:31:13 -0700500func TestQueryShiftDB(t *testing.T) {
501 fixture := createDatabase(t)
502 defer fixture.TearDown()
503
504 testDatabase := []Shift{
505 Shift{
506 MatchNumber: 1,
507 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
508 },
509 Shift{
510 MatchNumber: 2,
511 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
512 },
513 }
514
515 for i := 0; i < len(testDatabase); i++ {
516 err := fixture.db.AddToShift(testDatabase[i])
517 check(t, err, fmt.Sprint("Failed to add shift", i))
518 }
519
520 correct := []Shift{
521 Shift{
522 MatchNumber: 1,
523 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
524 },
525 }
526
527 got, err := fixture.db.QueryAllShifts(1)
528 check(t, err, "Failed to query shift for match 1")
529
530 if !reflect.DeepEqual(correct, got) {
531 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
532 }
533}
534
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800535func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800536 fixture := createDatabase(t)
537 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800538
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800539 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800540 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700541 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700542 StartingQuadrant: 1,
543 AutoBallPickedUp: [5]bool{false, false, false, false, false},
544 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800545 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700546 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800547 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700548 TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700549 StartingQuadrant: 2,
550 AutoBallPickedUp: [5]bool{false, false, false, false, true},
551 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800552 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700553 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800554 },
555 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700556 TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700557 StartingQuadrant: 3,
558 AutoBallPickedUp: [5]bool{false, false, false, false, false},
559 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800560 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700561 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800562 },
563 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700564 TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700565 StartingQuadrant: 2,
566 AutoBallPickedUp: [5]bool{true, false, false, false, true},
567 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800568 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700569 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800570 },
571 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700572 TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700573 StartingQuadrant: 3,
574 AutoBallPickedUp: [5]bool{false, false, true, false, false},
575 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800576 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700577 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800578 },
579 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700580 TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700581 StartingQuadrant: 4,
582 AutoBallPickedUp: [5]bool{false, true, true, false, false},
583 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800584 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700585 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800586 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800587 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800588
Emily Markovabf24c9e2023-02-08 20:31:11 -0800589 matches := []TeamMatch{
590 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
591 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
592 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
593 Alliance: "R", AlliancePosition: 2, TeamNumber: 1234},
594 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
595 Alliance: "R", AlliancePosition: 3, TeamNumber: 1233},
596 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
597 Alliance: "B", AlliancePosition: 1, TeamNumber: 1232},
598 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
599 Alliance: "B", AlliancePosition: 2, TeamNumber: 1231},
600 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
601 Alliance: "B", AlliancePosition: 3, TeamNumber: 1239},
602 }
603
604 for _, match := range matches {
605 err := fixture.db.AddToMatch(match)
606 check(t, err, "Failed to add match")
607 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800608
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800609 for i := 0; i < len(testDatabase); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800610 err := fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700611 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800612 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800613
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800614 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800615 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700616 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700617 StartingQuadrant: 1,
618 AutoBallPickedUp: [5]bool{false, false, false, false, false},
619 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800620 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700621 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800622 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800623 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800624
Philipp Schrader7365d322022-03-06 16:40:08 -0800625 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800626 check(t, err, "Failed QueryStats()")
627
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800628 if !reflect.DeepEqual(correct, got) {
629 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
630 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800631}
632
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700633func TestQueryRankingsDB(t *testing.T) {
634 fixture := createDatabase(t)
635 defer fixture.TearDown()
636
637 testDatabase := []Ranking{
638 Ranking{
639 TeamNumber: 123,
640 Losses: 1, Wins: 7, Ties: 2,
641 Rank: 2, Dq: 0,
642 },
643 Ranking{
644 TeamNumber: 124,
645 Losses: 3, Wins: 4, Ties: 0,
646 Rank: 4, Dq: 2,
647 },
648 Ranking{
649 TeamNumber: 125,
650 Losses: 5, Wins: 2, Ties: 0,
651 Rank: 17, Dq: 0,
652 },
653 Ranking{
654 TeamNumber: 126,
655 Losses: 0, Wins: 7, Ties: 0,
656 Rank: 5, Dq: 0,
657 },
658 }
659
660 for i := 0; i < len(testDatabase); i++ {
661 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
662 check(t, err, fmt.Sprint("Failed to add rankings ", i))
663 }
664
665 correct := []Ranking{
666 Ranking{
667 TeamNumber: 126,
668 Losses: 0, Wins: 7, Ties: 0,
669 Rank: 5, Dq: 0,
670 },
671 }
672
673 got, err := fixture.db.QueryRankings(126)
674 check(t, err, "Failed QueryRankings()")
675
676 if !reflect.DeepEqual(correct, got) {
677 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
678 }
679}
680
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800681func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800682 fixture := createDatabase(t)
683 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800684
Emily Markovabf24c9e2023-02-08 20:31:11 -0800685 correct := []TeamMatch{
686 TeamMatch{
687 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: 6835},
688 TeamMatch{
689 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 4834},
690 TeamMatch{
691 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 9824},
692 TeamMatch{
693 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: 3732},
694 TeamMatch{
695 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: 3732},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800696 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800697
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800698 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800699 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800700 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800701 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800702
Philipp Schrader7365d322022-03-06 16:40:08 -0800703 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800704 check(t, err, "Failed ReturnMatches()")
705
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800706 if !reflect.DeepEqual(correct, got) {
707 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
708 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800709}
710
Philipp Schraderfe583842022-04-08 19:47:07 -0700711func TestOverwriteNewMatchData(t *testing.T) {
712 fixture := createDatabase(t)
713 defer fixture.TearDown()
714
Emily Markovabf24c9e2023-02-08 20:31:11 -0800715 testDatabase := []TeamMatch{
716 TeamMatch{
717 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 4464},
718 TeamMatch{
719 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 2352},
720 TeamMatch{
721 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 6321},
Philipp Schraderfe583842022-04-08 19:47:07 -0700722 }
723
724 for i := 0; i < len(testDatabase); i++ {
725 err := fixture.db.AddToMatch(testDatabase[i])
726 check(t, err, fmt.Sprint("Failed to add match", i))
727 }
728
Emily Markovabf24c9e2023-02-08 20:31:11 -0800729 correct := []TeamMatch{
730 TeamMatch{
731 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 2352},
732 TeamMatch{
733 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 6321},
Philipp Schraderfe583842022-04-08 19:47:07 -0700734 }
735
736 got, err := fixture.db.ReturnMatches()
737 check(t, err, "Failed to get match list")
738
739 if !reflect.DeepEqual(correct, got) {
740 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
741 }
742}
743
Milo Lina72e2002022-04-06 20:31:13 -0700744func TestAddReturnShiftDB(t *testing.T) {
745 fixture := createDatabase(t)
746 defer fixture.TearDown()
747
748 correct := []Shift{
749 Shift{
750 MatchNumber: 1,
751 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
752 },
753 Shift{
754 MatchNumber: 2,
755 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
756 },
757 }
758
759 for i := 0; i < len(correct); i++ {
760 err := fixture.db.AddToShift(correct[i])
761 check(t, err, fmt.Sprint("Failed to add shift", i))
762 }
763
764 got, err := fixture.db.ReturnAllShifts()
765 check(t, err, "Failed ReturnAllShifts()")
766
767 if !reflect.DeepEqual(correct, got) {
768 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
769 }
770}
771
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700772func TestReturnRankingsDB(t *testing.T) {
773 fixture := createDatabase(t)
774 defer fixture.TearDown()
775
776 correct := []Ranking{
777 Ranking{
778 TeamNumber: 123,
779 Losses: 1, Wins: 7, Ties: 2,
780 Rank: 2, Dq: 0,
781 },
782 Ranking{
783 TeamNumber: 124,
784 Losses: 3, Wins: 4, Ties: 0,
785 Rank: 4, Dq: 2,
786 },
787 Ranking{
788 TeamNumber: 125,
789 Losses: 5, Wins: 2, Ties: 0,
790 Rank: 17, Dq: 0,
791 },
792 Ranking{
793 TeamNumber: 126,
794 Losses: 0, Wins: 7, Ties: 0,
795 Rank: 5, Dq: 0,
796 },
797 }
798
799 for i := 0; i < len(correct); i++ {
800 err := fixture.db.AddOrUpdateRankings(correct[i])
801 check(t, err, fmt.Sprint("Failed to add rankings", i))
802 }
803
804 got, err := fixture.db.ReturnRankings()
805 check(t, err, "Failed ReturnRankings()")
806
807 if !reflect.DeepEqual(correct, got) {
808 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
809 }
810}
811
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800812func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800813 fixture := createDatabase(t)
814 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800815
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800816 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800817 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700818 TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700819 StartingQuadrant: 1,
820 AutoBallPickedUp: [5]bool{false, false, false, false, false},
821 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800822 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700823 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800824 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700825 TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700826 StartingQuadrant: 2,
827 AutoBallPickedUp: [5]bool{false, false, false, false, true},
828 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800829 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700830 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800831 },
832 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700833 TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700834 StartingQuadrant: 3,
835 AutoBallPickedUp: [5]bool{false, false, false, false, false},
836 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800837 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700838 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800839 },
840 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700841 TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700842 StartingQuadrant: 2,
843 AutoBallPickedUp: [5]bool{true, false, false, false, true},
844 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800845 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700846 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800847 },
848 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700849 TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700850 StartingQuadrant: 3,
851 AutoBallPickedUp: [5]bool{false, false, true, false, false},
852 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800853 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700854 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800855 },
856 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700857 TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700858 StartingQuadrant: 4,
859 AutoBallPickedUp: [5]bool{false, true, true, false, false},
860 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800861 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700862 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800863 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800864 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800865
Emily Markovabf24c9e2023-02-08 20:31:11 -0800866 matches := []TeamMatch{
867 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
868 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
869 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
870 Alliance: "R", AlliancePosition: 2, TeamNumber: 1236},
871 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
872 Alliance: "R", AlliancePosition: 3, TeamNumber: 1237},
873 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
874 Alliance: "B", AlliancePosition: 1, TeamNumber: 1238},
875 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
876 Alliance: "B", AlliancePosition: 2, TeamNumber: 1239},
877 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
878 Alliance: "B", AlliancePosition: 3, TeamNumber: 1233},
879 }
880
881 for _, match := range matches {
882 err := fixture.db.AddToMatch(match)
883 check(t, err, "Failed to add match")
884 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800885
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800886 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800887 err := fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700888 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800889 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800890
Philipp Schrader7365d322022-03-06 16:40:08 -0800891 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800892 check(t, err, "Failed ReturnStats()")
893
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800894 if !reflect.DeepEqual(correct, got) {
895 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
896 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800897}
Alex Perry871eab92022-03-12 17:43:52 -0800898
Emily Markova290147d2023-03-03 22:40:06 -0800899func TestReturnStats2023DB(t *testing.T) {
900 fixture := createDatabase(t)
901 defer fixture.TearDown()
902
903 correct := []Stats2023{
904 Stats2023{
905 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
906 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
907 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
908 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
909 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
910 HighCubes: 1, CubesDropped: 0, LowCones: 2,
911 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
912 AvgCycle: 51, CollectedBy: "isaac",
913 },
914 Stats2023{
915 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
916 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
917 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
918 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
919 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
920 HighCubes: 1, CubesDropped: 0, LowCones: 1,
921 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
922 AvgCycle: 39, CollectedBy: "jack",
923 },
924 Stats2023{
925 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
926 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
927 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
928 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
929 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
930 HighCubes: 0, CubesDropped: 0, LowCones: 1,
931 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
932 AvgCycle: 45, CollectedBy: "martin",
933 },
934 Stats2023{
935 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
936 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
937 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
938 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
939 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
940 HighCubes: 0, CubesDropped: 0, LowCones: 2,
941 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
942 AvgCycle: 34, CollectedBy: "unknown",
943 },
944 }
945
946 matches := []TeamMatch{
947 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
948 Alliance: "R", AlliancePosition: 1, TeamNumber: 2343},
949 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
950 Alliance: "R", AlliancePosition: 2, TeamNumber: 5443},
951 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
952 Alliance: "R", AlliancePosition: 3, TeamNumber: 5436},
953 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
954 Alliance: "B", AlliancePosition: 1, TeamNumber: 5643},
955 }
956
957 for _, match := range matches {
958 err := fixture.db.AddToMatch(match)
959 check(t, err, "Failed to add match")
960 }
961
962 for i := 0; i < len(correct); i++ {
963 err := fixture.db.AddToStats2023(correct[i])
964 check(t, err, fmt.Sprint("Failed to add stats ", i))
965 }
966
967 got, err := fixture.db.ReturnStats2023()
968 check(t, err, "Failed ReturnStats()")
969
970 if !reflect.DeepEqual(correct, got) {
971 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
972 }
973}
974
Sabina Leaver759090b2023-01-14 20:42:56 -0800975func TestReturnActionsDB(t *testing.T) {
976 fixture := createDatabase(t)
977 defer fixture.TearDown()
978 correct := []Action{
979 Action{
980 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
981 CompletedAction: []byte(""), TimeStamp: 0000, CollectedBy: "",
982 },
983 Action{
984 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
985 CompletedAction: []byte(""), TimeStamp: 0321, CollectedBy: "",
986 },
987 Action{
988 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
989 CompletedAction: []byte(""), TimeStamp: 0222, CollectedBy: "",
990 },
991 Action{
992 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
993 CompletedAction: []byte(""), TimeStamp: 0110, CollectedBy: "",
994 },
995 Action{
996 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
997 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
998 },
999 Action{
1000 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1001 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
1002 },
1003 }
1004
Emily Markovabf24c9e2023-02-08 20:31:11 -08001005 matches := []TeamMatch{
1006 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1007 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
1008 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1009 Alliance: "R", AlliancePosition: 2, TeamNumber: 1236},
1010 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1011 Alliance: "R", AlliancePosition: 3, TeamNumber: 1237},
1012 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1013 Alliance: "B", AlliancePosition: 1, TeamNumber: 1238},
1014 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1015 Alliance: "B", AlliancePosition: 2, TeamNumber: 1239},
1016 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1017 Alliance: "B", AlliancePosition: 3, TeamNumber: 1233},
1018 }
1019
1020 for _, match := range matches {
1021 err := fixture.db.AddToMatch(match)
1022 check(t, err, "Failed to add match")
1023 }
Sabina Leaver759090b2023-01-14 20:42:56 -08001024
1025 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001026 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -08001027 check(t, err, fmt.Sprint("Failed to add to actions ", i))
1028 }
1029
1030 got, err := fixture.db.ReturnActions()
1031 check(t, err, "Failed ReturnActions()")
1032
1033 if !reflect.DeepEqual(correct, got) {
1034 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1035 }
1036}
1037
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001038func TestRankingsDbUpdate(t *testing.T) {
1039 fixture := createDatabase(t)
1040 defer fixture.TearDown()
1041
1042 testDatabase := []Ranking{
1043 Ranking{
1044 TeamNumber: 123,
1045 Losses: 1, Wins: 7, Ties: 2,
1046 Rank: 2, Dq: 0,
1047 },
1048 Ranking{
1049 TeamNumber: 124,
1050 Losses: 3, Wins: 4, Ties: 0,
1051 Rank: 4, Dq: 2,
1052 },
1053 Ranking{
1054 TeamNumber: 125,
1055 Losses: 5, Wins: 2, Ties: 0,
1056 Rank: 17, Dq: 0,
1057 },
1058 Ranking{
1059 TeamNumber: 126,
1060 Losses: 0, Wins: 7, Ties: 0,
1061 Rank: 5, Dq: 0,
1062 },
1063 Ranking{
1064 TeamNumber: 125,
1065 Losses: 2, Wins: 4, Ties: 1,
1066 Rank: 5, Dq: 0,
1067 },
1068 }
1069
1070 for i := 0; i < len(testDatabase); i++ {
1071 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
1072 check(t, err, fmt.Sprint("Failed to add rankings ", i))
1073 }
1074
1075 correct := []Ranking{
1076 Ranking{
1077 TeamNumber: 125,
1078 Losses: 2, Wins: 4, Ties: 1,
1079 Rank: 5, Dq: 0,
1080 },
1081 }
1082
1083 got, err := fixture.db.QueryRankings(125)
1084 check(t, err, "Failed QueryRankings()")
1085
Philipp Schradereecb8962022-06-01 21:02:42 -07001086 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001087}
1088
Alex Perry871eab92022-03-12 17:43:52 -08001089func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -08001090 fixture := createDatabase(t)
1091 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -08001092
Philipp Schradereecb8962022-06-01 21:02:42 -07001093 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -08001094
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001095 err := fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 1", GoodDriving: true, BadDriving: false, SketchyPickup: false, SketchyPlacing: true, GoodDefense: false, BadDefense: true, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -08001096 check(t, err, "Failed to add Note")
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001097 err = fixture.db.AddNotes(NotesData{TeamNumber: 1235, Notes: "Note 2", GoodDriving: false, BadDriving: true, SketchyPickup: false, SketchyPlacing: true, GoodDefense: false, BadDefense: false, EasilyDefended: false})
Alex Perry871eab92022-03-12 17:43:52 -08001098 check(t, err, "Failed to add Note")
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001099 err = fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 3", GoodDriving: true, BadDriving: false, SketchyPickup: false, SketchyPlacing: true, GoodDefense: true, BadDefense: false, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -08001100 check(t, err, "Failed to add Note")
1101
Philipp Schrader7365d322022-03-06 16:40:08 -08001102 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -08001103 check(t, err, "Failed to get Notes")
1104
1105 if !reflect.DeepEqual(expected, actual) {
1106 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1107 }
1108}
Filip Kujawa210a03b2022-11-24 14:41:11 -08001109
1110func TestDriverRanking(t *testing.T) {
1111 fixture := createDatabase(t)
1112 defer fixture.TearDown()
1113
1114 expected := []DriverRankingData{
1115 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1116 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1117 }
1118
1119 err := fixture.db.AddDriverRanking(
1120 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1121 )
1122 check(t, err, "Failed to add Driver Ranking")
1123 err = fixture.db.AddDriverRanking(
1124 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1125 )
1126 check(t, err, "Failed to add Driver Ranking")
1127 err = fixture.db.AddDriverRanking(
1128 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
1129 )
1130 check(t, err, "Failed to add Driver Ranking")
1131
1132 actual, err := fixture.db.QueryDriverRanking(12)
1133 check(t, err, "Failed to get Driver Ranking")
1134
1135 if !reflect.DeepEqual(expected, actual) {
1136 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1137 }
1138}
Philipp Schradera8955fb2023-03-05 15:47:19 -08001139
1140func TestParsedDriverRanking(t *testing.T) {
1141 fixture := createDatabase(t)
1142 defer fixture.TearDown()
1143
1144 expected := []ParsedDriverRankingData{
1145 {TeamNumber: "1234", Score: 100},
1146 {TeamNumber: "1235", Score: 110},
1147 {TeamNumber: "1236", Score: 90},
1148 }
1149
1150 for i := range expected {
1151 err := fixture.db.AddParsedDriverRanking(expected[i])
1152 check(t, err, "Failed to add Parsed Driver Ranking")
1153 }
1154
1155 actual, err := fixture.db.ReturnAllParsedDriverRankings()
1156 check(t, err, "Failed to get Parsed Driver Ranking")
1157 if !reflect.DeepEqual(expected, actual) {
1158 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1159 }
1160
1161 // Now update one of the rankings and make sure we get the properly
1162 // merged result.
1163 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1164 TeamNumber: "1235", Score: 200,
1165 })
1166 check(t, err, "Failed to add Parsed Driver Ranking")
1167
1168 expected = []ParsedDriverRankingData{
1169 {TeamNumber: "1234", Score: 100},
1170 {TeamNumber: "1236", Score: 90},
1171 {TeamNumber: "1235", Score: 200},
1172 }
1173
1174 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1175 check(t, err, "Failed to get Parsed Driver Ranking")
1176 if !reflect.DeepEqual(expected, actual) {
1177 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1178 }
1179}