blob: ed718806489fd5fbcb7cdae210ffb151ab54c03f [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 Markova290147d2023-03-03 22:40:06 -0800361func TestAddToStats2023DB(t *testing.T) {
362 fixture := createDatabase(t)
363 defer fixture.TearDown()
364
365 correct := []Stats2023{
366 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700367 PreScouting: false,
368 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800369 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
370 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
371 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
372 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
373 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700374 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700375 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700376 BalanceAttemptAuto: false, Docked: false, Engaged: false,
377 BalanceAttempt: false, CollectedBy: "emma",
Emily Markova290147d2023-03-03 22:40:06 -0800378 },
379 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700380 PreScouting: false,
381 TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800382 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
383 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
384 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
385 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
386 HighCubes: 0, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700387 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700388 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700389 BalanceAttemptAuto: true, Docked: true, Engaged: true,
390 BalanceAttempt: false, CollectedBy: "tyler",
Emily Markova290147d2023-03-03 22:40:06 -0800391 },
392 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700393 PreScouting: false,
394 TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800395 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
396 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
397 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
398 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
399 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700400 MiddleCones: 1, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700401 AvgCycle: 0, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700402 BalanceAttemptAuto: false, Docked: false, Engaged: false,
403 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800404 },
405 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700406 PreScouting: false,
407 TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800408 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
409 MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
410 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
411 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 1,
412 HighCubes: 2, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700413 MiddleCones: 1, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700414 AvgCycle: 0, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700415 BalanceAttemptAuto: true, Docked: false, Engaged: false,
416 BalanceAttempt: true, CollectedBy: "will",
Emily Markova290147d2023-03-03 22:40:06 -0800417 },
418 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700419 PreScouting: false,
420 TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800421 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
422 MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
423 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
424 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
425 HighCubes: 0, CubesDropped: 2, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700426 MiddleCones: 1, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700427 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700428 BalanceAttemptAuto: false, Docked: true, Engaged: false,
429 BalanceAttempt: false, CollectedBy: "unkown",
Emily Markova290147d2023-03-03 22:40:06 -0800430 },
431 }
432
433 matches := []TeamMatch{
434 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700435 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Emily Markova290147d2023-03-03 22:40:06 -0800436 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700437 Alliance: "R", AlliancePosition: 2, TeamNumber: "7454"},
Emily Markova290147d2023-03-03 22:40:06 -0800438 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700439 Alliance: "R", AlliancePosition: 3, TeamNumber: "4354"},
Emily Markova290147d2023-03-03 22:40:06 -0800440 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700441 Alliance: "B", AlliancePosition: 1, TeamNumber: "6533"},
Emily Markova290147d2023-03-03 22:40:06 -0800442 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700443 Alliance: "B", AlliancePosition: 2, TeamNumber: "8354"},
Emily Markova290147d2023-03-03 22:40:06 -0800444 }
445
446 for _, match := range matches {
447 err := fixture.db.AddToMatch(match)
448 check(t, err, "Failed to add match")
449 }
450
451 for i := 0; i < len(correct); i++ {
452 err := fixture.db.AddToStats2023(correct[i])
453 check(t, err, "Failed to add 2023stats to DB")
454 }
455
456 got, err := fixture.db.ReturnStats2023()
457 check(t, err, "Failed ReturnStats2023()")
458
459 if !reflect.DeepEqual(correct, got) {
460 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
461 }
462}
463
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700464func TestInsertPreScoutedStats(t *testing.T) {
465 fixture := createDatabase(t)
466 defer fixture.TearDown()
467
468 stats := Stats2023{
469 PreScouting: false,
470 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
471 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
472 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
473 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
474 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
475 HighCubes: 1, CubesDropped: 0, LowCones: 0,
476 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
477 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
478 BalanceAttemptAuto: false, Docked: false, Engaged: false,
479 BalanceAttempt: false, CollectedBy: "emma",
480 }
481
482 // Attempt to insert the non-pre-scouted data and make sure it fails.
483 err := fixture.db.AddToStats2023(stats)
484 if err == nil {
485 t.Fatal("Expected error from inserting the stats.")
486 }
487 if err.Error() != "Failed to find team 6344 in match 3 in the schedule." {
488 t.Fatal("Got:", err.Error())
489 }
490
491 // Mark the data as pre-scouting data. It should now succeed.
492 stats.PreScouting = true
493 err = fixture.db.AddToStats2023(stats)
494 check(t, err, "Failed to add prescouted stats to DB")
495}
496
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800497func TestQueryingStats2023ByTeam(t *testing.T) {
498 fixture := createDatabase(t)
499 defer fixture.TearDown()
500
501 stats := []Stats2023{
502 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700503 PreScouting: false,
504 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800505 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
506 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
507 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
508 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
509 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700510 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700511 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700512 BalanceAttemptAuto: false, Docked: false, Engaged: false,
513 BalanceAttempt: false, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800514 },
515 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700516 PreScouting: false,
517 TeamNumber: "7454", MatchNumber: 4, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800518 CompLevel: "qm", StartingQuadrant: 2, LowCubesAuto: 1,
519 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
520 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
521 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
522 HighCubes: 0, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700523 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700524 AvgCycle: 0, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700525 BalanceAttemptAuto: true, Docked: false, Engaged: false,
526 BalanceAttempt: false, CollectedBy: "tyler",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800527 },
528 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700529 PreScouting: false,
530 TeamNumber: "6344", MatchNumber: 5, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800531 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
532 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
533 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
534 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
535 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700536 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700537 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700538 BalanceAttemptAuto: false, Docked: true, Engaged: false,
539 BalanceAttempt: true, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800540 },
541 }
542
543 matches := []TeamMatch{
544 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700545 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800546 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700547 Alliance: "R", AlliancePosition: 1, TeamNumber: "7454"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800548 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700549 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800550 }
551
552 for _, match := range matches {
553 err := fixture.db.AddToMatch(match)
554 check(t, err, "Failed to add match")
555 }
556
557 for i := range stats {
558 err := fixture.db.AddToStats2023(stats[i])
559 check(t, err, "Failed to add 2023stats to DB")
560 }
561
562 // Validate that requesting status for a single team gets us the
563 // expected data.
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700564 statsFor6344, err := fixture.db.ReturnStats2023ForTeam("6344", 3, 1, "qm", false)
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800565 check(t, err, "Failed ReturnStats2023()")
566
567 if !reflect.DeepEqual([]Stats2023{stats[0]}, statsFor6344) {
568 t.Errorf("Got %#v,\nbut expected %#v.", statsFor6344, stats[0])
569 }
570
571 // Validate that requesting team data for a non-existent match returns
572 // nothing.
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700573 statsForMissing, err := fixture.db.ReturnStats2023ForTeam("6344", 9, 1, "qm", false)
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800574 check(t, err, "Failed ReturnStats2023()")
575
576 if !reflect.DeepEqual([]Stats2023{}, statsForMissing) {
577 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2023{})
578 }
579}
580
Emily Markova6b551e02023-02-18 17:37:40 -0800581func TestDeleteFromStats(t *testing.T) {
582 fixture := createDatabase(t)
583 defer fixture.TearDown()
584
585 startingStats := []Stats2023{
586 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700587 PreScouting: false,
588 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800589 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
590 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
591 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
592 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
593 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700594 MiddleCones: 0, HighCones: 1, ConesDropped: 2, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700595 AvgCycle: 58, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700596 BalanceAttemptAuto: true, Docked: true, Engaged: true,
597 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova6b551e02023-02-18 17:37:40 -0800598 },
599 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700600 PreScouting: false,
601 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800602 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
603 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
604 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
605 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
606 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700607 MiddleCones: 2, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700608 AvgCycle: 34, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700609 BalanceAttemptAuto: false, Docked: true, Engaged: false,
610 BalanceAttempt: false, CollectedBy: "simon",
Emily Markova6b551e02023-02-18 17:37:40 -0800611 },
612 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700613 PreScouting: false,
614 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800615 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
616 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
617 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
618 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
619 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700620 MiddleCones: 0, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700621 AvgCycle: 50, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700622 BalanceAttemptAuto: true, Docked: false, Engaged: false,
623 BalanceAttempt: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800624 },
625 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700626 PreScouting: false,
627 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800628 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
629 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
630 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
631 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
632 HighCubes: 2, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700633 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700634 AvgCycle: 49, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700635 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova6b551e02023-02-18 17:37:40 -0800636 },
637 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700638 PreScouting: false,
639 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800640 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
641 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
642 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
643 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
644 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700645 MiddleCones: 1, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700646 AvgCycle: 70, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700647 BalanceAttemptAuto: false, Docked: false, Engaged: false,
648 BalanceAttempt: true, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800649 },
650 }
651
652 correct := []Stats2023{
653 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700654 PreScouting: false,
655 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800656 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
657 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
658 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
659 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
660 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700661 MiddleCones: 0, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700662 AvgCycle: 50, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700663 BalanceAttemptAuto: true, Docked: false, Engaged: false,
664 BalanceAttempt: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800665 },
666 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700667 PreScouting: false,
668 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800669 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
670 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
671 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
672 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
673 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700674 MiddleCones: 1, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700675 AvgCycle: 70, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700676 BalanceAttemptAuto: false, Docked: false, Engaged: false,
677 BalanceAttempt: true, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800678 },
679 }
680
681 originalMatches := []TeamMatch{
682 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700683 Alliance: "R", AlliancePosition: 1, TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800684 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700685 Alliance: "B", AlliancePosition: 1, TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800686 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700687 Alliance: "R", AlliancePosition: 3, TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800688 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700689 Alliance: "B", AlliancePosition: 2, TeamNumber: "2454"},
Emily Markova6b551e02023-02-18 17:37:40 -0800690 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700691 Alliance: "B", AlliancePosition: 3, TeamNumber: "3242"},
Emily Markova6b551e02023-02-18 17:37:40 -0800692 }
693
694 // Matches for which we want to delete the stats.
695 matches := []TeamMatch{
696 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700697 TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800698 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700699 TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800700 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700701 TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800702 }
703
704 for _, match := range originalMatches {
705 err := fixture.db.AddToMatch(match)
706 check(t, err, "Failed to add match")
707 fmt.Println("Match has been added : ", match.TeamNumber)
708 }
709
710 for _, stat := range startingStats {
711 err := fixture.db.AddToStats2023(stat)
712 check(t, err, "Failed to add stat")
713 }
714
715 for _, match := range matches {
Emily Markovab8551572023-03-22 19:49:39 -0700716 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
Emily Markova6b551e02023-02-18 17:37:40 -0800717 check(t, err, "Failed to delete stat")
718 }
719
720 got, err := fixture.db.ReturnStats2023()
721 check(t, err, "Failed ReturnStats()")
722
723 if !reflect.DeepEqual(correct, got) {
724 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
725 }
726}
727
Emily Markova8cb91312024-02-02 12:30:37 -0800728func TestDeleteFromStats2024(t *testing.T) {
729 fixture := createDatabase(t)
730 defer fixture.TearDown()
731
732 startingStats := []Stats2024{
733 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700734 CompType: "Regular", TeamNumber: "345",
Emily Markova8cb91312024-02-02 12:30:37 -0800735 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
736 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700737 Speaker: 1, Amp: 3, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 3,
Emily Markova6079e2f2024-02-17 13:17:24 -0800738 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700739 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "bailey",
Emily Markova8cb91312024-02-02 12:30:37 -0800740 },
741 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700742 CompType: "Practice", TeamNumber: "645",
Emily Markova8cb91312024-02-02 12:30:37 -0800743 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
744 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700745 Speaker: 1, Amp: 2, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800746 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700747 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kate",
Emily Markova8cb91312024-02-02 12:30:37 -0800748 },
749 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700750 CompType: "Regular", TeamNumber: "323",
Emily Markova8cb91312024-02-02 12:30:37 -0800751 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
752 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700753 Speaker: 0, Amp: 0, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800754 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700755 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "tyler",
Emily Markova8cb91312024-02-02 12:30:37 -0800756 },
757 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700758 CompType: "Regular", TeamNumber: "542",
Emily Markova8cb91312024-02-02 12:30:37 -0800759 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
760 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700761 Speaker: 1, Amp: 2, SpeakerAmplified: 2, Shuttled: 2, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800762 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700763 Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: false, CollectedBy: "max",
Emily Markova8cb91312024-02-02 12:30:37 -0800764 },
765 }
766
767 correct := []Stats2024{
768 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700769 CompType: "Regular", TeamNumber: "345",
Emily Markova8cb91312024-02-02 12:30:37 -0800770 MatchNumber: 5, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
771 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700772 Speaker: 1, Amp: 3, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 3,
Emily Markova6079e2f2024-02-17 13:17:24 -0800773 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700774 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "bailey",
Emily Markova8cb91312024-02-02 12:30:37 -0800775 },
776 }
777
778 originalMatches := []TeamMatch{
779 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
780 Alliance: "R", AlliancePosition: 1, TeamNumber: "345"},
781 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
782 Alliance: "B", AlliancePosition: 1, TeamNumber: "645"},
783 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
784 Alliance: "R", AlliancePosition: 3, TeamNumber: "323"},
785 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
786 Alliance: "B", AlliancePosition: 2, TeamNumber: "542"},
787 }
788
789 // Matches for which we want to delete the stats.
790 matches := []TeamMatch{
791 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
792 TeamNumber: "645"},
793 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
794 TeamNumber: "323"},
795 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
796 TeamNumber: "542"},
797 }
798
799 for _, match := range originalMatches {
800 err := fixture.db.AddToMatch(match)
801 check(t, err, "Failed to add match")
802 fmt.Println("Match has been added : ", match.TeamNumber)
803 }
804
805 for _, stat := range startingStats {
806 err := fixture.db.AddToStats2024(stat)
807 check(t, err, "Failed to add stat")
808 }
809
810 for _, match := range matches {
811 err := fixture.db.DeleteFromStats2024(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
812 check(t, err, "Failed to delete stat2024")
813 }
814
815 got, err := fixture.db.ReturnStats2024()
816 check(t, err, "Failed ReturnStats2024()")
817
818 if !reflect.DeepEqual(correct, got) {
819 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
820 }
821}
822
Filip Kujawac1ded372023-05-27 14:33:43 -0700823func TestDeleteFromActions(t *testing.T) {
824 fixture := createDatabase(t)
825 defer fixture.TearDown()
826
827 startingActions := []Action{
828 Action{
829 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
830 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
831 },
832 Action{
833 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
834 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
835 },
836 Action{
837 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
838 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
839 },
840 Action{
841 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
842 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
843 },
844 Action{
845 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
846 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
847 },
848 Action{
849 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
850 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
851 },
852 }
853
854 correct := []Action{
855 Action{
856 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
857 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
858 },
859 Action{
860 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
861 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
862 },
863 Action{
864 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
865 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
866 },
867 Action{
868 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
869 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
870 },
871 Action{
872 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
873 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
874 },
875 }
876
877 for _, action := range startingActions {
878 err := fixture.db.AddAction(action)
879 check(t, err, "Failed to add stat")
880 }
881
882 err := fixture.db.DeleteFromActions("quals", 94, 1, "1239")
883
884 got, err := fixture.db.ReturnActions()
885 check(t, err, "Failed ReturnActions()")
886
887 if !reflect.DeepEqual(correct, got) {
888 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
889 }
890}
891
Milo Lina72e2002022-04-06 20:31:13 -0700892func TestQueryShiftDB(t *testing.T) {
893 fixture := createDatabase(t)
894 defer fixture.TearDown()
895
896 testDatabase := []Shift{
897 Shift{
898 MatchNumber: 1,
899 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
900 },
901 Shift{
902 MatchNumber: 2,
903 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
904 },
905 }
906
907 for i := 0; i < len(testDatabase); i++ {
908 err := fixture.db.AddToShift(testDatabase[i])
909 check(t, err, fmt.Sprint("Failed to add shift", i))
910 }
911
912 correct := []Shift{
913 Shift{
914 MatchNumber: 1,
915 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
916 },
917 }
918
919 got, err := fixture.db.QueryAllShifts(1)
920 check(t, err, "Failed to query shift for match 1")
921
922 if !reflect.DeepEqual(correct, got) {
923 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
924 }
925}
926
Emily Markovafaecfe12023-07-01 12:40:03 -0700927func TestQueryPitImages(t *testing.T) {
928 fixture := createDatabase(t)
929 defer fixture.TearDown()
930
931 testDatabase := []PitImage{
932 PitImage{
933 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
934 ImagePath: "image1.jpg", ImageData: []byte{14, 15, 32, 54},
935 },
936 PitImage{
937 TeamNumber: "237", CheckSum: "br78232b6r7iaa",
938 ImagePath: "bot.png", ImageData: []byte{32, 54, 23, 00},
939 },
940 PitImage{
941 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
942 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
943 },
944 }
945
946 for i := 0; i < len(testDatabase); i++ {
947 err := fixture.db.AddPitImage(testDatabase[i])
948 check(t, err, fmt.Sprint("Failed to add pit image", i))
949 }
950
951 correct := []RequestedPitImage{
952 RequestedPitImage{
953 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
954 ImagePath: "image1.jpg",
955 },
956 }
957
958 got, err := fixture.db.QueryPitImages("723")
959 check(t, err, "Failed to query shift for team 723")
960
961 if !reflect.DeepEqual(correct, got) {
962 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
963 }
964}
965
966func TestQueryPitImageByChecksum(t *testing.T) {
967 fixture := createDatabase(t)
968 defer fixture.TearDown()
969
970 testDatabase := []PitImage{
971 PitImage{
972 TeamNumber: "723", CheckSum: "8be8h9829hf98wp",
973 ImagePath: "image1.jpg", ImageData: []byte{05, 32, 00, 74, 28},
974 },
975 PitImage{
976 TeamNumber: "237", CheckSum: "br78232b6r7iaa",
977 ImagePath: "bot.png", ImageData: []byte{32, 54, 23, 00},
978 },
979 PitImage{
980 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
981 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
982 },
983 }
984
985 for i := 0; i < len(testDatabase); i++ {
986 err := fixture.db.AddPitImage(testDatabase[i])
987 check(t, err, fmt.Sprint("Failed to add pit image", i))
988 }
989
990 correctPitImage := PitImage{
991 TeamNumber: "125A", CheckSum: "b63c728bqiq8a73",
992 ImagePath: "file123.jpeg", ImageData: []byte{32, 05, 01, 28},
993 }
994
995 got, err := fixture.db.QueryPitImageByChecksum("b63c728bqiq8a73")
996 check(t, err, "Failed to query shift for checksum 'b63c728bqiq8a73'")
997
998 if !reflect.DeepEqual(correctPitImage, got) {
999 t.Fatalf("Got %#v,\nbut expected %#v.", got, correctPitImage)
1000 }
1001}
1002
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001003func TestQueryRankingsDB(t *testing.T) {
1004 fixture := createDatabase(t)
1005 defer fixture.TearDown()
1006
1007 testDatabase := []Ranking{
1008 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001009 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001010 Losses: 1, Wins: 7, Ties: 2,
1011 Rank: 2, Dq: 0,
1012 },
1013 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001014 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001015 Losses: 3, Wins: 4, Ties: 0,
1016 Rank: 4, Dq: 2,
1017 },
1018 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001019 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001020 Losses: 5, Wins: 2, Ties: 0,
1021 Rank: 17, Dq: 0,
1022 },
1023 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001024 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001025 Losses: 0, Wins: 7, Ties: 0,
1026 Rank: 5, Dq: 0,
1027 },
1028 }
1029
1030 for i := 0; i < len(testDatabase); i++ {
1031 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
1032 check(t, err, fmt.Sprint("Failed to add rankings ", i))
1033 }
1034
1035 correct := []Ranking{
1036 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001037 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001038 Losses: 0, Wins: 7, Ties: 0,
1039 Rank: 5, Dq: 0,
1040 },
1041 }
1042
Emily Markovae68b7632023-12-30 14:17:55 -08001043 got, err := fixture.db.QueryRankings("126")
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001044 check(t, err, "Failed QueryRankings()")
1045
1046 if !reflect.DeepEqual(correct, got) {
1047 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1048 }
1049}
1050
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001051func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -08001052 fixture := createDatabase(t)
1053 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -08001054
Emily Markovabf24c9e2023-02-08 20:31:11 -08001055 correct := []TeamMatch{
1056 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001057 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: "6835"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001058 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001059 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "4834"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001060 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001061 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "9824"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001062 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001063 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001064 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001065 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001066 }
Philipp Schrader83fc2722022-03-10 21:59:20 -08001067
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001068 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -08001069 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -08001070 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001071 }
Philipp Schrader83fc2722022-03-10 21:59:20 -08001072
Philipp Schrader7365d322022-03-06 16:40:08 -08001073 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -08001074 check(t, err, "Failed ReturnMatches()")
1075
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001076 if !reflect.DeepEqual(correct, got) {
1077 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1078 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001079}
1080
Philipp Schraderfe583842022-04-08 19:47:07 -07001081func TestOverwriteNewMatchData(t *testing.T) {
1082 fixture := createDatabase(t)
1083 defer fixture.TearDown()
1084
Emily Markovabf24c9e2023-02-08 20:31:11 -08001085 testDatabase := []TeamMatch{
1086 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001087 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "4464"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001088 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001089 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001090 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001091 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -07001092 }
1093
1094 for i := 0; i < len(testDatabase); i++ {
1095 err := fixture.db.AddToMatch(testDatabase[i])
1096 check(t, err, fmt.Sprint("Failed to add match", i))
1097 }
1098
Emily Markovabf24c9e2023-02-08 20:31:11 -08001099 correct := []TeamMatch{
1100 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001101 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001102 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -07001103 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -07001104 }
1105
1106 got, err := fixture.db.ReturnMatches()
1107 check(t, err, "Failed to get match list")
1108
1109 if !reflect.DeepEqual(correct, got) {
1110 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
1111 }
1112}
1113
Milo Lina72e2002022-04-06 20:31:13 -07001114func TestAddReturnShiftDB(t *testing.T) {
1115 fixture := createDatabase(t)
1116 defer fixture.TearDown()
1117
1118 correct := []Shift{
1119 Shift{
1120 MatchNumber: 1,
1121 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
1122 },
1123 Shift{
1124 MatchNumber: 2,
1125 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
1126 },
1127 }
1128
1129 for i := 0; i < len(correct); i++ {
1130 err := fixture.db.AddToShift(correct[i])
1131 check(t, err, fmt.Sprint("Failed to add shift", i))
1132 }
1133
1134 got, err := fixture.db.ReturnAllShifts()
1135 check(t, err, "Failed ReturnAllShifts()")
1136
1137 if !reflect.DeepEqual(correct, got) {
1138 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1139 }
1140}
1141
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001142func TestReturnRankingsDB(t *testing.T) {
1143 fixture := createDatabase(t)
1144 defer fixture.TearDown()
1145
1146 correct := []Ranking{
1147 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001148 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001149 Losses: 1, Wins: 7, Ties: 2,
1150 Rank: 2, Dq: 0,
1151 },
1152 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001153 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001154 Losses: 3, Wins: 4, Ties: 0,
1155 Rank: 4, Dq: 2,
1156 },
1157 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001158 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001159 Losses: 5, Wins: 2, Ties: 0,
1160 Rank: 17, Dq: 0,
1161 },
1162 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001163 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001164 Losses: 0, Wins: 7, Ties: 0,
1165 Rank: 5, Dq: 0,
1166 },
1167 }
1168
1169 for i := 0; i < len(correct); i++ {
1170 err := fixture.db.AddOrUpdateRankings(correct[i])
1171 check(t, err, fmt.Sprint("Failed to add rankings", i))
1172 }
1173
1174 got, err := fixture.db.ReturnRankings()
1175 check(t, err, "Failed ReturnRankings()")
1176
1177 if !reflect.DeepEqual(correct, got) {
1178 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1179 }
1180}
1181
Emily Markova8cb91312024-02-02 12:30:37 -08001182func TestReturnStats2024DB(t *testing.T) {
1183 fixture := createDatabase(t)
1184 defer fixture.TearDown()
1185
1186 correct := []Stats2024{
1187 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -07001188 CompType: "Practice", TeamNumber: "894",
Emily Markova8cb91312024-02-02 12:30:37 -08001189 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
1190 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001191 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001192 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -07001193 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
Emily Markova8cb91312024-02-02 12:30:37 -08001194 },
1195 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -07001196 CompType: "Regular", TeamNumber: "942",
Emily Markova8cb91312024-02-02 12:30:37 -08001197 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1198 SpeakerAuto: 2, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001199 Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001200 NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -07001201 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "harry",
Emily Markova8cb91312024-02-02 12:30:37 -08001202 },
1203 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -07001204 CompType: "Practice", TeamNumber: "432",
Emily Markova8cb91312024-02-02 12:30:37 -08001205 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 3,
1206 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001207 Speaker: 2, Amp: 1, SpeakerAmplified: 3, Shuttled: 5, OutOfField: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -08001208 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -07001209 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "henry",
Emily Markova8cb91312024-02-02 12:30:37 -08001210 },
1211 Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -07001212 CompType: "Regular", TeamNumber: "52A",
Emily Markova8cb91312024-02-02 12:30:37 -08001213 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 1,
1214 SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001215 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001216 NotesDropped: 2, Penalties: 0, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -07001217 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "jordan",
Emily Markova8cb91312024-02-02 12:30:37 -08001218 },
1219 }
1220
1221 matches := []TeamMatch{
1222 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
1223 Alliance: "R", AlliancePosition: 1, TeamNumber: "894"},
1224 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
1225 Alliance: "R", AlliancePosition: 2, TeamNumber: "942"},
1226 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
1227 Alliance: "R", AlliancePosition: 3, TeamNumber: "432"},
1228 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
1229 Alliance: "B", AlliancePosition: 1, TeamNumber: "52A"},
1230 }
1231
1232 for _, match := range matches {
1233 err := fixture.db.AddToMatch(match)
1234 check(t, err, "Failed to add match")
1235 }
1236
1237 for i := 0; i < len(correct); i++ {
1238 err := fixture.db.AddToStats2024(correct[i])
1239 check(t, err, fmt.Sprint("Failed to add stats ", i))
1240 }
1241
1242 got, err := fixture.db.ReturnStats2024()
1243 check(t, err, "Failed ReturnStats2024()")
1244
1245 if !reflect.DeepEqual(correct, got) {
1246 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1247 }
1248}
1249
Emily Markova290147d2023-03-03 22:40:06 -08001250func TestReturnStats2023DB(t *testing.T) {
1251 fixture := createDatabase(t)
1252 defer fixture.TearDown()
1253
1254 correct := []Stats2023{
1255 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -07001256 PreScouting: false,
1257 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -08001258 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
1259 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
1260 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
1261 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
1262 HighCubes: 1, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -07001263 MiddleCones: 0, HighCones: 2, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -07001264 AvgCycle: 51, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -07001265 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1266 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -08001267 },
1268 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -07001269 PreScouting: false,
1270 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -08001271 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
1272 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
1273 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
1274 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
1275 HighCubes: 1, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -07001276 MiddleCones: 0, HighCones: 2, ConesDropped: 1, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -07001277 AvgCycle: 39, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -07001278 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1279 BalanceAttempt: false, CollectedBy: "jack",
Emily Markova290147d2023-03-03 22:40:06 -08001280 },
1281 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -07001282 PreScouting: false,
1283 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -08001284 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
1285 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
1286 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1287 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1288 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -07001289 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -07001290 AvgCycle: 45, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -07001291 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1292 BalanceAttempt: true, CollectedBy: "martin",
Emily Markova290147d2023-03-03 22:40:06 -08001293 },
1294 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -07001295 PreScouting: false,
1296 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -08001297 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
1298 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
1299 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1300 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1301 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -07001302 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -07001303 AvgCycle: 34, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -07001304 BalanceAttemptAuto: false, Docked: true, Engaged: false,
1305 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -08001306 },
1307 }
1308
1309 matches := []TeamMatch{
1310 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001311 Alliance: "R", AlliancePosition: 1, TeamNumber: "2343"},
Emily Markova290147d2023-03-03 22:40:06 -08001312 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001313 Alliance: "R", AlliancePosition: 2, TeamNumber: "5443"},
Emily Markova290147d2023-03-03 22:40:06 -08001314 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001315 Alliance: "R", AlliancePosition: 3, TeamNumber: "5436"},
Emily Markova290147d2023-03-03 22:40:06 -08001316 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001317 Alliance: "B", AlliancePosition: 1, TeamNumber: "5643"},
Emily Markova290147d2023-03-03 22:40:06 -08001318 }
1319
1320 for _, match := range matches {
1321 err := fixture.db.AddToMatch(match)
1322 check(t, err, "Failed to add match")
1323 }
1324
1325 for i := 0; i < len(correct); i++ {
1326 err := fixture.db.AddToStats2023(correct[i])
1327 check(t, err, fmt.Sprint("Failed to add stats ", i))
1328 }
1329
1330 got, err := fixture.db.ReturnStats2023()
1331 check(t, err, "Failed ReturnStats()")
1332
1333 if !reflect.DeepEqual(correct, got) {
1334 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1335 }
1336}
1337
Sabina Leaver759090b2023-01-14 20:42:56 -08001338func TestReturnActionsDB(t *testing.T) {
1339 fixture := createDatabase(t)
1340 defer fixture.TearDown()
1341 correct := []Action{
1342 Action{
1343 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001344 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001345 },
1346 Action{
1347 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001348 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001349 },
1350 Action{
1351 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001352 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001353 },
1354 Action{
1355 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001356 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001357 },
1358 Action{
1359 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001360 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001361 },
1362 Action{
1363 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -07001364 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -08001365 },
1366 }
1367
Emily Markovabf24c9e2023-02-08 20:31:11 -08001368 matches := []TeamMatch{
1369 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001370 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001371 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001372 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001373 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001374 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001375 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001376 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001377 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001378 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001379 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001380 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001381 }
1382
1383 for _, match := range matches {
1384 err := fixture.db.AddToMatch(match)
1385 check(t, err, "Failed to add match")
1386 }
Sabina Leaver759090b2023-01-14 20:42:56 -08001387
1388 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001389 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -08001390 check(t, err, fmt.Sprint("Failed to add to actions ", i))
1391 }
1392
1393 got, err := fixture.db.ReturnActions()
1394 check(t, err, "Failed ReturnActions()")
1395
1396 if !reflect.DeepEqual(correct, got) {
1397 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1398 }
1399}
1400
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001401func TestRankingsDbUpdate(t *testing.T) {
1402 fixture := createDatabase(t)
1403 defer fixture.TearDown()
1404
1405 testDatabase := []Ranking{
1406 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001407 TeamNumber: "123",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001408 Losses: 1, Wins: 7, Ties: 2,
1409 Rank: 2, Dq: 0,
1410 },
1411 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001412 TeamNumber: "124",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001413 Losses: 3, Wins: 4, Ties: 0,
1414 Rank: 4, Dq: 2,
1415 },
1416 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001417 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001418 Losses: 5, Wins: 2, Ties: 0,
1419 Rank: 17, Dq: 0,
1420 },
1421 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001422 TeamNumber: "126",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001423 Losses: 0, Wins: 7, Ties: 0,
1424 Rank: 5, Dq: 0,
1425 },
1426 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001427 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001428 Losses: 2, Wins: 4, Ties: 1,
1429 Rank: 5, Dq: 0,
1430 },
1431 }
1432
1433 for i := 0; i < len(testDatabase); i++ {
1434 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
1435 check(t, err, fmt.Sprint("Failed to add rankings ", i))
1436 }
1437
1438 correct := []Ranking{
1439 Ranking{
Emily Markovae68b7632023-12-30 14:17:55 -08001440 TeamNumber: "125",
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001441 Losses: 2, Wins: 4, Ties: 1,
1442 Rank: 5, Dq: 0,
1443 },
1444 }
1445
Emily Markovae68b7632023-12-30 14:17:55 -08001446 got, err := fixture.db.QueryRankings("125")
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001447 check(t, err, "Failed QueryRankings()")
1448
Philipp Schradereecb8962022-06-01 21:02:42 -07001449 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001450}
1451
Alex Perry871eab92022-03-12 17:43:52 -08001452func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -08001453 fixture := createDatabase(t)
1454 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -08001455
Philipp Schradereecb8962022-06-01 21:02:42 -07001456 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -08001457
Emily Markovacf893f42024-03-13 19:03:10 -07001458 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 -08001459 check(t, err, "Failed to add Note")
Emily Markovacf893f42024-03-13 19:03:10 -07001460 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 -08001461 check(t, err, "Failed to add Note")
Emily Markovacf893f42024-03-13 19:03:10 -07001462 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 -08001463 check(t, err, "Failed to add Note")
1464
Emily Markovae68b7632023-12-30 14:17:55 -08001465 actual, err := fixture.db.QueryNotes("1234")
Alex Perry871eab92022-03-12 17:43:52 -08001466 check(t, err, "Failed to get Notes")
1467
1468 if !reflect.DeepEqual(expected, actual) {
1469 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1470 }
1471}
Filip Kujawa210a03b2022-11-24 14:41:11 -08001472
1473func TestDriverRanking(t *testing.T) {
1474 fixture := createDatabase(t)
1475 defer fixture.TearDown()
1476
1477 expected := []DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -08001478 {ID: 1, MatchNumber: 12, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
1479 {ID: 2, MatchNumber: 12, Rank1: "1236", Rank2: "1235", Rank3: "1234"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001480 }
1481
1482 err := fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001483 DriverRankingData{MatchNumber: 12, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001484 )
1485 check(t, err, "Failed to add Driver Ranking")
1486 err = fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001487 DriverRankingData{MatchNumber: 12, Rank1: "1236", Rank2: "1235", Rank3: "1234"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001488 )
1489 check(t, err, "Failed to add Driver Ranking")
1490 err = fixture.db.AddDriverRanking(
Emily Markovae68b7632023-12-30 14:17:55 -08001491 DriverRankingData{MatchNumber: 13, Rank1: "1235", Rank2: "1234", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001492 )
1493 check(t, err, "Failed to add Driver Ranking")
1494
1495 actual, err := fixture.db.QueryDriverRanking(12)
1496 check(t, err, "Failed to get Driver Ranking")
1497
1498 if !reflect.DeepEqual(expected, actual) {
1499 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1500 }
1501}
Philipp Schradera8955fb2023-03-05 15:47:19 -08001502
1503func TestParsedDriverRanking(t *testing.T) {
1504 fixture := createDatabase(t)
1505 defer fixture.TearDown()
1506
1507 expected := []ParsedDriverRankingData{
1508 {TeamNumber: "1234", Score: 100},
1509 {TeamNumber: "1235", Score: 110},
1510 {TeamNumber: "1236", Score: 90},
1511 }
1512
1513 for i := range expected {
1514 err := fixture.db.AddParsedDriverRanking(expected[i])
1515 check(t, err, "Failed to add Parsed Driver Ranking")
1516 }
1517
1518 actual, err := fixture.db.ReturnAllParsedDriverRankings()
1519 check(t, err, "Failed to get Parsed Driver Ranking")
1520 if !reflect.DeepEqual(expected, actual) {
1521 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1522 }
1523
1524 // Now update one of the rankings and make sure we get the properly
1525 // merged result.
1526 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1527 TeamNumber: "1235", Score: 200,
1528 })
1529 check(t, err, "Failed to add Parsed Driver Ranking")
1530
1531 expected = []ParsedDriverRankingData{
1532 {TeamNumber: "1234", Score: 100},
1533 {TeamNumber: "1236", Score: 90},
1534 {TeamNumber: "1235", Score: 200},
1535 }
1536
1537 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1538 check(t, err, "Failed to get Parsed Driver Ranking")
1539 if !reflect.DeepEqual(expected, actual) {
1540 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1541 }
1542}