blob: 7dc35f9ddf8a35ac4688beda4e58bcc044ddbacb [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{
147 PreScouting: false, TeamNumber: "894",
148 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
149 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700150 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 1,
151 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0, OutOfField: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800152 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800153 },
154 Stats2024{
155 PreScouting: false, TeamNumber: "942",
156 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 Markova040123c2024-02-27 09:48:37 -0800160 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "harry",
Emily Markova8cb91312024-02-02 12:30:37 -0800161 },
162 Stats2024{
163 PreScouting: false, TeamNumber: "432",
164 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 3,
165 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700166 Speaker: 2, Amp: 1, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800167 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800168 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "henry",
Emily Markova8cb91312024-02-02 12:30:37 -0800169 },
170 Stats2024{
171 PreScouting: false, TeamNumber: "52A",
172 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
173 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700174 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800175 NotesDropped: 2, Penalties: 0, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800176 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "jordan",
Emily Markova8cb91312024-02-02 12:30:37 -0800177 },
178 Stats2024{
179 PreScouting: false, TeamNumber: "745",
180 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
181 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700182 Speaker: 5, Amp: 0, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800183 NotesDropped: 1, Penalties: 1, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800184 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "taylor",
Emily Markova8cb91312024-02-02 12:30:37 -0800185 },
186 Stats2024{
187 PreScouting: false, TeamNumber: "934",
188 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 3,
189 SpeakerAuto: 1, AmpAuto: 3, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700190 Speaker: 0, Amp: 3, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800191 NotesDropped: 0, Penalties: 3, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800192 Park: false, OnStage: false, Harmony: true, RobotDied: false, CollectedBy: "katie",
Emily Markova8cb91312024-02-02 12:30:37 -0800193 },
194 }
195
196 matches := []TeamMatch{
197 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
198 Alliance: "R", AlliancePosition: 1, TeamNumber: "894"},
199 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
200 Alliance: "R", AlliancePosition: 2, TeamNumber: "942"},
201 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
202 Alliance: "R", AlliancePosition: 3, TeamNumber: "432"},
203 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
204 Alliance: "B", AlliancePosition: 1, TeamNumber: "52A"},
205 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
206 Alliance: "B", AlliancePosition: 2, TeamNumber: "745"},
207 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
208 Alliance: "B", AlliancePosition: 3, TeamNumber: "934"},
209 }
210
211 for _, match := range matches {
212 err := fixture.db.AddToMatch(match)
213 check(t, err, "Failed to add match")
214 }
215
216 for i := 0; i < len(correct); i++ {
217 err := fixture.db.AddToStats2024(correct[i])
218 check(t, err, "Failed to add 2024stats to DB")
219 }
220
221 got, err := fixture.db.ReturnStats2024()
222 check(t, err, "Failed ReturnStats2024()")
223
224 if !reflect.DeepEqual(correct, got) {
225 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
226 }
227}
228
229func TestInsertPreScoutedStats2024(t *testing.T) {
230 fixture := createDatabase(t)
231 defer fixture.TearDown()
232
233 stats := Stats2024{
234 PreScouting: false, TeamNumber: "6344",
235 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
236 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700237 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -0800238 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800239 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800240 }
241
242 // Attempt to insert the non-pre-scouted data and make sure it fails.
243 err := fixture.db.AddToStats2024(stats)
244 if err == nil {
245 t.Fatal("Expected error from inserting the stats.")
246 }
247 if err.Error() != "Failed to find team 6344 in match 3 in the schedule." {
248 t.Fatal("Got:", err.Error())
249 }
250
251 // Mark the data as pre-scouting data. It should now succeed.
252 stats.PreScouting = true
253 err = fixture.db.AddToStats2024(stats)
254 check(t, err, "Failed to add prescouted stats to DB")
255}
256
257func TestQueryingStats2024ByTeam(t *testing.T) {
258 fixture := createDatabase(t)
259 defer fixture.TearDown()
260
261 stats := []Stats2024{
262 Stats2024{
263 PreScouting: false, TeamNumber: "328A",
264 MatchNumber: 7, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 1,
265 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700266 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 2, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800267 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800268 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800269 },
270 Stats2024{
271 PreScouting: false, TeamNumber: "978",
272 MatchNumber: 2, SetNumber: 2, CompLevel: "qm", StartingQuadrant: 4,
273 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700274 Speaker: 1, Amp: 2, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800275 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800276 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800277 },
278 Stats2024{
279 PreScouting: false, TeamNumber: "328A",
280 MatchNumber: 4, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 2,
281 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700282 Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -0800283 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800284 Park: false, OnStage: false, Harmony: true, RobotDied: true, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -0800285 },
286 }
287
288 matches := []TeamMatch{
289 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "qm",
290 Alliance: "R", AlliancePosition: 1, TeamNumber: "328A"},
291 TeamMatch{MatchNumber: 2, SetNumber: 2, CompLevel: "qm",
292 Alliance: "R", AlliancePosition: 1, TeamNumber: "978"},
293 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
294 Alliance: "R", AlliancePosition: 1, TeamNumber: "328A"},
295 }
296
297 for _, match := range matches {
298 err := fixture.db.AddToMatch(match)
299 check(t, err, "Failed to add match")
300 }
301
302 for i := range stats {
303 err := fixture.db.AddToStats2024(stats[i])
304 check(t, err, "Failed to add 2024stats to DB")
305 }
306
307 // Validate that requesting status for a single team gets us the
308 // expected data.
309 statsFor328A, err := fixture.db.ReturnStats2024ForTeam("328A", 7, 1, "qm", false)
310 check(t, err, "Failed ReturnStats2024()")
311
312 if !reflect.DeepEqual([]Stats2024{stats[0]}, statsFor328A) {
313 t.Errorf("Got %#v,\nbut expected %#v.", statsFor328A, stats[0])
314 }
315 // Validate that requesting team data for a non-existent match returns
316 // nothing.
317 statsForMissing, err := fixture.db.ReturnStats2024ForTeam("6344", 9, 1, "qm", false)
318 check(t, err, "Failed ReturnStats2024()")
319
320 if !reflect.DeepEqual([]Stats2024{}, statsForMissing) {
321 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2024{})
322 }
323}
324
Emily Markova290147d2023-03-03 22:40:06 -0800325func TestAddToStats2023DB(t *testing.T) {
326 fixture := createDatabase(t)
327 defer fixture.TearDown()
328
329 correct := []Stats2023{
330 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700331 PreScouting: false,
332 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800333 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
334 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
335 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
336 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
337 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700338 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700339 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700340 BalanceAttemptAuto: false, Docked: false, Engaged: false,
341 BalanceAttempt: false, CollectedBy: "emma",
Emily Markova290147d2023-03-03 22:40:06 -0800342 },
343 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700344 PreScouting: false,
345 TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800346 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
347 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
348 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
349 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
350 HighCubes: 0, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700351 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700352 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700353 BalanceAttemptAuto: true, Docked: true, Engaged: true,
354 BalanceAttempt: false, CollectedBy: "tyler",
Emily Markova290147d2023-03-03 22:40:06 -0800355 },
356 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700357 PreScouting: false,
358 TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800359 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
360 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
361 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
362 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
363 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700364 MiddleCones: 1, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700365 AvgCycle: 0, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700366 BalanceAttemptAuto: false, Docked: false, Engaged: false,
367 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800368 },
369 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700370 PreScouting: false,
371 TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800372 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
373 MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
374 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
375 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 1,
376 HighCubes: 2, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700377 MiddleCones: 1, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700378 AvgCycle: 0, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700379 BalanceAttemptAuto: true, Docked: false, Engaged: false,
380 BalanceAttempt: true, CollectedBy: "will",
Emily Markova290147d2023-03-03 22:40:06 -0800381 },
382 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700383 PreScouting: false,
384 TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800385 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
386 MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
387 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
388 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
389 HighCubes: 0, CubesDropped: 2, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700390 MiddleCones: 1, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700391 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700392 BalanceAttemptAuto: false, Docked: true, Engaged: false,
393 BalanceAttempt: false, CollectedBy: "unkown",
Emily Markova290147d2023-03-03 22:40:06 -0800394 },
395 }
396
397 matches := []TeamMatch{
398 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700399 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Emily Markova290147d2023-03-03 22:40:06 -0800400 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700401 Alliance: "R", AlliancePosition: 2, TeamNumber: "7454"},
Emily Markova290147d2023-03-03 22:40:06 -0800402 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700403 Alliance: "R", AlliancePosition: 3, TeamNumber: "4354"},
Emily Markova290147d2023-03-03 22:40:06 -0800404 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700405 Alliance: "B", AlliancePosition: 1, TeamNumber: "6533"},
Emily Markova290147d2023-03-03 22:40:06 -0800406 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700407 Alliance: "B", AlliancePosition: 2, TeamNumber: "8354"},
Emily Markova290147d2023-03-03 22:40:06 -0800408 }
409
410 for _, match := range matches {
411 err := fixture.db.AddToMatch(match)
412 check(t, err, "Failed to add match")
413 }
414
415 for i := 0; i < len(correct); i++ {
416 err := fixture.db.AddToStats2023(correct[i])
417 check(t, err, "Failed to add 2023stats to DB")
418 }
419
420 got, err := fixture.db.ReturnStats2023()
421 check(t, err, "Failed ReturnStats2023()")
422
423 if !reflect.DeepEqual(correct, got) {
424 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
425 }
426}
427
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700428func TestInsertPreScoutedStats(t *testing.T) {
429 fixture := createDatabase(t)
430 defer fixture.TearDown()
431
432 stats := Stats2023{
433 PreScouting: false,
434 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
435 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
436 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
437 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
438 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
439 HighCubes: 1, CubesDropped: 0, LowCones: 0,
440 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
441 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
442 BalanceAttemptAuto: false, Docked: false, Engaged: false,
443 BalanceAttempt: false, CollectedBy: "emma",
444 }
445
446 // Attempt to insert the non-pre-scouted data and make sure it fails.
447 err := fixture.db.AddToStats2023(stats)
448 if err == nil {
449 t.Fatal("Expected error from inserting the stats.")
450 }
451 if err.Error() != "Failed to find team 6344 in match 3 in the schedule." {
452 t.Fatal("Got:", err.Error())
453 }
454
455 // Mark the data as pre-scouting data. It should now succeed.
456 stats.PreScouting = true
457 err = fixture.db.AddToStats2023(stats)
458 check(t, err, "Failed to add prescouted stats to DB")
459}
460
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800461func TestQueryingStats2023ByTeam(t *testing.T) {
462 fixture := createDatabase(t)
463 defer fixture.TearDown()
464
465 stats := []Stats2023{
466 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700467 PreScouting: false,
468 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800469 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
470 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
471 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
472 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
473 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700474 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700475 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700476 BalanceAttemptAuto: false, Docked: false, Engaged: false,
477 BalanceAttempt: false, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800478 },
479 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700480 PreScouting: false,
481 TeamNumber: "7454", MatchNumber: 4, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800482 CompLevel: "qm", StartingQuadrant: 2, LowCubesAuto: 1,
483 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
484 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
485 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
486 HighCubes: 0, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700487 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700488 AvgCycle: 0, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700489 BalanceAttemptAuto: true, Docked: false, Engaged: false,
490 BalanceAttempt: false, CollectedBy: "tyler",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800491 },
492 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700493 PreScouting: false,
494 TeamNumber: "6344", MatchNumber: 5, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800495 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
496 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
497 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
498 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
499 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700500 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700501 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700502 BalanceAttemptAuto: false, Docked: true, Engaged: false,
503 BalanceAttempt: true, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800504 },
505 }
506
507 matches := []TeamMatch{
508 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700509 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800510 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700511 Alliance: "R", AlliancePosition: 1, TeamNumber: "7454"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800512 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700513 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800514 }
515
516 for _, match := range matches {
517 err := fixture.db.AddToMatch(match)
518 check(t, err, "Failed to add match")
519 }
520
521 for i := range stats {
522 err := fixture.db.AddToStats2023(stats[i])
523 check(t, err, "Failed to add 2023stats to DB")
524 }
525
526 // Validate that requesting status for a single team gets us the
527 // expected data.
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700528 statsFor6344, err := fixture.db.ReturnStats2023ForTeam("6344", 3, 1, "qm", false)
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800529 check(t, err, "Failed ReturnStats2023()")
530
531 if !reflect.DeepEqual([]Stats2023{stats[0]}, statsFor6344) {
532 t.Errorf("Got %#v,\nbut expected %#v.", statsFor6344, stats[0])
533 }
534
535 // Validate that requesting team data for a non-existent match returns
536 // nothing.
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700537 statsForMissing, err := fixture.db.ReturnStats2023ForTeam("6344", 9, 1, "qm", false)
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800538 check(t, err, "Failed ReturnStats2023()")
539
540 if !reflect.DeepEqual([]Stats2023{}, statsForMissing) {
541 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2023{})
542 }
543}
544
Emily Markova6b551e02023-02-18 17:37:40 -0800545func TestDeleteFromStats(t *testing.T) {
546 fixture := createDatabase(t)
547 defer fixture.TearDown()
548
549 startingStats := []Stats2023{
550 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700551 PreScouting: false,
552 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800553 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
554 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
555 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
556 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
557 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700558 MiddleCones: 0, HighCones: 1, ConesDropped: 2, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700559 AvgCycle: 58, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700560 BalanceAttemptAuto: true, Docked: true, Engaged: true,
561 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova6b551e02023-02-18 17:37:40 -0800562 },
563 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700564 PreScouting: false,
565 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800566 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
567 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
568 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
569 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
570 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700571 MiddleCones: 2, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700572 AvgCycle: 34, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700573 BalanceAttemptAuto: false, Docked: true, Engaged: false,
574 BalanceAttempt: false, CollectedBy: "simon",
Emily Markova6b551e02023-02-18 17:37:40 -0800575 },
576 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700577 PreScouting: false,
578 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800579 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
580 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
581 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
582 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
583 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700584 MiddleCones: 0, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700585 AvgCycle: 50, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700586 BalanceAttemptAuto: true, Docked: false, Engaged: false,
587 BalanceAttempt: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800588 },
589 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700590 PreScouting: false,
591 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800592 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
593 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
594 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
595 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
596 HighCubes: 2, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700597 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700598 AvgCycle: 49, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700599 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova6b551e02023-02-18 17:37:40 -0800600 },
601 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700602 PreScouting: false,
603 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800604 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
605 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
606 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
607 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
608 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700609 MiddleCones: 1, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700610 AvgCycle: 70, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700611 BalanceAttemptAuto: false, Docked: false, Engaged: false,
612 BalanceAttempt: true, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800613 },
614 }
615
616 correct := []Stats2023{
617 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700618 PreScouting: false,
619 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800620 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
621 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
622 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
623 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
624 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700625 MiddleCones: 0, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700626 AvgCycle: 50, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700627 BalanceAttemptAuto: true, Docked: false, Engaged: false,
628 BalanceAttempt: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800629 },
630 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700631 PreScouting: false,
632 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800633 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
634 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
635 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
636 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
637 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700638 MiddleCones: 1, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700639 AvgCycle: 70, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700640 BalanceAttemptAuto: false, Docked: false, Engaged: false,
641 BalanceAttempt: true, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800642 },
643 }
644
645 originalMatches := []TeamMatch{
646 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700647 Alliance: "R", AlliancePosition: 1, TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800648 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700649 Alliance: "B", AlliancePosition: 1, TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800650 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700651 Alliance: "R", AlliancePosition: 3, TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800652 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700653 Alliance: "B", AlliancePosition: 2, TeamNumber: "2454"},
Emily Markova6b551e02023-02-18 17:37:40 -0800654 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700655 Alliance: "B", AlliancePosition: 3, TeamNumber: "3242"},
Emily Markova6b551e02023-02-18 17:37:40 -0800656 }
657
658 // Matches for which we want to delete the stats.
659 matches := []TeamMatch{
660 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700661 TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800662 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700663 TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800664 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700665 TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800666 }
667
668 for _, match := range originalMatches {
669 err := fixture.db.AddToMatch(match)
670 check(t, err, "Failed to add match")
671 fmt.Println("Match has been added : ", match.TeamNumber)
672 }
673
674 for _, stat := range startingStats {
675 err := fixture.db.AddToStats2023(stat)
676 check(t, err, "Failed to add stat")
677 }
678
679 for _, match := range matches {
Emily Markovab8551572023-03-22 19:49:39 -0700680 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
Emily Markova6b551e02023-02-18 17:37:40 -0800681 check(t, err, "Failed to delete stat")
682 }
683
684 got, err := fixture.db.ReturnStats2023()
685 check(t, err, "Failed ReturnStats()")
686
687 if !reflect.DeepEqual(correct, got) {
688 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
689 }
690}
691
Emily Markova8cb91312024-02-02 12:30:37 -0800692func TestDeleteFromStats2024(t *testing.T) {
693 fixture := createDatabase(t)
694 defer fixture.TearDown()
695
696 startingStats := []Stats2024{
697 Stats2024{
698 PreScouting: false, TeamNumber: "345",
699 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
700 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700701 Speaker: 1, Amp: 3, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 3,
Emily Markova6079e2f2024-02-17 13:17:24 -0800702 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800703 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "bailey",
Emily Markova8cb91312024-02-02 12:30:37 -0800704 },
705 Stats2024{
706 PreScouting: false, TeamNumber: "645",
707 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
708 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700709 Speaker: 1, Amp: 2, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800710 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800711 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "kate",
Emily Markova8cb91312024-02-02 12:30:37 -0800712 },
713 Stats2024{
714 PreScouting: false, TeamNumber: "323",
715 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
716 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700717 Speaker: 0, Amp: 0, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800718 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800719 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "tyler",
Emily Markova8cb91312024-02-02 12:30:37 -0800720 },
721 Stats2024{
722 PreScouting: false, TeamNumber: "542",
723 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
724 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700725 Speaker: 1, Amp: 2, SpeakerAmplified: 2, Shuttled: 2, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800726 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800727 Park: false, OnStage: false, Harmony: true, RobotDied: false, CollectedBy: "max",
Emily Markova8cb91312024-02-02 12:30:37 -0800728 },
729 }
730
731 correct := []Stats2024{
732 Stats2024{
733 PreScouting: false, TeamNumber: "345",
734 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
735 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700736 Speaker: 1, Amp: 3, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 3,
Emily Markova6079e2f2024-02-17 13:17:24 -0800737 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800738 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "bailey",
Emily Markova8cb91312024-02-02 12:30:37 -0800739 },
740 }
741
742 originalMatches := []TeamMatch{
743 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
744 Alliance: "R", AlliancePosition: 1, TeamNumber: "345"},
745 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
746 Alliance: "B", AlliancePosition: 1, TeamNumber: "645"},
747 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
748 Alliance: "R", AlliancePosition: 3, TeamNumber: "323"},
749 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
750 Alliance: "B", AlliancePosition: 2, TeamNumber: "542"},
751 }
752
753 // Matches for which we want to delete the stats.
754 matches := []TeamMatch{
755 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
756 TeamNumber: "645"},
757 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
758 TeamNumber: "323"},
759 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
760 TeamNumber: "542"},
761 }
762
763 for _, match := range originalMatches {
764 err := fixture.db.AddToMatch(match)
765 check(t, err, "Failed to add match")
766 fmt.Println("Match has been added : ", match.TeamNumber)
767 }
768
769 for _, stat := range startingStats {
770 err := fixture.db.AddToStats2024(stat)
771 check(t, err, "Failed to add stat")
772 }
773
774 for _, match := range matches {
775 err := fixture.db.DeleteFromStats2024(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
776 check(t, err, "Failed to delete stat2024")
777 }
778
779 got, err := fixture.db.ReturnStats2024()
780 check(t, err, "Failed ReturnStats2024()")
781
782 if !reflect.DeepEqual(correct, got) {
783 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
784 }
785}
786
Filip Kujawac1ded372023-05-27 14:33:43 -0700787func TestDeleteFromActions(t *testing.T) {
788 fixture := createDatabase(t)
789 defer fixture.TearDown()
790
791 startingActions := []Action{
792 Action{
793 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
794 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
795 },
796 Action{
797 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
798 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
799 },
800 Action{
801 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
802 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
803 },
804 Action{
805 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
806 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
807 },
808 Action{
809 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
810 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
811 },
812 Action{
813 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
814 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
815 },
816 }
817
818 correct := []Action{
819 Action{
820 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
821 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
822 },
823 Action{
824 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
825 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
826 },
827 Action{
828 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
829 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
830 },
831 Action{
832 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
833 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
834 },
835 Action{
836 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
837 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
838 },
839 }
840
841 for _, action := range startingActions {
842 err := fixture.db.AddAction(action)
843 check(t, err, "Failed to add stat")
844 }
845
846 err := fixture.db.DeleteFromActions("quals", 94, 1, "1239")
847
848 got, err := fixture.db.ReturnActions()
849 check(t, err, "Failed ReturnActions()")
850
851 if !reflect.DeepEqual(correct, got) {
852 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
853 }
854}
855
Milo Lina72e2002022-04-06 20:31:13 -0700856func TestQueryShiftDB(t *testing.T) {
857 fixture := createDatabase(t)
858 defer fixture.TearDown()
859
860 testDatabase := []Shift{
861 Shift{
862 MatchNumber: 1,
863 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
864 },
865 Shift{
866 MatchNumber: 2,
867 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
868 },
869 }
870
871 for i := 0; i < len(testDatabase); i++ {
872 err := fixture.db.AddToShift(testDatabase[i])
873 check(t, err, fmt.Sprint("Failed to add shift", i))
874 }
875
876 correct := []Shift{
877 Shift{
878 MatchNumber: 1,
879 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
880 },
881 }
882
883 got, err := fixture.db.QueryAllShifts(1)
884 check(t, err, "Failed to query shift for match 1")
885
886 if !reflect.DeepEqual(correct, got) {
887 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
888 }
889}
890
Emily Markovafaecfe12023-07-01 12:40:03 -0700891func TestQueryPitImages(t *testing.T) {
892 fixture := createDatabase(t)
893 defer fixture.TearDown()
894
895 testDatabase := []PitImage{
896 PitImage{
897 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
898 ImagePath: "image1.jpg", ImageData: []byte{14, 15, 32, 54},
899 },
900 PitImage{
901 TeamNumber: "237", CheckSum: "br78232b6r7iaa",
902 ImagePath: "bot.png", ImageData: []byte{32, 54, 23, 00},
903 },
904 PitImage{
905 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
906 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
907 },
908 }
909
910 for i := 0; i < len(testDatabase); i++ {
911 err := fixture.db.AddPitImage(testDatabase[i])
912 check(t, err, fmt.Sprint("Failed to add pit image", i))
913 }
914
915 correct := []RequestedPitImage{
916 RequestedPitImage{
917 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
918 ImagePath: "image1.jpg",
919 },
920 }
921
922 got, err := fixture.db.QueryPitImages("723")
923 check(t, err, "Failed to query shift for team 723")
924
925 if !reflect.DeepEqual(correct, got) {
926 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
927 }
928}
929
930func TestQueryPitImageByChecksum(t *testing.T) {
931 fixture := createDatabase(t)
932 defer fixture.TearDown()
933
934 testDatabase := []PitImage{
935 PitImage{
936 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
937 ImagePath: "image1.jpg", ImageData: []byte{05, 32, 00, 74, 28},
938 },
939 PitImage{
940 TeamNumber: "237", CheckSum: "br78232b6r7iaa",
941 ImagePath: "bot.png", ImageData: []byte{32, 54, 23, 00},
942 },
943 PitImage{
944 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
945 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
946 },
947 }
948
949 for i := 0; i < len(testDatabase); i++ {
950 err := fixture.db.AddPitImage(testDatabase[i])
951 check(t, err, fmt.Sprint("Failed to add pit image", i))
952 }
953
954 correctPitImage := PitImage{
955 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
956 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
957 }
958
959 got, err := fixture.db.QueryPitImageByChecksum("b63c728bqiq8a73")
960 check(t, err, "Failed to query shift for checksum 'b63c728bqiq8a73'")
961
962 if !reflect.DeepEqual(correctPitImage, got) {
963 t.Fatalf("Got %#v,\nbut expected %#v.", got, correctPitImage)
964 }
965}
966
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700967func TestQueryRankingsDB(t *testing.T) {
968 fixture := createDatabase(t)
969 defer fixture.TearDown()
970
971 testDatabase := []Ranking{
972 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800973 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700974 Losses: 1, Wins: 7, Ties: 2,
975 Rank: 2, Dq: 0,
976 },
977 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800978 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700979 Losses: 3, Wins: 4, Ties: 0,
980 Rank: 4, Dq: 2,
981 },
982 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800983 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700984 Losses: 5, Wins: 2, Ties: 0,
985 Rank: 17, Dq: 0,
986 },
987 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -0800988 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700989 Losses: 0, Wins: 7, Ties: 0,
990 Rank: 5, Dq: 0,
991 },
992 }
993
994 for i := 0; i < len(testDatabase); i++ {
995 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
996 check(t, err, fmt.Sprint("Failed to add rankings ", i))
997 }
998
999 correct := []Ranking{
1000 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001001 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001002 Losses: 0, Wins: 7, Ties: 0,
1003 Rank: 5, Dq: 0,
1004 },
1005 }
1006
Emily Markovae68b7632023-12-30 14:17:55 -08001007 got, err := fixture.db.QueryRankings("126")
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001008 check(t, err, "Failed QueryRankings()")
1009
1010 if !reflect.DeepEqual(correct, got) {
1011 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1012 }
1013}
1014
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001015func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -08001016 fixture := createDatabase(t)
1017 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -08001018
Emily Markovabf24c9e2023-02-08 20:31:11 -08001019 correct := []TeamMatch{
1020 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001021 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: "6835"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001022 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001023 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "4834"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001024 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001025 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "9824"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001026 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001027 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001028 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001029 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001030 }
Philipp Schrader83fc2722022-03-10 21:59:20 -08001031
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001032 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -08001033 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -08001034 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001035 }
Philipp Schrader83fc2722022-03-10 21:59:20 -08001036
Philipp Schrader7365d322022-03-06 16:40:08 -08001037 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -08001038 check(t, err, "Failed ReturnMatches()")
1039
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001040 if !reflect.DeepEqual(correct, got) {
1041 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1042 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001043}
1044
Philipp Schraderfe583842022-04-08 19:47:07 -07001045func TestOverwriteNewMatchData(t *testing.T) {
1046 fixture := createDatabase(t)
1047 defer fixture.TearDown()
1048
Emily Markovabf24c9e2023-02-08 20:31:11 -08001049 testDatabase := []TeamMatch{
1050 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001051 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "4464"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001052 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001053 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001054 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001055 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -07001056 }
1057
1058 for i := 0; i < len(testDatabase); i++ {
1059 err := fixture.db.AddToMatch(testDatabase[i])
1060 check(t, err, fmt.Sprint("Failed to add match", i))
1061 }
1062
Emily Markovabf24c9e2023-02-08 20:31:11 -08001063 correct := []TeamMatch{
1064 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001065 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001066 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001067 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -07001068 }
1069
1070 got, err := fixture.db.ReturnMatches()
1071 check(t, err, "Failed to get match list")
1072
1073 if !reflect.DeepEqual(correct, got) {
1074 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
1075 }
1076}
1077
Milo Lina72e2002022-04-06 20:31:13 -07001078func TestAddReturnShiftDB(t *testing.T) {
1079 fixture := createDatabase(t)
1080 defer fixture.TearDown()
1081
1082 correct := []Shift{
1083 Shift{
1084 MatchNumber: 1,
1085 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
1086 },
1087 Shift{
1088 MatchNumber: 2,
1089 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
1090 },
1091 }
1092
1093 for i := 0; i < len(correct); i++ {
1094 err := fixture.db.AddToShift(correct[i])
1095 check(t, err, fmt.Sprint("Failed to add shift", i))
1096 }
1097
1098 got, err := fixture.db.ReturnAllShifts()
1099 check(t, err, "Failed ReturnAllShifts()")
1100
1101 if !reflect.DeepEqual(correct, got) {
1102 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1103 }
1104}
1105
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001106func TestReturnRankingsDB(t *testing.T) {
1107 fixture := createDatabase(t)
1108 defer fixture.TearDown()
1109
1110 correct := []Ranking{
1111 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001112 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001113 Losses: 1, Wins: 7, Ties: 2,
1114 Rank: 2, Dq: 0,
1115 },
1116 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001117 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001118 Losses: 3, Wins: 4, Ties: 0,
1119 Rank: 4, Dq: 2,
1120 },
1121 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001122 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001123 Losses: 5, Wins: 2, Ties: 0,
1124 Rank: 17, Dq: 0,
1125 },
1126 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001127 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001128 Losses: 0, Wins: 7, Ties: 0,
1129 Rank: 5, Dq: 0,
1130 },
1131 }
1132
1133 for i := 0; i < len(correct); i++ {
1134 err := fixture.db.AddOrUpdateRankings(correct[i])
1135 check(t, err, fmt.Sprint("Failed to add rankings", i))
1136 }
1137
1138 got, err := fixture.db.ReturnRankings()
1139 check(t, err, "Failed ReturnRankings()")
1140
1141 if !reflect.DeepEqual(correct, got) {
1142 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1143 }
1144}
1145
Emily Markova8cb91312024-02-02 12:30:37 -08001146func TestReturnStats2024DB(t *testing.T) {
1147 fixture := createDatabase(t)
1148 defer fixture.TearDown()
1149
1150 correct := []Stats2024{
1151 Stats2024{
1152 PreScouting: false, TeamNumber: "894",
1153 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
1154 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001155 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001156 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -08001157 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -08001158 },
1159 Stats2024{
1160 PreScouting: false, TeamNumber: "942",
1161 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1162 SpeakerAuto: 2, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001163 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001164 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -08001165 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "harry",
Emily Markova8cb91312024-02-02 12:30:37 -08001166 },
1167 Stats2024{
1168 PreScouting: false, TeamNumber: "432",
1169 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 3,
1170 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001171 Speaker: 2, Amp: 1, SpeakerAmplified: 3, Shuttled: 5, OutOfField: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -08001172 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -08001173 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "henry",
Emily Markova8cb91312024-02-02 12:30:37 -08001174 },
1175 Stats2024{
1176 PreScouting: false, TeamNumber: "52A",
1177 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
1178 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001179 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001180 NotesDropped: 2, Penalties: 0, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -08001181 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "jordan",
Emily Markova8cb91312024-02-02 12:30:37 -08001182 },
1183 }
1184
1185 matches := []TeamMatch{
1186 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
1187 Alliance: "R", AlliancePosition: 1, TeamNumber: "894"},
1188 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
1189 Alliance: "R", AlliancePosition: 2, TeamNumber: "942"},
1190 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
1191 Alliance: "R", AlliancePosition: 3, TeamNumber: "432"},
1192 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
1193 Alliance: "B", AlliancePosition: 1, TeamNumber: "52A"},
1194 }
1195
1196 for _, match := range matches {
1197 err := fixture.db.AddToMatch(match)
1198 check(t, err, "Failed to add match")
1199 }
1200
1201 for i := 0; i < len(correct); i++ {
1202 err := fixture.db.AddToStats2024(correct[i])
1203 check(t, err, fmt.Sprint("Failed to add stats ", i))
1204 }
1205
1206 got, err := fixture.db.ReturnStats2024()
1207 check(t, err, "Failed ReturnStats2024()")
1208
1209 if !reflect.DeepEqual(correct, got) {
1210 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1211 }
1212}
1213
Emily Markova290147d2023-03-03 22:40:06 -08001214func TestReturnStats2023DB(t *testing.T) {
1215 fixture := createDatabase(t)
1216 defer fixture.TearDown()
1217
1218 correct := []Stats2023{
1219 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -07001220 PreScouting: false,
1221 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -08001222 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
1223 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
1224 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
1225 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
1226 HighCubes: 1, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -07001227 MiddleCones: 0, HighCones: 2, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -07001228 AvgCycle: 51, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -07001229 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1230 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -08001231 },
1232 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -07001233 PreScouting: false,
1234 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -08001235 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
1236 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
1237 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
1238 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
1239 HighCubes: 1, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -07001240 MiddleCones: 0, HighCones: 2, ConesDropped: 1, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -07001241 AvgCycle: 39, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -07001242 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1243 BalanceAttempt: false, CollectedBy: "jack",
Emily Markova290147d2023-03-03 22:40:06 -08001244 },
1245 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -07001246 PreScouting: false,
1247 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -08001248 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
1249 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
1250 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1251 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1252 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -07001253 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -07001254 AvgCycle: 45, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -07001255 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1256 BalanceAttempt: true, CollectedBy: "martin",
Emily Markova290147d2023-03-03 22:40:06 -08001257 },
1258 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -07001259 PreScouting: false,
1260 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -08001261 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
1262 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
1263 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1264 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1265 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -07001266 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -07001267 AvgCycle: 34, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -07001268 BalanceAttemptAuto: false, Docked: true, Engaged: false,
1269 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -08001270 },
1271 }
1272
1273 matches := []TeamMatch{
1274 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001275 Alliance: "R", AlliancePosition: 1, TeamNumber: "2343"},
Emily Markova290147d2023-03-03 22:40:06 -08001276 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001277 Alliance: "R", AlliancePosition: 2, TeamNumber: "5443"},
Emily Markova290147d2023-03-03 22:40:06 -08001278 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001279 Alliance: "R", AlliancePosition: 3, TeamNumber: "5436"},
Emily Markova290147d2023-03-03 22:40:06 -08001280 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001281 Alliance: "B", AlliancePosition: 1, TeamNumber: "5643"},
Emily Markova290147d2023-03-03 22:40:06 -08001282 }
1283
1284 for _, match := range matches {
1285 err := fixture.db.AddToMatch(match)
1286 check(t, err, "Failed to add match")
1287 }
1288
1289 for i := 0; i < len(correct); i++ {
1290 err := fixture.db.AddToStats2023(correct[i])
1291 check(t, err, fmt.Sprint("Failed to add stats ", i))
1292 }
1293
1294 got, err := fixture.db.ReturnStats2023()
1295 check(t, err, "Failed ReturnStats()")
1296
1297 if !reflect.DeepEqual(correct, got) {
1298 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1299 }
1300}
1301
Sabina Leaver759090b2023-01-14 20:42:56 -08001302func TestReturnActionsDB(t *testing.T) {
1303 fixture := createDatabase(t)
1304 defer fixture.TearDown()
1305 correct := []Action{
1306 Action{
1307 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001308 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001309 },
1310 Action{
1311 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001312 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001313 },
1314 Action{
1315 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001316 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001317 },
1318 Action{
1319 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001320 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001321 },
1322 Action{
1323 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001324 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001325 },
1326 Action{
1327 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001328 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001329 },
1330 }
1331
Emily Markovabf24c9e2023-02-08 20:31:11 -08001332 matches := []TeamMatch{
1333 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001334 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001335 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001336 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001337 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001338 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001339 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001340 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001341 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001342 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001343 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001344 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001345 }
1346
1347 for _, match := range matches {
1348 err := fixture.db.AddToMatch(match)
1349 check(t, err, "Failed to add match")
1350 }
Sabina Leaver759090b2023-01-14 20:42:56 -08001351
1352 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001353 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -08001354 check(t, err, fmt.Sprint("Failed to add to actions ", i))
1355 }
1356
1357 got, err := fixture.db.ReturnActions()
1358 check(t, err, "Failed ReturnActions()")
1359
1360 if !reflect.DeepEqual(correct, got) {
1361 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1362 }
1363}
1364
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001365func TestRankingsDbUpdate(t *testing.T) {
1366 fixture := createDatabase(t)
1367 defer fixture.TearDown()
1368
1369 testDatabase := []Ranking{
1370 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001371 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001372 Losses: 1, Wins: 7, Ties: 2,
1373 Rank: 2, Dq: 0,
1374 },
1375 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001376 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001377 Losses: 3, Wins: 4, Ties: 0,
1378 Rank: 4, Dq: 2,
1379 },
1380 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001381 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001382 Losses: 5, Wins: 2, Ties: 0,
1383 Rank: 17, Dq: 0,
1384 },
1385 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001386 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001387 Losses: 0, Wins: 7, Ties: 0,
1388 Rank: 5, Dq: 0,
1389 },
1390 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001391 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001392 Losses: 2, Wins: 4, Ties: 1,
1393 Rank: 5, Dq: 0,
1394 },
1395 }
1396
1397 for i := 0; i < len(testDatabase); i++ {
1398 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
1399 check(t, err, fmt.Sprint("Failed to add rankings ", i))
1400 }
1401
1402 correct := []Ranking{
1403 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001404 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001405 Losses: 2, Wins: 4, Ties: 1,
1406 Rank: 5, Dq: 0,
1407 },
1408 }
1409
Emily Markovae68b7632023-12-30 14:17:55 -08001410 got, err := fixture.db.QueryRankings("125")
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001411 check(t, err, "Failed QueryRankings()")
1412
Philipp Schradereecb8962022-06-01 21:02:42 -07001413 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001414}
1415
Alex Perry871eab92022-03-12 17:43:52 -08001416func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -08001417 fixture := createDatabase(t)
1418 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -08001419
Philipp Schradereecb8962022-06-01 21:02:42 -07001420 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -08001421
Emily Markovae68b7632023-12-30 14:17:55 -08001422 err := fixture.db.AddNotes(NotesData{TeamNumber: "1234", Notes: "Note 1", GoodDriving: true, BadDriving: false, SolidPlacing: false, SketchyPlacing: true, GoodDefense: false, BadDefense: true, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -08001423 check(t, err, "Failed to add Note")
Emily Markovae68b7632023-12-30 14:17:55 -08001424 err = fixture.db.AddNotes(NotesData{TeamNumber: "1235", Notes: "Note 2", GoodDriving: false, BadDriving: true, SolidPlacing: false, SketchyPlacing: true, GoodDefense: false, BadDefense: false, EasilyDefended: false})
Alex Perry871eab92022-03-12 17:43:52 -08001425 check(t, err, "Failed to add Note")
Emily Markovae68b7632023-12-30 14:17:55 -08001426 err = fixture.db.AddNotes(NotesData{TeamNumber: "1234", Notes: "Note 3", GoodDriving: true, BadDriving: false, SolidPlacing: false, SketchyPlacing: true, GoodDefense: true, BadDefense: false, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -08001427 check(t, err, "Failed to add Note")
1428
Emily Markovae68b7632023-12-30 14:17:55 -08001429 actual, err := fixture.db.QueryNotes("1234")
Alex Perry871eab92022-03-12 17:43:52 -08001430 check(t, err, "Failed to get Notes")
1431
1432 if !reflect.DeepEqual(expected, actual) {
1433 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1434 }
1435}
Filip Kujawa210a03b2022-11-24 14:41:11 -08001436
1437func TestDriverRanking(t *testing.T) {
1438 fixture := createDatabase(t)
1439 defer fixture.TearDown()
1440
1441 expected := []DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -08001442 {ID: 1, MatchNumber: 12, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
1443 {ID: 2, MatchNumber: 12, Rank1: "1236", Rank2: "1235", Rank3: "1234"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001444 }
1445
1446 err := fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001447 DriverRankingData{MatchNumber: 12, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001448 )
1449 check(t, err, "Failed to add Driver Ranking")
1450 err = fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001451 DriverRankingData{MatchNumber: 12, Rank1: "1236", Rank2: "1235", Rank3: "1234"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001452 )
1453 check(t, err, "Failed to add Driver Ranking")
1454 err = fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001455 DriverRankingData{MatchNumber: 13, Rank1: "1235", Rank2: "1234", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001456 )
1457 check(t, err, "Failed to add Driver Ranking")
1458
1459 actual, err := fixture.db.QueryDriverRanking(12)
1460 check(t, err, "Failed to get Driver Ranking")
1461
1462 if !reflect.DeepEqual(expected, actual) {
1463 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1464 }
1465}
Philipp Schradera8955fb2023-03-05 15:47:19 -08001466
1467func TestParsedDriverRanking(t *testing.T) {
1468 fixture := createDatabase(t)
1469 defer fixture.TearDown()
1470
1471 expected := []ParsedDriverRankingData{
1472 {TeamNumber: "1234", Score: 100},
1473 {TeamNumber: "1235", Score: 110},
1474 {TeamNumber: "1236", Score: 90},
1475 }
1476
1477 for i := range expected {
1478 err := fixture.db.AddParsedDriverRanking(expected[i])
1479 check(t, err, "Failed to add Parsed Driver Ranking")
1480 }
1481
1482 actual, err := fixture.db.ReturnAllParsedDriverRankings()
1483 check(t, err, "Failed to get Parsed Driver Ranking")
1484 if !reflect.DeepEqual(expected, actual) {
1485 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1486 }
1487
1488 // Now update one of the rankings and make sure we get the properly
1489 // merged result.
1490 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1491 TeamNumber: "1235", Score: 200,
1492 })
1493 check(t, err, "Failed to add Parsed Driver Ranking")
1494
1495 expected = []ParsedDriverRankingData{
1496 {TeamNumber: "1234", Score: 100},
1497 {TeamNumber: "1236", Score: 90},
1498 {TeamNumber: "1235", Score: 200},
1499 }
1500
1501 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1502 check(t, err, "Failed to get Parsed Driver Ranking")
1503 if !reflect.DeepEqual(expected, actual) {
1504 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1505 }
1506}