diff --git a/app/controllers/weights_controller.rb b/app/controllers/weights_controller.rb index 5ee391a..f2d8c57 100644 --- a/app/controllers/weights_controller.rb +++ b/app/controllers/weights_controller.rb @@ -79,7 +79,6 @@ class WeightsController < ApplicationController format.json { head :no_content } end end - def pool_order pool = params[:pool_to_order].to_i diff --git a/app/models/weight.rb b/app/models/weight.rb index 7b04943..b0195f8 100644 --- a/app/models/weight.rb +++ b/app/models/weight.rb @@ -155,7 +155,7 @@ class Weight < ApplicationRecord wrestlers.select{|w| w.pool == nil} end - def calculate_bracket_size() + def calculate_bracket_size num_wrestlers = wrestlers.reload.size return nil if num_wrestlers <= 0 # Handle invalid input diff --git a/app/services/tournament_services/generate_tournament_matches.rb b/app/services/tournament_services/generate_tournament_matches.rb index 18a3f3d..a8c6059 100644 --- a/app/services/tournament_services/generate_tournament_matches.rb +++ b/app/services/tournament_services/generate_tournament_matches.rb @@ -3,25 +3,6 @@ class GenerateTournamentMatches @tournament = tournament end - def generateWeight(weight) - if Rails.env.production? - self.delay(:job_owner_id => @tournament.id, :job_owner_type => "Generate matches for weights class #{weight.max}").generate_weight_raw(weight) - else - self.generate_weight_raw(weight) - end - end - - def generate_weight_raw(weight) - @tournament.clear_errored_deferred_jobs - WipeTournamentMatches.new(@tournament).wipeWeightMatches(weight) - @tournament.curently_generating_matches = 1 - @tournament.save - unAssignBouts - PoolToBracketMatchGeneration.new(@tournament).generatePoolToBracketMatchesWeight(weight) if @tournament.tournament_type == "Pool to bracket" - postMatchCreationActions - PoolToBracketGenerateLoserNames.new(@tournament).assignLoserNamesWeight(weight) if @tournament.tournament_type == "Pool to bracket" - end - def generate if Rails.env.production? self.delay(:job_owner_id => @tournament.id, :job_owner_type => "Generate matches for all weights").generate_raw @@ -45,7 +26,7 @@ class GenerateTournamentMatches @tournament.curently_generating_matches = 1 @tournament.save WipeTournamentMatches.new(@tournament).setUpMatchGeneration - TournamentSeeding.new(@tournament).setSeeds + TournamentSeeding.new(@tournament).set_seeds end def postMatchCreationActions diff --git a/app/services/tournament_services/tournament_seeding.rb b/app/services/tournament_services/tournament_seeding.rb index 38d9cdb..77a74d1 100644 --- a/app/services/tournament_services/tournament_seeding.rb +++ b/app/services/tournament_services/tournament_seeding.rb @@ -3,42 +3,63 @@ class TournamentSeeding @tournament = tournament end - def setSeeds - @tournament.weights.each do |w| - resetAllSeeds(w) - setOriginalSeeds(w) - randomSeeding(w) + def set_seeds + @tournament.weights.each do |weight| + wrestlers = weight.wrestlers + bracket_size = weight.calculate_bracket_size + + wrestlers = reset_bracket_line_for_lines_higher_than_bracket_size(wrestlers, bracket_size) + wrestlers = set_original_seed_to_bracket_line(wrestlers) + wrestlers = random_seeding(wrestlers, bracket_size) + wrestlers.each(&:save) end end - def randomSeeding(weight) - wrestlerWithSeeds = weight.wrestlers.select{|w| w.original_seed != nil }.sort_by{|w| w.original_seed} - if wrestlerWithSeeds.size > 0 - highestSeed = wrestlerWithSeeds.last.bracket_line - seed = highestSeed + 1 - else - seed = 1 + def random_seeding(wrestlers, bracket_size) + available_bracket_lines = (1..bracket_size).to_a + + # remove bracket lines that are taken from available_bracket_lines + wrestlers_with_bracket_lines = wrestlers.select{|w| w.bracket_line != nil } + wrestlers_with_bracket_lines.each do |wrestler| + available_bracket_lines.delete(wrestler.bracket_line) end - wrestlersWithoutSeed = weight.wrestlers.select{|w| w.original_seed == nil } - wrestlersWithoutSeed.shuffle.each do |w| - w.bracket_line = seed - w.save - seed += 1 + + wrestlers_without_bracket_lines = wrestlers.select{|w| w.bracket_line == nil } + # Iterrate over the list randomly + wrestlers_without_bracket_lines.shuffle.each do |wrestler| + random_available_bracket_line = available_bracket_lines.sample + wrestler.bracket_line = random_available_bracket_line + available_bracket_lines.delete(random_available_bracket_line) end + return wrestlers end - def setOriginalSeeds(weight) - wrestlerWithSeeds = weight.wrestlers.select{|w| w.original_seed != nil } - wrestlerWithSeeds.each do |w| - w.bracket_line = w.original_seed - w.save + def set_original_seed_to_bracket_line(wrestlers) + wrestlers_with_seeds = wrestlers.select{|w| w.original_seed != nil } + wrestlers_with_seeds.each do |wrestler| + wrestlers_with_seeded_wrestlers_bracket_line = wrestlers.select{|w| w.bracket_line == wrestler.original_seed && w.id != wrestler.id} + wrestlers_with_seeded_wrestlers_bracket_line.each do |wrestler_with_wrong_bracket_line| + wrestler_with_wrong_bracket_line.bracket_line = nil + end + + wrestler.bracket_line = wrestler.original_seed end + return wrestlers end - def resetAllSeeds(weight) - weight.wrestlers.each do |w| + def reset_bracket_line_for_lines_higher_than_bracket_size(wrestlers, bracket_size) + wrestlers.each do |w| + if w.bracket_line && w.bracket_line > bracket_size + w.bracket_line = nil + end + end + return wrestlers + end + + def reset_all_seeds(wrestlers) + wrestlers.each do |w| w.bracket_line = nil - w.save end + return wrestlers end end \ No newline at end of file diff --git a/app/views/weights/show.html.erb b/app/views/weights/show.html.erb index e2d829d..0b237ec 100644 --- a/app/views/weights/show.html.erb +++ b/app/views/weights/show.html.erb @@ -35,7 +35,7 @@ <% end %> <% if can? :manage, @tournament %> - <%= link_to '', wrestler, method: :delete, data: { confirm: "Are you sure you want to delete #{wrestler.name}?" } , :class=>"fas fa-trash-alt" %> + <%= link_to '', wrestler, method: :delete, data: { confirm: "Are you sure you want to delete #{wrestler.name}? THIS WILL DELETE ALL MATCHES." } , :class=>"fas fa-trash-alt" %> <% end %> @@ -43,7 +43,7 @@ <% end %> -

