blob: 477a0f1bd231d2b6a862a876b0d9b4c065817aef [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
Philipp Schraderf117fae2022-04-08 20:14:57 -0700236func TestAddDuplicateStats(t *testing.T) {
237 fixture := createDatabase(t)
238 defer fixture.TearDown()
239
240 stats := Stats{
241 TeamNumber: 1236, MatchNumber: 7,
Philipp Schradereecb8962022-06-01 21:02:42 -0700242 SetNumber: 1, CompLevel: "qual",
Philipp Schraderf117fae2022-04-08 20:14:57 -0700243 StartingQuadrant: 2,
244 AutoBallPickedUp: [5]bool{false, false, false, true, false},
245 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
246 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
247 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
248 Comment: "this is a comment", CollectedBy: "josh",
249 }
250
Emily Markovabf24c9e2023-02-08 20:31:11 -0800251 matches := []TeamMatch{
252 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
253 Alliance: "R", AlliancePosition: 1, TeamNumber: 1236},
254 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
255 Alliance: "R", AlliancePosition: 2, TeamNumber: 1001},
256 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
257 Alliance: "R", AlliancePosition: 3, TeamNumber: 777},
258 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
259 Alliance: "B", AlliancePosition: 1, TeamNumber: 1000},
260 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
261 Alliance: "B", AlliancePosition: 2, TeamNumber: 4321},
262 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
263 Alliance: "B", AlliancePosition: 3, TeamNumber: 1234},
264 }
265
266 for _, match := range matches {
267 err := fixture.db.AddToMatch(match)
268 check(t, err, "Failed to add match")
269 }
Philipp Schraderf117fae2022-04-08 20:14:57 -0700270
271 // Add stats. This should succeed.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800272 err := fixture.db.AddToStats(stats)
Philipp Schraderf117fae2022-04-08 20:14:57 -0700273 check(t, err, "Failed to add stats to DB")
274
275 // Try again. It should fail this time.
276 err = fixture.db.AddToStats(stats)
277 if err == nil {
278 t.Fatal("Failed to get error when adding duplicate stats.")
279 }
280 if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
281 t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
282 }
283}
284
Emily Markova6b551e02023-02-18 17:37:40 -0800285func TestDeleteFromStats(t *testing.T) {
286 fixture := createDatabase(t)
287 defer fixture.TearDown()
288
289 startingStats := []Stats2023{
290 Stats2023{
291 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
292 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
293 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
294 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
295 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
296 HighCubes: 2, CubesDropped: 1, LowCones: 1,
297 MiddleCones: 0, HighCones: 1, ConesDropped: 2,
298 AvgCycle: 58, CollectedBy: "unknown",
299 },
300 Stats2023{
301 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
302 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
303 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
304 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
305 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
306 HighCubes: 1, CubesDropped: 0, LowCones: 0,
307 MiddleCones: 2, HighCones: 1, ConesDropped: 0,
308 AvgCycle: 34, CollectedBy: "simon",
309 },
310 Stats2023{
311 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
312 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
313 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
314 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
315 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
316 HighCubes: 0, CubesDropped: 0, LowCones: 2,
317 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
318 AvgCycle: 50, CollectedBy: "eliza",
319 },
320 Stats2023{
321 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
322 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
323 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
324 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
325 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
326 HighCubes: 2, CubesDropped: 1, LowCones: 0,
327 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
328 AvgCycle: 49, CollectedBy: "isaac",
329 },
330 Stats2023{
331 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
332 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
333 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
334 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
335 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
336 HighCubes: 0, CubesDropped: 0, LowCones: 1,
337 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
338 AvgCycle: 70, CollectedBy: "sam",
339 },
340 }
341
342 correct := []Stats2023{
343 Stats2023{
344 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
345 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
346 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
347 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
348 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
349 HighCubes: 0, CubesDropped: 0, LowCones: 2,
350 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
351 AvgCycle: 50, CollectedBy: "eliza",
352 },
353 Stats2023{
354 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
355 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
356 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
357 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
358 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
359 HighCubes: 0, CubesDropped: 0, LowCones: 1,
360 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
361 AvgCycle: 70, CollectedBy: "sam",
362 },
363 }
364
365 originalMatches := []TeamMatch{
366 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
367 Alliance: "R", AlliancePosition: 1, TeamNumber: 1111},
368 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
369 Alliance: "B", AlliancePosition: 1, TeamNumber: 2314},
370 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
371 Alliance: "R", AlliancePosition: 3, TeamNumber: 1742},
372 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
373 Alliance: "B", AlliancePosition: 2, TeamNumber: 2454},
374 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
375 Alliance: "B", AlliancePosition: 3, TeamNumber: 3242},
376 }
377
378 // Matches for which we want to delete the stats.
379 matches := []TeamMatch{
380 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
381 TeamNumber: 1111},
382 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
383 TeamNumber: 2314},
384 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
385 TeamNumber: 1742},
386 }
387
388 for _, match := range originalMatches {
389 err := fixture.db.AddToMatch(match)
390 check(t, err, "Failed to add match")
391 fmt.Println("Match has been added : ", match.TeamNumber)
392 }
393
394 for _, stat := range startingStats {
395 err := fixture.db.AddToStats2023(stat)
396 check(t, err, "Failed to add stat")
397 }
398
399 for _, match := range matches {
400 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, strconv.Itoa(int(match.TeamNumber)))
401 check(t, err, "Failed to delete stat")
402 }
403
404 got, err := fixture.db.ReturnStats2023()
405 check(t, err, "Failed ReturnStats()")
406
407 if !reflect.DeepEqual(correct, got) {
408 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
409 }
410}
411
Milo Lina72e2002022-04-06 20:31:13 -0700412func TestQueryShiftDB(t *testing.T) {
413 fixture := createDatabase(t)
414 defer fixture.TearDown()
415
416 testDatabase := []Shift{
417 Shift{
418 MatchNumber: 1,
419 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
420 },
421 Shift{
422 MatchNumber: 2,
423 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
424 },
425 }
426
427 for i := 0; i < len(testDatabase); i++ {
428 err := fixture.db.AddToShift(testDatabase[i])
429 check(t, err, fmt.Sprint("Failed to add shift", i))
430 }
431
432 correct := []Shift{
433 Shift{
434 MatchNumber: 1,
435 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
436 },
437 }
438
439 got, err := fixture.db.QueryAllShifts(1)
440 check(t, err, "Failed to query shift for match 1")
441
442 if !reflect.DeepEqual(correct, got) {
443 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
444 }
445}
446
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800447func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800448 fixture := createDatabase(t)
449 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800450
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800451 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800452 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700453 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700454 StartingQuadrant: 1,
455 AutoBallPickedUp: [5]bool{false, false, false, false, false},
456 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800457 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700458 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800459 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700460 TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700461 StartingQuadrant: 2,
462 AutoBallPickedUp: [5]bool{false, false, false, false, true},
463 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800464 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700465 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800466 },
467 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700468 TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700469 StartingQuadrant: 3,
470 AutoBallPickedUp: [5]bool{false, false, false, false, false},
471 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800472 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700473 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800474 },
475 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700476 TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700477 StartingQuadrant: 2,
478 AutoBallPickedUp: [5]bool{true, false, false, false, true},
479 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800480 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700481 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800482 },
483 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700484 TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700485 StartingQuadrant: 3,
486 AutoBallPickedUp: [5]bool{false, false, true, false, false},
487 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800488 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700489 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800490 },
491 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700492 TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700493 StartingQuadrant: 4,
494 AutoBallPickedUp: [5]bool{false, true, true, false, false},
495 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800496 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700497 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800498 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800499 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800500
Emily Markovabf24c9e2023-02-08 20:31:11 -0800501 matches := []TeamMatch{
502 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
503 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
504 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
505 Alliance: "R", AlliancePosition: 2, TeamNumber: 1234},
506 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
507 Alliance: "R", AlliancePosition: 3, TeamNumber: 1233},
508 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
509 Alliance: "B", AlliancePosition: 1, TeamNumber: 1232},
510 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
511 Alliance: "B", AlliancePosition: 2, TeamNumber: 1231},
512 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
513 Alliance: "B", AlliancePosition: 3, TeamNumber: 1239},
514 }
515
516 for _, match := range matches {
517 err := fixture.db.AddToMatch(match)
518 check(t, err, "Failed to add match")
519 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800520
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800521 for i := 0; i < len(testDatabase); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800522 err := fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700523 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800524 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800525
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800526 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800527 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700528 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700529 StartingQuadrant: 1,
530 AutoBallPickedUp: [5]bool{false, false, false, false, false},
531 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800532 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700533 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800534 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800535 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800536
Philipp Schrader7365d322022-03-06 16:40:08 -0800537 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800538 check(t, err, "Failed QueryStats()")
539
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800540 if !reflect.DeepEqual(correct, got) {
541 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
542 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800543}
544
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700545func TestQueryRankingsDB(t *testing.T) {
546 fixture := createDatabase(t)
547 defer fixture.TearDown()
548
549 testDatabase := []Ranking{
550 Ranking{
551 TeamNumber: 123,
552 Losses: 1, Wins: 7, Ties: 2,
553 Rank: 2, Dq: 0,
554 },
555 Ranking{
556 TeamNumber: 124,
557 Losses: 3, Wins: 4, Ties: 0,
558 Rank: 4, Dq: 2,
559 },
560 Ranking{
561 TeamNumber: 125,
562 Losses: 5, Wins: 2, Ties: 0,
563 Rank: 17, Dq: 0,
564 },
565 Ranking{
566 TeamNumber: 126,
567 Losses: 0, Wins: 7, Ties: 0,
568 Rank: 5, Dq: 0,
569 },
570 }
571
572 for i := 0; i < len(testDatabase); i++ {
573 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
574 check(t, err, fmt.Sprint("Failed to add rankings ", i))
575 }
576
577 correct := []Ranking{
578 Ranking{
579 TeamNumber: 126,
580 Losses: 0, Wins: 7, Ties: 0,
581 Rank: 5, Dq: 0,
582 },
583 }
584
585 got, err := fixture.db.QueryRankings(126)
586 check(t, err, "Failed QueryRankings()")
587
588 if !reflect.DeepEqual(correct, got) {
589 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
590 }
591}
592
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800593func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800594 fixture := createDatabase(t)
595 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800596
Emily Markovabf24c9e2023-02-08 20:31:11 -0800597 correct := []TeamMatch{
598 TeamMatch{
599 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: 6835},
600 TeamMatch{
601 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 4834},
602 TeamMatch{
603 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 9824},
604 TeamMatch{
605 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: 3732},
606 TeamMatch{
607 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: 3732},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800608 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800609
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800610 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800611 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800612 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800613 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800614
Philipp Schrader7365d322022-03-06 16:40:08 -0800615 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800616 check(t, err, "Failed ReturnMatches()")
617
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800618 if !reflect.DeepEqual(correct, got) {
619 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
620 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800621}
622
Philipp Schraderfe583842022-04-08 19:47:07 -0700623func TestOverwriteNewMatchData(t *testing.T) {
624 fixture := createDatabase(t)
625 defer fixture.TearDown()
626
Emily Markovabf24c9e2023-02-08 20:31:11 -0800627 testDatabase := []TeamMatch{
628 TeamMatch{
629 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 4464},
630 TeamMatch{
631 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 2352},
632 TeamMatch{
633 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 6321},
Philipp Schraderfe583842022-04-08 19:47:07 -0700634 }
635
636 for i := 0; i < len(testDatabase); i++ {
637 err := fixture.db.AddToMatch(testDatabase[i])
638 check(t, err, fmt.Sprint("Failed to add match", i))
639 }
640
Emily Markovabf24c9e2023-02-08 20:31:11 -0800641 correct := []TeamMatch{
642 TeamMatch{
643 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 2352},
644 TeamMatch{
645 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 6321},
Philipp Schraderfe583842022-04-08 19:47:07 -0700646 }
647
648 got, err := fixture.db.ReturnMatches()
649 check(t, err, "Failed to get match list")
650
651 if !reflect.DeepEqual(correct, got) {
652 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
653 }
654}
655
Milo Lina72e2002022-04-06 20:31:13 -0700656func TestAddReturnShiftDB(t *testing.T) {
657 fixture := createDatabase(t)
658 defer fixture.TearDown()
659
660 correct := []Shift{
661 Shift{
662 MatchNumber: 1,
663 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
664 },
665 Shift{
666 MatchNumber: 2,
667 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
668 },
669 }
670
671 for i := 0; i < len(correct); i++ {
672 err := fixture.db.AddToShift(correct[i])
673 check(t, err, fmt.Sprint("Failed to add shift", i))
674 }
675
676 got, err := fixture.db.ReturnAllShifts()
677 check(t, err, "Failed ReturnAllShifts()")
678
679 if !reflect.DeepEqual(correct, got) {
680 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
681 }
682}
683
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700684func TestReturnRankingsDB(t *testing.T) {
685 fixture := createDatabase(t)
686 defer fixture.TearDown()
687
688 correct := []Ranking{
689 Ranking{
690 TeamNumber: 123,
691 Losses: 1, Wins: 7, Ties: 2,
692 Rank: 2, Dq: 0,
693 },
694 Ranking{
695 TeamNumber: 124,
696 Losses: 3, Wins: 4, Ties: 0,
697 Rank: 4, Dq: 2,
698 },
699 Ranking{
700 TeamNumber: 125,
701 Losses: 5, Wins: 2, Ties: 0,
702 Rank: 17, Dq: 0,
703 },
704 Ranking{
705 TeamNumber: 126,
706 Losses: 0, Wins: 7, Ties: 0,
707 Rank: 5, Dq: 0,
708 },
709 }
710
711 for i := 0; i < len(correct); i++ {
712 err := fixture.db.AddOrUpdateRankings(correct[i])
713 check(t, err, fmt.Sprint("Failed to add rankings", i))
714 }
715
716 got, err := fixture.db.ReturnRankings()
717 check(t, err, "Failed ReturnRankings()")
718
719 if !reflect.DeepEqual(correct, got) {
720 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
721 }
722}
723
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800724func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800725 fixture := createDatabase(t)
726 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800727
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800728 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800729 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700730 TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700731 StartingQuadrant: 1,
732 AutoBallPickedUp: [5]bool{false, false, false, false, false},
733 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800734 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700735 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800736 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700737 TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700738 StartingQuadrant: 2,
739 AutoBallPickedUp: [5]bool{false, false, false, false, true},
740 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800741 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700742 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800743 },
744 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700745 TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700746 StartingQuadrant: 3,
747 AutoBallPickedUp: [5]bool{false, false, false, false, false},
748 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800749 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700750 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800751 },
752 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700753 TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700754 StartingQuadrant: 2,
755 AutoBallPickedUp: [5]bool{true, false, false, false, true},
756 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800757 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700758 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800759 },
760 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700761 TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700762 StartingQuadrant: 3,
763 AutoBallPickedUp: [5]bool{false, false, true, false, false},
764 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800765 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700766 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800767 },
768 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700769 TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700770 StartingQuadrant: 4,
771 AutoBallPickedUp: [5]bool{false, true, true, false, false},
772 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800773 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700774 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800775 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800776 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800777
Emily Markovabf24c9e2023-02-08 20:31:11 -0800778 matches := []TeamMatch{
779 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
780 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
781 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
782 Alliance: "R", AlliancePosition: 2, TeamNumber: 1236},
783 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
784 Alliance: "R", AlliancePosition: 3, TeamNumber: 1237},
785 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
786 Alliance: "B", AlliancePosition: 1, TeamNumber: 1238},
787 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
788 Alliance: "B", AlliancePosition: 2, TeamNumber: 1239},
789 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
790 Alliance: "B", AlliancePosition: 3, TeamNumber: 1233},
791 }
792
793 for _, match := range matches {
794 err := fixture.db.AddToMatch(match)
795 check(t, err, "Failed to add match")
796 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800797
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800798 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800799 err := fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700800 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800801 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800802
Philipp Schrader7365d322022-03-06 16:40:08 -0800803 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800804 check(t, err, "Failed ReturnStats()")
805
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800806 if !reflect.DeepEqual(correct, got) {
807 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
808 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800809}
Alex Perry871eab92022-03-12 17:43:52 -0800810
Sabina Leaver759090b2023-01-14 20:42:56 -0800811func TestReturnActionsDB(t *testing.T) {
812 fixture := createDatabase(t)
813 defer fixture.TearDown()
814 correct := []Action{
815 Action{
816 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
817 CompletedAction: []byte(""), TimeStamp: 0000, CollectedBy: "",
818 },
819 Action{
820 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
821 CompletedAction: []byte(""), TimeStamp: 0321, CollectedBy: "",
822 },
823 Action{
824 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
825 CompletedAction: []byte(""), TimeStamp: 0222, CollectedBy: "",
826 },
827 Action{
828 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
829 CompletedAction: []byte(""), TimeStamp: 0110, CollectedBy: "",
830 },
831 Action{
832 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
833 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
834 },
835 Action{
836 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
837 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
838 },
839 }
840
Emily Markovabf24c9e2023-02-08 20:31:11 -0800841 matches := []TeamMatch{
842 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
843 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
844 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
845 Alliance: "R", AlliancePosition: 2, TeamNumber: 1236},
846 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
847 Alliance: "R", AlliancePosition: 3, TeamNumber: 1237},
848 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
849 Alliance: "B", AlliancePosition: 1, TeamNumber: 1238},
850 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
851 Alliance: "B", AlliancePosition: 2, TeamNumber: 1239},
852 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
853 Alliance: "B", AlliancePosition: 3, TeamNumber: 1233},
854 }
855
856 for _, match := range matches {
857 err := fixture.db.AddToMatch(match)
858 check(t, err, "Failed to add match")
859 }
Sabina Leaver759090b2023-01-14 20:42:56 -0800860
861 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800862 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -0800863 check(t, err, fmt.Sprint("Failed to add to actions ", i))
864 }
865
866 got, err := fixture.db.ReturnActions()
867 check(t, err, "Failed ReturnActions()")
868
869 if !reflect.DeepEqual(correct, got) {
870 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
871 }
872}
873
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700874func TestRankingsDbUpdate(t *testing.T) {
875 fixture := createDatabase(t)
876 defer fixture.TearDown()
877
878 testDatabase := []Ranking{
879 Ranking{
880 TeamNumber: 123,
881 Losses: 1, Wins: 7, Ties: 2,
882 Rank: 2, Dq: 0,
883 },
884 Ranking{
885 TeamNumber: 124,
886 Losses: 3, Wins: 4, Ties: 0,
887 Rank: 4, Dq: 2,
888 },
889 Ranking{
890 TeamNumber: 125,
891 Losses: 5, Wins: 2, Ties: 0,
892 Rank: 17, Dq: 0,
893 },
894 Ranking{
895 TeamNumber: 126,
896 Losses: 0, Wins: 7, Ties: 0,
897 Rank: 5, Dq: 0,
898 },
899 Ranking{
900 TeamNumber: 125,
901 Losses: 2, Wins: 4, Ties: 1,
902 Rank: 5, Dq: 0,
903 },
904 }
905
906 for i := 0; i < len(testDatabase); i++ {
907 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
908 check(t, err, fmt.Sprint("Failed to add rankings ", i))
909 }
910
911 correct := []Ranking{
912 Ranking{
913 TeamNumber: 125,
914 Losses: 2, Wins: 4, Ties: 1,
915 Rank: 5, Dq: 0,
916 },
917 }
918
919 got, err := fixture.db.QueryRankings(125)
920 check(t, err, "Failed QueryRankings()")
921
Philipp Schradereecb8962022-06-01 21:02:42 -0700922 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700923}
924
Alex Perry871eab92022-03-12 17:43:52 -0800925func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800926 fixture := createDatabase(t)
927 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800928
Philipp Schradereecb8962022-06-01 21:02:42 -0700929 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -0800930
Filip Kujawaf947cb42022-11-21 10:00:30 -0800931 err := fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 1", GoodDriving: true, BadDriving: false, SketchyClimb: false, SolidClimb: true, GoodDefense: false, BadDefense: true})
Alex Perry871eab92022-03-12 17:43:52 -0800932 check(t, err, "Failed to add Note")
Filip Kujawaf947cb42022-11-21 10:00:30 -0800933 err = fixture.db.AddNotes(NotesData{TeamNumber: 1235, Notes: "Note 2", GoodDriving: false, BadDriving: true, SketchyClimb: false, SolidClimb: true, GoodDefense: false, BadDefense: false})
Alex Perry871eab92022-03-12 17:43:52 -0800934 check(t, err, "Failed to add Note")
Filip Kujawaf947cb42022-11-21 10:00:30 -0800935 err = fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 3", GoodDriving: true, BadDriving: false, SketchyClimb: false, SolidClimb: true, GoodDefense: true, BadDefense: false})
Alex Perry871eab92022-03-12 17:43:52 -0800936 check(t, err, "Failed to add Note")
937
Philipp Schrader7365d322022-03-06 16:40:08 -0800938 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800939 check(t, err, "Failed to get Notes")
940
941 if !reflect.DeepEqual(expected, actual) {
942 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
943 }
944}
Filip Kujawa210a03b2022-11-24 14:41:11 -0800945
946func TestDriverRanking(t *testing.T) {
947 fixture := createDatabase(t)
948 defer fixture.TearDown()
949
950 expected := []DriverRankingData{
951 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
952 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
953 }
954
955 err := fixture.db.AddDriverRanking(
956 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
957 )
958 check(t, err, "Failed to add Driver Ranking")
959 err = fixture.db.AddDriverRanking(
960 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
961 )
962 check(t, err, "Failed to add Driver Ranking")
963 err = fixture.db.AddDriverRanking(
964 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
965 )
966 check(t, err, "Failed to add Driver Ranking")
967
968 actual, err := fixture.db.QueryDriverRanking(12)
969 check(t, err, "Failed to get Driver Ranking")
970
971 if !reflect.DeepEqual(expected, actual) {
972 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
973 }
974}
Philipp Schradera8955fb2023-03-05 15:47:19 -0800975
976func TestParsedDriverRanking(t *testing.T) {
977 fixture := createDatabase(t)
978 defer fixture.TearDown()
979
980 expected := []ParsedDriverRankingData{
981 {TeamNumber: "1234", Score: 100},
982 {TeamNumber: "1235", Score: 110},
983 {TeamNumber: "1236", Score: 90},
984 }
985
986 for i := range expected {
987 err := fixture.db.AddParsedDriverRanking(expected[i])
988 check(t, err, "Failed to add Parsed Driver Ranking")
989 }
990
991 actual, err := fixture.db.ReturnAllParsedDriverRankings()
992 check(t, err, "Failed to get Parsed Driver Ranking")
993 if !reflect.DeepEqual(expected, actual) {
994 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
995 }
996
997 // Now update one of the rankings and make sure we get the properly
998 // merged result.
999 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1000 TeamNumber: "1235", Score: 200,
1001 })
1002 check(t, err, "Failed to add Parsed Driver Ranking")
1003
1004 expected = []ParsedDriverRankingData{
1005 {TeamNumber: "1234", Score: 100},
1006 {TeamNumber: "1236", Score: 90},
1007 {TeamNumber: "1235", Score: 200},
1008 }
1009
1010 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1011 check(t, err, "Failed to get Parsed Driver Ranking")
1012 if !reflect.DeepEqual(expected, actual) {
1013 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1014 }
1015}