shattered 0.5.0.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (223) hide show
  1. data/History.txt +6 -0
  2. data/INSTALL.txt +5 -0
  3. data/License.txt +18 -0
  4. data/Manifest.txt +175 -0
  5. data/README.txt +39 -0
  6. data/Rakefile +6 -0
  7. data/app_generators/actor/USAGE +6 -0
  8. data/app_generators/actor/actor_generator.rb +51 -0
  9. data/app_generators/actor/templates/actor.rb +4 -0
  10. data/app_generators/actor/templates/spec.rb +11 -0
  11. data/app_generators/actor/templates/unit_test.rb +9 -0
  12. data/app_generators/commands/console.rb +6 -0
  13. data/{lib/rails_generator/generators/applications/shattered_app → app_generators/shattered}/USAGE +1 -1
  14. data/app_generators/shattered/shattered_generator.rb +67 -0
  15. data/{lib → app_generators/shattered}/templates/Rakefile +4 -4
  16. data/app_generators/shattered/templates/configs/game.controls +16 -0
  17. data/app_generators/shattered/templates/configs/ogre_plugins.linux.cfg +12 -0
  18. data/app_generators/shattered/templates/configs/ogre_plugins.osx.cfg +12 -0
  19. data/{lib → app_generators/shattered}/templates/configs/ogre_plugins.windows.cfg +2 -2
  20. data/app_generators/shattered/templates/game.rb +50 -0
  21. data/{lib → app_generators/shattered}/templates/media/basic.rmaterial +0 -0
  22. data/app_generators/shattered/templates/spec/game_spec.rb +5 -0
  23. data/app_generators/shattered/templates/spec/spec_helper.rb +12 -0
  24. data/bin/shattered +39 -0
  25. data/config/hoe.rb +77 -0
  26. data/config/requirements.rb +15 -0
  27. data/lib/shattered.rb +40 -0
  28. data/lib/shattered_game/actor.rb +6 -0
  29. data/lib/shattered_game/game.rb +285 -0
  30. data/lib/{tasks → shattered_game/rake_tasks}/framework.rake +19 -24
  31. data/lib/{tasks → shattered_game/rake_tasks}/log.rake +0 -0
  32. data/lib/{tasks → shattered_game/rake_tasks}/misc.rake +1 -2
  33. data/lib/{tasks → shattered_game/rake_tasks}/pre_namespace_aliases.rake +0 -0
  34. data/lib/{tasks → shattered_game/rake_tasks}/shattered.rb +0 -0
  35. data/lib/shattered_game/rake_tasks/spec.rake +9 -0
  36. data/lib/{tasks → shattered_game/rake_tasks}/statistics.rake +0 -0
  37. data/lib/shattered_game/required.rb +2 -0
  38. data/lib/shattered_game/version.rb +9 -0
  39. data/lib/shattered_model/controls.rb +67 -0
  40. data/lib/shattered_model/input.rb +171 -0
  41. data/lib/shattered_model/key_converter.rb +44 -0
  42. data/lib/shattered_model/required.rb +4 -0
  43. data/lib/shattered_model/shattered_model.rb +28 -0
  44. data/lib/shattered_model/timed_event.rb +120 -0
  45. data/lib/shattered_model/timer.rb +78 -0
  46. data/lib/shattered_support/core_ext.rb +1 -0
  47. data/lib/shattered_support/core_ext/class.rb +3 -0
  48. data/lib/shattered_support/core_ext/class/attribute_accessors.rb +44 -0
  49. data/lib/shattered_support/core_ext/class/inheritable_attributes.rb +115 -0
  50. data/lib/shattered_support/core_ext/class/removal.rb +24 -0
  51. data/lib/shattered_support/core_ext/dir.rb +5 -0
  52. data/lib/shattered_support/core_ext/dir/search.rb +25 -0
  53. data/lib/shattered_support/core_ext/file.rb +5 -0
  54. data/lib/shattered_support/core_ext/file/search.rb +64 -0
  55. data/lib/shattered_support/core_ext/numeric.rb +5 -0
  56. data/lib/shattered_support/core_ext/numeric/time.rb +72 -0
  57. data/lib/shattered_support/core_ext/string.rb +13 -0
  58. data/lib/shattered_support/core_ext/string/access.rb +58 -0
  59. data/lib/shattered_support/core_ext/string/conversions.rb +19 -0
  60. data/lib/shattered_support/core_ext/string/inflections.rb +64 -0
  61. data/lib/shattered_support/core_ext/string/iterators.rb +17 -0
  62. data/lib/shattered_support/core_ext/string/starts_ends_with.rb +20 -0
  63. data/lib/shattered_support/error.rb +12 -0
  64. data/lib/shattered_support/inflections.rb +53 -0
  65. data/lib/shattered_support/inflector.rb +178 -0
  66. data/lib/shattered_support/pre_initialize.rb +153 -0
  67. data/lib/shattered_support/required.rb +9 -0
  68. data/lib/shattered_support/unload.rb +18 -0
  69. data/lib/shattered_view/camera.rb +7 -0
  70. data/lib/shattered_view/ogrerb/base.rb +28 -0
  71. data/lib/shattered_view/ogrerb/camera.rb +14 -0
  72. data/lib/shattered_view/ogrerb/key_manager.rb +54 -0
  73. data/lib/shattered_view/ogrerb/light.rb +25 -0
  74. data/lib/shattered_view/ogrerb/material.rb +5 -0
  75. data/lib/shattered_view/ogrerb/mesh_instance.rb +85 -0
  76. data/lib/shattered_view/ogrerb/mouse_manager.rb +109 -0
  77. data/lib/shattered_view/ogrerb/particle_system.rb +24 -0
  78. data/lib/shattered_view/ogrerb/rgb.rb +6 -0
  79. data/lib/shattered_view/ogrerb/rmaterial.rb +87 -0
  80. data/lib/shattered_view/ogrerb/scene_node.rb +76 -0
  81. data/lib/shattered_view/ogrerb/vector.rb +243 -0
  82. data/lib/shattered_view/ogrerb/window_event.rb +14 -0
  83. data/lib/shattered_view/resources.rb +64 -0
  84. data/lib/shattered_view/shattered_view.rb +248 -0
  85. data/script/destroy +14 -0
  86. data/script/generate +14 -0
  87. data/setup.rb +1585 -0
  88. data/tasks/deployment.rake +30 -0
  89. data/tasks/environment.rake +7 -0
  90. data/tasks/rcov.rake +7 -0
  91. data/tasks/testing.rake +46 -0
  92. data/tasks/website.rake +15 -0
  93. data/test/acceptance/Rakefile +10 -0
  94. data/test/acceptance/config/game.controls +17 -0
  95. data/test/acceptance/config/ogre_plugins.linux.cfg +12 -0
  96. data/test/acceptance/config/ogre_plugins.osx.cfg +12 -0
  97. data/test/acceptance/config/ogre_plugins.windows.cfg +14 -0
  98. data/test/acceptance/config/ogrerb_defaults.save +8 -0
  99. data/test/acceptance/game.rb +120 -0
  100. data/test/acceptance/lib/acceptance_test.rb +20 -0
  101. data/test/acceptance/lib/console.rb +54 -0
  102. data/test/acceptance/lib/input_test.rb +8 -0
  103. data/test/acceptance/lib/label.rb +30 -0
  104. data/test/acceptance/lib/light_test.rb +60 -0
  105. data/test/acceptance/lib/mesh_test.rb +69 -0
  106. data/test/acceptance/lib/particle_test.rb +9 -0
  107. data/test/acceptance/media/GreenSkin.jpg +0 -0
  108. data/test/acceptance/media/Ogre.material +86 -0
  109. data/test/acceptance/media/WeirdEye.png +0 -0
  110. data/test/acceptance/media/basic.rmaterial +18 -0
  111. data/test/acceptance/media/console.fontdef +7 -0
  112. data/test/acceptance/media/console.material +13 -0
  113. data/test/acceptance/media/console.png +0 -0
  114. data/test/acceptance/media/console.ttf +0 -0
  115. data/test/acceptance/media/dirt01.png +0 -0
  116. data/test/acceptance/media/fountain.material +19 -0
  117. data/test/acceptance/media/fountain.particle +40 -0
  118. data/test/acceptance/media/fountain.png +0 -0
  119. data/test/acceptance/media/fountaincolors.png +0 -0
  120. data/test/acceptance/media/ogre.mesh +0 -0
  121. data/test/acceptance/media/spheremap.png +0 -0
  122. data/test/acceptance/media/win.png +0 -0
  123. data/test/acceptance/spec/spec_helper.rb +7 -0
  124. data/test/integration/actor_generator_test.rb +43 -0
  125. data/test/integration/shattered_generator_test.rb +43 -0
  126. data/test/integration/test_helper.rb +20 -0
  127. data/test/ogre_test_defaults.save +8 -0
  128. data/test/ogre_test_plugins.linux.cfg +12 -0
  129. data/test/ogre_test_plugins.osx.cfg +12 -0
  130. data/test/ogre_test_plugins.windows.cfg +14 -0
  131. data/test/test_helper.rb +109 -0
  132. data/test/unit/shattered_game/actor_test.rb +9 -0
  133. data/test/unit/shattered_game/game_test.rb +49 -0
  134. data/test/unit/shattered_game/runner_test.rb +56 -0
  135. data/test/unit/shattered_model/controls/mouse.controls +4 -0
  136. data/test/unit/shattered_model/controls/player.controls +4 -0
  137. data/test/unit/shattered_model/controls/too_many_delims.controls +1 -0
  138. data/test/unit/shattered_model/key_controls_test.rb +89 -0
  139. data/test/unit/shattered_model/key_converter_test.rb +37 -0
  140. data/test/unit/shattered_model/keyboard_input_test.rb +32 -0
  141. data/test/unit/shattered_model/mouse_controls_test.rb +50 -0
  142. data/test/unit/shattered_model/mouse_input_test.rb +61 -0
  143. data/test/unit/shattered_model/shattered_model_test.rb +117 -0
  144. data/test/unit/shattered_model/timed_event_test.rb +79 -0
  145. data/test/unit/shattered_model/timer_test.rb +325 -0
  146. data/{lib/rails_generator/generators/components/actor/templates/actor.rb → test/unit/shattered_support/directory_test/file.test} +0 -0
  147. data/test/unit/shattered_support/numeric_ext_test.rb +38 -0
  148. data/test/unit/shattered_support/pre_initialize_test.rb +63 -0
  149. data/test/unit/shattered_support/shattered_support_test.rb +39 -0
  150. data/test/unit/shattered_support/unload_test.rb +17 -0
  151. data/test/unit/shattered_view/light_test.rb +38 -0
  152. data/test/unit/shattered_view/material_test.rb +41 -0
  153. data/test/unit/shattered_view/media_test/basic.rmaterial +18 -0
  154. data/{lib/templates/configs/empty.log → test/unit/shattered_view/media_test/beltch.ogg} +0 -0
  155. data/test/unit/shattered_view/media_test/test.mesh +0 -0
  156. data/test/unit/shattered_view/mesh_test.rb +59 -0
  157. data/test/unit/shattered_view/node_test.rb +11 -0
  158. data/test/unit/shattered_view/ogrerb/camera_test.rb +12 -0
  159. data/test/unit/shattered_view/ogrerb/key_manager_test.rb +42 -0
  160. data/test/unit/shattered_view/ogrerb/media/basic.rmaterial +18 -0
  161. data/test/unit/shattered_view/ogrerb/media/test.mesh +0 -0
  162. data/test/unit/shattered_view/ogrerb/media/test.rmaterial +1 -0
  163. data/test/unit/shattered_view/ogrerb/mesh_instance_test.rb +74 -0
  164. data/test/unit/shattered_view/ogrerb/mouse_manager_test.rb +104 -0
  165. data/test/unit/shattered_view/ogrerb/ogrerb.log +51 -0
  166. data/test/unit/shattered_view/ogrerb/resolve_ogrerb_test.rb +13 -0
  167. data/test/unit/shattered_view/ogrerb/rgb_test.rb +10 -0
  168. data/test/unit/shattered_view/ogrerb/rmaterial_test.rb +28 -0
  169. data/test/unit/shattered_view/ogrerb/scene_type_test.rb +12 -0
  170. data/test/unit/shattered_view/ogrerb/vector_test.rb +206 -0
  171. data/test/unit/shattered_view/particle_test.rb +23 -0
  172. data/test/unit/shattered_view/resources_test.rb +45 -0
  173. data/test/unit/shattered_view/test_helper.rb +1 -0
  174. data/test/unit/shattered_view/window_event_test.rb +19 -0
  175. data/test/unit/test_helper.rb +1 -0
  176. metadata +205 -121
  177. data/bin/console +0 -4
  178. data/bin/destroy +0 -9
  179. data/bin/generate +0 -7
  180. data/bin/runner +0 -9
  181. data/bin/shatter +0 -22
  182. data/lib/commands/console.rb +0 -23
  183. data/lib/game_loader.rb +0 -118
  184. data/lib/rails_generator.rb +0 -43
  185. data/lib/rails_generator/base.rb +0 -203
  186. data/lib/rails_generator/commands.rb +0 -519
  187. data/lib/rails_generator/generators/applications/shattered_app/shattered_app_generator.rb +0 -103
  188. data/lib/rails_generator/generators/components/actor/actor_generator.rb +0 -22
  189. data/lib/rails_generator/generators/components/model/USAGE +0 -17
  190. data/lib/rails_generator/generators/components/model/model_generator.rb +0 -22
  191. data/lib/rails_generator/generators/components/model/templates/fixtures.yml +0 -5
  192. data/lib/rails_generator/generators/components/model/templates/model.rb +0 -2
  193. data/lib/rails_generator/generators/components/model/templates/unit_test.rb +0 -11
  194. data/lib/rails_generator/generators/components/state/USAGE +0 -30
  195. data/lib/rails_generator/generators/components/state/state_generator.rb +0 -19
  196. data/lib/rails_generator/generators/components/state/templates/state.rb +0 -20
  197. data/lib/rails_generator/generators/components/view/USAGE +0 -30
  198. data/lib/rails_generator/generators/components/view/templates/material +0 -4
  199. data/lib/rails_generator/generators/components/view/templates/view.rb +0 -7
  200. data/lib/rails_generator/generators/components/view/view_generator.rb +0 -28
  201. data/lib/rails_generator/lookup.rb +0 -209
  202. data/lib/rails_generator/manifest.rb +0 -53
  203. data/lib/rails_generator/options.rb +0 -143
  204. data/lib/rails_generator/scripts.rb +0 -83
  205. data/lib/rails_generator/scripts/destroy.rb +0 -7
  206. data/lib/rails_generator/scripts/generate.rb +0 -7
  207. data/lib/rails_generator/scripts/update.rb +0 -12
  208. data/lib/rails_generator/simple_logger.rb +0 -46
  209. data/lib/rails_generator/spec.rb +0 -44
  210. data/lib/shatter.rb +0 -7
  211. data/lib/tasks/documentation.rake +0 -46
  212. data/lib/tasks/testing.rake +0 -102
  213. data/lib/templates/MIT-LICENSE +0 -20
  214. data/lib/templates/README +0 -35
  215. data/lib/templates/configs/boot.rb +0 -35
  216. data/lib/templates/configs/ogre.cfg +0 -4
  217. data/lib/templates/configs/runner.rb +0 -5
  218. data/lib/templates/doc/README_FOR_APP +0 -2
  219. data/lib/templates/environments/environment.rb +0 -10
  220. data/lib/templates/media/default.mesh +0 -0
  221. data/lib/templates/media/default.png +0 -0
  222. data/lib/templates/media/offset_map.rmaterial +0 -117
  223. data/lib/templates/test/test_helper.rb +0 -5
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ include Shattered
4
+
5
+ class MouseInputTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @ois_mock = mock()
9
+ @input = Input::Mouse.new(@ois_mock)
10
+ end
11
+
12
+ def test_press
13
+ @ois_mock.expects(:pressed?)
14
+ @input.press(1)
15
+ end
16
+
17
+ def test_release
18
+ @ois_mock.expects(:released?)
19
+ @input.release(1)
20
+ end
21
+
22
+ def test_hold
23
+ @ois_mock.expects(:held?)
24
+ @input.hold(1)
25
+ end
26
+
27
+ def test_move
28
+ @ois_mock.expects(:x).returns 0
29
+ @ois_mock.expects(:y).returns 0
30
+ assert_equal false, @input.move
31
+ end
32
+
33
+ def test_scroll
34
+ @ois_mock.expects(:scrolled)
35
+ @input.scroll
36
+ end
37
+
38
+ def test_symbol_left
39
+ @ois_mock.expects(:held?).with 0
40
+ @input.hold(:left)
41
+ end
42
+
43
+
44
+ def test_symbol_middle
45
+ @ois_mock.expects(:pressed?).with 2
46
+ @input.press(:middle)
47
+ end
48
+
49
+
50
+ def test_symbol_right
51
+ @ois_mock.expects(:released?).with 1
52
+ @input.release(:right)
53
+ end
54
+
55
+ def test_bad_symbol
56
+ assert_raises Exception do
57
+ @input.press(:bad_button)
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,117 @@
1
+ require File.expand_path(File.dirname(__FILE__)+'/../test_helper')
2
+
3
+ class NoViewTimer
4
+ include Shattered::Model
5
+ timer :every => :frame, :action => :update
6
+ attr_reader :timer_updated
7
+ def update
8
+ @timer_updated=true
9
+ end
10
+ end
11
+
12
+ class MovingTimer < NoViewTimer
13
+ end
14
+
15
+ class Color
16
+ include Shattered::Model
17
+ attr_accessor :luminance
18
+ end
19
+
20
+
21
+ class Guard
22
+ include Shattered::Model
23
+ timer :every => :frame, :action => :update
24
+ attr_reader :updated
25
+
26
+ def block
27
+ end
28
+
29
+ def update
30
+ @updated=true
31
+ end
32
+ end
33
+
34
+ class DemonCatGuard < Guard
35
+ attr_reader :number_of_times_updated
36
+
37
+ def initialize
38
+ @number_of_times_updated=0
39
+ end
40
+ def update
41
+ super
42
+ @number_of_times_updated+=1
43
+ end
44
+ end
45
+
46
+ class NoView
47
+ include Shattered::Model
48
+ end
49
+
50
+ class Single
51
+ include Shattered::Model
52
+ attr_reader :single
53
+ def hit
54
+ @single = true
55
+ end
56
+ end
57
+
58
+ class Double < Single
59
+ attr_reader :double
60
+
61
+ def hit
62
+ @double = true
63
+ super
64
+ end
65
+ end
66
+
67
+ class HasEquals
68
+ include Shattered::Model
69
+ def equals=(equals)
70
+ end
71
+ end
72
+
73
+ class HasAlot
74
+ include Shattered::Model
75
+ def give_away(&block)
76
+ block.call
77
+ end
78
+ end
79
+
80
+ class BaseTest < Test::Unit::TestCase
81
+
82
+
83
+ #Make sure View doesn't get called twice, and super works correctly.
84
+ def test_inheritance_and_return_values
85
+ double = Double.new
86
+ double.hit
87
+ assert(double.single)
88
+ assert(double.double)
89
+ end
90
+
91
+ # Check if we can call blocks from Model after redefining the methods
92
+ def test_blocks
93
+ amount= nil
94
+ cash_face = HasAlot.new
95
+ cash_face.give_away { amount = "everything" }
96
+ assert_equal("everything", amount)
97
+ end
98
+
99
+ # Ensure that subscription to timer events works
100
+ def test_all_timer_events
101
+ @timer = NoViewTimer.new
102
+ @timer.timer.update(0)
103
+ assert(@timer.timer_updated)
104
+
105
+ @timer = MovingTimer.new
106
+ @timer.timer.update(0)
107
+ assert(@timer.timer_updated)
108
+ end
109
+
110
+ #Ensure that we are only getting one method invocation even when super is invoked
111
+ def test_single_invocation_on_super
112
+ @kitty = DemonCatGuard.new
113
+ @kitty.update
114
+ assert_equal(1,@kitty.number_of_times_updated)
115
+ end
116
+
117
+ end
@@ -0,0 +1,79 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ include Shattered::Timer
4
+
5
+ class ContinuousTimedEventTest < Test::Unit::TestCase
6
+ def setup
7
+ @adder = ContinuousTimedEvent.new(self,3) do
8
+ @number ||= 0
9
+ @number += 1
10
+ end
11
+ end
12
+
13
+ def test_continuity
14
+ assert(!defined?(@number))
15
+ @adder.update(3)
16
+ assert_equal(1,@number)
17
+ @adder.update(3)
18
+ assert_equal(2,@number)
19
+ end
20
+
21
+ def test_carry_over
22
+ @adder.update(4)
23
+ assert_equal(1,@number)
24
+ @adder.update(2)
25
+ assert_equal(2,@number)
26
+ end
27
+
28
+
29
+ def test_frame
30
+ @event = ContinuousTimedEvent.new(self,:frame) do |time_elapsed|
31
+ @frame_time = time_elapsed
32
+ end
33
+ @event.update(123)
34
+ assert_equal(123, @frame_time)
35
+ @event.update(234)
36
+ assert_equal(234, @frame_time)
37
+ end
38
+ end
39
+
40
+ class TimedEventTest < Test::Unit::TestCase
41
+ def setup
42
+ @event = TimedEvent.new(self,3) do
43
+ @event_proceeded = true
44
+ end
45
+ end
46
+ def test_update
47
+ @event.update(1.5)
48
+ assert_equal(1.5, @event.time_remaining)
49
+ end
50
+ def test_procession
51
+ @event.update(3)
52
+ assert(@event_proceeded)
53
+ assert(@event.processed?)
54
+ end
55
+ def test_after_procession
56
+ @event.update(3)
57
+ @event_proceeded = false
58
+ @event.update(1)
59
+ assert(!@event_proceeded)
60
+ end
61
+ def test_non_procession
62
+ @event.update(1)
63
+ assert(@event_proceeded.nil?)
64
+ assert(!@event.processed?)
65
+ end
66
+ def test_reset
67
+ @event.update(1)
68
+ assert_equal(2,@event.time_remaining)
69
+ @event.reset
70
+ assert_equal(3,@event.time_remaining)
71
+ end
72
+ def test_frame
73
+ @event = TimedEvent.new(self,:frame) do |time_elapsed|
74
+ @frame_time = time_elapsed
75
+ end
76
+ @event.update(123)
77
+ assert_equal(123, @frame_time)
78
+ end
79
+ end
@@ -0,0 +1,325 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class Bullet
4
+ include Shattered::Timer
5
+ timer :every => :frame, :action => :update
6
+ attr_reader :updated
7
+ def update(time_elapsed)
8
+ @updated=true
9
+ end
10
+ end
11
+
12
+ class Gun
13
+ include Shattered::Timer
14
+ timer :every => :frame, :action => :update
15
+ attr_reader :updated, :bullet
16
+
17
+ def initialize
18
+ @bullet = Bullet.new
19
+ end
20
+
21
+ def update(time_elapsed)
22
+ @updated=true
23
+ end
24
+
25
+ def create_bullet
26
+ Bullet.new
27
+ end
28
+ end
29
+
30
+ class ShootState
31
+ include Shattered::Timer
32
+ timer :every => :frame, :action => :update
33
+ attr_accessor :update_order
34
+
35
+ def initialize
36
+ @gun = Gun.new
37
+ end
38
+
39
+
40
+ def update
41
+ @update_order = :last if gun.bullet.updated
42
+ end
43
+
44
+ def gun
45
+ @gun
46
+ end
47
+
48
+ end
49
+
50
+ # To test timer :if
51
+ class Beetle
52
+ include Shattered::Timer
53
+ { :eat => true,
54
+ :fly => :has_wings?,
55
+ :talk => false
56
+ }.each_pair do |action, condition|
57
+ timer :every => :frame, :action => action, :if => condition
58
+ end
59
+ timer :every => :frame, :action => :reproduce, :unless => :sterile?
60
+
61
+ attr_reader :eaten, :flying, :reproduce
62
+ attr_writer :sterile, :has_wings
63
+
64
+ def eat
65
+ @eaten = true
66
+ end
67
+
68
+ def fly
69
+ @flying = true
70
+ end
71
+
72
+ def reproduce
73
+ @reproduced = true
74
+ end
75
+
76
+ def sterile?
77
+ @sterile
78
+ end
79
+
80
+ def has_wings?
81
+ @has_wings
82
+ end
83
+ end
84
+
85
+ class Bomb
86
+ include Shattered::Timer
87
+ attr_reader :exploded, :ticks, :frame_time
88
+ timer :in => 1, :action => :explode
89
+ timer :every => 0.5, :action => :tick
90
+ timer :every => :frame, :action => :frame
91
+ def explode
92
+ @exploded = true
93
+ end
94
+ def tick
95
+ @ticks ||= 0
96
+ @ticks += 1
97
+ end
98
+ def frame(time_elapsed)
99
+ @frame_time = time_elapsed
100
+ end
101
+ end
102
+
103
+ class Quarrelsome
104
+ include Shattered::Timer
105
+ timer :in => 0.1, :action => :argument_error
106
+
107
+ def argument_error
108
+ raise ArgumentError, "This error should go through"
109
+ end
110
+
111
+ end
112
+
113
+ class JetPack
114
+ include Shattered::Timer
115
+ attr_reader :name, :volume, :location, :boost
116
+ timer :in => 1.seconds, :action => { :play => ["Blast", {:volume => 0.8, :location => :front}] }
117
+ timer :in => 2.seconds, :action => { :booster => 10 }
118
+ # timer :in => 10.seconds, :action => { :powerup } This syntax is not allowed
119
+ timer :in => 3.seconds, :action => { :booster => [] }
120
+ timer :in => 4.seconds, :action => { :booster => [10] }
121
+
122
+ def booster(b = nil)
123
+ @boost = b
124
+ end
125
+ def play(name, options)
126
+ @name = name
127
+ @volume = options[:volume]
128
+ @location = options[:location]
129
+ end
130
+ end
131
+
132
+ class BaseTimerTest < Test::Unit::TestCase
133
+
134
+ attr_reader :bomb
135
+ def setup
136
+ @bomb = Bomb.new
137
+ @state = ShootState.new
138
+ end
139
+
140
+ # Ensure the timer :action parameters function properly
141
+ def test_timer_action_with_arguments
142
+ @jet_pack = JetPack.new
143
+ @jet_pack.timer.update(1)
144
+ assert_equal(0.8, @jet_pack.volume)
145
+ assert_equal(:front, @jet_pack.location)
146
+ assert_equal("Blast", @jet_pack.name)
147
+
148
+ @jet_pack.timer.update(1)
149
+ assert_equal(10, @jet_pack.boost)
150
+
151
+ @jet_pack.timer.update(1)
152
+ assert_nil(@jet_pack.boost)
153
+
154
+ @jet_pack.timer.update(1)
155
+ assert_equal(10, @jet_pack.boost)
156
+ end
157
+
158
+ # Make sure that ShatteredModels get a Timer object
159
+ def test_timer_creation
160
+ assert_equal( Shattered::Timer::Timer, bomb.timer.class )
161
+ assert_equal( 3, bomb.timer.events_remaining.length )
162
+ end
163
+
164
+ #Make sure that :every events get called
165
+ def test_tick
166
+ bomb.timer.update(0.5)
167
+ assert_equal( 1, bomb.ticks)
168
+ bomb.timer.update(0.5)
169
+ assert_equal( 2, bomb.ticks)
170
+ end
171
+
172
+ # Ensure :in events get called
173
+ def test_explode
174
+ bomb.timer.update(3)
175
+ assert(bomb.exploded)
176
+ end
177
+
178
+ # Allow access to frame tick time for :every event
179
+ def test_frame
180
+ bomb.timer.update(0.123)
181
+ assert_equal(123, (bomb.frame_time*1000).round)
182
+ end
183
+
184
+ # Make sure that :every events can take 0 or 1 params
185
+ def test_argument_error
186
+ quarrel = Quarrelsome.new
187
+ assert_raises(ArgumentError, "Event should raise an exception") do
188
+ quarrel.timer.update(0.1)
189
+ end
190
+ quarrel.timer.destroy
191
+ end
192
+
193
+ # Testing if clause
194
+ def test_if
195
+ bug = Beetle.new
196
+ bug.has_wings=false
197
+ bug.sterile=true
198
+ assert(!bug.eaten)
199
+ Shattered::Timer::Timer.update(0)
200
+ assert(bug.eaten)
201
+ end
202
+
203
+ end
204
+
205
+
206
+
207
+ class TimerTest < Test::Unit::TestCase
208
+
209
+ attr_reader :waiter
210
+ def setup
211
+ @waiter = Shattered::Timer::Timer.new self
212
+ end
213
+
214
+ # Tests multiple events' lifetime
215
+ def test_stacking
216
+ waiter.in(2) do
217
+ end
218
+ waiter.in(3) do
219
+ end
220
+ waiter.update(1)
221
+ assert_equal(2, waiter.events_remaining.length)
222
+ end
223
+
224
+ # Tests passings blocks to :in events
225
+ def test_block
226
+ waiter.in(1) do
227
+ @first = true
228
+ end
229
+ waiter.in(2) do
230
+ @second = true
231
+ end
232
+ waiter.in(3) do
233
+ @third = true
234
+ end
235
+ waiter.update(2)
236
+ assert(@first)
237
+ assert(@second)
238
+ assert(@third.nil?)
239
+ end
240
+
241
+ # Tests nesting of :in events
242
+ def test_nesting
243
+ waiter.in(2) do
244
+ waiter.in(1) {}
245
+ waiter.in(1) {}
246
+ end
247
+ assert_equal(1, waiter.events_remaining.length)
248
+ waiter.update(2)
249
+ assert_equal(2,waiter.events_remaining.length)
250
+ end
251
+
252
+ # Make sure Timer can handle nested every events
253
+ def test_every
254
+ waiter.every(2) do
255
+ waiter.every(2) {}
256
+ waiter.every(2) {}
257
+ end
258
+ assert_equal(1, waiter.events_remaining.length)
259
+ waiter.update(2)
260
+ assert_equal(3, waiter.events_remaining.length)
261
+ end
262
+
263
+ # Makes sure timer can handle multiple timed events, mixing :in and :every
264
+ def test_multiple_events
265
+ waiter.in(2) do
266
+ @in = true
267
+ end
268
+ waiter.every(1) do
269
+ @count ||= 0
270
+ @count += 1
271
+ end
272
+ waiter.update(1)
273
+ assert(@in.nil?)
274
+ assert_equal(1,@count)
275
+ waiter.update(1)
276
+ assert_equal(2,@count)
277
+ assert(@in)
278
+ end
279
+
280
+ # Ensure if and unless work for instance functions.
281
+ def test_if
282
+ waiter.in(1.second, :if => true) do
283
+ @served=:if
284
+ end
285
+ waiter.in(2.seconds, :unless => false) do
286
+ @served=:unless
287
+ end
288
+ {:unless => true, :if => false}.each_pair do |action, condition|
289
+ waiter.in(3.seconds, action => condition) do
290
+ raise ShatteredModel::Error, "This should not happen"
291
+ end
292
+ end
293
+ waiter.update(1)
294
+ assert_equal(:if, @served)
295
+ waiter.update(1)
296
+ assert_equal(:unless,@served)
297
+ waiter.update(1)
298
+ end
299
+
300
+ # See if we can pass arguments to an if function
301
+ # def test_if_arguments
302
+ # waiter.in(1.second, :unless => {:drunk => :today}) do
303
+ # @worked=true
304
+ # end
305
+ # waiter.every(1.second,)
306
+ # end
307
+
308
+ # Make sure we get the timer event object when creating a new event.
309
+ def test_timer_object
310
+ timer = waiter.in(1) {}
311
+ assert_kind_of(Shattered::Timer::TimedEvent, timer)
312
+ timer = waiter.every(1) {}
313
+ assert_kind_of(Shattered::Timer::ContinuousTimedEvent, timer)
314
+ end
315
+
316
+ # See if we can stop a timer
317
+ def test_timer_halt
318
+ timer = waiter.every(1) do
319
+ @updated = true
320
+ end
321
+ timer.stop
322
+ timer.update(1)
323
+ assert_nil(@updated)
324
+ end
325
+ end