blob: 02e8d5076e25cb33a8638084394d91eabe3a1995 [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,
70 r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6,
71 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -080072 }
Philipp Schrader83fc2722022-03-10 21:59:20 -080073
Philipp Schrader7365d322022-03-06 16:40:08 -080074 err := fixture.db.AddToMatch(correct[0])
Philipp Schrader83fc2722022-03-10 21:59:20 -080075 check(t, err, "Failed to add match data")
76
Philipp Schrader7365d322022-03-06 16:40:08 -080077 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -080078 check(t, err, "Failed ReturnMatches()")
79
Sabina Leaverc5fd2772022-01-29 17:00:23 -080080 if !reflect.DeepEqual(correct, got) {
81 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
82 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -080083}
84
85func TestAddToStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080086 fixture := createDatabase(t)
87 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080088
Sabina Leaverc5fd2772022-01-29 17:00:23 -080089 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -080090 Stats{
91 TeamNumber: 1236, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -070092 StartingQuadrant: 2,
93 AutoBallPickedUp: [5]bool{false, false, false, true, false},
94 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -080095 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
Philipp Schraderfa45d742022-03-18 19:29:05 -070096 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
97 Comment: "this is a comment", CollectedBy: "josh",
Philipp Schrader83fc2722022-03-10 21:59:20 -080098 },
99 Stats{
100 TeamNumber: 1001, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700101 StartingQuadrant: 3,
102 AutoBallPickedUp: [5]bool{true, false, true, true, false},
103 ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800104 ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700105 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
106 Comment: "another comment", CollectedBy: "rupert",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800107 },
108 Stats{
109 TeamNumber: 777, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700110 StartingQuadrant: 4,
111 AutoBallPickedUp: [5]bool{false, true, true, true, false},
112 ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800113 ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700114 PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
115 Comment: "and another", CollectedBy: "felix",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800116 },
117 Stats{
118 TeamNumber: 1000, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700119 StartingQuadrant: 1,
120 AutoBallPickedUp: [5]bool{false, false, false, false, false},
121 ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800122 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700123 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
124 Comment: "and another one", CollectedBy: "thea",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800125 },
126 Stats{
127 TeamNumber: 4321, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700128 StartingQuadrant: 2,
129 AutoBallPickedUp: [5]bool{true, false, false, false, false},
130 ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800131 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700132 PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
133 Comment: "more comment", CollectedBy: "amy",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800134 },
135 Stats{
136 TeamNumber: 1234, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700137 StartingQuadrant: 3,
138 AutoBallPickedUp: [5]bool{false, false, false, false, true},
139 ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800140 ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700141 PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
142 Comment: "final comment", CollectedBy: "beth",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800143 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800144 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800145
Philipp Schrader7365d322022-03-06 16:40:08 -0800146 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800147 MatchNumber: 7, Round: 1, CompLevel: "quals",
148 R1: 1236, R2: 1001, R3: 777, B1: 1000, B2: 4321, B3: 1234,
Philipp Schrader7365d322022-03-06 16:40:08 -0800149 r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6,
150 })
Philipp Schrader83fc2722022-03-10 21:59:20 -0800151 check(t, err, "Failed to add match")
152
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800153 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800154 err = fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800155 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800156 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800157
Philipp Schrader7365d322022-03-06 16:40:08 -0800158 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800159 check(t, err, "Failed ReturnStats()")
160
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800161 if !reflect.DeepEqual(correct, got) {
162 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
163 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800164}
165
166func TestQueryMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800167 fixture := createDatabase(t)
168 defer fixture.TearDown()
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800169
170 testDatabase := []Match{
Philipp Schrader1e6c0a92022-02-27 23:30:57 -0800171 Match{MatchNumber: 2, Round: 1, CompLevel: "quals", R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149},
172 Match{MatchNumber: 4, Round: 1, CompLevel: "quals", R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698},
173 Match{MatchNumber: 3, Round: 1, CompLevel: "quals", R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262},
174 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 -0800175 }
176
177 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800178 err := fixture.db.AddToMatch(testDatabase[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800179 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800180 }
181
182 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800183 Match{
184 MatchNumber: 2, Round: 1, CompLevel: "quals",
185 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
186 r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6,
187 },
188 Match{
189 MatchNumber: 3, Round: 1, CompLevel: "quals",
190 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
191 r1ID: 13, r2ID: 14, r3ID: 15, b1ID: 16, b2ID: 17, b3ID: 18,
192 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800193 }
194
Philipp Schrader7365d322022-03-06 16:40:08 -0800195 got, err := fixture.db.QueryMatches(538)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800196 check(t, err, "Failed to query matches for 538")
197
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800198 if !reflect.DeepEqual(correct, got) {
199 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
200 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800201}
202
203func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800204 fixture := createDatabase(t)
205 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800206
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800207 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800208 Stats{
209 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700210 StartingQuadrant: 1,
211 AutoBallPickedUp: [5]bool{false, false, false, false, false},
212 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800213 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700214 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800215 Stats{
216 TeamNumber: 1234, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700217 StartingQuadrant: 2,
218 AutoBallPickedUp: [5]bool{false, false, false, false, true},
219 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800220 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700221 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800222 },
223 Stats{
224 TeamNumber: 1233, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700225 StartingQuadrant: 3,
226 AutoBallPickedUp: [5]bool{false, false, false, false, false},
227 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800228 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700229 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800230 },
231 Stats{
232 TeamNumber: 1232, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700233 StartingQuadrant: 2,
234 AutoBallPickedUp: [5]bool{true, false, false, false, true},
235 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800236 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700237 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800238 },
239 Stats{
240 TeamNumber: 1231, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700241 StartingQuadrant: 3,
242 AutoBallPickedUp: [5]bool{false, false, true, false, false},
243 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800244 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700245 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800246 },
247 Stats{
248 TeamNumber: 1239, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700249 StartingQuadrant: 4,
250 AutoBallPickedUp: [5]bool{false, true, true, false, false},
251 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800252 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700253 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800254 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800255 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800256
Philipp Schrader7365d322022-03-06 16:40:08 -0800257 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800258 MatchNumber: 94, Round: 1, CompLevel: "quals",
259 R1: 1235, R2: 1234, R3: 1233, B1: 1232, B2: 1231, B3: 1239})
260 check(t, err, "Failed to add match")
261
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800262 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800263 err = fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700264 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800265 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800266
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800267 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800268 Stats{
269 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700270 StartingQuadrant: 1,
271 AutoBallPickedUp: [5]bool{false, false, false, false, false},
272 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800273 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700274 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800275 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800276 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800277
Philipp Schrader7365d322022-03-06 16:40:08 -0800278 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800279 check(t, err, "Failed QueryStats()")
280
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800281 if !reflect.DeepEqual(correct, got) {
282 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
283 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800284}
285
286func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800287 fixture := createDatabase(t)
288 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800289
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800290 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800291 Match{
292 MatchNumber: 2, Round: 1, CompLevel: "quals",
293 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
294 r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6,
295 },
296 Match{
297 MatchNumber: 3, Round: 1, CompLevel: "quals",
298 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
299 r1ID: 7, r2ID: 8, r3ID: 9, b1ID: 10, b2ID: 11, b3ID: 12,
300 },
301 Match{
302 MatchNumber: 4, Round: 1, CompLevel: "quals",
303 R1: 251, R2: 169, R3: 286, B1: 653, B2: 538, B3: 149,
304 r1ID: 13, r2ID: 14, r3ID: 15, b1ID: 16, b2ID: 17, b3ID: 18,
305 },
306 Match{
307 MatchNumber: 5, Round: 1, CompLevel: "quals",
308 R1: 198, R2: 1421, R3: 538, B1: 26, B2: 448, B3: 262,
309 r1ID: 19, r2ID: 20, r3ID: 21, b1ID: 22, b2ID: 23, b3ID: 24,
310 },
311 Match{
312 MatchNumber: 6, Round: 1, CompLevel: "quals",
313 R1: 251, R2: 188, R3: 286, B1: 555, B2: 538, B3: 149,
314 r1ID: 25, r2ID: 26, r3ID: 27, b1ID: 28, b2ID: 29, b3ID: 30,
315 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800316 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800317
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800318 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800319 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800320 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800321 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800322
Philipp Schrader7365d322022-03-06 16:40:08 -0800323 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800324 check(t, err, "Failed ReturnMatches()")
325
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800326 if !reflect.DeepEqual(correct, got) {
327 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
328 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800329}
330
331func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800332 fixture := createDatabase(t)
333 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800334
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800335 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800336 Stats{
337 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700338 StartingQuadrant: 1,
339 AutoBallPickedUp: [5]bool{false, false, false, false, false},
340 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800341 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700342 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800343 Stats{
344 TeamNumber: 1236, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700345 StartingQuadrant: 2,
346 AutoBallPickedUp: [5]bool{false, false, false, false, true},
347 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800348 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700349 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800350 },
351 Stats{
352 TeamNumber: 1237, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700353 StartingQuadrant: 3,
354 AutoBallPickedUp: [5]bool{false, false, false, false, false},
355 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800356 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700357 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800358 },
359 Stats{
360 TeamNumber: 1238, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700361 StartingQuadrant: 2,
362 AutoBallPickedUp: [5]bool{true, false, false, false, true},
363 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800364 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700365 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800366 },
367 Stats{
368 TeamNumber: 1239, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700369 StartingQuadrant: 3,
370 AutoBallPickedUp: [5]bool{false, false, true, false, false},
371 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800372 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700373 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800374 },
375 Stats{
376 TeamNumber: 1233, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700377 StartingQuadrant: 4,
378 AutoBallPickedUp: [5]bool{false, true, true, false, false},
379 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800380 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700381 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800382 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800383 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800384
Philipp Schrader7365d322022-03-06 16:40:08 -0800385 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800386 MatchNumber: 94, Round: 1, CompLevel: "quals",
387 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
388 check(t, err, "Failed to add match")
389
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800390 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800391 err = fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700392 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800393 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800394
Philipp Schrader7365d322022-03-06 16:40:08 -0800395 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800396 check(t, err, "Failed ReturnStats()")
397
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800398 if !reflect.DeepEqual(correct, got) {
399 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
400 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800401}
Alex Perry871eab92022-03-12 17:43:52 -0800402
403func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800404 fixture := createDatabase(t)
405 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800406
407 expected := NotesData{
408 TeamNumber: 1234,
409 Notes: []string{"Note 1", "Note 3"},
410 }
411
Philipp Schrader7365d322022-03-06 16:40:08 -0800412 err := fixture.db.AddNotes(NotesData{1234, []string{"Note 1"}})
Alex Perry871eab92022-03-12 17:43:52 -0800413 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800414 err = fixture.db.AddNotes(NotesData{1235, []string{"Note 2"}})
Alex Perry871eab92022-03-12 17:43:52 -0800415 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800416 err = fixture.db.AddNotes(NotesData{1234, []string{"Note 3"}})
Alex Perry871eab92022-03-12 17:43:52 -0800417 check(t, err, "Failed to add Note")
418
Philipp Schrader7365d322022-03-06 16:40:08 -0800419 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800420 check(t, err, "Failed to get Notes")
421
422 if !reflect.DeepEqual(expected, actual) {
423 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
424 }
425}