smalruby-editor 0.1.20 → 0.1.21
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 +4 -4
- data/.gitignore +0 -1
- data/app/assets/javascripts/blocks/character.js.coffee.erb +3 -10
- data/app/assets/javascripts/blocks/control.js.coffee.erb +2 -1
- data/app/assets/javascripts/blocks/data.js.coffee.erb +2 -1
- data/app/assets/javascripts/blocks/etc.js.coffee.erb +2 -1
- data/app/assets/javascripts/blocks/events.js.coffee.erb +5 -4
- data/app/assets/javascripts/blocks/field_character.js.coffee.erb +9 -0
- data/app/assets/javascripts/blocks/hardware.js.coffee.erb +171 -54
- data/app/assets/javascripts/blocks/looks.js.coffee.erb +2 -1
- data/app/assets/javascripts/blocks/motion.js.coffee.erb +4 -16
- data/app/assets/javascripts/blocks/operators.js.coffee.erb +2 -1
- data/app/assets/javascripts/blocks/pen.js.coffee.erb +2 -1
- data/app/assets/javascripts/blocks/ruby.js.coffee.erb +2 -1
- data/app/assets/javascripts/blocks/sensing.js.coffee.erb +25 -3
- data/app/assets/javascripts/blocks/sound.js.coffee.erb +2 -1
- data/app/assets/javascripts/generators/ruby.js.coffee.erb +27 -5
- data/app/assets/javascripts/models/source_code.js.coffee +20 -7
- data/app/assets/javascripts/views/main_menu_view.js.coffee +5 -7
- data/app/assets/stylesheets/editor.css.scss +5 -1
- data/app/assets/stylesheets/toolbox.css.scss.erb +29 -24
- data/app/controllers/source_codes_controller.rb +7 -36
- data/app/helpers/editor_helper.rb +9 -0
- data/app/models/concerns/ruby_to_block/block/hardware_button_down_or_up.rb +25 -0
- data/app/models/concerns/ruby_to_block/block/hardware_button_not_use_pullup.rb +18 -0
- data/app/models/concerns/ruby_to_block/block/hardware_motor_driver.rb +22 -0
- data/app/models/concerns/ruby_to_block/block/hardware_motor_driver_set_speed.rb +20 -0
- data/app/models/concerns/ruby_to_block/block/hardware_motor_driver_speed.rb +24 -0
- data/app/models/concerns/ruby_to_block/block/hardware_on_button_down_or_up.rb +19 -0
- data/app/models/concerns/ruby_to_block/block/hardware_operation.rb +15 -0
- data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_set_speed.rb +22 -0
- data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_speed.rb +26 -0
- data/app/models/concerns/ruby_to_block/block/ruby_p.rb +19 -0
- data/app/models/concerns/ruby_to_block/block/{motion_reach_wall.rb → sensing_reach_wall.rb} +1 -1
- data/app/models/concerns/ruby_to_block/block/text.rb +3 -2
- data/app/models/source_code.rb +20 -0
- data/app/views/editor/_toolbox.html.haml +84 -63
- data/app/views/editor/index.html.haml +1 -1
- data/demos/adjust_2wd_car.rb.xml +179 -0
- data/demos/car_chase.rb.xml +129 -126
- data/demos/hardware_led.rb.xml +7 -4
- data/demos/pong.rb.xml +17 -14
- data/demos/star.rb.xml +115 -112
- data/lib/smalruby_editor.rb +16 -0
- data/lib/smalruby_editor/version.rb +3 -3
- data/public/assets/{application-c8991557a0789ac1bc9220f409e7f1c1.js → application-734570836cdba680c1568220a51af40f.js} +216 -86
- data/public/assets/{application-c8991557a0789ac1bc9220f409e7f1c1.js.gz → application-734570836cdba680c1568220a51af40f.js.gz} +0 -0
- data/public/assets/{application-d4fe6c0f970efe8eab9267fd08718d96.css → application-898cb749439fba4ce44cffeac1216201.css} +37 -9
- data/public/assets/{application-d4fe6c0f970efe8eab9267fd08718d96.css.gz → application-898cb749439fba4ce44cffeac1216201.css.gz} +0 -0
- data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
- data/smalruby-editor.gemspec +2 -1
- data/spec/acceptance/block_mode/blocks/events/on_hit.feature +2 -0
- data/spec/acceptance/block_mode/blocks/hardware/button_down_or_up.feature +79 -0
- data/spec/acceptance/block_mode/blocks/hardware/button_not_use_pullup.feature +61 -0
- data/spec/acceptance/block_mode/blocks/hardware/motor_driver.feature +73 -0
- data/spec/acceptance/block_mode/blocks/hardware/motor_driver_speed.feature +93 -0
- data/spec/acceptance/block_mode/blocks/hardware/on_button_down_or_up.feature +87 -0
- data/spec/acceptance/block_mode/blocks/hardware/two_wheel_drive_car_speed.feature +111 -0
- data/spec/acceptance/block_mode/blocks/motion/reach_wall.feature +1 -1
- data/spec/acceptance/block_mode/blocks/operators/text.feature +38 -0
- data/spec/acceptance/block_mode/blocks/sensing/hit.feature +98 -52
- data/spec/acceptance/block_mode/blocks/sensing/reach_wall.feature +98 -0
- data/spec/acceptance/block_mode/demo.feature +3 -1
- data/spec/acceptance/standalone/save.feature +51 -0
- data/spec/helpers/editor_helper_spec.rb +20 -0
- data/spec/javascripts/models/source_code_spec.coffee +40 -0
- data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +269 -0
- data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +1 -1
- data/spec/models/concerns/ruby_to_block/block/{motion_reach_wall_spec.rb → sensing_reach_wall_spec.rb} +2 -2
- data/spec/models/concerns/ruby_to_block/block/text_spec.rb +39 -0
- data/spec/models/concerns/ruby_to_block_spec.rb +2 -2
- data/spec/models/source_code_spec.rb +53 -0
- data/spec/steps/base_steps.rb +5 -0
- metadata +56 -12
- data/demos/rgb_led_anode.rb.xml +0 -83
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
require "smalruby"
|
|
13
13
|
|
|
14
14
|
car1 = Character.new(costume: "car2.png", x: 0, y: 0, angle: 0)
|
|
15
|
-
car2 = Character.new(costume: "
|
|
15
|
+
car2 = Character.new(costume: "car4.png", x: 0, y: 415, angle: 0)
|
|
16
|
+
# 車のおいかけっこ
|
|
17
|
+
|
|
16
18
|
# 逃げる車
|
|
17
19
|
|
|
18
20
|
car1.on(:start) do
|
|
@@ -43,3 +43,54 @@
|
|
|
43
43
|
ならば 確認メッセージ "前に01.rbという名前でセーブしているけど本当にセーブしますか?\nセーブすると前に作成したプログラムは消えてしまうよ!" を表示すること
|
|
44
44
|
かつ "メッセージ" に "セーブをキャンセルしました" を含むこと
|
|
45
45
|
かつ ホームディレクトリの "01.rb" の内容が "puts 'Hello, World!'" であること
|
|
46
|
+
|
|
47
|
+
シナリオテンプレート: ブロックモードでセーブボタンを押してローカルマシンにプログラムを保存できる
|
|
48
|
+
前提 "ブロック" タブを表示する
|
|
49
|
+
かつ 次のキャラクターを追加する:
|
|
50
|
+
| name | costumes | x | y | angle |
|
|
51
|
+
| car1 | car4.png | 300 | 200 | 90 |
|
|
52
|
+
かつ 次のブロックを配置する:
|
|
53
|
+
"""
|
|
54
|
+
%block{:type => "character_new", :x => "0", :y => "0"}
|
|
55
|
+
%field{:name => "NAME"}<
|
|
56
|
+
car1
|
|
57
|
+
%statement{:name => "DO"}
|
|
58
|
+
%block{:type => "motion_move", :x => "0", :y => "0"}
|
|
59
|
+
%value{:name => "STEP"}
|
|
60
|
+
%block{:type => "math_number"}
|
|
61
|
+
%field{:name => "NUM"}<
|
|
62
|
+
10
|
|
63
|
+
"""
|
|
64
|
+
かつ プログラムの名前に "<プログラムの名前>" を指定する
|
|
65
|
+
|
|
66
|
+
もし サブメニューの "セーブボタン" をクリックする
|
|
67
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
|
68
|
+
|
|
69
|
+
ならば "メッセージ" に "セーブしました" を含むこと
|
|
70
|
+
かつ ホームディレクトリに "<保存したファイルの名前>" が存在すること
|
|
71
|
+
かつ ホームディレクトリの "<保存したファイルの名前>" が次の内容であること:
|
|
72
|
+
"""
|
|
73
|
+
<xml>
|
|
74
|
+
<character x="300" y="200" name="car1" costumes="car4.png" angle="90"></character>
|
|
75
|
+
<block type="character_new" x="0" y="0">
|
|
76
|
+
<field name="NAME">car1</field>
|
|
77
|
+
<statement name="DO">
|
|
78
|
+
<block type="motion_move" inline="true">
|
|
79
|
+
<value name="STEP">
|
|
80
|
+
<block type="math_number">
|
|
81
|
+
<field name="NUM">10</field>
|
|
82
|
+
</block>
|
|
83
|
+
</value>
|
|
84
|
+
</block>
|
|
85
|
+
</statement>
|
|
86
|
+
</block>
|
|
87
|
+
</xml>
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
例:
|
|
91
|
+
| プログラムの名前 | 保存したファイルの名前 |
|
|
92
|
+
| 01.rb | 01.rb.xml |
|
|
93
|
+
| 01.xml | 01.rb.xml |
|
|
94
|
+
| 01.rb.xml | 01.rb.xml |
|
|
95
|
+
| 01 | 01.rb.xml |
|
|
96
|
+
|
|
@@ -47,6 +47,26 @@ describe EditorHelper do
|
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
describe '#toolbox_pin_field' do
|
|
51
|
+
subject { toolbox_pin_field(value, name) }
|
|
52
|
+
|
|
53
|
+
let(:name) { 'PIN' }
|
|
54
|
+
let(:value) { 'D5' }
|
|
55
|
+
|
|
56
|
+
it { should be_html_safe }
|
|
57
|
+
it { should include(%(<field name="#{h name}">#{h value}</field>)) }
|
|
58
|
+
|
|
59
|
+
context '名前にタグを含む場合', name_include_html: true do
|
|
60
|
+
it { should include(%(<field name="#{h name}">#{h value}</field>)) }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context '名前を省略した場合' do
|
|
64
|
+
subject { toolbox_pin_field(value) }
|
|
65
|
+
|
|
66
|
+
it { should include(%(<field name="PIN">#{h value}</field>)) }
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
50
70
|
describe '#toolbox_number_value' do
|
|
51
71
|
subject { toolbox_number_value(name, value) }
|
|
52
72
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
describe 'Smalruby.SourceCode', ->
|
|
2
|
+
klass = Smalruby.SourceCode
|
|
3
|
+
self = null
|
|
4
|
+
|
|
5
|
+
describe '#getRbxmlFilename', ->
|
|
6
|
+
describe 'filenameが01.rbのとき', ->
|
|
7
|
+
beforeEach ->
|
|
8
|
+
self = new klass
|
|
9
|
+
filename: '01.rb'
|
|
10
|
+
data: 'puts "Hello, World!"'
|
|
11
|
+
|
|
12
|
+
it '01.rb.xmlを返すこと', ->
|
|
13
|
+
expect(self.getRbxmlFilename()).to.equal('01.rb.xml')
|
|
14
|
+
|
|
15
|
+
describe 'filenameが01のとき', ->
|
|
16
|
+
beforeEach ->
|
|
17
|
+
self = new klass
|
|
18
|
+
filename: '01'
|
|
19
|
+
data: 'puts "Hello, World!"'
|
|
20
|
+
|
|
21
|
+
it '01.rb.xmlを返すこと', ->
|
|
22
|
+
expect(self.getRbxmlFilename()).to.equal('01.rb.xml')
|
|
23
|
+
|
|
24
|
+
describe 'filenameが01.xmlのとき', ->
|
|
25
|
+
beforeEach ->
|
|
26
|
+
self = new klass
|
|
27
|
+
filename: '01.xml'
|
|
28
|
+
data: 'puts "Hello, World!"'
|
|
29
|
+
|
|
30
|
+
it '01.rb.xmlを返すこと', ->
|
|
31
|
+
expect(self.getRbxmlFilename()).to.equal('01.rb.xml')
|
|
32
|
+
|
|
33
|
+
describe 'filenameが01.rb.xmlのとき', ->
|
|
34
|
+
beforeEach ->
|
|
35
|
+
self = new klass
|
|
36
|
+
filename: '01.rb.xml'
|
|
37
|
+
data: 'puts "Hello, World!"'
|
|
38
|
+
|
|
39
|
+
it '01.rb.xmlを返すこと', ->
|
|
40
|
+
expect(self.getRbxmlFilename()).to.equal('01.rb.xml')
|
|
@@ -197,4 +197,273 @@ end
|
|
|
197
197
|
XML
|
|
198
198
|
end
|
|
199
199
|
end
|
|
200
|
+
|
|
201
|
+
parts = <<-EOS
|
|
202
|
+
require "smalruby"
|
|
203
|
+
|
|
204
|
+
init_hardware
|
|
205
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
|
206
|
+
|
|
207
|
+
car1.on(:start) do
|
|
208
|
+
motor_driver("D3").speed = 50
|
|
209
|
+
p(motor_driver("D3").speed)
|
|
210
|
+
motor_driver("D3").forward
|
|
211
|
+
motor_driver("D3").backward
|
|
212
|
+
end
|
|
213
|
+
car1.motor_driver("D3").speed = 50
|
|
214
|
+
p(car1.motor_driver("D3").speed)
|
|
215
|
+
car1.motor_driver("D3").stop
|
|
216
|
+
EOS
|
|
217
|
+
describe compact_source_code(parts) do
|
|
218
|
+
_parts = parts
|
|
219
|
+
let(:data) { _parts }
|
|
220
|
+
|
|
221
|
+
it '結果が正しいこと' do
|
|
222
|
+
should eq_block_xml(<<-XML)
|
|
223
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
|
224
|
+
<block type="hardware_init_hardware" />
|
|
225
|
+
<block type="character_new">
|
|
226
|
+
<field name="NAME">car1</field>
|
|
227
|
+
<statement name="DO">
|
|
228
|
+
<block type="events_on_start">
|
|
229
|
+
<statement name="DO">
|
|
230
|
+
<block type="hardware_motor_driver_set_speed" inline="true">
|
|
231
|
+
<field name="PIN">D3</field>
|
|
232
|
+
<value name="SPEED">
|
|
233
|
+
<block type="math_number">
|
|
234
|
+
<field name="NUM">50</field>
|
|
235
|
+
</block>
|
|
236
|
+
</value>
|
|
237
|
+
<next>
|
|
238
|
+
<block type="ruby_p" inline="true">
|
|
239
|
+
<value name="ARG">
|
|
240
|
+
<block type="hardware_motor_driver_speed">
|
|
241
|
+
<field name="PIN">D3</field>
|
|
242
|
+
</block>
|
|
243
|
+
</value>
|
|
244
|
+
<next>
|
|
245
|
+
<block type="hardware_motor_driver">
|
|
246
|
+
<field name="PIN">D3</field>
|
|
247
|
+
<field name="METHOD">forward</field>
|
|
248
|
+
<next>
|
|
249
|
+
<block type="hardware_motor_driver">
|
|
250
|
+
<field name="PIN">D3</field>
|
|
251
|
+
<field name="METHOD">backward</field>
|
|
252
|
+
</block>
|
|
253
|
+
</next>
|
|
254
|
+
</block>
|
|
255
|
+
</next>
|
|
256
|
+
</block>
|
|
257
|
+
</next>
|
|
258
|
+
</block>
|
|
259
|
+
</statement>
|
|
260
|
+
<next>
|
|
261
|
+
<block type="hardware_motor_driver_set_speed" inline="true">
|
|
262
|
+
<field name="PIN">D3</field>
|
|
263
|
+
<value name="SPEED">
|
|
264
|
+
<block type="math_number">
|
|
265
|
+
<field name="NUM">50</field>
|
|
266
|
+
</block>
|
|
267
|
+
</value>
|
|
268
|
+
<next>
|
|
269
|
+
<block type="ruby_p" inline="true">
|
|
270
|
+
<value name="ARG">
|
|
271
|
+
<block type="hardware_motor_driver_speed">
|
|
272
|
+
<field name="PIN">D3</field>
|
|
273
|
+
</block>
|
|
274
|
+
</value>
|
|
275
|
+
<next>
|
|
276
|
+
<block type="hardware_motor_driver">
|
|
277
|
+
<field name="PIN">D3</field>
|
|
278
|
+
<field name="METHOD">stop</field>
|
|
279
|
+
</block>
|
|
280
|
+
</next>
|
|
281
|
+
</block>
|
|
282
|
+
</next>
|
|
283
|
+
</block>
|
|
284
|
+
</next>
|
|
285
|
+
</block>
|
|
286
|
+
</statement>
|
|
287
|
+
</block>
|
|
288
|
+
XML
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
parts = <<-EOS
|
|
293
|
+
require "smalruby"
|
|
294
|
+
|
|
295
|
+
init_hardware
|
|
296
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
|
297
|
+
|
|
298
|
+
car1.on(:start) do
|
|
299
|
+
two_wheel_drive_car("D5").left_speed = 50
|
|
300
|
+
p(two_wheel_drive_car("D5").left_speed)
|
|
301
|
+
two_wheel_drive_car("D5").forward
|
|
302
|
+
two_wheel_drive_car("D5").backward
|
|
303
|
+
end
|
|
304
|
+
car1.two_wheel_drive_car("D5").right_speed = 50
|
|
305
|
+
p(car1.two_wheel_drive_car("D5").right_speed)
|
|
306
|
+
car1.two_wheel_drive_car("D5").stop
|
|
307
|
+
EOS
|
|
308
|
+
describe compact_source_code(parts) do
|
|
309
|
+
_parts = parts
|
|
310
|
+
let(:data) { _parts }
|
|
311
|
+
|
|
312
|
+
it '結果が正しいこと' do
|
|
313
|
+
should eq_block_xml(<<-XML)
|
|
314
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
|
315
|
+
<block type="hardware_init_hardware" />
|
|
316
|
+
<block type="character_new">
|
|
317
|
+
<field name="NAME">car1</field>
|
|
318
|
+
<statement name="DO">
|
|
319
|
+
<block type="events_on_start">
|
|
320
|
+
<statement name="DO">
|
|
321
|
+
<block type="hardware_two_wheel_drive_car_set_speed" inline="true">
|
|
322
|
+
<field name="PIN">D5</field>
|
|
323
|
+
<field name="LOR">left</field>
|
|
324
|
+
<value name="SPEED">
|
|
325
|
+
<block type="math_number">
|
|
326
|
+
<field name="NUM">50</field>
|
|
327
|
+
</block>
|
|
328
|
+
</value>
|
|
329
|
+
<next>
|
|
330
|
+
<block type="ruby_p" inline="true">
|
|
331
|
+
<value name="ARG">
|
|
332
|
+
<block type="hardware_two_wheel_drive_car_speed">
|
|
333
|
+
<field name="PIN">D5</field>
|
|
334
|
+
<field name="LOR">left</field>
|
|
335
|
+
</block>
|
|
336
|
+
</value>
|
|
337
|
+
<next>
|
|
338
|
+
<block type="hardware_two_wheel_drive_car_forward">
|
|
339
|
+
<field name="PIN">D5</field>
|
|
340
|
+
<next>
|
|
341
|
+
<block type="hardware_two_wheel_drive_car_backward">
|
|
342
|
+
<field name="PIN">D5</field>
|
|
343
|
+
</block>
|
|
344
|
+
</next>
|
|
345
|
+
</block>
|
|
346
|
+
</next>
|
|
347
|
+
</block>
|
|
348
|
+
</next>
|
|
349
|
+
</block>
|
|
350
|
+
</statement>
|
|
351
|
+
<next>
|
|
352
|
+
<block type="hardware_two_wheel_drive_car_set_speed" inline="true">
|
|
353
|
+
<field name="PIN">D5</field>
|
|
354
|
+
<field name="LOR">right</field>
|
|
355
|
+
<value name="SPEED">
|
|
356
|
+
<block type="math_number">
|
|
357
|
+
<field name="NUM">50</field>
|
|
358
|
+
</block>
|
|
359
|
+
</value>
|
|
360
|
+
<next>
|
|
361
|
+
<block type="ruby_p" inline="true">
|
|
362
|
+
<value name="ARG">
|
|
363
|
+
<block type="hardware_two_wheel_drive_car_speed">
|
|
364
|
+
<field name="PIN">D5</field>
|
|
365
|
+
<field name="LOR">right</field>
|
|
366
|
+
</block>
|
|
367
|
+
</value>
|
|
368
|
+
<next>
|
|
369
|
+
<block type="hardware_two_wheel_drive_car_stop">
|
|
370
|
+
<field name="PIN">D5</field>
|
|
371
|
+
</block>
|
|
372
|
+
</next>
|
|
373
|
+
</block>
|
|
374
|
+
</next>
|
|
375
|
+
</block>
|
|
376
|
+
</next>
|
|
377
|
+
</block>
|
|
378
|
+
</statement>
|
|
379
|
+
</block>
|
|
380
|
+
XML
|
|
381
|
+
end
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
parts = <<-EOS
|
|
385
|
+
require "smalruby"
|
|
386
|
+
|
|
387
|
+
init_hardware
|
|
388
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
|
389
|
+
|
|
390
|
+
car1.on(:button_down, "D3") do
|
|
391
|
+
p(button("D3").up?)
|
|
392
|
+
p(button("D3").down?)
|
|
393
|
+
button("D3").not_use_pullup
|
|
394
|
+
end
|
|
395
|
+
p(car1.button("D3").up?)
|
|
396
|
+
p(car1.button("D3").down?)
|
|
397
|
+
car1.button("D3").not_use_pullup
|
|
398
|
+
EOS
|
|
399
|
+
describe compact_source_code(parts) do
|
|
400
|
+
_parts = parts
|
|
401
|
+
let(:data) { _parts }
|
|
402
|
+
|
|
403
|
+
it '結果が正しいこと' do
|
|
404
|
+
should eq_block_xml(<<-XML)
|
|
405
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
|
406
|
+
<block type="hardware_init_hardware" />
|
|
407
|
+
<block type="character_new">
|
|
408
|
+
<field name="NAME">car1</field>
|
|
409
|
+
<statement name="DO">
|
|
410
|
+
<block type="hardware_on_button_down_or_up">
|
|
411
|
+
<field name="PIN">D3</field>
|
|
412
|
+
<field name="DOU">down</field>
|
|
413
|
+
<statement name="DO">
|
|
414
|
+
<block type="ruby_p" inline="true">
|
|
415
|
+
<value name="ARG">
|
|
416
|
+
<block type="hardware_button_down_or_up">
|
|
417
|
+
<field name="PIN">D3</field>
|
|
418
|
+
<field name="DOU">up</field>
|
|
419
|
+
</block>
|
|
420
|
+
</value>
|
|
421
|
+
<next>
|
|
422
|
+
<block type="ruby_p" inline="true">
|
|
423
|
+
<value name="ARG">
|
|
424
|
+
<block type="hardware_button_down_or_up">
|
|
425
|
+
<field name="PIN">D3</field>
|
|
426
|
+
<field name="DOU">down</field>
|
|
427
|
+
</block>
|
|
428
|
+
</value>
|
|
429
|
+
<next>
|
|
430
|
+
<block type="hardware_button_not_use_pullup">
|
|
431
|
+
<field name="PIN">D3</field>
|
|
432
|
+
</block>
|
|
433
|
+
</next>
|
|
434
|
+
</block>
|
|
435
|
+
</next>
|
|
436
|
+
</block>
|
|
437
|
+
</statement>
|
|
438
|
+
<next>
|
|
439
|
+
<block type="ruby_p" inline="true">
|
|
440
|
+
<value name="ARG">
|
|
441
|
+
<block type="hardware_button_down_or_up">
|
|
442
|
+
<field name="PIN">D3</field>
|
|
443
|
+
<field name="DOU">up</field>
|
|
444
|
+
</block>
|
|
445
|
+
</value>
|
|
446
|
+
<next>
|
|
447
|
+
<block type="ruby_p" inline="true">
|
|
448
|
+
<value name="ARG">
|
|
449
|
+
<block type="hardware_button_down_or_up">
|
|
450
|
+
<field name="PIN">D3</field>
|
|
451
|
+
<field name="DOU">down</field>
|
|
452
|
+
</block>
|
|
453
|
+
</value>
|
|
454
|
+
<next>
|
|
455
|
+
<block type="hardware_button_not_use_pullup">
|
|
456
|
+
<field name="PIN">D3</field>
|
|
457
|
+
</block>
|
|
458
|
+
</next>
|
|
459
|
+
</block>
|
|
460
|
+
</next>
|
|
461
|
+
</block>
|
|
462
|
+
</next>
|
|
463
|
+
</block>
|
|
464
|
+
</statement>
|
|
465
|
+
</block>
|
|
466
|
+
XML
|
|
467
|
+
end
|
|
468
|
+
end
|
|
200
469
|
end
|
|
@@ -276,7 +276,7 @@ car1.point_towards(car1)
|
|
|
276
276
|
<next>
|
|
277
277
|
<block type="control_if" inline="true">
|
|
278
278
|
<value name="COND">
|
|
279
|
-
<block type="
|
|
279
|
+
<block type="sensing_reach_wall" />
|
|
280
280
|
</value>
|
|
281
281
|
<statement name="THEN">
|
|
282
282
|
<block type="motion_turn" />
|
|
@@ -4,7 +4,7 @@ require_relative 'shared/block_examples'
|
|
|
4
4
|
|
|
5
5
|
# rubocop:disable EmptyLines, LineLength
|
|
6
6
|
|
|
7
|
-
describe RubyToBlock::Block::
|
|
7
|
+
describe RubyToBlock::Block::SensingReachWall, to_blocks: true do
|
|
8
8
|
parts = <<-EOS
|
|
9
9
|
if reach_wall?
|
|
10
10
|
|
|
@@ -18,7 +18,7 @@ end
|
|
|
18
18
|
should eq_block_xml(<<-XML)
|
|
19
19
|
<block type="control_if" inline="true">
|
|
20
20
|
<value name="COND">
|
|
21
|
-
<block type="
|
|
21
|
+
<block type="sensing_reach_wall" />
|
|
22
22
|
</value>
|
|
23
23
|
</block>
|
|
24
24
|
XML
|
|
@@ -0,0 +1,39 @@
|
|
|
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::Text, to_blocks: true do
|
|
8
|
+
parts = <<-EOS
|
|
9
|
+
require "smalruby"
|
|
10
|
+
|
|
11
|
+
p("こんにちは")
|
|
12
|
+
p("\\"\\"")
|
|
13
|
+
EOS
|
|
14
|
+
describe compact_source_code(parts) do
|
|
15
|
+
_parts = parts
|
|
16
|
+
let(:data) { _parts }
|
|
17
|
+
|
|
18
|
+
it '結果が正しいこと' do
|
|
19
|
+
should eq_block_xml(<<-XML)
|
|
20
|
+
<block type="ruby_p" inline="true">
|
|
21
|
+
<value name="ARG">
|
|
22
|
+
<block type="text">
|
|
23
|
+
<field name="TEXT">こんにちは</field>
|
|
24
|
+
</block>
|
|
25
|
+
</value>
|
|
26
|
+
<next>
|
|
27
|
+
<block type="ruby_p" inline="true">
|
|
28
|
+
<value name="ARG">
|
|
29
|
+
<block type="text">
|
|
30
|
+
<field name="TEXT">""</field>
|
|
31
|
+
</block>
|
|
32
|
+
</value>
|
|
33
|
+
</block>
|
|
34
|
+
</next>
|
|
35
|
+
</block>
|
|
36
|
+
XML
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|