Skip to content

Instantly share code, notes, and snippets.

@JonahMoses
Created November 25, 2013 02:53
Show Gist options
  • Save JonahMoses/7635526 to your computer and use it in GitHub Desktop.
Save JonahMoses/7635526 to your computer and use it in GitHub Desktop.
scrabble
Bundler.require
require './lib/scrabble'
require './lib/player'
require 'minitest/autorun'
require 'minitest/pride'
class PlayerTest < MiniTest::Unit::TestCase
def test_a_player_accepts_a_name
player = Player.new("Katrina")
assert_equal "Katrina", player.name
end
def test_a_player_defaults_to_zero_score
player = Player.new("Katrina")
assert_equal 0, player.score
end
def test_a_player_can_increase_score_by_playing_a_word
scrabble = Minitest::Mock.new
scrabble.expect(:score, 8, [String])
player = Player.new("Katrina", scrabble)
player.plays("Hello")
assert_equal 8, player.score
end
def test_a_player_can_accumulate_score
scrabble = Minitest::Mock.new
scrabble.expect(:score, 25, [String])
scrabble.expect(:score, 25, [String])
player = Player.new("Katrina", scrabble)
player.plays("Hello")
player.plays("Bob")
assert_equal 50, player.score
end
def test_you_can_see_which_player_is_leading
scrabble = Minitest::Mock.new
scrabble.expect(:score, 50, [String])
scrabble.expect(:score, 25, [String])
player1 = Player.new("Katrina", scrabble)
player2 = Player.new("Frank", scrabble)
player1.plays("Hello")
player2.plays("Bob")
assert_equal 50, player1.score
assert_equal 25, player2.score
assert_equal false, player1.leading?(player2)
end
def test_a_player_can_have_multiple_letters
player1 = Player.new("Katrina")
assert_equal [], player1.letters
end
def test_a_player_can_add_a_letter
player1 = Player.new("Katrina")
assert_equal [], player1.letters
player1.add_letter('a')
assert_equal ['a'], player1.letters
end
def test_a_player_can_add_multiple_letters
player1 = Player.new("Katrina")
player1.add_letters('a', 'b', 'c')
assert_equal ['a', 'b', 'c'], player1.letters
end
def test_letters_are_removed_when_played
player1 = Player.new("Katrina")
player1.add_letters('a', 'b', 'c')
assert_equal ['a', 'b', 'c'], player1.letters
player1.plays('abc')
assert_equal [], player1.letters
end
def test_only_one_of_the_letters_is_removed_when_played
player1 = Player.new("Katrina")
player1.add_letters('w', 'i', 'n', 'n', 'e', 'r')
assert_equal ['w', 'i', 'n', 'n', 'e', 'r'], player1.letters
player1.plays('win')
assert_equal ['n', 'e', 'r'], player1.letters
end
def test_it_can_check_if_it_can_play_a_word
player1 = Player.new("Katrina")
player1.add_letters('w', 'a', 'n', 'd', 'x', 'e', 'j')
assert player1.can_play?("wand")
refute player1.can_play?("wind")
end
def test_it_can_check_if_it_can_play_a_word_with_multiple_letter_issues
player1 = Player.new("Katrina")
player1.add_letters('f', 'u', 'n', 'y')
assert player1.can_play?("fun")
refute player1.can_play?("funny")
end
end
require './lib/scrabble'
require 'pry'
class Player
attr_reader :name,
:score,
:letters
def initialize(name, scrabble = Scrabble)
@name = name
@score = 0
@scrabble = scrabble
@letters = []
end
def plays(word)
# if can_play?(word)
increment_score(@scrabble.score(word))
removes_played_letters(word)
# else
# raise "#{@name} cannot play #{word}, has letters #{@letters}"
# end
end
def leading?(player)
player.score > self.score
end
def add_letter(letter)
@letters << letter
end
def add_letters(*letters)
letters.each do |letter|
@letters << letter
end
end
# def can_play?(word)
# possible_letters = @letters
# word.each_char do |char|
# if possible_letters.index(char).nil?
# return false
# else
# possible_letters.delete_at(possible_letters.index(char))
# end
# end
def can_play?(word)
letters = @letters
word.each_char do |char|
unless letters.delete_at(letters.index(char) || letters.length)
return false
end
end
end
# doesn't work with the "funny" example
# def can_play?(word)
# word.chars.all? do |char|
# @letters.include?(char)
# end
# end
private
def removes_played_letters(word)
characters = word.split("")
characters.each do |char|
index_of_char = @letters.index(char)
@letters.delete_at(index_of_char) if index_of_char
end
end
def increment_score(score)
@score += score
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment