metro-ld25 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/.travis.yml +6 -0
- data/Gemfile +12 -0
- data/Guardfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +189 -0
- data/Rakefile +18 -0
- data/bin/metro +16 -0
- data/changelog.md +157 -0
- data/lib/assets/menu-movement.wav +0 -0
- data/lib/assets/menu-selection.wav +0 -0
- data/lib/assets/missing.ogg +0 -0
- data/lib/assets/missing.png +0 -0
- data/lib/assets/missing.wav +0 -0
- data/lib/assets/missing_animation.png +0 -0
- data/lib/commands/generate_game.rb +13 -0
- data/lib/commands/generate_model.rb +25 -0
- data/lib/commands/generate_scene.rb +36 -0
- data/lib/commands/generate_view.rb +21 -0
- data/lib/commands/thor.rb +83 -0
- data/lib/core_ext/class.rb +14 -0
- data/lib/core_ext/numeric.rb +59 -0
- data/lib/gosu_ext/color.rb +62 -0
- data/lib/gosu_ext/gosu_constants.rb +53 -0
- data/lib/locale/en.yml +35 -0
- data/lib/locale/locale.rb +1 -0
- data/lib/metro.rb +140 -0
- data/lib/metro/animation.rb +135 -0
- data/lib/metro/animation/after_interval_factory.rb +12 -0
- data/lib/metro/animation/animation_factory.rb +15 -0
- data/lib/metro/animation/easing/ease_in.rb +15 -0
- data/lib/metro/animation/easing/easing.rb +51 -0
- data/lib/metro/animation/easing/linear.rb +15 -0
- data/lib/metro/animation/has_animations.rb +70 -0
- data/lib/metro/animation/implicit_animation.rb +100 -0
- data/lib/metro/animation/on_update_operation.rb +96 -0
- data/lib/metro/animation/scene_animation.rb +16 -0
- data/lib/metro/asset_path.rb +97 -0
- data/lib/metro/events/control_definition.rb +11 -0
- data/lib/metro/events/controls.rb +42 -0
- data/lib/metro/events/event_data.rb +60 -0
- data/lib/metro/events/event_dictionary.rb +52 -0
- data/lib/metro/events/event_factory.rb +17 -0
- data/lib/metro/events/event_relay.rb +300 -0
- data/lib/metro/events/event_state_manager.rb +63 -0
- data/lib/metro/events/events.rb +3 -0
- data/lib/metro/events/has_events.rb +108 -0
- data/lib/metro/events/hit_list.rb +75 -0
- data/lib/metro/events/unknown_sender.rb +5 -0
- data/lib/metro/font.rb +69 -0
- data/lib/metro/game.rb +102 -0
- data/lib/metro/game/dsl.rb +68 -0
- data/lib/metro/image.rb +68 -0
- data/lib/metro/logging.rb +33 -0
- data/lib/metro/missing_scene.rb +21 -0
- data/lib/metro/models/audio/song.rb +33 -0
- data/lib/metro/models/draws.rb +86 -0
- data/lib/metro/models/key_value_coding.rb +38 -0
- data/lib/metro/models/model.rb +236 -0
- data/lib/metro/models/model_factory.rb +32 -0
- data/lib/metro/models/models.rb +62 -0
- data/lib/metro/models/properties/animation_property.rb +115 -0
- data/lib/metro/models/properties/array_property.rb +24 -0
- data/lib/metro/models/properties/boolean_property.rb +27 -0
- data/lib/metro/models/properties/color_property.rb +116 -0
- data/lib/metro/models/properties/dimensions_property.rb +84 -0
- data/lib/metro/models/properties/font_property.rb +130 -0
- data/lib/metro/models/properties/image_property.rb +96 -0
- data/lib/metro/models/properties/model_property.rb +84 -0
- data/lib/metro/models/properties/numeric_property.rb +29 -0
- data/lib/metro/models/properties/options_property/no_option.rb +29 -0
- data/lib/metro/models/properties/options_property/options.rb +94 -0
- data/lib/metro/models/properties/options_property/options_property.rb +125 -0
- data/lib/metro/models/properties/position_property.rb +90 -0
- data/lib/metro/models/properties/property.rb +221 -0
- data/lib/metro/models/properties/property_owner.rb +137 -0
- data/lib/metro/models/properties/sample_property.rb +84 -0
- data/lib/metro/models/properties/scale_property.rb +80 -0
- data/lib/metro/models/properties/song_property.rb +89 -0
- data/lib/metro/models/properties/text_property.rb +75 -0
- data/lib/metro/models/ui/animated_sprite.rb +85 -0
- data/lib/metro/models/ui/border.rb +95 -0
- data/lib/metro/models/ui/fps.rb +54 -0
- data/lib/metro/models/ui/generic.rb +66 -0
- data/lib/metro/models/ui/grid_drawer.rb +74 -0
- data/lib/metro/models/ui/image.rb +87 -0
- data/lib/metro/models/ui/label.rb +175 -0
- data/lib/metro/models/ui/menu.rb +214 -0
- data/lib/metro/models/ui/model_label.rb +65 -0
- data/lib/metro/models/ui/model_labeler.rb +79 -0
- data/lib/metro/models/ui/rectangle.rb +59 -0
- data/lib/metro/models/ui/sprite.rb +79 -0
- data/lib/metro/models/ui/tile_map.rb +162 -0
- data/lib/metro/models/ui/ui.rb +13 -0
- data/lib/metro/parameters/command_line_args_parser.rb +68 -0
- data/lib/metro/parameters/options.rb +25 -0
- data/lib/metro/parameters/parameters.rb +2 -0
- data/lib/metro/sample.rb +40 -0
- data/lib/metro/scene.rb +477 -0
- data/lib/metro/scenes.rb +154 -0
- data/lib/metro/song.rb +56 -0
- data/lib/metro/template_message.rb +60 -0
- data/lib/metro/transitions/edit_transition_scene.rb +100 -0
- data/lib/metro/transitions/fade_transition_scene.rb +66 -0
- data/lib/metro/transitions/scene_transitions.rb +44 -0
- data/lib/metro/transitions/transition_scene.rb +19 -0
- data/lib/metro/units/bounds.rb +8 -0
- data/lib/metro/units/calculation_validations.rb +74 -0
- data/lib/metro/units/dimensions.rb +60 -0
- data/lib/metro/units/point.rb +51 -0
- data/lib/metro/units/rectangle_bounds.rb +85 -0
- data/lib/metro/units/scale.rb +46 -0
- data/lib/metro/units/units.rb +6 -0
- data/lib/metro/version.rb +32 -0
- data/lib/metro/views/json_view.rb +60 -0
- data/lib/metro/views/no_view.rb +34 -0
- data/lib/metro/views/parsers.rb +42 -0
- data/lib/metro/views/scene_view.rb +107 -0
- data/lib/metro/views/view.rb +133 -0
- data/lib/metro/views/writers.rb +43 -0
- data/lib/metro/views/yaml_view.rb +94 -0
- data/lib/metro/window.rb +94 -0
- data/lib/setup_handlers/exit_if_dry_run.rb +26 -0
- data/lib/setup_handlers/game_execution.rb +65 -0
- data/lib/setup_handlers/load_game_configuration.rb +65 -0
- data/lib/setup_handlers/load_game_files.rb +101 -0
- data/lib/setup_handlers/move_to_game_directory.rb +25 -0
- data/lib/setup_handlers/reload_game_on_game_file_changes.rb +79 -0
- data/lib/templates/game/README.md.tt +52 -0
- data/lib/templates/game/assets/brand.jpg +0 -0
- data/lib/templates/game/assets/hero.png +0 -0
- data/lib/templates/game/lib/custom_easing.rb +32 -0
- data/lib/templates/game/metro.tt +63 -0
- data/lib/templates/game/models/hero.rb +62 -0
- data/lib/templates/game/scenes/brand_scene.rb +19 -0
- data/lib/templates/game/scenes/brand_to_title_scene.rb +13 -0
- data/lib/templates/game/scenes/first_scene.rb +28 -0
- data/lib/templates/game/scenes/game_scene.rb +43 -0
- data/lib/templates/game/scenes/title_scene.rb +15 -0
- data/lib/templates/game/views/brand.yaml +4 -0
- data/lib/templates/game/views/brand_to_title.yaml +8 -0
- data/lib/templates/game/views/first.yaml +26 -0
- data/lib/templates/game/views/title.yaml +11 -0
- data/lib/templates/message.erb +23 -0
- data/lib/templates/model.rb.tt +111 -0
- data/lib/templates/scene.rb.tt +140 -0
- data/lib/templates/view.yaml.tt +11 -0
- data/lib/tmxed_ext/tile_set.rb +34 -0
- data/metro.gemspec +56 -0
- data/spec/core_ext/numeric_spec.rb +78 -0
- data/spec/core_ext/string_spec.rb +33 -0
- data/spec/gosu_ext/color_spec.rb +80 -0
- data/spec/metro/events/event_state_manager_spec.rb +5 -0
- data/spec/metro/models/key_value_coding_spec.rb +61 -0
- data/spec/metro/models/properties/array_property_spec.rb +60 -0
- data/spec/metro/models/properties/color_property_spec.rb +85 -0
- data/spec/metro/models/properties/dimensions_spec.rb +29 -0
- data/spec/metro/models/properties/font_property_spec.rb +127 -0
- data/spec/metro/models/properties/numeric_property_spec.rb +46 -0
- data/spec/metro/models/properties/options_property/no_option_spec.rb +25 -0
- data/spec/metro/models/properties/options_property/options_property_spec.rb +133 -0
- data/spec/metro/models/properties/options_property/options_spec.rb +125 -0
- data/spec/metro/models/properties/position_property_spec.rb +90 -0
- data/spec/metro/models/ui/label_spec.rb +259 -0
- data/spec/metro/parameters/command_line_args_parser_spec.rb +42 -0
- data/spec/metro/scene_spec.rb +15 -0
- data/spec/metro/scene_views/json_view_spec.rb +27 -0
- data/spec/metro/scene_views/yaml_view_spec.rb +38 -0
- data/spec/metro/scenes_spec.rb +77 -0
- data/spec/metro/units/point_spec.rb +132 -0
- data/spec/metro/views/view_spec.rb +53 -0
- data/spec/setup_handlers/exit_if_dry_run_spec.rb +27 -0
- data/spec/setup_handlers/reload_game_on_game_file_changes_spec.rb +68 -0
- data/spec/spec_helper.rb +20 -0
- metadata +374 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metro::Model::ArrayProperty do
|
4
|
+
|
5
|
+
subject { described_class.new model }
|
6
|
+
let(:model) { "model" }
|
7
|
+
|
8
|
+
describe "#get" do
|
9
|
+
context "when the value is nil" do
|
10
|
+
|
11
|
+
context "when no default value has been specified" do
|
12
|
+
let(:expected) { [] }
|
13
|
+
|
14
|
+
it "should return an empty array" do
|
15
|
+
subject.get(nil).should eq expected
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when a default value has been specified" do
|
20
|
+
subject { described_class.new model, default: expected }
|
21
|
+
let(:expected) { [:default_1,:default_2] }
|
22
|
+
|
23
|
+
it "should return the specified default" do
|
24
|
+
subject.get(nil).should eq expected
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#set" do
|
32
|
+
context "when the value is nil" do
|
33
|
+
let(:expected) { [] }
|
34
|
+
|
35
|
+
it "should return an empty array" do
|
36
|
+
subject.set(nil).should eq expected
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when the value contains symbols" do
|
41
|
+
let(:input) { [ :a, :b, :c ] }
|
42
|
+
let(:expected) { input }
|
43
|
+
|
44
|
+
it "should not convert the items to strings" do
|
45
|
+
subject.set(input).should eq expected
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when the value contains numbers" do
|
50
|
+
let(:input) { [ 1, 5.4, 0xABAB ] }
|
51
|
+
let(:expected) { input }
|
52
|
+
|
53
|
+
it "should not convert the items to strings" do
|
54
|
+
subject.set(input).should eq expected
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metro::Model::ColorProperty do
|
4
|
+
|
5
|
+
subject { described_class.new model }
|
6
|
+
let(:model) { mock("model", window: window) }
|
7
|
+
let(:window) { mock('window') }
|
8
|
+
|
9
|
+
describe "#get" do
|
10
|
+
let(:expected_color) { mock('color') }
|
11
|
+
|
12
|
+
context "when the value is nil" do
|
13
|
+
context "when no default value has been specified" do
|
14
|
+
let(:default_color_string) { "rgba(255,255,255,1.0)" }
|
15
|
+
|
16
|
+
|
17
|
+
it "should return the default value" do
|
18
|
+
subject.stub(:create_color).with(default_color_string) { expected_color }
|
19
|
+
subject.get(nil).should eq expected_color
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when a default value has been specified" do
|
24
|
+
subject do
|
25
|
+
described_class.new model, default: expected_color_string
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:expected_color_string) { "rgba(255,255,127,0.5)" }
|
29
|
+
|
30
|
+
it "should return the specified default value" do
|
31
|
+
subject.stub(:create_color).with(expected_color_string) { expected_color }
|
32
|
+
subject.get(nil).should eq expected_color
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when the value is a string" do
|
38
|
+
|
39
|
+
let(:color_string) { "#666666" }
|
40
|
+
|
41
|
+
it "should return the color" do
|
42
|
+
subject.stub(:create_color).with(color_string) { expected_color }
|
43
|
+
subject.get(color_string).should eq expected_color
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#set" do
|
50
|
+
let(:expected_color) { mock('color') }
|
51
|
+
|
52
|
+
context "when the value is nil" do
|
53
|
+
|
54
|
+
context "when no default value has been specified" do
|
55
|
+
let(:expected_color_string) { "rgba(255,255,255,1.0)" }
|
56
|
+
|
57
|
+
it "should return a string representation of the default color" do
|
58
|
+
subject.set(nil).should eq expected_color_string
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when a default value has been specified" do
|
63
|
+
subject do
|
64
|
+
described_class.new model, default: expected_color_string
|
65
|
+
end
|
66
|
+
|
67
|
+
let(:expected_color_string) { "rgba(0,127,11,0.4)" }
|
68
|
+
|
69
|
+
it "should return a string representation of the specified default color" do
|
70
|
+
subject.set(nil).should eq expected_color_string
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "when the value is a color" do
|
76
|
+
let(:color) { Gosu::Color.new expected_color_string }
|
77
|
+
let(:expected_color_string) { "rgba(45,12,12,1.0)" }
|
78
|
+
|
79
|
+
it "should return a string representation of the color" do
|
80
|
+
subject.set(color).should eq expected_color_string
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metro::Model::DimensionsProperty do
|
4
|
+
|
5
|
+
subject { desribed_class.new model }
|
6
|
+
let(:model) { mock("model", window: window) }
|
7
|
+
let(:window) do
|
8
|
+
mock('window',dimensions: window_dimensions )
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:window_dimensions) { Dimensions.of(1,1) }
|
12
|
+
|
13
|
+
context "when defined with a default block" do
|
14
|
+
|
15
|
+
subject do
|
16
|
+
described_class.new model do
|
17
|
+
window.dimensions
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:expected_dimensions) { window_dimensions }
|
22
|
+
|
23
|
+
it "should calculate the correct default value" do
|
24
|
+
subject.get(nil).should eq expected_dimensions
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metro::Model::FontProperty do
|
4
|
+
|
5
|
+
subject { described_class.new model }
|
6
|
+
let(:model) { mock("model", window: window) }
|
7
|
+
let(:window) { mock('window') }
|
8
|
+
|
9
|
+
describe "#get" do
|
10
|
+
let(:expected_font) { stub('font') }
|
11
|
+
let(:expected_options) { { name: expected_font_name, size: expected_font_size, window: window } }
|
12
|
+
|
13
|
+
context "when the value is nil" do
|
14
|
+
context "when no default value has been specified" do
|
15
|
+
let(:expected_font_name) { Gosu::default_font_name }
|
16
|
+
let(:expected_font_size) { 40 }
|
17
|
+
|
18
|
+
it "should return the default value" do
|
19
|
+
described_class.stub(:font_for).with(expected_options) { expected_font }
|
20
|
+
subject.get(nil).should eq expected_font
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when a default value has been specified" do
|
25
|
+
subject do
|
26
|
+
described_class.new model, default: { name: expected_font_name, size: expected_font_size }
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:expected_font_name) { 'Times New Roman' }
|
30
|
+
let(:expected_font_size) { 60 }
|
31
|
+
|
32
|
+
it "should return the specified default value" do
|
33
|
+
described_class.stub(:font_for).with(expected_options) { expected_font }
|
34
|
+
subject.get(nil).should eq expected_font
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when the value is a hash" do
|
40
|
+
let(:expected_font_name) { 'Helvetica' }
|
41
|
+
let(:expected_font_size) { 80 }
|
42
|
+
|
43
|
+
let(:font_hash) { { name: expected_font_name, size: expected_font_size } }
|
44
|
+
|
45
|
+
it "should return the font value" do
|
46
|
+
described_class.stub(:font_for).with(expected_options) { expected_font }
|
47
|
+
subject.get(font_hash).should eq expected_font
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "when the same font is requested" do
|
52
|
+
let(:expected_font_name) { Gosu::default_font_name }
|
53
|
+
let(:expected_font_size) { 40 }
|
54
|
+
|
55
|
+
it "should not be created a second time (pullled from memory)" do
|
56
|
+
described_class.should_receive(:font_for).twice { expected_font }
|
57
|
+
subject.get(nil)
|
58
|
+
subject.get(nil)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#set" do
|
66
|
+
context "when the value is nil" do
|
67
|
+
context "when no default value has been specified" do
|
68
|
+
let(:expected_font_name) { Gosu::default_font_name }
|
69
|
+
let(:expected_font_size) { 40 }
|
70
|
+
let(:expected_font) { stub('font') }
|
71
|
+
|
72
|
+
let(:expected_result) { { name: expected_font_name, size: expected_font_size } }
|
73
|
+
let(:expected_options) { { name: expected_font_name, size: expected_font_size, window: window } }
|
74
|
+
|
75
|
+
it "should return a hash of the default value" do
|
76
|
+
described_class.stub(:font_for).with(expected_options) { expected_font }
|
77
|
+
subject.set(nil).should eq expected_result
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "when a default value has been specified" do
|
82
|
+
subject do
|
83
|
+
described_class.new model, default: { name: expected_font_name, size: expected_font_size }
|
84
|
+
end
|
85
|
+
|
86
|
+
let(:expected_font_name) { 'Times New Roman' }
|
87
|
+
let(:expected_font_size) { 60 }
|
88
|
+
|
89
|
+
let(:expected_result) { { name: expected_font_name, size: expected_font_size } }
|
90
|
+
|
91
|
+
it "should return the specified default value" do
|
92
|
+
subject.set(nil).should eq expected_result
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "when the value is a font" do
|
98
|
+
|
99
|
+
let(:gosu_font) do
|
100
|
+
font = stub('font', name: expected_font_name, height: expected_font_size)
|
101
|
+
font.stub(:class) { Metro::Font }
|
102
|
+
font
|
103
|
+
end
|
104
|
+
|
105
|
+
let(:expected_font_name) { 'Comic Sans' }
|
106
|
+
let(:expected_font_size) { 45 }
|
107
|
+
|
108
|
+
let(:expected_result) { { name: expected_font_name, size: expected_font_size } }
|
109
|
+
|
110
|
+
it "should return a hash of the font" do
|
111
|
+
subject.set(gosu_font).should eq expected_result
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "when the value is a hash" do
|
116
|
+
|
117
|
+
let(:expected_font_name) { 'Wingdings' }
|
118
|
+
let(:expected_font_size) { 33 }
|
119
|
+
let(:expected_result) { { name: expected_font_name, size: expected_font_size } }
|
120
|
+
|
121
|
+
it "should return the hash representation of the font" do
|
122
|
+
subject.set(expected_result).should eq expected_result
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metro::Model::NumericProperty do
|
4
|
+
|
5
|
+
subject { described_class.new model }
|
6
|
+
let(:model) { "model" }
|
7
|
+
|
8
|
+
describe "#get" do
|
9
|
+
context "when the value is nil" do
|
10
|
+
context "when no default value has been specified" do
|
11
|
+
|
12
|
+
let(:expected_number) { 0.0 }
|
13
|
+
|
14
|
+
it "should return the default position" do
|
15
|
+
subject.get(nil).should eq expected_number
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when a default value has been specified" do
|
20
|
+
|
21
|
+
subject { described_class.new model, default: expected_number }
|
22
|
+
let(:expected_number) { 1.0 }
|
23
|
+
|
24
|
+
it "should return the specified default position" do
|
25
|
+
subject.get(nil).should eq expected_number
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when the value is a String" do
|
31
|
+
|
32
|
+
let(:number) { "4.3" }
|
33
|
+
let(:expected_number) { 4.3 }
|
34
|
+
|
35
|
+
it "should get the float value of the string" do
|
36
|
+
subject.get(number).should eq expected_number
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#set" do
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metro::Model::OptionsProperty::NoOption do
|
4
|
+
|
5
|
+
context "when attempting to an attribute like color of the no option" do
|
6
|
+
|
7
|
+
let(:log) { mock('log') }
|
8
|
+
|
9
|
+
it "should generate a warning message" do
|
10
|
+
log.should_receive(:warn).with(subject.warning_message)
|
11
|
+
subject.stub(:log) { log }
|
12
|
+
subject.color = :unknown
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when queried for its action" do
|
17
|
+
|
18
|
+
let(:expected_action) { :missing_menu_action }
|
19
|
+
|
20
|
+
it "should return 'missing_menu_action'" do
|
21
|
+
subject.properties[:action].should eq expected_action
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metro::Model::OptionsProperty do
|
4
|
+
|
5
|
+
subject { described_class.new model }
|
6
|
+
let(:model) { mock("model", create: 'builds models for a living') }
|
7
|
+
|
8
|
+
describe "#get" do
|
9
|
+
context "when the value is nil" do
|
10
|
+
context "when no menu has been specified" do
|
11
|
+
it "should return empty options" do
|
12
|
+
subject.get(nil).count.should eq 0
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
context "when the value is an array of options names" do
|
19
|
+
before do
|
20
|
+
model.stub(:create) { |model_type,options| mock(model_type,options) }
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:names) { [ 'Start Game', 'Options', 'Exit Game' ] }
|
24
|
+
let(:actions) { [ :start_game, :options, :exit_game ] }
|
25
|
+
|
26
|
+
let(:options) { subject.get(names) }
|
27
|
+
|
28
|
+
it "should return an option for each name" do
|
29
|
+
options.count.should eq names.count
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should create labels with text with each name" do
|
33
|
+
options.map { |option| option.text }.should eq names
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should create actions based on each name" do
|
37
|
+
options.map { |option| option.action }.should eq actions
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should set the default selected as the first item" do
|
41
|
+
options.selected.should eq options.first
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
context "when the value is a hash which is a set of option names and the selected index" do
|
47
|
+
before do
|
48
|
+
model.stub(:create) { |model_type,options| mock(model_type,options) }
|
49
|
+
end
|
50
|
+
|
51
|
+
let(:names_and_selected_index) do
|
52
|
+
{ 'selected' => selected_index, 'items' => names }
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:names) { [ 'Start Game', 'Options', 'Exit Game' ] }
|
56
|
+
let(:actions) { [ :start_game, :options, :exit_game ] }
|
57
|
+
let(:selected_index) { 1 }
|
58
|
+
|
59
|
+
let(:label_model_class) { 'metro::ui::label' }
|
60
|
+
|
61
|
+
|
62
|
+
let(:options) { subject.get(names_and_selected_index) }
|
63
|
+
|
64
|
+
it "should return an option for each name" do
|
65
|
+
options.count.should eq names.count
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should create labels for each name" do
|
69
|
+
options.each { |option| option.model.should eq label_model_class }
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should create labels with text with each name" do
|
73
|
+
options.map { |option| option.text }.should eq names
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should create actions based on each name" do
|
77
|
+
options.map { |option| option.action }.should eq actions
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should set the default selected as the first item" do
|
81
|
+
options.selected.should eq options[selected_index]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
context "when the value is hash that contains a set of options (with specific ui details) and the seelcted index" do
|
87
|
+
before do
|
88
|
+
model.stub(:create) { |model_type,options| mock(model_type,options) }
|
89
|
+
end
|
90
|
+
|
91
|
+
let(:names_and_selected_index) do
|
92
|
+
{ 'selected' => selected_index, 'items' => details }
|
93
|
+
end
|
94
|
+
|
95
|
+
let(:details) do
|
96
|
+
[ { model: 'metro::ui::label', text: 'Start Game!', action: 'start_game' },
|
97
|
+
{ model: 'metro::ui::image', text: 'Settings', action: 'open_settings' },
|
98
|
+
{ model: 'metro::ui::label', text: 'Exit' } ]
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
let(:names) { [ 'Start Game!', 'Settings', 'Exit' ] }
|
103
|
+
let(:actions) { [ :start_game, :open_settings, :exit ] }
|
104
|
+
let(:models) { [ 'metro::ui::label', 'metro::ui::image', 'metro::ui::label' ] }
|
105
|
+
|
106
|
+
let(:selected_index) { 1 }
|
107
|
+
|
108
|
+
let(:options) { subject.get(names_and_selected_index) }
|
109
|
+
|
110
|
+
it "should return an option for each name" do
|
111
|
+
options.count.should eq names.count
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should create labels for each name" do
|
115
|
+
options.map { |option| option.model }.should eq models
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should create labels with text with each name" do
|
119
|
+
options.map { |option| option.text }.should eq names
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should create actions based on each name" do
|
123
|
+
options.map { |option| option.action }.should eq actions
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should set the default selected as the first item" do
|
127
|
+
options.selected.should eq options[selected_index]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|