blob: b4f8d968e0b5f72602d01d1ef7b280a229e10598 [file] [log] [blame]
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001package db
2
3import (
Philipp Schrader83fc2722022-03-10 21:59:20 -08004 "fmt"
Philipp Schrader7365d322022-03-06 16:40:08 -08005 "log"
Philipp Schrader4953cc32022-02-25 18:09:02 -08006 "os"
Philipp Schrader7365d322022-03-06 16:40:08 -08007 "os/exec"
Sabina Leaverc5fd2772022-01-29 17:00:23 -08008 "reflect"
9 "testing"
Philipp Schrader7365d322022-03-06 16:40:08 -080010 "time"
Philipp Schradereecb8962022-06-01 21:02:42 -070011
12 "github.com/davecgh/go-spew/spew"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080013)
14
Philipp Schrader83fc2722022-03-10 21:59:20 -080015// Shortcut for error checking. If the specified error is non-nil, print the
16// error message and exit the test.
17func check(t *testing.T, err error, message string) {
18 if err != nil {
19 t.Fatal(message, ":", err)
20 }
21}
22
Philipp Schrader7365d322022-03-06 16:40:08 -080023type dbFixture struct {
24 db *Database
25 server *exec.Cmd
26}
27
28func (fixture dbFixture) TearDown() {
29 fixture.db.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -080030 log.Println("Shutting down testdb")
31 fixture.server.Process.Signal(os.Interrupt)
32 fixture.server.Process.Wait()
33 log.Println("Successfully shut down testdb")
34}
35
36func createDatabase(t *testing.T) dbFixture {
37 var fixture dbFixture
38
39 log.Println("Starting up postgres.")
40 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
41 fixture.server.Stdout = os.Stdout
42 fixture.server.Stderr = os.Stderr
43 err := fixture.server.Start()
44 check(t, err, "Failed to run postgres")
45
46 // Wait until the server is ready. We cannot rely on the TCP socket
47 // alone because postgres creates the socket before it's actually ready
48 // to service requests.
49 for {
50 fixture.db, err = NewDatabase("test", "password", 5432)
51 if err == nil {
52 break
53 }
54 time.Sleep(50 * time.Millisecond)
55 }
56 log.Println("Connected to postgres.")
57
Philipp Schradereecb8962022-06-01 21:02:42 -070058 fixture.db.SetDebugLogLevel()
59
Philipp Schrader7365d322022-03-06 16:40:08 -080060 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080061}
62
Philipp Schradereecb8962022-06-01 21:02:42 -070063func checkDeepEqual(t *testing.T, expected interface{}, actual interface{}) {
64 if !reflect.DeepEqual(expected, actual) {
65 t.Fatalf(spew.Sprintf("Got %#v,\nbut expected %#v.", actual, expected))
66 }
67}
68
Philipp Schrader4953cc32022-02-25 18:09:02 -080069func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080070 fixture := createDatabase(t)
71 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080072
Emily Markovabf24c9e2023-02-08 20:31:11 -080073 correct := []TeamMatch{
74 TeamMatch{
75 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070076 Alliance: "R", AlliancePosition: 1, TeamNumber: "9999",
Emily Markovabf24c9e2023-02-08 20:31:11 -080077 },
78 TeamMatch{
79 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070080 Alliance: "R", AlliancePosition: 2, TeamNumber: "1000",
Emily Markovabf24c9e2023-02-08 20:31:11 -080081 },
82 TeamMatch{
83 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070084 Alliance: "R", AlliancePosition: 3, TeamNumber: "777",
Emily Markovabf24c9e2023-02-08 20:31:11 -080085 },
86 TeamMatch{
87 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070088 Alliance: "B", AlliancePosition: 1, TeamNumber: "0000",
Emily Markovabf24c9e2023-02-08 20:31:11 -080089 },
90 TeamMatch{
91 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070092 Alliance: "B", AlliancePosition: 2, TeamNumber: "4321",
Emily Markovabf24c9e2023-02-08 20:31:11 -080093 },
94 TeamMatch{
95 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070096 Alliance: "B", AlliancePosition: 3, TeamNumber: "1234",
Philipp Schrader83fc2722022-03-10 21:59:20 -080097 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -080098 }
Philipp Schrader83fc2722022-03-10 21:59:20 -080099
Emily Markovabf24c9e2023-02-08 20:31:11 -0800100 for _, match := range correct {
101 err := fixture.db.AddToMatch(match)
102 check(t, err, "Failed to add match data")
103 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800104
Philipp Schrader7365d322022-03-06 16:40:08 -0800105 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800106 check(t, err, "Failed ReturnMatches()")
107
Philipp Schradereecb8962022-06-01 21:02:42 -0700108 checkDeepEqual(t, correct, got)
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800109}
110
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700111func TestAddOrUpdateRankingsDB(t *testing.T) {
112 fixture := createDatabase(t)
113 defer fixture.TearDown()
114
115 correct := []Ranking{
116 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800117 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700118 Losses: 1, Wins: 7, Ties: 0,
119 Rank: 2, Dq: 0,
120 },
121 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800122 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700123 Losses: 2, Wins: 4, Ties: 0,
124 Rank: 2, Dq: 0,
125 },
126 }
127
128 for i := 0; i < len(correct); i++ {
129 err := fixture.db.AddOrUpdateRankings(correct[i])
130 check(t, err, "Failed to add ranking data")
131 }
132
133 got, err := fixture.db.ReturnRankings()
134 check(t, err, "Failed ReturnRankings()")
135
136 if !reflect.DeepEqual(correct, got) {
137 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
138 }
139}
140
Emily Markova8cb91312024-02-02 12:30:37 -0800141func TestAddToStats2024DB(t *testing.T) {
142 fixture := createDatabase(t)
143 defer fixture.TearDown()
144
145 correct := []Stats2024{
146 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700147 CompType: "Regular", TeamNumber: "894",
Emily Markova8cb91312024-02-02 12:30:37 -0800148 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
149 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovaf17f2812024-04-03 20:55:12 -0700150 Speaker: 0, Amp: 5, SpeakerAmplified: 1,
151 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
152 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800153 },
154 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700155 CompType: "Regular", TeamNumber: "942",
Emily Markova8cb91312024-02-02 12:30:37 -0800156 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
157 SpeakerAuto: 2, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700158 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800159 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700160 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "harry",
Emily Markova8cb91312024-02-02 12:30:37 -0800161 },
162 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700163 CompType: "Practice", TeamNumber: "942",
164 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 3,
165 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
166 Speaker: 2, Amp: 1, SpeakerAmplified: 3,
167 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700168 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kaleb",
Emily Markova9c18e9c2024-04-03 20:06:27 -0700169 },
170 Stats2024{
171 CompType: "Regular", TeamNumber: "432",
Emily Markova8cb91312024-02-02 12:30:37 -0800172 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 3,
173 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700174 Speaker: 2, Amp: 1, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800175 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700176 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "henry",
Emily Markova8cb91312024-02-02 12:30:37 -0800177 },
178 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700179 CompType: "Regular", TeamNumber: "52A",
Emily Markova8cb91312024-02-02 12:30:37 -0800180 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
181 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700182 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800183 NotesDropped: 2, Penalties: 0, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700184 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "jordan",
Emily Markova8cb91312024-02-02 12:30:37 -0800185 },
186 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700187 CompType: "Regular", TeamNumber: "745",
Emily Markova8cb91312024-02-02 12:30:37 -0800188 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
189 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700190 Speaker: 5, Amp: 0, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800191 NotesDropped: 1, Penalties: 1, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700192 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "taylor",
Emily Markova8cb91312024-02-02 12:30:37 -0800193 },
194 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700195 CompType: "Regular", TeamNumber: "934",
Emily Markova8cb91312024-02-02 12:30:37 -0800196 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 3,
197 SpeakerAuto: 1, AmpAuto: 3, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700198 Speaker: 0, Amp: 3, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800199 NotesDropped: 0, Penalties: 3, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700200 Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: true, CollectedBy: "katie",
Emily Markova8cb91312024-02-02 12:30:37 -0800201 },
202 }
203
204 matches := []TeamMatch{
205 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
206 Alliance: "R", AlliancePosition: 1, TeamNumber: "894"},
207 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
208 Alliance: "R", AlliancePosition: 2, TeamNumber: "942"},
209 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
210 Alliance: "R", AlliancePosition: 3, TeamNumber: "432"},
211 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
212 Alliance: "B", AlliancePosition: 1, TeamNumber: "52A"},
213 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
214 Alliance: "B", AlliancePosition: 2, TeamNumber: "745"},
215 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
216 Alliance: "B", AlliancePosition: 3, TeamNumber: "934"},
217 }
218
219 for _, match := range matches {
220 err := fixture.db.AddToMatch(match)
221 check(t, err, "Failed to add match")
222 }
223
224 for i := 0; i < len(correct); i++ {
225 err := fixture.db.AddToStats2024(correct[i])
226 check(t, err, "Failed to add 2024stats to DB")
227 }
228
229 got, err := fixture.db.ReturnStats2024()
230 check(t, err, "Failed ReturnStats2024()")
231
232 if !reflect.DeepEqual(correct, got) {
233 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
234 }
235}
236
237func TestInsertPreScoutedStats2024(t *testing.T) {
238 fixture := createDatabase(t)
239 defer fixture.TearDown()
240
241 stats := Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700242 CompType: "Regular", TeamNumber: "6344",
Emily Markova8cb91312024-02-02 12:30:37 -0800243 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
244 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700245 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -0800246 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700247 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800248 }
249
250 // Attempt to insert the non-pre-scouted data and make sure it fails.
251 err := fixture.db.AddToStats2024(stats)
252 if err == nil {
253 t.Fatal("Expected error from inserting the stats.")
254 }
255 if err.Error() != "Failed to find team 6344 in match 3 in the schedule." {
256 t.Fatal("Got:", err.Error())
257 }
258
259 // Mark the data as pre-scouting data. It should now succeed.
Emily Markova9c18e9c2024-04-03 20:06:27 -0700260 stats.CompType = "Prescouting"
261 err = fixture.db.AddToStats2024(stats)
262 check(t, err, "Failed to add prescouted stats to DB")
263}
264
265func TestInsertPracticeMatchStats2024(t *testing.T) {
266 fixture := createDatabase(t)
267 defer fixture.TearDown()
268
269 stats := Stats2024{
270 CompType: "Regular", TeamNumber: "6344",
271 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
272 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
273 Speaker: 0, Amp: 5, SpeakerAmplified: 1,
274 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
275 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
276 }
277
278 // Attempt to insert the non-practice match data and make sure it fails.
279 err := fixture.db.AddToStats2024(stats)
280 if err == nil {
281 t.Fatal("Expected error from inserting the stats.")
282 }
283 if err.Error() != "Failed to find team 6344 in match 3 in the schedule." {
284 t.Fatal("Got:", err.Error())
285 }
286
287 // Mark the data as practice match data. It should now succeed.
288 stats.CompType = "Practice"
Emily Markova8cb91312024-02-02 12:30:37 -0800289 err = fixture.db.AddToStats2024(stats)
290 check(t, err, "Failed to add prescouted stats to DB")
291}
292
293func TestQueryingStats2024ByTeam(t *testing.T) {
294 fixture := createDatabase(t)
295 defer fixture.TearDown()
296
297 stats := []Stats2024{
298 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700299 CompType: "Regular", TeamNumber: "328A",
Emily Markova8cb91312024-02-02 12:30:37 -0800300 MatchNumber: 7, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 1,
301 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700302 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 2, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800303 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700304 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800305 },
306 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700307 CompType: "Regular", TeamNumber: "978",
Emily Markova8cb91312024-02-02 12:30:37 -0800308 MatchNumber: 2, SetNumber: 2, CompLevel: "qm", StartingQuadrant: 4,
309 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700310 Speaker: 1, Amp: 2, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800311 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700312 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800313 },
314 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700315 CompType: "Regular", TeamNumber: "328A",
Emily Markova8cb91312024-02-02 12:30:37 -0800316 MatchNumber: 4, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 2,
317 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700318 Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -0800319 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700320 Park: false, OnStage: false, Harmony: true, RobotDied: true, NoShow: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800321 },
322 }
323
324 matches := []TeamMatch{
325 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "qm",
326 Alliance: "R", AlliancePosition: 1, TeamNumber: "328A"},
327 TeamMatch{MatchNumber: 2, SetNumber: 2, CompLevel: "qm",
328 Alliance: "R", AlliancePosition: 1, TeamNumber: "978"},
329 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
330 Alliance: "R", AlliancePosition: 1, TeamNumber: "328A"},
331 }
332
333 for _, match := range matches {
334 err := fixture.db.AddToMatch(match)
335 check(t, err, "Failed to add match")
336 }
337
338 for i := range stats {
339 err := fixture.db.AddToStats2024(stats[i])
340 check(t, err, "Failed to add 2024stats to DB")
341 }
342
343 // Validate that requesting status for a single team gets us the
344 // expected data.
Emily Markova9c18e9c2024-04-03 20:06:27 -0700345 statsFor328A, err := fixture.db.ReturnStats2024ForTeam("328A", 7, 1, "qm", "Regular")
Emily Markova8cb91312024-02-02 12:30:37 -0800346 check(t, err, "Failed ReturnStats2024()")
347
348 if !reflect.DeepEqual([]Stats2024{stats[0]}, statsFor328A) {
349 t.Errorf("Got %#v,\nbut expected %#v.", statsFor328A, stats[0])
350 }
351 // Validate that requesting team data for a non-existent match returns
352 // nothing.
Emily Markova9c18e9c2024-04-03 20:06:27 -0700353 statsForMissing, err := fixture.db.ReturnStats2024ForTeam("6344", 9, 1, "qm", "Regular")
Emily Markova8cb91312024-02-02 12:30:37 -0800354 check(t, err, "Failed ReturnStats2024()")
355
356 if !reflect.DeepEqual([]Stats2024{}, statsForMissing) {
357 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2024{})
358 }
359}
360
Emily Markova8cb91312024-02-02 12:30:37 -0800361func TestDeleteFromStats2024(t *testing.T) {
362 fixture := createDatabase(t)
363 defer fixture.TearDown()
364
365 startingStats := []Stats2024{
366 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700367 CompType: "Regular", TeamNumber: "345",
Emily Markova8cb91312024-02-02 12:30:37 -0800368 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
369 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700370 Speaker: 1, Amp: 3, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 3,
Emily Markova6079e2f2024-02-17 13:17:24 -0800371 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700372 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "bailey",
Emily Markova8cb91312024-02-02 12:30:37 -0800373 },
374 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700375 CompType: "Practice", TeamNumber: "645",
Emily Markova8cb91312024-02-02 12:30:37 -0800376 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
377 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700378 Speaker: 1, Amp: 2, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800379 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700380 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kate",
Emily Markova8cb91312024-02-02 12:30:37 -0800381 },
382 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700383 CompType: "Regular", TeamNumber: "323",
Emily Markova8cb91312024-02-02 12:30:37 -0800384 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
385 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700386 Speaker: 0, Amp: 0, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800387 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700388 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "tyler",
Emily Markova8cb91312024-02-02 12:30:37 -0800389 },
390 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700391 CompType: "Regular", TeamNumber: "542",
Emily Markova8cb91312024-02-02 12:30:37 -0800392 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
393 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700394 Speaker: 1, Amp: 2, SpeakerAmplified: 2, Shuttled: 2, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800395 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700396 Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: false, CollectedBy: "max",
Emily Markova8cb91312024-02-02 12:30:37 -0800397 },
398 }
399
400 correct := []Stats2024{
401 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700402 CompType: "Regular", TeamNumber: "345",
Emily Markova8cb91312024-02-02 12:30:37 -0800403 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
404 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700405 Speaker: 1, Amp: 3, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 3,
Emily Markova6079e2f2024-02-17 13:17:24 -0800406 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700407 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "bailey",
Emily Markova8cb91312024-02-02 12:30:37 -0800408 },
409 }
410
411 originalMatches := []TeamMatch{
412 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
413 Alliance: "R", AlliancePosition: 1, TeamNumber: "345"},
414 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
415 Alliance: "B", AlliancePosition: 1, TeamNumber: "645"},
416 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
417 Alliance: "R", AlliancePosition: 3, TeamNumber: "323"},
418 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
419 Alliance: "B", AlliancePosition: 2, TeamNumber: "542"},
420 }
421
422 // Matches for which we want to delete the stats.
423 matches := []TeamMatch{
424 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
425 TeamNumber: "645"},
426 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
427 TeamNumber: "323"},
428 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
429 TeamNumber: "542"},
430 }
431
432 for _, match := range originalMatches {
433 err := fixture.db.AddToMatch(match)
434 check(t, err, "Failed to add match")
435 fmt.Println("Match has been added : ", match.TeamNumber)
436 }
437
438 for _, stat := range startingStats {
439 err := fixture.db.AddToStats2024(stat)
440 check(t, err, "Failed to add stat")
441 }
442
443 for _, match := range matches {
444 err := fixture.db.DeleteFromStats2024(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
445 check(t, err, "Failed to delete stat2024")
446 }
447
448 got, err := fixture.db.ReturnStats2024()
449 check(t, err, "Failed ReturnStats2024()")
450
451 if !reflect.DeepEqual(correct, got) {
452 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
453 }
454}
455
Filip Kujawac1ded372023-05-27 14:33:43 -0700456func TestDeleteFromActions(t *testing.T) {
457 fixture := createDatabase(t)
458 defer fixture.TearDown()
459
460 startingActions := []Action{
461 Action{
462 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
463 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
464 },
465 Action{
466 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
467 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
468 },
469 Action{
470 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
471 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
472 },
473 Action{
474 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
475 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
476 },
477 Action{
478 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
479 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
480 },
481 Action{
482 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
483 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
484 },
485 }
486
487 correct := []Action{
488 Action{
489 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
490 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
491 },
492 Action{
493 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
494 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
495 },
496 Action{
497 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
498 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
499 },
500 Action{
501 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
502 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
503 },
504 Action{
505 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
506 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
507 },
508 }
509
510 for _, action := range startingActions {
511 err := fixture.db.AddAction(action)
512 check(t, err, "Failed to add stat")
513 }
514
515 err := fixture.db.DeleteFromActions("quals", 94, 1, "1239")
516
517 got, err := fixture.db.ReturnActions()
518 check(t, err, "Failed ReturnActions()")
519
520 if !reflect.DeepEqual(correct, got) {
521 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
522 }
523}
524
Milo Lina72e2002022-04-06 20:31:13 -0700525func TestQueryShiftDB(t *testing.T) {
526 fixture := createDatabase(t)
527 defer fixture.TearDown()
528
529 testDatabase := []Shift{
530 Shift{
531 MatchNumber: 1,
532 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
533 },
534 Shift{
535 MatchNumber: 2,
536 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
537 },
538 }
539
540 for i := 0; i < len(testDatabase); i++ {
541 err := fixture.db.AddToShift(testDatabase[i])
542 check(t, err, fmt.Sprint("Failed to add shift", i))
543 }
544
545 correct := []Shift{
546 Shift{
547 MatchNumber: 1,
548 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
549 },
550 }
551
552 got, err := fixture.db.QueryAllShifts(1)
553 check(t, err, "Failed to query shift for match 1")
554
555 if !reflect.DeepEqual(correct, got) {
556 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
557 }
558}
559
Emily Markovafaecfe12023-07-01 12:40:03 -0700560func TestQueryPitImages(t *testing.T) {
561 fixture := createDatabase(t)
562 defer fixture.TearDown()
563
564 testDatabase := []PitImage{
565 PitImage{
566 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
567 ImagePath: "image1.jpg", ImageData: []byte{14, 15, 32, 54},
568 },
569 PitImage{
570 TeamNumber: "237", CheckSum: "br78232b6r7iaa",
571 ImagePath: "bot.png", ImageData: []byte{32, 54, 23, 00},
572 },
573 PitImage{
574 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
575 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
576 },
577 }
578
579 for i := 0; i < len(testDatabase); i++ {
580 err := fixture.db.AddPitImage(testDatabase[i])
581 check(t, err, fmt.Sprint("Failed to add pit image", i))
582 }
583
584 correct := []RequestedPitImage{
585 RequestedPitImage{
586 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
587 ImagePath: "image1.jpg",
588 },
589 }
590
591 got, err := fixture.db.QueryPitImages("723")
592 check(t, err, "Failed to query shift for team 723")
593
594 if !reflect.DeepEqual(correct, got) {
595 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
596 }
597}
598
599func TestQueryPitImageByChecksum(t *testing.T) {
600 fixture := createDatabase(t)
601 defer fixture.TearDown()
602
603 testDatabase := []PitImage{
604 PitImage{
605 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
606 ImagePath: "image1.jpg", ImageData: []byte{05, 32, 00, 74, 28},
607 },
608 PitImage{
609 TeamNumber: "237", CheckSum: "br78232b6r7iaa",
610 ImagePath: "bot.png", ImageData: []byte{32, 54, 23, 00},
611 },
612 PitImage{
613 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
614 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
615 },
616 }
617
618 for i := 0; i < len(testDatabase); i++ {
619 err := fixture.db.AddPitImage(testDatabase[i])
620 check(t, err, fmt.Sprint("Failed to add pit image", i))
621 }
622
623 correctPitImage := PitImage{
624 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
625 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
626 }
627
628 got, err := fixture.db.QueryPitImageByChecksum("b63c728bqiq8a73")
629 check(t, err, "Failed to query shift for checksum 'b63c728bqiq8a73'")
630
631 if !reflect.DeepEqual(correctPitImage, got) {
632 t.Fatalf("Got %#v,\nbut expected %#v.", got, correctPitImage)
633 }
634}
635
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700636func TestQueryRankingsDB(t *testing.T) {
637 fixture := createDatabase(t)
638 defer fixture.TearDown()
639
640 testDatabase := []Ranking{
641 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800642 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700643 Losses: 1, Wins: 7, Ties: 2,
644 Rank: 2, Dq: 0,
645 },
646 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800647 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700648 Losses: 3, Wins: 4, Ties: 0,
649 Rank: 4, Dq: 2,
650 },
651 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800652 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700653 Losses: 5, Wins: 2, Ties: 0,
654 Rank: 17, Dq: 0,
655 },
656 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800657 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700658 Losses: 0, Wins: 7, Ties: 0,
659 Rank: 5, Dq: 0,
660 },
661 }
662
663 for i := 0; i < len(testDatabase); i++ {
664 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
665 check(t, err, fmt.Sprint("Failed to add rankings ", i))
666 }
667
668 correct := []Ranking{
669 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800670 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700671 Losses: 0, Wins: 7, Ties: 0,
672 Rank: 5, Dq: 0,
673 },
674 }
675
Emily Markovae68b7632023-12-30 14:17:55 -0800676 got, err := fixture.db.QueryRankings("126")
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700677 check(t, err, "Failed QueryRankings()")
678
679 if !reflect.DeepEqual(correct, got) {
680 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
681 }
682}
683
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800684func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800685 fixture := createDatabase(t)
686 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800687
Emily Markovabf24c9e2023-02-08 20:31:11 -0800688 correct := []TeamMatch{
689 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700690 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: "6835"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800691 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700692 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "4834"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800693 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700694 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "9824"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800695 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700696 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800697 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700698 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800699 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800700
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800701 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800702 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800703 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800704 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800705
Philipp Schrader7365d322022-03-06 16:40:08 -0800706 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800707 check(t, err, "Failed ReturnMatches()")
708
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800709 if !reflect.DeepEqual(correct, got) {
710 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
711 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800712}
713
Philipp Schraderfe583842022-04-08 19:47:07 -0700714func TestOverwriteNewMatchData(t *testing.T) {
715 fixture := createDatabase(t)
716 defer fixture.TearDown()
717
Emily Markovabf24c9e2023-02-08 20:31:11 -0800718 testDatabase := []TeamMatch{
719 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700720 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "4464"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800721 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700722 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800723 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700724 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700725 }
726
727 for i := 0; i < len(testDatabase); i++ {
728 err := fixture.db.AddToMatch(testDatabase[i])
729 check(t, err, fmt.Sprint("Failed to add match", i))
730 }
731
Emily Markovabf24c9e2023-02-08 20:31:11 -0800732 correct := []TeamMatch{
733 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700734 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800735 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700736 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700737 }
738
739 got, err := fixture.db.ReturnMatches()
740 check(t, err, "Failed to get match list")
741
742 if !reflect.DeepEqual(correct, got) {
743 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
744 }
745}
746
Milo Lina72e2002022-04-06 20:31:13 -0700747func TestAddReturnShiftDB(t *testing.T) {
748 fixture := createDatabase(t)
749 defer fixture.TearDown()
750
751 correct := []Shift{
752 Shift{
753 MatchNumber: 1,
754 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
755 },
756 Shift{
757 MatchNumber: 2,
758 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
759 },
760 }
761
762 for i := 0; i < len(correct); i++ {
763 err := fixture.db.AddToShift(correct[i])
764 check(t, err, fmt.Sprint("Failed to add shift", i))
765 }
766
767 got, err := fixture.db.ReturnAllShifts()
768 check(t, err, "Failed ReturnAllShifts()")
769
770 if !reflect.DeepEqual(correct, got) {
771 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
772 }
773}
774
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700775func TestReturnRankingsDB(t *testing.T) {
776 fixture := createDatabase(t)
777 defer fixture.TearDown()
778
779 correct := []Ranking{
780 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800781 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700782 Losses: 1, Wins: 7, Ties: 2,
783 Rank: 2, Dq: 0,
784 },
785 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800786 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700787 Losses: 3, Wins: 4, Ties: 0,
788 Rank: 4, Dq: 2,
789 },
790 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800791 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700792 Losses: 5, Wins: 2, Ties: 0,
793 Rank: 17, Dq: 0,
794 },
795 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800796 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700797 Losses: 0, Wins: 7, Ties: 0,
798 Rank: 5, Dq: 0,
799 },
800 }
801
802 for i := 0; i < len(correct); i++ {
803 err := fixture.db.AddOrUpdateRankings(correct[i])
804 check(t, err, fmt.Sprint("Failed to add rankings", i))
805 }
806
807 got, err := fixture.db.ReturnRankings()
808 check(t, err, "Failed ReturnRankings()")
809
810 if !reflect.DeepEqual(correct, got) {
811 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
812 }
813}
814
Emily Markova8cb91312024-02-02 12:30:37 -0800815func TestReturnStats2024DB(t *testing.T) {
816 fixture := createDatabase(t)
817 defer fixture.TearDown()
818
819 correct := []Stats2024{
820 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700821 CompType: "Practice", TeamNumber: "894",
Emily Markova8cb91312024-02-02 12:30:37 -0800822 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
823 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700824 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800825 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700826 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800827 },
828 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700829 CompType: "Regular", TeamNumber: "942",
Emily Markova8cb91312024-02-02 12:30:37 -0800830 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
831 SpeakerAuto: 2, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700832 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800833 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700834 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "harry",
Emily Markova8cb91312024-02-02 12:30:37 -0800835 },
836 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700837 CompType: "Practice", TeamNumber: "432",
Emily Markova8cb91312024-02-02 12:30:37 -0800838 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 3,
839 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700840 Speaker: 2, Amp: 1, SpeakerAmplified: 3, Shuttled: 5, OutOfField: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -0800841 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700842 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "henry",
Emily Markova8cb91312024-02-02 12:30:37 -0800843 },
844 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700845 CompType: "Regular", TeamNumber: "52A",
Emily Markova8cb91312024-02-02 12:30:37 -0800846 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
847 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700848 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800849 NotesDropped: 2, Penalties: 0, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700850 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "jordan",
Emily Markova8cb91312024-02-02 12:30:37 -0800851 },
852 }
853
854 matches := []TeamMatch{
855 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
856 Alliance: "R", AlliancePosition: 1, TeamNumber: "894"},
857 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
858 Alliance: "R", AlliancePosition: 2, TeamNumber: "942"},
859 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
860 Alliance: "R", AlliancePosition: 3, TeamNumber: "432"},
861 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
862 Alliance: "B", AlliancePosition: 1, TeamNumber: "52A"},
863 }
864
865 for _, match := range matches {
866 err := fixture.db.AddToMatch(match)
867 check(t, err, "Failed to add match")
868 }
869
870 for i := 0; i < len(correct); i++ {
871 err := fixture.db.AddToStats2024(correct[i])
872 check(t, err, fmt.Sprint("Failed to add stats ", i))
873 }
874
875 got, err := fixture.db.ReturnStats2024()
876 check(t, err, "Failed ReturnStats2024()")
877
878 if !reflect.DeepEqual(correct, got) {
879 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
880 }
881}
882
Sabina Leaver759090b2023-01-14 20:42:56 -0800883func TestReturnActionsDB(t *testing.T) {
884 fixture := createDatabase(t)
885 defer fixture.TearDown()
886 correct := []Action{
887 Action{
888 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700889 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800890 },
891 Action{
892 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700893 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800894 },
895 Action{
896 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700897 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800898 },
899 Action{
900 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700901 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800902 },
903 Action{
904 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700905 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800906 },
907 Action{
908 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700909 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800910 },
911 }
912
Emily Markovabf24c9e2023-02-08 20:31:11 -0800913 matches := []TeamMatch{
914 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700915 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800916 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700917 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800918 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700919 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800920 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700921 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800922 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700923 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800924 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700925 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800926 }
927
928 for _, match := range matches {
929 err := fixture.db.AddToMatch(match)
930 check(t, err, "Failed to add match")
931 }
Sabina Leaver759090b2023-01-14 20:42:56 -0800932
933 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800934 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -0800935 check(t, err, fmt.Sprint("Failed to add to actions ", i))
936 }
937
938 got, err := fixture.db.ReturnActions()
939 check(t, err, "Failed ReturnActions()")
940
941 if !reflect.DeepEqual(correct, got) {
942 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
943 }
944}
945
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700946func TestRankingsDbUpdate(t *testing.T) {
947 fixture := createDatabase(t)
948 defer fixture.TearDown()
949
950 testDatabase := []Ranking{
951 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800952 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700953 Losses: 1, Wins: 7, Ties: 2,
954 Rank: 2, Dq: 0,
955 },
956 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800957 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700958 Losses: 3, Wins: 4, Ties: 0,
959 Rank: 4, Dq: 2,
960 },
961 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800962 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700963 Losses: 5, Wins: 2, Ties: 0,
964 Rank: 17, Dq: 0,
965 },
966 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800967 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700968 Losses: 0, Wins: 7, Ties: 0,
969 Rank: 5, Dq: 0,
970 },
971 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800972 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700973 Losses: 2, Wins: 4, Ties: 1,
974 Rank: 5, Dq: 0,
975 },
976 }
977
978 for i := 0; i < len(testDatabase); i++ {
979 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
980 check(t, err, fmt.Sprint("Failed to add rankings ", i))
981 }
982
983 correct := []Ranking{
984 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800985 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700986 Losses: 2, Wins: 4, Ties: 1,
987 Rank: 5, Dq: 0,
988 },
989 }
990
Emily Markovae68b7632023-12-30 14:17:55 -0800991 got, err := fixture.db.QueryRankings("125")
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700992 check(t, err, "Failed QueryRankings()")
993
Philipp Schradereecb8962022-06-01 21:02:42 -0700994 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700995}
996
Alex Perry871eab92022-03-12 17:43:52 -0800997func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800998 fixture := createDatabase(t)
999 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -08001000
Philipp Schradereecb8962022-06-01 21:02:42 -07001001 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -08001002
Emily Markovacf893f42024-03-13 19:03:10 -07001003 err := fixture.db.AddNotes(NotesData{TeamNumber: "1234", MatchNumber: 5, SetNumber: 1, CompLevel: "quals", Notes: "Note 1", GoodDriving: true, BadDriving: false, SolidPlacing: false, SketchyPlacing: true, GoodDefense: false, BadDefense: true, EasilyDefended: true, NoShow: false})
Alex Perry871eab92022-03-12 17:43:52 -08001004 check(t, err, "Failed to add Note")
Emily Markovacf893f42024-03-13 19:03:10 -07001005 err = fixture.db.AddNotes(NotesData{TeamNumber: "1235", MatchNumber: 54, SetNumber: 1, CompLevel: "quals", Notes: "Note 2", GoodDriving: false, BadDriving: true, SolidPlacing: false, SketchyPlacing: true, GoodDefense: false, BadDefense: false, EasilyDefended: false, NoShow: false})
Alex Perry871eab92022-03-12 17:43:52 -08001006 check(t, err, "Failed to add Note")
Emily Markovacf893f42024-03-13 19:03:10 -07001007 err = fixture.db.AddNotes(NotesData{TeamNumber: "1234", MatchNumber: 23, SetNumber: 3, CompLevel: "quals", Notes: "Note 3", GoodDriving: true, BadDriving: false, SolidPlacing: false, SketchyPlacing: true, GoodDefense: true, BadDefense: false, EasilyDefended: true, NoShow: true})
Alex Perry871eab92022-03-12 17:43:52 -08001008 check(t, err, "Failed to add Note")
1009
Emily Markovae68b7632023-12-30 14:17:55 -08001010 actual, err := fixture.db.QueryNotes("1234")
Alex Perry871eab92022-03-12 17:43:52 -08001011 check(t, err, "Failed to get Notes")
1012
1013 if !reflect.DeepEqual(expected, actual) {
1014 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1015 }
1016}
Filip Kujawa210a03b2022-11-24 14:41:11 -08001017
1018func TestDriverRanking(t *testing.T) {
1019 fixture := createDatabase(t)
1020 defer fixture.TearDown()
1021
1022 expected := []DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -08001023 {ID: 1, MatchNumber: 12, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
1024 {ID: 2, MatchNumber: 12, Rank1: "1236", Rank2: "1235", Rank3: "1234"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001025 }
1026
1027 err := fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001028 DriverRankingData{MatchNumber: 12, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001029 )
1030 check(t, err, "Failed to add Driver Ranking")
1031 err = fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001032 DriverRankingData{MatchNumber: 12, Rank1: "1236", Rank2: "1235", Rank3: "1234"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001033 )
1034 check(t, err, "Failed to add Driver Ranking")
1035 err = fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001036 DriverRankingData{MatchNumber: 13, Rank1: "1235", Rank2: "1234", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001037 )
1038 check(t, err, "Failed to add Driver Ranking")
1039
1040 actual, err := fixture.db.QueryDriverRanking(12)
1041 check(t, err, "Failed to get Driver Ranking")
1042
1043 if !reflect.DeepEqual(expected, actual) {
1044 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1045 }
1046}
Philipp Schradera8955fb2023-03-05 15:47:19 -08001047
1048func TestParsedDriverRanking(t *testing.T) {
1049 fixture := createDatabase(t)
1050 defer fixture.TearDown()
1051
1052 expected := []ParsedDriverRankingData{
1053 {TeamNumber: "1234", Score: 100},
1054 {TeamNumber: "1235", Score: 110},
1055 {TeamNumber: "1236", Score: 90},
1056 }
1057
1058 for i := range expected {
1059 err := fixture.db.AddParsedDriverRanking(expected[i])
1060 check(t, err, "Failed to add Parsed Driver Ranking")
1061 }
1062
1063 actual, err := fixture.db.ReturnAllParsedDriverRankings()
1064 check(t, err, "Failed to get Parsed Driver Ranking")
1065 if !reflect.DeepEqual(expected, actual) {
1066 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1067 }
1068
1069 // Now update one of the rankings and make sure we get the properly
1070 // merged result.
1071 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1072 TeamNumber: "1235", Score: 200,
1073 })
1074 check(t, err, "Failed to add Parsed Driver Ranking")
1075
1076 expected = []ParsedDriverRankingData{
1077 {TeamNumber: "1234", Score: 100},
1078 {TeamNumber: "1236", Score: 90},
1079 {TeamNumber: "1235", Score: 200},
1080 }
1081
1082 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1083 check(t, err, "Failed to get Parsed Driver Ranking")
1084 if !reflect.DeepEqual(expected, actual) {
1085 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1086 }
1087}