root/lang/ruby/starframe/test/starframe/sprite/test_collidable.rb @ 27863

Revision 27863, 6.5 kB (checked in by isaisstillalive, 4 years ago)
  • Sprite拡張モジュールをInitializableモジュールに対応
Line 
1require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "helper"))
2require "starframe/sprite"
3require "starframe/sprite/collidable"
4
5class TestStarFrameSpriteCollidable < Test::Unit::TestCase
6  def test_animatable_has_need_initializable_module
7    assert_raise(TypeError) do
8      Class.new do
9        include StarFrame::Sprite::Collidable
10      end
11    end
12  end
13 
14 
15  class TestCollision < StarFrame::Sprite::Collision::Base
16    attr_accessor :options
17   
18    def initialize target, method_name, options1, options2
19      super
20    end
21   
22    def collide? other
23      (global_position == other.global_position)
24    end
25  end
26 
27  class CollisionSprite < StarFrame::Sprite
28    include StarFrame::Sprite::Collidable
29    attr_reader :collisions
30   
31    @texture = StarRuby::Texture.load "texture"
32   
33    attr_reader :others
34    init do |*args|
35      @others = []
36    end
37    collision :test, TestCollision, :options1, :options2 do |other|
38      @others << other
39    end
40  end
41  class CollisionSpriteSub < CollisionSprite
42    collision :test2, TestCollision, :options_sub do |other|
43    end
44  end
45  class EmptyCollisionSpriteSub < CollisionSprite
46    collision :test3, TestCollision, :options
47  end
48 
49  def test_class_variables
50    assert_equal 1, CollisionSprite.collisions.size
51    assert_equal TestCollision,          CollisionSprite.collisions[:test][0]
52    assert_equal true,                   CollisionSprite.method_defined?(CollisionSprite.collisions[:test][1])
53    assert_equal [:options1, :options2], CollisionSprite.collisions[:test][2]
54  end
55 
56  def test_class_variables_subclass
57    assert_not_equal   CollisionSprite.collisions.__id__, CollisionSpriteSub.collisions.__id__
58    assert_equal CollisionSprite.collisions, CollisionSpriteSub.collisions.reject{|k,v| k == :test2 }
59   
60    assert_equal 2, CollisionSpriteSub.collisions.size
61    assert_equal [:options_sub], CollisionSpriteSub.collisions[:test2][2]
62  end
63 
64  def test_class_variables_empty_collision
65    assert_equal true,  EmptyCollisionSpriteSub.collisions.key?(:test3)
66    assert_equal false, EmptyCollisionSpriteSub.method_defined?(:_starframe_sprite_collidable__collision_test3)
67    assert_nil          EmptyCollisionSpriteSub.collisions[:test3][1]
68  end
69 
70  def test_initialize
71    sprite = CollisionSprite.new(10, 10)
72    assert_equal       1,             sprite.collisions.size
73    assert_equal       true,          sprite.collisions.key?(:test)
74    assert_instance_of TestCollision, sprite.collisions[:test]
75    assert_equal       sprite,        sprite.collisions[:test].instance_variable_get(:@sprite)
76  end
77 
78  def test_collision_reader
79    sprite = CollisionSprite.new(10, 10)
80    assert_not_nil                           sprite.collision(:test)
81    assert_equal   sprite.collisions[:test], sprite.collision(:test)
82  end
83 
84 
85  def assert_collide sprite1, sprite2, expected, &block
86    assert_equal expected, block.call(sprite1, sprite2)
87  end
88  def assert_collide_sprite_and_sprite expected, collide = false, &block
89    sprite1 = CollisionSprite.new(10, 10)
90    sprite2 = CollisionSprite.new((expected ? 10 : 11), 10)
91   
92    assert_collide sprite1, sprite2, expected, &block
93   
94    if collide
95      assert_equal [sprite2], sprite1.others
96      assert_equal [sprite1], sprite2.others
97    else
98      assert_equal [], sprite1.others
99      assert_equal [], sprite2.others
100    end
101  end
102 
103  def test_collide_true
104    assert_collide_sprite_and_sprite expected = true, collide = true do |sprite1, sprite2|
105      sprite1.collide(:test, sprite2, :test)
106    end
107  end
108  def test_collide_false
109    assert_collide_sprite_and_sprite expected = false, collide = false do |sprite1, sprite2|
110      sprite1.collide(:test, sprite2, :test)
111    end
112  end
113  def test_collide_q_true
114    assert_collide_sprite_and_sprite expected = true, collide = false do |sprite1, sprite2|
115      sprite1.collide?(:test, sprite2, :test)
116    end
117  end
118  def test_collide_q_false
119    assert_collide_sprite_and_sprite expected = false, collide = false do |sprite1, sprite2|
120      sprite1.collide?(:test, sprite2, :test)
121    end
122  end
123 
124  def test_collide_with_collision_true
125    assert_collide_sprite_and_sprite expected = true, collide = true do |sprite1, sprite2|
126      sprite1.collide(:test, sprite2.collision(:test))
127    end
128  end
129  def test_collide_with_collision_false
130    assert_collide_sprite_and_sprite expected = false, collide = false do |sprite1, sprite2|
131      sprite1.collide(:test, sprite2.collision(:test))
132    end
133  end
134  def test_collide_q_with_collision_true
135    assert_collide_sprite_and_sprite expected = true, collide = false do |sprite1, sprite2|
136      sprite1.collide?(:test, sprite2.collision(:test))
137    end
138  end
139  def test_collide_q_with_collision_false
140    assert_collide_sprite_and_sprite expected = false, collide = false do |sprite1, sprite2|
141      sprite1.collide?(:test, sprite2.collision(:test))
142    end
143  end
144 
145  def assert_collide_collection_and_sprite collide = false, &block
146    collection = StarFrame::Sprite::Collection.new
147    collection << csprite1 = CollisionSprite.new(10, 10)
148    collection << csprite2 = CollisionSprite.new(10, 10)
149    collection << csprite3 = CollisionSprite.new(11, 10)
150    sprite                 = CollisionSprite.new(10, 10)
151   
152    assert_collide collection, sprite, 2, &block
153   
154    if collide
155      assert_equal [sprite],             csprite1.others
156      assert_equal [sprite],             csprite2.others
157      assert_equal [],                   csprite3.others
158      assert_equal [csprite1, csprite2], sprite.others
159    else
160      assert_equal [], csprite1.others
161      assert_equal [], csprite2.others
162      assert_equal [], csprite3.others
163      assert_equal [], sprite.others
164    end
165  end
166  def test_collection_collide
167    assert_collide_collection_and_sprite collide = true do |collection, sprite|
168      collection.collide(:test, sprite, :test)
169    end
170  end
171  def test_collection_collide_q
172    assert_collide_collection_and_sprite collide = false do |collection, sprite|
173      collection.collide?(:test, sprite, :test)
174    end
175  end
176  def test_collide_with_collection
177    assert_collide_collection_and_sprite collide = true do |collection, sprite|
178      sprite.collide(:test, collection, :test)
179    end
180  end
181  def test_collide_q_with_collection
182    assert_collide_collection_and_sprite collide = false do |collection, sprite|
183      sprite.collide?(:test, collection, :test)
184    end
185  end
186end
Note: See TracBrowser for help on using the browser.