gambit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. data/AUTHORS +2 -0
  2. data/CHANGELOG +7 -0
  3. data/COPYING +340 -0
  4. data/INSTALL +23 -0
  5. data/LICENSE +7 -0
  6. data/README +25 -0
  7. data/Rakefile +87 -0
  8. data/TODO +6 -0
  9. data/examples/bird_wars/game.rb +434 -0
  10. data/examples/bird_wars/html/chest.rhtml +37 -0
  11. data/examples/bird_wars/html/combat.rhtml +38 -0
  12. data/examples/bird_wars/html/fight.rhtml +71 -0
  13. data/examples/bird_wars/html/fridge.rhtml +31 -0
  14. data/examples/bird_wars/html/help.rhtml +30 -0
  15. data/examples/bird_wars/html/house.rhtml +36 -0
  16. data/examples/bird_wars/html/images/albatross.jpg +0 -0
  17. data/examples/bird_wars/html/images/alka_seltzer_small.png +0 -0
  18. data/examples/bird_wars/html/images/bazooka_small.png +0 -0
  19. data/examples/bird_wars/html/images/bb_gun_small.png +0 -0
  20. data/examples/bird_wars/html/images/cat_small.png +0 -0
  21. data/examples/bird_wars/html/images/combat.png +0 -0
  22. data/examples/bird_wars/html/images/crossbow_small.png +0 -0
  23. data/examples/bird_wars/html/images/cuckoo.jpg +0 -0
  24. data/examples/bird_wars/html/images/fridge.png +0 -0
  25. data/examples/bird_wars/html/images/gull.jpg +0 -0
  26. data/examples/bird_wars/html/images/house.jpg +0 -0
  27. data/examples/bird_wars/html/images/items.png +0 -0
  28. data/examples/bird_wars/html/images/not_found.png +0 -0
  29. data/examples/bird_wars/html/images/note.jpg +0 -0
  30. data/examples/bird_wars/html/images/oil_small.png +0 -0
  31. data/examples/bird_wars/html/images/one_stone_small.png +0 -0
  32. data/examples/bird_wars/html/images/owl.jpg +0 -0
  33. data/examples/bird_wars/html/images/poisoned_seeds_small.png +0 -0
  34. data/examples/bird_wars/html/images/rice_small.png +0 -0
  35. data/examples/bird_wars/html/images/shotgun_small.png +0 -0
  36. data/examples/bird_wars/html/images/slingshot_small.png +0 -0
  37. data/examples/bird_wars/html/images/soda_rings_small.png +0 -0
  38. data/examples/bird_wars/html/images/spear_small.png +0 -0
  39. data/examples/bird_wars/html/images/stork.jpg +0 -0
  40. data/examples/bird_wars/html/images/weapons.png +0 -0
  41. data/examples/bird_wars/html/images/woodpecker.jpg +0 -0
  42. data/examples/bird_wars/html/images/you.jpg +0 -0
  43. data/examples/bird_wars/html/index.rhtml +13 -0
  44. data/examples/bird_wars/html/weapons.rhtml +35 -0
  45. data/examples/cli/blackjack.rb +86 -0
  46. data/examples/cli/go.rb +93 -0
  47. data/examples/cli/space_trader2/planet_data +12280 -0
  48. data/examples/cli/space_trader2/space_trader2.rb +248 -0
  49. data/examples/cli/space_trader2/world.rb +127 -0
  50. data/examples/cli/spacetrader.rb +262 -0
  51. data/examples/cli/yahtzee.rb +161 -0
  52. data/examples/galactic_courier/Rakefile +9 -0
  53. data/examples/galactic_courier/bin/galactic_courier.rb +44 -0
  54. data/examples/galactic_courier/html/console.rhtml +15 -0
  55. data/examples/galactic_courier/html/images/barren.jpg +0 -0
  56. data/examples/galactic_courier/html/images/industrial.jpg +0 -0
  57. data/examples/galactic_courier/html/images/jungle.jpg +0 -0
  58. data/examples/galactic_courier/html/images/oceanic.jpg +0 -0
  59. data/examples/galactic_courier/html/images/tundra.jpg +0 -0
  60. data/examples/galactic_courier/html/images/volcanic.jpg +0 -0
  61. data/examples/galactic_courier/lib/galaxy.rb +64 -0
  62. data/examples/galactic_courier/lib/planet.rb +30 -0
  63. data/examples/galactic_courier/lib/sector.rb +84 -0
  64. data/examples/galactic_courier/lib/station.rb +18 -0
  65. data/examples/galactic_courier/test/tc_galaxy.rb +24 -0
  66. data/examples/galactic_courier/test/tc_planet.rb +22 -0
  67. data/examples/galactic_courier/test/tc_sector.rb +55 -0
  68. data/examples/galactic_courier/test/ts_all.rb +12 -0
  69. data/examples/gambit_mail/html/compose.rhtml +39 -0
  70. data/examples/gambit_mail/html/index.rhtml +3 -0
  71. data/examples/gambit_mail/html/mailbox.rhtml +47 -0
  72. data/examples/gambit_mail/html/message.rhtml +34 -0
  73. data/examples/gambit_mail/mail.rb +75 -0
  74. data/lib/gambit.rb +10 -0
  75. data/lib/gambit/server.rb +269 -0
  76. data/lib/gambit/server/gambiterror.rb +28 -0
  77. data/lib/gambit/server/game.rb +185 -0
  78. data/lib/gambit/server/game/eventform.rb +174 -0
  79. data/lib/gambit/server/message.rb +85 -0
  80. data/lib/gambit/server/player.rb +40 -0
  81. data/lib/gambit/tools.rb +13 -0
  82. data/lib/gambit/tools/board.rb +275 -0
  83. data/lib/gambit/tools/cards.rb +11 -0
  84. data/lib/gambit/tools/cards/card.rb +158 -0
  85. data/lib/gambit/tools/cards/deck.rb +99 -0
  86. data/lib/gambit/tools/cards/hand.rb +86 -0
  87. data/lib/gambit/tools/cards/pile.rb +107 -0
  88. data/lib/gambit/tools/currency.rb +148 -0
  89. data/lib/gambit/tools/dice.rb +219 -0
  90. data/lib/gambit/tools/movehistory.rb +164 -0
  91. data/lib/gambit/tools/scorecard.rb +333 -0
  92. data/lib/gambit/viewable.rb +71 -0
  93. data/setup.rb +1360 -0
  94. data/test/tc_board.rb +167 -0
  95. data/test/tc_cards.rb +182 -0
  96. data/test/tc_currency.rb +99 -0
  97. data/test/tc_dice.rb +83 -0
  98. data/test/tc_error.rb +34 -0
  99. data/test/tc_event.rb +367 -0
  100. data/test/tc_game.rb +29 -0
  101. data/test/tc_message.rb +35 -0
  102. data/test/tc_movehistory.rb +38 -0
  103. data/test/tc_player.rb +60 -0
  104. data/test/tc_scorecard.rb +112 -0
  105. data/test/tc_views.rb +353 -0
  106. data/test/test_game.rb +19 -0
  107. data/test/test_view.rhtml +2 -0
  108. data/test/ts_all.rb +12 -0
  109. data/test/ts_server.rb +14 -0
  110. data/test/ts_tools.rb +14 -0
  111. metadata +183 -0
