blob: 267cfb9a5eacf1ac9cf1c1e1020b317b37390aa8 [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"
Philipp Schraderf117fae2022-04-08 20:14:57 -07009 "strings"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080010 "testing"
Philipp Schrader7365d322022-03-06 16:40:08 -080011 "time"
Philipp Schradereecb8962022-06-01 21:02:42 -070012
13 "github.com/davecgh/go-spew/spew"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080014)
15
Philipp Schrader83fc2722022-03-10 21:59:20 -080016// Shortcut for error checking. If the specified error is non-nil, print the
17// error message and exit the test.
18func check(t *testing.T, err error, message string) {
19 if err != nil {
20 t.Fatal(message, ":", err)
21 }
22}
23
Philipp Schrader7365d322022-03-06 16:40:08 -080024type dbFixture struct {
25 db *Database
26 server *exec.Cmd
27}
28
29func (fixture dbFixture) TearDown() {
30 fixture.db.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -080031 log.Println("Shutting down testdb")
32 fixture.server.Process.Signal(os.Interrupt)
33 fixture.server.Process.Wait()
34 log.Println("Successfully shut down testdb")
35}
36
37func createDatabase(t *testing.T) dbFixture {
38 var fixture dbFixture
39
40 log.Println("Starting up postgres.")
41 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
42 fixture.server.Stdout = os.Stdout
43 fixture.server.Stderr = os.Stderr
44 err := fixture.server.Start()
45 check(t, err, "Failed to run postgres")
46
47 // Wait until the server is ready. We cannot rely on the TCP socket
48 // alone because postgres creates the socket before it's actually ready
49 // to service requests.
50 for {
51 fixture.db, err = NewDatabase("test", "password", 5432)
52 if err == nil {
53 break
54 }
55 time.Sleep(50 * time.Millisecond)
56 }
57 log.Println("Connected to postgres.")
58
Philipp Schradereecb8962022-06-01 21:02:42 -070059 fixture.db.SetDebugLogLevel()
60
Philipp Schrader7365d322022-03-06 16:40:08 -080061 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080062}
63
Philipp Schradereecb8962022-06-01 21:02:42 -070064func checkDeepEqual(t *testing.T, expected interface{}, actual interface{}) {
65 if !reflect.DeepEqual(expected, actual) {
66 t.Fatalf(spew.Sprintf("Got %#v,\nbut expected %#v.", actual, expected))
67 }
68}
69
Philipp Schrader4953cc32022-02-25 18:09:02 -080070func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080071 fixture := createDatabase(t)
72 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080073
Emily Markovabf24c9e2023-02-08 20:31:11 -080074 correct := []TeamMatch{
75 TeamMatch{
76 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070077 Alliance: "R", AlliancePosition: 1, TeamNumber: "9999",
Emily Markovabf24c9e2023-02-08 20:31:11 -080078 },
79 TeamMatch{
80 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070081 Alliance: "R", AlliancePosition: 2, TeamNumber: "1000",
Emily Markovabf24c9e2023-02-08 20:31:11 -080082 },
83 TeamMatch{
84 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070085 Alliance: "R", AlliancePosition: 3, TeamNumber: "777",
Emily Markovabf24c9e2023-02-08 20:31:11 -080086 },
87 TeamMatch{
88 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070089 Alliance: "B", AlliancePosition: 1, TeamNumber: "0000",
Emily Markovabf24c9e2023-02-08 20:31:11 -080090 },
91 TeamMatch{
92 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070093 Alliance: "B", AlliancePosition: 2, TeamNumber: "4321",
Emily Markovabf24c9e2023-02-08 20:31:11 -080094 },
95 TeamMatch{
96 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -070097 Alliance: "B", AlliancePosition: 3, TeamNumber: "1234",
Philipp Schrader83fc2722022-03-10 21:59:20 -080098 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -080099 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800100
Emily Markovabf24c9e2023-02-08 20:31:11 -0800101 for _, match := range correct {
102 err := fixture.db.AddToMatch(match)
103 check(t, err, "Failed to add match data")
104 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800105
Philipp Schrader7365d322022-03-06 16:40:08 -0800106 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800107 check(t, err, "Failed ReturnMatches()")
108
Philipp Schradereecb8962022-06-01 21:02:42 -0700109 checkDeepEqual(t, correct, got)
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800110}
111
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700112func TestAddOrUpdateRankingsDB(t *testing.T) {
113 fixture := createDatabase(t)
114 defer fixture.TearDown()
115
116 correct := []Ranking{
117 Ranking{
118 TeamNumber: 123,
119 Losses: 1, Wins: 7, Ties: 0,
120 Rank: 2, Dq: 0,
121 },
122 Ranking{
123 TeamNumber: 125,
124 Losses: 2, Wins: 4, Ties: 0,
125 Rank: 2, Dq: 0,
126 },
127 }
128
129 for i := 0; i < len(correct); i++ {
130 err := fixture.db.AddOrUpdateRankings(correct[i])
131 check(t, err, "Failed to add ranking data")
132 }
133
134 got, err := fixture.db.ReturnRankings()
135 check(t, err, "Failed ReturnRankings()")
136
137 if !reflect.DeepEqual(correct, got) {
138 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
139 }
140}
141
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800142func TestAddToStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800143 fixture := createDatabase(t)
144 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800145
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800146 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800147 Stats{
148 TeamNumber: 1236, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700149 StartingQuadrant: 2,
150 AutoBallPickedUp: [5]bool{false, false, false, true, false},
151 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800152 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700153 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
154 Comment: "this is a comment", CollectedBy: "josh",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800155 },
156 Stats{
157 TeamNumber: 1001, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700158 StartingQuadrant: 3,
159 AutoBallPickedUp: [5]bool{true, false, true, true, false},
160 ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800161 ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700162 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
163 Comment: "another comment", CollectedBy: "rupert",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800164 },
165 Stats{
166 TeamNumber: 777, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700167 StartingQuadrant: 4,
168 AutoBallPickedUp: [5]bool{false, true, true, true, false},
169 ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800170 ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700171 PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
172 Comment: "and another", CollectedBy: "felix",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800173 },
174 Stats{
175 TeamNumber: 1000, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700176 StartingQuadrant: 1,
177 AutoBallPickedUp: [5]bool{false, false, false, false, false},
178 ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800179 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700180 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
181 Comment: "and another one", CollectedBy: "thea",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800182 },
183 Stats{
184 TeamNumber: 4321, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700185 StartingQuadrant: 2,
186 AutoBallPickedUp: [5]bool{true, false, false, false, false},
187 ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800188 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700189 PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
190 Comment: "more comment", CollectedBy: "amy",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800191 },
192 Stats{
193 TeamNumber: 1234, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700194 StartingQuadrant: 3,
195 AutoBallPickedUp: [5]bool{false, false, false, false, true},
196 ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800197 ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700198 PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
199 Comment: "final comment", CollectedBy: "beth",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800200 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800201 }
Emily Markovabf24c9e2023-02-08 20:31:11 -0800202 matches := []TeamMatch{
203 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700204 Alliance: "R", AlliancePosition: 1, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800205 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700206 Alliance: "R", AlliancePosition: 2, TeamNumber: "1001"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800207 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700208 Alliance: "R", AlliancePosition: 3, TeamNumber: "777"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800209 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700210 Alliance: "B", AlliancePosition: 1, TeamNumber: "1000"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800211 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700212 Alliance: "B", AlliancePosition: 2, TeamNumber: "4321"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800213 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700214 Alliance: "B", AlliancePosition: 3, TeamNumber: "1234"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800215 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800216
Emily Markovabf24c9e2023-02-08 20:31:11 -0800217 for _, match := range matches {
218 err := fixture.db.AddToMatch(match)
219 check(t, err, "Failed to add match")
220 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800221
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800222 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800223 err := fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800224 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800225 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800226
Philipp Schrader7365d322022-03-06 16:40:08 -0800227 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800228 check(t, err, "Failed ReturnStats()")
229
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800230 if !reflect.DeepEqual(correct, got) {
231 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
232 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800233}
234
Emily Markova290147d2023-03-03 22:40:06 -0800235func TestAddToStats2023DB(t *testing.T) {
236 fixture := createDatabase(t)
237 defer fixture.TearDown()
238
239 correct := []Stats2023{
240 Stats2023{
241 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
242 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
243 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
244 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
245 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
246 HighCubes: 1, CubesDropped: 0, LowCones: 0,
247 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700248 AvgCycle: 0, DockedAuto: true, EngagedAuto: false,
249 Docked: false, Engaged: false, CollectedBy: "emma",
Emily Markova290147d2023-03-03 22:40:06 -0800250 },
251 Stats2023{
252 TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
253 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
254 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
255 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
256 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
257 HighCubes: 0, CubesDropped: 1, LowCones: 0,
258 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700259 AvgCycle: 0, DockedAuto: false, EngagedAuto: false,
260 Docked: true, Engaged: true, CollectedBy: "tyler",
Emily Markova290147d2023-03-03 22:40:06 -0800261 },
262 Stats2023{
263 TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
264 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
265 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
266 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
267 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
268 HighCubes: 2, CubesDropped: 1, LowCones: 1,
269 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700270 AvgCycle: 0, DockedAuto: false, EngagedAuto: false,
271 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800272 },
273 Stats2023{
274 TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
275 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
276 MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
277 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
278 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 1,
279 HighCubes: 2, CubesDropped: 1, LowCones: 0,
280 MiddleCones: 1, HighCones: 0, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700281 AvgCycle: 0, DockedAuto: true, EngagedAuto: true,
282 Docked: false, Engaged: false, CollectedBy: "will",
Emily Markova290147d2023-03-03 22:40:06 -0800283 },
284 Stats2023{
285 TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
286 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
287 MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
288 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
289 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
290 HighCubes: 0, CubesDropped: 2, LowCones: 1,
291 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700292 AvgCycle: 0, DockedAuto: true, EngagedAuto: false,
293 Docked: true, Engaged: false, CollectedBy: "unkown",
Emily Markova290147d2023-03-03 22:40:06 -0800294 },
295 }
296
297 matches := []TeamMatch{
298 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700299 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Emily Markova290147d2023-03-03 22:40:06 -0800300 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700301 Alliance: "R", AlliancePosition: 2, TeamNumber: "7454"},
Emily Markova290147d2023-03-03 22:40:06 -0800302 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700303 Alliance: "R", AlliancePosition: 3, TeamNumber: "4354"},
Emily Markova290147d2023-03-03 22:40:06 -0800304 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700305 Alliance: "B", AlliancePosition: 1, TeamNumber: "6533"},
Emily Markova290147d2023-03-03 22:40:06 -0800306 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700307 Alliance: "B", AlliancePosition: 2, TeamNumber: "8354"},
Emily Markova290147d2023-03-03 22:40:06 -0800308 }
309
310 for _, match := range matches {
311 err := fixture.db.AddToMatch(match)
312 check(t, err, "Failed to add match")
313 }
314
315 for i := 0; i < len(correct); i++ {
316 err := fixture.db.AddToStats2023(correct[i])
317 check(t, err, "Failed to add 2023stats to DB")
318 }
319
320 got, err := fixture.db.ReturnStats2023()
321 check(t, err, "Failed ReturnStats2023()")
322
323 if !reflect.DeepEqual(correct, got) {
324 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
325 }
326}
327
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800328func TestQueryingStats2023ByTeam(t *testing.T) {
329 fixture := createDatabase(t)
330 defer fixture.TearDown()
331
332 stats := []Stats2023{
333 Stats2023{
334 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
335 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
336 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
337 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
338 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
339 HighCubes: 1, CubesDropped: 0, LowCones: 0,
340 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700341 AvgCycle: 0, DockedAuto: true, EngagedAuto: false,
342 Docked: false, Engaged: false, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800343 },
344 Stats2023{
345 TeamNumber: "7454", MatchNumber: 4, SetNumber: 1,
346 CompLevel: "qm", StartingQuadrant: 2, LowCubesAuto: 1,
347 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
348 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
349 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
350 HighCubes: 0, CubesDropped: 1, LowCones: 0,
351 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700352 AvgCycle: 0, DockedAuto: true, EngagedAuto: true,
353 Docked: false, Engaged: false, CollectedBy: "tyler",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800354 },
355 Stats2023{
356 TeamNumber: "6344", MatchNumber: 5, SetNumber: 1,
357 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
358 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
359 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
360 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
361 HighCubes: 1, CubesDropped: 0, LowCones: 0,
362 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700363 AvgCycle: 0, DockedAuto: true, EngagedAuto: false,
364 Docked: true, Engaged: false, CollectedBy: "emma",
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800365 },
366 }
367
368 matches := []TeamMatch{
369 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700370 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800371 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700372 Alliance: "R", AlliancePosition: 1, TeamNumber: "7454"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800373 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700374 Alliance: "R", AlliancePosition: 1, TeamNumber: "6344"},
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800375 }
376
377 for _, match := range matches {
378 err := fixture.db.AddToMatch(match)
379 check(t, err, "Failed to add match")
380 }
381
382 for i := range stats {
383 err := fixture.db.AddToStats2023(stats[i])
384 check(t, err, "Failed to add 2023stats to DB")
385 }
386
387 // Validate that requesting status for a single team gets us the
388 // expected data.
389 statsFor6344, err := fixture.db.ReturnStats2023ForTeam("6344", 3, 1, "qm")
390 check(t, err, "Failed ReturnStats2023()")
391
392 if !reflect.DeepEqual([]Stats2023{stats[0]}, statsFor6344) {
393 t.Errorf("Got %#v,\nbut expected %#v.", statsFor6344, stats[0])
394 }
395
396 // Validate that requesting team data for a non-existent match returns
397 // nothing.
398 statsForMissing, err := fixture.db.ReturnStats2023ForTeam("6344", 9, 1, "qm")
399 check(t, err, "Failed ReturnStats2023()")
400
401 if !reflect.DeepEqual([]Stats2023{}, statsForMissing) {
402 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2023{})
403 }
404}
405
Philipp Schraderf117fae2022-04-08 20:14:57 -0700406func TestAddDuplicateStats(t *testing.T) {
407 fixture := createDatabase(t)
408 defer fixture.TearDown()
409
410 stats := Stats{
411 TeamNumber: 1236, MatchNumber: 7,
Philipp Schradereecb8962022-06-01 21:02:42 -0700412 SetNumber: 1, CompLevel: "qual",
Philipp Schraderf117fae2022-04-08 20:14:57 -0700413 StartingQuadrant: 2,
414 AutoBallPickedUp: [5]bool{false, false, false, true, false},
415 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
416 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
417 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
418 Comment: "this is a comment", CollectedBy: "josh",
419 }
420
Emily Markovabf24c9e2023-02-08 20:31:11 -0800421 matches := []TeamMatch{
422 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700423 Alliance: "R", AlliancePosition: 1, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800424 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700425 Alliance: "R", AlliancePosition: 2, TeamNumber: "1001"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800426 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700427 Alliance: "R", AlliancePosition: 3, TeamNumber: "777"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800428 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700429 Alliance: "B", AlliancePosition: 1, TeamNumber: "1000"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800430 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700431 Alliance: "B", AlliancePosition: 2, TeamNumber: "4321"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800432 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700433 Alliance: "B", AlliancePosition: 3, TeamNumber: "1234"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800434 }
435
436 for _, match := range matches {
437 err := fixture.db.AddToMatch(match)
438 check(t, err, "Failed to add match")
439 }
Philipp Schraderf117fae2022-04-08 20:14:57 -0700440
441 // Add stats. This should succeed.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800442 err := fixture.db.AddToStats(stats)
Philipp Schraderf117fae2022-04-08 20:14:57 -0700443 check(t, err, "Failed to add stats to DB")
444
445 // Try again. It should fail this time.
446 err = fixture.db.AddToStats(stats)
447 if err == nil {
448 t.Fatal("Failed to get error when adding duplicate stats.")
449 }
450 if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
451 t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
452 }
453}
454
Emily Markova6b551e02023-02-18 17:37:40 -0800455func TestDeleteFromStats(t *testing.T) {
456 fixture := createDatabase(t)
457 defer fixture.TearDown()
458
459 startingStats := []Stats2023{
460 Stats2023{
461 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
462 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
463 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
464 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
465 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
466 HighCubes: 2, CubesDropped: 1, LowCones: 1,
467 MiddleCones: 0, HighCones: 1, ConesDropped: 2,
Emily Markova46a69bf2023-03-22 20:45:52 -0700468 AvgCycle: 58, DockedAuto: false, EngagedAuto: false,
469 Docked: true, Engaged: true, CollectedBy: "unknown",
Emily Markova6b551e02023-02-18 17:37:40 -0800470 },
471 Stats2023{
472 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
473 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
474 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
475 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
476 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
477 HighCubes: 1, CubesDropped: 0, LowCones: 0,
478 MiddleCones: 2, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700479 AvgCycle: 34, DockedAuto: true, EngagedAuto: true,
480 Docked: true, Engaged: false, CollectedBy: "simon",
Emily Markova6b551e02023-02-18 17:37:40 -0800481 },
482 Stats2023{
483 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
484 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
485 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
486 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
487 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
488 HighCubes: 0, CubesDropped: 0, LowCones: 2,
489 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700490 AvgCycle: 50, DockedAuto: false, EngagedAuto: false,
491 Docked: false, Engaged: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800492 },
493 Stats2023{
494 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
495 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
496 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
497 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
498 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
499 HighCubes: 2, CubesDropped: 1, LowCones: 0,
500 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700501 AvgCycle: 49, DockedAuto: true, EngagedAuto: false,
502 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova6b551e02023-02-18 17:37:40 -0800503 },
504 Stats2023{
505 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
506 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
507 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
508 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
509 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
510 HighCubes: 0, CubesDropped: 0, LowCones: 1,
511 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700512 AvgCycle: 70, DockedAuto: true, EngagedAuto: true,
513 Docked: false, Engaged: false, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800514 },
515 }
516
517 correct := []Stats2023{
518 Stats2023{
519 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
520 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
521 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
522 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
523 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
524 HighCubes: 0, CubesDropped: 0, LowCones: 2,
525 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700526 AvgCycle: 50, DockedAuto: false, EngagedAuto: false,
527 Docked: false, Engaged: false, CollectedBy: "eliza",
Emily Markova6b551e02023-02-18 17:37:40 -0800528 },
529 Stats2023{
530 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
531 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
532 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
533 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
534 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
535 HighCubes: 0, CubesDropped: 0, LowCones: 1,
536 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700537 AvgCycle: 70, DockedAuto: true, EngagedAuto: true,
538 Docked: false, Engaged: false, CollectedBy: "sam",
Emily Markova6b551e02023-02-18 17:37:40 -0800539 },
540 }
541
542 originalMatches := []TeamMatch{
543 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700544 Alliance: "R", AlliancePosition: 1, TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800545 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700546 Alliance: "B", AlliancePosition: 1, TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800547 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700548 Alliance: "R", AlliancePosition: 3, TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800549 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700550 Alliance: "B", AlliancePosition: 2, TeamNumber: "2454"},
Emily Markova6b551e02023-02-18 17:37:40 -0800551 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700552 Alliance: "B", AlliancePosition: 3, TeamNumber: "3242"},
Emily Markova6b551e02023-02-18 17:37:40 -0800553 }
554
555 // Matches for which we want to delete the stats.
556 matches := []TeamMatch{
557 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700558 TeamNumber: "1111"},
Emily Markova6b551e02023-02-18 17:37:40 -0800559 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700560 TeamNumber: "2314"},
Emily Markova6b551e02023-02-18 17:37:40 -0800561 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700562 TeamNumber: "1742"},
Emily Markova6b551e02023-02-18 17:37:40 -0800563 }
564
565 for _, match := range originalMatches {
566 err := fixture.db.AddToMatch(match)
567 check(t, err, "Failed to add match")
568 fmt.Println("Match has been added : ", match.TeamNumber)
569 }
570
571 for _, stat := range startingStats {
572 err := fixture.db.AddToStats2023(stat)
573 check(t, err, "Failed to add stat")
574 }
575
576 for _, match := range matches {
Emily Markovab8551572023-03-22 19:49:39 -0700577 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, match.TeamNumber)
Emily Markova6b551e02023-02-18 17:37:40 -0800578 check(t, err, "Failed to delete stat")
579 }
580
581 got, err := fixture.db.ReturnStats2023()
582 check(t, err, "Failed ReturnStats()")
583
584 if !reflect.DeepEqual(correct, got) {
585 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
586 }
587}
588
Milo Lina72e2002022-04-06 20:31:13 -0700589func TestQueryShiftDB(t *testing.T) {
590 fixture := createDatabase(t)
591 defer fixture.TearDown()
592
593 testDatabase := []Shift{
594 Shift{
595 MatchNumber: 1,
596 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
597 },
598 Shift{
599 MatchNumber: 2,
600 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
601 },
602 }
603
604 for i := 0; i < len(testDatabase); i++ {
605 err := fixture.db.AddToShift(testDatabase[i])
606 check(t, err, fmt.Sprint("Failed to add shift", i))
607 }
608
609 correct := []Shift{
610 Shift{
611 MatchNumber: 1,
612 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
613 },
614 }
615
616 got, err := fixture.db.QueryAllShifts(1)
617 check(t, err, "Failed to query shift for match 1")
618
619 if !reflect.DeepEqual(correct, got) {
620 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
621 }
622}
623
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800624func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800625 fixture := createDatabase(t)
626 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800627
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800628 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800629 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700630 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700631 StartingQuadrant: 1,
632 AutoBallPickedUp: [5]bool{false, false, false, false, false},
633 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800634 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700635 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800636 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700637 TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700638 StartingQuadrant: 2,
639 AutoBallPickedUp: [5]bool{false, false, false, false, true},
640 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800641 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700642 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800643 },
644 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700645 TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700646 StartingQuadrant: 3,
647 AutoBallPickedUp: [5]bool{false, false, false, false, false},
648 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800649 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700650 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800651 },
652 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700653 TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700654 StartingQuadrant: 2,
655 AutoBallPickedUp: [5]bool{true, false, false, false, true},
656 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800657 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700658 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800659 },
660 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700661 TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700662 StartingQuadrant: 3,
663 AutoBallPickedUp: [5]bool{false, false, true, false, false},
664 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800665 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700666 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800667 },
668 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700669 TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700670 StartingQuadrant: 4,
671 AutoBallPickedUp: [5]bool{false, true, true, false, false},
672 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800673 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700674 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800675 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800676 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800677
Emily Markovabf24c9e2023-02-08 20:31:11 -0800678 matches := []TeamMatch{
679 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700680 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800681 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700682 Alliance: "R", AlliancePosition: 2, TeamNumber: "1234"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800683 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700684 Alliance: "R", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800685 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700686 Alliance: "B", AlliancePosition: 1, TeamNumber: "1232"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800687 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700688 Alliance: "B", AlliancePosition: 2, TeamNumber: "1231"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800689 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700690 Alliance: "B", AlliancePosition: 3, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800691 }
692
693 for _, match := range matches {
694 err := fixture.db.AddToMatch(match)
695 check(t, err, "Failed to add match")
696 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800697
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800698 for i := 0; i < len(testDatabase); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800699 err := fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700700 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800701 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800702
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800703 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800704 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700705 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700706 StartingQuadrant: 1,
707 AutoBallPickedUp: [5]bool{false, false, false, false, false},
708 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800709 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700710 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800711 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800712 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800713
Philipp Schrader7365d322022-03-06 16:40:08 -0800714 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800715 check(t, err, "Failed QueryStats()")
716
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800717 if !reflect.DeepEqual(correct, got) {
718 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
719 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800720}
721
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700722func TestQueryRankingsDB(t *testing.T) {
723 fixture := createDatabase(t)
724 defer fixture.TearDown()
725
726 testDatabase := []Ranking{
727 Ranking{
728 TeamNumber: 123,
729 Losses: 1, Wins: 7, Ties: 2,
730 Rank: 2, Dq: 0,
731 },
732 Ranking{
733 TeamNumber: 124,
734 Losses: 3, Wins: 4, Ties: 0,
735 Rank: 4, Dq: 2,
736 },
737 Ranking{
738 TeamNumber: 125,
739 Losses: 5, Wins: 2, Ties: 0,
740 Rank: 17, Dq: 0,
741 },
742 Ranking{
743 TeamNumber: 126,
744 Losses: 0, Wins: 7, Ties: 0,
745 Rank: 5, Dq: 0,
746 },
747 }
748
749 for i := 0; i < len(testDatabase); i++ {
750 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
751 check(t, err, fmt.Sprint("Failed to add rankings ", i))
752 }
753
754 correct := []Ranking{
755 Ranking{
756 TeamNumber: 126,
757 Losses: 0, Wins: 7, Ties: 0,
758 Rank: 5, Dq: 0,
759 },
760 }
761
762 got, err := fixture.db.QueryRankings(126)
763 check(t, err, "Failed QueryRankings()")
764
765 if !reflect.DeepEqual(correct, got) {
766 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
767 }
768}
769
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800770func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800771 fixture := createDatabase(t)
772 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800773
Emily Markovabf24c9e2023-02-08 20:31:11 -0800774 correct := []TeamMatch{
775 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700776 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: "6835"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800777 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700778 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "4834"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800779 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700780 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "9824"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800781 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700782 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800783 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700784 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: "3732"},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800785 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800786
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800787 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800788 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800789 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800790 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800791
Philipp Schrader7365d322022-03-06 16:40:08 -0800792 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800793 check(t, err, "Failed ReturnMatches()")
794
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800795 if !reflect.DeepEqual(correct, got) {
796 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
797 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800798}
799
Philipp Schraderfe583842022-04-08 19:47:07 -0700800func TestOverwriteNewMatchData(t *testing.T) {
801 fixture := createDatabase(t)
802 defer fixture.TearDown()
803
Emily Markovabf24c9e2023-02-08 20:31:11 -0800804 testDatabase := []TeamMatch{
805 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700806 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "4464"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800807 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700808 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800809 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700810 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700811 }
812
813 for i := 0; i < len(testDatabase); i++ {
814 err := fixture.db.AddToMatch(testDatabase[i])
815 check(t, err, fmt.Sprint("Failed to add match", i))
816 }
817
Emily Markovabf24c9e2023-02-08 20:31:11 -0800818 correct := []TeamMatch{
819 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700820 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: "2352"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800821 TeamMatch{
Emily Markovab8551572023-03-22 19:49:39 -0700822 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: "6321"},
Philipp Schraderfe583842022-04-08 19:47:07 -0700823 }
824
825 got, err := fixture.db.ReturnMatches()
826 check(t, err, "Failed to get match list")
827
828 if !reflect.DeepEqual(correct, got) {
829 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
830 }
831}
832
Milo Lina72e2002022-04-06 20:31:13 -0700833func TestAddReturnShiftDB(t *testing.T) {
834 fixture := createDatabase(t)
835 defer fixture.TearDown()
836
837 correct := []Shift{
838 Shift{
839 MatchNumber: 1,
840 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
841 },
842 Shift{
843 MatchNumber: 2,
844 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
845 },
846 }
847
848 for i := 0; i < len(correct); i++ {
849 err := fixture.db.AddToShift(correct[i])
850 check(t, err, fmt.Sprint("Failed to add shift", i))
851 }
852
853 got, err := fixture.db.ReturnAllShifts()
854 check(t, err, "Failed ReturnAllShifts()")
855
856 if !reflect.DeepEqual(correct, got) {
857 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
858 }
859}
860
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700861func TestReturnRankingsDB(t *testing.T) {
862 fixture := createDatabase(t)
863 defer fixture.TearDown()
864
865 correct := []Ranking{
866 Ranking{
867 TeamNumber: 123,
868 Losses: 1, Wins: 7, Ties: 2,
869 Rank: 2, Dq: 0,
870 },
871 Ranking{
872 TeamNumber: 124,
873 Losses: 3, Wins: 4, Ties: 0,
874 Rank: 4, Dq: 2,
875 },
876 Ranking{
877 TeamNumber: 125,
878 Losses: 5, Wins: 2, Ties: 0,
879 Rank: 17, Dq: 0,
880 },
881 Ranking{
882 TeamNumber: 126,
883 Losses: 0, Wins: 7, Ties: 0,
884 Rank: 5, Dq: 0,
885 },
886 }
887
888 for i := 0; i < len(correct); i++ {
889 err := fixture.db.AddOrUpdateRankings(correct[i])
890 check(t, err, fmt.Sprint("Failed to add rankings", i))
891 }
892
893 got, err := fixture.db.ReturnRankings()
894 check(t, err, "Failed ReturnRankings()")
895
896 if !reflect.DeepEqual(correct, got) {
897 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
898 }
899}
900
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800901func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800902 fixture := createDatabase(t)
903 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800904
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800905 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800906 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700907 TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700908 StartingQuadrant: 1,
909 AutoBallPickedUp: [5]bool{false, false, false, false, false},
910 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800911 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700912 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800913 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700914 TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700915 StartingQuadrant: 2,
916 AutoBallPickedUp: [5]bool{false, false, false, false, true},
917 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800918 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700919 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800920 },
921 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700922 TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700923 StartingQuadrant: 3,
924 AutoBallPickedUp: [5]bool{false, false, false, false, false},
925 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800926 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700927 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800928 },
929 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700930 TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700931 StartingQuadrant: 2,
932 AutoBallPickedUp: [5]bool{true, false, false, false, true},
933 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800934 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700935 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800936 },
937 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700938 TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700939 StartingQuadrant: 3,
940 AutoBallPickedUp: [5]bool{false, false, true, false, false},
941 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800942 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700943 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800944 },
945 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700946 TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700947 StartingQuadrant: 4,
948 AutoBallPickedUp: [5]bool{false, true, true, false, false},
949 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800950 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700951 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800952 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800953 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800954
Emily Markovabf24c9e2023-02-08 20:31:11 -0800955 matches := []TeamMatch{
956 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700957 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800958 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700959 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800960 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700961 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800962 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700963 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800964 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700965 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800966 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -0700967 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -0800968 }
969
970 for _, match := range matches {
971 err := fixture.db.AddToMatch(match)
972 check(t, err, "Failed to add match")
973 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800974
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800975 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800976 err := fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700977 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800978 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800979
Philipp Schrader7365d322022-03-06 16:40:08 -0800980 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800981 check(t, err, "Failed ReturnStats()")
982
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800983 if !reflect.DeepEqual(correct, got) {
984 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
985 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800986}
Alex Perry871eab92022-03-12 17:43:52 -0800987
Emily Markova290147d2023-03-03 22:40:06 -0800988func TestReturnStats2023DB(t *testing.T) {
989 fixture := createDatabase(t)
990 defer fixture.TearDown()
991
992 correct := []Stats2023{
993 Stats2023{
994 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
995 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
996 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
997 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
998 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
999 HighCubes: 1, CubesDropped: 0, LowCones: 2,
1000 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -07001001 AvgCycle: 51, DockedAuto: true, EngagedAuto: true,
1002 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -08001003 },
1004 Stats2023{
1005 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
1006 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
1007 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
1008 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
1009 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
1010 HighCubes: 1, CubesDropped: 0, LowCones: 1,
1011 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -07001012 AvgCycle: 39, DockedAuto: false, EngagedAuto: false,
1013 Docked: false, Engaged: false, CollectedBy: "jack",
Emily Markova290147d2023-03-03 22:40:06 -08001014 },
1015 Stats2023{
1016 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
1017 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
1018 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
1019 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1020 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1021 HighCubes: 0, CubesDropped: 0, LowCones: 1,
1022 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -07001023 AvgCycle: 45, DockedAuto: true, EngagedAuto: false,
1024 Docked: false, Engaged: false, CollectedBy: "martin",
Emily Markova290147d2023-03-03 22:40:06 -08001025 },
1026 Stats2023{
1027 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
1028 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
1029 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
1030 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1031 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1032 HighCubes: 0, CubesDropped: 0, LowCones: 2,
1033 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -07001034 AvgCycle: 34, DockedAuto: true, EngagedAuto: false,
1035 Docked: true, Engaged: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -08001036 },
1037 }
1038
1039 matches := []TeamMatch{
1040 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001041 Alliance: "R", AlliancePosition: 1, TeamNumber: "2343"},
Emily Markova290147d2023-03-03 22:40:06 -08001042 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001043 Alliance: "R", AlliancePosition: 2, TeamNumber: "5443"},
Emily Markova290147d2023-03-03 22:40:06 -08001044 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001045 Alliance: "R", AlliancePosition: 3, TeamNumber: "5436"},
Emily Markova290147d2023-03-03 22:40:06 -08001046 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001047 Alliance: "B", AlliancePosition: 1, TeamNumber: "5643"},
Emily Markova290147d2023-03-03 22:40:06 -08001048 }
1049
1050 for _, match := range matches {
1051 err := fixture.db.AddToMatch(match)
1052 check(t, err, "Failed to add match")
1053 }
1054
1055 for i := 0; i < len(correct); i++ {
1056 err := fixture.db.AddToStats2023(correct[i])
1057 check(t, err, fmt.Sprint("Failed to add stats ", i))
1058 }
1059
1060 got, err := fixture.db.ReturnStats2023()
1061 check(t, err, "Failed ReturnStats()")
1062
1063 if !reflect.DeepEqual(correct, got) {
1064 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1065 }
1066}
1067
Sabina Leaver759090b2023-01-14 20:42:56 -08001068func TestReturnActionsDB(t *testing.T) {
1069 fixture := createDatabase(t)
1070 defer fixture.TearDown()
1071 correct := []Action{
1072 Action{
1073 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1074 CompletedAction: []byte(""), TimeStamp: 0000, CollectedBy: "",
1075 },
1076 Action{
1077 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1078 CompletedAction: []byte(""), TimeStamp: 0321, CollectedBy: "",
1079 },
1080 Action{
1081 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1082 CompletedAction: []byte(""), TimeStamp: 0222, CollectedBy: "",
1083 },
1084 Action{
1085 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1086 CompletedAction: []byte(""), TimeStamp: 0110, CollectedBy: "",
1087 },
1088 Action{
1089 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1090 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
1091 },
1092 Action{
1093 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1094 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
1095 },
1096 }
1097
Emily Markovabf24c9e2023-02-08 20:31:11 -08001098 matches := []TeamMatch{
1099 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001100 Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001101 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001102 Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001103 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001104 Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001105 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001106 Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001107 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001108 Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001109 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Emily Markovab8551572023-03-22 19:49:39 -07001110 Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
Emily Markovabf24c9e2023-02-08 20:31:11 -08001111 }
1112
1113 for _, match := range matches {
1114 err := fixture.db.AddToMatch(match)
1115 check(t, err, "Failed to add match")
1116 }
Sabina Leaver759090b2023-01-14 20:42:56 -08001117
1118 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001119 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -08001120 check(t, err, fmt.Sprint("Failed to add to actions ", i))
1121 }
1122
1123 got, err := fixture.db.ReturnActions()
1124 check(t, err, "Failed ReturnActions()")
1125
1126 if !reflect.DeepEqual(correct, got) {
1127 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1128 }
1129}
1130
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001131func TestRankingsDbUpdate(t *testing.T) {
1132 fixture := createDatabase(t)
1133 defer fixture.TearDown()
1134
1135 testDatabase := []Ranking{
1136 Ranking{
1137 TeamNumber: 123,
1138 Losses: 1, Wins: 7, Ties: 2,
1139 Rank: 2, Dq: 0,
1140 },
1141 Ranking{
1142 TeamNumber: 124,
1143 Losses: 3, Wins: 4, Ties: 0,
1144 Rank: 4, Dq: 2,
1145 },
1146 Ranking{
1147 TeamNumber: 125,
1148 Losses: 5, Wins: 2, Ties: 0,
1149 Rank: 17, Dq: 0,
1150 },
1151 Ranking{
1152 TeamNumber: 126,
1153 Losses: 0, Wins: 7, Ties: 0,
1154 Rank: 5, Dq: 0,
1155 },
1156 Ranking{
1157 TeamNumber: 125,
1158 Losses: 2, Wins: 4, Ties: 1,
1159 Rank: 5, Dq: 0,
1160 },
1161 }
1162
1163 for i := 0; i < len(testDatabase); i++ {
1164 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
1165 check(t, err, fmt.Sprint("Failed to add rankings ", i))
1166 }
1167
1168 correct := []Ranking{
1169 Ranking{
1170 TeamNumber: 125,
1171 Losses: 2, Wins: 4, Ties: 1,
1172 Rank: 5, Dq: 0,
1173 },
1174 }
1175
1176 got, err := fixture.db.QueryRankings(125)
1177 check(t, err, "Failed QueryRankings()")
1178
Philipp Schradereecb8962022-06-01 21:02:42 -07001179 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001180}
1181
Alex Perry871eab92022-03-12 17:43:52 -08001182func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -08001183 fixture := createDatabase(t)
1184 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -08001185
Philipp Schradereecb8962022-06-01 21:02:42 -07001186 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -08001187
Filip Kujawa6f7f0b32023-03-30 13:26:08 -07001188 err := fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 1", GoodDriving: true, BadDriving: false, SolidPickup: false, SketchyPlacing: true, GoodDefense: false, BadDefense: true, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -08001189 check(t, err, "Failed to add Note")
Filip Kujawa6f7f0b32023-03-30 13:26:08 -07001190 err = fixture.db.AddNotes(NotesData{TeamNumber: 1235, Notes: "Note 2", GoodDriving: false, BadDriving: true, SolidPickup: false, SketchyPlacing: true, GoodDefense: false, BadDefense: false, EasilyDefended: false})
Alex Perry871eab92022-03-12 17:43:52 -08001191 check(t, err, "Failed to add Note")
Filip Kujawa6f7f0b32023-03-30 13:26:08 -07001192 err = fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 3", GoodDriving: true, BadDriving: false, SolidPickup: false, SketchyPlacing: true, GoodDefense: true, BadDefense: false, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -08001193 check(t, err, "Failed to add Note")
1194
Philipp Schrader7365d322022-03-06 16:40:08 -08001195 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -08001196 check(t, err, "Failed to get Notes")
1197
1198 if !reflect.DeepEqual(expected, actual) {
1199 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1200 }
1201}
Filip Kujawa210a03b2022-11-24 14:41:11 -08001202
1203func TestDriverRanking(t *testing.T) {
1204 fixture := createDatabase(t)
1205 defer fixture.TearDown()
1206
1207 expected := []DriverRankingData{
1208 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1209 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1210 }
1211
1212 err := fixture.db.AddDriverRanking(
1213 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1214 )
1215 check(t, err, "Failed to add Driver Ranking")
1216 err = fixture.db.AddDriverRanking(
1217 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1218 )
1219 check(t, err, "Failed to add Driver Ranking")
1220 err = fixture.db.AddDriverRanking(
1221 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
1222 )
1223 check(t, err, "Failed to add Driver Ranking")
1224
1225 actual, err := fixture.db.QueryDriverRanking(12)
1226 check(t, err, "Failed to get Driver Ranking")
1227
1228 if !reflect.DeepEqual(expected, actual) {
1229 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1230 }
1231}
Philipp Schradera8955fb2023-03-05 15:47:19 -08001232
1233func TestParsedDriverRanking(t *testing.T) {
1234 fixture := createDatabase(t)
1235 defer fixture.TearDown()
1236
1237 expected := []ParsedDriverRankingData{
1238 {TeamNumber: "1234", Score: 100},
1239 {TeamNumber: "1235", Score: 110},
1240 {TeamNumber: "1236", Score: 90},
1241 }
1242
1243 for i := range expected {
1244 err := fixture.db.AddParsedDriverRanking(expected[i])
1245 check(t, err, "Failed to add Parsed Driver Ranking")
1246 }
1247
1248 actual, err := fixture.db.ReturnAllParsedDriverRankings()
1249 check(t, err, "Failed to get Parsed Driver Ranking")
1250 if !reflect.DeepEqual(expected, actual) {
1251 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1252 }
1253
1254 // Now update one of the rankings and make sure we get the properly
1255 // merged result.
1256 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1257 TeamNumber: "1235", Score: 200,
1258 })
1259 check(t, err, "Failed to add Parsed Driver Ranking")
1260
1261 expected = []ParsedDriverRankingData{
1262 {TeamNumber: "1234", Score: 100},
1263 {TeamNumber: "1236", Score: 90},
1264 {TeamNumber: "1235", Score: 200},
1265 }
1266
1267 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1268 check(t, err, "Failed to get Parsed Driver Ranking")
1269 if !reflect.DeepEqual(expected, actual) {
1270 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1271 }
1272}