From a709cb5c69cd91beacace052f871503e8f332a4d Mon Sep 17 00:00:00 2001 From: Jacob Cody Wimer Date: Fri, 3 Jan 2020 12:54:11 -0500 Subject: [PATCH] Fixed pool order deducted points bug --- .../bracket_advancement/pool_order.rb | 53 +++++++++---------- test/integration/pool_order_test.rb | 32 +++++++++++ 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/app/services/bracket_advancement/pool_order.rb b/app/services/bracket_advancement/pool_order.rb index 40e323e..9858965 100644 --- a/app/services/bracket_advancement/pool_order.rb +++ b/app/services/bracket_advancement/pool_order.rb @@ -18,6 +18,8 @@ class PoolOrder def setOriginalPoints @wrestlers.each do |w| + w.pool_placement_tiebreaker = nil + w.pool_placement = nil w.poolAdvancePoints = w.pool_wins.size end end @@ -31,42 +33,44 @@ class PoolOrder def wrestlersWithSamePoints @wrestlers.each do |w| - wrestlersWithSamePoints = @wrestlers.select{|wr| wr.poolAdvancePoints == w.poolAdvancePoints} - if wrestlersWithSamePoints.size > 0 - return wrestlersWithSamePoints + wrestlersWithSamePointsLocal = @wrestlers.select{|wr| wr.poolAdvancePoints == w.poolAdvancePoints} + if wrestlersWithSamePointsLocal.size > 1 + return wrestlersWithSamePointsLocal end end + return [] end def ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) if wrestlersWithSamePoints.size == originalTieSize - yield + return true + else + return false end end def breakTie originalTieSize = wrestlersWithSamePoints.size - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { deductedPoints } + deductedPoints(originalTieSize) if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) if originalTieSize == 2 - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { headToHead } + headToHead if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) end - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { teamPoints } - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { mostFalls } - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { mostTechs } - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { mostMajors } - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { mostDecisionPointsScored } - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { fastest_pins } - ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) { coinFlip } + teamPoints if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) + mostFalls if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) + mostTechs if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) + mostMajors if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) + mostDecisionPointsScored if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) + fastest_pins if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) + coinFlip if ifWrestlersWithSamePointsIsSameAsOriginal(originalTieSize) end def headToHead wrestlersWithSamePoints.each do |wr| otherWrestler = wrestlersWithSamePoints.select{|w| w.id != wr.id}.first - if wr.match_against(otherWrestler).first.winner_id == wr.id + if otherWrestler and wr.match_against(otherWrestler).first.winner_id == wr.id addPointsToWrestlersAhead(wr) wr.pool_placement_tiebreaker = "Head to Head" - wr.save addPoints(wr) end end @@ -83,7 +87,7 @@ class PoolOrder end end - def deductedPoints + def deductedPoints(originalTieSize) pointsArray = [] wrestlersWithSamePoints.each do |w| pointsArray << w.total_points_deducted @@ -91,10 +95,11 @@ class PoolOrder leastPoints = pointsArray.min wrestlersWithLeastDeductedPoints = wrestlersWithSamePoints.select{|w| w.total_points_deducted == leastPoints} addPointsToWrestlersAhead(wrestlersWithLeastDeductedPoints.first) - wrestlersWithLeastDeductedPoints.each do |wr| - wr.pool_placement_tiebreaker = "Least Deducted Points" - wr.save - addPoints(wr) + if wrestlersWithLeastDeductedPoints.size != originalTieSize + wrestlersWithLeastDeductedPoints.each do |wr| + wr.pool_placement_tiebreaker = "Least Deducted Points" + addPoints(wr) + end end end @@ -108,7 +113,6 @@ class PoolOrder addPointsToWrestlersAhead(wrestlersWithMostPoints.first) wrestlersWithMostPoints.each do |wr| wr.pool_placement_tiebreaker = "Points Scored" - wr.save addPoints(wr) end secondPoints = pointsArray.sort[-2] @@ -116,7 +120,6 @@ class PoolOrder addPointsToWrestlersAhead(wrestlersWithSecondMostPoints.first) wrestlersWithSecondMostPoints.each do |wr| wr.pool_placement_tiebreaker = "Points Scored" - wr.save addPoints(wr) end end @@ -135,7 +138,6 @@ class PoolOrder addPointsToWrestlersAhead(wrestlersWithFastestPin.first) wrestlersWithFastestPin.each do |wr| wr.pool_placement_tiebreaker = "Pin Time" - wr.save addPoints(wr) end end @@ -151,7 +153,6 @@ class PoolOrder addPointsToWrestlersAhead(wrestlersSortedByTeamPoints.first) wrestlersSortedByTeamPoints.each do |wr| wr.pool_placement_tiebreaker = "Team Points" - wr.save addPoints(wr) end end @@ -166,7 +167,6 @@ class PoolOrder addPointsToWrestlersAhead(wrestlersSortedByFallWins.first) wrestlersSortedByFallWins.each do |wr| wr.pool_placement_tiebreaker = "Most Pins" - wr.save addPoints(wr) end end @@ -181,7 +181,6 @@ class PoolOrder addPointsToWrestlersAhead(wrestlersSortedByTechWins.first) wrestlersSortedByTechWins.each do |wr| wr.pool_placement_tiebreaker = "Most Techs" - wr.save addPoints(wr) end end @@ -196,7 +195,6 @@ class PoolOrder addPointsToWrestlersAhead(wrestlersSortedByMajorWins.first) wrestlersSortedByMajorWins.each do |wr| wr.pool_placement_tiebreaker = "Most Majors" - wr.save addPoints(wr) end end @@ -204,7 +202,6 @@ class PoolOrder def coinFlip wrestler = wrestlersWithSamePoints.sample wrestler.pool_placement_tiebreaker = "Coin Flip" - wrestler.save addPointsToWrestlersAhead(wrestler) addPoints(wrestler) end diff --git a/test/integration/pool_order_test.rb b/test/integration/pool_order_test.rb index 782503e..4878a21 100644 --- a/test/integration/pool_order_test.rb +++ b/test/integration/pool_order_test.rb @@ -63,6 +63,24 @@ class PoolAdvancementTest < ActionDispatch::IntegrationTest end_match(match_wrestler_vs("Test5","Test6"),"Test5") end + def finishWithTieMostTeamPointsSecondPlace + end_match(match_wrestler_vs("Test1","Test2"),"Test1") + end_match(match_wrestler_vs("Test1","Test3"),"Test1") + end_match(match_wrestler_vs("Test1","Test4"),"Test1") + end_match(match_wrestler_vs("Test1","Test5"),"Test1") + end_match(match_wrestler_vs("Test1","Test6"),"Test1") + end_match_with_pin(match_wrestler_vs("Test2","Test3"),"Test2") + end_match(match_wrestler_vs("Test2","Test4"),"Test4") + end_match(match_wrestler_vs("Test2","Test5"),"Test2") + end_match(match_wrestler_vs("Test2","Test6"),"Test2") + end_match(match_wrestler_vs("Test3","Test4"),"Test3") + end_match(match_wrestler_vs("Test3","Test5"),"Test3") + end_match(match_wrestler_vs("Test3","Test6"),"Test3") + end_match(match_wrestler_vs("Test4","Test5"),"Test4") + end_match(match_wrestler_vs("Test4","Test6"),"Test4") + end_match(match_wrestler_vs("Test5","Test6"),"Test5") + end + def finishWithTieMostTeamPointsTwoWayTie end_match_with_pin(match_wrestler_vs("Test1","Test2"),"Test1") end_match_with_pin(match_wrestler_vs("Test1","Test3"),"Test3") @@ -273,6 +291,20 @@ class PoolAdvancementTest < ActionDispatch::IntegrationTest assert Wrestler.find(translate_name_to_id("Test6")).pool_placement = 6 end + test "Pool order three way tie with most team points where first place won by wins" do + finishWithTieMostTeamPointsSecondPlace + assert Wrestler.find(translate_name_to_id("Test1")).pool_placement = 1 + assert Wrestler.find(translate_name_to_id("Test1")).pool_placement_tiebreaker = "" + assert Wrestler.find(translate_name_to_id("Test2")).pool_placement = 2 + assert Wrestler.find(translate_name_to_id("Test2")).pool_placement_tiebreaker = "Team Points" + assert Wrestler.find(translate_name_to_id("Test3")).pool_placement = 3 + assert Wrestler.find(translate_name_to_id("Test3")).pool_placement_tiebreaker = "Head to Head" + assert Wrestler.find(translate_name_to_id("Test4")).pool_placement = 4 + assert Wrestler.find(translate_name_to_id("Test4")).pool_placement_tiebreaker = "" + assert Wrestler.find(translate_name_to_id("Test5")).pool_placement = 5 + assert Wrestler.find(translate_name_to_id("Test6")).pool_placement = 6 + end + test "Pool order three way tie with most team points but most team points are tied between two wrestlers" do finishWithTieMostTeamPointsTwoWayTie assert Wrestler.find(translate_name_to_id("Test1")).pool_placement = 2