raheui 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/.rubocop.yml +14 -0
- data/.rubocop_todo.yml +24 -0
- data/.travis.yml +17 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +64 -0
- data/Rakefile +16 -0
- data/bin/raheui +8 -0
- data/lib/raheui/cli.rb +27 -0
- data/lib/raheui/code.rb +106 -0
- data/lib/raheui/io.rb +60 -0
- data/lib/raheui/option.rb +44 -0
- data/lib/raheui/port.rb +14 -0
- data/lib/raheui/queue.rb +18 -0
- data/lib/raheui/runner.rb +212 -0
- data/lib/raheui/stack.rb +13 -0
- data/lib/raheui/store.rb +41 -0
- data/lib/raheui/version.rb +7 -0
- data/lib/raheui.rb +16 -0
- data/raheui.gemspec +26 -0
- data/spec/raheui/cli_spec.rb +39 -0
- data/spec/raheui/code_spec.rb +119 -0
- data/spec/raheui/io_spec.rb +94 -0
- data/spec/raheui/option_spec.rb +43 -0
- data/spec/raheui/port_spec.rb +6 -0
- data/spec/raheui/queue_spec.rb +148 -0
- data/spec/raheui/runner_spec.rb +516 -0
- data/spec/raheui/stack_spec.rb +145 -0
- data/spec/raheui/store_spec.rb +93 -0
- data/spec/raheui/version_spec.rb +8 -0
- data/spec/spec_helper.rb +75 -0
- data/spec/support/exit_code_matchers.rb +27 -0
- data/spec/support/file_helper.rb +38 -0
- data/spec/support/isolated_environment.rb +13 -0
- data/spec/support/shared_store.rb +47 -0
- metadata +168 -0
@@ -0,0 +1,148 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Raheui::Queue do
|
5
|
+
it_behaves_like 'a store'
|
6
|
+
|
7
|
+
describe '#push' do
|
8
|
+
context 'with no elements' do
|
9
|
+
let(:element) { rand(10) }
|
10
|
+
|
11
|
+
it 'returns an array with the pushed element' do
|
12
|
+
expect(subject.push(element)).to match_array([element])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'with one element' do
|
17
|
+
let(:element) { rand(10) }
|
18
|
+
|
19
|
+
before(:example) { subject.push(42) }
|
20
|
+
|
21
|
+
it 'returns an array with the pushed element at first' do
|
22
|
+
expect(subject.push(element)).to match_array([element, 42])
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#pop' do
|
28
|
+
context 'with no elements' do
|
29
|
+
it 'returns first pushed element' do
|
30
|
+
subject.push(42)
|
31
|
+
expect(subject.pop).to be(42)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'with one element' do
|
36
|
+
let(:element) { rand(10) }
|
37
|
+
|
38
|
+
before(:example) { subject.push(element) }
|
39
|
+
|
40
|
+
it 'returns the element' do
|
41
|
+
expect(subject.pop).to be(element)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'returns first pushed element' do
|
45
|
+
subject.push(42)
|
46
|
+
expect(subject.pop).to be(element)
|
47
|
+
expect(subject.pop).to be(42)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'returns nil after a pop call' do
|
51
|
+
subject.pop
|
52
|
+
expect(subject.pop).to be(nil)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'with more than one element' do
|
57
|
+
let(:one) { rand(10) }
|
58
|
+
let(:two) { rand(10...20) }
|
59
|
+
|
60
|
+
before(:example) do
|
61
|
+
subject.push(one)
|
62
|
+
subject.push(two)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'returns the elements in pushed order' do
|
66
|
+
expect(subject.pop).to be(one)
|
67
|
+
expect(subject.pop).to be(two)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'returns first pushed element' do
|
71
|
+
subject.push(42)
|
72
|
+
expect(subject.pop).to be(one)
|
73
|
+
expect(subject.pop).to be(two)
|
74
|
+
expect(subject.pop).to be(42)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#push_dup' do
|
80
|
+
context 'with one element' do
|
81
|
+
let(:element) { rand(10) }
|
82
|
+
|
83
|
+
before(:example) { subject.push(element) }
|
84
|
+
|
85
|
+
it 'pushes the last element' do
|
86
|
+
subject.push_dup
|
87
|
+
expect(subject.pop).to be(element)
|
88
|
+
expect(subject.pop).to be(element)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'pushes last pushed element' do
|
92
|
+
subject.push(42)
|
93
|
+
subject.push_dup
|
94
|
+
expect(subject.pop).to be(element)
|
95
|
+
expect(subject.pop).to be(42)
|
96
|
+
expect(subject.pop).to be(42)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '#swap' do
|
102
|
+
context 'with one element' do
|
103
|
+
let(:element) { rand(10) }
|
104
|
+
|
105
|
+
before(:example) { subject.push(element) }
|
106
|
+
|
107
|
+
it "doesn't modify store" do
|
108
|
+
subject.swap
|
109
|
+
expect(subject.pop).to be(element)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'with two elements' do
|
114
|
+
let(:one) { rand(10) }
|
115
|
+
let(:two) { rand(10...20) }
|
116
|
+
|
117
|
+
before(:example) do
|
118
|
+
subject.push(one)
|
119
|
+
subject.push(two)
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'swaps the first two elements' do
|
123
|
+
subject.swap
|
124
|
+
expect(subject.pop).to be(two)
|
125
|
+
expect(subject.pop).to be(one)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'with more than two elements' do
|
130
|
+
let(:one) { rand(10) }
|
131
|
+
let(:two) { rand(10...20) }
|
132
|
+
let(:three) { rand(20...30) }
|
133
|
+
|
134
|
+
before(:example) do
|
135
|
+
subject.push(one)
|
136
|
+
subject.push(two)
|
137
|
+
subject.push(three)
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'swaps the first two elements' do
|
141
|
+
subject.swap
|
142
|
+
expect(subject.pop).to be(two)
|
143
|
+
expect(subject.pop).to be(one)
|
144
|
+
expect(subject.pop).to be(three)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,516 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
shared_examples 'a runner' do
|
5
|
+
subject(:runner) { Raheui::Runner.new(code) }
|
6
|
+
let(:code) { Raheui::Code.new(source) }
|
7
|
+
let(:output) { $stdout.string }
|
8
|
+
|
9
|
+
before(:example) do
|
10
|
+
$stdin = StringIO.new
|
11
|
+
$stdout = StringIO.new
|
12
|
+
end
|
13
|
+
|
14
|
+
after(:example) do
|
15
|
+
$stdin = STDIN
|
16
|
+
$stdout = STDOUT
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'accepts input, prints expected output and returns exit code' do
|
20
|
+
if defined?(inputs)
|
21
|
+
inputs.each do |line|
|
22
|
+
$stdin.puts line
|
23
|
+
end
|
24
|
+
$stdin.rewind
|
25
|
+
end
|
26
|
+
expect(runner.run).to be(exit_code)
|
27
|
+
expect(output).to eq(result)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe Raheui::Runner, 'with bieup.aheui' do
|
32
|
+
# rubocop:disable Metrics/LineLength
|
33
|
+
let(:source) { <<-END }
|
34
|
+
숭
|
35
|
+
박반받발밤밥밧밪밫밬밭붚
|
36
|
+
뭉멍멍멍멍멍멍멍멍멍멍멍
|
37
|
+
밖밗밙밚밝밞밟밠밡밢밣밦붔
|
38
|
+
뭉멍멍멍멍멍멍멍멍멍멍멍멍
|
39
|
+
방붛
|
40
|
+
뭉멍
|
41
|
+
희
|
42
|
+
|
43
|
+
ㅂ에 ㅇ받침이 있으면 입력받은 숫자를, ㅎ받침이 있으면 입력받은 문자의 유니코드 코드값을 저장공간에 집어넣습니다. 단, ㅂ의 경우 나머지 받침이 있으면 그 받침을 구성하는 선의 수에 따른 값을 집어넣습니다. 받침이 없으면 0을 집어넣습니다.
|
44
|
+
END
|
45
|
+
# rubocop:enable Metrics/LineLength
|
46
|
+
|
47
|
+
let(:inputs) { %w(3 밯) }
|
48
|
+
let(:result) { '2235442343444455799799864348175' }
|
49
|
+
let(:exit_code) { 0 }
|
50
|
+
|
51
|
+
it_behaves_like 'a runner'
|
52
|
+
end
|
53
|
+
|
54
|
+
describe Raheui::Runner, 'with border.aheui' do
|
55
|
+
# rubocop:disable Metrics/LineLength
|
56
|
+
let(:source) { <<-END }
|
57
|
+
볻 망볿
|
58
|
+
ㅇ ㅇ희
|
59
|
+
멍 붒
|
60
|
+
ㅇ ㅇ몽
|
61
|
+
|
62
|
+
|
63
|
+
표준: 코드 공간의 한 쪽 끝에 다다르면 커서는 반대편 끝으로 이동합니다. 이는 Funge-98의 wrapping algorithm과 동일합니다.
|
64
|
+
END
|
65
|
+
# rubocop:enable Metrics/LineLength
|
66
|
+
|
67
|
+
let(:result) { '369' }
|
68
|
+
let(:exit_code) { 0 }
|
69
|
+
|
70
|
+
it_behaves_like 'a runner'
|
71
|
+
end
|
72
|
+
|
73
|
+
describe Raheui::Runner, 'with chieut.aheui' do
|
74
|
+
# rubocop:disable Metrics/LineLength
|
75
|
+
let(:source) { <<-END }
|
76
|
+
아ㅇㅇ부
|
77
|
+
희멍번처붇
|
78
|
+
ㅇㅇㅇ분멍
|
79
|
+
희멍번차붇
|
80
|
+
ㅇㅇㅇ희멍
|
81
|
+
ㅊ은 조건 명령으로 저장공간에서 값 하나를 뽑아내서 그 값이 0이 아니면 홀소리의 방향대로, 0이면 그 반대 방향대로 갑니다.
|
82
|
+
END
|
83
|
+
# rubocop:enable Metrics/LineLength
|
84
|
+
|
85
|
+
let(:result) { '33' }
|
86
|
+
let(:exit_code) { 0 }
|
87
|
+
|
88
|
+
it_behaves_like 'a runner'
|
89
|
+
end
|
90
|
+
|
91
|
+
describe Raheui::Runner, 'with default-storage.aheui' do
|
92
|
+
# rubocop:disable Metrics/LineLength
|
93
|
+
let(:source) { <<-END }
|
94
|
+
밞산바삳바사망희
|
95
|
+
|
96
|
+
처음에 선택되어 있는 스택은 (받침 없음) 스택입니다. (“사” 와 같은 명령으로 선택할 수 있습니다.)
|
97
|
+
END
|
98
|
+
# rubocop:enable Metrics/LineLength
|
99
|
+
|
100
|
+
let(:result) { '9' }
|
101
|
+
let(:exit_code) { 0 }
|
102
|
+
|
103
|
+
it_behaves_like 'a runner'
|
104
|
+
end
|
105
|
+
|
106
|
+
describe Raheui::Runner, 'with digeut.aheui' do
|
107
|
+
# rubocop:disable Metrics/LineLength
|
108
|
+
let(:source) { <<-END }
|
109
|
+
반받다망희
|
110
|
+
|
111
|
+
ㄷ은 덧셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 둘을 더한 값을 저장공간에 집어넣습니다.
|
112
|
+
END
|
113
|
+
# rubocop:enable Metrics/LineLength
|
114
|
+
|
115
|
+
let(:result) { '5' }
|
116
|
+
let(:exit_code) { 0 }
|
117
|
+
|
118
|
+
it_behaves_like 'a runner'
|
119
|
+
end
|
120
|
+
|
121
|
+
describe Raheui::Runner, 'with exhausted-storage.aheui' do
|
122
|
+
# rubocop:disable Metrics/LineLength
|
123
|
+
let(:source) { <<-END }
|
124
|
+
아ㅇㅇ우
|
125
|
+
희멍벋망반망희
|
126
|
+
중복 명령을 포함한 모든 뽑아내기를 쓰는 명령에서 저장 공간에 값이 모자랄 경우, 커서는 그 명령을 실행하지 않고 커서가 있는 글자의 홀소리의 반대방향으로 움직입니다.
|
127
|
+
END
|
128
|
+
# rubocop:enable Metrics/LineLength
|
129
|
+
|
130
|
+
let(:result) { '3' }
|
131
|
+
let(:exit_code) { 0 }
|
132
|
+
|
133
|
+
it_behaves_like 'a runner'
|
134
|
+
end
|
135
|
+
|
136
|
+
describe Raheui::Runner, 'with exitcode.aheui' do
|
137
|
+
# rubocop:disable Metrics/LineLength
|
138
|
+
let(:source) { <<-END }
|
139
|
+
반월회
|
140
|
+
|
141
|
+
ㅎ은 끝냄 명령으로 커서의 실행을 끝냅니다. 이 때 스택에서 맨 위 값을 뽑아서 운영체제에 돌려 줍니다.
|
142
|
+
END
|
143
|
+
# rubocop:enable Metrics/LineLength
|
144
|
+
|
145
|
+
let(:result) { '' }
|
146
|
+
let(:exit_code) { 2 }
|
147
|
+
|
148
|
+
it_behaves_like 'a runner'
|
149
|
+
end
|
150
|
+
|
151
|
+
describe Raheui::Runner, 'with ieunghiheuit.aheui' do
|
152
|
+
# rubocop:disable Metrics/LineLength
|
153
|
+
let(:source) { <<-END }
|
154
|
+
아악안앋압알앗았앜앇헐
|
155
|
+
|
156
|
+
ㅇ은 없음 명령으로 아무 일도 하지 않습니다. * ㅎ은 끝냄 명령으로 커서의 실행을 끝냅니다.
|
157
|
+
사용되지 않는 받침은 모두 무시됩니다.
|
158
|
+
END
|
159
|
+
# rubocop:enable Metrics/LineLength
|
160
|
+
|
161
|
+
let(:result) { '' }
|
162
|
+
let(:exit_code) { 0 }
|
163
|
+
|
164
|
+
it_behaves_like 'a runner'
|
165
|
+
end
|
166
|
+
|
167
|
+
describe Raheui::Runner, 'with jieut.aheui' do
|
168
|
+
# rubocop:disable Metrics/LineLength
|
169
|
+
let(:source) { <<-END }
|
170
|
+
반반자망받반자망반받자망희
|
171
|
+
|
172
|
+
ㅈ은 비교 명령으로 저장공간에서 값 두 개를 뽑아 내서 비교합니다. 나중에 뽑아낸 값이 더 크거나 같으면 1을, 아니면 0을 지금 저장공간에 집어넣습니다.
|
173
|
+
END
|
174
|
+
# rubocop:enable Metrics/LineLength
|
175
|
+
|
176
|
+
let(:result) { '110' }
|
177
|
+
let(:exit_code) { 0 }
|
178
|
+
|
179
|
+
it_behaves_like 'a runner'
|
180
|
+
end
|
181
|
+
|
182
|
+
describe Raheui::Runner, 'with mieum.aheui' do
|
183
|
+
# rubocop:disable Metrics/LineLength
|
184
|
+
let(:source) { <<-END }
|
185
|
+
바반받밤발밦밠밣밞망만맘말망맋맠맟망희
|
186
|
+
|
187
|
+
ㅁ에 ㅇ받침이 있으면 저장공간에서 뽑아낸 값을 숫자로, ㅎ받침이 있으면 그 값에 해당하는 유니코드 문자로 출력합니다. 나머지 받침은 뽑아낸 값을 그냥 버립니다.
|
188
|
+
END
|
189
|
+
# rubocop:enable Metrics/LineLength
|
190
|
+
|
191
|
+
let(:result) { '950' }
|
192
|
+
let(:exit_code) { 0 }
|
193
|
+
|
194
|
+
it_behaves_like 'a runner'
|
195
|
+
end
|
196
|
+
|
197
|
+
describe Raheui::Runner, 'with nieun.aheui' do
|
198
|
+
# rubocop:disable Metrics/LineLength
|
199
|
+
let(:source) { <<-END }
|
200
|
+
밟받나망희
|
201
|
+
|
202
|
+
ㄴ은 나눗셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 나눈 값을 저장공간에 집어넣습니다.
|
203
|
+
END
|
204
|
+
# rubocop:enable Metrics/LineLength
|
205
|
+
|
206
|
+
let(:result) { '3' }
|
207
|
+
let(:exit_code) { 0 }
|
208
|
+
|
209
|
+
it_behaves_like 'a runner'
|
210
|
+
end
|
211
|
+
|
212
|
+
describe Raheui::Runner, 'with pieup.aheui' do
|
213
|
+
# rubocop:disable Metrics/LineLength
|
214
|
+
let(:source) { <<-END }
|
215
|
+
바밟밟땅밝밝땅팡망망우
|
216
|
+
숭ㅇㅇㅇㅇㅇㅇㅇㅇㅇ어
|
217
|
+
밟밟밝밝땅땅바팡망망희
|
218
|
+
|
219
|
+
ㅍ은 바꿔치기 명령입니다. 지금 저장공간이 스택이라면 맨 위 값과 그 바로 아래 값을, 큐라면 맨 앞의 값과 그 바로 뒤 값을 바꿉니다.
|
220
|
+
END
|
221
|
+
# rubocop:enable Metrics/LineLength
|
222
|
+
|
223
|
+
let(:result) { '81494981' }
|
224
|
+
let(:exit_code) { 0 }
|
225
|
+
|
226
|
+
it_behaves_like 'a runner'
|
227
|
+
end
|
228
|
+
|
229
|
+
describe Raheui::Runner, 'with print.aheui' do
|
230
|
+
# rubocop:disable Metrics/LineLength
|
231
|
+
let(:source) { <<-END }
|
232
|
+
밞밞반다따반타뭉
|
233
|
+
ㅇㅇㅇㅇㅇㅇㅇ밞밞반다따반타맣희
|
234
|
+
|
235
|
+
ㅁ에 ㅇ받침이 있으면 저장공간에서 뽑아낸 값을 숫자로, ㅎ받침이 있으면 그 값에 해당하는 유니코드 문자로 출력합니다.
|
236
|
+
END
|
237
|
+
# rubocop:enable Metrics/LineLength
|
238
|
+
|
239
|
+
let(:result) { '97a' }
|
240
|
+
let(:exit_code) { 0 }
|
241
|
+
|
242
|
+
it_behaves_like 'a runner'
|
243
|
+
end
|
244
|
+
|
245
|
+
describe Raheui::Runner, 'with rieul.aheui' do
|
246
|
+
# rubocop:disable Metrics/LineLength
|
247
|
+
let(:source) { <<-END }
|
248
|
+
밟발라망희
|
249
|
+
|
250
|
+
ㄹ은 나머지 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 나눈 나머지를 저장공간에 집어넣습니다.
|
251
|
+
END
|
252
|
+
# rubocop:enable Metrics/LineLength
|
253
|
+
|
254
|
+
let(:result) { '4' }
|
255
|
+
let(:exit_code) { 0 }
|
256
|
+
|
257
|
+
it_behaves_like 'a runner'
|
258
|
+
end
|
259
|
+
|
260
|
+
describe Raheui::Runner, 'with shebang.aheui' do
|
261
|
+
# rubocop:disable Metrics/LineLength
|
262
|
+
let(:source) { <<-END }
|
263
|
+
#!/usr/bin/env aheui
|
264
|
+
반망희
|
265
|
+
|
266
|
+
표준: 커서는 코드 공간의 맨 첫 줄 맨 첫번째 칸에서 시작합니다. 맨 처음에 홀소리가 없을 경우 커서는 기본값으로 아랫쪽으로 이동하는데, 이는 #!과 호환시키기 위한 것으로, 기본 방향이 오른쪽인 funge와는 다른 점입니다.
|
267
|
+
END
|
268
|
+
# rubocop:enable Metrics/LineLength
|
269
|
+
|
270
|
+
let(:result) { '2' }
|
271
|
+
let(:exit_code) { 0 }
|
272
|
+
|
273
|
+
it_behaves_like 'a runner'
|
274
|
+
end
|
275
|
+
|
276
|
+
describe Raheui::Runner, 'with ssangbieup.aheui' do
|
277
|
+
# rubocop:disable Metrics/LineLength
|
278
|
+
let(:source) { <<-END }
|
279
|
+
밟밟땅빵망망희
|
280
|
+
|
281
|
+
ㅃ은 중복 명령입니다. 지금 저장공간이 스택이라면 맨 위의 값을 그 값 위에 하나 더 집어넣고, 큐라면 맨 앞의 값을 앞에 하나 더 덧붙입니다.
|
282
|
+
END
|
283
|
+
# rubocop:enable Metrics/LineLength
|
284
|
+
|
285
|
+
let(:result) { '8181' }
|
286
|
+
let(:exit_code) { 0 }
|
287
|
+
|
288
|
+
it_behaves_like 'a runner'
|
289
|
+
end
|
290
|
+
|
291
|
+
describe Raheui::Runner, 'with ssangdigeut.aheui' do
|
292
|
+
# rubocop:disable Metrics/LineLength
|
293
|
+
let(:source) { <<-END }
|
294
|
+
발밞따망희
|
295
|
+
|
296
|
+
ㄸ은 곱셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 둘을 곱한 값을 저장공간에 집어넣습니다.
|
297
|
+
END
|
298
|
+
# rubocop:enable Metrics/LineLength
|
299
|
+
|
300
|
+
let(:result) { '45' }
|
301
|
+
let(:exit_code) { 0 }
|
302
|
+
|
303
|
+
it_behaves_like 'a runner'
|
304
|
+
end
|
305
|
+
|
306
|
+
describe Raheui::Runner, 'with ssangsiot.aheui' do
|
307
|
+
# rubocop:disable Metrics/LineLength
|
308
|
+
let(:source) { <<-END }
|
309
|
+
아바싹반싼받싿우
|
310
|
+
우멍석멍선멍섣어
|
311
|
+
아바쌀반쌈받쌉우
|
312
|
+
우멍설멍섬멍섭어
|
313
|
+
아바쌋반쌍받쌎우
|
314
|
+
우멍섯멍성멍섲어
|
315
|
+
아바쌏반쌐받쌑우
|
316
|
+
우멍섳멍섴멍섵어
|
317
|
+
아바쌒반싺받싻우
|
318
|
+
우멍섶멍섞멍섟어
|
319
|
+
아바싽반싾받쌁우
|
320
|
+
우멍섡멍섢멍섥어
|
321
|
+
아바쌂반쌃받쌄우
|
322
|
+
우멍섦멍섧멍섨어
|
323
|
+
아바쌅반쌆받쌇우
|
324
|
+
우멍섩멍섪멍섫어
|
325
|
+
아바쌊반쌌받싸우
|
326
|
+
희멍섮멍섰멍서어
|
327
|
+
|
328
|
+
ㅆ은 이동 명령으로 저장공간에서 값 하나를 뽑아내서 받침이 나타내는 저장공간에 그 값을 집어 넣습니다.
|
329
|
+
END
|
330
|
+
# rubocop:enable Metrics/LineLength
|
331
|
+
|
332
|
+
let(:result) { '320320320320320320320320320' }
|
333
|
+
let(:exit_code) { 0 }
|
334
|
+
|
335
|
+
it_behaves_like 'a runner'
|
336
|
+
end
|
337
|
+
|
338
|
+
describe Raheui::Runner, 'with storage.aheui' do
|
339
|
+
# rubocop:disable Metrics/LineLength
|
340
|
+
let(:source) { <<-END }
|
341
|
+
바반받뭉
|
342
|
+
우석멍멍
|
343
|
+
바반받뭉
|
344
|
+
우선멍멍
|
345
|
+
바반받뭉
|
346
|
+
우섣멍멍
|
347
|
+
바반받뭉
|
348
|
+
우설멍멍
|
349
|
+
바반받뭉
|
350
|
+
우섬멍멍
|
351
|
+
바반받뭉
|
352
|
+
우섭멍멍
|
353
|
+
바반받뭉
|
354
|
+
우섯멍멍
|
355
|
+
바반받뭉
|
356
|
+
우성멍멍
|
357
|
+
바반받뭉
|
358
|
+
우섲멍멍
|
359
|
+
바반받뭉
|
360
|
+
우섳멍멍
|
361
|
+
바반받뭉
|
362
|
+
우섴멍멍
|
363
|
+
바반받뭉
|
364
|
+
우섵멍멍
|
365
|
+
바반받뭉
|
366
|
+
우섶멍멍
|
367
|
+
바반받뭉
|
368
|
+
끝희멍멍
|
369
|
+
|
370
|
+
아희에서 쓰이는 저장 공간은 여러 개가 있습니다. 대부분이 스택이고, 큐가 하나 있습니다.
|
371
|
+
ㅁ은 뽑기 명령입니다. 지금 저장공간이 스택이라면 맨 위의 값, 큐라면 맨 앞의 값을 뽑아냅니다.(pop) 통로라면 거기서 값을 하나 뽑아옵니다. ㅁ 명령에는 받침이 올 수 있는데, 이에 대한 설명은 아래에 있습니다.
|
372
|
+
ㅁ에 ㅇ받침이 있으면 저장공간에서 뽑아낸 값을 숫자로, ㅎ받침이 있으면 그 값에 해당하는 유니코드 문자로 출력합니다.
|
373
|
+
END
|
374
|
+
# rubocop:enable Metrics/LineLength
|
375
|
+
|
376
|
+
let(:result) { '320320320320320320320320023320320320320320' }
|
377
|
+
let(:exit_code) { 0 }
|
378
|
+
|
379
|
+
it_behaves_like 'a runner'
|
380
|
+
end
|
381
|
+
|
382
|
+
describe Raheui::Runner, 'with syllable.aheui' do
|
383
|
+
# rubocop:disable Metrics/LineLength
|
384
|
+
let(:source) { <<-END }
|
385
|
+
ㅏ희ㅣㅊㅓ
|
386
|
+
뱓ㅗㅈㅊ몽
|
387
|
+
ㅂㅁㅎㅣ헥
|
388
|
+
|
389
|
+
코드는 한글로만 이루어지는데, 여기서 한글은 유니코드 U+AC00에서 U+D7A3까지의 범위에 있는 글자(hangul syllable 영역)를 말합니다. 그 밖의 글자나 코드에서 지정하지 않은 나머지 공간은 모두 빈 칸으로 처리되어 커서가 이동하는 방향에 아무 영향을 주지 않습니다.
|
390
|
+
END
|
391
|
+
# rubocop:enable Metrics/LineLength
|
392
|
+
|
393
|
+
let(:result) { '3' }
|
394
|
+
let(:exit_code) { 0 }
|
395
|
+
|
396
|
+
it_behaves_like 'a runner'
|
397
|
+
end
|
398
|
+
|
399
|
+
describe Raheui::Runner, 'with tieut.aheui' do
|
400
|
+
# rubocop:disable Metrics/LineLength
|
401
|
+
let(:source) { <<-END }
|
402
|
+
받반타망희
|
403
|
+
|
404
|
+
ㅌ은 뺄셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 뺀 값을 저장공간에 집어넣습니다.
|
405
|
+
END
|
406
|
+
# rubocop:enable Metrics/LineLength
|
407
|
+
|
408
|
+
let(:result) { '1' }
|
409
|
+
let(:exit_code) { 0 }
|
410
|
+
|
411
|
+
it_behaves_like 'a runner'
|
412
|
+
end
|
413
|
+
|
414
|
+
describe Raheui::Runner, 'with vowel-2step.aheui' do
|
415
|
+
let(:source) { <<-END }
|
416
|
+
뷷우우우희우명
|
417
|
+
아아아아아아아
|
418
|
+
먕오뱞오먕오뵯
|
419
|
+
|
420
|
+
ㅑ, ㅕ, ㅛ, ㅠ - 커서를 각각 오른쪽, 왼쪽, 위, 아래로 두 칸 옮깁니다.
|
421
|
+
END
|
422
|
+
|
423
|
+
let(:result) { '369' }
|
424
|
+
let(:exit_code) { 0 }
|
425
|
+
|
426
|
+
it_behaves_like 'a runner'
|
427
|
+
end
|
428
|
+
|
429
|
+
describe Raheui::Runner, 'with vowel-advanced.aheui' do
|
430
|
+
let(:source) { <<-END }
|
431
|
+
반븓븝불
|
432
|
+
우멍벎망이밟망희
|
433
|
+
빈
|
434
|
+
빋밟망희
|
435
|
+
붑으
|
436
|
+
발몽
|
437
|
+
ㅇ밞망분
|
438
|
+
ㅇ불법벋
|
439
|
+
의멍밞망희
|
440
|
+
|
441
|
+
ㅡ - 커서가 가로로 왔으면 그 방향대로, 세로로 왔으면 전에 있던 자리로 옮깁니다.
|
442
|
+
ㅣ - 커서가 세로로 왔으면 그 방향대로, 가로로 왔으면 전에 있던 자리로 옮깁니다.
|
443
|
+
ㅢ - 커서를 전에 있던 자리로 옮깁니다.
|
444
|
+
END
|
445
|
+
|
446
|
+
let(:result) { '543295432954329' }
|
447
|
+
let(:exit_code) { 0 }
|
448
|
+
|
449
|
+
it_behaves_like 'a runner'
|
450
|
+
end
|
451
|
+
|
452
|
+
describe Raheui::Runner, 'with vowel-basic.aheui' do
|
453
|
+
let(:source) { <<-END }
|
454
|
+
붇희희멍
|
455
|
+
망밦망볿
|
456
|
+
|
457
|
+
ㅏ, ㅓ, ㅗ, ㅜ - 커서를 각각 오른쪽, 왼쪽, 위, 아래로 한 칸 옮깁니다.
|
458
|
+
END
|
459
|
+
|
460
|
+
let(:result) { '369' }
|
461
|
+
let(:exit_code) { 0 }
|
462
|
+
|
463
|
+
it_behaves_like 'a runner'
|
464
|
+
end
|
465
|
+
|
466
|
+
describe Raheui::Runner, 'with vowel-useless.aheui' do
|
467
|
+
# rubocop:disable Metrics/LineLength
|
468
|
+
let(:source) { <<-END }
|
469
|
+
우아앙배벤뱯볩뷜뫙뫵뮝뭥뮁우
|
470
|
+
배맹희맹멩먱몡뮝봘봽붣붠붸어
|
471
|
+
벤멩
|
472
|
+
뱯먱
|
473
|
+
볩몡
|
474
|
+
뷜뮝
|
475
|
+
뫙봘
|
476
|
+
뫵봽
|
477
|
+
묑뵏
|
478
|
+
뭥붠
|
479
|
+
뮁붸
|
480
|
+
아오
|
481
|
+
|
482
|
+
기능 없음: ㅐ ㅔ ㅒ ㅖ ㅘ ㅙ ㅚ ㅝ ㅞ ㅟ (커서가 이동하는 방향은 변하지 않습니다.)
|
483
|
+
END
|
484
|
+
# rubocop:enable Metrics/LineLength
|
485
|
+
|
486
|
+
let(:result) { '54320543205432054320' }
|
487
|
+
let(:exit_code) { 0 }
|
488
|
+
|
489
|
+
it_behaves_like 'a runner'
|
490
|
+
end
|
491
|
+
|
492
|
+
describe Raheui::Runner, 'with vowel-useless2.aheui' do
|
493
|
+
# rubocop:disable Metrics/LineLength
|
494
|
+
let(:source) { <<-END }
|
495
|
+
와아앙배벤뱯볩뷜뫙뫵뮝뭥뮁우
|
496
|
+
배맹희맹멩먱몡뮝봘봽붣붠붸어
|
497
|
+
벤멩
|
498
|
+
뱯먱
|
499
|
+
볩몡
|
500
|
+
뷜뮝
|
501
|
+
뫙봘
|
502
|
+
뫵봽
|
503
|
+
묑뵏
|
504
|
+
뭥붠
|
505
|
+
뮁붸
|
506
|
+
아오
|
507
|
+
|
508
|
+
기능 없음: ㅐ ㅔ ㅒ ㅖ ㅘ ㅙ ㅚ ㅝ ㅞ ㅟ (커서가 이동하는 방향은 변하지 않습니다.)
|
509
|
+
END
|
510
|
+
# rubocop:enable Metrics/LineLength
|
511
|
+
|
512
|
+
let(:result) { '54320543205432054320' }
|
513
|
+
let(:exit_code) { 0 }
|
514
|
+
|
515
|
+
it_behaves_like 'a runner'
|
516
|
+
end
|