Commit
Inspired by the challenge posed by [RubyTapas Episode 472](https://www.rubytapas.com/2017/03/27/episode-472-contextual-identity/) I paired with @pachonk to work up to this point. We implemented a Deck class which extends beyond what Avdi's minimalistic approach begins with. Looking forward to seeing what Avdi's recommended approach looks like.
- Loading branch information
There are no files selected for viewing
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,67 @@ | |||
#! /usr/bin/env ruby | |||
|
|||
puts "let's play some poker" | |||
|
|||
class Card | |||
attr_reader :rank, :suit | |||
This comment has been minimized.
Sorry, something went wrong. |
|||
attr_reader :player | |||
|
|||
def initialize(suit, rank) | |||
@rank = rank | |||
@suit = suit | |||
end | |||
|
|||
def player=(object) | |||
@player = object.object_id | |||
end | |||
|
|||
include Comparable | |||
def <=>(other) | |||
[rank, suit] <=> [other.rank, other.suit] | |||
end | |||
|
|||
def inspect | |||
"#{self.class}: #{rank} of #{suit}" | |||
end | |||
def to_s; inspect; end | |||
This comment has been minimized.
Sorry, something went wrong.
grepsedawk
Collaborator
|
|||
end | |||
|
|||
class Deck | |||
attr_reader :cards | |||
|
|||
def initialize | |||
@cards = %w[Hearts Spades Clubs Diamonds] | |||
.product((1..13).to_a) | |||
This comment has been minimized.
Sorry, something went wrong.
grepsedawk
Collaborator
|
|||
.map{|r,s| Card.new(r,s) } | |||
end | |||
|
|||
def ==(other) | |||
self.cards == other.cards | |||
end | |||
|
|||
def sort | |||
cards.sort | |||
end | |||
|
|||
def shuffle | |||
self.cards = cards.shuffle | |||
return self | |||
end | |||
|
|||
def deal(player, count = 1) | |||
This comment has been minimized.
Sorry, something went wrong. |
|||
raise ArgumentError, 'deal count must be an integer' unless count.is_a? Integer | |||
This comment has been minimized.
Sorry, something went wrong. |
|||
|
|||
cards.select {|card| card.player == nil } | |||
.take(count) | |||
.each { |card| card.player = player } | |||
end | |||
|
|||
def show_hand(object) | |||
cards.select {|card| card.player == object.object_id } | |||
This comment has been minimized.
Sorry, something went wrong.
grepsedawk
Collaborator
|
|||
end | |||
|
|||
private | |||
|
|||
attr_writer :cards | |||
end | |||
|
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,85 @@ | |||
#! /usr/bin/env ruby | |||
|
|||
require 'minitest/autorun' | |||
require_relative 'poker' | |||
|
|||
class CardTest < Minitest::Test | |||
def test_exists | |||
Card | |||
end | |||
end | |||
|
|||
class DeckTest < Minitest::Test | |||
def test_exists | |||
Deck | |||
end | |||
|
|||
def test_deal_does_not_accept_non_integer | |||
deck = Deck.new | |||
assert_raises(ArgumentError) { deck.deal(:p1, 'hi') } | |||
end | |||
|
|||
def test_deal_takes_number_of_cards_to_deal | |||
deck = Deck.new | |||
assert_equal 5, deck.deal(:p1, 5).length | |||
end | |||
|
|||
def test_deal_uses_one_by_default | |||
deck = Deck.new | |||
assert_equal 1, deck.deal(:p1).length | |||
end | |||
|
|||
def test_deal_returns_an_array_of_cards | |||
deck = Deck.new | |||
assert deck.deal(:p1, 4).all? {|card| card.is_a? Card } | |||
end | |||
|
|||
def test_shuffle_scrambles_deck_cards | |||
reference_deck = Deck.new | |||
deck = Deck.new | |||
deck.shuffle | |||
refute deck.cards == reference_deck.cards | |||
end | |||
|
|||
def test_can_never_have_more_than_fifty_two_cards | |||
skip | |||
end | |||
|
|||
def test_can_never_have_less_than_fifty_two_cards | |||
skip | |||
end | |||
|
|||
def test_can_not_have_duplicate_cards | |||
skip | |||
reference_deck = Deck.new.sort | |||
played_deck = Deck.new.shuffle | |||
stacks = [] | |||
5.times { stacks << played_deck.deal(5) } | |||
game_deck = stacks.reduce(:+).sort | |||
|
|||
assert reference_deck.cards == game_deck.cards | |||
end | |||
|
|||
def test_cannot_deal_more_cards_than_deck_has | |||
skip | |||
end | |||
|
|||
def test_show_hand_returns_a_players_hand | |||
deck = Deck.new | |||
|
|||
deck.deal(:p1, 26) | |||
|
|||
assert_equal 26, deck.show_hand(:p1).count | |||
|
|||
deck.deal(:p2, 26) | |||
|
|||
assert_equal 26, deck.show_hand(:p2).count | |||
|
|||
cheat_cards = deck.show_hand(:p1).count do |card| | |||
deck.show_hand(:p2).include?(card) | |||
end | |||
|
|||
assert_equal 0, cheat_cards | |||
end | |||
end | |||
|
Combine all readers maybe.