From 98319e962515e373514922228828501192b05729 Mon Sep 17 00:00:00 2001 From: Malaber <32635600+Malaber@users.noreply.github.com> Date: Wed, 12 Jun 2019 20:41:06 +0200 Subject: [PATCH] Assign :intermediate_stage to first stage if single_team matches present --- app/models/stage.rb | 2 +- app/services/playoff_stage_service.rb | 1 + spec/services/playoff_stage_service_spec.rb | 32 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/models/stage.rb b/app/models/stage.rb index 1f36b21..f29d661 100644 --- a/app/models/stage.rb +++ b/app/models/stage.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Stage < ApplicationRecord - enum state: %i[playoff_stage in_progress finished] + enum state: %i[playoff_stage intermediate_stage in_progress finished] belongs_to :tournament has_many :matches, dependent: :destroy diff --git a/app/services/playoff_stage_service.rb b/app/services/playoff_stage_service.rb index 60b44a6..3ee2e1f 100644 --- a/app/services/playoff_stage_service.rb +++ b/app/services/playoff_stage_service.rb @@ -12,6 +12,7 @@ class PlayoffStageService # initial_matches are the matches in the first stage; this is the only stage filled with teams from the start on initial_matches = MatchService.generate_matches(teams) initial_stage = Stage.new level: stage_count - 1, matches: initial_matches + initial_stage.state = :intermediate_stage unless initial_stage.matches.find(&:single_team?).nil? playoffs << initial_stage # empty stages are the stages, the tournament is filled with to have the matches ready for later empty_stages = generate_stages_with_empty_matches(stage_count - 1) diff --git a/spec/services/playoff_stage_service_spec.rb b/spec/services/playoff_stage_service_spec.rb index 99466bd..97fdfb7 100644 --- a/spec/services/playoff_stage_service_spec.rb +++ b/spec/services/playoff_stage_service_spec.rb @@ -79,6 +79,38 @@ RSpec.describe PlayoffStageService do end end end + + describe 'number of teams isn\'t a power of two' do + let(:generated_stages) do + PlayoffStageService.generate_playoff_stages(create_list(:team, 12)) + end + + let(:intermediate_stage) do + generated_stages.max_by(&:level) + end + + it 'generates an intermediate stage at the top level' do + expect(intermediate_stage.state).to eq('intermediate_stage') + end + + it 'generates normal playoff_stage state stages elsewhere' do + (generated_stages - [intermediate_stage]).each do |stage| + expect(stage.state).to eq('playoff_stage') + end + end + end + + describe 'number of teams is a power of two' do + let(:generated_stages) do + PlayoffStageService.generate_playoff_stages(create_list(:team, 16)) + end + + it 'generates only normal playoff_stage state stages' do + generated_stages.each do |stage| + expect(stage.state).to eq('playoff_stage') + end + end + end end describe '#populate_match_below' do