blob: c1fe8601a517ad0b4a4956694a4041c2d3eb8227 [file] [log] [blame]
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08001package requests
2
3import (
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08004 "net/http"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08005 "reflect"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08006 "testing"
7
Philipp Schrader8747f1b2022-02-23 23:56:22 -08008 "github.com/frc971/971-Robot-Code/scouting/db"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08009 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
Emily Markova290147d2023-03-03 22:40:06 -080010 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting"
11 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080012 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
13 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080014 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
15 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080016 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
17 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070018 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Milo Lin1d59f0c2022-06-22 20:30:58 -070019 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
20 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova1abe9782023-03-11 19:45:38 -080021 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
Filip Kujawa210a03b2022-11-24 14:41:11 -080022 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070023 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Milo Lin1d59f0c2022-06-22 20:30:58 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080025 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
26 flatbuffers "github.com/google/flatbuffers/go"
27)
28
29// Validates that an unhandled address results in a 404.
30func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080031 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080032 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080033 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080034 scoutingServer.Start(8080)
35 defer scoutingServer.Stop()
36
37 resp, err := http.Get("http://localhost:8080/requests/foo")
38 if err != nil {
39 t.Fatalf("Failed to get data: %v", err)
40 }
41 if resp.StatusCode != http.StatusNotFound {
42 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
43 }
44}
45
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080046// Validates that we can request the full match list.
47func TestRequestAllMatches(t *testing.T) {
48 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -080049 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080050 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080051 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070052 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -080053 },
54 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080055 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070056 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -080057 },
58 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080059 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070060 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -080061 },
62 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080063 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070064 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
Emily Markovabf24c9e2023-02-08 20:31:11 -080065 },
66 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080067 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070068 Alliance: "B", AlliancePosition: 2, TeamNumber: "400",
Emily Markovabf24c9e2023-02-08 20:31:11 -080069 },
70 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080071 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070072 Alliance: "B", AlliancePosition: 3, TeamNumber: "200",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080073 },
74 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080075 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070076 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -080077 },
78 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080079 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070080 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -080081 },
82 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080083 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070084 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -080085 },
86 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080087 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070088 Alliance: "B", AlliancePosition: 1, TeamNumber: "972",
Emily Markovabf24c9e2023-02-08 20:31:11 -080089 },
90 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080091 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070092 Alliance: "B", AlliancePosition: 2, TeamNumber: "401",
Emily Markovabf24c9e2023-02-08 20:31:11 -080093 },
94 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080095 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070096 Alliance: "B", AlliancePosition: 3, TeamNumber: "201",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080097 },
98 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080099 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700100 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800101 },
102 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800103 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700104 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800105 },
106 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800107 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700108 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800109 },
110 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800111 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700112 Alliance: "B", AlliancePosition: 1, TeamNumber: "973",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800113 },
114 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800115 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700116 Alliance: "B", AlliancePosition: 2, TeamNumber: "402",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800117 },
118 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800119 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700120 Alliance: "B", AlliancePosition: 3, TeamNumber: "202",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800121 },
122 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800123 // Pretend that we have some data scouting data.
124 stats2023: []db.Stats2023{
125 {
126 TeamNumber: "5", MatchNumber: 1, SetNumber: 1,
127 CompLevel: "qm", StartingQuadrant: 3, LowCubesAuto: 10,
128 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
129 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
130 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
131 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700132 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700133 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700134 BalanceAttemptAuto: false, Docked: false, Engaged: false,
135 BalanceAttempt: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800136 },
137 {
138 TeamNumber: "973", MatchNumber: 3, SetNumber: 1,
139 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
140 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
141 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
142 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
143 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700144 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700145 AvgCycle: 53, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700146 BalanceAttemptAuto: false, Docked: false, Engaged: false,
147 BalanceAttempt: true, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800148 },
149 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800150 }
151 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800152 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800153 scoutingServer.Start(8080)
154 defer scoutingServer.Stop()
155
156 builder := flatbuffers.NewBuilder(1024)
157 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
158
159 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
160 if err != nil {
161 t.Fatal("Failed to request all matches: ", err)
162 }
163
164 expected := request_all_matches_response.RequestAllMatchesResponseT{
165 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700166 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800167 // R1, R2, R3, B1, B2, B3
168 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800169 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700170 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800171 &request_all_matches_response.ScoutedLevelT{
172 // The R1 team has already been data
173 // scouted.
174 true, false, false, false, false, false,
175 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800176 },
177 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800178 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700179 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800180 &request_all_matches_response.ScoutedLevelT{
181 false, false, false, false, false, false,
182 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800183 },
184 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800185 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700186 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800187 &request_all_matches_response.ScoutedLevelT{
188 // The B1 team has already been data
189 // scouted.
190 false, false, false, true, false, false,
191 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800192 },
193 },
194 }
195 if len(expected.MatchList) != len(response.MatchList) {
196 t.Fatal("Expected ", expected, ", but got ", *response)
197 }
198 for i, match := range expected.MatchList {
199 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
200 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
201 }
202 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800203
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800204}
205
Emily Markova290147d2023-03-03 22:40:06 -0800206// Validates that we can request the 2023 stats.
207func TestRequest2023DataScouting(t *testing.T) {
208 db := MockDatabase{
209 stats2023: []db.Stats2023{
210 {
211 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
212 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
213 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
214 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
215 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
216 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700217 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700218 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700219 BalanceAttemptAuto: false, Docked: false, Engaged: false,
220 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800221 },
222 {
223 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
224 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
225 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
226 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
227 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
228 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700229 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700230 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700231 BalanceAttemptAuto: true, Docked: false, Engaged: false,
232 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800233 },
234 },
235 }
236 scoutingServer := server.NewScoutingServer()
237 HandleRequests(&db, scoutingServer)
238 scoutingServer.Start(8080)
239 defer scoutingServer.Stop()
240
241 builder := flatbuffers.NewBuilder(1024)
242 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
243
244 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
245 if err != nil {
246 t.Fatal("Failed to request all matches: ", err)
247 }
248
249 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
250 StatsList: []*request_2023_data_scouting_response.Stats2023T{
251 {
252 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
253 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
254 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
255 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
256 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
257 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700258 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700259 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700260 BalanceAttemptAuto: false, Docked: false, Engaged: false,
261 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800262 },
263 {
264 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
265 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
266 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
267 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
268 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
269 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700270 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700271 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700272 BalanceAttemptAuto: true, Docked: false, Engaged: false,
273 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800274 },
275 },
276 }
277 if len(expected.StatsList) != len(response.StatsList) {
278 t.Fatal("Expected ", expected, ", but got ", *response)
279 }
280 for i, match := range expected.StatsList {
281 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
282 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
283 }
284 }
285}
286
Emily Markova1abe9782023-03-11 19:45:38 -0800287// Validates that we can request the 2023 stats.
288func TestConvertActionsToStat(t *testing.T) {
289 builder := flatbuffers.NewBuilder(1024)
290 builder.Finish((&submit_actions.SubmitActionsT{
291 TeamNumber: "4244",
292 MatchNumber: 3,
293 SetNumber: 1,
294 CompLevel: "quals",
Emily Markova1abe9782023-03-11 19:45:38 -0800295 ActionsList: []*submit_actions.ActionT{
296 {
297 ActionTaken: &submit_actions.ActionTypeT{
298 Type: submit_actions.ActionTypeStartMatchAction,
299 Value: &submit_actions.StartMatchActionT{
300 Position: 1,
301 },
302 },
303 Timestamp: 0,
304 },
305 {
306 ActionTaken: &submit_actions.ActionTypeT{
307 Type: submit_actions.ActionTypePickupObjectAction,
308 Value: &submit_actions.PickupObjectActionT{
309 ObjectType: submit_actions.ObjectTypekCube,
310 Auto: true,
311 },
312 },
313 Timestamp: 400,
314 },
315 {
316 ActionTaken: &submit_actions.ActionTypeT{
317 Type: submit_actions.ActionTypePickupObjectAction,
318 Value: &submit_actions.PickupObjectActionT{
319 ObjectType: submit_actions.ObjectTypekCube,
320 Auto: true,
321 },
322 },
323 Timestamp: 800,
324 },
325 {
326 ActionTaken: &submit_actions.ActionTypeT{
327 Type: submit_actions.ActionTypePlaceObjectAction,
328 Value: &submit_actions.PlaceObjectActionT{
329 ObjectType: submit_actions.ObjectTypekCube,
330 ScoreLevel: submit_actions.ScoreLevelkLow,
331 Auto: true,
332 },
333 },
334 Timestamp: 2000,
335 },
336 {
337 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700338 Type: submit_actions.ActionTypeMobilityAction,
339 Value: &submit_actions.MobilityActionT{
340 Mobility: true,
341 },
342 },
343 Timestamp: 2200,
344 },
345 {
346 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700347 Type: submit_actions.ActionTypeAutoBalanceAction,
348 Value: &submit_actions.AutoBalanceActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700349 Docked: true,
350 Engaged: true,
351 BalanceAttempt: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700352 },
353 },
354 Timestamp: 2400,
355 },
356 {
357 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800358 Type: submit_actions.ActionTypePickupObjectAction,
359 Value: &submit_actions.PickupObjectActionT{
360 ObjectType: submit_actions.ObjectTypekCone,
361 Auto: false,
362 },
363 },
364 Timestamp: 2800,
365 },
366 {
367 ActionTaken: &submit_actions.ActionTypeT{
368 Type: submit_actions.ActionTypePlaceObjectAction,
369 Value: &submit_actions.PlaceObjectActionT{
370 ObjectType: submit_actions.ObjectTypekCone,
371 ScoreLevel: submit_actions.ScoreLevelkHigh,
372 Auto: false,
373 },
374 },
375 Timestamp: 3100,
376 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700377 {
378 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa7a045e72023-04-13 08:41:09 -0700379 Type: submit_actions.ActionTypePickupObjectAction,
380 Value: &submit_actions.PickupObjectActionT{
381 ObjectType: submit_actions.ObjectTypekCube,
382 Auto: false,
383 },
384 },
385 Timestamp: 3500,
386 },
387 {
388 ActionTaken: &submit_actions.ActionTypeT{
389 Type: submit_actions.ActionTypePlaceObjectAction,
390 Value: &submit_actions.PlaceObjectActionT{
391 ObjectType: submit_actions.ObjectTypekCube,
392 ScoreLevel: submit_actions.ScoreLevelkSupercharged,
393 Auto: false,
394 },
395 },
396 Timestamp: 3900,
397 },
398 {
399 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700400 Type: submit_actions.ActionTypeEndMatchAction,
401 Value: &submit_actions.EndMatchActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700402 Docked: true,
403 Engaged: false,
404 BalanceAttempt: true,
Emily Markova46a69bf2023-03-22 20:45:52 -0700405 },
406 },
Filip Kujawa7a045e72023-04-13 08:41:09 -0700407 Timestamp: 4200,
Emily Markova46a69bf2023-03-22 20:45:52 -0700408 },
Emily Markova1abe9782023-03-11 19:45:38 -0800409 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700410 PreScouting: false,
Emily Markova1abe9782023-03-11 19:45:38 -0800411 }).Pack(builder))
412
413 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
414 response, err := ConvertActionsToStat(submitActions)
415
416 if err != nil {
417 t.Fatal("Failed to convert actions to stats: ", err)
418 }
419
420 expected := db.Stats2023{
Philipp Schrader4b489222023-04-15 16:40:16 -0700421 PreScouting: false,
422 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
Emily Markova1abe9782023-03-11 19:45:38 -0800423 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
424 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
425 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
426 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
427 HighCubes: 0, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700428 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700429 AvgCycle: 950, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700430 BalanceAttemptAuto: false, Docked: true, Engaged: false,
Philipp Schradere11114f2023-04-15 17:04:25 -0700431 BalanceAttempt: true, CollectedBy: "",
Emily Markova1abe9782023-03-11 19:45:38 -0800432 }
433
434 if expected != response {
435 t.Fatal("Expected ", expected, ", but got ", response)
436 }
437}
438
Alex Perry81f96ba2022-03-13 18:26:19 -0700439func TestSubmitNotes(t *testing.T) {
440 database := MockDatabase{}
441 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800442 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700443 scoutingServer.Start(8080)
444 defer scoutingServer.Stop()
445
446 builder := flatbuffers.NewBuilder(1024)
447 builder.Finish((&submit_notes.SubmitNotesT{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800448 Team: 971,
449 Notes: "Notes",
450 GoodDriving: true,
451 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700452 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800453 SketchyPlacing: false,
454 GoodDefense: true,
455 BadDefense: false,
456 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700457 }).Pack(builder))
458
459 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
460 if err != nil {
461 t.Fatal("Failed to submit notes: ", err)
462 }
463
464 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800465 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800466 TeamNumber: 971,
467 Notes: "Notes",
468 GoodDriving: true,
469 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700470 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800471 SketchyPlacing: false,
472 GoodDefense: true,
473 BadDefense: false,
474 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800475 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700476 }
477
478 if !reflect.DeepEqual(database.notes, expected) {
479 t.Fatal("Submitted notes did not match", expected, database.notes)
480 }
481}
482
483func TestRequestNotes(t *testing.T) {
484 database := MockDatabase{
485 notes: []db.NotesData{{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800486 TeamNumber: 971,
487 Notes: "Notes",
488 GoodDriving: true,
489 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700490 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800491 SketchyPlacing: false,
492 GoodDefense: true,
493 BadDefense: false,
494 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700495 }},
496 }
497 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800498 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700499 scoutingServer.Start(8080)
500 defer scoutingServer.Stop()
501
502 builder := flatbuffers.NewBuilder(1024)
503 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
504 Team: 971,
505 }).Pack(builder))
506 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
507 if err != nil {
508 t.Fatal("Failed to submit notes: ", err)
509 }
510
511 if response.Notes[0].Data != "Notes" {
512 t.Fatal("requested notes did not match", response)
513 }
514}
515
Milo Lin1d59f0c2022-06-22 20:30:58 -0700516func TestRequestShiftSchedule(t *testing.T) {
517 db := MockDatabase{
518 shiftSchedule: []db.Shift{
519 {
520 MatchNumber: 1,
521 R1scouter: "Bob",
522 R2scouter: "James",
523 R3scouter: "Robert",
524 B1scouter: "Alice",
525 B2scouter: "Mary",
526 B3scouter: "Patricia",
527 },
528 {
529 MatchNumber: 2,
530 R1scouter: "Liam",
531 R2scouter: "Noah",
532 R3scouter: "Oliver",
533 B1scouter: "Emma",
534 B2scouter: "Charlotte",
535 B3scouter: "Amelia",
536 },
537 },
538 }
539 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800540 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700541 scoutingServer.Start(8080)
542 defer scoutingServer.Stop()
543
544 builder := flatbuffers.NewBuilder(1024)
545 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
546
547 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
548 if err != nil {
549 t.Fatal("Failed to request shift schedule: ", err)
550 }
551
552 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
553 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
554 {
555 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700556 R1Scouter: "Bob",
557 R2Scouter: "James",
558 R3Scouter: "Robert",
559 B1Scouter: "Alice",
560 B2Scouter: "Mary",
561 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700562 },
563 {
564 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700565 R1Scouter: "Liam",
566 R2Scouter: "Noah",
567 R3Scouter: "Oliver",
568 B1Scouter: "Emma",
569 B2Scouter: "Charlotte",
570 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700571 },
572 },
573 }
574 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
575 t.Fatal("Expected ", expected, ", but got ", *response)
576 }
577 for i, match := range expected.ShiftSchedule {
578 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
579 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
580 }
581 }
582}
583
584func TestSubmitShiftSchedule(t *testing.T) {
585 database := MockDatabase{}
586 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800587 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700588 scoutingServer.Start(8080)
589 defer scoutingServer.Stop()
590
591 builder := flatbuffers.NewBuilder(1024)
592 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
593 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
594 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700595 R1Scouter: "Bob",
596 R2Scouter: "James",
597 R3Scouter: "Robert",
598 B1Scouter: "Alice",
599 B2Scouter: "Mary",
600 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700601 },
602 }).Pack(builder))
603
604 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
605 if err != nil {
606 t.Fatal("Failed to submit shift schedule: ", err)
607 }
608
609 expected := []db.Shift{
610 {MatchNumber: 1,
611 R1scouter: "Bob",
612 R2scouter: "James",
613 R3scouter: "Robert",
614 B1scouter: "Alice",
615 B2scouter: "Mary",
616 B3scouter: "Patricia"},
617 }
618 if !reflect.DeepEqual(expected, database.shiftSchedule) {
619 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
620 }
621}
622
Filip Kujawa210a03b2022-11-24 14:41:11 -0800623func TestSubmitDriverRanking(t *testing.T) {
624 database := MockDatabase{}
625 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800626 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800627 scoutingServer.Start(8080)
628 defer scoutingServer.Stop()
629
630 builder := flatbuffers.NewBuilder(1024)
631 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
632 MatchNumber: 36,
633 Rank1: 1234,
634 Rank2: 1235,
635 Rank3: 1236,
636 }).Pack(builder))
637
638 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
639 if err != nil {
640 t.Fatal("Failed to submit driver ranking: ", err)
641 }
642
643 expected := []db.DriverRankingData{
644 {MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
645 }
646
647 if !reflect.DeepEqual(database.driver_ranking, expected) {
648 t.Fatal("Submitted notes did not match", expected, database.notes)
649 }
650}
651
Filip Kujawaf882e022022-12-14 13:14:08 -0800652// Validates that we can request the driver rankings.
653func TestRequestDriverRankings(t *testing.T) {
654 db := MockDatabase{
655 driver_ranking: []db.DriverRankingData{
656 {
657 MatchNumber: 36,
658 Rank1: 1234,
659 Rank2: 1235,
660 Rank3: 1236,
661 },
662 {
663 MatchNumber: 36,
664 Rank1: 101,
665 Rank2: 202,
666 Rank3: 303,
667 },
668 },
669 }
670 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800671 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800672 scoutingServer.Start(8080)
673 defer scoutingServer.Stop()
674
675 builder := flatbuffers.NewBuilder(1024)
676 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
677
678 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
679 if err != nil {
680 t.Fatal("Failed to request all driver rankings: ", err)
681 }
682
683 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
684 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
685 {
686 MatchNumber: 36,
687 Rank1: 1234,
688 Rank2: 1235,
689 Rank3: 1236,
690 },
691 {
692 MatchNumber: 36,
693 Rank1: 101,
694 Rank2: 202,
695 Rank3: 303,
696 },
697 },
698 }
699 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
700 t.Fatal("Expected ", expected, ", but got ", *response)
701 }
702 for i, match := range expected.DriverRankingList {
703 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
704 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
705 }
706 }
707}
708
709// Validates that we can request all notes.
710func TestRequestAllNotes(t *testing.T) {
711 db := MockDatabase{
712 notes: []db.NotesData{
713 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800714 TeamNumber: 971,
715 Notes: "Notes",
716 GoodDriving: true,
717 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700718 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800719 SketchyPlacing: false,
720 GoodDefense: true,
721 BadDefense: false,
722 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800723 },
724 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800725 TeamNumber: 972,
726 Notes: "More Notes",
727 GoodDriving: false,
728 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700729 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800730 SketchyPlacing: true,
731 GoodDefense: false,
732 BadDefense: true,
733 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800734 },
735 },
736 }
737 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800738 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800739 scoutingServer.Start(8080)
740 defer scoutingServer.Stop()
741
742 builder := flatbuffers.NewBuilder(1024)
743 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
744
745 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
746 if err != nil {
747 t.Fatal("Failed to request all notes: ", err)
748 }
749
750 expected := request_all_notes_response.RequestAllNotesResponseT{
751 NoteList: []*request_all_notes_response.NoteT{
752 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800753 Team: 971,
754 Notes: "Notes",
755 GoodDriving: true,
756 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700757 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800758 SketchyPlacing: false,
759 GoodDefense: true,
760 BadDefense: false,
761 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800762 },
763 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800764 Team: 972,
765 Notes: "More Notes",
766 GoodDriving: false,
767 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700768 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800769 SketchyPlacing: true,
770 GoodDefense: false,
771 BadDefense: true,
772 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800773 },
774 },
775 }
776 if len(expected.NoteList) != len(response.NoteList) {
777 t.Fatal("Expected ", expected, ", but got ", *response)
778 }
779 for i, note := range expected.NoteList {
780 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
781 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
782 }
783 }
784}
785
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800786func packAction(action *submit_actions.ActionT) []byte {
787 builder := flatbuffers.NewBuilder(50 * 1024)
788 builder.Finish((action).Pack(builder))
789 return (builder.FinishedBytes())
790}
791
792func TestAddingActions(t *testing.T) {
793 database := MockDatabase{}
794 scoutingServer := server.NewScoutingServer()
795 HandleRequests(&database, scoutingServer)
796 scoutingServer.Start(8080)
797 defer scoutingServer.Stop()
798
799 builder := flatbuffers.NewBuilder(1024)
800 builder.Finish((&submit_actions.SubmitActionsT{
801 TeamNumber: "1234",
802 MatchNumber: 4,
803 SetNumber: 1,
804 CompLevel: "qual",
805 ActionsList: []*submit_actions.ActionT{
806 {
807 ActionTaken: &submit_actions.ActionTypeT{
808 Type: submit_actions.ActionTypePickupObjectAction,
809 Value: &submit_actions.PickupObjectActionT{
810 ObjectType: submit_actions.ObjectTypekCube,
811 Auto: true,
812 },
813 },
814 Timestamp: 2400,
815 },
816 {
817 ActionTaken: &submit_actions.ActionTypeT{
818 Type: submit_actions.ActionTypePlaceObjectAction,
819 Value: &submit_actions.PlaceObjectActionT{
820 ObjectType: submit_actions.ObjectTypekCube,
821 ScoreLevel: submit_actions.ScoreLevelkLow,
822 Auto: false,
823 },
824 },
825 Timestamp: 1009,
826 },
827 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700828 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800829 }).Pack(builder))
830
831 _, err := debug.SubmitActions("http://localhost:8080", builder.FinishedBytes())
832 if err != nil {
833 t.Fatal("Failed to submit actions: ", err)
834 }
835
836 // Make sure that the data made it into the database.
837 // TODO: Add this back when we figure out how to add the serialized action into the database.
838
839 /* expectedActionsT := []*submit_actions.ActionT{
840 {
841 ActionTaken: &submit_actions.ActionTypeT{
842 Type: submit_actions.ActionTypePickupObjectAction,
843 Value: &submit_actions.PickupObjectActionT{
844 ObjectType: submit_actions.ObjectTypekCube,
845 Auto: true,
846 },
847 },
848 Timestamp: 2400,
849 },
850 {
851 ActionTaken: &submit_actions.ActionTypeT{
852 Type: submit_actions.ActionTypePlaceObjectAction,
853 Value: &submit_actions.PlaceObjectActionT{
854 ObjectType: submit_actions.ObjectTypekCube,
855 ScoreLevel: submit_actions.ScoreLevelkLow,
856 Auto: false,
857 },
858 },
859 Timestamp: 1009,
860 },
861 } */
862
863 expectedActions := []db.Action{
864 {
Philipp Schrader4b489222023-04-15 16:40:16 -0700865 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800866 TeamNumber: "1234",
867 MatchNumber: 4,
868 SetNumber: 1,
869 CompLevel: "qual",
870 CollectedBy: "debug_cli",
871 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -0700872 Timestamp: 2400,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800873 },
874 {
Philipp Schrader4b489222023-04-15 16:40:16 -0700875 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800876 TeamNumber: "1234",
877 MatchNumber: 4,
878 SetNumber: 1,
879 CompLevel: "qual",
880 CollectedBy: "debug_cli",
881 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -0700882 Timestamp: 1009,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800883 },
884 }
885
Philipp Schradere11114f2023-04-15 17:04:25 -0700886 expectedStats := []db.Stats2023{
887 db.Stats2023{
888 PreScouting: true,
889 TeamNumber: "1234", MatchNumber: 4, SetNumber: 1,
890 CompLevel: "qual", StartingQuadrant: 0, LowCubesAuto: 0,
891 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
892 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
893 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 0,
894 HighCubes: 0, CubesDropped: 0, LowCones: 0,
895 MiddleCones: 0, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
896 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
897 BalanceAttemptAuto: false, Docked: false, Engaged: false,
898 BalanceAttempt: false, CollectedBy: "debug_cli",
899 },
900 }
901
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800902 if !reflect.DeepEqual(expectedActions, database.actions) {
903 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
904 }
Philipp Schradere11114f2023-04-15 17:04:25 -0700905 if !reflect.DeepEqual(expectedStats, database.stats2023) {
906 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
907 }
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800908}
909
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800910// A mocked database we can use for testing. Add functionality to this as
911// needed for your tests.
912
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800913type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800914 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -0800915 notes []db.NotesData
916 shiftSchedule []db.Shift
917 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -0800918 stats2023 []db.Stats2023
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800919 actions []db.Action
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800920}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800921
Emily Markovabf24c9e2023-02-08 20:31:11 -0800922func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -0800923 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800924 return nil
925}
926
Emily Markova290147d2023-03-03 22:40:06 -0800927func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
928 database.stats2023 = append(database.stats2023, stats2023)
929 return nil
930}
Emily Markovabf24c9e2023-02-08 20:31:11 -0800931func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800932 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800933}
934
Emily Markova290147d2023-03-03 22:40:06 -0800935func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
936 return database.stats2023, nil
937}
938
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700939func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800940 var results []db.Stats2023
941 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700942 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800943 results = append(results, stats)
944 }
945 }
946 return results, nil
947}
948
Philipp Schradereecb8962022-06-01 21:02:42 -0700949func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -0700950 var results []string
951 for _, data := range database.notes {
952 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -0700953 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -0700954 }
955 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700956 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -0700957}
958
Filip Kujawaf947cb42022-11-21 10:00:30 -0800959func (database *MockDatabase) AddNotes(data db.NotesData) error {
960 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -0700961 return nil
962}
963
Filip Kujawaf882e022022-12-14 13:14:08 -0800964func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
965 return database.notes, nil
966}
967
Milo Lin1d59f0c2022-06-22 20:30:58 -0700968func (database *MockDatabase) AddToShift(data db.Shift) error {
969 database.shiftSchedule = append(database.shiftSchedule, data)
970 return nil
971}
972
973func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
974 return database.shiftSchedule, nil
975}
976
977func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
978 return []db.Shift{}, nil
979}
980
Filip Kujawa210a03b2022-11-24 14:41:11 -0800981func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
982 database.driver_ranking = append(database.driver_ranking, data)
983 return nil
984}
985
Filip Kujawaf882e022022-12-14 13:14:08 -0800986func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
987 return database.driver_ranking, nil
988}
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800989
990func (database *MockDatabase) AddAction(action db.Action) error {
991 database.actions = append(database.actions, action)
992 return nil
993}
994
995func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
996 return database.actions, nil
997}