diff --git a/field/arena.go b/field/arena.go index 586c974..05cc20c 100755 --- a/field/arena.go +++ b/field/arena.go @@ -181,7 +181,14 @@ func (arena *Arena) CreatePlayoffBracket() error { return err } if len(alliances) > 0 { - arena.PlayoffBracket, err = bracket.NewSingleEliminationBracket(len(alliances)) + switch arena.EventSettings.ElimType { + case "single": + arena.PlayoffBracket, err = bracket.NewSingleEliminationBracket(len(alliances)) + case "double": + arena.PlayoffBracket, err = bracket.NewDoubleEliminationBracket(len(alliances)) + default: + err = fmt.Errorf("Invalid playoff type: %v", arena.EventSettings.ElimType) + } if err != nil { return err } diff --git a/model/event_settings.go b/model/event_settings.go index fd82514..24bf097 100755 --- a/model/event_settings.go +++ b/model/event_settings.go @@ -10,6 +10,7 @@ import "github.com/Team254/cheesy-arena-lite/game" type EventSettings struct { Id int `db:"id"` Name string + ElimType string NumElimAlliances int SelectionRound2Order string SelectionRound3Order string @@ -52,6 +53,7 @@ func (database *Database) GetEventSettings() (*EventSettings, error) { // Database record doesn't exist yet; create it now. eventSettings := EventSettings{ Name: "Untitled Event", + ElimType: "single", NumElimAlliances: 8, SelectionRound2Order: "L", SelectionRound3Order: "", diff --git a/model/event_settings_test.go b/model/event_settings_test.go index 30ec45c..f4d393e 100644 --- a/model/event_settings_test.go +++ b/model/event_settings_test.go @@ -14,10 +14,27 @@ func TestEventSettingsReadWrite(t *testing.T) { eventSettings, err := db.GetEventSettings() assert.Nil(t, err) - assert.Equal(t, EventSettings{Id: 1, Name: "Untitled Event", NumElimAlliances: 8, SelectionRound2Order: "L", - SelectionRound3Order: "", TBADownloadEnabled: true, ApTeamChannel: 157, ApAdminChannel: 0, - ApAdminWpaKey: "1234Five", WarmupDurationSec: 0, AutoDurationSec: 15, PauseDurationSec: 2, - TeleopDurationSec: 135, WarningRemainingDurationSec: 30}, *eventSettings) + assert.Equal( + t, + EventSettings{ + Id: 1, + Name: "Untitled Event", + ElimType: "single", + NumElimAlliances: 8, + SelectionRound2Order: "L", + SelectionRound3Order: "", + TBADownloadEnabled: true, + ApTeamChannel: 157, + ApAdminChannel: 0, + ApAdminWpaKey: "1234Five", + WarmupDurationSec: 0, + AutoDurationSec: 15, + PauseDurationSec: 2, + TeleopDurationSec: 135, + WarningRemainingDurationSec: 30, + }, + *eventSettings, + ) eventSettings.Name = "Chezy Champs" eventSettings.NumElimAlliances = 6 diff --git a/templates/setup_settings.html b/templates/setup_settings.html index 6219e37..b6deb90 100755 --- a/templates/setup_settings.html +++ b/templates/setup_settings.html @@ -24,10 +24,30 @@ +
+ +
+
+ +
+
+ +
+
+
- +
@@ -337,4 +357,13 @@
{{end}} {{define "script"}} + {{end}} diff --git a/web/setup_settings.go b/web/setup_settings.go index 244c4c1..f46cfcc 100755 --- a/web/setup_settings.go +++ b/web/setup_settings.go @@ -41,10 +41,16 @@ func (web *Web) settingsPostHandler(w http.ResponseWriter, r *http.Request) { } previousAdminPassword := eventSettings.AdminPassword - numAlliances, _ := strconv.Atoi(r.PostFormValue("numElimAlliances")) - if numAlliances < 2 || numAlliances > 16 { - web.renderSettings(w, r, "Number of alliances must be between 2 and 16.") - return + eventSettings.ElimType = r.PostFormValue("elimType") + numAlliances := 0 + if eventSettings.ElimType == "double" { + numAlliances = 8 + } else { + numAlliances, _ = strconv.Atoi(r.PostFormValue("numElimAlliances")) + if numAlliances < 2 || numAlliances > 16 { + web.renderSettings(w, r, "Number of alliances must be between 2 and 16.") + return + } } eventSettings.NumElimAlliances = numAlliances diff --git a/web/setup_settings_test.go b/web/setup_settings_test.go index 8dedb14..700ca62 100644 --- a/web/setup_settings_test.go +++ b/web/setup_settings_test.go @@ -39,6 +39,15 @@ func TestSetupSettings(t *testing.T) { assert.Contains(t, recorder.Body.String(), "tbasec") } +func TestSetupSettingsDoubleElimination(t *testing.T) { + web := setupTestWeb(t) + + recorder := web.postHttpResponse("/setup/settings", "elimType=double&numElimAlliances=3") + assert.Equal(t, 303, recorder.Code) + assert.Equal(t, "double", web.arena.EventSettings.ElimType) + assert.Equal(t, 8, web.arena.EventSettings.NumElimAlliances) +} + func TestSetupSettingsInvalidValues(t *testing.T) { web := setupTestWeb(t)