smalruby-editor 0.1.5-x86-mingw32 → 0.1.6-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of smalruby-editor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rubocop.yml +8 -0
- data/README.rdoc +3 -0
- data/app/assets/javascripts/application.js +0 -1
- data/app/assets/javascripts/models/source_code.js.coffee +5 -2
- data/app/assets/javascripts/smalruby.js.coffee +18 -11
- data/app/assets/javascripts/views/main_menu_view.js.coffee +139 -81
- data/app/controllers/source_codes_controller.rb +7 -0
- data/app/models/concerns/ruby_to_block.rb +391 -0
- data/app/models/source_code.rb +3 -2
- data/app/views/editor/demo.html.erb +1 -1
- data/app/views/editor/index.html.haml +2 -2
- data/config/routes.rb +1 -0
- data/{app/assets/demos → demos}/default.xml +0 -0
- data/{app/assets/demos → demos}/rgb_led_anode.xml +82 -82
- data/lib/smalruby_editor/version.rb +3 -3
- data/lib/tasks/release.rake +0 -4
- data/public/assets/{application-0047adbc0fb7a529ef7a41b5e0e7d097.js → application-8bfffad1222d4e198f3c7ccc1cbd774f.js} +179 -144
- data/public/assets/{application-0047adbc0fb7a529ef7a41b5e0e7d097.js.gz → application-8bfffad1222d4e198f3c7ccc1cbd774f.js.gz} +0 -0
- data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
- data/smalruby-editor.gemspec +0 -6
- data/spec/acceptance/base.feature +119 -0
- data/spec/acceptance/block_mode/translate.feature +14 -0
- data/spec/acceptance/ruby_mode/translate.feature +65 -0
- data/spec/acceptance/standalone/run.feature +14 -1
- data/spec/controllers/source_codes_controller_spec.rb +22 -0
- data/{public/assets/default-5d1886100d7c8961e9962bbc4bb0c714.xml → spec/fixtures/files/01.rb.xml} +0 -0
- data/spec/models/concerns/ruby_to_block_spec.rb +329 -0
- data/spec/steps/base_steps.rb +230 -0
- data/spec/steps/block_mode_steps.rb +9 -1
- data/spec/steps/fix_turnip.rb +28 -0
- data/spec/steps/text_editor_steps.rb +52 -193
- metadata +19 -97
- data/app/assets/javascripts/ruby_mode.js.coffee.erb +0 -12
- data/public/assets/rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml +0 -83
- data/spec/acceptance/ruby_mode/base.feature +0 -33
- data/spec/steps/ace_steps.rb +0 -77
Binary file
|
@@ -1 +1 @@
|
|
1
|
-
{"files":{"default-5d1886100d7c8961e9962bbc4bb0c714.xml":{"logical_path":"default.xml","mtime":"2014-02-14T01:28:48+09:00","size":5017,"digest":"5d1886100d7c8961e9962bbc4bb0c714"},"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml":{"logical_path":"rgb_led_anode.xml","mtime":"2014-02-11T14:17:03+09:00","size":3805,"digest":"91225bef2a8b97f1cefee862a0619b91"},"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico":{"logical_path":"favicon.ico","mtime":"2014-01-21T03:18:02+09:00","size":5430,"digest":"a37c90b368fd8ed436cb8f9e9396465c"},"application-735e172a0df828da16d22f5d3c26671f.js":{"logical_path":"application.js","mtime":"2014-02-19T18:22:09+09:00","size":1440213,"digest":"735e172a0df828da16d22f5d3c26671f"},"application-64a390efe879c386a5950515064f062d.css":{"logical_path":"application.css","mtime":"2014-02-19T14:32:55+09:00","size":119186,"digest":"64a390efe879c386a5950515064f062d"},"jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif":{"logical_path":"jquery-ui/animated-overlay.gif","mtime":"2014-02-04T09:35:48+09:00","size":1738,"digest":"c48c87b7a95316f4698484e3b85ee4aa"},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":180,"digest":"58b63faadd031ca3db096dfdffd90224"},"jquery-ui/ui-bg_flat_75_ffffff_40x100-937399e8b369d64aa075d13a82c00112.png":{"logical_path":"jquery-ui/ui-bg_flat_75_ffffff_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":178,"digest":"937399e8b369d64aa075d13a82c00112"},"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-a8c503e0f42a081a92a473b0d30ac6cf.png":{"logical_path":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":120,"digest":"a8c503e0f42a081a92a473b0d30ac6cf"},"jquery-ui/ui-bg_glass_65_ffffff_1x400-ddcbfe385abc3947937caa0b44e2f5d2.png":{"logical_path":"jquery-ui/ui-bg_glass_65_ffffff_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":105,"digest":"ddcbfe385abc3947937caa0b44e2f5d2"},"jquery-ui/ui-bg_glass_75_dadada_1x400-14dd4a9ad1f21d8c4c7e673ddfb0806f.png":{"logical_path":"jquery-ui/ui-bg_glass_75_dadada_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":111,"digest":"14dd4a9ad1f21d8c4c7e673ddfb0806f"},"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-a43dfabb23b0a987b567b282bad68346.png":{"logical_path":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":110,"digest":"a43dfabb23b0a987b567b282bad68346"},"jquery-ui/ui-bg_glass_95_fef1ec_1x400-31c0c791a756266043ee8ea61dacb36a.png":{"logical_path":"jquery-ui/ui-bg_glass_95_fef1ec_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":119,"digest":"31c0c791a756266043ee8ea61dacb36a"},"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-33edbdb0d2fcebd2a65c2041a28533da.png":{"logical_path":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png","mtime":"2014-02-04T09:35:48+09:00","size":101,"digest":"33edbdb0d2fcebd2a65c2041a28533da"},"jquery-ui/ui-icons_222222_256x240-890385424135de1513f00cbecfb7f990.png":{"logical_path":"jquery-ui/ui-icons_222222_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"890385424135de1513f00cbecfb7f990"},"jquery-ui/ui-icons_2e83ff_256x240-824705ca4aa2610434a358fe4018c9c6.png":{"logical_path":"jquery-ui/ui-icons_2e83ff_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"824705ca4aa2610434a358fe4018c9c6"},"jquery-ui/ui-icons_454545_256x240-254e054f6df453dfac49efbc8b78f79d.png":{"logical_path":"jquery-ui/ui-icons_454545_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"254e054f6df453dfac49efbc8b78f79d"},"jquery-ui/ui-icons_888888_256x240-57c441f87c4289a5372823f506c1182d.png":{"logical_path":"jquery-ui/ui-icons_888888_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"57c441f87c4289a5372823f506c1182d"},"jquery-ui/ui-icons_cd0a0a_256x240-261647ac915575f3981ded254ae8d43e.png":{"logical_path":"jquery-ui/ui-icons_cd0a0a_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"261647ac915575f3981ded254ae8d43e"},"loading-e8e6dd7833131c92a6c3b9c8ccc6a6ac.gif":{"logical_path":"loading.gif","mtime":"2014-01-03T14:44:55+09:00","size":3897,"digest":"e8e6dd7833131c92a6c3b9c8ccc6a6ac"},"progressbar-82023a146fba2a0f6d925629ed2b09c5.gif":{"logical_path":"progressbar.gif","mtime":"2014-01-03T14:44:55+09:00","size":3323,"digest":"82023a146fba2a0f6d925629ed2b09c5"},"application-0047adbc0fb7a529ef7a41b5e0e7d097.js":{"logical_path":"application.js","mtime":"2014-02-20T03:12:12+09:00","size":1441568,"digest":"0047adbc0fb7a529ef7a41b5e0e7d097"}},"assets":{"default.xml":"default-5d1886100d7c8961e9962bbc4bb0c714.xml","rgb_led_anode.xml":"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml","favicon.ico":"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico","application.js":"application-
|
1
|
+
{"files":{"default-5d1886100d7c8961e9962bbc4bb0c714.xml":{"logical_path":"default.xml","mtime":"2014-02-14T01:28:48+09:00","size":5017,"digest":"5d1886100d7c8961e9962bbc4bb0c714"},"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml":{"logical_path":"rgb_led_anode.xml","mtime":"2014-02-11T14:17:03+09:00","size":3805,"digest":"91225bef2a8b97f1cefee862a0619b91"},"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico":{"logical_path":"favicon.ico","mtime":"2014-01-21T03:18:02+09:00","size":5430,"digest":"a37c90b368fd8ed436cb8f9e9396465c"},"application-735e172a0df828da16d22f5d3c26671f.js":{"logical_path":"application.js","mtime":"2014-02-19T18:22:09+09:00","size":1440213,"digest":"735e172a0df828da16d22f5d3c26671f"},"application-64a390efe879c386a5950515064f062d.css":{"logical_path":"application.css","mtime":"2014-02-19T14:32:55+09:00","size":119186,"digest":"64a390efe879c386a5950515064f062d"},"jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif":{"logical_path":"jquery-ui/animated-overlay.gif","mtime":"2014-02-04T09:35:48+09:00","size":1738,"digest":"c48c87b7a95316f4698484e3b85ee4aa"},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":180,"digest":"58b63faadd031ca3db096dfdffd90224"},"jquery-ui/ui-bg_flat_75_ffffff_40x100-937399e8b369d64aa075d13a82c00112.png":{"logical_path":"jquery-ui/ui-bg_flat_75_ffffff_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":178,"digest":"937399e8b369d64aa075d13a82c00112"},"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-a8c503e0f42a081a92a473b0d30ac6cf.png":{"logical_path":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":120,"digest":"a8c503e0f42a081a92a473b0d30ac6cf"},"jquery-ui/ui-bg_glass_65_ffffff_1x400-ddcbfe385abc3947937caa0b44e2f5d2.png":{"logical_path":"jquery-ui/ui-bg_glass_65_ffffff_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":105,"digest":"ddcbfe385abc3947937caa0b44e2f5d2"},"jquery-ui/ui-bg_glass_75_dadada_1x400-14dd4a9ad1f21d8c4c7e673ddfb0806f.png":{"logical_path":"jquery-ui/ui-bg_glass_75_dadada_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":111,"digest":"14dd4a9ad1f21d8c4c7e673ddfb0806f"},"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-a43dfabb23b0a987b567b282bad68346.png":{"logical_path":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":110,"digest":"a43dfabb23b0a987b567b282bad68346"},"jquery-ui/ui-bg_glass_95_fef1ec_1x400-31c0c791a756266043ee8ea61dacb36a.png":{"logical_path":"jquery-ui/ui-bg_glass_95_fef1ec_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":119,"digest":"31c0c791a756266043ee8ea61dacb36a"},"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-33edbdb0d2fcebd2a65c2041a28533da.png":{"logical_path":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png","mtime":"2014-02-04T09:35:48+09:00","size":101,"digest":"33edbdb0d2fcebd2a65c2041a28533da"},"jquery-ui/ui-icons_222222_256x240-890385424135de1513f00cbecfb7f990.png":{"logical_path":"jquery-ui/ui-icons_222222_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"890385424135de1513f00cbecfb7f990"},"jquery-ui/ui-icons_2e83ff_256x240-824705ca4aa2610434a358fe4018c9c6.png":{"logical_path":"jquery-ui/ui-icons_2e83ff_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"824705ca4aa2610434a358fe4018c9c6"},"jquery-ui/ui-icons_454545_256x240-254e054f6df453dfac49efbc8b78f79d.png":{"logical_path":"jquery-ui/ui-icons_454545_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"254e054f6df453dfac49efbc8b78f79d"},"jquery-ui/ui-icons_888888_256x240-57c441f87c4289a5372823f506c1182d.png":{"logical_path":"jquery-ui/ui-icons_888888_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"57c441f87c4289a5372823f506c1182d"},"jquery-ui/ui-icons_cd0a0a_256x240-261647ac915575f3981ded254ae8d43e.png":{"logical_path":"jquery-ui/ui-icons_cd0a0a_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"261647ac915575f3981ded254ae8d43e"},"loading-e8e6dd7833131c92a6c3b9c8ccc6a6ac.gif":{"logical_path":"loading.gif","mtime":"2014-01-03T14:44:55+09:00","size":3897,"digest":"e8e6dd7833131c92a6c3b9c8ccc6a6ac"},"progressbar-82023a146fba2a0f6d925629ed2b09c5.gif":{"logical_path":"progressbar.gif","mtime":"2014-01-03T14:44:55+09:00","size":3323,"digest":"82023a146fba2a0f6d925629ed2b09c5"},"application-0047adbc0fb7a529ef7a41b5e0e7d097.js":{"logical_path":"application.js","mtime":"2014-02-20T03:12:12+09:00","size":1441568,"digest":"0047adbc0fb7a529ef7a41b5e0e7d097"},"application-42aa660a3233c7738b7578d30ba040b3.js":{"logical_path":"application.js","mtime":"2014-02-22T15:25:11+09:00","size":1441708,"digest":"42aa660a3233c7738b7578d30ba040b3"},"application-66b65154e7b5dcfe67fa164db6fc5f51.js":{"logical_path":"application.js","mtime":"2014-02-23T21:53:43+09:00","size":1441898,"digest":"66b65154e7b5dcfe67fa164db6fc5f51"},"application-8bfffad1222d4e198f3c7ccc1cbd774f.js":{"logical_path":"application.js","mtime":"2014-02-27T01:28:32+09:00","size":1442504,"digest":"8bfffad1222d4e198f3c7ccc1cbd774f"}},"assets":{"default.xml":"default-5d1886100d7c8961e9962bbc4bb0c714.xml","rgb_led_anode.xml":"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml","favicon.ico":"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico","application.js":"application-8bfffad1222d4e198f3c7ccc1cbd774f.js","application.css":"application-64a390efe879c386a5950515064f062d.css","jquery-ui/animated-overlay.gif":"jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif","jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png","jquery-ui/ui-bg_flat_75_ffffff_40x100.png":"jquery-ui/ui-bg_flat_75_ffffff_40x100-937399e8b369d64aa075d13a82c00112.png","jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-a8c503e0f42a081a92a473b0d30ac6cf.png","jquery-ui/ui-bg_glass_65_ffffff_1x400.png":"jquery-ui/ui-bg_glass_65_ffffff_1x400-ddcbfe385abc3947937caa0b44e2f5d2.png","jquery-ui/ui-bg_glass_75_dadada_1x400.png":"jquery-ui/ui-bg_glass_75_dadada_1x400-14dd4a9ad1f21d8c4c7e673ddfb0806f.png","jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-a43dfabb23b0a987b567b282bad68346.png","jquery-ui/ui-bg_glass_95_fef1ec_1x400.png":"jquery-ui/ui-bg_glass_95_fef1ec_1x400-31c0c791a756266043ee8ea61dacb36a.png","jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-33edbdb0d2fcebd2a65c2041a28533da.png","jquery-ui/ui-icons_222222_256x240.png":"jquery-ui/ui-icons_222222_256x240-890385424135de1513f00cbecfb7f990.png","jquery-ui/ui-icons_2e83ff_256x240.png":"jquery-ui/ui-icons_2e83ff_256x240-824705ca4aa2610434a358fe4018c9c6.png","jquery-ui/ui-icons_454545_256x240.png":"jquery-ui/ui-icons_454545_256x240-254e054f6df453dfac49efbc8b78f79d.png","jquery-ui/ui-icons_888888_256x240.png":"jquery-ui/ui-icons_888888_256x240-57c441f87c4289a5372823f506c1182d.png","jquery-ui/ui-icons_cd0a0a_256x240.png":"jquery-ui/ui-icons_cd0a0a_256x240-261647ac915575f3981ded254ae8d43e.png","loading.gif":"loading-e8e6dd7833131c92a6c3b9c8ccc6a6ac.gif","progressbar.gif":"progressbar-82023a146fba2a0f6d925629ed2b09c5.gif"}}
|
data/smalruby-editor.gemspec
CHANGED
@@ -61,19 +61,13 @@ Gem::Specification.new do |spec|
|
|
61
61
|
['sass-rails', '~> 4.0.0'],
|
62
62
|
['uglifier', '>= 1.3.0'],
|
63
63
|
['coffee-rails', '~> 4.0.0'],
|
64
|
-
['jquery-rails'],
|
65
64
|
['turbolinks'],
|
66
65
|
['jbuilder', '~> 2.0'],
|
67
|
-
['ace-rails-ap'],
|
68
66
|
['flatstrap-sass'],
|
69
|
-
['jquery-fileupload-rails'],
|
70
67
|
['shared-mime-info'],
|
71
68
|
['launchy'],
|
72
69
|
['mime-types', '~> 1.16'],
|
73
70
|
['haml-rails'],
|
74
|
-
['jquery-ui-rails'],
|
75
|
-
['eco-source', '>= 1.1.0.rc.1'],
|
76
|
-
['backbone-on-rails'],
|
77
71
|
['smalruby'],
|
78
72
|
]
|
79
73
|
runtime_dependencies << ['therubyracer'] unless is_windows
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# language: ja
|
3
|
+
@javascript
|
4
|
+
機能: Base - 基本
|
5
|
+
シナリオ: トップページにアクセスする
|
6
|
+
もし "トップページ" にアクセスする
|
7
|
+
|
8
|
+
ならば "ブロックタブ" が表示されていること
|
9
|
+
かつ "プログラム名の入力欄" が表示されていること
|
10
|
+
かつ "ダウンロードボタン" が表示されていること
|
11
|
+
|
12
|
+
シナリオ: ブロックモードでブロックを配置後にページを遷移する
|
13
|
+
前提 "ブロック" タブを表示する
|
14
|
+
|
15
|
+
もし 次のブロック("ruby_statement")を配置する:
|
16
|
+
"""
|
17
|
+
%block{:type => "ruby_statement", :x => "0", :y => "0"}
|
18
|
+
%field{:name => "STATEMENT"}<
|
19
|
+
stage1 = Stage.new(color: "white")
|
20
|
+
"""
|
21
|
+
かつ プログラムの名前に "01.rb" を指定する
|
22
|
+
かつ ページをリロードする
|
23
|
+
かつ 警告ダイアログの "dismiss" ボタンをクリックする
|
24
|
+
|
25
|
+
ならば 次のXMLと同等のブロックが配置されていること:
|
26
|
+
"""
|
27
|
+
<xml>
|
28
|
+
<block type="ruby_statement" x="0" y="0">
|
29
|
+
<field name="STATEMENT">stage1 = Stage.new(color: "white")</field>
|
30
|
+
</block>
|
31
|
+
</xml>
|
32
|
+
"""
|
33
|
+
かつ "プログラム名の入力欄" は "01.rb" であること
|
34
|
+
|
35
|
+
シナリオ: プログラムを変更していない状態でブロックモードからRubyモードに切り替えてページを遷移する
|
36
|
+
前提 "ブロック" タブを表示する
|
37
|
+
かつ "files/01.rb.xml" をロードする
|
38
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
39
|
+
|
40
|
+
もし "Rubyタブ" にタブを切り替える
|
41
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
42
|
+
かつ ページをリロードする
|
43
|
+
|
44
|
+
ならば 次のXMLと同等のブロックが配置されていること:
|
45
|
+
"""
|
46
|
+
<xml></xml>
|
47
|
+
"""
|
48
|
+
かつ "プログラム名の入力欄" は "" であること
|
49
|
+
|
50
|
+
シナリオ: プログラムを変更した状態でブロックモードからRubyモードに切り替えてページを遷移する
|
51
|
+
前提 "ブロック" タブを表示する
|
52
|
+
かつ 次のブロック("ruby_statement")を配置する:
|
53
|
+
"""
|
54
|
+
%block{:type => "ruby_statement", :x => "0", :y => "0"}
|
55
|
+
%field{:name => "STATEMENT"}<
|
56
|
+
stage1 = Stage.new(color: "white")
|
57
|
+
"""
|
58
|
+
かつ プログラムの名前に "01.rb" を指定する
|
59
|
+
|
60
|
+
もし "Rubyタブ" にタブを切り替える
|
61
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
62
|
+
かつ ページをリロードする
|
63
|
+
|
64
|
+
ならば 次のXMLと同等のブロックが配置されていること:
|
65
|
+
"""
|
66
|
+
<xml>
|
67
|
+
<block type="ruby_statement" x="0" y="0">
|
68
|
+
<field name="STATEMENT">stage1 = Stage.new(color: "white")</field>
|
69
|
+
</block>
|
70
|
+
</xml>
|
71
|
+
"""
|
72
|
+
かつ "プログラム名の入力欄" は "01.rb" であること
|
73
|
+
|
74
|
+
シナリオ: エディタ画面を表示してRubyタブに切り替える
|
75
|
+
前提 "トップページ" にアクセスする
|
76
|
+
|
77
|
+
もし "Rubyタブ" にタブを切り替える
|
78
|
+
|
79
|
+
ならば "Rubyタブ" が表示されていること
|
80
|
+
かつ "テキストエディタ" が表示されていること
|
81
|
+
かつ "プログラム名の入力欄" が表示されていること
|
82
|
+
かつ "ダウンロードボタン" が表示されていること
|
83
|
+
かつ テキストエディタにフォーカスがあること
|
84
|
+
かつ テキストエディタの 0 行目の 0 文字目にカーソルがあること
|
85
|
+
|
86
|
+
シナリオ: Rubyモードでプログラムを入力後にページを遷移する
|
87
|
+
もし "Ruby" タブを表示する
|
88
|
+
かつ テキストエディタに "puts 'Hello, World!'" を入力済みである
|
89
|
+
かつ プログラムの名前に "01.rb" を指定する
|
90
|
+
かつ ページをリロードする
|
91
|
+
かつ 警告ダイアログの "dismiss" ボタンをクリックする
|
92
|
+
|
93
|
+
ならば テキストエディタのプログラムは "puts 'Hello, World!'" であること
|
94
|
+
かつ "プログラム名の入力欄" は "01.rb" であること
|
95
|
+
|
96
|
+
シナリオ: プログラムを変更していない状態でRubyモードからブロックモードに切り替えてページを遷移する
|
97
|
+
前提 "Ruby" タブを表示する
|
98
|
+
かつ "files/01.rb" をロードする
|
99
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
100
|
+
|
101
|
+
もし "ブロックタブ" にタブを切り替える
|
102
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
103
|
+
かつ ページをリロードする
|
104
|
+
|
105
|
+
ならば テキストエディタのプログラムは "" であること
|
106
|
+
かつ "プログラム名の入力欄" は "" であること
|
107
|
+
|
108
|
+
シナリオ: プログラムを変更した状態でRubyモードからブロックモードに切り替えてページを遷移する
|
109
|
+
前提 "Ruby" タブを表示する
|
110
|
+
かつ テキストエディタに "puts 'Hello, World!'" を入力済みである
|
111
|
+
かつ プログラムの名前に "01.rb" を指定する
|
112
|
+
|
113
|
+
もし "ブロックタブ" にタブを切り替える
|
114
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
115
|
+
かつ ページをリロードする
|
116
|
+
かつ 警告ダイアログの "dismiss" ボタンをクリックする
|
117
|
+
|
118
|
+
ならば テキストエディタのプログラムは "puts 'Hello, World!'" であること
|
119
|
+
かつ "プログラム名の入力欄" は "01.rb" であること
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# language: ja
|
3
|
+
@javascript
|
4
|
+
機能: Translate - ブロックからRubyのソースコードに変換できる
|
5
|
+
背景:
|
6
|
+
前提 "ブロック" タブを表示する
|
7
|
+
|
8
|
+
シナリオ: ブロックを配置していない状態でRubyのソースコードに変換する
|
9
|
+
前提 すべてのブロックをクリアする
|
10
|
+
かつ テキストエディタに "puts 'Hello, World!'" を入力済みである
|
11
|
+
|
12
|
+
もし "Rubyタブ" にタブを切り替える
|
13
|
+
|
14
|
+
ならば テキストエディタのプログラムは "" であること
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# language: ja
|
3
|
+
@javascript
|
4
|
+
機能: Translate - Rubyのソースコードからブロックに変換できる
|
5
|
+
背景:
|
6
|
+
前提 "Ruby" タブを表示する
|
7
|
+
かつ すべてのブロックをクリアする
|
8
|
+
|
9
|
+
シナリオ: Rubyのソースコードからブロックに変換する
|
10
|
+
前提 テキストエディタにプログラムを入力済みである:
|
11
|
+
"""
|
12
|
+
require "smalruby"
|
13
|
+
|
14
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
15
|
+
|
16
|
+
car1.on(:start) do
|
17
|
+
loop do
|
18
|
+
move(10)
|
19
|
+
turn_if_reach_wall
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
"""
|
24
|
+
|
25
|
+
もし "ブロックタブ" にタブを切り替える
|
26
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
27
|
+
|
28
|
+
ならば 次のXMLと同等のブロックが配置されていること:
|
29
|
+
"""
|
30
|
+
<xml>
|
31
|
+
<character x="0" y="0" name="car1" costumes="car1.png" angle="0"></character>
|
32
|
+
<block type="character_new" x="4" y="4">
|
33
|
+
<field name="NAME">car1</field>
|
34
|
+
<statement name="DO">
|
35
|
+
<block type="events_on_start">
|
36
|
+
<statement name="DO">
|
37
|
+
<block type="control_loop">
|
38
|
+
<statement name="DO">
|
39
|
+
<block type="motion_move" inline="true">
|
40
|
+
<value name="STEP">
|
41
|
+
<block type="math_number">
|
42
|
+
<field name="NUM">10</field>
|
43
|
+
</block>
|
44
|
+
</value>
|
45
|
+
<next>
|
46
|
+
<block type="motion_turn_if_reach_wall"></block>
|
47
|
+
</next>
|
48
|
+
</block>
|
49
|
+
</statement>
|
50
|
+
</block>
|
51
|
+
</statement>
|
52
|
+
</block>
|
53
|
+
</statement>
|
54
|
+
</block>
|
55
|
+
</xml>
|
56
|
+
"""
|
57
|
+
|
58
|
+
シナリオ: Rubyのソースコードからブロックへの変換に失敗する
|
59
|
+
前提 テキストエディタに "__FAIL__" を入力済みである
|
60
|
+
|
61
|
+
もし "ブロックタブ" にタブを切り替える
|
62
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
63
|
+
|
64
|
+
ならば ブロックが配置されていないこと
|
65
|
+
かつ テキストエディタのプログラムは "__FAIL__" であること
|
@@ -3,11 +3,12 @@
|
|
3
3
|
@javascript
|
4
4
|
@standalone
|
5
5
|
機能: Run - プログラムの実行(standaloneモード)
|
6
|
-
|
6
|
+
背景:
|
7
7
|
前提 "Ruby" タブを表示する
|
8
8
|
かつ プログラムの名前に "01.rb" を指定する
|
9
9
|
かつ テキストエディタに "puts Hello, World!'" を入力済みである
|
10
10
|
|
11
|
+
シナリオ: 実行前にプログラムのシンタックスエラーをチェックできる
|
11
12
|
もし "実行ボタン" をクリックする
|
12
13
|
かつ JavaScriptによるリクエストが終わるまで待つ
|
13
14
|
|
@@ -15,3 +16,15 @@
|
|
15
16
|
かつ "メッセージ" に "プログラムを実行できませんでした" を含むこと
|
16
17
|
かつ "メッセージ" に "1行、19文字: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('" を含むこと
|
17
18
|
かつ "メッセージ" に "1行: unterminated string meets end of file" を含むこと
|
19
|
+
|
20
|
+
シナリオ: 既存のファイルがある状態でプログラムを実行し、上書き保存をキャンセルする
|
21
|
+
前提 ホームディレクトリに "n = 0" という内容の "01.rb" が存在する
|
22
|
+
かつ 確認ダイアログをキャンセルするようにしておく
|
23
|
+
|
24
|
+
もし "実行ボタン" をクリックする
|
25
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
26
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
27
|
+
|
28
|
+
ならば 確認メッセージ "前に01.rbという名前でセーブしているけど本当にセーブしますか?\nセーブすると前に作成したプログラムは消えてしまうよ!" を表示すること
|
29
|
+
かつ "メッセージ" に "プログラムの実行をキャンセルしました" を含むこと
|
30
|
+
かつ ホームディレクトリの "01.rb" の内容が "n = 0" であること
|
@@ -466,4 +466,26 @@ describe SourceCodesController do
|
|
466
466
|
end
|
467
467
|
end
|
468
468
|
end
|
469
|
+
|
470
|
+
describe 'プログラムをXML形式のブロックに変換する (POST to_blocks)' do
|
471
|
+
before do
|
472
|
+
post :to_blocks, source_code: { data: data }
|
473
|
+
end
|
474
|
+
|
475
|
+
describe '動作確認用のモックアップ' do
|
476
|
+
context '成功する場合' do
|
477
|
+
let(:data) { SourceCode::SUCCESS_DATA_MOCK }
|
478
|
+
|
479
|
+
it 'XML形式のブロックを返すこと' do
|
480
|
+
expect(response.body).to eq(SourceCode::SUCCESS_XML_MOCK)
|
481
|
+
end
|
482
|
+
end
|
483
|
+
|
484
|
+
context '失敗する場合' do
|
485
|
+
let(:data) { '__FAIL__' }
|
486
|
+
|
487
|
+
it { expect(response.status).to eq(400) }
|
488
|
+
end
|
489
|
+
end
|
490
|
+
end
|
469
491
|
end
|
data/{public/assets/default-5d1886100d7c8961e9962bbc4bb0c714.xml → spec/fixtures/files/01.rb.xml}
RENAMED
File without changes
|
@@ -0,0 +1,329 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
def compact_source_code(source_code)
|
5
|
+
source_code.lines.map(&:strip).reject(&:empty?).join(';')[0...80]
|
6
|
+
end
|
7
|
+
|
8
|
+
# rubocop:disable EmptyLines, LineLength
|
9
|
+
|
10
|
+
describe RubyToBlock do
|
11
|
+
describe '#to_blocks' do
|
12
|
+
let(:source_code) { SourceCode.new(data: data) }
|
13
|
+
|
14
|
+
subject { source_code.to_blocks }
|
15
|
+
|
16
|
+
_data = <<-EOS.strip_heredoc
|
17
|
+
require "smalruby"
|
18
|
+
EOS
|
19
|
+
describe compact_source_code(_data) do
|
20
|
+
__data = _data
|
21
|
+
let(:data) { __data }
|
22
|
+
|
23
|
+
it { should eq('') }
|
24
|
+
end
|
25
|
+
|
26
|
+
_data = <<-EOS.strip_heredoc
|
27
|
+
require "smalruby"
|
28
|
+
|
29
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
30
|
+
|
31
|
+
car1.on(:start) do
|
32
|
+
|
33
|
+
end
|
34
|
+
EOS
|
35
|
+
describe compact_source_code(_data) do
|
36
|
+
__data = _data
|
37
|
+
let(:data) { __data }
|
38
|
+
|
39
|
+
it '結果が正しいこと' do
|
40
|
+
should eq(<<-XML.strip_heredoc)
|
41
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
42
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
43
|
+
<block type="character_new">
|
44
|
+
<field name="NAME">car1</field>
|
45
|
+
<statement name="DO">
|
46
|
+
<block type="events_on_start" />
|
47
|
+
</statement>
|
48
|
+
</block>
|
49
|
+
</xml>
|
50
|
+
XML
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
_data = <<-EOS.strip_heredoc
|
55
|
+
require "smalruby"
|
56
|
+
|
57
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
58
|
+
cat1 = Character.new(costume: "cat1.png", x: 200, y: 150, angle: 90)
|
59
|
+
|
60
|
+
car1.on(:start) do
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
car1.on(:start) do
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
cat1.on(:start) do
|
70
|
+
|
71
|
+
end
|
72
|
+
EOS
|
73
|
+
describe compact_source_code(_data) do
|
74
|
+
__data = _data
|
75
|
+
let(:data) { __data }
|
76
|
+
|
77
|
+
it '結果が正しいこと' do
|
78
|
+
should eq(<<-XML.strip_heredoc)
|
79
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
80
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
81
|
+
<character name="cat1" x="200" y="150" angle="90" costumes="cat1.png" />
|
82
|
+
<block type="character_new">
|
83
|
+
<field name="NAME">car1</field>
|
84
|
+
<statement name="DO">
|
85
|
+
<block type="events_on_start">
|
86
|
+
<next>
|
87
|
+
<block type="events_on_start" />
|
88
|
+
</next>
|
89
|
+
</block>
|
90
|
+
</statement>
|
91
|
+
</block>
|
92
|
+
<block type="character_new">
|
93
|
+
<field name="NAME">cat1</field>
|
94
|
+
<statement name="DO">
|
95
|
+
<block type="events_on_start" />
|
96
|
+
</statement>
|
97
|
+
</block>
|
98
|
+
</xml>
|
99
|
+
XML
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
_data = <<-EOS.strip_heredoc
|
104
|
+
require "smalruby"
|
105
|
+
|
106
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
107
|
+
cat1 = Character.new(costume: "cat1.png", x: 200, y: 150, angle: 90)
|
108
|
+
|
109
|
+
car1.on(:start) do
|
110
|
+
|
111
|
+
cat1.on(:start) do
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
EOS
|
116
|
+
describe compact_source_code(_data) do
|
117
|
+
__data = _data
|
118
|
+
let(:data) { __data }
|
119
|
+
|
120
|
+
it '結果が正しいこと' do
|
121
|
+
should eq(<<-XML.strip_heredoc)
|
122
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
123
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
124
|
+
<character name="cat1" x="200" y="150" angle="90" costumes="cat1.png" />
|
125
|
+
<block type="character_new">
|
126
|
+
<field name="NAME">car1</field>
|
127
|
+
<statement name="DO">
|
128
|
+
<block type="events_on_start">
|
129
|
+
<statement name="DO">
|
130
|
+
<block type="character_new">
|
131
|
+
<field name="NAME">cat1</field>
|
132
|
+
<statement name="DO">
|
133
|
+
<block type="events_on_start" />
|
134
|
+
</statement>
|
135
|
+
</block>
|
136
|
+
</statement>
|
137
|
+
</block>
|
138
|
+
</statement>
|
139
|
+
</block>
|
140
|
+
</xml>
|
141
|
+
XML
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
_data = <<-EOS.strip_heredoc
|
146
|
+
require "smalruby"
|
147
|
+
|
148
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
149
|
+
|
150
|
+
car1.on(:start) do
|
151
|
+
|
152
|
+
on(:start) do
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|
156
|
+
EOS
|
157
|
+
describe compact_source_code(_data) do
|
158
|
+
__data = _data
|
159
|
+
let(:data) { __data }
|
160
|
+
|
161
|
+
it '結果が正しいこと' do
|
162
|
+
should eq(<<-XML.strip_heredoc)
|
163
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
164
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
165
|
+
<block type="character_new">
|
166
|
+
<field name="NAME">car1</field>
|
167
|
+
<statement name="DO">
|
168
|
+
<block type="events_on_start">
|
169
|
+
<statement name="DO">
|
170
|
+
<block type="events_on_start" />
|
171
|
+
</statement>
|
172
|
+
</block>
|
173
|
+
</statement>
|
174
|
+
</block>
|
175
|
+
</xml>
|
176
|
+
XML
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
_data = <<-EOS.strip_heredoc
|
181
|
+
require "smalruby"
|
182
|
+
|
183
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
184
|
+
|
185
|
+
car1.on(:start) do
|
186
|
+
|
187
|
+
s = 'a'
|
188
|
+
if s == 'a'
|
189
|
+
puts 'エー'
|
190
|
+
elsif s == 'b'
|
191
|
+
puts 'ビー'
|
192
|
+
else
|
193
|
+
puts 'その他'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
EOS
|
197
|
+
describe compact_source_code(_data) do
|
198
|
+
__data = _data
|
199
|
+
let(:data) { __data }
|
200
|
+
|
201
|
+
it '結果が正しいこと' do
|
202
|
+
should eq(<<-XML.strip_heredoc)
|
203
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
204
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
205
|
+
<block type="character_new">
|
206
|
+
<field name="NAME">car1</field>
|
207
|
+
<statement name="DO">
|
208
|
+
<block type="events_on_start">
|
209
|
+
<statement name="DO">
|
210
|
+
<block type="ruby_statement">
|
211
|
+
<field name="STATEMENT">s = 'a'</field>
|
212
|
+
<next>
|
213
|
+
<block type="ruby_statement">
|
214
|
+
<field name="STATEMENT">if s == 'a'</field>
|
215
|
+
<next>
|
216
|
+
<block type="ruby_statement">
|
217
|
+
<field name="STATEMENT"> puts 'エー'</field>
|
218
|
+
<next>
|
219
|
+
<block type="ruby_statement">
|
220
|
+
<field name="STATEMENT">elsif s == 'b'</field>
|
221
|
+
<next>
|
222
|
+
<block type="ruby_statement">
|
223
|
+
<field name="STATEMENT"> puts 'ビー'</field>
|
224
|
+
<next>
|
225
|
+
<block type="ruby_statement">
|
226
|
+
<field name="STATEMENT">else</field>
|
227
|
+
<next>
|
228
|
+
<block type="ruby_statement">
|
229
|
+
<field name="STATEMENT"> puts 'その他'</field>
|
230
|
+
<next>
|
231
|
+
<block type="ruby_statement">
|
232
|
+
<field name="STATEMENT">end</field>
|
233
|
+
</block>
|
234
|
+
</next>
|
235
|
+
</block>
|
236
|
+
</next>
|
237
|
+
</block>
|
238
|
+
</next>
|
239
|
+
</block>
|
240
|
+
</next>
|
241
|
+
</block>
|
242
|
+
</next>
|
243
|
+
</block>
|
244
|
+
</next>
|
245
|
+
</block>
|
246
|
+
</next>
|
247
|
+
</block>
|
248
|
+
</statement>
|
249
|
+
</block>
|
250
|
+
</statement>
|
251
|
+
</block>
|
252
|
+
</xml>
|
253
|
+
XML
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
_data = <<-EOS.strip_heredoc
|
258
|
+
require "smalruby"
|
259
|
+
|
260
|
+
s = :a
|
261
|
+
case s
|
262
|
+
when :a
|
263
|
+
puts "エー"
|
264
|
+
when :b
|
265
|
+
puts "ビー"
|
266
|
+
end
|
267
|
+
EOS
|
268
|
+
describe compact_source_code(_data) do
|
269
|
+
__data = _data
|
270
|
+
let(:data) { __data }
|
271
|
+
|
272
|
+
it '結果が正しいこと' do
|
273
|
+
should eq(<<-XML.strip_heredoc)
|
274
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
275
|
+
<block type="ruby_statement">
|
276
|
+
<field name="STATEMENT">s = :a</field>
|
277
|
+
<next>
|
278
|
+
<block type="ruby_statement">
|
279
|
+
<field name="STATEMENT">case s</field>
|
280
|
+
<next>
|
281
|
+
<block type="ruby_statement">
|
282
|
+
<field name="STATEMENT">when :a</field>
|
283
|
+
<next>
|
284
|
+
<block type="ruby_statement">
|
285
|
+
<field name="STATEMENT"> puts "エー"</field>
|
286
|
+
<next>
|
287
|
+
<block type="ruby_statement">
|
288
|
+
<field name="STATEMENT">when :b</field>
|
289
|
+
<next>
|
290
|
+
<block type="ruby_statement">
|
291
|
+
<field name="STATEMENT"> puts "ビー"</field>
|
292
|
+
<next>
|
293
|
+
<block type="ruby_statement">
|
294
|
+
<field name="STATEMENT">end</field>
|
295
|
+
</block>
|
296
|
+
</next>
|
297
|
+
</block>
|
298
|
+
</next>
|
299
|
+
</block>
|
300
|
+
</next>
|
301
|
+
</block>
|
302
|
+
</next>
|
303
|
+
</block>
|
304
|
+
</next>
|
305
|
+
</block>
|
306
|
+
</next>
|
307
|
+
</block>
|
308
|
+
</xml>
|
309
|
+
XML
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
describe '動作確認用のモックアップ' do
|
314
|
+
context '成功する場合' do
|
315
|
+
let(:data) { SourceCode::SUCCESS_DATA_MOCK }
|
316
|
+
|
317
|
+
it 'XML形式のブロックを返すこと' do
|
318
|
+
should eq(SourceCode::SUCCESS_XML_MOCK)
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
context '失敗する場合' do
|
323
|
+
let(:data) { '__FAIL__' }
|
324
|
+
|
325
|
+
it { expect { subject }.to raise_error }
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|