class Bagel::Tennis::Checker

Constants

BREAK_POINT
MATCH_POINT
MINIMUM_GAMES_TO_WIN_SET
MINIMUM_POINTS_TO_WIN_GAME
MINIMUM_POINTS_TO_WIN_TIEBREAK
SETS_TO_WIN_MATCH
SET_POINT
TIEBREAK_AT

Public Class Methods

new(sets:, points:, server:) click to toggle source
# File lib/bagel/tennis/checker.rb, line 17
def initialize(sets:, points:, server:)
  @sets, @points, @server = sets, points, server
  @receiver = Player.opponent(server)
end

Public Instance Methods

break_point?() click to toggle source
# File lib/bagel/tennis/checker.rb, line 22
def break_point?
  next_point_wins_game?(receiver)
end
match_point?() click to toggle source
# File lib/bagel/tennis/checker.rb, line 30
def match_point?
  next_point_wins_match?(server) || next_point_wins_match?(receiver)
end
set_point?() click to toggle source
# File lib/bagel/tennis/checker.rb, line 26
def set_point?
  next_point_wins_set?(server) || next_point_wins_set?(receiver)
end
tiebreak?() click to toggle source
# File lib/bagel/tennis/checker.rb, line 34
def tiebreak?
  sets.last == Tennis::Checker::TIEBREAK_AT
end

Private Instance Methods

enough_games_won?(player, set) click to toggle source
# File lib/bagel/tennis/checker.rb, line 92
def enough_games_won?(player, set)
  games_for(player, set) >= MINIMUM_GAMES_TO_WIN_SET
end
games_for(player, set) click to toggle source
# File lib/bagel/tennis/checker.rb, line 44
def games_for(player, set)
  set[Player.index(player)]
end
more_games_than_opponent?(player, set) click to toggle source
# File lib/bagel/tennis/checker.rb, line 96
def more_games_than_opponent?(player, set)
  games_for(player, set) > games_for(Player.opponent(player), set)
end
next_game_wins_set?(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 56
def next_game_wins_set?(player)
  will_have_required_games?(sets.last, player) && will_have_game_margin?(sets.last, player)
end
next_point_wins_game?(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 48
def next_point_wins_game?(player)
  will_have_required_points?(player) && will_have_point_margin?(player)
end
next_point_wins_match?(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 60
def next_point_wins_match?(player)
  next_point_wins_set?(player) && next_set_wins_match?(player)
end
next_point_wins_set?(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 52
def next_point_wins_set?(player)
  next_point_wins_game?(player) && next_game_wins_set?(player)
end
next_set_wins_match?(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 64
def next_set_wins_match?(player)
  sets_won(player) + 1 == SETS_TO_WIN_MATCH
end
points_for(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 40
def points_for(player)
  points[Player.index(player)]
end
sets_won(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 84
def sets_won(player)
  sets.count { |set| won_set?(set, player) }
end
will_have_game_margin?(set, player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 80
def will_have_game_margin?(set, player)
  games_for(player, set) - games_for(Player.opponent(player), set) >= 1
end
will_have_point_margin?(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 76
def will_have_point_margin?(player)
  points_for(player) - points_for(Player.opponent(player)) >= 1
end
will_have_required_games?(set, player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 72
def will_have_required_games?(set, player)
  games_for(player, set) + 1 >= MINIMUM_GAMES_TO_WIN_SET
end
will_have_required_points?(player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 68
def will_have_required_points?(player)
  points_for(player) + 1 >= (tiebreak? ? MINIMUM_POINTS_TO_WIN_TIEBREAK : MINIMUM_POINTS_TO_WIN_GAME)
end
won_set?(set, player) click to toggle source
# File lib/bagel/tennis/checker.rb, line 88
def won_set?(set, player)
  enough_games_won?(player, set) && more_games_than_opponent?(player, set)
end