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.
- data/.gemtest +0 -0
- data/.yardopts +4 -0
- data/README.md +17 -21
- data/Rakefile +18 -139
- data/VERSION +1 -1
- data/ext/audio.cpp +723 -0
- data/ext/{color.c → color.cpp} +25 -13
- data/ext/drawable.cpp +91 -0
- data/ext/event.cpp +460 -0
- data/ext/extconf.rb +5 -104
- data/ext/font.cpp +190 -0
- data/ext/image.cpp +733 -0
- data/ext/input.cpp +74 -0
- data/ext/ray.cpp +168 -0
- data/ext/ray.hpp +356 -0
- data/ext/{rect.c → rect.cpp} +51 -37
- data/ext/shader.cpp +169 -0
- data/ext/shape.cpp +409 -0
- data/ext/sprite.cpp +306 -0
- data/ext/text.cpp +181 -0
- data/ext/vector.cpp +215 -0
- data/guide.md +619 -0
- data/lib/ray/audio.rb +0 -41
- data/lib/ray/color.rb +32 -10
- data/lib/ray/drawable.rb +16 -0
- data/lib/ray/dsl/event_listener.rb +25 -2
- data/lib/ray/dsl/event_runner.rb +33 -5
- data/lib/ray/dsl/event_translator.rb +66 -30
- data/lib/ray/dsl/handler.rb +3 -2
- data/lib/ray/dsl/matcher.rb +58 -14
- data/lib/ray/font.rb +38 -96
- data/lib/ray/font_set.rb +8 -8
- data/lib/ray/game.rb +87 -66
- data/lib/ray/helper.rb +105 -10
- data/lib/ray/image.rb +150 -24
- data/lib/ray/image_set.rb +3 -1
- data/lib/ray/input.rb +10 -0
- data/lib/ray/music_set.rb +5 -3
- data/lib/ray/ray.rb +21 -9
- data/lib/ray/rect.rb +48 -7
- data/lib/ray/rmagick.rb +41 -0
- data/lib/ray/scene.rb +99 -43
- data/lib/ray/scene_list.rb +67 -0
- data/lib/ray/shape.rb +132 -0
- data/lib/ray/sound_set.rb +4 -2
- data/lib/ray/sprite.rb +49 -111
- data/lib/ray/text.rb +101 -0
- data/lib/ray/text_helper.rb +37 -0
- data/lib/ray/turtle.rb +215 -0
- data/lib/ray/vector.rb +226 -0
- data/samples/audio/spacial.rb +44 -0
- data/samples/hello_world/hello.rb +9 -13
- data/samples/hello_world/hello_dsl.rb +8 -12
- data/samples/hello_world/text.rb +15 -0
- data/samples/opengl/binding.rb +38 -0
- data/samples/opengl/image.rb +32 -0
- data/samples/opengl/opengl.rb +34 -0
- data/samples/opengl/shader.rb +42 -0
- data/samples/pong/pong.rb +14 -10
- data/samples/run_scene.rb +53 -0
- data/samples/shaders/scene.rb +40 -0
- data/samples/shaders/shaders.rb +42 -0
- data/samples/shaders/shape.rb +34 -0
- data/samples/sokoban/sokoban.rb +18 -18
- data/samples/test/actual_scene.rb +41 -0
- data/samples/test/scene_riot.rb +39 -0
- data/samples/test/scene_spec.rb +32 -0
- data/samples/test/scene_test_unit.rb +25 -0
- data/samples/turtle/byzantium.rb +45 -0
- data/samples/turtle/hilbert.rb +48 -0
- data/samples/turtle/koch.rb +55 -0
- data/samples/turtle/mandala.rb +61 -0
- data/samples/turtle/tree.rb +57 -0
- data/test/audio_test.rb +69 -0
- data/test/color_test.rb +77 -0
- data/test/drawable_test.rb +19 -0
- data/test/dsl_test.rb +93 -0
- data/test/font_test.rb +57 -0
- data/test/helpers.rb +94 -0
- data/test/image_test.rb +82 -0
- data/test/ray_test.rb +25 -0
- data/test/rect_test.rb +121 -0
- data/{spec → test}/res/VeraMono.ttf +0 -0
- data/{spec → test}/res/aqua.bmp +0 -0
- data/{spec → test}/res/aqua.png +0 -0
- data/{spec → test}/res/aqua2.bmp +0 -0
- data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
- data/{spec → test}/res/pop.wav +0 -0
- data/test/resource_set_test.rb +99 -0
- data/test/run_all.rb +7 -0
- data/test/shape_test.rb +101 -0
- data/test/sprite_test.rb +89 -0
- data/test/text_test.rb +78 -0
- data/test/turtle_test.rb +176 -0
- data/test/vector_test.rb +111 -0
- data/yard_ext.rb +0 -28
- metadata +95 -139
- data/.gitignore +0 -23
- data/.gitmodules +0 -3
- data/.rspec +0 -3
- data/ext/audio.c +0 -473
- data/ext/event.c +0 -557
- data/ext/font.c +0 -287
- data/ext/image.c +0 -933
- data/ext/joystick.c +0 -145
- data/ext/ray.c +0 -489
- data/ext/ray.h +0 -245
- data/ext/ray_osx.m +0 -161
- data/lib/ray/joystick.rb +0 -30
- data/psp/SDL_psp_main.c +0 -84
- data/psp/bigdecimal/README +0 -60
- data/psp/bigdecimal/bigdecimal.c +0 -4697
- data/psp/bigdecimal/bigdecimal.h +0 -216
- data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
- data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
- data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
- data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
- data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
- data/psp/digest/bubblebabble/bubblebabble.c +0 -142
- data/psp/digest/defs.h +0 -20
- data/psp/digest/digest.c +0 -643
- data/psp/digest/digest.h +0 -32
- data/psp/digest/lib/digest.rb +0 -50
- data/psp/digest/lib/md5.rb +0 -27
- data/psp/digest/lib/sha1.rb +0 -27
- data/psp/digest/md5/md5.c +0 -420
- data/psp/digest/md5/md5.h +0 -80
- data/psp/digest/md5/md5init.c +0 -40
- data/psp/digest/rmd160/rmd160.c +0 -457
- data/psp/digest/rmd160/rmd160.h +0 -56
- data/psp/digest/rmd160/rmd160init.c +0 -40
- data/psp/digest/sha1/sha1.c +0 -269
- data/psp/digest/sha1/sha1.h +0 -39
- data/psp/digest/sha1/sha1init.c +0 -40
- data/psp/digest/sha2/lib/sha2.rb +0 -73
- data/psp/digest/sha2/sha2.c +0 -919
- data/psp/digest/sha2/sha2.h +0 -109
- data/psp/digest/sha2/sha2init.c +0 -52
- data/psp/enumerator/enumerator.c +0 -298
- data/psp/etc/etc.c +0 -559
- data/psp/ext.c +0 -289
- data/psp/fcntl/fcntl.c +0 -187
- data/psp/lib/rbconfig.rb +0 -178
- data/psp/nkf/lib/kconv.rb +0 -367
- data/psp/nkf/nkf-utf8/config.h +0 -88
- data/psp/nkf/nkf-utf8/nkf.c +0 -6040
- data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
- data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
- data/psp/nkf/nkf.c +0 -654
- data/psp/socket/addrinfo.h +0 -173
- data/psp/socket/getaddrinfo.c +0 -676
- data/psp/socket/getnameinfo.c +0 -270
- data/psp/socket/pspsocket.c +0 -71
- data/psp/socket/pspsocket.h +0 -28
- data/psp/socket/socket.c +0 -4662
- data/psp/socket/sockport.h +0 -76
- data/psp/stringio/stringio.c +0 -1306
- data/psp/strscan/strscan.c +0 -1320
- data/psp/syck/bytecode.c +0 -1166
- data/psp/syck/emitter.c +0 -1242
- data/psp/syck/gram.c +0 -1894
- data/psp/syck/gram.h +0 -79
- data/psp/syck/handler.c +0 -174
- data/psp/syck/implicit.c +0 -2990
- data/psp/syck/node.c +0 -408
- data/psp/syck/rubyext.c +0 -2367
- data/psp/syck/syck.c +0 -504
- data/psp/syck/syck.h +0 -456
- data/psp/syck/token.c +0 -2725
- data/psp/syck/yaml2byte.c +0 -257
- data/psp/syck/yamlbyte.h +0 -170
- data/psp/thread/thread.c +0 -1175
- data/psp/zlib/zlib.c +0 -3547
- data/script.rb +0 -10
- data/spec/ray/audio_spec.rb +0 -146
- data/spec/ray/color_spec.rb +0 -57
- data/spec/ray/event_spec.rb +0 -80
- data/spec/ray/font_spec.rb +0 -93
- data/spec/ray/image_set_spec.rb +0 -48
- data/spec/ray/image_spec.rb +0 -162
- data/spec/ray/joystick_spec.rb +0 -21
- data/spec/ray/matcher_spec.rb +0 -50
- data/spec/ray/ray_spec.rb +0 -88
- data/spec/ray/rect_spec.rb +0 -154
- data/spec/ray/resource_set_spec.rb +0 -105
- data/spec/ray/sprite_spec.rb +0 -163
- data/spec/spec.opts +0 -4
- data/spec/spec_helper.rb +0 -8
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Drawing code stolen from here:
|
|
2
|
+
# http://www.rubyquiz.com/quiz104.html
|
|
3
|
+
|
|
4
|
+
$:.unshift File.expand_path(File.dirname(__FILE__) + "/../../lib")
|
|
5
|
+
$:.unshift File.expand_path(File.dirname(__FILE__) + "/../../ext")
|
|
6
|
+
|
|
7
|
+
require 'ray'
|
|
8
|
+
|
|
9
|
+
class Ray::Turtle
|
|
10
|
+
def tree(size)
|
|
11
|
+
if size < 5
|
|
12
|
+
forward size
|
|
13
|
+
backward size
|
|
14
|
+
else
|
|
15
|
+
forward size / 3
|
|
16
|
+
|
|
17
|
+
left 30
|
|
18
|
+
tree size * 2 / 3
|
|
19
|
+
right 30
|
|
20
|
+
|
|
21
|
+
forward size / 6
|
|
22
|
+
|
|
23
|
+
right 25
|
|
24
|
+
tree size / 2
|
|
25
|
+
left 25
|
|
26
|
+
|
|
27
|
+
forward size / 3
|
|
28
|
+
right 25
|
|
29
|
+
tree size / 2
|
|
30
|
+
left 25
|
|
31
|
+
|
|
32
|
+
forward size / 6
|
|
33
|
+
backward size
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
Ray::Game.new("Turtle") do
|
|
39
|
+
register do
|
|
40
|
+
add_hook :quit, method(:exit!)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
scene :tree do
|
|
44
|
+
render do |win|
|
|
45
|
+
win.fill(Ray::Color.black).turtle do
|
|
46
|
+
pen_up
|
|
47
|
+
left 90
|
|
48
|
+
center
|
|
49
|
+
backward 180
|
|
50
|
+
pen_down
|
|
51
|
+
tree(240.0)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
push_scene :tree
|
|
57
|
+
end
|
data/test/audio_test.rb
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
|
|
2
|
+
|
|
3
|
+
context "Ray::Audio" do
|
|
4
|
+
setup { Ray::Audio }
|
|
5
|
+
|
|
6
|
+
asserts(:volume).equals(100)
|
|
7
|
+
|
|
8
|
+
asserts(:pos).equals(Ray::Vector3[0, 0, 0])
|
|
9
|
+
asserts(:direction).equals(Ray::Vector3[0, 0, -1])
|
|
10
|
+
|
|
11
|
+
context "after changing the volume" do
|
|
12
|
+
hookup { topic.volume = 50 }
|
|
13
|
+
asserts(:volume).equals(50)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context "after changing the position" do
|
|
17
|
+
hookup { topic.pos = [10, -5, 3] }
|
|
18
|
+
asserts(:pos).equals(Ray::Vector3[10, -5, 3])
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context "after changing the direction" do
|
|
22
|
+
hookup { topic.direction = [10, -5, 3] }
|
|
23
|
+
asserts(:direction).equals(Ray::Vector3[10, -5, 3])
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
[Ray::Sound, Ray::Music].each do |klass|
|
|
28
|
+
context klass do
|
|
29
|
+
setup { klass }
|
|
30
|
+
|
|
31
|
+
denies("created from a file") {
|
|
32
|
+
topic.new path_of("pop.wav")
|
|
33
|
+
}.raises(RuntimeError)
|
|
34
|
+
|
|
35
|
+
asserts("created from a non-existing file") {
|
|
36
|
+
topic.new path_of("doesnt_exist.wav")
|
|
37
|
+
}.raises(RuntimeError)
|
|
38
|
+
|
|
39
|
+
denies("created from an IO") {
|
|
40
|
+
open(path_of("pop.wav")) { |io| topic.new(io) }
|
|
41
|
+
}.raises(RuntimeError)
|
|
42
|
+
|
|
43
|
+
asserts("created from an invalid IO") {
|
|
44
|
+
open(path_of("aqua.png")) { |io| topic.new(io) }
|
|
45
|
+
}.raises(RuntimeError)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
{
|
|
50
|
+
"a sound" => Ray::Sound.new(path_of("pop.wav")),
|
|
51
|
+
"a music" => Ray::Music.new(path_of("pop.wav"))
|
|
52
|
+
}.each do |name, object|
|
|
53
|
+
context name do
|
|
54
|
+
setup { object }
|
|
55
|
+
|
|
56
|
+
asserts(:volume).equals(100)
|
|
57
|
+
asserts(:pitch).equals(1)
|
|
58
|
+
asserts(:pos).equals(Ray::Vector3[0, 0, 0])
|
|
59
|
+
denies(:relative?)
|
|
60
|
+
asserts(:min_distance).equals(1)
|
|
61
|
+
asserts(:attenuation).equals(1)
|
|
62
|
+
asserts(:status).equals(:stopped)
|
|
63
|
+
|
|
64
|
+
asserts(:current_time).equals(0)
|
|
65
|
+
denies(:loop?)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
run_tests if __FILE__ == $0
|
data/test/color_test.rb
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
|
|
2
|
+
|
|
3
|
+
context "a color" do
|
|
4
|
+
setup { Ray::Color.new(10, 10, 10, 10) }
|
|
5
|
+
|
|
6
|
+
asserts("#* RGBA(255, 0, 0, 255)") {
|
|
7
|
+
topic * Ray::Color.red
|
|
8
|
+
}.equals Ray::Color.new(10, 0, 0, 10)
|
|
9
|
+
|
|
10
|
+
asserts("#+ RGBA(20, 10, 4, 255)") {
|
|
11
|
+
topic + Ray::Color.new(20, 10, 4, 255)
|
|
12
|
+
}.equals Ray::Color.new(30, 20, 14, 255)
|
|
13
|
+
|
|
14
|
+
asserts "is equal to a color with the same components" do
|
|
15
|
+
topic == Ray::Color.new(10, 10, 10, 10)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
denies "is equal to a color with different components" do
|
|
19
|
+
topic == Ray::Color.new(20, 10, 10, 10)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
[:red, :green, :blue, :alpha].each do |comp|
|
|
23
|
+
context "after having changed #{comp} to 30" do
|
|
24
|
+
hookup { topic.send("#{comp}=", 30) }
|
|
25
|
+
|
|
26
|
+
asserts(comp).equals(30)
|
|
27
|
+
|
|
28
|
+
asserts "other components keep their values" do
|
|
29
|
+
[:red, :green, :blue, :alpha].all? do |other|
|
|
30
|
+
other == comp || topic.send(other) == 10
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "created with 3 integers" do
|
|
37
|
+
setup { Ray::Color.new(10, 20, 30) }
|
|
38
|
+
|
|
39
|
+
asserts "has the components given at creation" do
|
|
40
|
+
topic.r == 10 && topic.g == 20 && topic.b == 30
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
asserts(:a).equals(255)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context "created with 4 integers" do
|
|
47
|
+
setup { Ray::Color.new(10, 20, 30, 127) }
|
|
48
|
+
|
|
49
|
+
asserts "has the components given at creation" do
|
|
50
|
+
topic.r == 10 && topic.g == 20 && topic.b == 30 && topic.a == 127
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
context "copied from another color" do
|
|
55
|
+
setup do
|
|
56
|
+
@old_topic = topic
|
|
57
|
+
topic.dup
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
asserts(:r).equals(10)
|
|
61
|
+
asserts(:g).equals(10)
|
|
62
|
+
asserts(:b).equals(10)
|
|
63
|
+
asserts(:g).equals(10)
|
|
64
|
+
|
|
65
|
+
denies "is the same object as the original" do
|
|
66
|
+
topic.equal? @old_topic
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
asserts "is eql? to the original" do
|
|
70
|
+
topic.eql? @old_topic
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
asserts(:hash).equals { @old_topic.hash }
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
run_tests if __FILE__ == $0
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
|
|
2
|
+
|
|
3
|
+
context "a drawable" do
|
|
4
|
+
setup do
|
|
5
|
+
@block = Proc.new {}
|
|
6
|
+
Ray::Drawable.new(&@block)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context "after drawing" do
|
|
10
|
+
hookup do
|
|
11
|
+
stub(@block).call
|
|
12
|
+
(@img = Ray::Image.new(:w => 10, :h => 10)).draw_drawable topic
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
asserts("the block") { @block }.received(:call) { @img }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
run_tests if __FILE__ == $0
|
data/test/dsl_test.rb
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
|
|
2
|
+
|
|
3
|
+
context "an event runner" do
|
|
4
|
+
helper(:register_for) do |name, *args|
|
|
5
|
+
stub(@stub).__send__(name)
|
|
6
|
+
@obj.on(name, *args) { |*block_args| @stub.__send__(name, *block_args) }
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
helper(:raise_event) { |name, *args| @obj.raise_event(name, *args) }
|
|
10
|
+
|
|
11
|
+
helper(:enable_group) { |name| @obj.enable_event_group(name) }
|
|
12
|
+
helper(:disable_group) { |name| @obj.disable_event_group(name) }
|
|
13
|
+
|
|
14
|
+
helper(:event_group) { |name| @obj.current_event_group = name }
|
|
15
|
+
|
|
16
|
+
def runner_asserts(name, method = :asserts, &block)
|
|
17
|
+
send(method, "after #{name}") do
|
|
18
|
+
[:default, :test].each { |o| @obj.remove_event_group o }
|
|
19
|
+
instance_eval(&block)
|
|
20
|
+
topic.run
|
|
21
|
+
|
|
22
|
+
@stub
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def runner_denies(name, &block)
|
|
27
|
+
runner_asserts(name, :denies, &block)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
setup do
|
|
31
|
+
runner = Ray::DSL::EventRunner.new
|
|
32
|
+
|
|
33
|
+
@stub = Object.new
|
|
34
|
+
class << @stub
|
|
35
|
+
def inspect; "stub"; end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
@obj = Object.new
|
|
39
|
+
@obj.extend Ray::Helper
|
|
40
|
+
@obj.event_runner = runner
|
|
41
|
+
|
|
42
|
+
runner
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
runner_asserts("sending a registred event") {
|
|
46
|
+
register_for :event
|
|
47
|
+
raise_event :event
|
|
48
|
+
}.received(:event)
|
|
49
|
+
|
|
50
|
+
runner_denies("sending an unregistred event") {
|
|
51
|
+
register_for :foo
|
|
52
|
+
raise_event :event
|
|
53
|
+
}.received(:event)
|
|
54
|
+
|
|
55
|
+
runner_asserts("sending a registred event with the same arguments") {
|
|
56
|
+
register_for :event, "argument"
|
|
57
|
+
raise_event :event, "argument"
|
|
58
|
+
}.received(:event, "argument")
|
|
59
|
+
|
|
60
|
+
runner_asserts("sending a registred event with matching arguments") {
|
|
61
|
+
register_for :event, /arg/
|
|
62
|
+
raise_event :event, "argument"
|
|
63
|
+
}.received(:event, "argument")
|
|
64
|
+
|
|
65
|
+
runner_denies("sending a registred event with less arguments") {
|
|
66
|
+
register_for :event, "argument1", "argument2"
|
|
67
|
+
raise_event :event, "argument1"
|
|
68
|
+
}.received(:event, "argument1")
|
|
69
|
+
|
|
70
|
+
runner_asserts("sending a register event with more arguments") {
|
|
71
|
+
register_for :event
|
|
72
|
+
raise_event :event, "bar"
|
|
73
|
+
}.received(:event, "bar")
|
|
74
|
+
|
|
75
|
+
runner_denies("sending an event registred in a disabled event group") {
|
|
76
|
+
event_group :test
|
|
77
|
+
register_for :event
|
|
78
|
+
disable_group :test
|
|
79
|
+
|
|
80
|
+
raise_event :event
|
|
81
|
+
}.received(:event)
|
|
82
|
+
|
|
83
|
+
runner_asserts("sending an event registred in an enabled event_group") {
|
|
84
|
+
event_group :test
|
|
85
|
+
register_for :event
|
|
86
|
+
disable_group :test
|
|
87
|
+
enable_group :test
|
|
88
|
+
|
|
89
|
+
raise_event :event
|
|
90
|
+
}.received(:event)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
run_tests if __FILE__ == $0
|
data/test/font_test.rb
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/helpers.rb'
|
|
2
|
+
|
|
3
|
+
context Ray::Font do
|
|
4
|
+
setup { Ray::Font }
|
|
5
|
+
|
|
6
|
+
denies("creating a font from a file") {
|
|
7
|
+
topic.new(path_of("VeraMono.ttf"))
|
|
8
|
+
}.raises(RuntimeError)
|
|
9
|
+
|
|
10
|
+
asserts("creating a font from a non-existing file") {
|
|
11
|
+
topic.new(path_of("doesnt_exist.ttf"))
|
|
12
|
+
}.raises(RuntimeError)
|
|
13
|
+
|
|
14
|
+
denies("creating a font from an IO object") {
|
|
15
|
+
open(path_of("VeraMono.ttf")) { |io| topic.new(io) }
|
|
16
|
+
}.raises(RuntimeError)
|
|
17
|
+
|
|
18
|
+
asserts("creating a font from an invalid IO object") {
|
|
19
|
+
open(path_of("aqua.png")) { |io| topic.new(io) }
|
|
20
|
+
}.raises(RuntimeError)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "a font" do
|
|
24
|
+
setup { Ray::Font.default }
|
|
25
|
+
|
|
26
|
+
denies("height of a text containing two lines almost equals line skip") {
|
|
27
|
+
diff = (topic.size_of("Hello\nWorld", :size => 12).height - topic.line_skip(12)).abs
|
|
28
|
+
diff <= 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
asserts("width of a multi-line text") {
|
|
32
|
+
topic.width_of("Hello\nabcdefghijkmnopqrstuvwxyz\nWorld", :size => 12)
|
|
33
|
+
}.equals { topic.width_of("abcdefghijkmnopqrstuvwxyz", :size => 12) }
|
|
34
|
+
|
|
35
|
+
asserts("a drawn image's size") {
|
|
36
|
+
img = topic.draw("Hello world", :size => 12)
|
|
37
|
+
img.size
|
|
38
|
+
}.equals { topic.size_of("Hello world", :size => 12) }
|
|
39
|
+
|
|
40
|
+
asserts("return value of drawn when :on is set") {
|
|
41
|
+
topic.draw("Hello world", :on => Ray.screen, :size => 12)
|
|
42
|
+
}.equals { Ray.screen }
|
|
43
|
+
|
|
44
|
+
asserts("using an unknown style") {
|
|
45
|
+
topic.draw("Hello world", :size => 12, :style => [:foo])
|
|
46
|
+
}.raises(ArgumentError)
|
|
47
|
+
|
|
48
|
+
denies("using a know style") {
|
|
49
|
+
topic.draw("Hello world", :size => 12, :style => [:bold])
|
|
50
|
+
}.raises(ArgumentError)
|
|
51
|
+
|
|
52
|
+
asserts("not specifying the size") {
|
|
53
|
+
topic.draw("Hello world", {})
|
|
54
|
+
}.raises(ArgumentError)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
run_tests if __FILE__ == $0
|
data/test/helpers.rb
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "ext"))
|
|
2
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
|
3
|
+
|
|
4
|
+
require 'riot'
|
|
5
|
+
require 'riot/rr'
|
|
6
|
+
|
|
7
|
+
require 'ray'
|
|
8
|
+
|
|
9
|
+
include Math
|
|
10
|
+
|
|
11
|
+
def path_of(res)
|
|
12
|
+
File.expand_path(File.join(File.dirname(__FILE__), "res", res))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def run_tests
|
|
16
|
+
Ray.create_window(:w => 100, :h => 150)
|
|
17
|
+
exit Riot.run.success?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def deg_to_rad(deg)
|
|
21
|
+
deg * PI / 180
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class AlmostEqualMacro < Riot::AssertionMacro
|
|
25
|
+
register :almost_equals
|
|
26
|
+
|
|
27
|
+
def test(actual, expected, epsilon)
|
|
28
|
+
(actual - expected).abs <= epsilon
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def evaluate(actual, expected, epsilon = Float::EPSILON)
|
|
32
|
+
if test(actual, expected, epsilon)
|
|
33
|
+
pass "is almost equal to #{expected}"
|
|
34
|
+
else
|
|
35
|
+
fail "#{actual} +/- #{epsilon} is not equal to #{expected}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def devaluate(actual, expected, epsilon = Float::EPSILON)
|
|
40
|
+
if test(actual, expected, epsilon)
|
|
41
|
+
fail "#{actual} is almost equal to #{expected}"
|
|
42
|
+
else
|
|
43
|
+
pass "+/- #{epsilon} is almost equal to #{expected}"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class ReceivedMacro < Riot::AssertionMacro
|
|
49
|
+
register :received
|
|
50
|
+
|
|
51
|
+
include RR::Adapters::RRMethods
|
|
52
|
+
|
|
53
|
+
def evaluate(recv, msg, *args)
|
|
54
|
+
msg, times = case msg
|
|
55
|
+
when Symbol then [msg, 1]
|
|
56
|
+
when Hash then msg.each.first
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
begin
|
|
60
|
+
received(recv).__send__(msg, *args).times(times).call
|
|
61
|
+
pass "received ##{msg} with #{args.map { |o| o.inspect }.join(', ') } " +
|
|
62
|
+
"#{times} time#{'s' if times != 1}"
|
|
63
|
+
rescue ::RR::Errors::RRError => e
|
|
64
|
+
fail "#{recv.inspect} didn't receive ##{msg} with " +
|
|
65
|
+
"#{args.map { |o| o.inspect }.join(', ') } " +
|
|
66
|
+
"#{times} time#{'s' if times != 1}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def devaluate(recv, msg, *args)
|
|
71
|
+
msg, times = case msg
|
|
72
|
+
when Symbol then [msg, 1]
|
|
73
|
+
when Hash then msg.each.first
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
begin
|
|
77
|
+
received(recv).__send__(msg, *args).times(times).call
|
|
78
|
+
fail "#{recv.inspect} received ##{msg} with " +
|
|
79
|
+
"#{args.map { |o| o.inspect }.join(', ') } " +
|
|
80
|
+
"#{times} time#{'s' if times != 1}"
|
|
81
|
+
rescue ::RR::Errors::RRError
|
|
82
|
+
pass "received ##{msg} with " +
|
|
83
|
+
"#{args.map { |o| o.inspect }.join(', ') } " +
|
|
84
|
+
"#{times} time#{'s' if times != 1}"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
class Riot::Context
|
|
90
|
+
include RR::Adapters::RRMethods
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
Riot.reporter = Riot::DotMatrixReporter unless ARGV.include? "--verbose"
|
|
94
|
+
Riot.alone!
|