blob: 294dc13570fe28a8e3e7b320baa08874ad277125 [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"
Philipp Schraderf117fae2022-04-08 20:14:57 -07009 "strings"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080010 "testing"
Philipp Schrader7365d322022-03-06 16:40:08 -080011 "time"
Philipp Schradereecb8962022-06-01 21:02:42 -070012
13 "github.com/davecgh/go-spew/spew"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080014)
15
Philipp Schrader83fc2722022-03-10 21:59:20 -080016// Shortcut for error checking. If the specified error is non-nil, print the
17// error message and exit the test.
18func check(t *testing.T, err error, message string) {
19 if err != nil {
20 t.Fatal(message, ":", err)
21 }
22}
23
Philipp Schrader7365d322022-03-06 16:40:08 -080024type dbFixture struct {
25 db *Database
26 server *exec.Cmd
27}
28
29func (fixture dbFixture) TearDown() {
30 fixture.db.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -080031 log.Println("Shutting down testdb")
32 fixture.server.Process.Signal(os.Interrupt)
33 fixture.server.Process.Wait()
34 log.Println("Successfully shut down testdb")
35}
36
37func createDatabase(t *testing.T) dbFixture {
38 var fixture dbFixture
39
40 log.Println("Starting up postgres.")
41 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
42 fixture.server.Stdout = os.Stdout
43 fixture.server.Stderr = os.Stderr
44 err := fixture.server.Start()
45 check(t, err, "Failed to run postgres")
46
47 // Wait until the server is ready. We cannot rely on the TCP socket
48 // alone because postgres creates the socket before it's actually ready
49 // to service requests.
50 for {
51 fixture.db, err = NewDatabase("test", "password", 5432)
52 if err == nil {
53 break
54 }
55 time.Sleep(50 * time.Millisecond)
56 }
57 log.Println("Connected to postgres.")
58
Philipp Schradereecb8962022-06-01 21:02:42 -070059 fixture.db.SetDebugLogLevel()
60
Philipp Schrader7365d322022-03-06 16:40:08 -080061 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080062}
63
Philipp Schradereecb8962022-06-01 21:02:42 -070064func checkDeepEqual(t *testing.T, expected interface{}, actual interface{}) {
65 if !reflect.DeepEqual(expected, actual) {
66 t.Fatalf(spew.Sprintf("Got %#v,\nbut expected %#v.", actual, expected))
67 }
68}
69
Philipp Schrader4953cc32022-02-25 18:09:02 -080070func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080071 fixture := createDatabase(t)
72 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080073
Emily Markovabf24c9e2023-02-08 20:31:11 -080074 correct := []TeamMatch{
75 TeamMatch{
76 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070077 Alliance: "R", AlliancePosition: 1, TeamNumber: "9999",
Emily Markovabf24c9e2023-02-08 20:31:11 -080078 },
79 TeamMatch{
80 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070081 Alliance: "R", AlliancePosition: 2, TeamNumber: "1000",
Emily Markovabf24c9e2023-02-08 20:31:11 -080082 },
83 TeamMatch{
84 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070085 Alliance: "R", AlliancePosition: 3, TeamNumber: "777",
Emily Markovabf24c9e2023-02-08 20:31:11 -080086 },
87 TeamMatch{
88 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070089 Alliance: "B", AlliancePosition: 1, TeamNumber: "0000",
Emily Markovabf24c9e2023-02-08 20:31:11 -080090 },
91 TeamMatch{
92 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070093 Alliance: "B", AlliancePosition: 2, TeamNumber: "4321",
Emily Markovabf24c9e2023-02-08 20:31:11 -080094 },
95 TeamMatch{
96 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070097 Alliance: "B", AlliancePosition: 3, TeamNumber: "1234",
Philipp Schrader83fc2722022-03-10 21:59:20 -080098 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -080099 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800100
Emily Markovabf24c9e2023-02-08 20:31:11 -0800101 for _, match := range correct {
102 err := fixture.db.AddToMatch(match)
103 check(t, err, "Failed to add match data")
104 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800105
Philipp Schrader7365d322022-03-06 16:40:08 -0800106 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800107 check(t, err, "Failed ReturnMatches()")
108
Philipp Schradereecb8962022-06-01 21:02:42 -0700109 checkDeepEqual(t, correct, got)
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800110}
111
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700112func TestAddOrUpdateRankingsDB(t *testing.T) {
113 fixture := createDatabase(t)
114 defer fixture.TearDown()
115
116 correct := []Ranking{
117 Ranking{
118 TeamNumber: 123,
119 Losses: 1, Wins: 7, Ties: 0,
120 Rank: 2, Dq: 0,
121 },
122 Ranking{
123 TeamNumber: 125,
124 Losses: 2, Wins: 4, Ties: 0,
125 Rank: 2, Dq: 0,
126 },
127 }
128
129 for i := 0; i < len(correct); i++ {
130 err := fixture.db.AddOrUpdateRankings(correct[i])
131 check(t, err, "Failed to add ranking data")
132 }
133
134 got, err := fixture.db.ReturnRankings()
135 check(t, err, "Failed ReturnRankings()")
136
137 if !reflect.DeepEqual(correct, got) {
138 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
139 }
140}
141
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800142func TestAddToStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800143 fixture := createDatabase(t)
144 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800145
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800146 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800147 Stats{
148 TeamNumber: 1236, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700149 StartingQuadrant: 2,
150 AutoBallPickedUp: [5]bool{false, false, false, true, false},
151 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800152 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700153 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
154 Comment: "this is a comment", CollectedBy: "josh",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800155 },
156 Stats{
157 TeamNumber: 1001, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700158 StartingQuadrant: 3,
159 AutoBallPickedUp: [5]bool{true, false, true, true, false},
160 ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800161 ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700162 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
163 Comment: "another comment", CollectedBy: "rupert",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800164 },
165 Stats{
166 TeamNumber: 777, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700167 StartingQuadrant: 4,
168 AutoBallPickedUp: [5]bool{false, true, true, true, false},
169 ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800170 ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700171 PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
172 Comment: "and another", CollectedBy: "felix",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800173 },
174 Stats{
175 TeamNumber: 1000, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700176 StartingQuadrant: 1,
177 AutoBallPickedUp: [5]bool{false, false, false, false, false},
178 ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800179 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700180 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
181 Comment: "and another one", CollectedBy: "thea",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800182 },
183 Stats{
184 TeamNumber: 4321, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700185 StartingQuadrant: 2,
186 AutoBallPickedUp: [5]bool{true, false, false, false, false},
187 ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800188 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700189 PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
190 Comment: "more comment", CollectedBy: "amy",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800191 },
192 Stats{
193 TeamNumber: 1234, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700194 StartingQuadrant: 3,
195 AutoBallPickedUp: [5]bool{false, false, false, false, true},
196 ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800197 ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700198 PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
199 Comment: "final comment", CollectedBy: "beth",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800200 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800201 }
Emily Markovabf24c9e2023-02-08 20:31:11 -0800202 matches := []TeamMatch{
203 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700204 Alliance: "R", AlliancePosition: 1, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800205 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700206 Alliance: "R", AlliancePosition: 2, TeamNumber: "1001"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800207 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700208 Alliance: "R", AlliancePosition: 3, TeamNumber: "777"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800209 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700210 Alliance: "B", AlliancePosition: 1, TeamNumber: "1000"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800211 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700212 Alliance: "B", AlliancePosition: 2, TeamNumber: "4321"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800213 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700214 Alliance: "B", AlliancePosition: 3, TeamNumber: "1234"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800215 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800216
Emily Markovabf24c9e2023-02-08 20:31:11 -0800217 for _, match := range matches {
218 err := fixture.db.AddToMatch(match)
219 check(t, err, "Failed to add match")
220 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800221
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800222 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800223 err := fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800224 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800225 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800226
Philipp Schrader7365d322022-03-06 16:40:08 -0800227 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800228 check(t, err, "Failed ReturnStats()")
229
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800230 if !reflect.DeepEqual(correct, got) {
231 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
232 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800233}
234
Emily Markova290147d2023-03-03 22:40:06 -0800235func TestAddToStats2023DB(t *testing.T) {
236 fixture := createDatabase(t)
237 defer fixture.TearDown()
238
239 correct := []Stats2023{
240 Stats2023{
241 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
242 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
243 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
244 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
245 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
246 HighCubes: 1, CubesDropped: 0, LowCones: 0,
247 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
248 AvgCycle: 0, CollectedBy: "emma",
249 },
250 Stats2023{
251 TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
252 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
253 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
254 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
255 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
256 HighCubes: 0, CubesDropped: 1, LowCones: 0,
257 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
258 AvgCycle: 0, CollectedBy: "tyler",
259 },
260 Stats2023{
261 TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
262 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
263 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
264 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
265 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
266 HighCubes: 2, CubesDropped: 1, LowCones: 1,
267 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
268 AvgCycle: 0, CollectedBy: "isaac",
269 },
270 Stats2023{
271 TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
272 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
273 MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
274 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
275 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 1,
276 HighCubes: 2, CubesDropped: 1, LowCones: 0,
277 MiddleCones: 1, HighCones: 0, ConesDropped: 0,
278 AvgCycle: 0, CollectedBy: "will",
279 },
280 Stats2023{
281 TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
282 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
283 MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
284 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
285 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
286 HighCubes: 0, CubesDropped: 2, LowCones: 1,
287 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
288 AvgCycle: 0, CollectedBy: "unkown",
289 },
290 }
291
292 matches := []TeamMatch{
293 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700294 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Emily Markova290147d2023-03-03 22:40:06 -0800295 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700296 Alliance: "R", AlliancePosition: 2, TeamNumber: "7454"},
Emily Markova290147d2023-03-03 22:40:06 -0800297 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700298 Alliance: "R", AlliancePosition: 3, TeamNumber: "4354"},
Emily Markova290147d2023-03-03 22:40:06 -0800299 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700300 Alliance: "B", AlliancePosition: 1, TeamNumber: "6533"},
Emily Markova290147d2023-03-03 22:40:06 -0800301 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700302 Alliance: "B", AlliancePosition: 2, TeamNumber: "8354"},
Emily Markova290147d2023-03-03 22:40:06 -0800303 }
304
305 for _, match := range matches {
306 err := fixture.db.AddToMatch(match)
307 check(t, err, "Failed to add match")
308 }
309
310 for i := 0; i < len(correct); i++ {
311 err := fixture.db.AddToStats2023(correct[i])
312 check(t, err, "Failed to add 2023stats to DB")
313 }
314
315 got, err := fixture.db.ReturnStats2023()
316 check(t, err, "Failed ReturnStats2023()")
317
318 if !reflect.DeepEqual(correct, got) {
319 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
320 }
321}
322
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800323func TestQueryingStats2023ByTeam(t *testing.T) {
324 fixture := createDatabase(t)
325 defer fixture.TearDown()
326
327 stats := []Stats2023{
328 Stats2023{
329 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
330 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
331 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
332 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
333 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
334 HighCubes: 1, CubesDropped: 0, LowCones: 0,
335 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
336 AvgCycle: 0, CollectedBy: "emma",
337 },
338 Stats2023{
339 TeamNumber: "7454", MatchNumber: 4, SetNumber: 1,
340 CompLevel: "qm", StartingQuadrant: 2, LowCubesAuto: 1,
341 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
342 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
343 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
344 HighCubes: 0, CubesDropped: 1, LowCones: 0,
345 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
346 AvgCycle: 0, CollectedBy: "tyler",
347 },
348 Stats2023{
349 TeamNumber: "6344", MatchNumber: 5, SetNumber: 1,
350 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
351 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
352 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
353 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
354 HighCubes: 1, CubesDropped: 0, LowCones: 0,
355 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
356 AvgCycle: 0, CollectedBy: "emma",
357 },
358 }
359
360 matches := []TeamMatch{
361 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700362 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800363 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700364 Alliance: "R", AlliancePosition: 1, TeamNumber: "7454"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800365 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700366 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800367 }
368
369 for _, match := range matches {
370 err := fixture.db.AddToMatch(match)
371 check(t, err, "Failed to add match")
372 }
373
374 for i := range stats {
375 err := fixture.db.AddToStats2023(stats[i])
376 check(t, err, "Failed to add 2023stats to DB")
377 }
378
379 // Validate that requesting status for a single team gets us the
380 // expected data.
381 statsFor6344, err := fixture.db.ReturnStats2023ForTeam("6344", 3, 1, "qm")
382 check(t, err, "Failed ReturnStats2023()")
383
384 if !reflect.DeepEqual([]Stats2023{stats[0]}, statsFor6344) {
385 t.Errorf("Got %#v,\nbut expected %#v.", statsFor6344, stats[0])
386 }
387
388 // Validate that requesting team data for a non-existent match returns
389 // nothing.
390 statsForMissing, err := fixture.db.ReturnStats2023ForTeam("6344", 9, 1, "qm")
391 check(t, err, "Failed ReturnStats2023()")
392
393 if !reflect.DeepEqual([]Stats2023{}, statsForMissing) {
394 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2023{})
395 }
396}
397
Philipp Schraderf117fae2022-04-08 20:14:57 -0700398func TestAddDuplicateStats(t *testing.T) {
399 fixture := createDatabase(t)
400 defer fixture.TearDown()
401
402 stats := Stats{
403 TeamNumber: 1236, MatchNumber: 7,
Philipp Schradereecb8962022-06-01 21:02:42 -0700404 SetNumber: 1, CompLevel: "qual",
Philipp Schraderf117fae2022-04-08 20:14:57 -0700405 StartingQuadrant: 2,
406 AutoBallPickedUp: [5]bool{false, false, false, true, false},
407 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
408 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
409 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
410 Comment: "this is a comment", CollectedBy: "josh",
411 }
412
Emily Markovabf24c9e2023-02-08 20:31:11 -0800413 matches := []TeamMatch{
414 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700415 Alliance: "R", AlliancePosition: 1, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800416 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700417 Alliance: "R", AlliancePosition: 2, TeamNumber: "1001"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800418 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700419 Alliance: "R", AlliancePosition: 3, TeamNumber: "777"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800420 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700421 Alliance: "B", AlliancePosition: 1, TeamNumber: "1000"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800422 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700423 Alliance: "B", AlliancePosition: 2, TeamNumber: "4321"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800424 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700425 Alliance: "B", AlliancePosition: 3, TeamNumber: "1234"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800426 }
427
428 for _, match := range matches {
429 err := fixture.db.AddToMatch(match)
430 check(t, err, "Failed to add match")
431 }
Philipp Schraderf117fae2022-04-08 20:14:57 -0700432
433 // Add stats. This should succeed.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800434 err := fixture.db.AddToStats(stats)
Philipp Schraderf117fae2022-04-08 20:14:57 -0700435 check(t, err, "Failed to add stats to DB")
436
437 // Try again. It should fail this time.
438 err = fixture.db.AddToStats(stats)
439 if err == nil {
440 t.Fatal("Failed to get error when adding duplicate stats.")
441 }
442 if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
443 t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
444 }
445}
446
Emily Markova6b551e02023-02-18 17:37:40 -0800447func TestDeleteFromStats(t *testing.T) {
448 fixture := createDatabase(t)
449 defer fixture.TearDown()
450
451 startingStats := []Stats2023{
452 Stats2023{
453 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
454 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
455 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
456 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
457 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
458 HighCubes: 2, CubesDropped: 1, LowCones: 1,
459 MiddleCones: 0, HighCones: 1, ConesDropped: 2,
460 AvgCycle: 58, CollectedBy: "unknown",
461 },
462 Stats2023{
463 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
464 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
465 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
466 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
467 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
468 HighCubes: 1, CubesDropped: 0, LowCones: 0,
469 MiddleCones: 2, HighCones: 1, ConesDropped: 0,
470 AvgCycle: 34, CollectedBy: "simon",
471 },
472 Stats2023{
473 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
474 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
475 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
476 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
477 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
478 HighCubes: 0, CubesDropped: 0, LowCones: 2,
479 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
480 AvgCycle: 50, CollectedBy: "eliza",
481 },
482 Stats2023{
483 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
484 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
485 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
486 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
487 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
488 HighCubes: 2, CubesDropped: 1, LowCones: 0,
489 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
490 AvgCycle: 49, CollectedBy: "isaac",
491 },
492 Stats2023{
493 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
494 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
495 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
496 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
497 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
498 HighCubes: 0, CubesDropped: 0, LowCones: 1,
499 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
500 AvgCycle: 70, CollectedBy: "sam",
501 },
502 }
503
504 correct := []Stats2023{
505 Stats2023{
506 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
507 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
508 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
509 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
510 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
511 HighCubes: 0, CubesDropped: 0, LowCones: 2,
512 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
513 AvgCycle: 50, CollectedBy: "eliza",
514 },
515 Stats2023{
516 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
517 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
518 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
519 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
520 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
521 HighCubes: 0, CubesDropped: 0, LowCones: 1,
522 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
523 AvgCycle: 70, CollectedBy: "sam",
524 },
525 }
526
527 originalMatches := []TeamMatch{
528 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700529 Alliance: "R", AlliancePosition: 1, TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800530 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700531 Alliance: "B", AlliancePosition: 1, TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800532 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700533 Alliance: "R", AlliancePosition: 3, TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800534 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700535 Alliance: "B", AlliancePosition: 2, TeamNumber: "2454"},
Emily Markova6b551e02023-02-18 17:37:40 -0800536 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700537 Alliance: "B", AlliancePosition: 3, TeamNumber: "3242"},
Emily Markova6b551e02023-02-18 17:37:40 -0800538 }
539
540 // Matches for which we want to delete the stats.
541 matches := []TeamMatch{
542 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700543 TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800544 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700545 TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800546 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700547 TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800548 }
549
550 for _, match := range originalMatches {
551 err := fixture.db.AddToMatch(match)
552 check(t, err, "Failed to add match")
553 fmt.Println("Match has been added : ", match.TeamNumber)
554 }
555
556 for _, stat := range startingStats {
557 err := fixture.db.AddToStats2023(stat)
558 check(t, err, "Failed to add stat")
559 }
560
561 for _, match := range matches {
Emily Markovab8551572023-03-22 19:49:39 -0700562 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
Emily Markova6b551e02023-02-18 17:37:40 -0800563 check(t, err, "Failed to delete stat")
564 }
565
566 got, err := fixture.db.ReturnStats2023()
567 check(t, err, "Failed ReturnStats()")
568
569 if !reflect.DeepEqual(correct, got) {
570 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
571 }
572}
573
Milo Lina72e2002022-04-06 20:31:13 -0700574func TestQueryShiftDB(t *testing.T) {
575 fixture := createDatabase(t)
576 defer fixture.TearDown()
577
578 testDatabase := []Shift{
579 Shift{
580 MatchNumber: 1,
581 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
582 },
583 Shift{
584 MatchNumber: 2,
585 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
586 },
587 }
588
589 for i := 0; i < len(testDatabase); i++ {
590 err := fixture.db.AddToShift(testDatabase[i])
591 check(t, err, fmt.Sprint("Failed to add shift", i))
592 }
593
594 correct := []Shift{
595 Shift{
596 MatchNumber: 1,
597 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
598 },
599 }
600
601 got, err := fixture.db.QueryAllShifts(1)
602 check(t, err, "Failed to query shift for match 1")
603
604 if !reflect.DeepEqual(correct, got) {
605 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
606 }
607}
608
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800609func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800610 fixture := createDatabase(t)
611 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800612
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800613 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800614 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700615 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700616 StartingQuadrant: 1,
617 AutoBallPickedUp: [5]bool{false, false, false, false, false},
618 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800619 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700620 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800621 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700622 TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700623 StartingQuadrant: 2,
624 AutoBallPickedUp: [5]bool{false, false, false, false, true},
625 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800626 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700627 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800628 },
629 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700630 TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700631 StartingQuadrant: 3,
632 AutoBallPickedUp: [5]bool{false, false, false, false, false},
633 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800634 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700635 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800636 },
637 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700638 TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700639 StartingQuadrant: 2,
640 AutoBallPickedUp: [5]bool{true, false, false, false, true},
641 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800642 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700643 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800644 },
645 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700646 TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700647 StartingQuadrant: 3,
648 AutoBallPickedUp: [5]bool{false, false, true, false, false},
649 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800650 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700651 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800652 },
653 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700654 TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700655 StartingQuadrant: 4,
656 AutoBallPickedUp: [5]bool{false, true, true, false, false},
657 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800658 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700659 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800660 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800661 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800662
Emily Markovabf24c9e2023-02-08 20:31:11 -0800663 matches := []TeamMatch{
664 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700665 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800666 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700667 Alliance: "R", AlliancePosition: 2, TeamNumber: "1234"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800668 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700669 Alliance: "R", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800670 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700671 Alliance: "B", AlliancePosition: 1, TeamNumber: "1232"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800672 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700673 Alliance: "B", AlliancePosition: 2, TeamNumber: "1231"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800674 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700675 Alliance: "B", AlliancePosition: 3, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800676 }
677
678 for _, match := range matches {
679 err := fixture.db.AddToMatch(match)
680 check(t, err, "Failed to add match")
681 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800682
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800683 for i := 0; i < len(testDatabase); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800684 err := fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700685 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800686 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800687
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800688 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800689 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700690 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700691 StartingQuadrant: 1,
692 AutoBallPickedUp: [5]bool{false, false, false, false, false},
693 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800694 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700695 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800696 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800697 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800698
Philipp Schrader7365d322022-03-06 16:40:08 -0800699 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800700 check(t, err, "Failed QueryStats()")
701
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800702 if !reflect.DeepEqual(correct, got) {
703 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
704 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800705}
706
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700707func TestQueryRankingsDB(t *testing.T) {
708 fixture := createDatabase(t)
709 defer fixture.TearDown()
710
711 testDatabase := []Ranking{
712 Ranking{
713 TeamNumber: 123,
714 Losses: 1, Wins: 7, Ties: 2,
715 Rank: 2, Dq: 0,
716 },
717 Ranking{
718 TeamNumber: 124,
719 Losses: 3, Wins: 4, Ties: 0,
720 Rank: 4, Dq: 2,
721 },
722 Ranking{
723 TeamNumber: 125,
724 Losses: 5, Wins: 2, Ties: 0,
725 Rank: 17, Dq: 0,
726 },
727 Ranking{
728 TeamNumber: 126,
729 Losses: 0, Wins: 7, Ties: 0,
730 Rank: 5, Dq: 0,
731 },
732 }
733
734 for i := 0; i < len(testDatabase); i++ {
735 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
736 check(t, err, fmt.Sprint("Failed to add rankings ", i))
737 }
738
739 correct := []Ranking{
740 Ranking{
741 TeamNumber: 126,
742 Losses: 0, Wins: 7, Ties: 0,
743 Rank: 5, Dq: 0,
744 },
745 }
746
747 got, err := fixture.db.QueryRankings(126)
748 check(t, err, "Failed QueryRankings()")
749
750 if !reflect.DeepEqual(correct, got) {
751 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
752 }
753}
754
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800755func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800756 fixture := createDatabase(t)
757 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800758
Emily Markovabf24c9e2023-02-08 20:31:11 -0800759 correct := []TeamMatch{
760 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700761 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: "6835"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800762 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700763 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "4834"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800764 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700765 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "9824"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800766 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700767 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800768 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700769 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800770 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800771
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800772 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800773 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800774 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800775 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800776
Philipp Schrader7365d322022-03-06 16:40:08 -0800777 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800778 check(t, err, "Failed ReturnMatches()")
779
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800780 if !reflect.DeepEqual(correct, got) {
781 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
782 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800783}
784
Philipp Schraderfe583842022-04-08 19:47:07 -0700785func TestOverwriteNewMatchData(t *testing.T) {
786 fixture := createDatabase(t)
787 defer fixture.TearDown()
788
Emily Markovabf24c9e2023-02-08 20:31:11 -0800789 testDatabase := []TeamMatch{
790 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700791 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "4464"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800792 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700793 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800794 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700795 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700796 }
797
798 for i := 0; i < len(testDatabase); i++ {
799 err := fixture.db.AddToMatch(testDatabase[i])
800 check(t, err, fmt.Sprint("Failed to add match", i))
801 }
802
Emily Markovabf24c9e2023-02-08 20:31:11 -0800803 correct := []TeamMatch{
804 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700805 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800806 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700807 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700808 }
809
810 got, err := fixture.db.ReturnMatches()
811 check(t, err, "Failed to get match list")
812
813 if !reflect.DeepEqual(correct, got) {
814 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
815 }
816}
817
Milo Lina72e2002022-04-06 20:31:13 -0700818func TestAddReturnShiftDB(t *testing.T) {
819 fixture := createDatabase(t)
820 defer fixture.TearDown()
821
822 correct := []Shift{
823 Shift{
824 MatchNumber: 1,
825 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
826 },
827 Shift{
828 MatchNumber: 2,
829 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
830 },
831 }
832
833 for i := 0; i < len(correct); i++ {
834 err := fixture.db.AddToShift(correct[i])
835 check(t, err, fmt.Sprint("Failed to add shift", i))
836 }
837
838 got, err := fixture.db.ReturnAllShifts()
839 check(t, err, "Failed ReturnAllShifts()")
840
841 if !reflect.DeepEqual(correct, got) {
842 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
843 }
844}
845
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700846func TestReturnRankingsDB(t *testing.T) {
847 fixture := createDatabase(t)
848 defer fixture.TearDown()
849
850 correct := []Ranking{
851 Ranking{
852 TeamNumber: 123,
853 Losses: 1, Wins: 7, Ties: 2,
854 Rank: 2, Dq: 0,
855 },
856 Ranking{
857 TeamNumber: 124,
858 Losses: 3, Wins: 4, Ties: 0,
859 Rank: 4, Dq: 2,
860 },
861 Ranking{
862 TeamNumber: 125,
863 Losses: 5, Wins: 2, Ties: 0,
864 Rank: 17, Dq: 0,
865 },
866 Ranking{
867 TeamNumber: 126,
868 Losses: 0, Wins: 7, Ties: 0,
869 Rank: 5, Dq: 0,
870 },
871 }
872
873 for i := 0; i < len(correct); i++ {
874 err := fixture.db.AddOrUpdateRankings(correct[i])
875 check(t, err, fmt.Sprint("Failed to add rankings", i))
876 }
877
878 got, err := fixture.db.ReturnRankings()
879 check(t, err, "Failed ReturnRankings()")
880
881 if !reflect.DeepEqual(correct, got) {
882 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
883 }
884}
885
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800886func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800887 fixture := createDatabase(t)
888 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800889
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800890 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800891 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700892 TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700893 StartingQuadrant: 1,
894 AutoBallPickedUp: [5]bool{false, false, false, false, false},
895 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800896 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700897 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800898 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700899 TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700900 StartingQuadrant: 2,
901 AutoBallPickedUp: [5]bool{false, false, false, false, true},
902 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800903 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700904 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800905 },
906 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700907 TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700908 StartingQuadrant: 3,
909 AutoBallPickedUp: [5]bool{false, false, false, false, false},
910 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800911 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700912 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800913 },
914 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700915 TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700916 StartingQuadrant: 2,
917 AutoBallPickedUp: [5]bool{true, false, false, false, true},
918 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800919 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700920 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800921 },
922 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700923 TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700924 StartingQuadrant: 3,
925 AutoBallPickedUp: [5]bool{false, false, true, false, false},
926 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800927 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700928 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800929 },
930 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700931 TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700932 StartingQuadrant: 4,
933 AutoBallPickedUp: [5]bool{false, true, true, false, false},
934 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800935 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700936 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800937 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800938 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800939
Emily Markovabf24c9e2023-02-08 20:31:11 -0800940 matches := []TeamMatch{
941 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700942 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800943 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700944 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800945 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700946 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800947 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700948 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800949 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700950 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800951 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700952 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800953 }
954
955 for _, match := range matches {
956 err := fixture.db.AddToMatch(match)
957 check(t, err, "Failed to add match")
958 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800959
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800960 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800961 err := fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700962 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800963 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800964
Philipp Schrader7365d322022-03-06 16:40:08 -0800965 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800966 check(t, err, "Failed ReturnStats()")
967
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800968 if !reflect.DeepEqual(correct, got) {
969 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
970 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800971}
Alex Perry871eab92022-03-12 17:43:52 -0800972
Emily Markova290147d2023-03-03 22:40:06 -0800973func TestReturnStats2023DB(t *testing.T) {
974 fixture := createDatabase(t)
975 defer fixture.TearDown()
976
977 correct := []Stats2023{
978 Stats2023{
979 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
980 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
981 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
982 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
983 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
984 HighCubes: 1, CubesDropped: 0, LowCones: 2,
985 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
986 AvgCycle: 51, CollectedBy: "isaac",
987 },
988 Stats2023{
989 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
990 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
991 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
992 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
993 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
994 HighCubes: 1, CubesDropped: 0, LowCones: 1,
995 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
996 AvgCycle: 39, CollectedBy: "jack",
997 },
998 Stats2023{
999 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
1000 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
1001 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
1002 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1003 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1004 HighCubes: 0, CubesDropped: 0, LowCones: 1,
1005 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
1006 AvgCycle: 45, CollectedBy: "martin",
1007 },
1008 Stats2023{
1009 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
1010 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
1011 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
1012 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1013 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1014 HighCubes: 0, CubesDropped: 0, LowCones: 2,
1015 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
1016 AvgCycle: 34, CollectedBy: "unknown",
1017 },
1018 }
1019
1020 matches := []TeamMatch{
1021 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001022 Alliance: "R", AlliancePosition: 1, TeamNumber: "2343"},
Emily Markova290147d2023-03-03 22:40:06 -08001023 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001024 Alliance: "R", AlliancePosition: 2, TeamNumber: "5443"},
Emily Markova290147d2023-03-03 22:40:06 -08001025 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001026 Alliance: "R", AlliancePosition: 3, TeamNumber: "5436"},
Emily Markova290147d2023-03-03 22:40:06 -08001027 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001028 Alliance: "B", AlliancePosition: 1, TeamNumber: "5643"},
Emily Markova290147d2023-03-03 22:40:06 -08001029 }
1030
1031 for _, match := range matches {
1032 err := fixture.db.AddToMatch(match)
1033 check(t, err, "Failed to add match")
1034 }
1035
1036 for i := 0; i < len(correct); i++ {
1037 err := fixture.db.AddToStats2023(correct[i])
1038 check(t, err, fmt.Sprint("Failed to add stats ", i))
1039 }
1040
1041 got, err := fixture.db.ReturnStats2023()
1042 check(t, err, "Failed ReturnStats()")
1043
1044 if !reflect.DeepEqual(correct, got) {
1045 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1046 }
1047}
1048
Sabina Leaver759090b2023-01-14 20:42:56 -08001049func TestReturnActionsDB(t *testing.T) {
1050 fixture := createDatabase(t)
1051 defer fixture.TearDown()
1052 correct := []Action{
1053 Action{
1054 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1055 CompletedAction: []byte(""), TimeStamp: 0000, CollectedBy: "",
1056 },
1057 Action{
1058 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1059 CompletedAction: []byte(""), TimeStamp: 0321, CollectedBy: "",
1060 },
1061 Action{
1062 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1063 CompletedAction: []byte(""), TimeStamp: 0222, CollectedBy: "",
1064 },
1065 Action{
1066 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1067 CompletedAction: []byte(""), TimeStamp: 0110, CollectedBy: "",
1068 },
1069 Action{
1070 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1071 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
1072 },
1073 Action{
1074 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1075 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
1076 },
1077 }
1078
Emily Markovabf24c9e2023-02-08 20:31:11 -08001079 matches := []TeamMatch{
1080 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001081 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001082 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001083 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001084 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001085 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001086 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001087 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001088 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001089 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001090 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001091 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001092 }
1093
1094 for _, match := range matches {
1095 err := fixture.db.AddToMatch(match)
1096 check(t, err, "Failed to add match")
1097 }
Sabina Leaver759090b2023-01-14 20:42:56 -08001098
1099 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001100 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -08001101 check(t, err, fmt.Sprint("Failed to add to actions ", i))
1102 }
1103
1104 got, err := fixture.db.ReturnActions()
1105 check(t, err, "Failed ReturnActions()")
1106
1107 if !reflect.DeepEqual(correct, got) {
1108 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1109 }
1110}
1111
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001112func TestRankingsDbUpdate(t *testing.T) {
1113 fixture := createDatabase(t)
1114 defer fixture.TearDown()
1115
1116 testDatabase := []Ranking{
1117 Ranking{
1118 TeamNumber: 123,
1119 Losses: 1, Wins: 7, Ties: 2,
1120 Rank: 2, Dq: 0,
1121 },
1122 Ranking{
1123 TeamNumber: 124,
1124 Losses: 3, Wins: 4, Ties: 0,
1125 Rank: 4, Dq: 2,
1126 },
1127 Ranking{
1128 TeamNumber: 125,
1129 Losses: 5, Wins: 2, Ties: 0,
1130 Rank: 17, Dq: 0,
1131 },
1132 Ranking{
1133 TeamNumber: 126,
1134 Losses: 0, Wins: 7, Ties: 0,
1135 Rank: 5, Dq: 0,
1136 },
1137 Ranking{
1138 TeamNumber: 125,
1139 Losses: 2, Wins: 4, Ties: 1,
1140 Rank: 5, Dq: 0,
1141 },
1142 }
1143
1144 for i := 0; i < len(testDatabase); i++ {
1145 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
1146 check(t, err, fmt.Sprint("Failed to add rankings ", i))
1147 }
1148
1149 correct := []Ranking{
1150 Ranking{
1151 TeamNumber: 125,
1152 Losses: 2, Wins: 4, Ties: 1,
1153 Rank: 5, Dq: 0,
1154 },
1155 }
1156
1157 got, err := fixture.db.QueryRankings(125)
1158 check(t, err, "Failed QueryRankings()")
1159
Philipp Schradereecb8962022-06-01 21:02:42 -07001160 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001161}
1162
Alex Perry871eab92022-03-12 17:43:52 -08001163func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -08001164 fixture := createDatabase(t)
1165 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -08001166
Philipp Schradereecb8962022-06-01 21:02:42 -07001167 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -08001168
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001169 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 -08001170 check(t, err, "Failed to add Note")
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001171 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 -08001172 check(t, err, "Failed to add Note")
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001173 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 -08001174 check(t, err, "Failed to add Note")
1175
Philipp Schrader7365d322022-03-06 16:40:08 -08001176 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -08001177 check(t, err, "Failed to get Notes")
1178
1179 if !reflect.DeepEqual(expected, actual) {
1180 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1181 }
1182}
Filip Kujawa210a03b2022-11-24 14:41:11 -08001183
1184func TestDriverRanking(t *testing.T) {
1185 fixture := createDatabase(t)
1186 defer fixture.TearDown()
1187
1188 expected := []DriverRankingData{
1189 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1190 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1191 }
1192
1193 err := fixture.db.AddDriverRanking(
1194 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1195 )
1196 check(t, err, "Failed to add Driver Ranking")
1197 err = fixture.db.AddDriverRanking(
1198 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1199 )
1200 check(t, err, "Failed to add Driver Ranking")
1201 err = fixture.db.AddDriverRanking(
1202 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
1203 )
1204 check(t, err, "Failed to add Driver Ranking")
1205
1206 actual, err := fixture.db.QueryDriverRanking(12)
1207 check(t, err, "Failed to get Driver Ranking")
1208
1209 if !reflect.DeepEqual(expected, actual) {
1210 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1211 }
1212}
Philipp Schradera8955fb2023-03-05 15:47:19 -08001213
1214func TestParsedDriverRanking(t *testing.T) {
1215 fixture := createDatabase(t)
1216 defer fixture.TearDown()
1217
1218 expected := []ParsedDriverRankingData{
1219 {TeamNumber: "1234", Score: 100},
1220 {TeamNumber: "1235", Score: 110},
1221 {TeamNumber: "1236", Score: 90},
1222 }
1223
1224 for i := range expected {
1225 err := fixture.db.AddParsedDriverRanking(expected[i])
1226 check(t, err, "Failed to add Parsed Driver Ranking")
1227 }
1228
1229 actual, err := fixture.db.ReturnAllParsedDriverRankings()
1230 check(t, err, "Failed to get Parsed Driver Ranking")
1231 if !reflect.DeepEqual(expected, actual) {
1232 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1233 }
1234
1235 // Now update one of the rankings and make sure we get the properly
1236 // merged result.
1237 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1238 TeamNumber: "1235", Score: 200,
1239 })
1240 check(t, err, "Failed to add Parsed Driver Ranking")
1241
1242 expected = []ParsedDriverRankingData{
1243 {TeamNumber: "1234", Score: 100},
1244 {TeamNumber: "1236", Score: 90},
1245 {TeamNumber: "1235", Score: 200},
1246 }
1247
1248 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1249 check(t, err, "Failed to get Parsed Driver Ranking")
1250 if !reflect.DeepEqual(expected, actual) {
1251 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1252 }
1253}