test/drawable_test.rb in ray-0.1.0.pre1 vs test/drawable_test.rb in ray-0.1.0

- old
+ new

@@ -1,19 +1,219 @@ require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb' context "a drawable" do - setup do - @block = Proc.new {} - Ray::Drawable.new(&@block) + setup { Ray::Drawable.new } + + asserts(:origin).equals Ray::Vector2[0, 0] + asserts(:scale).equals Ray::Vector2[1, 1] + asserts(:pos).equals Ray::Vector2[0, 0] + asserts(:z).equals 0 + asserts(:angle).equals 0 + asserts(:shader).nil + + context "after changing origin" do + hookup { topic.origin = Ray::Vector2[10, 20] } + + asserts(:origin).equals Ray::Vector2[10, 20] + asserts(:scale).equals Ray::Vector2[1, 1] + asserts(:pos).equals Ray::Vector2[0, 0] + asserts(:z).equals 0 + asserts(:angle).equals 0 end - context "after drawing" do + context "after changing the scale" do + hookup { topic.scale = Ray::Vector2[3, 0.5] } + + asserts(:origin).equals Ray::Vector2[0, 0] + asserts(:scale).equals Ray::Vector2[3, 0.5] + asserts(:pos).equals Ray::Vector2[0, 0] + asserts(:z).equals 0 + asserts(:angle).equals 0 + end + + context "after changing pos" do + hookup { topic.pos = Ray::Vector2[10, 20] } + + asserts(:origin).equals Ray::Vector2[0, 0] + asserts(:scale).equals Ray::Vector2[1, 1] + asserts(:pos).equals Ray::Vector2[10, 20] + asserts(:z).equals 0 + asserts(:angle).equals 0 + end + + context "after changing z" do + hookup { topic.z = -0.5 } + + asserts(:origin).equals Ray::Vector2[0, 0] + asserts(:scale).equals Ray::Vector2[1, 1] + asserts(:pos).equals Ray::Vector2[0, 0] + asserts(:z).equals(-0.5) + asserts(:angle).equals 0 + end + + context "after changing angle" do + hookup { topic.angle = 60 } + + asserts(:origin).equals Ray::Vector2[0, 0] + asserts(:scale).equals Ray::Vector2[1, 1] + asserts(:pos).equals Ray::Vector2[0, 0] + asserts(:z).equals 0 + asserts(:angle).equals 60 + end + + context "with several transformations" do hookup do - stub(@block).call - (@img = Ray::Image.new(:w => 10, :h => 10)).draw_drawable topic + topic.origin = [30, 40] + topic.pos = [10, 20] + topic.angle = 90 + topic.scale = [2, 0.5] + topic.z = 9 end - asserts("the block") { @block }.received(:call) { @img } + # (10, 30) => (-20, -10) (origin) + # (-20, -10) => (-40, -5) (scale) + # (-40, -5) => (5, -40) (rotate) + # (5, -40) => (15, -20) (translate) + + asserts(:transform, [10, 30]).almost_equals(Ray::Vector3[15, -20, 9], 1e-6) + + asserts("matrix.transform (10, 30)") { + topic.matrix.transform [10, 30] + }.almost_equals(Ray::Vector3[15, -20, 9], 1e-6) + + context "created from a copy" do + setup { topic.dup } + + asserts(:origin).equals Ray::Vector2[30, 40] + asserts(:pos).equals Ray::Vector2[10, 20] + asserts(:angle).equals 90 + asserts(:scale).equals Ray::Vector2[2, 0.5] + asserts(:z).equals 9 + end + + context "and a custom matrix" do + hookup do + topic.matrix = Ray::Matrix.new + end + + asserts(:matrix).equals Ray::Matrix.new + asserts(:transform, [10, 30]).equals Ray::Vector3[10, 30, 0] + + context "that has been disabled" do + hookup do + topic.matrix = nil + end + + asserts(:transform, [10, 30]).almost_equals(Ray::Vector3[15, -20, 9], + 1e-6) + end + end + end + + context "after changing shader" do + hookup do + topic.shader = @shader = Ray::Shader.new + end + + asserts(:shader).equals { @shader } + end +end + +class CustomDrawable < Ray::Drawable + include Ray::GL + + Vertex = Ray::GL::Vertex.make [ + [:pos, "pos", :vector2] + ] + + def initialize + super Vertex + self.vertex_count = 3 + end + + def fill_vertices + [Vertex.new([0, 0]), + Vertex.new([50, 0]), + Vertex.new([50, 50])] + end + + def fill_indices(from) + Ray::GL::IntArray.new(from + 0, from + 1, from + 2) + end + + def render(vertex, index) + draw_arrays :triangles, vertex, 3 + end +end + +context "a custom drawable" do + setup { CustomDrawable.new } + + asserts(:vertex_count).equals 3 + asserts :changed? + denies :textured? + + target = Ray::Window.new + target.open "test", [100, 100] + + context "drawn" do + hookup do + proxy(topic).fill_vertices + proxy(topic).fill_indices + proxy(topic).render + target.draw topic + end + + asserts_topic.received :fill_vertices + denies_topic.received :fill_indices, anything + asserts_topic.received :render, is_a(Integer), 0 + + denies :changed? + + context "twice" do + hookup do + target.draw topic + end + + denies_topic.received :fill_vertices => 2 + asserts_topic.received({:render => 2}, is_a(Integer), 0) + + denies :changed? + end + + context "and changed" do + hookup { topic.changed! } + asserts :changed? + + context "and drawn again" do + hookup { target.draw topic } + denies :changed? + + asserts_topic.received :fill_vertices => 2 + asserts_topic.received({:render => 2}, is_a(Integer), 0) + end + end + end + + context "with indices" do + hookup do + proxy(topic).fill_indices + topic.index_count = 3 + + target.draw topic + end + + asserts_topic.received :fill_indices, is_a(Integer) + end + + context "with more indices than it gives" do + hookup { topic.index_count = 5 } + asserts("drawing it") { target.draw topic }.raises_kind_of RuntimeError + end + + context "after enabling texturing" do + hookup { topic.textured = true } + asserts :textured? end end run_tests if __FILE__ == $0