blob: d49e64949dffcd26761ead4272670096cfc3aafd [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
Filip Kujawac1ded372023-05-27 14:33:43 -0700508func TestDeleteFromActions(t *testing.T) {
509 fixture := createDatabase(t)
510 defer fixture.TearDown()
511
512 startingActions := []Action{
513 Action{
514 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
515 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
516 },
517 Action{
518 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
519 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
520 },
521 Action{
522 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
523 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
524 },
525 Action{
526 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
527 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
528 },
529 Action{
530 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
531 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
532 },
533 Action{
534 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
535 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
536 },
537 }
538
539 correct := []Action{
540 Action{
541 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
542 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
543 },
544 Action{
545 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
546 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
547 },
548 Action{
549 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
550 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
551 },
552 Action{
553 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
554 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
555 },
556 Action{
557 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
558 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
559 },
560 }
561
562 for _, action := range startingActions {
563 err := fixture.db.AddAction(action)
564 check(t, err, "Failed to add stat")
565 }
566
567 err := fixture.db.DeleteFromActions("quals", 94, 1, "1239")
568
569 got, err := fixture.db.ReturnActions()
570 check(t, err, "Failed ReturnActions()")
571
572 if !reflect.DeepEqual(correct, got) {
573 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
574 }
575}
576
Milo Lina72e2002022-04-06 20:31:13 -0700577func TestQueryShiftDB(t *testing.T) {
578 fixture := createDatabase(t)
579 defer fixture.TearDown()
580
581 testDatabase := []Shift{
582 Shift{
583 MatchNumber: 1,
584 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
585 },
586 Shift{
587 MatchNumber: 2,
588 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
589 },
590 }
591
592 for i := 0; i < len(testDatabase); i++ {
593 err := fixture.db.AddToShift(testDatabase[i])
594 check(t, err, fmt.Sprint("Failed to add shift", i))
595 }
596
597 correct := []Shift{
598 Shift{
599 MatchNumber: 1,
600 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
601 },
602 }
603
604 got, err := fixture.db.QueryAllShifts(1)
605 check(t, err, "Failed to query shift for match 1")
606
607 if !reflect.DeepEqual(correct, got) {
608 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
609 }
610}
611
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700612func TestQueryRankingsDB(t *testing.T) {
613 fixture := createDatabase(t)
614 defer fixture.TearDown()
615
616 testDatabase := []Ranking{
617 Ranking{
618 TeamNumber: 123,
619 Losses: 1, Wins: 7, Ties: 2,
620 Rank: 2, Dq: 0,
621 },
622 Ranking{
623 TeamNumber: 124,
624 Losses: 3, Wins: 4, Ties: 0,
625 Rank: 4, Dq: 2,
626 },
627 Ranking{
628 TeamNumber: 125,
629 Losses: 5, Wins: 2, Ties: 0,
630 Rank: 17, Dq: 0,
631 },
632 Ranking{
633 TeamNumber: 126,
634 Losses: 0, Wins: 7, Ties: 0,
635 Rank: 5, Dq: 0,
636 },
637 }
638
639 for i := 0; i < len(testDatabase); i++ {
640 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
641 check(t, err, fmt.Sprint("Failed to add rankings ", i))
642 }
643
644 correct := []Ranking{
645 Ranking{
646 TeamNumber: 126,
647 Losses: 0, Wins: 7, Ties: 0,
648 Rank: 5, Dq: 0,
649 },
650 }
651
652 got, err := fixture.db.QueryRankings(126)
653 check(t, err, "Failed QueryRankings()")
654
655 if !reflect.DeepEqual(correct, got) {
656 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
657 }
658}
659
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800660func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800661 fixture := createDatabase(t)
662 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800663
Emily Markovabf24c9e2023-02-08 20:31:11 -0800664 correct := []TeamMatch{
665 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700666 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: "6835"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800667 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700668 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "4834"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800669 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700670 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "9824"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800671 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700672 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800673 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700674 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800675 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800676
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800677 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800678 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800679 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800680 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800681
Philipp Schrader7365d322022-03-06 16:40:08 -0800682 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800683 check(t, err, "Failed ReturnMatches()")
684
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800685 if !reflect.DeepEqual(correct, got) {
686 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
687 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800688}
689
Philipp Schraderfe583842022-04-08 19:47:07 -0700690func TestOverwriteNewMatchData(t *testing.T) {
691 fixture := createDatabase(t)
692 defer fixture.TearDown()
693
Emily Markovabf24c9e2023-02-08 20:31:11 -0800694 testDatabase := []TeamMatch{
695 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700696 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "4464"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800697 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700698 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800699 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700700 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700701 }
702
703 for i := 0; i < len(testDatabase); i++ {
704 err := fixture.db.AddToMatch(testDatabase[i])
705 check(t, err, fmt.Sprint("Failed to add match", i))
706 }
707
Emily Markovabf24c9e2023-02-08 20:31:11 -0800708 correct := []TeamMatch{
709 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700710 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800711 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700712 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700713 }
714
715 got, err := fixture.db.ReturnMatches()
716 check(t, err, "Failed to get match list")
717
718 if !reflect.DeepEqual(correct, got) {
719 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
720 }
721}
722
Milo Lina72e2002022-04-06 20:31:13 -0700723func TestAddReturnShiftDB(t *testing.T) {
724 fixture := createDatabase(t)
725 defer fixture.TearDown()
726
727 correct := []Shift{
728 Shift{
729 MatchNumber: 1,
730 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
731 },
732 Shift{
733 MatchNumber: 2,
734 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
735 },
736 }
737
738 for i := 0; i < len(correct); i++ {
739 err := fixture.db.AddToShift(correct[i])
740 check(t, err, fmt.Sprint("Failed to add shift", i))
741 }
742
743 got, err := fixture.db.ReturnAllShifts()
744 check(t, err, "Failed ReturnAllShifts()")
745
746 if !reflect.DeepEqual(correct, got) {
747 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
748 }
749}
750
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700751func TestReturnRankingsDB(t *testing.T) {
752 fixture := createDatabase(t)
753 defer fixture.TearDown()
754
755 correct := []Ranking{
756 Ranking{
757 TeamNumber: 123,
758 Losses: 1, Wins: 7, Ties: 2,
759 Rank: 2, Dq: 0,
760 },
761 Ranking{
762 TeamNumber: 124,
763 Losses: 3, Wins: 4, Ties: 0,
764 Rank: 4, Dq: 2,
765 },
766 Ranking{
767 TeamNumber: 125,
768 Losses: 5, Wins: 2, Ties: 0,
769 Rank: 17, Dq: 0,
770 },
771 Ranking{
772 TeamNumber: 126,
773 Losses: 0, Wins: 7, Ties: 0,
774 Rank: 5, Dq: 0,
775 },
776 }
777
778 for i := 0; i < len(correct); i++ {
779 err := fixture.db.AddOrUpdateRankings(correct[i])
780 check(t, err, fmt.Sprint("Failed to add rankings", i))
781 }
782
783 got, err := fixture.db.ReturnRankings()
784 check(t, err, "Failed ReturnRankings()")
785
786 if !reflect.DeepEqual(correct, got) {
787 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
788 }
789}
790
Emily Markova290147d2023-03-03 22:40:06 -0800791func TestReturnStats2023DB(t *testing.T) {
792 fixture := createDatabase(t)
793 defer fixture.TearDown()
794
795 correct := []Stats2023{
796 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700797 PreScouting: false,
798 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800799 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
800 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
801 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
802 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
803 HighCubes: 1, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700804 MiddleCones: 0, HighCones: 2, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700805 AvgCycle: 51, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700806 BalanceAttemptAuto: false, Docked: false, Engaged: false,
807 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800808 },
809 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700810 PreScouting: false,
811 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800812 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
813 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
814 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
815 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
816 HighCubes: 1, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700817 MiddleCones: 0, HighCones: 2, ConesDropped: 1, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700818 AvgCycle: 39, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700819 BalanceAttemptAuto: true, Docked: false, Engaged: false,
820 BalanceAttempt: false, CollectedBy: "jack",
Emily Markova290147d2023-03-03 22:40:06 -0800821 },
822 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700823 PreScouting: false,
824 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800825 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
826 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
827 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
828 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
829 HighCubes: 0, CubesDropped: 0, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700830 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700831 AvgCycle: 45, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700832 BalanceAttemptAuto: true, Docked: false, Engaged: false,
833 BalanceAttempt: true, CollectedBy: "martin",
Emily Markova290147d2023-03-03 22:40:06 -0800834 },
835 Stats2023{
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700836 PreScouting: false,
837 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
Emily Markova290147d2023-03-03 22:40:06 -0800838 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
839 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
840 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
841 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
842 HighCubes: 0, CubesDropped: 0, LowCones: 2,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700843 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700844 AvgCycle: 34, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700845 BalanceAttemptAuto: false, Docked: true, Engaged: false,
846 BalanceAttempt: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800847 },
848 }
849
850 matches := []TeamMatch{
851 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700852 Alliance: "R", AlliancePosition: 1, TeamNumber: "2343"},
Emily Markova290147d2023-03-03 22:40:06 -0800853 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700854 Alliance: "R", AlliancePosition: 2, TeamNumber: "5443"},
Emily Markova290147d2023-03-03 22:40:06 -0800855 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700856 Alliance: "R", AlliancePosition: 3, TeamNumber: "5436"},
Emily Markova290147d2023-03-03 22:40:06 -0800857 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700858 Alliance: "B", AlliancePosition: 1, TeamNumber: "5643"},
Emily Markova290147d2023-03-03 22:40:06 -0800859 }
860
861 for _, match := range matches {
862 err := fixture.db.AddToMatch(match)
863 check(t, err, "Failed to add match")
864 }
865
866 for i := 0; i < len(correct); i++ {
867 err := fixture.db.AddToStats2023(correct[i])
868 check(t, err, fmt.Sprint("Failed to add stats ", i))
869 }
870
871 got, err := fixture.db.ReturnStats2023()
872 check(t, err, "Failed ReturnStats()")
873
874 if !reflect.DeepEqual(correct, got) {
875 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
876 }
877}
878
Sabina Leaver759090b2023-01-14 20:42:56 -0800879func TestReturnActionsDB(t *testing.T) {
880 fixture := createDatabase(t)
881 defer fixture.TearDown()
882 correct := []Action{
883 Action{
884 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700885 CompletedAction: []byte(""), Timestamp: 0000, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800886 },
887 Action{
888 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700889 CompletedAction: []byte(""), Timestamp: 0321, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800890 },
891 Action{
892 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700893 CompletedAction: []byte(""), Timestamp: 0222, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800894 },
895 Action{
896 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700897 CompletedAction: []byte(""), Timestamp: 0110, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800898 },
899 Action{
900 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700901 CompletedAction: []byte(""), Timestamp: 0004, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800902 },
903 Action{
904 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader670a1c82023-05-17 19:42:43 -0700905 CompletedAction: []byte(""), Timestamp: 0005, CollectedBy: "",
Sabina Leaver759090b2023-01-14 20:42:56 -0800906 },
907 }
908
Emily Markovabf24c9e2023-02-08 20:31:11 -0800909 matches := []TeamMatch{
910 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700911 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800912 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700913 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800914 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700915 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800916 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700917 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800918 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700919 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800920 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700921 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800922 }
923
924 for _, match := range matches {
925 err := fixture.db.AddToMatch(match)
926 check(t, err, "Failed to add match")
927 }
Sabina Leaver759090b2023-01-14 20:42:56 -0800928
929 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800930 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -0800931 check(t, err, fmt.Sprint("Failed to add to actions ", i))
932 }
933
934 got, err := fixture.db.ReturnActions()
935 check(t, err, "Failed ReturnActions()")
936
937 if !reflect.DeepEqual(correct, got) {
938 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
939 }
940}
941
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700942func TestRankingsDbUpdate(t *testing.T) {
943 fixture := createDatabase(t)
944 defer fixture.TearDown()
945
946 testDatabase := []Ranking{
947 Ranking{
948 TeamNumber: 123,
949 Losses: 1, Wins: 7, Ties: 2,
950 Rank: 2, Dq: 0,
951 },
952 Ranking{
953 TeamNumber: 124,
954 Losses: 3, Wins: 4, Ties: 0,
955 Rank: 4, Dq: 2,
956 },
957 Ranking{
958 TeamNumber: 125,
959 Losses: 5, Wins: 2, Ties: 0,
960 Rank: 17, Dq: 0,
961 },
962 Ranking{
963 TeamNumber: 126,
964 Losses: 0, Wins: 7, Ties: 0,
965 Rank: 5, Dq: 0,
966 },
967 Ranking{
968 TeamNumber: 125,
969 Losses: 2, Wins: 4, Ties: 1,
970 Rank: 5, Dq: 0,
971 },
972 }
973
974 for i := 0; i < len(testDatabase); i++ {
975 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
976 check(t, err, fmt.Sprint("Failed to add rankings ", i))
977 }
978
979 correct := []Ranking{
980 Ranking{
981 TeamNumber: 125,
982 Losses: 2, Wins: 4, Ties: 1,
983 Rank: 5, Dq: 0,
984 },
985 }
986
987 got, err := fixture.db.QueryRankings(125)
988 check(t, err, "Failed QueryRankings()")
989
Philipp Schradereecb8962022-06-01 21:02:42 -0700990 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700991}
992
Alex Perry871eab92022-03-12 17:43:52 -0800993func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800994 fixture := createDatabase(t)
995 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800996
Philipp Schradereecb8962022-06-01 21:02:42 -0700997 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -0800998
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700999 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 -08001000 check(t, err, "Failed to add Note")
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001001 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 -08001002 check(t, err, "Failed to add Note")
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001003 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 -08001004 check(t, err, "Failed to add Note")
1005
Philipp Schrader7365d322022-03-06 16:40:08 -08001006 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -08001007 check(t, err, "Failed to get Notes")
1008
1009 if !reflect.DeepEqual(expected, actual) {
1010 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1011 }
1012}
Filip Kujawa210a03b2022-11-24 14:41:11 -08001013
1014func TestDriverRanking(t *testing.T) {
1015 fixture := createDatabase(t)
1016 defer fixture.TearDown()
1017
1018 expected := []DriverRankingData{
1019 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1020 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1021 }
1022
1023 err := fixture.db.AddDriverRanking(
1024 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1025 )
1026 check(t, err, "Failed to add Driver Ranking")
1027 err = fixture.db.AddDriverRanking(
1028 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1029 )
1030 check(t, err, "Failed to add Driver Ranking")
1031 err = fixture.db.AddDriverRanking(
1032 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
1033 )
1034 check(t, err, "Failed to add Driver Ranking")
1035
1036 actual, err := fixture.db.QueryDriverRanking(12)
1037 check(t, err, "Failed to get Driver Ranking")
1038
1039 if !reflect.DeepEqual(expected, actual) {
1040 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1041 }
1042}
Philipp Schradera8955fb2023-03-05 15:47:19 -08001043
1044func TestParsedDriverRanking(t *testing.T) {
1045 fixture := createDatabase(t)
1046 defer fixture.TearDown()
1047
1048 expected := []ParsedDriverRankingData{
1049 {TeamNumber: "1234", Score: 100},
1050 {TeamNumber: "1235", Score: 110},
1051 {TeamNumber: "1236", Score: 90},
1052 }
1053
1054 for i := range expected {
1055 err := fixture.db.AddParsedDriverRanking(expected[i])
1056 check(t, err, "Failed to add Parsed Driver Ranking")
1057 }
1058
1059 actual, err := fixture.db.ReturnAllParsedDriverRankings()
1060 check(t, err, "Failed to get Parsed Driver Ranking")
1061 if !reflect.DeepEqual(expected, actual) {
1062 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1063 }
1064
1065 // Now update one of the rankings and make sure we get the properly
1066 // merged result.
1067 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1068 TeamNumber: "1235", Score: 200,
1069 })
1070 check(t, err, "Failed to add Parsed Driver Ranking")
1071
1072 expected = []ParsedDriverRankingData{
1073 {TeamNumber: "1234", Score: 100},
1074 {TeamNumber: "1236", Score: 90},
1075 {TeamNumber: "1235", Score: 200},
1076 }
1077
1078 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1079 check(t, err, "Failed to get Parsed Driver Ranking")
1080 if !reflect.DeepEqual(expected, actual) {
1081 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1082 }
1083}