mirror of
https://github.com/jcwimer/wrestlingApp
synced 2026-03-24 17:04:43 +00:00
Added clarifying documentation for BYE points as well as fixed logic.
This commit is contained in:
@@ -54,29 +54,20 @@ class CalculateWrestlerTeamScore
|
||||
def byePoints
|
||||
points = 0
|
||||
if @tournament.tournament_type == "Pool to bracket"
|
||||
if @wrestler.pool_wins.size >= 1 and @wrestler.has_a_pool_bye == true
|
||||
if pool_bye_points_eligible?
|
||||
points += 2
|
||||
end
|
||||
end
|
||||
if @tournament.tournament_type.include? "Regular Double Elimination"
|
||||
if @wrestler.championship_advancement_wins.size > 0 or @wrestler.matches_won.select{|m| m.bracket_position == "1/2" and m.win_type != "BYE"}.size > 0
|
||||
# if they have a win in the championship round or if they got a bye all the way to finals and won the finals
|
||||
points += @wrestler.championship_byes.size * 2
|
||||
if @tournament.tournament_type.include? "Double Elimination"
|
||||
if @wrestler.championship_advancement_wins.any? &&
|
||||
@wrestler.championship_byes.any? &&
|
||||
any_bye_round_had_wrestled_match?(@wrestler.championship_byes)
|
||||
points += 2
|
||||
end
|
||||
if @wrestler.consolation_advancement_wins.size > 0 or @wrestler.matches_won.select{|m| m.bracket_position == "3/4" and m.win_type != "BYE"}.size > 0
|
||||
# if they have a win in the consolation round or if they got a bye all the way to 3rd/4th match and won
|
||||
points += @wrestler.consolation_byes.size * 1
|
||||
end
|
||||
end
|
||||
if @tournament.tournament_type.include? "Modified 16 Man Double Elimination"
|
||||
if @wrestler.championship_advancement_wins.size > 0 or @wrestler.matches_won.select{|m| m.bracket_position == "1/2" and m.win_type != "BYE"}.size > 0
|
||||
# if they have a win in the championship round or if they got a bye all the way to finals and won the finals
|
||||
points += @wrestler.championship_byes.size * 2
|
||||
end
|
||||
if @wrestler.consolation_advancement_wins.size > 0 or @wrestler.matches_won.select{|m| m.bracket_position == "5/6" and m.win_type != "BYE"}.size > 0
|
||||
# if they have a win in the consolation round or if they got a bye all the way to 5th/6th match and won
|
||||
# since the consolation bracket goes to 5/6 in a modified tournament
|
||||
points += @wrestler.consolation_byes.size * 1
|
||||
if @wrestler.consolation_advancement_wins.any? &&
|
||||
@wrestler.consolation_byes.any? &&
|
||||
any_bye_round_had_wrestled_match?(@wrestler.consolation_byes)
|
||||
points += 1
|
||||
end
|
||||
end
|
||||
return points
|
||||
@@ -86,4 +77,30 @@ class CalculateWrestlerTeamScore
|
||||
(@wrestler.pin_wins.size * 2) + (@wrestler.tech_wins.size * 1.5) + (@wrestler.major_wins.size * 1)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def pool_bye_points_eligible?
|
||||
return false unless @wrestler.pool_wins.size >= 1
|
||||
return false unless @wrestler.weight.pools.to_i > 1
|
||||
|
||||
wrestler_pool_size = @wrestler.weight.wrestlers_in_pool(@wrestler.pool).size
|
||||
largest_pool_size = (1..@wrestler.weight.pools).map { |pool_number| @wrestler.weight.wrestlers_in_pool(pool_number).size }.max
|
||||
|
||||
wrestler_pool_size < largest_pool_size
|
||||
end
|
||||
|
||||
def any_bye_round_had_wrestled_match?(bye_matches)
|
||||
bye_matches.any? do |bye_match|
|
||||
next false if bye_match.round.nil?
|
||||
|
||||
@wrestler.weight.matches.any? do |match|
|
||||
next false if match.id == bye_match.id
|
||||
next false if match.round != bye_match.round
|
||||
next false if match.is_consolation_match != bye_match.is_consolation_match
|
||||
|
||||
match.finished == 1 && match.win_type.present? && match.win_type != "BYE"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
<li>Win by major: 1pt extra</li>
|
||||
<li>Win by tech fall: 1.5pt extra</li>
|
||||
<li>Win by fall, default, dq: 2pt extra</li>
|
||||
<li>BYE points: 2pt (if you win at least 1 match in a pool with a BYE)</li>
|
||||
<li>BYE points: 2pt (if you win at least 1 match in a pool with a BYE). - This only applies if your pool has more BYEs than other pools in your bracket. This does not apply to weight classes with 1 pool.</li>
|
||||
</ul>
|
||||
<p>See placement points below (based on the largest bracket of the tournament)</p>
|
||||
<h4>Pool Types</h4>
|
||||
@@ -71,7 +71,7 @@
|
||||
<li>Win by major: 1pt extra</li>
|
||||
<li>Win by tech: 1.5pt extra</li>
|
||||
<li>Win by fall, default, dq, etc: 2pt extra</li>
|
||||
<li>BYE points: 2pts if you have a bye in the championship bracket and win the next match. 1pt if you have a bye in the consolation bracket and win the next match.</li>
|
||||
<li>BYE points: 2pts if you have a bye in the championship bracket and win the next match. 1pt if you have a bye in the consolation bracket and win the next match. - This only applies if you received a bye in a round with at least 1 match in your backet.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>Modified 16 Man Double Elimination Information</h3>
|
||||
@@ -142,7 +142,7 @@
|
||||
<br>
|
||||
<h3>Future Plans</h3>
|
||||
<br>
|
||||
<p>Future development plans to support 32 and 64 man regulard double elimination, modified (5 per day match rule) 32 man double elimination, and true second double elimination brackets are underway.</p>
|
||||
<p>Future development plans are underway to make the application more flexible, make changes after weigh ins easier, and to add functionality for a live scoreboard.</p>
|
||||
<br>
|
||||
<h3>Contact</h3>
|
||||
<br>
|
||||
|
||||
@@ -30,6 +30,15 @@ class DoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
return wrestler
|
||||
end
|
||||
|
||||
def wrestle_other_match_in_round(reference_match, conso: false)
|
||||
match = @tournament.matches.reload
|
||||
.select { |m| m.round == reference_match.round && m.id != reference_match.id && m.is_consolation_match == conso }
|
||||
.first
|
||||
return if match.nil?
|
||||
|
||||
winner_by_name("Test2", match)
|
||||
end
|
||||
|
||||
test "Wrestlers get points for byes in the championship rounds" do
|
||||
matches = @tournament.matches.reload
|
||||
round1 = matches.select{|m| m.bracket_position == "Bracket Round of 16"}.first
|
||||
@@ -37,9 +46,10 @@ class DoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
semi = matches.select{|m| m.bracket_position == "Semis"}.first
|
||||
winner_by_name_by_bye("Test1", round1)
|
||||
winner_by_name_by_bye("Test1", quarter)
|
||||
wrestle_other_match_in_round(round1, conso: false)
|
||||
winner_by_name("Test1", semi)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 4
|
||||
assert wrestler_points_calc.byePoints == 2
|
||||
end
|
||||
|
||||
test "Wrestlers get points for byes in the consolation rounds" do
|
||||
@@ -49,9 +59,10 @@ class DoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
semi = matches.select{|m| m.bracket_position == "Conso Semis"}.first
|
||||
winner_by_name_by_bye("Test1", conso_r8_1)
|
||||
winner_by_name_by_bye("Test1", quarter)
|
||||
wrestle_other_match_in_round(conso_r8_1, conso: true)
|
||||
winner_by_name("Test1", semi)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 2
|
||||
assert wrestler_points_calc.byePoints == 1
|
||||
end
|
||||
|
||||
test "Wrestlers do not get bye points if they get byes to 1st/2nd and win by bye" do
|
||||
@@ -93,7 +104,19 @@ class DoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
winner_by_name_by_bye("Test1", semi)
|
||||
winner_by_name("Test1", final)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 6
|
||||
assert wrestler_points_calc.byePoints == 0
|
||||
end
|
||||
|
||||
test "Wrestlers do not get championship bye points when no championship match is wrestled in those bye rounds" do
|
||||
matches = @tournament.matches.reload
|
||||
round1 = matches.select{|m| m.bracket_position == "Bracket Round of 16"}.first
|
||||
quarter = matches.select{|m| m.bracket_position == "Quarter"}.first
|
||||
semi = matches.select{|m| m.bracket_position == "Semis"}.first
|
||||
winner_by_name_by_bye("Test1", round1)
|
||||
winner_by_name_by_bye("Test1", quarter)
|
||||
winner_by_name("Test1", semi)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 0
|
||||
end
|
||||
|
||||
test "Wrestlers do not get bye points if they get byes to 3rd/4th and win by decision" do
|
||||
@@ -107,6 +130,20 @@ class DoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
winner_by_name_by_bye("Test1", semi)
|
||||
winner_by_name("Test1", final)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 3
|
||||
assert wrestler_points_calc.byePoints == 0
|
||||
end
|
||||
|
||||
test "Wrestlers do not get conso bye points when no conso match is wrestled in those rounds" do
|
||||
matches = @tournament.matches.reload
|
||||
conso_r8_1 = matches.select{|m| m.bracket_position == "Conso Round of 8.1"}.first
|
||||
quarter = matches.select{|m| m.bracket_position == "Conso Quarter"}.first
|
||||
semi = matches.select{|m| m.bracket_position == "Conso Semis"}.first
|
||||
final = matches.select{|m| m.bracket_position == "3/4"}.first
|
||||
winner_by_name_by_bye("Test1", conso_r8_1)
|
||||
winner_by_name_by_bye("Test1", quarter)
|
||||
winner_by_name_by_bye("Test1", semi)
|
||||
winner_by_name("Test1", final)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 0
|
||||
end
|
||||
end
|
||||
@@ -30,6 +30,15 @@ class ModifiedDoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
return wrestler
|
||||
end
|
||||
|
||||
def wrestle_other_match_in_round(reference_match, conso: false)
|
||||
match = @tournament.matches.reload
|
||||
.select { |m| m.round == reference_match.round && m.id != reference_match.id && m.is_consolation_match == conso }
|
||||
.first
|
||||
return if match.nil?
|
||||
|
||||
winner_by_name("Test2", match)
|
||||
end
|
||||
|
||||
test "Wrestlers get points for byes in the championship rounds" do
|
||||
matches = @tournament.matches.reload
|
||||
round1 = matches.select{|m| m.round == 1}.first
|
||||
@@ -37,9 +46,10 @@ class ModifiedDoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
semi = matches.select{|m| m.bracket_position == "Semis"}.first
|
||||
winner_by_name_by_bye("Test1", round1)
|
||||
winner_by_name_by_bye("Test1", quarter)
|
||||
wrestle_other_match_in_round(round1, conso: false)
|
||||
winner_by_name("Test1", semi)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 4
|
||||
assert wrestler_points_calc.byePoints == 2
|
||||
end
|
||||
|
||||
test "Wrestlers get points for byes in the consolation rounds" do
|
||||
@@ -49,9 +59,10 @@ class ModifiedDoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
semi = matches.select{|m| m.bracket_position == "Conso Semis"}.first
|
||||
winner_by_name_by_bye("Test1", round2)
|
||||
winner_by_name_by_bye("Test1", quarter)
|
||||
wrestle_other_match_in_round(round2, conso: true)
|
||||
winner_by_name("Test1", semi)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 2
|
||||
assert wrestler_points_calc.byePoints == 1
|
||||
end
|
||||
|
||||
test "Wrestlers do not get bye points if they get byes to 1st/2nd and win by bye" do
|
||||
@@ -93,7 +104,19 @@ class ModifiedDoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
winner_by_name_by_bye("Test1", semi)
|
||||
winner_by_name("Test1", final)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 6
|
||||
assert wrestler_points_calc.byePoints == 0
|
||||
end
|
||||
|
||||
test "Wrestlers do not get championship bye points when no championship match is wrestled in those bye rounds" do
|
||||
matches = @tournament.matches.reload
|
||||
round1 = matches.select{|m| m.round == 1}.first
|
||||
quarter = matches.select{|m| m.bracket_position == "Quarter"}.first
|
||||
semi = matches.select{|m| m.bracket_position == "Semis"}.first
|
||||
winner_by_name_by_bye("Test1", round1)
|
||||
winner_by_name_by_bye("Test1", quarter)
|
||||
winner_by_name("Test1", semi)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 0
|
||||
end
|
||||
|
||||
test "Wrestlers do not get bye points if they get byes to 5th/6th and win by decision" do
|
||||
@@ -107,6 +130,20 @@ class ModifiedDoubleEliminationWrestlerScore < ActionDispatch::IntegrationTest
|
||||
winner_by_name_by_bye("Test1", semi)
|
||||
winner_by_name("Test1", final)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 3
|
||||
assert wrestler_points_calc.byePoints == 0
|
||||
end
|
||||
|
||||
test "Wrestlers do not get conso bye points when no conso match is wrestled in those rounds" do
|
||||
matches = @tournament.matches.reload
|
||||
round2 = matches.select{|m| m.bracket_position == "Conso Round of 8"}.first
|
||||
quarter = matches.select{|m| m.bracket_position == "Conso Quarter"}.first
|
||||
semi = matches.select{|m| m.bracket_position == "Conso Semis"}.first
|
||||
final = matches.select{|m| m.bracket_position == "5/6"}.first
|
||||
winner_by_name_by_bye("Test1", round2)
|
||||
winner_by_name_by_bye("Test1", quarter)
|
||||
winner_by_name_by_bye("Test1", semi)
|
||||
winner_by_name("Test1", final)
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(get_wretler_by_name("Test1"))
|
||||
assert wrestler_points_calc.byePoints == 0
|
||||
end
|
||||
end
|
||||
46
test/integration/pool_bye_points_rules_test.rb
Normal file
46
test/integration/pool_bye_points_rules_test.rb
Normal file
@@ -0,0 +1,46 @@
|
||||
require 'test_helper'
|
||||
|
||||
class PoolByePointsRulesTest < ActionDispatch::IntegrationTest
|
||||
def finish_pool_match_for_wrestler(wrestler)
|
||||
match = wrestler.pool_matches.select { |m| m.finished != 1 }.first
|
||||
return if match.nil?
|
||||
|
||||
match.w1 = wrestler.id
|
||||
match.winner_id = wrestler.id
|
||||
match.finished = 1
|
||||
match.win_type = "Decision"
|
||||
match.score = "1-0"
|
||||
match.save!
|
||||
end
|
||||
|
||||
test "single pool wrestlers do not get pool bye points" do
|
||||
create_pool_tournament_single_weight(6)
|
||||
wrestler = @tournament.weights.first.wrestlers.first
|
||||
finish_pool_match_for_wrestler(wrestler)
|
||||
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(wrestler)
|
||||
assert_equal 0, wrestler_points_calc.byePoints
|
||||
end
|
||||
|
||||
test "pool bye points are not awarded when pools are even" do
|
||||
create_pool_tournament_single_weight(8)
|
||||
wrestler = @tournament.weights.first.wrestlers.first
|
||||
finish_pool_match_for_wrestler(wrestler)
|
||||
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(wrestler)
|
||||
assert_equal 0, wrestler_points_calc.byePoints
|
||||
end
|
||||
|
||||
test "pool bye points are awarded once when wrestler is in a smaller pool" do
|
||||
create_pool_tournament_single_weight(9)
|
||||
weight = @tournament.weights.first
|
||||
smallest_pool = (1..weight.pools).min_by { |pool_number| weight.wrestlers_in_pool(pool_number).size }
|
||||
wrestler = weight.wrestlers_in_pool(smallest_pool).first
|
||||
|
||||
finish_pool_match_for_wrestler(wrestler)
|
||||
finish_pool_match_for_wrestler(wrestler)
|
||||
|
||||
wrestler_points_calc = CalculateWrestlerTeamScore.new(wrestler)
|
||||
assert_equal 2, wrestler_points_calc.byePoints
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user