@@ -0,0 +1,38 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ # tc_movehistory.rb
4
+ #
5
+ # Created by James Edward Gray II on 2005-05-30.
6
+ # Copyright 2005 Gray Productions. All rights reserved.
7
+
8
+ require "test/unit"
9
+
10
+ require "gambit/tools/movehistory"
11
+
12
+ class TestMoveHistory < Test::Unit::TestCase
13
+ def test_chess_history
14
+ assert_not_nil(hist = Gambit::Tools::MoveHistory.new("James", "Greg"))
15
+ assert_same(hist, hist << "e4")
16
+ assert_same(hist, hist << "e5")
17
+ assert_same(hist, hist << "f4")
18
+ assert_equal("e5", hist[1, "Greg"])
19
+ moves = %w{e4 e5 f4}
20
+ hist.each { |move| assert_equal(moves.shift, move) }
21
+ end
22
+
23
+ def test_advanced
24
+ assert_not_nil(hist = Gambit::Tools::MoveHistory.new("James", "Greg"))
25
+ hist.turn = "Stardate 1005"
26
+ assert_same(hist, hist.record("James", "Conquered Gray Galaxy!"))
27
+ assert_equal("Conquered Gray Galaxy!", hist["Stardate 1005", "James"])
28
+ assert_same(hist, hist.record("Greg", "Visited Gray Alien Race!"))
29
+ assert_equal("Visited Gray Alien Race!", hist["Stardate 1005", "Greg"])
30
+ assert_same(hist, hist.record("Greg", "Purchased Alien Liquor!"))
31
+ assert_equal( [ "Visited Gray Alien Race!",
32
+ "Purchased Alien Liquor!" ],
33
+ hist["Stardate 1005", "Greg"] )
34
+ hist.turn = "Stardate 1010"
35
+ assert_same(hist, hist.record("James", "Built Alien AI!"))
36
+ assert_equal("Built Alien AI!", hist["Stardate 1010", "James"])
37
+ end
38
+ end
@@ -0,0 +1,60 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ # tc_player.rb
4
+ #
5
+ # Created by Gregory Brown on 2005-06-04.
6
+ # Copyright 2005 smtose.org. All rights reserved.
7
+
8
+ require "test/unit"
9
+
10
+ require "gambit/server/player"
11
+ require "test_game"
12
+
13
+ class TestPlayer < Test::Unit::TestCase
14
+ def test_login
15
+ assert_not_nil(player = Gambit::Server::Player.new("James", "NOW!"))
16
+ assert_equal("James", player.name)
17
+ assert(player.login?("NOW!"))
18
+ assert(!player.login?("Junk"))
19
+ assert(!player.login?("NoW!"))
20
+ end
21
+
22
+ def test_messages
23
+ player = Gambit::Server::Player.new("Greg", "PASS!")
24
+ message = Gambit::Server::Message.new(
25
+ "Gregory Brown", "James Gray", "Test",
26
+ "This is a test!")
27
+ message2 = Gambit::Server::Message.new(
28
+ "James Gray", "Gregory Brown", "Hatemail",
29
+ "I'm a bastard so i'm sending you hatemail.")
30
+ assert_same(player.mailbox, player.mailbox << message)
31
+ assert_equal(message, player.mailbox.first)
32
+ assert_equal(message, player.mailbox.shift)
33
+ assert_nil(player.mailbox.find { |mes| mes == message })
34
+ end
35
+
36
+ def test_notes
37
+ assert_not_nil(player = Gambit::Server::Player.new("James", "NOW!"))
38
+ assert_not_nil(game = MyGame.new)
39
+ game.player = player
40
+ assert_equal("", game.notify)
41
+ assert_same(player.notes, player.notes << "You have five turns left.")
42
+ assert_equal( "<ul class=\"notification\">\n" +
43
+ "\t<li>You have five turns left.</li>\n" +
44
+ "</ul>\n", game.notify )
45
+ assert_same( player.notes,
46
+ player.notes << "Greg has declared war on you!" )
47
+ assert_same( player.notes,
48
+ player.notes << "Your Earth colony has the plague." )
49
+ assert_equal( "<ul class=\"notification\">\n" +
50
+ "\t<li>Greg has declared war on you!</li>\n" +
51
+ "\t<li>Your Earth colony has the plague.</li>\n" +
52
+ "</ul>\n", game.notify )
53
+ end
54
+
55
+ def test_game_data
56
+ assert_not_nil(player = Gambit::Server::Player.new("James", "NOW!"))
57
+ assert_equal(45, player["Pilot Skill"] = 45)
58
+ assert_equal(45, player["Pilot Skill"])
59
+ end
60
+ end
@@ -0,0 +1,112 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ # tc_scorecard.rb
4
+ #
5
+ # Created by James Edward Gray II on 2005-02-11.
6
+ # Copyright 2005 Gray Productions. All rights reserved.
7
+
8
+ require "test/unit"
9
+ require "gambit/tools/scorecard"
10
+
11
+ class TestScorecard < Test::Unit::TestCase
12
+ def test_basic
13
+ # setup
14
+ assert_not_nil(sc = Gambit::Tools::Scorecard.new)
15
+ # test for chaining and show interface
16
+ assert_same(sc, sc.add_player("James"))
17
+ assert_same(sc, sc.add_player("Greg"))
18
+ assert_equal(10, sc.start_at = 10)
19
+ assert_same(sc, sc.add_players("Apple", "Microsoft"))
20
+
21
+ # scores and totaling
22
+ assert_equal(10, sc.total("James"))
23
+ assert_equal(15, sc.score("James", 5))
24
+ assert_equal(15, sc.total("James"))
25
+ assert_equal(30, sc.score("James") { |count| count * 2 })
26
+ assert_equal(2, sc.score("Microsoft", -8))
27
+
28
+ # win/loss
29
+ assert_equal("James", sc.winner)
30
+ assert_equal("Microsoft", sc.loser)
31
+ assert_equal("Microsoft", sc.winner { |a, b| b <=> a })
32
+ end
33
+
34
+ def test_advanced
35
+ # setup: define categories with high/low, sets, validation
36
+ assert_not_nil(yahtzee = Gambit::Tools::Scorecard.new("James", "Greg"))
37
+ assert_same(yahtzee, yahtzee.use_category("Ones", 0, 6))
38
+ assert_same(yahtzee, yahtzee.use_category("Twos", [0, 2, 4, 6, 8, 10]))
39
+ assert_same( yahtzee, yahtzee.use_category( "Threes", [ 0, 3, 6,
40
+ 9, 12, 15 ] ) )
41
+ assert_same( yahtzee, yahtzee.use_category( "Fours", [ 0, 4, 8,
42
+ 12, 16, 20 ] ) )
43
+ assert_same( yahtzee, yahtzee.use_category( "Fives", [ 0, 5, 10,
44
+ 15, 20, 25 ] ) )
45
+ assert_same( yahtzee, yahtzee.use_category( "Sixes", [ 0, 6, 12,
46
+ 18, 24, 30 ] ) )
47
+ assert_same(yahtzee, yahtzee.use_category("Three of a Kind", 0, 30))
48
+ assert_same(yahtzee, yahtzee.use_category("Four of a Kind", 0, 30))
49
+ assert_same(yahtzee, yahtzee.use_category("Full House", [0, 25]))
50
+ assert_same(yahtzee, yahtzee.use_category("Small Straight", [0, 30]))
51
+ assert_same(yahtzee, yahtzee.use_category("Large Straight", [0, 40]))
52
+ assert_same( yahtzee,
53
+ yahtzee.use_category(
54
+ "Yahtzee"
55
+ ) { |n| n == 0 or n == 50 or (n - 50) % 100 == 0 } )
56
+ assert_same(yahtzee, yahtzee.use_category("Chance", 0, 36))
57
+ assert_same(yahtzee, yahtzee.require_categories)
58
+
59
+ # totaling
60
+ assert_same( yahtzee,
61
+ yahtzee.set_total( "Bonus", *%w{ Ones Twos Threes
62
+ Fours Fives Sixes }
63
+ ) { |n| if n >= 63 then 35 else 0 end } )
64
+ assert_same( yahtzee, yahtzee.set_total( "Upper", *%w{ Ones Twos
65
+ Threes Fours
66
+ Fives Sixes
67
+ Bonus } ) )
68
+ assert_same( yahtzee, yahtzee.set_total( "Lower", "Three of a Kind",
69
+ "Four of a Kind",
70
+ "Full House",
71
+ "Small Straight",
72
+ "Large Straight",
73
+ "Yahtzee",
74
+ "Chance" ) )
75
+ assert_same(yahtzee, yahtzee.set_total("Overall", *%w{Upper Lower}))
76
+ assert_same(yahtzee, yahtzee.set_win("Overall"))
77
+
78
+ # usage
79
+ assert_raise(ArgumentError) { yahtzee.score("James", 10) }
80
+ assert_raise(ArgumentError) { yahtzee.score("James", 10, "Overall") }
81
+ assert_raise(ArgumentError) { yahtzee.score("James", 10, "Ones") }
82
+ assert_equal(3, yahtzee.score("James", 3, "Ones"))
83
+ assert_equal(3, yahtzee.total("James", "Ones"))
84
+ assert_equal(3, yahtzee.total("James", "Upper"))
85
+ assert_equal(3, yahtzee.total("James", "Overall"))
86
+ assert_equal(0, yahtzee.total("James", "Bonus"))
87
+ assert_equal(0, yahtzee.total("James", "Lower"))
88
+ assert_equal(4, yahtzee.score("James", 4, "Twos"))
89
+ assert_equal(0, yahtzee.total("James", "Bonus"))
90
+ assert_equal(7, yahtzee.total("James", "Upper"))
91
+ assert_equal(9, yahtzee.score("James", 9, "Threes"))
92
+ assert_equal(0, yahtzee.total("James", "Bonus"))
93
+ assert_equal(16, yahtzee.total("James", "Upper"))
94
+ assert_equal(8, yahtzee.score("James", 8, "Fours"))
95
+ assert_equal(0, yahtzee.total("James", "Bonus"))
96
+ assert_equal(24, yahtzee.total("James", "Upper"))
97
+ assert_equal(15, yahtzee.score("James", 15, "Fives"))
98
+ assert_equal(0, yahtzee.total("James", "Bonus"))
99
+ assert_equal(39, yahtzee.total("James", "Upper"))
100
+ assert_equal(24, yahtzee.score("James", 24, "Sixes"))
101
+ assert_equal(35, yahtzee.total("James", "Bonus"))
102
+ assert_equal(98, yahtzee.total("James", "Upper"))
103
+ assert_equal(25, yahtzee.score("James", 25, "Full House"))
104
+ assert_equal(25, yahtzee.total("James", "Lower"))
105
+ assert_equal(123, yahtzee.total("James", "Overall"))
106
+ assert_equal(50, yahtzee.score("Greg", 50, "Yahtzee"))
107
+ assert_equal(150, yahtzee.score("Greg", 100, "Yahtzee"))
108
+ assert_equal(25, yahtzee.score("Greg", 25, "Fives"))
109
+ assert_equal(175, yahtzee.total("Greg", "Overall"))
110
+ assert_equal("Greg", yahtzee.winner)
111
+ end
112
+ end
@@ -0,0 +1,353 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ # tc_views.rb
4
+ #
5
+ # Created by James Edward Gray II on 2005-06-01.
6
+ # Copyright 2005 Gray Productions. All rights reserved.
7
+
8
+ require "test/unit"
9
+
10
+ require "gambit/viewable"
11
+ require "gambit/tools"
12
+ require "gambit/server/gambiterror"
13
+
14
+ class TestViews < Test::Unit::TestCase
15
+ class MyModel
16
+ include Gambit::Viewable
17
+
18
+ def initialize( )
19
+ @instance_variable = "Instance Variable"
20
+ end
21
+
22
+ def instance_method( )
23
+ "Instance Method"
24
+ end
25
+ end
26
+
27
+ def test_mixin
28
+ assert_not_nil(model = MyModel.new)
29
+
30
+ MyModel.register_view( :empty, "" )
31
+ assert_equal("", model.view(:empty))
32
+ assert_raise(ArgumentError) { model.view(:typo) }
33
+
34
+ assert_respond_to(model, :h)
35
+ assert_respond_to(model, :url_encode)
36
+ end
37
+
38
+ def test_erb_completion
39
+ assert_not_nil(model = MyModel.new)
40
+ MyModel.register_view( :ruby, "Countdown:\n" +
41
+ "<% 10.downto(1) do |num| %>\n" +
42
+ "\t<%= num %>...\n" +
43
+ "<% end %>\n" +
44
+ "NOW!!!" )
45
+ assert_equal( "Countdown:\n" +
46
+ "#{(1..10).to_a.reverse.map { |n| %Q{\t#{n}...\n} }}" +
47
+ "NOW!!!", model.view(:ruby))
48
+
49
+ MyModel.register_view( :shortcut, "Countdown:\n" +
50
+ "% 10.downto(1) do |num|\n" +
51
+ "\t<%= num %>...\n" +
52
+ "% end\n" +
53
+ "NOW!!!" )
54
+ assert_equal( "Countdown:\n" +
55
+ "#{(1..10).to_a.reverse.map { |n| %Q{\t#{n}...\n} }}" +
56
+ "NOW!!!", model.view(:shortcut))
57
+
58
+ MyModel.register_view( :data, "<%= @instance_variable %> and " +
59
+ "<%= instance_method %>" )
60
+ assert_equal("Instance Variable and Instance Method", model.view(:data))
61
+ end
62
+
63
+ def test_view_files
64
+ assert_not_nil(model = MyModel.new)
65
+ MyModel.register_view( :file,
66
+ "file:#{File.join(File.dirname(__FILE__), 'test_view.rhtml')}" )
67
+ MyModel.register_view(:junk_file, "file:DOESN'T_EXIST")
68
+ assert_equal( "Var: Instance Variable\nMeth: Instance Method\n",
69
+ model.view(:file) )
70
+ assert_raise(Gambit::Server::GambitError) { model.view(:junk_file) }
71
+ end
72
+
73
+ def test_dice
74
+ roll = 3.d(6)
75
+ str = roll.to_a.join(", ")
76
+ str[str.rindex(","), 1] = " and"
77
+
78
+ assert_equal( "<ul class=\"dice\">\n" +
79
+ roll.map { |die| "\t<li>#{die}</li>\n" }.join +
80
+ "</ul>\n", roll.view(:gambit_html) )
81
+ assert_equal(str, roll.view(:gambit_text))
82
+
83
+ roll = 2.d(6)
84
+
85
+ assert_equal( "<ul class=\"dice\">\n" +
86
+ roll.map { |die| "\t<li>#{die}</li>\n" }.join +
87
+ "</ul>\n", roll.view(:gambit_html) )
88
+ assert_equal("#{roll[0]} and #{roll[1]}", roll.view(:gambit_text))
89
+
90
+ roll = 1.d(6)
91
+
92
+ assert_equal( "<ul class=\"dice\">\n" +
93
+ "\t<li>#{roll[0]}</li>\n" +
94
+ "</ul>\n", roll.view(:gambit_html) )
95
+ assert_equal("a #{roll[0]}", roll.view(:gambit_text))
96
+ end
97
+
98
+ def test_board
99
+ board = Gambit::Tools::Board.new(2, 2)
100
+ board["a1"] = "James"
101
+ board["b1"] = "Dana"
102
+ board["a2"] = "Greg"
103
+ board["b2"] = "Bozo the Clown"
104
+ assert_equal( "<table class=\"board\">\n" +
105
+ "<tr id=\"row2\">\n" +
106
+ "\t<td id=\"a2\">Greg</td>\n" +
107
+ "\t<td id=\"b2\">Bozo the Clown</td>\n" +
108
+ "</tr><tr id=\"row1\">\n" +
109
+ "\t<td id=\"a1\">James</td>\n" +
110
+ "\t<td id=\"b1\">Dana</td>\n" +
111
+ "</tr>\n" +
112
+ "</table>\n", board.view(:gambit_html) )
113
+ assert_equal( " Greg Bozo the Clown\n" +
114
+ "James Dana\n", board.view(:gambit_text) )
115
+ end
116
+
117
+ def test_cards
118
+ card = Gambit::Tools::Cards::StandardCard.new(:ace, :spades)
119
+ assert_equal( "<dl class=\"card\">\n" +
120
+ "\t<dt>Value:</dt>\n" +
121
+ "\t<dd>ace</dd>\n" +
122
+ "\t\n" +
123
+ "\t<dt>Suit:</dt>\n" +
124
+ "\t<dd>spades</dd>\n" +
125
+ "</dl>\n", card.view(:gambit_html) )
126
+ assert_equal("The Ace of Spades", card.view(:gambit_text))
127
+
128
+ deck = Gambit::Tools::Cards::Deck.new
129
+ assert_equal( "<ol class=\"deck\">\n" +
130
+ deck.to_a.map { |c| "\t<li>#{c.name}</li>\n" }.join +
131
+ "</ol>\n", deck.view(:gambit_html) )
132
+ assert_equal( deck.to_a.map { |c| "#{c.name}\n" }.join,
133
+ deck.view(:gambit_text) )
134
+
135
+ hand = Gambit::Tools::Cards::Hand.new
136
+ hand << Gambit::Tools::Cards::StandardCard.new(:ace, :spades) <<
137
+ Gambit::Tools::Cards::StandardCard.new(:joker, :red) <<
138
+ Gambit::Tools::Cards::StandardCard.new(3, :clubs)
139
+ assert_equal( "<ol class=\"hand\">\n" +
140
+ "\t<li>The Ace of Spades</li>\n" +
141
+ "\t<li>The Red Joker</li>\n" +
142
+ "\t<li>The 3 of Clubs</li>\n" +
143
+ "</ol>\n",
144
+ hand.view(:gambit_html) )
145
+ assert_equal( "The Ace of Spades, The Red Joker and The 3 of Clubs",
146
+ hand.view(:gambit_text) )
147
+
148
+ pile = Gambit::Tools::Cards::Pile.new
149
+ pile << Gambit::Tools::Cards::StandardCard.new(:ace, :spades) <<
150
+ Gambit::Tools::Cards::StandardCard.new(:joker, :red) <<
151
+ Gambit::Tools::Cards::StandardCard.new(3, :clubs)
152
+ pile.face_up = lambda { |index| index != 0 }
153
+ assert_equal( "<ol class=\"pile\">\n" +
154
+ "\t<li>A Face-down Card</li>\n" +
155
+ "\t<li>The Red Joker</li>\n" +
156
+ "\t<li>The Ace of Spades</li>\n" +
157
+ "</ol>\n", pile.view(:gambit_html) )
158
+ assert_equal( "The Red Joker and The Ace of Spades",
159
+ pile.view(:gambit_text) )
160
+ end
161
+
162
+ def test_movehistory
163
+ hist = Gambit::Tools::MoveHistory.new("James", "Greg")
164
+ hist << "e4" << "e5" << "f4"
165
+ assert_equal( "<table class=\"movehistory\">\n" +
166
+ "<tr>\n" +
167
+ "\t<th>&nbsp;</th>\n" +
168
+ "\t<th id=\"James\">James</th>\n" +
169
+ "\t<th id=\"Greg\">Greg</th>\n" +
170
+ "</tr><tr class=\"odd\">\n" +
171
+ "\t<td class=\"turn\">1</td>\n" +
172
+ "\t<td id=\"James1\">e4</td>\n" +
173
+ "\t<td id=\"Greg1\">e5</td>\n" +
174
+ "</tr><tr class=\"even\">\n" +
175
+ "\t<td class=\"turn\">2</td>\n" +
176
+ "\t<td id=\"James2\">f4</td>\n" +
177
+ "\t<td id=\"Greg2\">&nbsp;</td>\n" +
178
+ "</tr>\n" +
179
+ "</table>\n", hist.view(:gambit_html) )
180
+ assert_equal( " James Greg \n" +
181
+ "1: e4 e5 \n" +
182
+ "2: f4 \n", hist.view(:gambit_text) )
183
+ end
184
+
185
+ def test_currency
186
+ Gambit::Tools::Currency[:gold] = 1
187
+ Gambit::Tools::Currency[:silver] = 0.5
188
+ Gambit::Tools::Currency[:copper] = 2
189
+
190
+ cur = Gambit::Tools::Currency.new
191
+ cur.deposit(150, :gold)
192
+ cur.deposit(75, :silver)
193
+ cur.deposit(25, :copper)
194
+ assert_equal( "<dl class=\"currency\">\n" +
195
+ "\t<dt>Copper</dt>\n" +
196
+ "\t<dd>25</dd>\n" +
197
+ "\t\n" +
198
+ "\t<dt>Gold</dt>\n" +
199
+ "\t<dd>150</dd>\n" +
200
+ "\t\n" +
201
+ "\t<dt>Silver</dt>\n" +
202
+ "\t<dd>75</dd>\n" +
203
+ "</dl>\n", cur.view(:gambit_html) )
204
+ assert_equal( "Copper: 25\n" +
205
+ " Gold: 150\n" +
206
+ "Silver: 75\n", cur.view(:gambit_text) )
207
+ end
208
+
209
+ def test_scorecard
210
+ yahtzee = Gambit::Tools::Scorecard.new("James", "Greg")
211
+ yahtzee.use_category("Ones", 0, 6)
212
+ yahtzee.use_category("Twos", [0, 2, 4, 6, 8, 10])
213
+ yahtzee.use_category("Threes", [ 0, 3, 6, 9, 12, 15 ])
214
+ yahtzee.use_category("Fours", [ 0, 4, 8, 12, 16, 20 ])
215
+ yahtzee.use_category("Fives", [ 0, 5, 10, 15, 20, 25 ])
216
+ yahtzee.use_category("Sixes", [ 0, 6, 12, 18, 24, 30 ])
217
+
218
+ yahtzee.set_total( "Bonus", *%w{ Ones Twos Threes
219
+ Fours Fives Sixes } ) do |n|
220
+ if n >= 63 then 35 else 0 end
221
+ end
222
+ yahtzee.set_total( "Upper",
223
+ *%w{Ones Twos Threes Fours Fives Sixes Bonus} )
224
+
225
+ yahtzee.use_category("Three of a Kind", 0, 30)
226
+ yahtzee.use_category("Four of a Kind", 0, 30)
227
+ yahtzee.use_category("Full House", [0, 25])
228
+ yahtzee.use_category("Small Straight", [0, 30])
229
+ yahtzee.use_category("Large Straight", [0, 40])
230
+ yahtzee.use_category("Yahtzee") do |n|
231
+ n == 0 or n == 50 or (n - 50) % 100 == 0
232
+ end
233
+ yahtzee.use_category("Chance", 0, 36)
234
+ yahtzee.require_categories
235
+
236
+ yahtzee.set_total( "Lower", "Three of a Kind", "Four of a Kind",
237
+ "Full House", "Small Straight", "Large Straight",
238
+ "Yahtzee", "Chance" )
239
+ yahtzee.set_total("Overall", *%w{Upper Lower})
240
+ yahtzee.set_win("Overall")
241
+
242
+ yahtzee.score("James", 3, "Ones")
243
+ yahtzee.score("James", 4, "Twos")
244
+ yahtzee.score("James", 9, "Threes")
245
+ yahtzee.score("James", 8, "Fours")
246
+ yahtzee.score("James", 15, "Fives")
247
+ yahtzee.score("James", 24, "Sixes")
248
+ yahtzee.score("James", 25, "Full House")
249
+ yahtzee.score("Greg", 50, "Yahtzee")
250
+ yahtzee.score("Greg", 100, "Yahtzee")
251
+ yahtzee.score("Greg", 25, "Fives")
252
+
253
+ assert_equal( "<table class=\"scorecard\">\n" +
254
+ "<tr>\n" +
255
+ "\t<th>&nbsp;</th>\n" +
256
+ "\t<th id=\"James\">James</th>\n" +
257
+ "\t<th id=\"Greg\">Greg</th>\n" +
258
+ "</tr><tr class=\"odd\">\n" +
259
+ "\t<td class=\"category\">Ones</td>\n" +
260
+ "\t<td id=\"James--Ones\">3</td>\n" +
261
+ "\t<td id=\"Greg--Ones\">0</td>\n" +
262
+ "</tr><tr class=\"even\">\n" +
263
+ "\t<td class=\"category\">Twos</td>\n" +
264
+ "\t<td id=\"James--Twos\">4</td>\n" +
265
+ "\t<td id=\"Greg--Twos\">0</td>\n" +
266
+ "</tr><tr class=\"odd\">\n" +
267
+ "\t<td class=\"category\">Threes</td>\n" +
268
+ "\t<td id=\"James--Threes\">9</td>\n" +
269
+ "\t<td id=\"Greg--Threes\">0</td>\n" +
270
+ "</tr><tr class=\"even\">\n" +
271
+ "\t<td class=\"category\">Fours</td>\n" +
272
+ "\t<td id=\"James--Fours\">8</td>\n" +
273
+ "\t<td id=\"Greg--Fours\">0</td>\n" +
274
+ "</tr><tr class=\"odd\">\n" +
275
+ "\t<td class=\"category\">Fives</td>\n" +
276
+ "\t<td id=\"James--Fives\">15</td>\n" +
277
+ "\t<td id=\"Greg--Fives\">25</td>\n" +
278
+ "</tr><tr class=\"even\">\n" +
279
+ "\t<td class=\"category\">Sixes</td>\n" +
280
+ "\t<td id=\"James--Sixes\">24</td>\n" +
281
+ "\t<td id=\"Greg--Sixes\">0</td>\n" +
282
+ "</tr><tr class=\"odd\">\n" +
283
+ "\t<td class=\"category\">Bonus</td>\n" +
284
+ "\t<td id=\"James--Bonus\">35</td>\n" +
285
+ "\t<td id=\"Greg--Bonus\">0</td>\n" +
286
+ "</tr><tr class=\"even\">\n" +
287
+ "\t<td class=\"category\">Upper</td>\n" +
288
+ "\t<td id=\"James--Upper\">98</td>\n" +
289
+ "\t<td id=\"Greg--Upper\">25</td>\n" +
290
+ "</tr><tr class=\"odd\">\n" +
291
+ "\t<td class=\"category\">Three of a Kind</td>\n" +
292
+ "\t<td id=\"James--Three of a Kind\">0</td>\n" +
293
+ "\t<td id=\"Greg--Three of a Kind\">0</td>\n" +
294
+ "</tr><tr class=\"even\">\n" +
295
+ "\t<td class=\"category\">Four of a Kind</td>\n" +
296
+ "\t<td id=\"James--Four of a Kind\">0</td>\n" +
297
+ "\t<td id=\"Greg--Four of a Kind\">0</td>\n" +
298
+ "</tr><tr class=\"odd\">\n" +
299
+ "\t<td class=\"category\">Full House</td>\n" +
300
+ "\t<td id=\"James--Full House\">25</td>\n" +
301
+ "\t<td id=\"Greg--Full House\">0</td>\n" +
302
+ "</tr><tr class=\"even\">\n" +
303
+ "\t<td class=\"category\">Small Straight</td>\n" +
304
+ "\t<td id=\"James--Small Straight\">0</td>\n" +
305
+ "\t<td id=\"Greg--Small Straight\">0</td>\n" +
306
+ "</tr><tr class=\"odd\">\n" +
307
+ "\t<td class=\"category\">Large Straight</td>\n" +
308
+ "\t<td id=\"James--Large Straight\">0</td>\n" +
309
+ "\t<td id=\"Greg--Large Straight\">0</td>\n" +
310
+ "</tr><tr class=\"even\">\n" +
311
+ "\t<td class=\"category\">Yahtzee</td>\n" +
312
+ "\t<td id=\"James--Yahtzee\">0</td>\n" +
313
+ "\t<td id=\"Greg--Yahtzee\">150</td>\n" +
314
+ "</tr><tr class=\"odd\">\n" +
315
+ "\t<td class=\"category\">Chance</td>\n" +
316
+ "\t<td id=\"James--Chance\">0</td>\n" +
317
+ "\t<td id=\"Greg--Chance\">0</td>\n" +
318
+ "</tr><tr class=\"even\">\n" +
319
+ "\t<td class=\"category\">Lower</td>\n" +
320
+ "\t<td id=\"James--Lower\">25</td>\n" +
321
+ "\t<td id=\"Greg--Lower\">150</td>\n" +
322
+ "</tr><tr class=\"odd\">\n" +
323
+ "\t<td class=\"category\">Overall</td>\n" +
324
+ "\t<td id=\"James--Overall\">123</td>\n" +
325
+ "\t<td id=\"Greg--Overall\">175</td>\n" +
326
+ "</tr>\n" +
327
+ "</table>\n", yahtzee.view(:gambit_html) )
328
+ assert_equal( " James Greg \n" +
329
+ " Ones: 3 0 \n" +
330
+ " Twos: 4 0 \n" +
331
+ " Threes: 9 0 \n" +
332
+ " Fours: 8 0 \n" +
333
+ " Fives: 15 25 \n" +
334
+ " Sixes: 24 0 \n" +
335
+ "--------------- ----- ----- \n" +
336
+ " Bonus: 35 0 \n" +
337
+ "--------------- ----- ----- \n" +
338
+ " Upper: 98 25 \n" +
339
+ "\n" +
340
+ "Three of a Kind: 0 0 \n" +
341
+ " Four of a Kind: 0 0 \n" +
342
+ " Full House: 25 0 \n" +
343
+ " Small Straight: 0 0 \n" +
344
+ " Large Straight: 0 0 \n" +
345
+ " Yahtzee: 0 150 \n" +
346
+ " Chance: 0 0 \n" +
347
+ "--------------- ----- ----- \n" +
348
+ " Lower: 25 150 \n" +
349
+ "--------------- ----- ----- \n" +
350
+ " Overall: 123 175 \n",
351
+ yahtzee.view(:gambit_text) )
352
+ end
353
+ end