delve 0.0.7
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +24 -0
- data/LICENSE +25 -0
- data/README.md +6 -0
- data/ROADMAP.md +92 -0
- data/Rakefile +25 -0
- data/bin/delve +15 -0
- data/delve.gemspec +17 -0
- data/doc/examples/ascii.rb +34 -0
- data/doc/examples/astar.rb +39 -0
- data/doc/examples/border.rb +13 -0
- data/doc/examples/cellular.rb +15 -0
- data/doc/examples/display.rb +27 -0
- data/doc/examples/engine.rb +29 -0
- data/doc/examples/menu.rb +22 -0
- data/doc/examples/noise.rb +37 -0
- data/doc/examples/progress.rb +25 -0
- data/doc/examples/rogue.rb +15 -0
- data/lib/delve.rb +109 -0
- data/lib/delve/component/collision.rb +17 -0
- data/lib/delve/component/movement.rb +78 -0
- data/lib/delve/component/position.rb +30 -0
- data/lib/delve/component/symbol.rb +23 -0
- data/lib/delve/display/curses_renderer.rb +63 -0
- data/lib/delve/display/display.rb +51 -0
- data/lib/delve/engine.rb +30 -0
- data/lib/delve/entity.rb +23 -0
- data/lib/delve/event_queue.rb +48 -0
- data/lib/delve/fov/discrete_shadowcasting.rb +78 -0
- data/lib/delve/fov/fov.rb +83 -0
- data/lib/delve/game.rb +22 -0
- data/lib/delve/generator/cellular.rb +111 -0
- data/lib/delve/generator/dungeon.rb +19 -0
- data/lib/delve/generator/map.rb +30 -0
- data/lib/delve/generator/noise.rb +33 -0
- data/lib/delve/generator/rogue.rb +403 -0
- data/lib/delve/input/curses_input.rb +28 -0
- data/lib/delve/input/input.rb +12 -0
- data/lib/delve/path/astar.rb +83 -0
- data/lib/delve/path/path.rb +70 -0
- data/lib/delve/scheduler/action_scheduler.rb +38 -0
- data/lib/delve/scheduler/scheduler.rb +37 -0
- data/lib/delve/scheduler/simple_scheduler.rb +21 -0
- data/lib/delve/screen_manager.rb +41 -0
- data/lib/delve/widgets/border.rb +44 -0
- data/lib/delve/widgets/key_value.rb +36 -0
- data/lib/delve/widgets/menu.rb +84 -0
- data/lib/delve/widgets/multi_line.rb +51 -0
- data/lib/delve/widgets/progress.rb +37 -0
- data/lib/delve/widgets/text.rb +37 -0
- data/lib/delve/widgets/viewport.rb +67 -0
- data/rot.js.LICENSE +25 -0
- data/templates/Gemfile.erb +4 -0
- data/templates/README.md.erb +22 -0
- data/templates/binfile.erb +21 -0
- data/templates/game_screen.rb.erb +51 -0
- data/templates/gemspec.erb +27 -0
- data/templates/loading_screen.rb.erb +46 -0
- data/templates/player_factory.rb.erb +19 -0
- data/templates/title_screen.rb.erb +42 -0
- data/templates/world.rb.erb +63 -0
- data/test/component/collision_test.rb +39 -0
- data/test/component/movement_test.rb +155 -0
- data/test/component/position_test.rb +43 -0
- data/test/component/symbol_test.rb +30 -0
- data/test/delve_test.rb +61 -0
- data/test/display/curses_renderer_test.rb +60 -0
- data/test/display/display_test.rb +86 -0
- data/test/engine_test.rb +36 -0
- data/test/entity_test.rb +48 -0
- data/test/event_queue_test.rb +86 -0
- data/test/game_test.rb +47 -0
- data/test/generator/dungeon_test.rb +21 -0
- data/test/generator/map_test.rb +31 -0
- data/test/generator/noise_test.rb +49 -0
- data/test/input/curses_input_test.rb +24 -0
- data/test/input/input_test.rb +21 -0
- data/test/path/astar_test.rb +22 -0
- data/test/path/path_test.rb +41 -0
- data/test/scheduler/action_scheduler_test.rb +54 -0
- data/test/scheduler/scheduler_test.rb +50 -0
- data/test/scheduler/simple_scheduler_test.rb +33 -0
- data/test/screen_manager_test.rb +92 -0
- data/test/widgets/border_test.rb +60 -0
- data/test/widgets/key_value_test.rb +68 -0
- data/test/widgets/menu_test.rb +103 -0
- data/test/widgets/multi_line_test.rb +73 -0
- data/test/widgets/progress_test.rb +96 -0
- data/test/widgets/text_test.rb +66 -0
- data/test/widgets/viewport_test.rb +154 -0
- metadata +193 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'minitest'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'mocha/setup'
|
4
|
+
require 'delve/scheduler/scheduler'
|
5
|
+
|
6
|
+
class SchedulerTest < Minitest::Test
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@queue = mock('object')
|
10
|
+
@scheduler = Scheduler.new @queue
|
11
|
+
@item = 'item'
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_get_time_from_event_queue
|
15
|
+
@queue.expects(:time).returns(10)
|
16
|
+
time = @scheduler.time
|
17
|
+
assert_equal 10, time
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_get_next
|
21
|
+
@queue.expects(:get).returns(@item)
|
22
|
+
assert_equal @item, @scheduler.next
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_remove_unknown_item_from_queue_returns_false
|
26
|
+
@queue.expects(:remove).with(@item).returns(false)
|
27
|
+
assert !@scheduler.remove(@item)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_remove_known_item_from_queue_returns_true
|
31
|
+
@queue.expects(:remove).with(@item).returns(true)
|
32
|
+
assert @scheduler.remove(@item)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_clear_clears_queue
|
36
|
+
@queue.expects(:clear)
|
37
|
+
@scheduler.clear
|
38
|
+
end
|
39
|
+
|
40
|
+
## Not sure how exactly how to test this method
|
41
|
+
|
42
|
+
def test_add_non_repeating_item
|
43
|
+
@scheduler.add(@item)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_add_repeating_item
|
47
|
+
@scheduler.add(@item, true)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'minitest'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'mocha/setup'
|
4
|
+
require 'delve/scheduler/simple_scheduler'
|
5
|
+
|
6
|
+
class SimpleSchedulerTest < Minitest::Test
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@queue = mock('object')
|
10
|
+
@scheduler = SimpleScheduler.new @queue
|
11
|
+
@item = 'item'
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_add
|
15
|
+
@queue.expects(:add).with(@item, 0)
|
16
|
+
@scheduler.add(@item, false)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_next_without_repeating
|
20
|
+
@queue.expects(:get).returns(@item)
|
21
|
+
assert_equal @item, @scheduler.next
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_next_with_repeating
|
25
|
+
@queue.expects(:get).twice.returns(@item)
|
26
|
+
@queue.expects(:add).with(@item, 0)
|
27
|
+
@scheduler.add(@item, true)
|
28
|
+
@queue.expects(:add).with(@item, 0)
|
29
|
+
@scheduler.next
|
30
|
+
assert_equal @item, @scheduler.next
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'minitest'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'delve/screen_manager'
|
4
|
+
|
5
|
+
class ScreenManagerTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@manager = ScreenManager.new
|
9
|
+
@screen = mock('object')
|
10
|
+
@display = mock('object')
|
11
|
+
@input = mock('object')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_empty_is_true_initially
|
15
|
+
assert @manager.empty?
|
16
|
+
@input = mock('object')
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_push_first_screen
|
20
|
+
@manager.push_screen @screen
|
21
|
+
assert !@manager.empty?
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_push_pop_first_screen
|
25
|
+
@manager.push_screen @screen
|
26
|
+
@manager.pop_screen
|
27
|
+
assert @manager.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_send_events_to_top_screen
|
31
|
+
@screen.expects(:update).with(@input)
|
32
|
+
first_screen = mock('object')
|
33
|
+
first_screen.expects(:update).never
|
34
|
+
|
35
|
+
@manager.push_screen first_screen
|
36
|
+
@manager.push_screen @screen
|
37
|
+
@manager.update @input
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_send_events_with_no_screen_should_fail
|
41
|
+
assert_raises RuntimeError do
|
42
|
+
@manager.update @input
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_send_events_with_no_input_fails
|
47
|
+
@manager.push_screen @screen
|
48
|
+
assert_raises RuntimeError do
|
49
|
+
@manager.update nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_cannot_render_with_no_screen
|
54
|
+
assert_raises RuntimeError do
|
55
|
+
@manager.render @display
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_error_raised_when_display_is_nil
|
60
|
+
@manager.push_screen @screen
|
61
|
+
assert_raises RuntimeError do
|
62
|
+
@manager.render nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_top_screen_is_rendered
|
67
|
+
@screen.expects(:render).with(@display)
|
68
|
+
@screen.expects(:partial?).returns(false)
|
69
|
+
first_screen = mock('object')
|
70
|
+
first_screen.expects(:render).never
|
71
|
+
|
72
|
+
@manager.push_screen first_screen
|
73
|
+
@manager.push_screen @screen
|
74
|
+
@manager.render @display
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_partial_screen_rendering
|
78
|
+
@screen.expects(:render).with(@display)
|
79
|
+
@screen.expects(:partial?).returns(true)
|
80
|
+
first_screen = mock('object')
|
81
|
+
first_screen.expects(:render).never
|
82
|
+
first_screen.expects(:partial?).never
|
83
|
+
second_screen = mock('object')
|
84
|
+
second_screen.expects(:render).with(@display)
|
85
|
+
second_screen.expects(:partial?).returns(false)
|
86
|
+
|
87
|
+
@manager.push_screen first_screen
|
88
|
+
@manager.push_screen second_screen
|
89
|
+
@manager.push_screen @screen
|
90
|
+
@manager.render @display
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'minitest'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'delve/widgets/border'
|
4
|
+
|
5
|
+
class BorderWidgetTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@x = 1
|
9
|
+
@y = 1
|
10
|
+
@width = 10
|
11
|
+
@height = 4
|
12
|
+
@border = BorderWidget.new @x, @y, @width, @height
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_initialising_without_x_position_raises_error
|
16
|
+
assert_raises RuntimeError do
|
17
|
+
BorderWidget.new nil, @y, @width, @height
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_initialising_without_y_position_raises_error
|
22
|
+
assert_raises RuntimeError do
|
23
|
+
BorderWidget.new @x, nil, @width, @height
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_initialising_without_width_raises_error
|
28
|
+
assert_raises RuntimeError do
|
29
|
+
BorderWidget.new @x, @y, nil, @height
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_initalising_without_height_raises_error
|
34
|
+
assert_raises RuntimeError do
|
35
|
+
BorderWidget.new @x, @y, @width, nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_initalising_with_text_smaller_than_text_with_plus_four_fails
|
40
|
+
assert_raises RuntimeError do
|
41
|
+
BorderWidget.new @x, @y, 6, 2, 'Some long text'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_render_fails_if_no_display_is_given
|
46
|
+
assert_raises RuntimeError do
|
47
|
+
@border.draw nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_initialize_with_colors
|
52
|
+
BorderWidget.new @x, @y, @width, @height, nil, :red, :yellow
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_render
|
56
|
+
display = mock('onject')
|
57
|
+
display.expects(:draw).times(24)
|
58
|
+
@border.draw(display)
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'minitest'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'delve/widgets/key_value'
|
4
|
+
|
5
|
+
class KeyValueWidgetTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@x = 1
|
9
|
+
@y = 1
|
10
|
+
@label = 'Name'
|
11
|
+
@value = 'Hero'
|
12
|
+
@widget = KeyValueWidget.new @x, @y, @label, @value
|
13
|
+
@display = mock('object')
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_initialising_without_x_position_raises_error
|
17
|
+
assert_raises RuntimeError do
|
18
|
+
KeyValueWidget.new nil, @y, @label, @value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_initialising_without_y_position_raises_error
|
23
|
+
assert_raises RuntimeError do
|
24
|
+
KeyValueWidget.new @x, nil, @label, @value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_initialising_without_label_raises_error
|
29
|
+
assert_raises RuntimeError do
|
30
|
+
KeyValueWidget.new @x, @y, nil, @value
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_initialising_without_value_raises_error
|
35
|
+
assert_raises RuntimeError do
|
36
|
+
KeyValueWidget.new @x, @y, @label, nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_render_fails_if_no_display_is_given
|
41
|
+
assert_raises RuntimeError do
|
42
|
+
@widget.draw nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_get_value
|
47
|
+
assert_equal @value, @widget.value
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_set_value
|
51
|
+
@widget.value = 'Nameless'
|
52
|
+
assert_equal 'Nameless', @widget.value
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_render
|
56
|
+
@display.expects(:draw).with(1, 1, 'N')
|
57
|
+
@display.expects(:draw).with(2, 1, 'a')
|
58
|
+
@display.expects(:draw).with(3, 1, 'm')
|
59
|
+
@display.expects(:draw).with(4, 1, 'e')
|
60
|
+
@display.expects(:draw).with(5, 1, ':')
|
61
|
+
@display.expects(:draw).with(6, 1, ' ')
|
62
|
+
@display.expects(:draw).with(7, 1, 'H')
|
63
|
+
@display.expects(:draw).with(8, 1, 'e')
|
64
|
+
@display.expects(:draw).with(9, 1, 'r')
|
65
|
+
@display.expects(:draw).with(10, 1, 'o')
|
66
|
+
@widget.draw(@display)
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'minitest'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'delve/widgets/menu'
|
4
|
+
|
5
|
+
class MenuWidgetTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@x = 5
|
9
|
+
@y = 5
|
10
|
+
@items = { 'n' => 'New Game', 'x' => 'Exit' }
|
11
|
+
@menu = MenuWidget.new @x, @y, @items
|
12
|
+
@display = mock('object')
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_initialising_without_x_position_raises_error
|
16
|
+
assert_raises RuntimeError do
|
17
|
+
MenuWidget.new nil, @y, @items
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_initialising_without_y_position_raises_error
|
22
|
+
assert_raises RuntimeError do
|
23
|
+
MenuWidget.new @x, nil, @items
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_initialising_without_items_raises_error
|
28
|
+
assert_raises RuntimeError do
|
29
|
+
MenuWidget.new @x, @y, nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_empty_items_fails
|
34
|
+
assert_raises RuntimeError do
|
35
|
+
MenuWidget.new @x, @y, Hash.new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_render_fails_if_no_display_is_given
|
40
|
+
assert_raises RuntimeError do
|
41
|
+
@menu.draw nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_first_item_is_initially_selected
|
46
|
+
assert_equal 'New Game', @menu.selected_item
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_move_down_selects_second_item
|
50
|
+
@menu.next
|
51
|
+
assert_equal 'Exit', @menu.selected_item
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_move_down_then_up_selects_first_item
|
55
|
+
@menu.next
|
56
|
+
@menu.previous
|
57
|
+
assert_equal 'New Game', @menu.selected_item
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_wrap_over_top
|
61
|
+
@menu.previous
|
62
|
+
assert_equal 'Exit', @menu.selected_item
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_wrap_over_bottom
|
66
|
+
@menu.next
|
67
|
+
@menu.next
|
68
|
+
assert_equal 'New Game', @menu.selected_item
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_false_returned_if_selecting_item_that_doesnt_exist
|
72
|
+
assert !@menu.select('p')
|
73
|
+
assert_equal 'New Game', @menu.selected_item
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_selecting_by_key
|
77
|
+
assert @menu.select('x')
|
78
|
+
assert_equal 'Exit', @menu.selected_item
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_render
|
82
|
+
@display.expects(:draw).times(12)
|
83
|
+
@menu.draw(@display)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_center_horizontally
|
87
|
+
@menu = MenuWidget.new :center, @y, {'a' => 'a'}
|
88
|
+
@display.expects(:width).returns(11)
|
89
|
+
@display.expects(:draw).with(6, @y, 'a', :red, :white)
|
90
|
+
@menu.draw @display
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_center_vertically
|
94
|
+
@menu = MenuWidget.new @x, :center, {'a' => 'a'}
|
95
|
+
@display.expects(:height).returns(11)
|
96
|
+
@display.expects(:draw).with(@x, 6, 'a', :red, :white)
|
97
|
+
@menu.draw @display
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_set_colors
|
101
|
+
MenuWidget.new @x, @y, @items, :red, :black, :green
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'minitest'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'delve/widgets/multi_line'
|
4
|
+
|
5
|
+
class MultiLineWidgetTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@x = 4
|
9
|
+
@y = 5
|
10
|
+
@lines = [ 'This is some text', 'With a new line' ]
|
11
|
+
@length = @lines[0].length + @lines[1].length
|
12
|
+
@widget = MultiLineWidget.new @x, @y, @lines
|
13
|
+
@display = mock('object')
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_initialising_without_x_position_raises_error
|
17
|
+
assert_raises RuntimeError do
|
18
|
+
MultiLineWidget.new nil, @y, @lines
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_initialising_without_y_position_raises_error
|
23
|
+
assert_raises RuntimeError do
|
24
|
+
MultiLineWidget.new @x, nil, @lines
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_initialising_without_text_raises_error
|
29
|
+
assert_raises RuntimeError do
|
30
|
+
MultiLineWidget.new @x, @y, nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_render_fails_if_no_display_is_given
|
35
|
+
assert_raises RuntimeError do
|
36
|
+
@widget.draw nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_center_horizontally_on_odd_width_screen
|
41
|
+
@widget = MultiLineWidget.new :center, @y, ['a']
|
42
|
+
@display.expects(:width).returns(11)
|
43
|
+
@display.expects(:draw).with(6, @y, 'a')
|
44
|
+
@widget.draw @display
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_center_horizontally_on_even_width_screen
|
48
|
+
@widget = MultiLineWidget.new :center, @y, ['a']
|
49
|
+
@display.expects(:width).returns(10)
|
50
|
+
@display.expects(:draw).with(5, @y, 'a')
|
51
|
+
@widget.draw @display
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_center_vertically_on_odd_width_screen
|
55
|
+
@widget = MultiLineWidget.new @x, :center, ['a']
|
56
|
+
@display.expects(:height).returns(11)
|
57
|
+
@display.expects(:draw).with(@x, 6, 'a')
|
58
|
+
@widget.draw @display
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_center_vertically_on_even_width_screen
|
62
|
+
@widget = MultiLineWidget.new @x, :center, ['a']
|
63
|
+
@display.expects(:height).returns(10)
|
64
|
+
@display.expects(:draw).with(@x, 5, 'a')
|
65
|
+
@widget.draw @display
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
def test_render
|
70
|
+
@display.expects(:draw).times(@length)
|
71
|
+
@widget.draw @display
|
72
|
+
end
|
73
|
+
end
|