blob: 09b6eb790eb66b11cb21ca262fbce9f48bb5eb3f [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
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700400func TestReturnRankingsDB(t *testing.T) {
401 fixture := createDatabase(t)
402 defer fixture.TearDown()
403
404 correct := []Ranking{
405 Ranking{
406 TeamNumber: 123,
407 Losses: 1, Wins: 7, Ties: 2,
408 Rank: 2, Dq: 0,
409 },
410 Ranking{
411 TeamNumber: 124,
412 Losses: 3, Wins: 4, Ties: 0,
413 Rank: 4, Dq: 2,
414 },
415 Ranking{
416 TeamNumber: 125,
417 Losses: 5, Wins: 2, Ties: 0,
418 Rank: 17, Dq: 0,
419 },
420 Ranking{
421 TeamNumber: 126,
422 Losses: 0, Wins: 7, Ties: 0,
423 Rank: 5, Dq: 0,
424 },
425 }
426
427 for i := 0; i < len(correct); i++ {
428 err := fixture.db.AddOrUpdateRankings(correct[i])
429 check(t, err, fmt.Sprint("Failed to add rankings", i))
430 }
431
432 got, err := fixture.db.ReturnRankings()
433 check(t, err, "Failed ReturnRankings()")
434
435 if !reflect.DeepEqual(correct, got) {
436 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
437 }
438}
439
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800440func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800441 fixture := createDatabase(t)
442 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800443
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800444 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800445 Stats{
446 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700447 StartingQuadrant: 1,
448 AutoBallPickedUp: [5]bool{false, false, false, false, false},
449 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800450 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700451 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800452 Stats{
453 TeamNumber: 1236, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700454 StartingQuadrant: 2,
455 AutoBallPickedUp: [5]bool{false, false, false, false, true},
456 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800457 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700458 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800459 },
460 Stats{
461 TeamNumber: 1237, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700462 StartingQuadrant: 3,
463 AutoBallPickedUp: [5]bool{false, false, false, false, false},
464 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800465 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700466 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800467 },
468 Stats{
469 TeamNumber: 1238, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700470 StartingQuadrant: 2,
471 AutoBallPickedUp: [5]bool{true, false, false, false, true},
472 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800473 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700474 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800475 },
476 Stats{
477 TeamNumber: 1239, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700478 StartingQuadrant: 3,
479 AutoBallPickedUp: [5]bool{false, false, true, false, false},
480 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800481 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700482 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800483 },
484 Stats{
485 TeamNumber: 1233, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700486 StartingQuadrant: 4,
487 AutoBallPickedUp: [5]bool{false, true, true, false, false},
488 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800489 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700490 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800491 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800492 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800493
Philipp Schrader7365d322022-03-06 16:40:08 -0800494 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800495 MatchNumber: 94, Round: 1, CompLevel: "quals",
496 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
497 check(t, err, "Failed to add match")
498
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800499 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800500 err = fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700501 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800502 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800503
Philipp Schrader7365d322022-03-06 16:40:08 -0800504 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800505 check(t, err, "Failed ReturnStats()")
506
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800507 if !reflect.DeepEqual(correct, got) {
508 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
509 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800510}
Alex Perry871eab92022-03-12 17:43:52 -0800511
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700512func TestRankingsDbUpdate(t *testing.T) {
513 fixture := createDatabase(t)
514 defer fixture.TearDown()
515
516 testDatabase := []Ranking{
517 Ranking{
518 TeamNumber: 123,
519 Losses: 1, Wins: 7, Ties: 2,
520 Rank: 2, Dq: 0,
521 },
522 Ranking{
523 TeamNumber: 124,
524 Losses: 3, Wins: 4, Ties: 0,
525 Rank: 4, Dq: 2,
526 },
527 Ranking{
528 TeamNumber: 125,
529 Losses: 5, Wins: 2, Ties: 0,
530 Rank: 17, Dq: 0,
531 },
532 Ranking{
533 TeamNumber: 126,
534 Losses: 0, Wins: 7, Ties: 0,
535 Rank: 5, Dq: 0,
536 },
537 Ranking{
538 TeamNumber: 125,
539 Losses: 2, Wins: 4, Ties: 1,
540 Rank: 5, Dq: 0,
541 },
542 }
543
544 for i := 0; i < len(testDatabase); i++ {
545 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
546 check(t, err, fmt.Sprint("Failed to add rankings ", i))
547 }
548
549 correct := []Ranking{
550 Ranking{
551 TeamNumber: 125,
552 Losses: 2, Wins: 4, Ties: 1,
553 Rank: 5, Dq: 0,
554 },
555 }
556
557 got, err := fixture.db.QueryRankings(125)
558 check(t, err, "Failed QueryRankings()")
559
560 if !reflect.DeepEqual(correct, got) {
561 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
562 }
563}
564
Alex Perry871eab92022-03-12 17:43:52 -0800565func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800566 fixture := createDatabase(t)
567 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800568
569 expected := NotesData{
570 TeamNumber: 1234,
571 Notes: []string{"Note 1", "Note 3"},
572 }
573
Philipp Schrader7365d322022-03-06 16:40:08 -0800574 err := fixture.db.AddNotes(NotesData{1234, []string{"Note 1"}})
Alex Perry871eab92022-03-12 17:43:52 -0800575 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800576 err = fixture.db.AddNotes(NotesData{1235, []string{"Note 2"}})
Alex Perry871eab92022-03-12 17:43:52 -0800577 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800578 err = fixture.db.AddNotes(NotesData{1234, []string{"Note 3"}})
Alex Perry871eab92022-03-12 17:43:52 -0800579 check(t, err, "Failed to add Note")
580
Philipp Schrader7365d322022-03-06 16:40:08 -0800581 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800582 check(t, err, "Failed to get Notes")
583
584 if !reflect.DeepEqual(expected, actual) {
585 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
586 }
587}