smalruby-editor 0.1.6-x86-mingw32 → 0.1.7-x86-mingw32
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.
Potentially problematic release.
This version of smalruby-editor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/assets/javascripts/blocks/hardware.js.coffee.erb +40 -3
- data/app/assets/stylesheets/toolbox.css.scss.erb +1 -6
- data/app/controllers/source_codes_controller.rb +5 -1
- data/app/models/concerns/ruby_to_block/block/base.rb +251 -0
- data/app/models/concerns/ruby_to_block/block/character.rb +42 -0
- data/app/models/concerns/ruby_to_block/block/character_event.rb +27 -0
- data/app/models/concerns/ruby_to_block/block/character_method_call.rb +29 -0
- data/app/models/concerns/ruby_to_block/block/character_new.rb +7 -0
- data/app/models/concerns/ruby_to_block/block/character_operation.rb +80 -0
- data/app/models/concerns/ruby_to_block/block/control_if.rb +45 -0
- data/app/models/concerns/ruby_to_block/block/control_loop.rb +19 -0
- data/app/models/concerns/ruby_to_block/block/control_sleep.rb +18 -0
- data/app/models/concerns/ruby_to_block/block/do.rb +24 -0
- data/app/models/concerns/ruby_to_block/block/else.rb +12 -0
- data/app/models/concerns/ruby_to_block/block/end.rb +26 -0
- data/app/models/concerns/ruby_to_block/block/events_on_click.rb +14 -0
- data/app/models/concerns/ruby_to_block/block/events_on_key_push_or_down.rb +17 -0
- data/app/models/concerns/ruby_to_block/block/events_on_start.rb +14 -0
- data/app/models/concerns/ruby_to_block/block/hardware_init_hardware.rb +14 -0
- data/app/models/concerns/ruby_to_block/block/hardware_led_off.rb +16 -0
- data/app/models/concerns/ruby_to_block/block/hardware_led_on.rb +16 -0
- data/app/models/concerns/ruby_to_block/block/hardware_on_sensor_change.rb +17 -0
- data/app/models/concerns/ruby_to_block/block/hardware_rgb_led_off.rb +18 -0
- data/app/models/concerns/ruby_to_block/block/hardware_rgb_led_on.rb +23 -0
- data/app/models/concerns/ruby_to_block/block/hardware_sensor_value.rb +23 -0
- data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car.rb +26 -0
- data/app/models/concerns/ruby_to_block/block/looks_hide.rb +8 -0
- data/app/models/concerns/ruby_to_block/block/looks_say.rb +20 -0
- data/app/models/concerns/ruby_to_block/block/looks_show.rb +8 -0
- data/app/models/concerns/ruby_to_block/block/looks_vanish.rb +8 -0
- data/app/models/concerns/ruby_to_block/block/math_number.rb +14 -0
- data/app/models/concerns/ruby_to_block/block/motion_change_x_by.rb +20 -0
- data/app/models/concerns/ruby_to_block/block/motion_change_y_by.rb +20 -0
- data/app/models/concerns/ruby_to_block/block/motion_move.rb +15 -0
- data/app/models/concerns/ruby_to_block/block/motion_point_towards_character.rb +24 -0
- data/app/models/concerns/ruby_to_block/block/motion_point_towards_mouse.rb +9 -0
- data/app/models/concerns/ruby_to_block/block/motion_reach_wall.rb +24 -0
- data/app/models/concerns/ruby_to_block/block/motion_rotate_left.rb +20 -0
- data/app/models/concerns/ruby_to_block/block/motion_rotate_right.rb +20 -0
- data/app/models/concerns/ruby_to_block/block/motion_self_angle.rb +23 -0
- data/app/models/concerns/ruby_to_block/block/motion_self_x.rb +23 -0
- data/app/models/concerns/ruby_to_block/block/motion_self_y.rb +23 -0
- data/app/models/concerns/ruby_to_block/block/motion_set_angle.rb +15 -0
- data/app/models/concerns/ruby_to_block/block/motion_set_x.rb +38 -0
- data/app/models/concerns/ruby_to_block/block/motion_set_y.rb +15 -0
- data/app/models/concerns/ruby_to_block/block/motion_turn.rb +8 -0
- data/app/models/concerns/ruby_to_block/block/motion_turn_if_reach_wall.rb +8 -0
- data/app/models/concerns/ruby_to_block/block/null.rb +17 -0
- data/app/models/concerns/ruby_to_block/block/operators_compare.rb +36 -0
- data/app/models/concerns/ruby_to_block/block/operators_false.rb +8 -0
- data/app/models/concerns/ruby_to_block/block/operators_true.rb +8 -0
- data/app/models/concerns/ruby_to_block/block/require_smalruby.rb +7 -0
- data/app/models/concerns/ruby_to_block/block/ruby_comment.rb +16 -0
- data/app/models/concerns/ruby_to_block/block/ruby_expression.rb +14 -0
- data/app/models/concerns/ruby_to_block/block/ruby_statement.rb +23 -0
- data/app/models/concerns/ruby_to_block/block/sensing_hit.rb +23 -0
- data/app/models/concerns/ruby_to_block/block/sound_play.rb +15 -0
- data/app/models/concerns/ruby_to_block/block/sound_preset_sounds.rb +31 -0
- data/app/models/concerns/ruby_to_block/block/text.rb +15 -0
- data/app/models/concerns/ruby_to_block/block/value.rb +12 -0
- data/app/models/concerns/ruby_to_block/block.rb +97 -0
- data/app/models/concerns/ruby_to_block/context.rb +97 -0
- data/app/models/concerns/ruby_to_block/formatter.rb +26 -0
- data/app/models/concerns/ruby_to_block.rb +17 -360
- data/app/models/source_code.rb +3 -1
- data/app/views/editor/_toolbox.html.haml +16 -0
- data/lib/smalruby_editor/version.rb +3 -3
- data/public/assets/{application-64a390efe879c386a5950515064f062d.css → application-28b7bed56c5389dfa372e972c75b6676.css} +17 -10
- data/public/assets/application-28b7bed56c5389dfa372e972c75b6676.css.gz +0 -0
- data/public/assets/{application-8bfffad1222d4e198f3c7ccc1cbd774f.js → application-4f747690ebc8ec4815ae36021fdb2c44.js} +135 -0
- data/public/assets/{application-8bfffad1222d4e198f3c7ccc1cbd774f.js.gz → application-4f747690ebc8ec4815ae36021fdb2c44.js.gz} +0 -0
- data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
- data/smalruby-editor.gemspec +1 -1
- data/spec/acceptance/block_mode/blocks/hardware/two_wheel_drive_car.feature +69 -0
- data/spec/acceptance/ruby_mode/translate.feature +1 -1
- data/spec/controllers/source_codes_controller_spec.rb +14 -11
- data/spec/models/concerns/ruby_to_block/block/character_method_call_spec.rb +175 -0
- data/spec/models/concerns/ruby_to_block/block/control_if_spec.rb +75 -0
- data/spec/models/concerns/ruby_to_block/block/control_loop_spec.rb +68 -0
- data/spec/models/concerns/ruby_to_block/block/events_on_start_spec.rb +120 -0
- data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +120 -0
- data/spec/models/concerns/ruby_to_block/block/looks_say_spec.rb +79 -0
- data/spec/models/concerns/ruby_to_block/block/looks_spec.rb +74 -0
- data/spec/models/concerns/ruby_to_block/block/motion_move_spec.rb +63 -0
- data/spec/models/concerns/ruby_to_block/block/motion_reach_wall_spec.rb +67 -0
- data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +392 -0
- data/spec/models/concerns/ruby_to_block/block/motion_turn_spec.rb +54 -0
- data/spec/models/concerns/ruby_to_block/block/require_smalruby_spec.rb +39 -0
- data/spec/models/concerns/ruby_to_block/block/ruby_comment_spec.rb +55 -0
- data/spec/models/concerns/ruby_to_block/block/ruby_statement_spec.rb +113 -0
- data/spec/models/concerns/ruby_to_block/block/shared/block_examples.rb +44 -0
- data/spec/models/concerns/ruby_to_block/block/sound_spec.rb +46 -0
- data/spec/models/concerns/ruby_to_block/block_spec.rb +49 -0
- data/spec/models/concerns/ruby_to_block_spec.rb +421 -217
- data/spec/support/ruby_to_block.rb +10 -0
- metadata +108 -10
- data/public/assets/application-64a390efe879c386a5950515064f062d.css.gz +0 -0
data/smalruby-editor.gemspec
CHANGED
@@ -0,0 +1,69 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# language: ja
|
3
|
+
@javascript
|
4
|
+
機能: hardware_two_wheel_drive_car_{forward,backward,turn_left,turn_right,stop} - 「2WD車[▼ピン]を{進める,バックさせる,左に曲げる,右に曲げる,止める}」ブロック
|
5
|
+
背景:
|
6
|
+
前提 "ブロック" タブを表示する
|
7
|
+
かつ 次のキャラクターを追加する:
|
8
|
+
| name | costumes | x | y | angle |
|
9
|
+
| car1 | car1.png | 0 | 0 | 0 |
|
10
|
+
|
11
|
+
シナリオテンプレート: ブロックのみ、キャラクターとブロック、キャラクターとイベントとブロックをそれぞれ配置する
|
12
|
+
# ブロックのみ配置する
|
13
|
+
もし 次のブロック("hardware_two_wheel_drive_car_<ブロック名のサフィックス>")を配置する:
|
14
|
+
"""
|
15
|
+
%block{:type => "hardware_two_wheel_drive_car_<ブロック名のサフィックス>", :x => "0", :y => "0"}
|
16
|
+
%field{:name => "PIN"}<
|
17
|
+
D2
|
18
|
+
"""
|
19
|
+
かつ ブロックからソースコードを生成する
|
20
|
+
|
21
|
+
ならば テキストエディタのプログラムは "" であること
|
22
|
+
|
23
|
+
# キャラクターとブロックを配置する
|
24
|
+
もし 次のブロック("hardware_two_wheel_drive_car_<ブロック名のサフィックス>")を配置する:
|
25
|
+
"""
|
26
|
+
%block{:type => "character_new", :x => "21", :y => "15"}
|
27
|
+
%field{:name => "NAME"}<
|
28
|
+
car1
|
29
|
+
%statement{:name => "DO"}
|
30
|
+
%block{:type => "hardware_two_wheel_drive_car_<ブロック名のサフィックス>", :x => "0", :y => "0"}
|
31
|
+
%field{:name => "PIN"}<
|
32
|
+
D2
|
33
|
+
"""
|
34
|
+
かつ ブロックからソースコードを生成する
|
35
|
+
|
36
|
+
ならば テキストエディタのプログラムは以下を含むこと:
|
37
|
+
"""
|
38
|
+
car1.two_wheel_drive_car("D2").<ブロック名のサフィックス>
|
39
|
+
"""
|
40
|
+
|
41
|
+
# キャラクターとイベントとブロックを配置する
|
42
|
+
もし 次のブロック("hardware_two_wheel_drive_car_<ブロック名のサフィックス>")を配置する:
|
43
|
+
"""
|
44
|
+
%block{:type => "character_new", :x => "21", :y => "15"}
|
45
|
+
%field{:name => "NAME"}<
|
46
|
+
car1
|
47
|
+
%statement{:name => "DO"}
|
48
|
+
%block{:type => "events_on_start"}
|
49
|
+
%statement{:name => "DO"}
|
50
|
+
%block{:type => "hardware_two_wheel_drive_car_<ブロック名のサフィックス>", :x => "0", :y => "0"}
|
51
|
+
%field{:name => "PIN"}<
|
52
|
+
D2
|
53
|
+
"""
|
54
|
+
かつ ブロックからソースコードを生成する
|
55
|
+
|
56
|
+
ならば テキストエディタのプログラムは以下を含むこと:
|
57
|
+
"""
|
58
|
+
car1.on(:start) do
|
59
|
+
two_wheel_drive_car("D2").<ブロック名のサフィックス>
|
60
|
+
end
|
61
|
+
"""
|
62
|
+
|
63
|
+
例:
|
64
|
+
| ブロック名のサフィックス |
|
65
|
+
| forward |
|
66
|
+
| backward |
|
67
|
+
| turn_left |
|
68
|
+
| turn_right |
|
69
|
+
| stop |
|
@@ -29,7 +29,7 @@
|
|
29
29
|
"""
|
30
30
|
<xml>
|
31
31
|
<character x="0" y="0" name="car1" costumes="car1.png" angle="0"></character>
|
32
|
-
<block type="character_new" x="
|
32
|
+
<block type="character_new" x="0" y="0">
|
33
33
|
<field name="NAME">car1</field>
|
34
34
|
<statement name="DO">
|
35
35
|
<block type="events_on_start">
|
@@ -468,24 +468,27 @@ describe SourceCodesController do
|
|
468
468
|
end
|
469
469
|
|
470
470
|
describe 'プログラムをXML形式のブロックに変換する (POST to_blocks)' do
|
471
|
+
let(:data) { 'data' }
|
472
|
+
|
471
473
|
before do
|
474
|
+
allow_any_instance_of(SourceCode).to receive(:to_blocks) {
|
475
|
+
fail if data == '__FAIL__'
|
476
|
+
'success'
|
477
|
+
}
|
478
|
+
|
472
479
|
post :to_blocks, source_code: { data: data }
|
473
480
|
end
|
474
481
|
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
it 'XML形式のブロックを返すこと' do
|
480
|
-
expect(response.body).to eq(SourceCode::SUCCESS_XML_MOCK)
|
481
|
-
end
|
482
|
+
context '成功する場合' do
|
483
|
+
it 'SourceCode#to_blocksの結果をそのまま返すこと' do
|
484
|
+
expect(response.body).to eq('success')
|
482
485
|
end
|
486
|
+
end
|
483
487
|
|
484
|
-
|
485
|
-
|
488
|
+
context '失敗する場合' do
|
489
|
+
let(:data) { '__FAIL__' }
|
486
490
|
|
487
|
-
|
488
|
-
end
|
491
|
+
it { expect(response.status).to eq(400) }
|
489
492
|
end
|
490
493
|
end
|
491
494
|
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require_relative 'shared/block_examples'
|
4
|
+
|
5
|
+
# ここではCharacterMethodCallのexamplesとしてlooks_sayブロックを利用
|
6
|
+
# します。そのかわりlooks_sayのようにCharacterMethodCallを継承したブ
|
7
|
+
# ロックでは最低限のexamplesしか実装しません。
|
8
|
+
|
9
|
+
# rubocop:disable EmptyLines, LineLength
|
10
|
+
|
11
|
+
describe RubyToBlock::Block::CharacterMethodCall, to_blocks: true do
|
12
|
+
parts = <<-EOS
|
13
|
+
say(message: "こんにちは")
|
14
|
+
EOS
|
15
|
+
describe compact_source_code(parts), on_start_data: true do
|
16
|
+
_parts = parts
|
17
|
+
let(:parts) { _parts }
|
18
|
+
|
19
|
+
it '結果が正しいこと' do
|
20
|
+
should eq_block_xml(<<-XML)
|
21
|
+
<block type="looks_say" inline="true">
|
22
|
+
<value name="TEXT">
|
23
|
+
<block type="text">
|
24
|
+
<field name="TEXT">こんにちは</field>
|
25
|
+
</block>
|
26
|
+
</value>
|
27
|
+
</block>
|
28
|
+
XML
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
parts = <<-EOS
|
33
|
+
self.say(message: "こんにちは")
|
34
|
+
EOS
|
35
|
+
describe compact_source_code(parts), on_start_data: true do
|
36
|
+
_parts = parts
|
37
|
+
let(:parts) { _parts }
|
38
|
+
|
39
|
+
it '結果が正しいこと' do
|
40
|
+
should eq_block_xml(<<-XML)
|
41
|
+
<block type="looks_say" inline="true">
|
42
|
+
<value name="TEXT">
|
43
|
+
<block type="text">
|
44
|
+
<field name="TEXT">こんにちは</field>
|
45
|
+
</block>
|
46
|
+
</value>
|
47
|
+
</block>
|
48
|
+
XML
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
parts = <<-EOS
|
53
|
+
say(message: "こんにちは")
|
54
|
+
puts "Hello, World!"
|
55
|
+
EOS
|
56
|
+
describe compact_source_code(parts), on_start_data: true do
|
57
|
+
_parts = parts
|
58
|
+
let(:parts) { _parts }
|
59
|
+
|
60
|
+
it '結果が正しいこと' do
|
61
|
+
should eq_block_xml(<<-XML)
|
62
|
+
<block type="looks_say" inline="true">
|
63
|
+
<value name="TEXT">
|
64
|
+
<block type="text">
|
65
|
+
<field name="TEXT">こんにちは</field>
|
66
|
+
</block>
|
67
|
+
</value>
|
68
|
+
<next>
|
69
|
+
<block type="ruby_statement">
|
70
|
+
<field name="STATEMENT">puts "Hello, World!"</field>
|
71
|
+
</block>
|
72
|
+
</next>
|
73
|
+
</block>
|
74
|
+
XML
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
parts = <<-EOS
|
79
|
+
car1.say(message: "こんにちは")
|
80
|
+
EOS
|
81
|
+
describe compact_source_code(parts), character_new_data: true do
|
82
|
+
_parts = parts
|
83
|
+
let(:parts) { _parts }
|
84
|
+
|
85
|
+
it '結果が正しいこと' do
|
86
|
+
should eq_block_xml(<<-XML)
|
87
|
+
<block type="looks_say" inline="true">
|
88
|
+
<value name="TEXT">
|
89
|
+
<block type="text">
|
90
|
+
<field name="TEXT">こんにちは</field>
|
91
|
+
</block>
|
92
|
+
</value>
|
93
|
+
</block>
|
94
|
+
XML
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
parts = <<-EOS
|
99
|
+
car1.say(message: "こんにちは")
|
100
|
+
car1.say(message: "こんにちは")
|
101
|
+
EOS
|
102
|
+
describe compact_source_code(parts), character_new_data: true do
|
103
|
+
_parts = parts
|
104
|
+
let(:parts) { _parts }
|
105
|
+
|
106
|
+
it '結果が正しいこと' do
|
107
|
+
should eq_block_xml(<<-XML)
|
108
|
+
<block type="looks_say" inline="true">
|
109
|
+
<value name="TEXT">
|
110
|
+
<block type="text">
|
111
|
+
<field name="TEXT">こんにちは</field>
|
112
|
+
</block>
|
113
|
+
</value>
|
114
|
+
<next>
|
115
|
+
<block type="looks_say" inline="true">
|
116
|
+
<value name="TEXT">
|
117
|
+
<block type="text">
|
118
|
+
<field name="TEXT">こんにちは</field>
|
119
|
+
</block>
|
120
|
+
</value>
|
121
|
+
</block>
|
122
|
+
</next>
|
123
|
+
</block>
|
124
|
+
XML
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
parts = <<-EOS
|
129
|
+
car1.say(message: "こんにちは")
|
130
|
+
unknown.say(message: "こんにちは")
|
131
|
+
say(message: "こんにちは")
|
132
|
+
EOS
|
133
|
+
describe compact_source_code(parts), character_new_data: true do
|
134
|
+
_parts = parts
|
135
|
+
let(:parts) { _parts }
|
136
|
+
|
137
|
+
it '結果が正しいこと' do
|
138
|
+
should eq_block_xml(<<-XML)
|
139
|
+
<block type="looks_say" inline="true">
|
140
|
+
<value name="TEXT">
|
141
|
+
<block type="text">
|
142
|
+
<field name="TEXT">こんにちは</field>
|
143
|
+
</block>
|
144
|
+
</value>
|
145
|
+
<next>
|
146
|
+
<block type="ruby_statement">
|
147
|
+
<field name="STATEMENT">unknown.say(message: "こんにちは")</field>
|
148
|
+
<next>
|
149
|
+
<block type="ruby_statement">
|
150
|
+
<field name="STATEMENT">say(message: "こんにちは")</field>
|
151
|
+
</block>
|
152
|
+
</next>
|
153
|
+
</block>
|
154
|
+
</next>
|
155
|
+
</block>
|
156
|
+
XML
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
_data = <<-EOS
|
161
|
+
say(message: "こんにちは")
|
162
|
+
EOS
|
163
|
+
describe compact_source_code(_data) do
|
164
|
+
__data = _data
|
165
|
+
let(:data) { __data }
|
166
|
+
|
167
|
+
it '結果が正しいこと' do
|
168
|
+
should eq_block_xml(<<-XML)
|
169
|
+
<block type="ruby_statement">
|
170
|
+
<field name="STATEMENT">say(message: "こんにちは")</field>
|
171
|
+
</block>
|
172
|
+
XML
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require_relative 'shared/block_examples'
|
4
|
+
|
5
|
+
# rubocop:disable EmptyLines, LineLength
|
6
|
+
|
7
|
+
describe RubyToBlock::Block::ControlIf,
|
8
|
+
RubyToBlock::Block::OperatorsTrue,
|
9
|
+
RubyToBlock::Block::OperatorsFalse,
|
10
|
+
to_blocks: true do
|
11
|
+
_data = <<-EOS
|
12
|
+
if true
|
13
|
+
|
14
|
+
end
|
15
|
+
EOS
|
16
|
+
describe compact_source_code(_data) do
|
17
|
+
__data = _data
|
18
|
+
let(:data) { __data }
|
19
|
+
|
20
|
+
it '結果が正しいこと' do
|
21
|
+
should eq_block_xml(<<-XML)
|
22
|
+
<block type="control_if" inline="true">
|
23
|
+
<value name="COND">
|
24
|
+
<block type="operators_true" />
|
25
|
+
</value>
|
26
|
+
</block>
|
27
|
+
XML
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
_data = <<-EOS
|
32
|
+
if false
|
33
|
+
|
34
|
+
end
|
35
|
+
EOS
|
36
|
+
describe compact_source_code(_data) do
|
37
|
+
__data = _data
|
38
|
+
let(:data) { __data }
|
39
|
+
|
40
|
+
it '結果が正しいこと' do
|
41
|
+
should eq_block_xml(<<-XML)
|
42
|
+
<block type="control_if" inline="true">
|
43
|
+
<value name="COND">
|
44
|
+
<block type="operators_false" />
|
45
|
+
</value>
|
46
|
+
</block>
|
47
|
+
XML
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
_data = <<-EOS
|
52
|
+
if true
|
53
|
+
puts "Hello, World!"
|
54
|
+
end
|
55
|
+
EOS
|
56
|
+
describe compact_source_code(_data) do
|
57
|
+
__data = _data
|
58
|
+
let(:data) { __data }
|
59
|
+
|
60
|
+
it '結果が正しいこと' do
|
61
|
+
should eq_block_xml(<<-XML)
|
62
|
+
<block type="control_if" inline="true">
|
63
|
+
<value name="COND">
|
64
|
+
<block type="operators_true" />
|
65
|
+
</value>
|
66
|
+
<statement name="THEN">
|
67
|
+
<block type="ruby_statement">
|
68
|
+
<field name="STATEMENT">puts "Hello, World!"</field>
|
69
|
+
</block>
|
70
|
+
</statement>
|
71
|
+
</block>
|
72
|
+
XML
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require_relative 'shared/block_examples'
|
4
|
+
|
5
|
+
# rubocop:disable EmptyLines, LineLength
|
6
|
+
|
7
|
+
describe RubyToBlock::Block::ControlLoop, to_blocks: true do
|
8
|
+
parts = <<-EOS
|
9
|
+
loop do
|
10
|
+
|
11
|
+
end
|
12
|
+
EOS
|
13
|
+
describe compact_source_code(parts), on_start_data: true do
|
14
|
+
_parts = parts
|
15
|
+
let(:parts) { _parts }
|
16
|
+
|
17
|
+
it '結果が正しいこと' do
|
18
|
+
should eq_block_xml(<<-XML)
|
19
|
+
<block type="control_loop" />
|
20
|
+
XML
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
parts = <<-EOS
|
25
|
+
loop do
|
26
|
+
puts "Hello, World!"
|
27
|
+
end
|
28
|
+
EOS
|
29
|
+
describe compact_source_code(parts), on_start_data: true do
|
30
|
+
_parts = parts
|
31
|
+
let(:parts) { _parts }
|
32
|
+
|
33
|
+
it '結果が正しいこと' do
|
34
|
+
should eq_block_xml(<<-XML)
|
35
|
+
<block type="control_loop">
|
36
|
+
<statement name="DO">
|
37
|
+
<block type="ruby_statement">
|
38
|
+
<field name="STATEMENT">puts "Hello, World!"</field>
|
39
|
+
</block>
|
40
|
+
</statement>
|
41
|
+
</block>
|
42
|
+
XML
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
_data = <<-EOS
|
47
|
+
loop do
|
48
|
+
|
49
|
+
end
|
50
|
+
EOS
|
51
|
+
describe compact_source_code(_data) do
|
52
|
+
__data = _data
|
53
|
+
let(:data) { __data }
|
54
|
+
|
55
|
+
it '結果が正しいこと' do
|
56
|
+
should eq_block_xml(<<-XML)
|
57
|
+
<block type="ruby_statement">
|
58
|
+
<field name="STATEMENT">loop do</field>
|
59
|
+
<next>
|
60
|
+
<block type="ruby_statement">
|
61
|
+
<field name="STATEMENT">end</field>
|
62
|
+
</block>
|
63
|
+
</next>
|
64
|
+
</block>
|
65
|
+
XML
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require_relative 'shared/block_examples'
|
4
|
+
|
5
|
+
# rubocop:disable EmptyLines, LineLength
|
6
|
+
|
7
|
+
describe RubyToBlock::Block::EventsOnStart, to_blocks: true do
|
8
|
+
parts = <<-EOS
|
9
|
+
car1.on(:start) do
|
10
|
+
|
11
|
+
end
|
12
|
+
EOS
|
13
|
+
describe compact_source_code(parts), character_new_data: true do
|
14
|
+
_parts = parts
|
15
|
+
let(:parts) { _parts }
|
16
|
+
|
17
|
+
it '結果が正しいこと' do
|
18
|
+
should eq_block_xml(<<-XML)
|
19
|
+
<block type="events_on_start" />
|
20
|
+
XML
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
parts = <<-EOS
|
25
|
+
cat1 = Character.new(costume: "cat1.png", x: 200, y: 150, angle: 90)
|
26
|
+
|
27
|
+
car1.on(:start) do
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
car1.on(:start) do
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
cat1.on(:start) do
|
37
|
+
|
38
|
+
end
|
39
|
+
EOS
|
40
|
+
describe compact_source_code(parts), character_new_data: true do
|
41
|
+
_parts = parts
|
42
|
+
let(:parts) { _parts }
|
43
|
+
|
44
|
+
it '結果が正しいこと' do
|
45
|
+
should eq_block_xml(<<-XML)
|
46
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
47
|
+
<character name="cat1" x="200" y="150" angle="90" costumes="cat1.png" />
|
48
|
+
<block type="character_new">
|
49
|
+
<field name="NAME">car1</field>
|
50
|
+
<statement name="DO">
|
51
|
+
<block type="events_on_start">
|
52
|
+
<next>
|
53
|
+
<block type="events_on_start" />
|
54
|
+
</next>
|
55
|
+
</block>
|
56
|
+
</statement>
|
57
|
+
</block>
|
58
|
+
<block type="character_new">
|
59
|
+
<field name="NAME">cat1</field>
|
60
|
+
<statement name="DO">
|
61
|
+
<block type="events_on_start" />
|
62
|
+
</statement>
|
63
|
+
</block>
|
64
|
+
XML
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
parts = <<-EOS
|
69
|
+
cat1 = Character.new(costume: "cat1.png", x: 200, y: 150, angle: 90)
|
70
|
+
|
71
|
+
car1.on(:start) do
|
72
|
+
|
73
|
+
cat1.on(:start) do
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
EOS
|
78
|
+
describe compact_source_code(parts), character_new_data: true do
|
79
|
+
_parts = parts
|
80
|
+
let(:parts) { _parts }
|
81
|
+
|
82
|
+
it '結果が正しいこと' do
|
83
|
+
should eq_block_xml(<<-XML)
|
84
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
85
|
+
<character name="cat1" x="200" y="150" angle="90" costumes="cat1.png" />
|
86
|
+
<block type="character_new">
|
87
|
+
<field name="NAME">car1</field>
|
88
|
+
<statement name="DO">
|
89
|
+
<block type="events_on_start">
|
90
|
+
<statement name="DO">
|
91
|
+
<block type="character_new">
|
92
|
+
<field name="NAME">cat1</field>
|
93
|
+
<statement name="DO">
|
94
|
+
<block type="events_on_start" />
|
95
|
+
</statement>
|
96
|
+
</block>
|
97
|
+
</statement>
|
98
|
+
</block>
|
99
|
+
</statement>
|
100
|
+
</block>
|
101
|
+
XML
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
parts = <<-EOS
|
106
|
+
on(:start) do
|
107
|
+
|
108
|
+
end
|
109
|
+
EOS
|
110
|
+
describe compact_source_code(parts), on_start_data: true do
|
111
|
+
_parts = parts
|
112
|
+
let(:parts) { _parts }
|
113
|
+
|
114
|
+
it '結果が正しいこと' do
|
115
|
+
should eq_block_xml(<<-XML)
|
116
|
+
<block type="events_on_start" />
|
117
|
+
XML
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require_relative 'shared/block_examples'
|
4
|
+
|
5
|
+
# rubocop:disable EmptyLines, LineLength
|
6
|
+
|
7
|
+
describe RubyToBlock::Block, 'ハードウェアジャンル', to_blocks: true do
|
8
|
+
parts = <<-EOS
|
9
|
+
require "smalruby"
|
10
|
+
|
11
|
+
init_hardware
|
12
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
13
|
+
|
14
|
+
car1.on(:start) do
|
15
|
+
led("D4").on
|
16
|
+
rgb_led_cathode("D9").on(color: [255, 0, 0])
|
17
|
+
two_wheel_drive_car("D2").forward
|
18
|
+
end
|
19
|
+
car1.led("D4").off
|
20
|
+
car1.rgb_led_cathode("D9").off
|
21
|
+
car1.two_wheel_drive_car("D2").backward
|
22
|
+
|
23
|
+
car1.on(:sensor_change, "A0") do
|
24
|
+
if sensor("A0").value < 200
|
25
|
+
two_wheel_drive_car("D2").turn_left
|
26
|
+
two_wheel_drive_car("D2").turn_right
|
27
|
+
two_wheel_drive_car("D2").stop
|
28
|
+
end
|
29
|
+
end
|
30
|
+
EOS
|
31
|
+
describe compact_source_code(parts) do
|
32
|
+
_parts = parts
|
33
|
+
let(:data) { _parts }
|
34
|
+
|
35
|
+
it '結果が正しいこと' do
|
36
|
+
should eq_block_xml(<<-XML)
|
37
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
38
|
+
<block type="hardware_init_hardware" />
|
39
|
+
<block type="character_new">
|
40
|
+
<field name="NAME">car1</field>
|
41
|
+
<statement name="DO">
|
42
|
+
<block type="events_on_start">
|
43
|
+
<statement name="DO">
|
44
|
+
<block type="hardware_led_on">
|
45
|
+
<field name="PIN">D4</field>
|
46
|
+
<next>
|
47
|
+
<block type="hardware_rgb_led_on">
|
48
|
+
<field name="AC">cathode</field>
|
49
|
+
<field name="PIN">D9</field>
|
50
|
+
<field name="COLOUR">#ff0000</field>
|
51
|
+
<next>
|
52
|
+
<block type="hardware_two_wheel_drive_car_forward">
|
53
|
+
<field name="PIN">D2</field>
|
54
|
+
</block>
|
55
|
+
</next>
|
56
|
+
</block>
|
57
|
+
</next>
|
58
|
+
</block>
|
59
|
+
</statement>
|
60
|
+
<next>
|
61
|
+
<block type="hardware_led_off">
|
62
|
+
<field name="PIN">D4</field>
|
63
|
+
<next>
|
64
|
+
<block type="hardware_rgb_led_off">
|
65
|
+
<field name="AC">cathode</field>
|
66
|
+
<field name="PIN">D9</field>
|
67
|
+
<next>
|
68
|
+
<block type="hardware_two_wheel_drive_car_backward">
|
69
|
+
<field name="PIN">D2</field>
|
70
|
+
<next>
|
71
|
+
<block type="hardware_on_sensor_change">
|
72
|
+
<field name="PIN">A0</field>
|
73
|
+
<statement name="DO">
|
74
|
+
<block type="control_if" inline="true">
|
75
|
+
<value name="COND">
|
76
|
+
<block type="operators_compare_lt" inline="true">
|
77
|
+
<value name="A">
|
78
|
+
<block type="hardware_sensor_value">
|
79
|
+
<field name="PIN">A0</field>
|
80
|
+
</block>
|
81
|
+
</value>
|
82
|
+
<value name="B">
|
83
|
+
<block type="math_number">
|
84
|
+
<field name="NUM">200</field>
|
85
|
+
</block>
|
86
|
+
</value>
|
87
|
+
</block>
|
88
|
+
</value>
|
89
|
+
<statement name="THEN">
|
90
|
+
<block type="hardware_two_wheel_drive_car_turn_left">
|
91
|
+
<field name="PIN">D2</field>
|
92
|
+
<next>
|
93
|
+
<block type="hardware_two_wheel_drive_car_turn_right">
|
94
|
+
<field name="PIN">D2</field>
|
95
|
+
<next>
|
96
|
+
<block type="hardware_two_wheel_drive_car_stop">
|
97
|
+
<field name="PIN">D2</field>
|
98
|
+
</block>
|
99
|
+
</next>
|
100
|
+
</block>
|
101
|
+
</next>
|
102
|
+
</block>
|
103
|
+
</statement>
|
104
|
+
</block>
|
105
|
+
</statement>
|
106
|
+
</block>
|
107
|
+
</next>
|
108
|
+
</block>
|
109
|
+
</next>
|
110
|
+
</block>
|
111
|
+
</next>
|
112
|
+
</block>
|
113
|
+
</next>
|
114
|
+
</block>
|
115
|
+
</statement>
|
116
|
+
</block>
|
117
|
+
XML
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|