*All wrestlers without a seed (determined by tournament director) will be assigned a bracket line.

+

*All wrestlers without a seed (determined by tournament director) will be assigned a random bracket line.

<% if can? :manage, @tournament %>
<%= submit_tag "Save Seeds", :class=>"btn btn-success"%> diff --git a/config/application.rb b/config/application.rb index 281725d..d9de515 100644 --- a/config/application.rb +++ b/config/application.rb @@ -30,12 +30,9 @@ module Wrestling DeviseController.respond_to :html, :json end - config.autoload_paths << "#{config.root}/app/services/tournament_services" - config.autoload_paths << "#{config.root}/app/services/wrestler_services" - config.autoload_paths << "#{config.root}/app/services/weight_services" - config.autoload_paths << "#{config.root}/app/services/bracket_advancement" - config.autoload_paths << "#{config.root}/app/services/school_services" - config.add_autoload_paths_to_load_path = false + # Add all folders under app/services to the autoload paths + config.autoload_paths += Dir[Rails.root.join('app', 'services', '**', '*')] + # config.add_autoload_paths_to_load_path = false config.active_support.cache_format_version = 7.2 config.load_defaults 7.2 diff --git a/test/integration/double_elimination_eight_man_1_6_run_through_test.1.rb b/test/integration/double_elimination_eight_man_1_6_run_through_test.rb similarity index 100% rename from test/integration/double_elimination_eight_man_1_6_run_through_test.1.rb rename to test/integration/double_elimination_eight_man_1_6_run_through_test.rb diff --git a/test/integration/double_elimination_tournament_seeding_test.rb b/test/integration/double_elimination_tournament_seeding_test.rb new file mode 100644 index 0000000..da07dfd --- /dev/null +++ b/test/integration/double_elimination_tournament_seeding_test.rb @@ -0,0 +1,160 @@ +require 'test_helper' + +class EightManDoubleEliminationSixPlacesRunThrough < ActionDispatch::IntegrationTest + def setup + create_double_elim_tournament_single_weight(8, "Regular Double Elimination 1-8") + @tournament.wrestlers.each do | wrestler | + if wrestler.original_seed > 4 + wrestler.original_seed = nil + wrestler.bracket_line = nil + wrestler.save + end + GenerateTournamentMatches.new(@tournament.reload).generate + end + end + + test "Wrestlers with seeds should go on certain lines and it should be random for everyone else" do + matches = @tournament.reload.matches + + matches.select{|m| m.round == 1}.each do | match | + assert(match.wrestler1.original_seed != nil) + assert(match.wrestler2.original_seed == nil) + end + end + + test "Regenerating matches without changes should keep lines the same" do + wrestlers = @tournament.wrestlers + test_one_bracket_line_original = wrestlers.select{|w|w.name == "Test1"}.first.bracket_line + test_two_bracket_line_original = wrestlers.select{|w|w.name == "Test2"}.first.bracket_line + test_three_bracket_line_original = wrestlers.select{|w|w.name == "Test3"}.first.bracket_line + test_four_bracket_line_original = wrestlers.select{|w|w.name == "Test4"}.first.bracket_line + test_five_bracket_line_original = wrestlers.select{|w|w.name == "Test5"}.first.bracket_line + test_six_bracket_line_original = wrestlers.select{|w|w.name == "Test6"}.first.bracket_line + test_seven_bracket_line_original = wrestlers.select{|w|w.name == "Test7"}.first.bracket_line + test_eight_bracket_line_original = wrestlers.select{|w|w.name == "Test8"}.first.bracket_line + + GenerateTournamentMatches.new(@tournament.reload).generate + + wrestlers = @tournament.reload.wrestlers + test_one_bracket_line_second = wrestlers.select{|w|w.name == "Test1"}.first.bracket_line + test_two_bracket_line_second = wrestlers.select{|w|w.name == "Test2"}.first.bracket_line + test_three_bracket_line_second = wrestlers.select{|w|w.name == "Test3"}.first.bracket_line + test_four_bracket_line_second = wrestlers.select{|w|w.name == "Test4"}.first.bracket_line + test_five_bracket_line_second = wrestlers.select{|w|w.name == "Test5"}.first.bracket_line + test_six_bracket_line_second = wrestlers.select{|w|w.name == "Test6"}.first.bracket_line + test_seven_bracket_line_second = wrestlers.select{|w|w.name == "Test7"}.first.bracket_line + test_eight_bracket_line_second = wrestlers.select{|w|w.name == "Test8"}.first.bracket_line + + assert(test_one_bracket_line_original == test_one_bracket_line_second) + assert(test_two_bracket_line_original == test_two_bracket_line_second) + assert(test_three_bracket_line_original == test_three_bracket_line_second) + assert(test_four_bracket_line_original == test_four_bracket_line_second) + assert(test_five_bracket_line_original == test_five_bracket_line_second) + assert(test_six_bracket_line_original == test_six_bracket_line_second) + assert(test_seven_bracket_line_original == test_seven_bracket_line_second) + assert(test_eight_bracket_line_original == test_eight_bracket_line_second) + end + + test "Deleting a wrestler and generating produces a BYE for the person who lost their opponent" do + wrestler_three_first_round = @tournament.reload.matches.select{|m| m.round == 1 && m.wrestler1.name == "Test3"}.first + wrestler_three_first_round.wrestler2.destroy + GenerateTournamentMatches.new(@tournament.reload).generate + matches = @tournament.reload.matches + + match_with_bye = matches.select{|m|m.loser2_name == "BYE"}.first + assert(match_with_bye.wrestler1.name == "Test3") + end + + test "Deleting a seeded wrestler reseeding and generating produces a BYE for the non seeded opponent who lost their match" do + wrestler_two_first_round = @tournament.reload.matches.select{|m| m.round == 1 && m.wrestler1.name == "Test2"}.first + wrestler_four_first_round = @tournament.matches.select{|m| m.round == 1 && m.wrestler1.name == "Test4"}.first + wrestler_four_first_round_opponent = wrestler_four_first_round.wrestler2.id + wrestler_two_first_round.wrestler1.destroy + + wrestlers = @tournament.wrestlers + wrestler_three = wrestlers.select{|w| w.name == "Test3"}.first + wrestler_three.original_seed = 2 + wrestler_three.save + wrestler_four = wrestlers.select{|w| w.name == "Test4"}.first + wrestler_four.original_seed = 3 + wrestler_four.save + GenerateTournamentMatches.new(@tournament.reload).generate + matches = @tournament.reload.matches + + assert(matches.select{|m| m.round == 1 && m.w2 == wrestler_four_first_round_opponent}.first.loser1_name == "BYE") + end + + test "Swapping seeds should change just the bracket line of the two wrestlers swapped" do + wrestlers = @tournament.wrestlers + test_one_bracket_line_original = wrestlers.select{|w|w.name == "Test1"}.first.bracket_line + test_two_bracket_line_original = wrestlers.select{|w|w.name == "Test2"}.first.bracket_line + test_three_bracket_line_original = wrestlers.select{|w|w.name == "Test3"}.first.bracket_line + test_four_bracket_line_original = wrestlers.select{|w|w.name == "Test4"}.first.bracket_line + test_five_bracket_line_original = wrestlers.select{|w|w.name == "Test5"}.first.bracket_line + test_six_bracket_line_original = wrestlers.select{|w|w.name == "Test6"}.first.bracket_line + test_seven_bracket_line_original = wrestlers.select{|w|w.name == "Test7"}.first.bracket_line + test_eight_bracket_line_original = wrestlers.select{|w|w.name == "Test8"}.first.bracket_line + + wrestler_three = wrestlers.select{|w| w.name == "Test3"}.first + wrestler_three.original_seed = 4 + wrestler_three.save + wrestler_four = wrestlers.select{|w| w.name == "Test4"}.first + wrestler_four.original_seed = 3 + wrestler_four.save + + GenerateTournamentMatches.new(@tournament.reload).generate + + wrestlers = @tournament.reload.wrestlers + test_one_bracket_line_second = wrestlers.select{|w|w.name == "Test1"}.first.bracket_line + test_two_bracket_line_second = wrestlers.select{|w|w.name == "Test2"}.first.bracket_line + test_three_bracket_line_second = wrestlers.select{|w|w.name == "Test3"}.first.bracket_line + test_four_bracket_line_second = wrestlers.select{|w|w.name == "Test4"}.first.bracket_line + test_five_bracket_line_second = wrestlers.select{|w|w.name == "Test5"}.first.bracket_line + test_six_bracket_line_second = wrestlers.select{|w|w.name == "Test6"}.first.bracket_line + test_seven_bracket_line_second = wrestlers.select{|w|w.name == "Test7"}.first.bracket_line + test_eight_bracket_line_second = wrestlers.select{|w|w.name == "Test8"}.first.bracket_line + + # Other people not swapped + assert(test_one_bracket_line_original == test_one_bracket_line_second) + assert(test_two_bracket_line_original == test_two_bracket_line_second) + assert(test_five_bracket_line_original == test_five_bracket_line_second) + assert(test_six_bracket_line_original == test_six_bracket_line_second) + assert(test_seven_bracket_line_original == test_seven_bracket_line_second) + assert(test_eight_bracket_line_original == test_eight_bracket_line_second) + # Two people swapped + assert(test_three_bracket_line_original == test_four_bracket_line_second) + assert(test_four_bracket_line_original == test_three_bracket_line_second) + end + + test "Changing a wrestler from not seeded to seeded should only change his line and the person who had the line they now get" do + matches_original = @tournament.matches.select{|m| m.round == 1} + original_wrestler4_opponent_name = matches_original.select{|m| m.wrestler1.name == "Test4"}.first.wrestler2.name + + wrestler_seven = @tournament.wrestlers.select{|w| w.name == "Test7"}.first + wrestler_seven.original_seed = 5 + wrestler_seven.save + + GenerateTournamentMatches.new(@tournament.reload).generate + + matches_second = @tournament.reload.matches.select{|m| m.round == 1} + # everyone else should have the same opponent + matches_original.each do |match| + match_wrestler1_name = @tournament.wrestlers.select{|w| w.id == match.w1}.first.name + match_wrestler2_name = @tournament.wrestlers.select{|w| w.id == match.w2}.first.name + matching_second_match = matches_second.select{|m| m.bracket_position_number == match.bracket_position_number}.first + match_second_wrestler1_name = @tournament.wrestlers.select{|w| w.id == matching_second_match.w1}.first.name + match_second_wrestler2_name = @tournament.wrestlers.select{|w| w.id == matching_second_match.w2}.first.name + # Test4 should now wrestle Test7 since Test7 is now 5th seed + if match_wrestler1_name == "Test4" + assert match_second_wrestler2_name == "Test7" + # Test4's original opponenet should now wrestle Test7's original opponent + elsif match_wrestler2_name == "Test7" + assert match_second_wrestler2_name == original_wrestler4_opponent_name + # Everyone else should have their original opponent + else + assert match_wrestler2_name == match_second_wrestler2_name + end + end + end + +end \ No newline at end of file