ray 0.0.1 → 0.1.0.pre1

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 (188) hide show
  1. data/.gemtest +0 -0
  2. data/.yardopts +4 -0
  3. data/README.md +17 -21
  4. data/Rakefile +18 -139
  5. data/VERSION +1 -1
  6. data/ext/audio.cpp +723 -0
  7. data/ext/{color.c → color.cpp} +25 -13
  8. data/ext/drawable.cpp +91 -0
  9. data/ext/event.cpp +460 -0
  10. data/ext/extconf.rb +5 -104
  11. data/ext/font.cpp +190 -0
  12. data/ext/image.cpp +733 -0
  13. data/ext/input.cpp +74 -0
  14. data/ext/ray.cpp +168 -0
  15. data/ext/ray.hpp +356 -0
  16. data/ext/{rect.c → rect.cpp} +51 -37
  17. data/ext/shader.cpp +169 -0
  18. data/ext/shape.cpp +409 -0
  19. data/ext/sprite.cpp +306 -0
  20. data/ext/text.cpp +181 -0
  21. data/ext/vector.cpp +215 -0
  22. data/guide.md +619 -0
  23. data/lib/ray/audio.rb +0 -41
  24. data/lib/ray/color.rb +32 -10
  25. data/lib/ray/drawable.rb +16 -0
  26. data/lib/ray/dsl/event_listener.rb +25 -2
  27. data/lib/ray/dsl/event_runner.rb +33 -5
  28. data/lib/ray/dsl/event_translator.rb +66 -30
  29. data/lib/ray/dsl/handler.rb +3 -2
  30. data/lib/ray/dsl/matcher.rb +58 -14
  31. data/lib/ray/font.rb +38 -96
  32. data/lib/ray/font_set.rb +8 -8
  33. data/lib/ray/game.rb +87 -66
  34. data/lib/ray/helper.rb +105 -10
  35. data/lib/ray/image.rb +150 -24
  36. data/lib/ray/image_set.rb +3 -1
  37. data/lib/ray/input.rb +10 -0
  38. data/lib/ray/music_set.rb +5 -3
  39. data/lib/ray/ray.rb +21 -9
  40. data/lib/ray/rect.rb +48 -7
  41. data/lib/ray/rmagick.rb +41 -0
  42. data/lib/ray/scene.rb +99 -43
  43. data/lib/ray/scene_list.rb +67 -0
  44. data/lib/ray/shape.rb +132 -0
  45. data/lib/ray/sound_set.rb +4 -2
  46. data/lib/ray/sprite.rb +49 -111
  47. data/lib/ray/text.rb +101 -0
  48. data/lib/ray/text_helper.rb +37 -0
  49. data/lib/ray/turtle.rb +215 -0
  50. data/lib/ray/vector.rb +226 -0
  51. data/samples/audio/spacial.rb +44 -0
  52. data/samples/hello_world/hello.rb +9 -13
  53. data/samples/hello_world/hello_dsl.rb +8 -12
  54. data/samples/hello_world/text.rb +15 -0
  55. data/samples/opengl/binding.rb +38 -0
  56. data/samples/opengl/image.rb +32 -0
  57. data/samples/opengl/opengl.rb +34 -0
  58. data/samples/opengl/shader.rb +42 -0
  59. data/samples/pong/pong.rb +14 -10
  60. data/samples/run_scene.rb +53 -0
  61. data/samples/shaders/scene.rb +40 -0
  62. data/samples/shaders/shaders.rb +42 -0
  63. data/samples/shaders/shape.rb +34 -0
  64. data/samples/sokoban/sokoban.rb +18 -18
  65. data/samples/test/actual_scene.rb +41 -0
  66. data/samples/test/scene_riot.rb +39 -0
  67. data/samples/test/scene_spec.rb +32 -0
  68. data/samples/test/scene_test_unit.rb +25 -0
  69. data/samples/turtle/byzantium.rb +45 -0
  70. data/samples/turtle/hilbert.rb +48 -0
  71. data/samples/turtle/koch.rb +55 -0
  72. data/samples/turtle/mandala.rb +61 -0
  73. data/samples/turtle/tree.rb +57 -0
  74. data/test/audio_test.rb +69 -0
  75. data/test/color_test.rb +77 -0
  76. data/test/drawable_test.rb +19 -0
  77. data/test/dsl_test.rb +93 -0
  78. data/test/font_test.rb +57 -0
  79. data/test/helpers.rb +94 -0
  80. data/test/image_test.rb +82 -0
  81. data/test/ray_test.rb +25 -0
  82. data/test/rect_test.rb +121 -0
  83. data/{spec → test}/res/VeraMono.ttf +0 -0
  84. data/{spec → test}/res/aqua.bmp +0 -0
  85. data/{spec → test}/res/aqua.png +0 -0
  86. data/{spec → test}/res/aqua2.bmp +0 -0
  87. data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
  88. data/{spec → test}/res/pop.wav +0 -0
  89. data/test/resource_set_test.rb +99 -0
  90. data/test/run_all.rb +7 -0
  91. data/test/shape_test.rb +101 -0
  92. data/test/sprite_test.rb +89 -0
  93. data/test/text_test.rb +78 -0
  94. data/test/turtle_test.rb +176 -0
  95. data/test/vector_test.rb +111 -0
  96. data/yard_ext.rb +0 -28
  97. metadata +95 -139
  98. data/.gitignore +0 -23
  99. data/.gitmodules +0 -3
  100. data/.rspec +0 -3
  101. data/ext/audio.c +0 -473
  102. data/ext/event.c +0 -557
  103. data/ext/font.c +0 -287
  104. data/ext/image.c +0 -933
  105. data/ext/joystick.c +0 -145
  106. data/ext/ray.c +0 -489
  107. data/ext/ray.h +0 -245
  108. data/ext/ray_osx.m +0 -161
  109. data/lib/ray/joystick.rb +0 -30
  110. data/psp/SDL_psp_main.c +0 -84
  111. data/psp/bigdecimal/README +0 -60
  112. data/psp/bigdecimal/bigdecimal.c +0 -4697
  113. data/psp/bigdecimal/bigdecimal.h +0 -216
  114. data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
  115. data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
  116. data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
  117. data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
  118. data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
  119. data/psp/digest/bubblebabble/bubblebabble.c +0 -142
  120. data/psp/digest/defs.h +0 -20
  121. data/psp/digest/digest.c +0 -643
  122. data/psp/digest/digest.h +0 -32
  123. data/psp/digest/lib/digest.rb +0 -50
  124. data/psp/digest/lib/md5.rb +0 -27
  125. data/psp/digest/lib/sha1.rb +0 -27
  126. data/psp/digest/md5/md5.c +0 -420
  127. data/psp/digest/md5/md5.h +0 -80
  128. data/psp/digest/md5/md5init.c +0 -40
  129. data/psp/digest/rmd160/rmd160.c +0 -457
  130. data/psp/digest/rmd160/rmd160.h +0 -56
  131. data/psp/digest/rmd160/rmd160init.c +0 -40
  132. data/psp/digest/sha1/sha1.c +0 -269
  133. data/psp/digest/sha1/sha1.h +0 -39
  134. data/psp/digest/sha1/sha1init.c +0 -40
  135. data/psp/digest/sha2/lib/sha2.rb +0 -73
  136. data/psp/digest/sha2/sha2.c +0 -919
  137. data/psp/digest/sha2/sha2.h +0 -109
  138. data/psp/digest/sha2/sha2init.c +0 -52
  139. data/psp/enumerator/enumerator.c +0 -298
  140. data/psp/etc/etc.c +0 -559
  141. data/psp/ext.c +0 -289
  142. data/psp/fcntl/fcntl.c +0 -187
  143. data/psp/lib/rbconfig.rb +0 -178
  144. data/psp/nkf/lib/kconv.rb +0 -367
  145. data/psp/nkf/nkf-utf8/config.h +0 -88
  146. data/psp/nkf/nkf-utf8/nkf.c +0 -6040
  147. data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
  148. data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
  149. data/psp/nkf/nkf.c +0 -654
  150. data/psp/socket/addrinfo.h +0 -173
  151. data/psp/socket/getaddrinfo.c +0 -676
  152. data/psp/socket/getnameinfo.c +0 -270
  153. data/psp/socket/pspsocket.c +0 -71
  154. data/psp/socket/pspsocket.h +0 -28
  155. data/psp/socket/socket.c +0 -4662
  156. data/psp/socket/sockport.h +0 -76
  157. data/psp/stringio/stringio.c +0 -1306
  158. data/psp/strscan/strscan.c +0 -1320
  159. data/psp/syck/bytecode.c +0 -1166
  160. data/psp/syck/emitter.c +0 -1242
  161. data/psp/syck/gram.c +0 -1894
  162. data/psp/syck/gram.h +0 -79
  163. data/psp/syck/handler.c +0 -174
  164. data/psp/syck/implicit.c +0 -2990
  165. data/psp/syck/node.c +0 -408
  166. data/psp/syck/rubyext.c +0 -2367
  167. data/psp/syck/syck.c +0 -504
  168. data/psp/syck/syck.h +0 -456
  169. data/psp/syck/token.c +0 -2725
  170. data/psp/syck/yaml2byte.c +0 -257
  171. data/psp/syck/yamlbyte.h +0 -170
  172. data/psp/thread/thread.c +0 -1175
  173. data/psp/zlib/zlib.c +0 -3547
  174. data/script.rb +0 -10
  175. data/spec/ray/audio_spec.rb +0 -146
  176. data/spec/ray/color_spec.rb +0 -57
  177. data/spec/ray/event_spec.rb +0 -80
  178. data/spec/ray/font_spec.rb +0 -93
  179. data/spec/ray/image_set_spec.rb +0 -48
  180. data/spec/ray/image_spec.rb +0 -162
  181. data/spec/ray/joystick_spec.rb +0 -21
  182. data/spec/ray/matcher_spec.rb +0 -50
  183. data/spec/ray/ray_spec.rb +0 -88
  184. data/spec/ray/rect_spec.rb +0 -154
  185. data/spec/ray/resource_set_spec.rb +0 -105
  186. data/spec/ray/sprite_spec.rb +0 -163
  187. data/spec/spec.opts +0 -4
  188. data/spec/spec_helper.rb +0 -8
