blob: 290f4517602199424a2be86d1b597a6ca294d00d [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"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080011)
12
Philipp Schrader83fc2722022-03-10 21:59:20 -080013// Shortcut for error checking. If the specified error is non-nil, print the
14// error message and exit the test.
15func check(t *testing.T, err error, message string) {
16 if err != nil {
17 t.Fatal(message, ":", err)
18 }
19}
20
Philipp Schrader7365d322022-03-06 16:40:08 -080021type dbFixture struct {
22 db *Database
23 server *exec.Cmd
24}
25
26func (fixture dbFixture) TearDown() {
27 fixture.db.Delete()
28 fixture.db.Close()
29 log.Println("Shutting down testdb")
30 fixture.server.Process.Signal(os.Interrupt)
31 fixture.server.Process.Wait()
32 log.Println("Successfully shut down testdb")
33}
34
35func createDatabase(t *testing.T) dbFixture {
36 var fixture dbFixture
37
38 log.Println("Starting up postgres.")
39 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
40 fixture.server.Stdout = os.Stdout
41 fixture.server.Stderr = os.Stderr
42 err := fixture.server.Start()
43 check(t, err, "Failed to run postgres")
44
45 // Wait until the server is ready. We cannot rely on the TCP socket
46 // alone because postgres creates the socket before it's actually ready
47 // to service requests.
48 for {
49 fixture.db, err = NewDatabase("test", "password", 5432)
50 if err == nil {
51 break
52 }
53 time.Sleep(50 * time.Millisecond)
54 }
55 log.Println("Connected to postgres.")
56
57 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080058}
59
60func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080061 fixture := createDatabase(t)
62 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080063
Philipp Schrader83fc2722022-03-10 21:59:20 -080064 correct := []Match{
65 Match{
66 MatchNumber: 7,
67 Round: 1,
68 CompLevel: "quals",
69 R1: 9999, R2: 1000, R3: 777, B1: 0000, B2: 4321, B3: 1234,
Philipp Schrader83fc2722022-03-10 21:59:20 -080070 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -080071 }
Philipp Schrader83fc2722022-03-10 21:59:20 -080072
Philipp Schrader7365d322022-03-06 16:40:08 -080073 err := fixture.db.AddToMatch(correct[0])
Philipp Schrader83fc2722022-03-10 21:59:20 -080074 check(t, err, "Failed to add match data")
75
Philipp Schrader7365d322022-03-06 16:40:08 -080076 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -080077 check(t, err, "Failed ReturnMatches()")
78
Sabina Leaverc5fd2772022-01-29 17:00:23 -080079 if !reflect.DeepEqual(correct, got) {
80 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
81 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -080082}
83
Yash Chainanibcd1bb32022-04-02 17:10:24 -070084func TestAddOrUpdateRankingsDB(t *testing.T) {
85 fixture := createDatabase(t)
86 defer fixture.TearDown()
87
88 correct := []Ranking{
89 Ranking{
90 TeamNumber: 123,
91 Losses: 1, Wins: 7, Ties: 0,
92 Rank: 2, Dq: 0,
93 },
94 Ranking{
95 TeamNumber: 125,
96 Losses: 2, Wins: 4, Ties: 0,
97 Rank: 2, Dq: 0,
98 },
99 }
100
101 for i := 0; i < len(correct); i++ {
102 err := fixture.db.AddOrUpdateRankings(correct[i])
103 check(t, err, "Failed to add ranking data")
104 }
105
106 got, err := fixture.db.ReturnRankings()
107 check(t, err, "Failed ReturnRankings()")
108
109 if !reflect.DeepEqual(correct, got) {
110 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
111 }
112}
113
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800114func TestAddToStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800115 fixture := createDatabase(t)
116 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800117
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800118 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800119 Stats{
120 TeamNumber: 1236, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700121 StartingQuadrant: 2,
122 AutoBallPickedUp: [5]bool{false, false, false, true, false},
123 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800124 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700125 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
126 Comment: "this is a comment", CollectedBy: "josh",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800127 },
128 Stats{
129 TeamNumber: 1001, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700130 StartingQuadrant: 3,
131 AutoBallPickedUp: [5]bool{true, false, true, true, false},
132 ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800133 ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700134 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
135 Comment: "another comment", CollectedBy: "rupert",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800136 },
137 Stats{
138 TeamNumber: 777, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700139 StartingQuadrant: 4,
140 AutoBallPickedUp: [5]bool{false, true, true, true, false},
141 ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800142 ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700143 PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
144 Comment: "and another", CollectedBy: "felix",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800145 },
146 Stats{
147 TeamNumber: 1000, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700148 StartingQuadrant: 1,
149 AutoBallPickedUp: [5]bool{false, false, false, false, false},
150 ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800151 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700152 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
153 Comment: "and another one", CollectedBy: "thea",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800154 },
155 Stats{
156 TeamNumber: 4321, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700157 StartingQuadrant: 2,
158 AutoBallPickedUp: [5]bool{true, false, false, false, false},
159 ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800160 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700161 PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
162 Comment: "more comment", CollectedBy: "amy",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800163 },
164 Stats{
165 TeamNumber: 1234, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700166 StartingQuadrant: 3,
167 AutoBallPickedUp: [5]bool{false, false, false, false, true},
168 ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800169 ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700170 PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
171 Comment: "final comment", CollectedBy: "beth",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800172 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800173 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800174
Philipp Schrader7365d322022-03-06 16:40:08 -0800175 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800176 MatchNumber: 7, Round: 1, CompLevel: "quals",
177 R1: 1236, R2: 1001, R3: 777, B1: 1000, B2: 4321, B3: 1234,
Philipp Schrader7365d322022-03-06 16:40:08 -0800178 })
Philipp Schrader83fc2722022-03-10 21:59:20 -0800179 check(t, err, "Failed to add match")
180
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800181 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800182 err = fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800183 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800184 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800185
Philipp Schrader7365d322022-03-06 16:40:08 -0800186 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800187 check(t, err, "Failed ReturnStats()")
188
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800189 if !reflect.DeepEqual(correct, got) {
190 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
191 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800192}
193
194func TestQueryMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800195 fixture := createDatabase(t)
196 defer fixture.TearDown()
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800197
198 testDatabase := []Match{
Philipp Schrader1e6c0a92022-02-27 23:30:57 -0800199 Match{MatchNumber: 2, Round: 1, CompLevel: "quals", R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149},
200 Match{MatchNumber: 4, Round: 1, CompLevel: "quals", R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698},
201 Match{MatchNumber: 3, Round: 1, CompLevel: "quals", R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262},
202 Match{MatchNumber: 6, Round: 1, CompLevel: "quals", R1: 191, R2: 132, R3: 773, B1: 994, B2: 435, B3: 696},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800203 }
204
205 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800206 err := fixture.db.AddToMatch(testDatabase[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800207 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800208 }
209
210 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800211 Match{
212 MatchNumber: 2, Round: 1, CompLevel: "quals",
213 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800214 },
215 Match{
216 MatchNumber: 3, Round: 1, CompLevel: "quals",
217 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800218 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800219 }
220
Philipp Schrader7365d322022-03-06 16:40:08 -0800221 got, err := fixture.db.QueryMatches(538)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800222 check(t, err, "Failed to query matches for 538")
223
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800224 if !reflect.DeepEqual(correct, got) {
225 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
226 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800227}
228
229func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800230 fixture := createDatabase(t)
231 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800232
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800233 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800234 Stats{
235 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700236 StartingQuadrant: 1,
237 AutoBallPickedUp: [5]bool{false, false, false, false, false},
238 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800239 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700240 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800241 Stats{
242 TeamNumber: 1234, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700243 StartingQuadrant: 2,
244 AutoBallPickedUp: [5]bool{false, false, false, false, true},
245 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800246 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700247 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800248 },
249 Stats{
250 TeamNumber: 1233, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700251 StartingQuadrant: 3,
252 AutoBallPickedUp: [5]bool{false, false, false, false, false},
253 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800254 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700255 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800256 },
257 Stats{
258 TeamNumber: 1232, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700259 StartingQuadrant: 2,
260 AutoBallPickedUp: [5]bool{true, false, false, false, true},
261 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800262 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700263 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800264 },
265 Stats{
266 TeamNumber: 1231, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700267 StartingQuadrant: 3,
268 AutoBallPickedUp: [5]bool{false, false, true, false, false},
269 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800270 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700271 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800272 },
273 Stats{
274 TeamNumber: 1239, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700275 StartingQuadrant: 4,
276 AutoBallPickedUp: [5]bool{false, true, true, false, false},
277 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800278 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700279 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800280 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800281 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800282
Philipp Schrader7365d322022-03-06 16:40:08 -0800283 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800284 MatchNumber: 94, Round: 1, CompLevel: "quals",
285 R1: 1235, R2: 1234, R3: 1233, B1: 1232, B2: 1231, B3: 1239})
286 check(t, err, "Failed to add match")
287
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800288 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800289 err = fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700290 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800291 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800292
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800293 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800294 Stats{
295 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700296 StartingQuadrant: 1,
297 AutoBallPickedUp: [5]bool{false, false, false, false, false},
298 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800299 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700300 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800301 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800302 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800303
Philipp Schrader7365d322022-03-06 16:40:08 -0800304 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800305 check(t, err, "Failed QueryStats()")
306
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800307 if !reflect.DeepEqual(correct, got) {
308 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
309 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800310}
311
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700312func TestQueryRankingsDB(t *testing.T) {
313 fixture := createDatabase(t)
314 defer fixture.TearDown()
315
316 testDatabase := []Ranking{
317 Ranking{
318 TeamNumber: 123,
319 Losses: 1, Wins: 7, Ties: 2,
320 Rank: 2, Dq: 0,
321 },
322 Ranking{
323 TeamNumber: 124,
324 Losses: 3, Wins: 4, Ties: 0,
325 Rank: 4, Dq: 2,
326 },
327 Ranking{
328 TeamNumber: 125,
329 Losses: 5, Wins: 2, Ties: 0,
330 Rank: 17, Dq: 0,
331 },
332 Ranking{
333 TeamNumber: 126,
334 Losses: 0, Wins: 7, Ties: 0,
335 Rank: 5, Dq: 0,
336 },
337 }
338
339 for i := 0; i < len(testDatabase); i++ {
340 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
341 check(t, err, fmt.Sprint("Failed to add rankings ", i))
342 }
343
344 correct := []Ranking{
345 Ranking{
346 TeamNumber: 126,
347 Losses: 0, Wins: 7, Ties: 0,
348 Rank: 5, Dq: 0,
349 },
350 }
351
352 got, err := fixture.db.QueryRankings(126)
353 check(t, err, "Failed QueryRankings()")
354
355 if !reflect.DeepEqual(correct, got) {
356 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
357 }
358}
359
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800360func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800361 fixture := createDatabase(t)
362 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800363
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800364 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800365 Match{
366 MatchNumber: 2, Round: 1, CompLevel: "quals",
367 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800368 },
369 Match{
370 MatchNumber: 3, Round: 1, CompLevel: "quals",
371 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800372 },
373 Match{
374 MatchNumber: 4, Round: 1, CompLevel: "quals",
375 R1: 251, R2: 169, R3: 286, B1: 653, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800376 },
377 Match{
378 MatchNumber: 5, Round: 1, CompLevel: "quals",
379 R1: 198, R2: 1421, R3: 538, B1: 26, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800380 },
381 Match{
382 MatchNumber: 6, Round: 1, CompLevel: "quals",
383 R1: 251, R2: 188, R3: 286, B1: 555, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800384 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800385 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800386
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800387 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800388 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800389 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800390 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800391
Philipp Schrader7365d322022-03-06 16:40:08 -0800392 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800393 check(t, err, "Failed ReturnMatches()")
394
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800395 if !reflect.DeepEqual(correct, got) {
396 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
397 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800398}
399
Philipp Schraderfe583842022-04-08 19:47:07 -0700400func TestOverwriteNewMatchData(t *testing.T) {
401 fixture := createDatabase(t)
402 defer fixture.TearDown()
403
404 testDatabase := []Match{
405 Match{
406 MatchNumber: 1, Round: 1, CompLevel: "quals",
407 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
408 },
409 Match{
410 MatchNumber: 2, Round: 1, CompLevel: "quals",
411 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
412 },
413 Match{
414 MatchNumber: 1, Round: 1, CompLevel: "quals",
415 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
416 },
417 }
418
419 for i := 0; i < len(testDatabase); i++ {
420 err := fixture.db.AddToMatch(testDatabase[i])
421 check(t, err, fmt.Sprint("Failed to add match", i))
422 }
423
424 correct := []Match{
425 Match{
426 MatchNumber: 2, Round: 1, CompLevel: "quals",
427 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
428 },
429 Match{
430 MatchNumber: 1, Round: 1, CompLevel: "quals",
431 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
432 },
433 }
434
435 got, err := fixture.db.ReturnMatches()
436 check(t, err, "Failed to get match list")
437
438 if !reflect.DeepEqual(correct, got) {
439 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
440 }
441}
442
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700443func TestReturnRankingsDB(t *testing.T) {
444 fixture := createDatabase(t)
445 defer fixture.TearDown()
446
447 correct := []Ranking{
448 Ranking{
449 TeamNumber: 123,
450 Losses: 1, Wins: 7, Ties: 2,
451 Rank: 2, Dq: 0,
452 },
453 Ranking{
454 TeamNumber: 124,
455 Losses: 3, Wins: 4, Ties: 0,
456 Rank: 4, Dq: 2,
457 },
458 Ranking{
459 TeamNumber: 125,
460 Losses: 5, Wins: 2, Ties: 0,
461 Rank: 17, Dq: 0,
462 },
463 Ranking{
464 TeamNumber: 126,
465 Losses: 0, Wins: 7, Ties: 0,
466 Rank: 5, Dq: 0,
467 },
468 }
469
470 for i := 0; i < len(correct); i++ {
471 err := fixture.db.AddOrUpdateRankings(correct[i])
472 check(t, err, fmt.Sprint("Failed to add rankings", i))
473 }
474
475 got, err := fixture.db.ReturnRankings()
476 check(t, err, "Failed ReturnRankings()")
477
478 if !reflect.DeepEqual(correct, got) {
479 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
480 }
481}
482
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800483func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800484 fixture := createDatabase(t)
485 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800486
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800487 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800488 Stats{
489 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700490 StartingQuadrant: 1,
491 AutoBallPickedUp: [5]bool{false, false, false, false, false},
492 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800493 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700494 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800495 Stats{
496 TeamNumber: 1236, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700497 StartingQuadrant: 2,
498 AutoBallPickedUp: [5]bool{false, false, false, false, true},
499 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800500 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700501 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800502 },
503 Stats{
504 TeamNumber: 1237, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700505 StartingQuadrant: 3,
506 AutoBallPickedUp: [5]bool{false, false, false, false, false},
507 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800508 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700509 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800510 },
511 Stats{
512 TeamNumber: 1238, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700513 StartingQuadrant: 2,
514 AutoBallPickedUp: [5]bool{true, false, false, false, true},
515 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800516 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700517 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800518 },
519 Stats{
520 TeamNumber: 1239, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700521 StartingQuadrant: 3,
522 AutoBallPickedUp: [5]bool{false, false, true, false, false},
523 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800524 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700525 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800526 },
527 Stats{
528 TeamNumber: 1233, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700529 StartingQuadrant: 4,
530 AutoBallPickedUp: [5]bool{false, true, true, false, false},
531 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800532 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700533 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800534 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800535 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800536
Philipp Schrader7365d322022-03-06 16:40:08 -0800537 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800538 MatchNumber: 94, Round: 1, CompLevel: "quals",
539 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
540 check(t, err, "Failed to add match")
541
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800542 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800543 err = fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700544 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800545 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800546
Philipp Schrader7365d322022-03-06 16:40:08 -0800547 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800548 check(t, err, "Failed ReturnStats()")
549
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800550 if !reflect.DeepEqual(correct, got) {
551 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
552 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800553}
Alex Perry871eab92022-03-12 17:43:52 -0800554
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700555func TestRankingsDbUpdate(t *testing.T) {
556 fixture := createDatabase(t)
557 defer fixture.TearDown()
558
559 testDatabase := []Ranking{
560 Ranking{
561 TeamNumber: 123,
562 Losses: 1, Wins: 7, Ties: 2,
563 Rank: 2, Dq: 0,
564 },
565 Ranking{
566 TeamNumber: 124,
567 Losses: 3, Wins: 4, Ties: 0,
568 Rank: 4, Dq: 2,
569 },
570 Ranking{
571 TeamNumber: 125,
572 Losses: 5, Wins: 2, Ties: 0,
573 Rank: 17, Dq: 0,
574 },
575 Ranking{
576 TeamNumber: 126,
577 Losses: 0, Wins: 7, Ties: 0,
578 Rank: 5, Dq: 0,
579 },
580 Ranking{
581 TeamNumber: 125,
582 Losses: 2, Wins: 4, Ties: 1,
583 Rank: 5, Dq: 0,
584 },
585 }
586
587 for i := 0; i < len(testDatabase); i++ {
588 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
589 check(t, err, fmt.Sprint("Failed to add rankings ", i))
590 }
591
592 correct := []Ranking{
593 Ranking{
594 TeamNumber: 125,
595 Losses: 2, Wins: 4, Ties: 1,
596 Rank: 5, Dq: 0,
597 },
598 }
599
600 got, err := fixture.db.QueryRankings(125)
601 check(t, err, "Failed QueryRankings()")
602
603 if !reflect.DeepEqual(correct, got) {
604 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
605 }
606}
607
Alex Perry871eab92022-03-12 17:43:52 -0800608func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800609 fixture := createDatabase(t)
610 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800611
612 expected := NotesData{
613 TeamNumber: 1234,
614 Notes: []string{"Note 1", "Note 3"},
615 }
616
Philipp Schrader7365d322022-03-06 16:40:08 -0800617 err := fixture.db.AddNotes(NotesData{1234, []string{"Note 1"}})
Alex Perry871eab92022-03-12 17:43:52 -0800618 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800619 err = fixture.db.AddNotes(NotesData{1235, []string{"Note 2"}})
Alex Perry871eab92022-03-12 17:43:52 -0800620 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800621 err = fixture.db.AddNotes(NotesData{1234, []string{"Note 3"}})
Alex Perry871eab92022-03-12 17:43:52 -0800622 check(t, err, "Failed to add Note")
623
Philipp Schrader7365d322022-03-06 16:40:08 -0800624 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800625 check(t, err, "Failed to get Notes")
626
627 if !reflect.DeepEqual(expected, actual) {
628 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
629 }
630}