blob: 8a4c0bcb108634ab70bda81421206323b0377cf0 [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{
117 TeamNumber: 123,
118 Losses: 1, Wins: 7, Ties: 0,
119 Rank: 2, Dq: 0,
120 },
121 Ranking{
122 TeamNumber: 125,
123 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 Markova290147d2023-03-03 22:40:06 -0800141func TestAddToStats2023DB(t *testing.T) {
142 fixture := createDatabase(t)
143 defer fixture.TearDown()
144
145 correct := []Stats2023{
146 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700147 PreScouting: false,
148 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800149 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
150 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
151 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
152 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
153 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700154 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700155 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700156 BalanceAttemptAuto: false, Docked: false, Engaged: false,
157 BalanceAttempt: false, CollectedBy: "emma",
Emily Markova290147d2023-03-03 22:40:06 -0800158 },
159 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700160 PreScouting: false,
161 TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800162 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
163 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
164 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
165 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
166 HighCubes: 0, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700167 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700168 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700169 BalanceAttemptAuto: true, Docked: true, Engaged: true,
170 BalanceAttempt: false, CollectedBy: "tyler",
Emily Markova290147d2023-03-03 22:40:06 -0800171 },
172 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700173 PreScouting: false,
174 TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800175 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
176 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
177 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
178 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
179 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700180 MiddleCones: 1, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700181 AvgCycle: 0, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700182 BalanceAttemptAuto: false, Docked: false, Engaged: false,
183 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800184 },
185 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700186 PreScouting: false,
187 TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800188 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
189 MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
190 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
191 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 1,
192 HighCubes: 2, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700193 MiddleCones: 1, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700194 AvgCycle: 0, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700195 BalanceAttemptAuto: true, Docked: false, Engaged: false,
196 BalanceAttempt: true, CollectedBy: "will",
Emily Markova290147d2023-03-03 22:40:06 -0800197 },
198 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700199 PreScouting: false,
200 TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800201 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
202 MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
203 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
204 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
205 HighCubes: 0, CubesDropped: 2, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700206 MiddleCones: 1, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700207 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700208 BalanceAttemptAuto: false, Docked: true, Engaged: false,
209 BalanceAttempt: false, CollectedBy: "unkown",
Emily Markova290147d2023-03-03 22:40:06 -0800210 },
211 }
212
213 matches := []TeamMatch{
214 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700215 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Emily Markova290147d2023-03-03 22:40:06 -0800216 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700217 Alliance: "R", AlliancePosition: 2, TeamNumber: "7454"},
Emily Markova290147d2023-03-03 22:40:06 -0800218 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700219 Alliance: "R", AlliancePosition: 3, TeamNumber: "4354"},
Emily Markova290147d2023-03-03 22:40:06 -0800220 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700221 Alliance: "B", AlliancePosition: 1, TeamNumber: "6533"},
Emily Markova290147d2023-03-03 22:40:06 -0800222 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700223 Alliance: "B", AlliancePosition: 2, TeamNumber: "8354"},
Emily Markova290147d2023-03-03 22:40:06 -0800224 }
225
226 for _, match := range matches {
227 err := fixture.db.AddToMatch(match)
228 check(t, err, "Failed to add match")
229 }
230
231 for i := 0; i < len(correct); i++ {
232 err := fixture.db.AddToStats2023(correct[i])
233 check(t, err, "Failed to add 2023stats to DB")
234 }
235
236 got, err := fixture.db.ReturnStats2023()
237 check(t, err, "Failed ReturnStats2023()")
238
239 if !reflect.DeepEqual(correct, got) {
240 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
241 }
242}
243
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700244func TestInsertPreScoutedStats(t *testing.T) {
245 fixture := createDatabase(t)
246 defer fixture.TearDown()
247
248 stats := Stats2023{
249 PreScouting: false,
250 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
251 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
252 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
253 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
254 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
255 HighCubes: 1, CubesDropped: 0, LowCones: 0,
256 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
257 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
258 BalanceAttemptAuto: false, Docked: false, Engaged: false,
259 BalanceAttempt: false, CollectedBy: "emma",
260 }
261
262 // Attempt to insert the non-pre-scouted data and make sure it fails.
263 err := fixture.db.AddToStats2023(stats)
264 if err == nil {
265 t.Fatal("Expected error from inserting the stats.")
266 }
267 if err.Error() != "Failed to find team 6344 in match 3 in the schedule." {
268 t.Fatal("Got:", err.Error())
269 }
270
271 // Mark the data as pre-scouting data. It should now succeed.
272 stats.PreScouting = true
273 err = fixture.db.AddToStats2023(stats)
274 check(t, err, "Failed to add prescouted stats to DB")
275}
276
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800277func TestQueryingStats2023ByTeam(t *testing.T) {
278 fixture := createDatabase(t)
279 defer fixture.TearDown()
280
281 stats := []Stats2023{
282 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700283 PreScouting: false,
284 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800285 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
286 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
287 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
288 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
289 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700290 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700291 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700292 BalanceAttemptAuto: false, Docked: false, Engaged: false,
293 BalanceAttempt: false, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800294 },
295 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700296 PreScouting: false,
297 TeamNumber: "7454", MatchNumber: 4, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800298 CompLevel: "qm", StartingQuadrant: 2, LowCubesAuto: 1,
299 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
300 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
301 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
302 HighCubes: 0, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700303 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700304 AvgCycle: 0, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700305 BalanceAttemptAuto: true, Docked: false, Engaged: false,
306 BalanceAttempt: false, CollectedBy: "tyler",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800307 },
308 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700309 PreScouting: false,
310 TeamNumber: "6344", MatchNumber: 5, SetNumber: 1,
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800311 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
312 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
313 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
314 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
315 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700316 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700317 AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700318 BalanceAttemptAuto: false, Docked: true, Engaged: false,
319 BalanceAttempt: true, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800320 },
321 }
322
323 matches := []TeamMatch{
324 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700325 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800326 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700327 Alliance: "R", AlliancePosition: 1, TeamNumber: "7454"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800328 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700329 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800330 }
331
332 for _, match := range matches {
333 err := fixture.db.AddToMatch(match)
334 check(t, err, "Failed to add match")
335 }
336
337 for i := range stats {
338 err := fixture.db.AddToStats2023(stats[i])
339 check(t, err, "Failed to add 2023stats to DB")
340 }
341
342 // Validate that requesting status for a single team gets us the
343 // expected data.
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700344 statsFor6344, err := fixture.db.ReturnStats2023ForTeam("6344", 3, 1, "qm", false)
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800345 check(t, err, "Failed ReturnStats2023()")
346
347 if !reflect.DeepEqual([]Stats2023{stats[0]}, statsFor6344) {
348 t.Errorf("Got %#v,\nbut expected %#v.", statsFor6344, stats[0])
349 }
350
351 // Validate that requesting team data for a non-existent match returns
352 // nothing.
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700353 statsForMissing, err := fixture.db.ReturnStats2023ForTeam("6344", 9, 1, "qm", false)
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800354 check(t, err, "Failed ReturnStats2023()")
355
356 if !reflect.DeepEqual([]Stats2023{}, statsForMissing) {
357 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2023{})
358 }
359}
360
Emily Markova6b551e02023-02-18 17:37:40 -0800361func TestDeleteFromStats(t *testing.T) {
362 fixture := createDatabase(t)
363 defer fixture.TearDown()
364
365 startingStats := []Stats2023{
366 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700367 PreScouting: false,
368 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800369 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
370 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
371 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
372 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
373 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700374 MiddleCones: 0, HighCones: 1, ConesDropped: 2, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700375 AvgCycle: 58, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700376 BalanceAttemptAuto: true, Docked: true, Engaged: true,
377 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova6b551e02023-02-18 17:37:40 -0800378 },
379 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700380 PreScouting: false,
381 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800382 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
383 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
384 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
385 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
386 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700387 MiddleCones: 2, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700388 AvgCycle: 34, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700389 BalanceAttemptAuto: false, Docked: true, Engaged: false,
390 BalanceAttempt: false, CollectedBy: "simon",
Emily Markova6b551e02023-02-18 17:37:40 -0800391 },
392 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700393 PreScouting: false,
394 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800395 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
396 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
397 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
398 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
399 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700400 MiddleCones: 0, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700401 AvgCycle: 50, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700402 BalanceAttemptAuto: true, Docked: false, Engaged: false,
403 BalanceAttempt: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800404 },
405 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700406 PreScouting: false,
407 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800408 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
409 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
410 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
411 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
412 HighCubes: 2, CubesDropped: 1, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700413 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700414 AvgCycle: 49, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700415 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova6b551e02023-02-18 17:37:40 -0800416 },
417 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700418 PreScouting: false,
419 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800420 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
421 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
422 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
423 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
424 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700425 MiddleCones: 1, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700426 AvgCycle: 70, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700427 BalanceAttemptAuto: false, Docked: false, Engaged: false,
428 BalanceAttempt: true, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800429 },
430 }
431
432 correct := []Stats2023{
433 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700434 PreScouting: false,
435 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800436 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
437 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
438 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
439 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
440 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700441 MiddleCones: 0, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700442 AvgCycle: 50, Mobility: true, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700443 BalanceAttemptAuto: true, Docked: false, Engaged: false,
444 BalanceAttempt: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800445 },
446 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700447 PreScouting: false,
448 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
Emily Markova6b551e02023-02-18 17:37:40 -0800449 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
450 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
451 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
452 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
453 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700454 MiddleCones: 1, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700455 AvgCycle: 70, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700456 BalanceAttemptAuto: false, Docked: false, Engaged: false,
457 BalanceAttempt: true, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800458 },
459 }
460
461 originalMatches := []TeamMatch{
462 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700463 Alliance: "R", AlliancePosition: 1, TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800464 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700465 Alliance: "B", AlliancePosition: 1, TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800466 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700467 Alliance: "R", AlliancePosition: 3, TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800468 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700469 Alliance: "B", AlliancePosition: 2, TeamNumber: "2454"},
Emily Markova6b551e02023-02-18 17:37:40 -0800470 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700471 Alliance: "B", AlliancePosition: 3, TeamNumber: "3242"},
Emily Markova6b551e02023-02-18 17:37:40 -0800472 }
473
474 // Matches for which we want to delete the stats.
475 matches := []TeamMatch{
476 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700477 TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800478 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700479 TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800480 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700481 TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800482 }
483
484 for _, match := range originalMatches {
485 err := fixture.db.AddToMatch(match)
486 check(t, err, "Failed to add match")
487 fmt.Println("Match has been added : ", match.TeamNumber)
488 }
489
490 for _, stat := range startingStats {
491 err := fixture.db.AddToStats2023(stat)
492 check(t, err, "Failed to add stat")
493 }
494
495 for _, match := range matches {
Emily Markovab8551572023-03-22 19:49:39 -0700496 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
Emily Markova6b551e02023-02-18 17:37:40 -0800497 check(t, err, "Failed to delete stat")
498 }
499
500 got, err := fixture.db.ReturnStats2023()
501 check(t, err, "Failed ReturnStats()")
502
503 if !reflect.DeepEqual(correct, got) {
504 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
505 }
506}
507
Milo Lina72e2002022-04-06 20:31:13 -0700508func TestQueryShiftDB(t *testing.T) {
509 fixture := createDatabase(t)
510 defer fixture.TearDown()
511
512 testDatabase := []Shift{
513 Shift{
514 MatchNumber: 1,
515 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
516 },
517 Shift{
518 MatchNumber: 2,
519 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
520 },
521 }
522
523 for i := 0; i < len(testDatabase); i++ {
524 err := fixture.db.AddToShift(testDatabase[i])
525 check(t, err, fmt.Sprint("Failed to add shift", i))
526 }
527
528 correct := []Shift{
529 Shift{
530 MatchNumber: 1,
531 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
532 },
533 }
534
535 got, err := fixture.db.QueryAllShifts(1)
536 check(t, err, "Failed to query shift for match 1")
537
538 if !reflect.DeepEqual(correct, got) {
539 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
540 }
541}
542
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700543func TestQueryRankingsDB(t *testing.T) {
544 fixture := createDatabase(t)
545 defer fixture.TearDown()
546
547 testDatabase := []Ranking{
548 Ranking{
549 TeamNumber: 123,
550 Losses: 1, Wins: 7, Ties: 2,
551 Rank: 2, Dq: 0,
552 },
553 Ranking{
554 TeamNumber: 124,
555 Losses: 3, Wins: 4, Ties: 0,
556 Rank: 4, Dq: 2,
557 },
558 Ranking{
559 TeamNumber: 125,
560 Losses: 5, Wins: 2, Ties: 0,
561 Rank: 17, Dq: 0,
562 },
563 Ranking{
564 TeamNumber: 126,
565 Losses: 0, Wins: 7, Ties: 0,
566 Rank: 5, Dq: 0,
567 },
568 }
569
570 for i := 0; i < len(testDatabase); i++ {
571 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
572 check(t, err, fmt.Sprint("Failed to add rankings ", i))
573 }
574
575 correct := []Ranking{
576 Ranking{
577 TeamNumber: 126,
578 Losses: 0, Wins: 7, Ties: 0,
579 Rank: 5, Dq: 0,
580 },
581 }
582
583 got, err := fixture.db.QueryRankings(126)
584 check(t, err, "Failed QueryRankings()")
585
586 if !reflect.DeepEqual(correct, got) {
587 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
588 }
589}
590
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800591func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800592 fixture := createDatabase(t)
593 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800594
Emily Markovabf24c9e2023-02-08 20:31:11 -0800595 correct := []TeamMatch{
596 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700597 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: "6835"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800598 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700599 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "4834"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800600 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700601 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "9824"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800602 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700603 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800604 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700605 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800606 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800607
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800608 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800609 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800610 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800611 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800612
Philipp Schrader7365d322022-03-06 16:40:08 -0800613 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800614 check(t, err, "Failed ReturnMatches()")
615
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800616 if !reflect.DeepEqual(correct, got) {
617 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
618 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800619}
620
Philipp Schraderfe583842022-04-08 19:47:07 -0700621func TestOverwriteNewMatchData(t *testing.T) {
622 fixture := createDatabase(t)
623 defer fixture.TearDown()
624
Emily Markovabf24c9e2023-02-08 20:31:11 -0800625 testDatabase := []TeamMatch{
626 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700627 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "4464"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800628 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700629 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800630 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700631 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700632 }
633
634 for i := 0; i < len(testDatabase); i++ {
635 err := fixture.db.AddToMatch(testDatabase[i])
636 check(t, err, fmt.Sprint("Failed to add match", i))
637 }
638
Emily Markovabf24c9e2023-02-08 20:31:11 -0800639 correct := []TeamMatch{
640 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700641 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800642 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700643 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700644 }
645
646 got, err := fixture.db.ReturnMatches()
647 check(t, err, "Failed to get match list")
648
649 if !reflect.DeepEqual(correct, got) {
650 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
651 }
652}
653
Milo Lina72e2002022-04-06 20:31:13 -0700654func TestAddReturnShiftDB(t *testing.T) {
655 fixture := createDatabase(t)
656 defer fixture.TearDown()
657
658 correct := []Shift{
659 Shift{
660 MatchNumber: 1,
661 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
662 },
663 Shift{
664 MatchNumber: 2,
665 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
666 },
667 }
668
669 for i := 0; i < len(correct); i++ {
670 err := fixture.db.AddToShift(correct[i])
671 check(t, err, fmt.Sprint("Failed to add shift", i))
672 }
673
674 got, err := fixture.db.ReturnAllShifts()
675 check(t, err, "Failed ReturnAllShifts()")
676
677 if !reflect.DeepEqual(correct, got) {
678 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
679 }
680}
681
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700682func TestReturnRankingsDB(t *testing.T) {
683 fixture := createDatabase(t)
684 defer fixture.TearDown()
685
686 correct := []Ranking{
687 Ranking{
688 TeamNumber: 123,
689 Losses: 1, Wins: 7, Ties: 2,
690 Rank: 2, Dq: 0,
691 },
692 Ranking{
693 TeamNumber: 124,
694 Losses: 3, Wins: 4, Ties: 0,
695 Rank: 4, Dq: 2,
696 },
697 Ranking{
698 TeamNumber: 125,
699 Losses: 5, Wins: 2, Ties: 0,
700 Rank: 17, Dq: 0,
701 },
702 Ranking{
703 TeamNumber: 126,
704 Losses: 0, Wins: 7, Ties: 0,
705 Rank: 5, Dq: 0,
706 },
707 }
708
709 for i := 0; i < len(correct); i++ {
710 err := fixture.db.AddOrUpdateRankings(correct[i])
711 check(t, err, fmt.Sprint("Failed to add rankings", i))
712 }
713
714 got, err := fixture.db.ReturnRankings()
715 check(t, err, "Failed ReturnRankings()")
716
717 if !reflect.DeepEqual(correct, got) {
718 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
719 }
720}
721
Emily Markova290147d2023-03-03 22:40:06 -0800722func TestReturnStats2023DB(t *testing.T) {
723 fixture := createDatabase(t)
724 defer fixture.TearDown()
725
726 correct := []Stats2023{
727 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700728 PreScouting: false,
729 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800730 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
731 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
732 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
733 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
734 HighCubes: 1, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700735 MiddleCones: 0, HighCones: 2, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700736 AvgCycle: 51, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700737 BalanceAttemptAuto: false, Docked: false, Engaged: false,
738 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800739 },
740 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700741 PreScouting: false,
742 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800743 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
744 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
745 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
746 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
747 HighCubes: 1, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700748 MiddleCones: 0, HighCones: 2, ConesDropped: 1, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700749 AvgCycle: 39, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700750 BalanceAttemptAuto: true, Docked: false, Engaged: false,
751 BalanceAttempt: false, CollectedBy: "jack",
Emily Markova290147d2023-03-03 22:40:06 -0800752 },
753 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700754 PreScouting: false,
755 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800756 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
757 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
758 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
759 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
760 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700761 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700762 AvgCycle: 45, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700763 BalanceAttemptAuto: true, Docked: false, Engaged: false,
764 BalanceAttempt: true, CollectedBy: "martin",
Emily Markova290147d2023-03-03 22:40:06 -0800765 },
766 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700767 PreScouting: false,
768 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800769 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
770 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
771 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
772 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
773 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700774 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700775 AvgCycle: 34, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700776 BalanceAttemptAuto: false, Docked: true, Engaged: false,
777 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800778 },
779 }
780
781 matches := []TeamMatch{
782 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700783 Alliance: "R", AlliancePosition: 1, TeamNumber: "2343"},
Emily Markova290147d2023-03-03 22:40:06 -0800784 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700785 Alliance: "R", AlliancePosition: 2, TeamNumber: "5443"},
Emily Markova290147d2023-03-03 22:40:06 -0800786 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700787 Alliance: "R", AlliancePosition: 3, TeamNumber: "5436"},
Emily Markova290147d2023-03-03 22:40:06 -0800788 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700789 Alliance: "B", AlliancePosition: 1, TeamNumber: "5643"},
Emily Markova290147d2023-03-03 22:40:06 -0800790 }
791
792 for _, match := range matches {
793 err := fixture.db.AddToMatch(match)
794 check(t, err, "Failed to add match")
795 }
796
797 for i := 0; i < len(correct); i++ {
798 err := fixture.db.AddToStats2023(correct[i])
799 check(t, err, fmt.Sprint("Failed to add stats ", i))
800 }
801
802 got, err := fixture.db.ReturnStats2023()
803 check(t, err, "Failed ReturnStats()")
804
805 if !reflect.DeepEqual(correct, got) {
806 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
807 }
808}
809
Sabina Leaver759090b2023-01-14 20:42:56 -0800810func TestReturnActionsDB(t *testing.T) {
811 fixture := createDatabase(t)
812 defer fixture.TearDown()
813 correct := []Action{
814 Action{
815 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700816 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800817 },
818 Action{
819 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700820 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800821 },
822 Action{
823 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700824 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800825 },
826 Action{
827 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700828 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800829 },
830 Action{
831 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700832 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800833 },
834 Action{
835 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700836 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800837 },
838 }
839
Emily Markovabf24c9e2023-02-08 20:31:11 -0800840 matches := []TeamMatch{
841 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700842 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800843 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700844 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800845 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700846 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800847 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700848 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800849 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700850 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800851 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700852 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800853 }
854
855 for _, match := range matches {
856 err := fixture.db.AddToMatch(match)
857 check(t, err, "Failed to add match")
858 }
Sabina Leaver759090b2023-01-14 20:42:56 -0800859
860 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800861 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -0800862 check(t, err, fmt.Sprint("Failed to add to actions ", i))
863 }
864
865 got, err := fixture.db.ReturnActions()
866 check(t, err, "Failed ReturnActions()")
867
868 if !reflect.DeepEqual(correct, got) {
869 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
870 }
871}
872
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700873func TestRankingsDbUpdate(t *testing.T) {
874 fixture := createDatabase(t)
875 defer fixture.TearDown()
876
877 testDatabase := []Ranking{
878 Ranking{
879 TeamNumber: 123,
880 Losses: 1, Wins: 7, Ties: 2,
881 Rank: 2, Dq: 0,
882 },
883 Ranking{
884 TeamNumber: 124,
885 Losses: 3, Wins: 4, Ties: 0,
886 Rank: 4, Dq: 2,
887 },
888 Ranking{
889 TeamNumber: 125,
890 Losses: 5, Wins: 2, Ties: 0,
891 Rank: 17, Dq: 0,
892 },
893 Ranking{
894 TeamNumber: 126,
895 Losses: 0, Wins: 7, Ties: 0,
896 Rank: 5, Dq: 0,
897 },
898 Ranking{
899 TeamNumber: 125,
900 Losses: 2, Wins: 4, Ties: 1,
901 Rank: 5, Dq: 0,
902 },
903 }
904
905 for i := 0; i < len(testDatabase); i++ {
906 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
907 check(t, err, fmt.Sprint("Failed to add rankings ", i))
908 }
909
910 correct := []Ranking{
911 Ranking{
912 TeamNumber: 125,
913 Losses: 2, Wins: 4, Ties: 1,
914 Rank: 5, Dq: 0,
915 },
916 }
917
918 got, err := fixture.db.QueryRankings(125)
919 check(t, err, "Failed QueryRankings()")
920
Philipp Schradereecb8962022-06-01 21:02:42 -0700921 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700922}
923
Alex Perry871eab92022-03-12 17:43:52 -0800924func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800925 fixture := createDatabase(t)
926 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800927
Philipp Schradereecb8962022-06-01 21:02:42 -0700928 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -0800929
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700930 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 -0800931 check(t, err, "Failed to add Note")
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700932 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 -0800933 check(t, err, "Failed to add Note")
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700934 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 -0800935 check(t, err, "Failed to add Note")
936
Philipp Schrader7365d322022-03-06 16:40:08 -0800937 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800938 check(t, err, "Failed to get Notes")
939
940 if !reflect.DeepEqual(expected, actual) {
941 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
942 }
943}
Filip Kujawa210a03b2022-11-24 14:41:11 -0800944
945func TestDriverRanking(t *testing.T) {
946 fixture := createDatabase(t)
947 defer fixture.TearDown()
948
949 expected := []DriverRankingData{
950 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
951 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
952 }
953
954 err := fixture.db.AddDriverRanking(
955 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
956 )
957 check(t, err, "Failed to add Driver Ranking")
958 err = fixture.db.AddDriverRanking(
959 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
960 )
961 check(t, err, "Failed to add Driver Ranking")
962 err = fixture.db.AddDriverRanking(
963 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
964 )
965 check(t, err, "Failed to add Driver Ranking")
966
967 actual, err := fixture.db.QueryDriverRanking(12)
968 check(t, err, "Failed to get Driver Ranking")
969
970 if !reflect.DeepEqual(expected, actual) {
971 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
972 }
973}
Philipp Schradera8955fb2023-03-05 15:47:19 -0800974
975func TestParsedDriverRanking(t *testing.T) {
976 fixture := createDatabase(t)
977 defer fixture.TearDown()
978
979 expected := []ParsedDriverRankingData{
980 {TeamNumber: "1234", Score: 100},
981 {TeamNumber: "1235", Score: 110},
982 {TeamNumber: "1236", Score: 90},
983 }
984
985 for i := range expected {
986 err := fixture.db.AddParsedDriverRanking(expected[i])
987 check(t, err, "Failed to add Parsed Driver Ranking")
988 }
989
990 actual, err := fixture.db.ReturnAllParsedDriverRankings()
991 check(t, err, "Failed to get Parsed Driver Ranking")
992 if !reflect.DeepEqual(expected, actual) {
993 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
994 }
995
996 // Now update one of the rankings and make sure we get the properly
997 // merged result.
998 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
999 TeamNumber: "1235", Score: 200,
1000 })
1001 check(t, err, "Failed to add Parsed Driver Ranking")
1002
1003 expected = []ParsedDriverRankingData{
1004 {TeamNumber: "1234", Score: 100},
1005 {TeamNumber: "1236", Score: 90},
1006 {TeamNumber: "1235", Score: 200},
1007 }
1008
1009 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1010 check(t, err, "Failed to get Parsed Driver Ranking")
1011 if !reflect.DeepEqual(expected, actual) {
1012 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1013 }
1014}