@@ -0,0 +1,89 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
2
+
3
+ context Ray::Sprite do
4
+ setup { Ray::Sprite }
5
+
6
+ asserts("doesn't copy the image when created") do
7
+ topic.new(Ray.screen).image == Ray.screen
8
+ end
9
+
10
+ asserts("converts the argument of #initialize to an image") do
11
+ image = Ray::ImageSet[path_of("aqua.bmp")]
12
+ sprite = Ray::Sprite.new(path_of("aqua.bmp"))
13
+
14
+ sprite.image == image
15
+ end
16
+ end
17
+
18
+ context "a sprite" do
19
+ setup { Ray::Sprite.new(Ray.screen) }
20
+
21
+ asserts(:pos).equals(Ray::Vector2[0, 0])
22
+
23
+ asserts(:angle).equals(0)
24
+ asserts(:zoom).equals(Ray::Vector2[1, 1])
25
+
26
+ asserts(:rect).equals(Ray::Rect.new(0, 0, 100, 150))
27
+ asserts(:to_rect).equals(Ray::Rect.new(0, 0, 100, 150))
28
+
29
+ asserts(:from_rect).equals(Ray::Rect.new(0, 0, 100, 150))
30
+
31
+ asserts(:shader).nil
32
+ asserts(:color).equals(Ray::Color.white)
33
+
34
+ context "after changing position" do
35
+ hookup { topic.pos = [20, 30] }
36
+ asserts(:pos).equals(Ray::Vector2[20, 30])
37
+ end
38
+
39
+ context "after changing drawn rect" do
40
+ hookup { topic.from_rect = [50, 30, 100, 120].to_rect }
41
+ asserts(:from_rect).equals(Ray::Rect.new(50, 30, 100, 120))
42
+ end
43
+
44
+ context "after changing angle" do
45
+ hookup { topic.angle = 30 }
46
+ asserts(:angle).equals(30)
47
+ end
48
+
49
+ context "after changing zoom" do
50
+ hookup { topic.zoom = [3, 4] }
51
+
52
+ asserts(:zoom).equals(Ray::Vector2[3, 4])
53
+ asserts(:rect).equals(Ray::Rect.new(0, 0, 300, 600))
54
+ end
55
+
56
+ context "using a sprite sheet" do
57
+ hookup { topic.sheet_size = [10, 10] }
58
+ asserts(:from_rect).equals(Ray::Rect.new(0, 0, 10, 15))
59
+
60
+ context "after changing position in it" do
61
+ hookup { topic.sheet_pos = [3, 5] }
62
+ asserts(:from_rect).equals(Ray::Rect.new(30, 75, 10, 15))
63
+ end
64
+
65
+ context "after disabling it" do
66
+ hookup { topic.disable_sprite_sheet }
67
+ asserts(:from_rect).equals(Ray::Rect.new(0, 0, 100, 150))
68
+ end
69
+ end
70
+
71
+ context "after changing shader" do
72
+ hookup do
73
+ @shader = Ray::Shader.new StringIO.new(<<-SHADER)
74
+ void main() {}
75
+ SHADER
76
+
77
+ topic.shader = @shader
78
+ end
79
+
80
+ asserts(:shader).equals { @shader }
81
+ end
82
+
83
+ context "after changing color" do
84
+ hookup { topic.color = Ray::Color.red }
85
+ asserts(:color).equals(Ray::Color.red)
86
+ end
87
+ end
88
+
89
+ run_tests if __FILE__ == $0
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
3
+
4
+ context "a text" do
5
+ setup { Ray::Text.new "Hello world!" }
6
+
7
+ asserts(:content).equals "Hello world!"
8
+
9
+ asserts(:style).equals Ray::Font::STYLE_NORMAL
10
+
11
+ asserts(:pos).equals Ray::Vector2[0, 0]
12
+ asserts(:scale).equals Ray::Vector2[1, 1]
13
+ asserts(:angle).equals 0
14
+
15
+ asserts(:character_size).equals 12
16
+
17
+ asserts(:color).equals Ray::Color.white
18
+
19
+ context "after changing style" do
20
+ hookup { topic.style = [:bold, :italic] }
21
+ asserts(:style).equals Ray::Font::STYLE_BOLD | Ray::Font::STYLE_ITALIC
22
+ end
23
+
24
+ context "after changing string" do
25
+ hookup do
26
+ topic.encoding = "utf-8" # Would be required in 1.8 (but utf-8 is the default)
27
+ topic.content = "héllo"
28
+ end
29
+
30
+ asserts(:encoding).matches /utf-8/i
31
+ asserts(:content).equals "héllo"
32
+ end
33
+
34
+ context "after changing position" do
35
+ hookup { topic.pos = [13, 22] }
36
+ asserts(:pos).equals Ray::Vector2[13, 22]
37
+ end
38
+
39
+ context "after changing angle" do
40
+ hookup { topic.angle = 90 }
41
+ asserts(:angle).equals 90
42
+ end
43
+
44
+ context "after changing scale" do
45
+ hookup { topic.scale = [2, 10] }
46
+ asserts(:scale).equals Ray::Vector2[2, 10]
47
+ end
48
+
49
+ context "after changing character size" do
50
+ hookup { topic.character_size = 120 }
51
+ asserts(:character_size).equals 120
52
+ end
53
+
54
+ context "with another position and scale" do
55
+ hookup do
56
+ topic.pos = [10, 20]
57
+ topic.scale = [2, 10]
58
+ end
59
+
60
+ asserts("position of the rect") { topic.rect.pos }.equals Ray::Vector2[10, 20]
61
+ asserts("size / size without scale") {
62
+ scaled_size = topic.size
63
+
64
+ topic.scale = [1, 1]
65
+ size = topic.size
66
+ topic.scale = [2, 10]
67
+
68
+ scaled_size / size
69
+ }.equals Ray::Vector2[2, 10]
70
+ end
71
+
72
+ context "after changing the color" do
73
+ hookup { topic.color = Ray::Color.red }
74
+ asserts(:color).equals Ray::Color.red
75
+ end
76
+ end
77
+
78
+ run_tests if __FILE__ == $0
@@ -0,0 +1,176 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
3
+
4
+ context "a turtle" do
5
+ setup { Ray::Turtle.new(Ray.screen) }
6
+
7
+ asserts(:drawing?)
8
+ asserts(:pos).equals(Ray::Vector2[0, 0])
9
+ asserts(:angle_unit).equals(:deg)
10
+ asserts(:angle).equals(0)
11
+ asserts(:pen_width).equals(1)
12
+
13
+ asserts("setting angle unit to something else than :deg or :rad") {
14
+ topic.angle_unit = :foo
15
+ }.raises ArgumentError
16
+
17
+ context "moved to [10, 15]" do
18
+ hookup { topic.pos = [10, 15] }
19
+ asserts(:pos).equals(Ray::Vector2[10, 15])
20
+ end
21
+
22
+ context "with pen up" do
23
+ hookup { topic.pen_up }
24
+ denies(:drawing?)
25
+
26
+ context "when asked to set pen down" do
27
+ hookup { topic.pen_down }
28
+ asserts(:drawing?)
29
+ end
30
+ end
31
+
32
+ context "using radians" do
33
+ hookup { topic.angle_unit = :rad }
34
+
35
+ context "with angle = π" do
36
+ hookup { topic.angle = PI }
37
+ asserts(:angle).almost_equals(PI)
38
+
39
+ context "when asked to use degrees" do
40
+ hookup { topic.angle_unit = :deg }
41
+ asserts(:angle).almost_equals(180)
42
+ end
43
+ end
44
+ end
45
+
46
+ context "using degrees" do
47
+ hookup { topic.angle_unit = :deg }
48
+
49
+ context "with angle = 90" do
50
+ hookup { topic.angle = 90 }
51
+ asserts(:angle).almost_equals(90)
52
+
53
+ context "when asked to use radians" do
54
+ hookup { topic.angle_unit = :rad }
55
+ asserts(:angle).almost_equals(PI / 2)
56
+ end
57
+ end
58
+ end
59
+
60
+ context "with angle = -30" do
61
+ hookup { topic.angle = -30 }
62
+
63
+ context "after having moved forward by 10" do
64
+ hookup { topic.forward 10 }
65
+
66
+ asserts(:x).almost_equals(+cos(deg_to_rad(-30)) * 10)
67
+ asserts(:y).almost_equals(-sin(deg_to_rad(-30)) * 10) # reversed y axis
68
+ end
69
+ end
70
+
71
+ context "which was drawing" do
72
+ hookup { stub(topic.img).draw_line }
73
+
74
+ context "with pen_width = 3.4" do
75
+ hookup { topic.pen_width = 3.4 }
76
+
77
+ context "after having moved forward by 10" do
78
+ hookup { topic.forward(10) }
79
+ asserts(:img).received(:draw_line, [0, 0], [10, 0], is_a(Ray::Color), 3.4)
80
+ end
81
+ end
82
+
83
+ context "after having moved forward by 10" do
84
+ hookup { topic.forward(10) }
85
+ asserts(:img).received(:draw_line, [0, 0], [10, 0], is_a(Ray::Color), 1)
86
+ end
87
+
88
+ context "and went to (100, 100)" do
89
+ hookup { topic.go_to(100, 100) }
90
+
91
+ asserts(:img).received(:draw_line, [0, 0], [100, 100], is_a(Ray::Color), 1)
92
+ asserts(:pos).equals(Ray::Vector2[100, 100])
93
+ end
94
+
95
+ context "and went to the center of its image" do
96
+ hookup { topic.center }
97
+
98
+ asserts(:img).received(:draw_line, [0, 0], [50, 75], is_a(Ray::Color), 1)
99
+ asserts(:pos).equals(Ray::Vector2[50, 75])
100
+ end
101
+ end
102
+
103
+ context "which wasn't drawing" do
104
+ hookup do
105
+ topic.pen_up
106
+ stub(topic.img).draw_line
107
+ end
108
+
109
+ context "after having moved forward by 10" do
110
+ hookup { topic.forward(10) }
111
+ denies(:img).received(:draw_line, anything, anything, anything, anything)
112
+ end
113
+
114
+ context "and went to (100, 100)" do
115
+ hookup { topic.go_to(100, 100) }
116
+
117
+ denies(:img).received(:draw_line, anything, anything, anything, anything)
118
+ asserts(:pos).equals(Ray::Vector2[100, 100])
119
+ end
120
+
121
+ context "and went to the center of its image" do
122
+ hookup { topic.center }
123
+
124
+ denies(:img).received(:draw_line, anything, anything, anything, anything)
125
+ asserts(:pos).equals(Ray::Vector2[50, 75])
126
+ end
127
+ end
128
+
129
+ context "after having turned by 10° on the right" do
130
+ hookup { topic.right 10 }
131
+ asserts(:angle).almost_equals(-10)
132
+ end
133
+
134
+ context "after having turned by 10° on the left" do
135
+ hookup { topic.left 10 }
136
+ asserts(:angle).almost_equals(10)
137
+ end
138
+
139
+ context "with random parameters" do
140
+ hookup do
141
+ topic.pos = [100, 100]
142
+ topic.color = Ray::Color.red
143
+ topic.angle = 120
144
+ topic.pen_width = 3
145
+ topic.pen_up
146
+
147
+ stub(topic.img).fill
148
+ end
149
+
150
+ context "after #reset" do
151
+ hookup { topic.reset }
152
+
153
+ denies(:img).received(:fill, anything)
154
+
155
+ asserts(:pos).equals(Ray::Vector2[0, 0])
156
+ asserts(:angle).equals(0)
157
+ asserts(:color).equals(Ray::Color.white)
158
+ asserts(:drawing?)
159
+ asserts(:pen_width).equals(1)
160
+ end
161
+
162
+ context "after #clear" do
163
+ hookup { topic.clear }
164
+
165
+ asserts(:img).received(:fill, Ray::Color.none)
166
+
167
+ asserts(:pos).equals(Ray::Vector2[0, 0])
168
+ asserts(:angle).equals(0)
169
+ asserts(:color).equals(Ray::Color.white)
170
+ asserts(:drawing?)
171
+ asserts(:pen_width).equals(1)
172
+ end
173
+ end
174
+ end
175
+
176
+ run_tests if __FILE__ == $0
@@ -0,0 +1,111 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
2
+
3
+ context "a vector2" do
4
+ setup { Ray::Vector2[5, 15] }
5
+
6
+ asserts(:x).equals(5)
7
+ asserts(:y).equals(15)
8
+
9
+ asserts(:w).equals(5)
10
+ asserts(:h).equals(15)
11
+
12
+ asserts("#+ (1, 2)") { topic + [1, 2] }.equals Ray::Vector2[6, 17]
13
+ asserts("#- (1, 2)") { topic - [1, 2] }.equals Ray::Vector2[4, 13]
14
+
15
+ asserts("#* 2") { topic * 2 }.equals Ray::Vector2[10, 30]
16
+ asserts("#* (2, 1)") { topic * [2, 1] }.equals Ray::Vector2[10, 15]
17
+ asserts("#/ (2, 1)") { topic / [2, 1] }.equals Ray::Vector2[2.5, 15]
18
+ asserts("#dot (2, 1)") { topic.dot [2, 1] }.equals 25
19
+
20
+ asserts(:-@).equals Ray::Vector2[-5, -15]
21
+ asserts(:+@).equals Ray::Vector2[+5, +15]
22
+
23
+ asserts("#inside?(Ray::Rect.new(0, 0, 20, 20))") do
24
+ topic.inside? Ray::Rect.new(0, 0, 20, 20)
25
+ end
26
+
27
+ asserts("#outside?(Ray::Rect.new(8, 0, 20, 20))") do
28
+ topic.outside? Ray::Rect.new(8, 0, 20, 20)
29
+ end
30
+
31
+ asserts(:to_a).equals([5, 15])
32
+
33
+ asserts("equals to #to_a") { topic == [5, 15] }
34
+ asserts("equals to the same vector") { topic == Ray::Vector2[5, 15] }
35
+ asserts("equals to #dup") { topic == topic.dup }
36
+ asserts("eql? to the same vector") { topic.eql? Ray::Vector2[5, 15] }
37
+ asserts(:hash).equals { Ray::Vector2[5, 15].hash }
38
+
39
+ context "after changing x" do
40
+ hookup { topic.x = 10 }
41
+
42
+ asserts(:x).equals(10)
43
+ asserts(:y).equals(15)
44
+
45
+ asserts(:w).equals(10)
46
+ asserts(:h).equals(15)
47
+ end
48
+
49
+ context "after changing y" do
50
+ hookup { topic.y = 2 }
51
+
52
+ asserts(:x).equals(5)
53
+ asserts(:y).equals(2)
54
+
55
+ asserts(:w).equals(5)
56
+ asserts(:h).equals(2)
57
+ end
58
+ end
59
+
60
+ context "a vector3" do
61
+ setup { Ray::Vector3[5, 15, 20] }
62
+
63
+ asserts(:x).equals(5)
64
+ asserts(:y).equals(15)
65
+ asserts(:z).equals(20)
66
+
67
+ asserts(:to_a).equals([5, 15, 20])
68
+
69
+ asserts("#+ (1, 2, 3)") { topic + [1, 2, 3] }.equals Ray::Vector3[6, 17, 23]
70
+ asserts("#- (1, 2, 3)") { topic - [1, 2, 3] }.equals Ray::Vector3[4, 13, 17]
71
+
72
+ asserts("#* 2") { topic * 2 }.equals Ray::Vector3[10, 30, 40]
73
+ asserts("#* (2, 0, 0.5)") { topic * [2, 0, 0.5] }.equals Ray::Vector3[10, 0, 10]
74
+ asserts("#/ (2, 1, 0.5)") { topic / [2, 1, 0.5] }.equals Ray::Vector3[2.5, 15, 40]
75
+ asserts("#dot (2, 0, 0.5)") { topic.dot [2, 0, 0.5] }.equals 20
76
+
77
+ asserts(:-@).equals Ray::Vector3[-5, -15, -20]
78
+ asserts(:+@).equals Ray::Vector3[+5, +15, +20]
79
+
80
+ asserts("equals to #to_a") { topic == [5, 15, 20] }
81
+ asserts("equals to the same vector") { topic == Ray::Vector3[5, 15, 20] }
82
+ asserts("equals to #dup") { topic == topic.dup }
83
+ asserts("eql? to the same vector") { topic.eql? Ray::Vector3[5, 15, 20] }
84
+ asserts(:hash).equals { Ray::Vector3[5, 15, 20].hash }
85
+
86
+ context "after changing x" do
87
+ hookup { topic.x = 10 }
88
+
89
+ asserts(:x).equals(10)
90
+ asserts(:y).equals(15)
91
+ asserts(:z).equals(20)
92
+ end
93
+
94
+ context "after changing y" do
95
+ hookup { topic.y = 2 }
96
+
97
+ asserts(:x).equals(5)
98
+ asserts(:y).equals(2)
99
+ asserts(:z).equals(20)
100
+ end
101
+
102
+ context "after changing z" do
103
+ hookup { topic.z = 3 }
104
+
105
+ asserts(:x).equals(5)
106
+ asserts(:y).equals(15)
107
+ asserts(:z).equals(3)
108
+ end
109
+ end
110
+
111
+ run_tests if __FILE__ == $0