smalruby-editor 0.1.5 → 0.1.6

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.

@@ -1,3 +1,3 @@
1
- module SmalrubyEditor
2
- VERSION = '0.1.5'
3
- end
1
+ module SmalrubyEditor
2
+ VERSION = '0.1.6'
3
+ end
@@ -6,8 +6,6 @@ task :build do
6
6
 
7
7
  ENV['GEM_PLATFORM'] = 'x86-mingw32'
8
8
  Rake::Task['gem:build'].reenable
9
- Rake::Task['assets:clobber'].reenable
10
- Rake::Task['assets:precompile:standalone'].reenable
11
9
  Rake::Task['gem:build'].invoke
12
10
  end
13
11
 
@@ -18,8 +16,6 @@ task :release do
18
16
  ENV['GEM_PLATFORM'] = 'x86-mingw32'
19
17
  Rake::Task['gem:release'].reenable
20
18
  Rake::Task['gem:build'].reenable
21
- Rake::Task['assets:clobber'].reenable
22
- Rake::Task['assets:precompile:standalone'].reenable
23
19
  Rake::Task['gem:release'].invoke
24
20
 
25
21
  sh 'git mirror'
@@ -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
@@ -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 = &apos;a&apos;</field>
212
+ <next>
213
+ <block type="ruby_statement">
214
+ <field name="STATEMENT">if s == &apos;a&apos;</field>
215
+ <next>
216
+ <block type="ruby_statement">
217
+ <field name="STATEMENT"> puts &apos;エー&apos;</field>
218
+ <next>
219
+ <block type="ruby_statement">
220
+ <field name="STATEMENT">elsif s == &apos;b&apos;</field>
221
+ <next>
222
+ <block type="ruby_statement">
223
+ <field name="STATEMENT"> puts &apos;ビー&apos;</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 &apos;その他&apos;</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 &quot;エー&quot;</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 &quot;ビー&quot;</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