raheui 1.0.0
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 +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
|