raheui 1.0.2 → 1.0.3
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/.rubocop_todo.yml +4 -4
- data/.travis.yml +9 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile +1 -1
- data/README.md +2 -2
- data/lib/raheui/port.rb +3 -0
- data/lib/raheui/queue.rb +5 -0
- data/lib/raheui/runner.rb +10 -2
- data/lib/raheui/stack.rb +5 -0
- data/lib/raheui/store.rb +1 -6
- data/lib/raheui/version.rb +1 -1
- data/raheui.gemspec +4 -4
- data/spec/raheui/queue_spec.rb +15 -6
- data/spec/raheui/runner_spec.rb +329 -232
- data/spec/raheui/stack_spec.rb +13 -4
- data/spec/raheui/store_spec.rb +17 -6
- data/spec/spec_helper.rb +2 -2
- data/spec/support/shared_store.rb +2 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6571494ffa6d0da25db0c554d808440c9a31da74
|
4
|
+
data.tar.gz: cc3cf17321e13aa782072f823e8594afb0aefec8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7ebda57cbc85fa2ed88bb1ece9d9f03a5e584f87d175e93854a656952df05be0cc13edaeae9554ed12d5a96c71a1833edf295f955fdc997298d984f81a0d50e
|
7
|
+
data.tar.gz: 6a8698c2de793e0b20d6e6a25dd2ff26651222b22106afccd85454b868cbb9f96c8def0781f0fc49361fe6510144100977c0560517178b55127f8eead4a70c15
|
data/.rubocop_todo.yml
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
-
# on
|
2
|
+
# on 2015-07-24 16:57:26 +0900 using RuboCop version 0.32.1.
|
3
3
|
# The point is for the user to remove these configuration records
|
4
4
|
# one by one as the offenses are removed from the code base.
|
5
5
|
# Note that changes in the inspected code, or installation of new
|
6
6
|
# versions of RuboCop, may require this file to be generated again.
|
7
7
|
|
8
|
-
# Offense count:
|
8
|
+
# Offense count: 2
|
9
9
|
Metrics/AbcSize:
|
10
|
-
Max:
|
10
|
+
Max: 37
|
11
11
|
|
12
12
|
# Offense count: 1
|
13
13
|
# Configuration parameters: CountComments.
|
14
14
|
Metrics/ClassLength:
|
15
|
-
Max:
|
15
|
+
Max: 136
|
16
16
|
|
17
17
|
# Offense count: 1
|
18
18
|
Metrics/CyclomaticComplexity:
|
data/.travis.yml
CHANGED
@@ -1,19 +1,24 @@
|
|
1
1
|
language: ruby
|
2
|
+
sudo: false
|
2
3
|
rvm:
|
3
4
|
- 1.9.3
|
4
5
|
- 2.0.0
|
5
6
|
- 2.1
|
6
7
|
- 2.2
|
7
8
|
- ruby-head
|
8
|
-
- jruby-19mode
|
9
|
-
- jruby-9.0.0.0.pre1
|
10
|
-
- jruby-head
|
11
9
|
- rbx-2
|
12
10
|
matrix:
|
11
|
+
include:
|
12
|
+
- rvm: jruby-19mode
|
13
|
+
env: JRUBY_OPTS="-Xcli.debug=true --debug"
|
14
|
+
- rvm: jruby-9.0.0.0
|
15
|
+
env: JRUBY_OPTS="-Xcli.debug=true --debug"
|
16
|
+
- rvm: jruby-head
|
17
|
+
env: JRUBY_OPTS="-Xcli.debug=true --debug"
|
13
18
|
allow_failures:
|
14
19
|
- rvm: ruby-head
|
15
20
|
- rvm: jruby-19mode
|
16
|
-
- rvm: jruby-9.0.0.0
|
21
|
+
- rvm: jruby-9.0.0.0
|
17
22
|
- rvm: jruby-head
|
18
23
|
- rvm: rbx-2
|
19
24
|
before_install:
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[](https://travis-ci.org/yous/raheui)
|
5
5
|
[](https://gemnasium.com/yous/raheui)
|
6
6
|
[](https://codeclimate.com/github/yous/raheui)
|
7
|
-
[](http://codecov.io/github/yous/raheui?branch=master)
|
8
8
|
[](http://inch-ci.org/github/yous/raheui)
|
9
9
|
[](https://www.omniref.com/ruby/gems/raheui)
|
10
10
|
|
@@ -63,4 +63,4 @@ See [CHANGELOG.md](CHANGELOG.md).
|
|
63
63
|
|
64
64
|
## License
|
65
65
|
|
66
|
-
Copyright (c) 2014 ChaYoung You. See [LICENSE.txt](LICENSE.txt) for details.
|
66
|
+
Copyright (c) 2014-2015 ChaYoung You. See [LICENSE.txt](LICENSE.txt) for details.
|
data/lib/raheui/port.rb
CHANGED
data/lib/raheui/queue.rb
CHANGED
@@ -11,6 +11,11 @@ module Raheui
|
|
11
11
|
@store.shift
|
12
12
|
end
|
13
13
|
|
14
|
+
# Push the first element to Queue.
|
15
|
+
def push_dup
|
16
|
+
@store.unshift(@store.first) if size > 0
|
17
|
+
end
|
18
|
+
|
14
19
|
# Swap the first two elements of Queue.
|
15
20
|
def swap
|
16
21
|
@store[0], @store[1] = @store[1], @store[0] if size > 1
|
data/lib/raheui/runner.rb
CHANGED
@@ -75,7 +75,7 @@ module Raheui
|
|
75
75
|
initial, medial, final = consonants
|
76
76
|
@delta.x, @delta.y = delta(medial)
|
77
77
|
if @selected_store.size < REQUIRED_STORE_SIZE[initial]
|
78
|
-
|
78
|
+
turn
|
79
79
|
else
|
80
80
|
process(initial, final)
|
81
81
|
end
|
@@ -128,7 +128,7 @@ module Raheui
|
|
128
128
|
@selected_store.push(op2 >= op1 ? 1 : 0)
|
129
129
|
when 14 # ㅊ
|
130
130
|
op = @selected_store.pop
|
131
|
-
|
131
|
+
turn if op == 0
|
132
132
|
when 16 # ㅌ
|
133
133
|
operate(:-)
|
134
134
|
when 17 # ㅍ
|
@@ -192,6 +192,14 @@ module Raheui
|
|
192
192
|
@cursor.y = wrap(@cursor.y + @delta.y, @code.height)
|
193
193
|
end
|
194
194
|
|
195
|
+
# Reverse the direction of the cursor.
|
196
|
+
#
|
197
|
+
# Returns nothing.
|
198
|
+
def turn
|
199
|
+
@delta.x = -@delta.x
|
200
|
+
@delta.y = -@delta.y
|
201
|
+
end
|
202
|
+
|
195
203
|
# Wrap a number to be between 0 and max value excluding max value. If the
|
196
204
|
# number is negative, it goes to max - 1. If the number is bigger than or
|
197
205
|
# equal to max value, it goes to zero.
|
data/lib/raheui/stack.rb
CHANGED
@@ -6,6 +6,11 @@ module Raheui
|
|
6
6
|
# Delegates push, pop to @store.
|
7
7
|
delegate [:push, :pop] => :@store
|
8
8
|
|
9
|
+
# Push the last element to Stack.
|
10
|
+
def push_dup
|
11
|
+
push(@store.last) if size > 0
|
12
|
+
end
|
13
|
+
|
9
14
|
# Swap the last two elements of Stack.
|
10
15
|
def swap
|
11
16
|
@store[-1], @store[-2] = @store[-2], @store[-1] if size > 1
|
data/lib/raheui/store.rb
CHANGED
@@ -8,7 +8,7 @@ module Raheui
|
|
8
8
|
class Store
|
9
9
|
extend Forwardable
|
10
10
|
|
11
|
-
BASE_METHODS = [:push, :pop, :swap]
|
11
|
+
BASE_METHODS = [:push, :pop, :push_dup, :swap]
|
12
12
|
private_constant :BASE_METHODS
|
13
13
|
|
14
14
|
# Delegates size to @store.
|
@@ -20,11 +20,6 @@ module Raheui
|
|
20
20
|
@store = []
|
21
21
|
end
|
22
22
|
|
23
|
-
# Push the last element to Store.
|
24
|
-
def push_dup
|
25
|
-
push(@store.last) if size > 0
|
26
|
-
end
|
27
|
-
|
28
23
|
private
|
29
24
|
|
30
25
|
# Check whether base methods are implemented.
|
data/lib/raheui/version.rb
CHANGED
data/raheui.gemspec
CHANGED
@@ -7,7 +7,7 @@ require 'raheui/version'
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = 'raheui'
|
9
9
|
spec.version = Raheui::Version::STRING
|
10
|
-
spec.authors = ['
|
10
|
+
spec.authors = ['Chayoung You']
|
11
11
|
spec.email = ['yousbe@gmail.com']
|
12
12
|
spec.summary = 'Aheui interpreter in Ruby.'
|
13
13
|
spec.description = 'Aheui interpreter in Ruby.'
|
@@ -15,13 +15,13 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.license = 'MIT'
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0")
|
18
|
-
spec.executables = spec.files.grep(
|
19
|
-
spec.test_files = spec.files.grep(
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
22
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
23
23
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
24
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
25
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
25
|
+
spec.add_development_dependency 'rubocop', '~> 0.32.0'
|
26
26
|
spec.add_development_dependency 'simplecov', '~> 0.9'
|
27
27
|
end
|
data/spec/raheui/queue_spec.rb
CHANGED
@@ -81,18 +81,27 @@ describe Raheui::Queue do
|
|
81
81
|
|
82
82
|
before(:example) { subject.push(element) }
|
83
83
|
|
84
|
-
it 'pushes the
|
84
|
+
it 'pushes the first element' do
|
85
85
|
subject.push_dup
|
86
86
|
expect(subject.pop).to be(element)
|
87
87
|
expect(subject.pop).to be(element)
|
88
88
|
end
|
89
|
+
end
|
89
90
|
|
90
|
-
|
91
|
-
|
91
|
+
context 'with more than one element' do
|
92
|
+
let(:one) { rand(10) }
|
93
|
+
let(:two) { rand(10...20) }
|
94
|
+
|
95
|
+
before(:example) do
|
96
|
+
subject.push(one)
|
97
|
+
subject.push(two)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'pushes first pushed element' do
|
92
101
|
subject.push_dup
|
93
|
-
expect(subject.pop).to be(
|
94
|
-
expect(subject.pop).to be(
|
95
|
-
expect(subject.pop).to be(
|
102
|
+
expect(subject.pop).to be(one)
|
103
|
+
expect(subject.pop).to be(one)
|
104
|
+
expect(subject.pop).to be(two)
|
96
105
|
end
|
97
106
|
end
|
98
107
|
end
|
data/spec/raheui/runner_spec.rb
CHANGED
@@ -27,10 +27,10 @@ shared_examples 'a runner' do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
describe
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
describe 'standard specifications' do
|
31
|
+
describe Raheui::Runner, 'with bieup.aheui' do
|
32
|
+
# rubocop:disable Metrics/LineLength
|
33
|
+
let(:source) { <<-END }
|
34
34
|
박반받발밤밥밧밪밫밬밭붚
|
35
35
|
뭉멍멍멍멍멍멍멍멍멍멍멍
|
36
36
|
밖밗밙밚밝밞밟밠밡밢밣밦붔
|
@@ -40,19 +40,19 @@ describe Raheui::Runner, 'with bieup.aheui' do
|
|
40
40
|
희
|
41
41
|
|
42
42
|
ㅂ에 ㅇ받침이 있으면 입력받은 숫자를, ㅎ받침이 있으면 입력받은 문자의 유니코드 코드값을 저장공간에 집어넣습니다. 단, ㅂ의 경우 나머지 받침이 있으면 그 받침을 구성하는 선의 수에 따른 값을 집어넣습니다. 받침이 없으면 0을 집어넣습니다.
|
43
|
-
|
44
|
-
|
43
|
+
END
|
44
|
+
# rubocop:enable Metrics/LineLength
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
let(:inputs) { %w(3 밯) }
|
47
|
+
let(:result) { '4434324453224689979975544481753' }
|
48
|
+
let(:exit_code) { 0 }
|
49
49
|
|
50
|
-
|
51
|
-
end
|
50
|
+
it_behaves_like 'a runner'
|
51
|
+
end
|
52
52
|
|
53
|
-
describe Raheui::Runner, 'with border.aheui' do
|
54
|
-
|
55
|
-
|
53
|
+
describe Raheui::Runner, 'with border.aheui' do
|
54
|
+
# rubocop:disable Metrics/LineLength
|
55
|
+
let(:source) { <<-END }
|
56
56
|
볻 망볿
|
57
57
|
ㅇ ㅇ희
|
58
58
|
멍 붒
|
@@ -60,251 +60,257 @@ describe Raheui::Runner, 'with border.aheui' do
|
|
60
60
|
|
61
61
|
|
62
62
|
표준: 코드 공간의 한 쪽 끝에 다다르면 커서는 반대편 끝으로 이동합니다. 이는 Funge-98의 wrapping algorithm과 동일합니다.
|
63
|
-
|
64
|
-
|
63
|
+
END
|
64
|
+
# rubocop:enable Metrics/LineLength
|
65
65
|
|
66
|
-
|
67
|
-
|
66
|
+
let(:result) { '369' }
|
67
|
+
let(:exit_code) { 0 }
|
68
68
|
|
69
|
-
|
70
|
-
end
|
69
|
+
it_behaves_like 'a runner'
|
70
|
+
end
|
71
71
|
|
72
|
-
describe Raheui::Runner, 'with chieut.aheui' do
|
73
|
-
|
74
|
-
let(:source) { <<-END }
|
72
|
+
describe Raheui::Runner, 'with chieut.aheui' do
|
73
|
+
let(:source) { <<-END }
|
75
74
|
아ㅇㅇ부
|
76
75
|
희멍번처붇
|
77
76
|
ㅇㅇㅇ분멍
|
78
77
|
희멍번차붇
|
79
78
|
ㅇㅇㅇ희멍
|
80
79
|
ㅊ은 조건 명령으로 저장공간에서 값 하나를 뽑아내서 그 값이 0이 아니면 홀소리의 방향대로, 0이면 그 반대 방향대로 갑니다.
|
81
|
-
|
82
|
-
# rubocop:enable Metrics/LineLength
|
80
|
+
END
|
83
81
|
|
84
|
-
|
85
|
-
|
82
|
+
let(:result) { '33' }
|
83
|
+
let(:exit_code) { 0 }
|
86
84
|
|
87
|
-
|
88
|
-
end
|
85
|
+
it_behaves_like 'a runner'
|
86
|
+
end
|
89
87
|
|
90
|
-
describe Raheui::Runner, 'with default-storage.aheui' do
|
91
|
-
|
92
|
-
let(:source) { <<-END }
|
88
|
+
describe Raheui::Runner, 'with default-storage.aheui' do
|
89
|
+
let(:source) { <<-END }
|
93
90
|
밞산바삳바사망희
|
94
91
|
|
95
92
|
처음에 선택되어 있는 스택은 (받침 없음) 스택입니다. (“사” 와 같은 명령으로 선택할 수 있습니다.)
|
96
|
-
|
97
|
-
# rubocop:enable Metrics/LineLength
|
93
|
+
END
|
98
94
|
|
99
|
-
|
100
|
-
|
95
|
+
let(:result) { '9' }
|
96
|
+
let(:exit_code) { 0 }
|
101
97
|
|
102
|
-
|
103
|
-
end
|
98
|
+
it_behaves_like 'a runner'
|
99
|
+
end
|
104
100
|
|
105
|
-
describe Raheui::Runner, 'with digeut.aheui' do
|
106
|
-
|
107
|
-
let(:source) { <<-END }
|
101
|
+
describe Raheui::Runner, 'with digeut.aheui' do
|
102
|
+
let(:source) { <<-END }
|
108
103
|
반받다망희
|
109
104
|
|
110
105
|
ㄷ은 덧셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 둘을 더한 값을 저장공간에 집어넣습니다.
|
111
|
-
|
112
|
-
# rubocop:enable Metrics/LineLength
|
106
|
+
END
|
113
107
|
|
114
|
-
|
115
|
-
|
108
|
+
let(:result) { '5' }
|
109
|
+
let(:exit_code) { 0 }
|
116
110
|
|
117
|
-
|
118
|
-
end
|
111
|
+
it_behaves_like 'a runner'
|
112
|
+
end
|
119
113
|
|
120
|
-
describe Raheui::Runner, 'with exhausted-storage.aheui' do
|
121
|
-
|
122
|
-
|
114
|
+
describe Raheui::Runner, 'with exhausted-storage.aheui' do
|
115
|
+
# rubocop:disable Metrics/LineLength
|
116
|
+
let(:source) { <<-END }
|
123
117
|
아ㅇㅇ우
|
124
118
|
희멍벋망반망희
|
125
119
|
중복 명령을 포함한 모든 뽑아내기를 쓰는 명령에서 저장 공간에 값이 모자랄 경우, 커서는 그 명령을 실행하지 않고 커서가 있는 글자의 홀소리의 반대방향으로 움직입니다.
|
126
|
-
|
127
|
-
|
120
|
+
END
|
121
|
+
# rubocop:enable Metrics/LineLength
|
128
122
|
|
129
|
-
|
130
|
-
|
123
|
+
let(:result) { '3' }
|
124
|
+
let(:exit_code) { 0 }
|
131
125
|
|
132
|
-
|
133
|
-
end
|
126
|
+
it_behaves_like 'a runner'
|
127
|
+
end
|
134
128
|
|
135
|
-
describe Raheui::Runner, 'with exitcode.aheui' do
|
136
|
-
|
137
|
-
let(:source) { <<-END }
|
129
|
+
describe Raheui::Runner, 'with exitcode.aheui' do
|
130
|
+
let(:source) { <<-END }
|
138
131
|
반월회
|
139
132
|
|
140
133
|
ㅎ은 끝냄 명령으로 커서의 실행을 끝냅니다. 이 때 스택에서 맨 위 값을 뽑아서 운영체제에 돌려 줍니다.
|
141
|
-
|
142
|
-
# rubocop:enable Metrics/LineLength
|
134
|
+
END
|
143
135
|
|
144
|
-
|
145
|
-
|
136
|
+
let(:result) { '' }
|
137
|
+
let(:exit_code) { 2 }
|
146
138
|
|
147
|
-
|
148
|
-
end
|
139
|
+
it_behaves_like 'a runner'
|
140
|
+
end
|
149
141
|
|
150
|
-
describe Raheui::Runner, 'with ieunghiheuit.aheui' do
|
151
|
-
|
152
|
-
let(:source) { <<-END }
|
142
|
+
describe Raheui::Runner, 'with ieunghiheuit.aheui' do
|
143
|
+
let(:source) { <<-END }
|
153
144
|
아악안앋압알앗았앜앇헐
|
154
145
|
|
155
146
|
ㅇ은 없음 명령으로 아무 일도 하지 않습니다. * ㅎ은 끝냄 명령으로 커서의 실행을 끝냅니다.
|
156
147
|
사용되지 않는 받침은 모두 무시됩니다.
|
157
|
-
|
158
|
-
# rubocop:enable Metrics/LineLength
|
148
|
+
END
|
159
149
|
|
160
|
-
|
161
|
-
|
150
|
+
let(:result) { '' }
|
151
|
+
let(:exit_code) { 0 }
|
162
152
|
|
163
|
-
|
164
|
-
end
|
153
|
+
it_behaves_like 'a runner'
|
154
|
+
end
|
165
155
|
|
166
|
-
describe Raheui::Runner, 'with jieut.aheui' do
|
167
|
-
|
168
|
-
|
156
|
+
describe Raheui::Runner, 'with jieut.aheui' do
|
157
|
+
# rubocop:disable Metrics/LineLength
|
158
|
+
let(:source) { <<-END }
|
169
159
|
반반자망받반자망반받자망희
|
170
160
|
|
171
161
|
ㅈ은 비교 명령으로 저장공간에서 값 두 개를 뽑아 내서 비교합니다. 나중에 뽑아낸 값이 더 크거나 같으면 1을, 아니면 0을 지금 저장공간에 집어넣습니다.
|
172
|
-
|
173
|
-
|
162
|
+
END
|
163
|
+
# rubocop:enable Metrics/LineLength
|
174
164
|
|
175
|
-
|
176
|
-
|
165
|
+
let(:result) { '110' }
|
166
|
+
let(:exit_code) { 0 }
|
177
167
|
|
178
|
-
|
179
|
-
end
|
168
|
+
it_behaves_like 'a runner'
|
169
|
+
end
|
170
|
+
|
171
|
+
describe Raheui::Runner, 'with loop.aheui' do
|
172
|
+
let(:source) { <<-END }
|
173
|
+
밦밦따빠뚜
|
174
|
+
뿌뚜뻐뚜뻐
|
175
|
+
따ㅇㅇㅇ우
|
176
|
+
ㅇㅇ아ㅇ분
|
177
|
+
ㅇㅇ초뻐터
|
178
|
+
ㅇㅇ망희
|
179
|
+
END
|
180
180
|
|
181
|
-
|
182
|
-
|
183
|
-
|
181
|
+
let(:result) { '0' }
|
182
|
+
let(:exit_code) { 0 }
|
183
|
+
|
184
|
+
it_behaves_like 'a runner'
|
185
|
+
end
|
186
|
+
|
187
|
+
describe Raheui::Runner, 'with mieum.aheui' do
|
188
|
+
# rubocop:disable Metrics/LineLength
|
189
|
+
let(:source) { <<-END }
|
184
190
|
바반받밤발밦밠밣밞망만맘말망맋맠맟망희
|
185
191
|
|
186
192
|
ㅁ에 ㅇ받침이 있으면 저장공간에서 뽑아낸 값을 숫자로, ㅎ받침이 있으면 그 값에 해당하는 유니코드 문자로 출력합니다. 나머지 받침은 뽑아낸 값을 그냥 버립니다.
|
187
|
-
|
188
|
-
|
193
|
+
END
|
194
|
+
# rubocop:enable Metrics/LineLength
|
189
195
|
|
190
|
-
|
191
|
-
|
196
|
+
let(:result) { '950' }
|
197
|
+
let(:exit_code) { 0 }
|
192
198
|
|
193
|
-
|
194
|
-
end
|
199
|
+
it_behaves_like 'a runner'
|
200
|
+
end
|
195
201
|
|
196
|
-
describe Raheui::Runner, 'with nieun.aheui' do
|
197
|
-
|
198
|
-
let(:source) { <<-END }
|
202
|
+
describe Raheui::Runner, 'with nieun.aheui' do
|
203
|
+
let(:source) { <<-END }
|
199
204
|
밟받나망희
|
200
205
|
|
201
206
|
ㄴ은 나눗셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 나눈 값을 저장공간에 집어넣습니다.
|
202
|
-
|
203
|
-
# rubocop:enable Metrics/LineLength
|
207
|
+
END
|
204
208
|
|
205
|
-
|
206
|
-
|
209
|
+
let(:result) { '3' }
|
210
|
+
let(:exit_code) { 0 }
|
207
211
|
|
208
|
-
|
209
|
-
end
|
212
|
+
it_behaves_like 'a runner'
|
213
|
+
end
|
210
214
|
|
211
|
-
describe Raheui::Runner, 'with pieup.aheui' do
|
212
|
-
|
213
|
-
let(:source) { <<-END }
|
215
|
+
describe Raheui::Runner, 'with pieup.aheui' do
|
216
|
+
let(:source) { <<-END }
|
214
217
|
바밟밟땅밝밝땅팡망망우
|
215
218
|
숭ㅇㅇㅇㅇㅇㅇㅇㅇㅇ어
|
216
219
|
밟밟밝밝땅땅바팡망망희
|
217
220
|
|
218
221
|
ㅍ은 바꿔치기 명령입니다. 지금 저장공간이 스택이라면 맨 위 값과 그 바로 아래 값을, 큐라면 맨 앞의 값과 그 바로 뒤 값을 바꿉니다.
|
219
|
-
|
220
|
-
# rubocop:enable Metrics/LineLength
|
222
|
+
END
|
221
223
|
|
222
|
-
|
223
|
-
|
224
|
+
let(:result) { '81494981' }
|
225
|
+
let(:exit_code) { 0 }
|
224
226
|
|
225
|
-
|
226
|
-
end
|
227
|
+
it_behaves_like 'a runner'
|
228
|
+
end
|
227
229
|
|
228
|
-
describe Raheui::Runner, 'with print.aheui' do
|
229
|
-
|
230
|
-
let(:source) { <<-END }
|
230
|
+
describe Raheui::Runner, 'with print.aheui' do
|
231
|
+
let(:source) { <<-END }
|
231
232
|
밞밞반다따반타뭉
|
232
233
|
ㅇㅇㅇㅇㅇㅇㅇ밞밞반다따반타맣희
|
233
234
|
|
234
235
|
ㅁ에 ㅇ받침이 있으면 저장공간에서 뽑아낸 값을 숫자로, ㅎ받침이 있으면 그 값에 해당하는 유니코드 문자로 출력합니다.
|
235
|
-
|
236
|
-
# rubocop:enable Metrics/LineLength
|
236
|
+
END
|
237
237
|
|
238
|
-
|
239
|
-
|
238
|
+
let(:result) { '97a' }
|
239
|
+
let(:exit_code) { 0 }
|
240
240
|
|
241
|
-
|
242
|
-
end
|
241
|
+
it_behaves_like 'a runner'
|
242
|
+
end
|
243
|
+
|
244
|
+
describe Raheui::Runner, 'with queue.aheui' do
|
245
|
+
let(:source) { <<-END }
|
246
|
+
상반받뱔우망이
|
247
|
+
뭉뻐벋번성
|
248
|
+
망망희
|
249
|
+
END
|
243
250
|
|
244
|
-
|
245
|
-
|
246
|
-
|
251
|
+
let(:result) { '235223' }
|
252
|
+
let(:exit_code) { 0 }
|
253
|
+
|
254
|
+
it_behaves_like 'a runner'
|
255
|
+
end
|
256
|
+
|
257
|
+
describe Raheui::Runner, 'with rieul.aheui' do
|
258
|
+
let(:source) { <<-END }
|
247
259
|
밟발라망희
|
248
260
|
|
249
261
|
ㄹ은 나머지 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 나눈 나머지를 저장공간에 집어넣습니다.
|
250
|
-
|
251
|
-
# rubocop:enable Metrics/LineLength
|
262
|
+
END
|
252
263
|
|
253
|
-
|
254
|
-
|
264
|
+
let(:result) { '4' }
|
265
|
+
let(:exit_code) { 0 }
|
255
266
|
|
256
|
-
|
257
|
-
end
|
267
|
+
it_behaves_like 'a runner'
|
268
|
+
end
|
258
269
|
|
259
|
-
describe Raheui::Runner, 'with shebang.aheui' do
|
260
|
-
|
261
|
-
|
270
|
+
describe Raheui::Runner, 'with shebang.aheui' do
|
271
|
+
# rubocop:disable Metrics/LineLength
|
272
|
+
let(:source) { <<-END }
|
262
273
|
#!/usr/bin/env aheui
|
263
274
|
반망희
|
264
275
|
|
265
276
|
표준: 커서는 코드 공간의 맨 첫 줄 맨 첫번째 칸에서 시작합니다. 맨 처음에 홀소리가 없을 경우 커서는 기본값으로 아랫쪽으로 이동하는데, 이는 #!과 호환시키기 위한 것으로, 기본 방향이 오른쪽인 funge와는 다른 점입니다.
|
266
|
-
|
267
|
-
|
277
|
+
END
|
278
|
+
# rubocop:enable Metrics/LineLength
|
268
279
|
|
269
|
-
|
270
|
-
|
280
|
+
let(:result) { '2' }
|
281
|
+
let(:exit_code) { 0 }
|
271
282
|
|
272
|
-
|
273
|
-
end
|
283
|
+
it_behaves_like 'a runner'
|
284
|
+
end
|
274
285
|
|
275
|
-
describe Raheui::Runner, 'with ssangbieup.aheui' do
|
276
|
-
|
277
|
-
let(:source) { <<-END }
|
286
|
+
describe Raheui::Runner, 'with ssangbieup.aheui' do
|
287
|
+
let(:source) { <<-END }
|
278
288
|
밟밟땅빵망망희
|
279
289
|
|
280
290
|
ㅃ은 중복 명령입니다. 지금 저장공간이 스택이라면 맨 위의 값을 그 값 위에 하나 더 집어넣고, 큐라면 맨 앞의 값을 앞에 하나 더 덧붙입니다.
|
281
|
-
|
282
|
-
# rubocop:enable Metrics/LineLength
|
291
|
+
END
|
283
292
|
|
284
|
-
|
285
|
-
|
293
|
+
let(:result) { '8181' }
|
294
|
+
let(:exit_code) { 0 }
|
286
295
|
|
287
|
-
|
288
|
-
end
|
296
|
+
it_behaves_like 'a runner'
|
297
|
+
end
|
289
298
|
|
290
|
-
describe Raheui::Runner, 'with ssangdigeut.aheui' do
|
291
|
-
|
292
|
-
let(:source) { <<-END }
|
299
|
+
describe Raheui::Runner, 'with ssangdigeut.aheui' do
|
300
|
+
let(:source) { <<-END }
|
293
301
|
발밞따망희
|
294
302
|
|
295
303
|
ㄸ은 곱셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 둘을 곱한 값을 저장공간에 집어넣습니다.
|
296
|
-
|
297
|
-
# rubocop:enable Metrics/LineLength
|
304
|
+
END
|
298
305
|
|
299
|
-
|
300
|
-
|
306
|
+
let(:result) { '45' }
|
307
|
+
let(:exit_code) { 0 }
|
301
308
|
|
302
|
-
|
303
|
-
end
|
309
|
+
it_behaves_like 'a runner'
|
310
|
+
end
|
304
311
|
|
305
|
-
describe Raheui::Runner, 'with ssangsiot.aheui' do
|
306
|
-
|
307
|
-
let(:source) { <<-END }
|
312
|
+
describe Raheui::Runner, 'with ssangsiot.aheui' do
|
313
|
+
let(:source) { <<-END }
|
308
314
|
아바싹반싼받싿우
|
309
315
|
우멍석멍선멍섣어
|
310
316
|
아바쌀반쌈받쌉우
|
@@ -325,18 +331,17 @@ describe Raheui::Runner, 'with ssangsiot.aheui' do
|
|
325
331
|
희멍섮멍섰멍서어
|
326
332
|
|
327
333
|
ㅆ은 이동 명령으로 저장공간에서 값 하나를 뽑아내서 받침이 나타내는 저장공간에 그 값을 집어 넣습니다.
|
328
|
-
|
329
|
-
# rubocop:enable Metrics/LineLength
|
334
|
+
END
|
330
335
|
|
331
|
-
|
332
|
-
|
336
|
+
let(:result) { '320320320320320320320320320' }
|
337
|
+
let(:exit_code) { 0 }
|
333
338
|
|
334
|
-
|
335
|
-
end
|
339
|
+
it_behaves_like 'a runner'
|
340
|
+
end
|
336
341
|
|
337
|
-
describe Raheui::Runner, 'with storage.aheui' do
|
338
|
-
|
339
|
-
|
342
|
+
describe Raheui::Runner, 'with storage.aheui' do
|
343
|
+
# rubocop:disable Metrics/LineLength
|
344
|
+
let(:source) { <<-END }
|
340
345
|
바반받뭉
|
341
346
|
우석멍멍
|
342
347
|
바반받뭉
|
@@ -369,64 +374,65 @@ describe Raheui::Runner, 'with storage.aheui' do
|
|
369
374
|
아희에서 쓰이는 저장 공간은 여러 개가 있습니다. 대부분이 스택이고, 큐가 하나 있습니다.
|
370
375
|
ㅁ은 뽑기 명령입니다. 지금 저장공간이 스택이라면 맨 위의 값, 큐라면 맨 앞의 값을 뽑아냅니다.(pop) 통로라면 거기서 값을 하나 뽑아옵니다. ㅁ 명령에는 받침이 올 수 있는데, 이에 대한 설명은 아래에 있습니다.
|
371
376
|
ㅁ에 ㅇ받침이 있으면 저장공간에서 뽑아낸 값을 숫자로, ㅎ받침이 있으면 그 값에 해당하는 유니코드 문자로 출력합니다.
|
372
|
-
|
373
|
-
|
377
|
+
END
|
378
|
+
# rubocop:enable Metrics/LineLength
|
374
379
|
|
375
|
-
|
376
|
-
|
380
|
+
let(:result) { '320320320320320320320320023320320320320320' }
|
381
|
+
let(:exit_code) { 0 }
|
377
382
|
|
378
|
-
|
379
|
-
end
|
383
|
+
it_behaves_like 'a runner'
|
384
|
+
end
|
380
385
|
|
381
|
-
describe Raheui::Runner, 'with syllable.aheui' do
|
382
|
-
|
383
|
-
|
386
|
+
describe Raheui::Runner, 'with syllable.aheui' do
|
387
|
+
# rubocop:disable Metrics/LineLength
|
388
|
+
let(:source) { <<-END }
|
384
389
|
ㅏ희ㅣㅊㅓ
|
385
390
|
뱓ㅗㅈㅊ몽
|
386
391
|
ㅂㅁㅎㅣ헥
|
387
392
|
|
388
393
|
코드는 한글로만 이루어지는데, 여기서 한글은 유니코드 U+AC00에서 U+D7A3까지의 범위에 있는 글자(hangul syllable 영역)를 말합니다. 그 밖의 글자나 코드에서 지정하지 않은 나머지 공간은 모두 빈 칸으로 처리되어 커서가 이동하는 방향에 아무 영향을 주지 않습니다.
|
389
|
-
|
390
|
-
|
394
|
+
END
|
395
|
+
# rubocop:enable Metrics/LineLength
|
391
396
|
|
392
|
-
|
393
|
-
|
397
|
+
let(:result) { '3' }
|
398
|
+
let(:exit_code) { 0 }
|
394
399
|
|
395
|
-
|
396
|
-
end
|
400
|
+
it_behaves_like 'a runner'
|
401
|
+
end
|
397
402
|
|
398
|
-
describe Raheui::Runner, 'with tieut.aheui' do
|
399
|
-
|
400
|
-
let(:source) { <<-END }
|
403
|
+
describe Raheui::Runner, 'with tieut.aheui' do
|
404
|
+
let(:source) { <<-END }
|
401
405
|
받반타망희
|
402
406
|
|
403
407
|
ㅌ은 뺄셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 뺀 값을 저장공간에 집어넣습니다.
|
404
|
-
|
405
|
-
# rubocop:enable Metrics/LineLength
|
408
|
+
END
|
406
409
|
|
407
|
-
|
408
|
-
|
410
|
+
let(:result) { '1' }
|
411
|
+
let(:exit_code) { 0 }
|
409
412
|
|
410
|
-
|
411
|
-
end
|
413
|
+
it_behaves_like 'a runner'
|
414
|
+
end
|
412
415
|
|
413
|
-
describe Raheui::Runner, 'with vowel-2step.aheui' do
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
416
|
+
describe Raheui::Runner, 'with vowel-2step.aheui' do
|
417
|
+
# rubocop:disable Metrics/LineLength
|
418
|
+
let(:source) { <<-END }
|
419
|
+
뷷우희어밍우여
|
420
|
+
아아아아아아아반받망희
|
421
|
+
먕오뱞오뱗오뵬
|
418
422
|
|
419
423
|
ㅑ, ㅕ, ㅛ, ㅠ - 커서를 각각 오른쪽, 왼쪽, 위, 아래로 두 칸 옮깁니다.
|
420
|
-
|
424
|
+
중복 명령을 포함한 모든 뽑아내기를 쓰는 명령에서 저장 공간에 값이 모자랄 경우, 커서는 그 명령을 실행하지 않고 커서가 있는 글자의 홀소리의 반대방향으로 움직입니다.
|
425
|
+
END
|
426
|
+
# rubocop:enable Metrics/LineLength
|
421
427
|
|
422
|
-
|
423
|
-
|
428
|
+
let(:result) { '3596' }
|
429
|
+
let(:exit_code) { 0 }
|
424
430
|
|
425
|
-
|
426
|
-
end
|
431
|
+
it_behaves_like 'a runner'
|
432
|
+
end
|
427
433
|
|
428
|
-
describe Raheui::Runner, 'with vowel-advanced.aheui' do
|
429
|
-
|
434
|
+
describe Raheui::Runner, 'with vowel-advanced.aheui' do
|
435
|
+
let(:source) { <<-END }
|
430
436
|
반븓븝불
|
431
437
|
우멍벎망이밟망희
|
432
438
|
빈
|
@@ -440,31 +446,30 @@ describe Raheui::Runner, 'with vowel-advanced.aheui' do
|
|
440
446
|
ㅡ - 커서가 가로로 왔으면 그 방향대로, 세로로 왔으면 전에 있던 자리로 옮깁니다.
|
441
447
|
ㅣ - 커서가 세로로 왔으면 그 방향대로, 가로로 왔으면 전에 있던 자리로 옮깁니다.
|
442
448
|
ㅢ - 커서를 전에 있던 자리로 옮깁니다.
|
443
|
-
|
449
|
+
END
|
444
450
|
|
445
|
-
|
446
|
-
|
451
|
+
let(:result) { '543295432954329' }
|
452
|
+
let(:exit_code) { 0 }
|
447
453
|
|
448
|
-
|
449
|
-
end
|
454
|
+
it_behaves_like 'a runner'
|
455
|
+
end
|
450
456
|
|
451
|
-
describe Raheui::Runner, 'with vowel-basic.aheui' do
|
452
|
-
|
457
|
+
describe Raheui::Runner, 'with vowel-basic.aheui' do
|
458
|
+
let(:source) { <<-END }
|
453
459
|
붇희희멍
|
454
460
|
망밦망볿
|
455
461
|
|
456
462
|
ㅏ, ㅓ, ㅗ, ㅜ - 커서를 각각 오른쪽, 왼쪽, 위, 아래로 한 칸 옮깁니다.
|
457
|
-
|
463
|
+
END
|
458
464
|
|
459
|
-
|
460
|
-
|
465
|
+
let(:result) { '369' }
|
466
|
+
let(:exit_code) { 0 }
|
461
467
|
|
462
|
-
|
463
|
-
end
|
468
|
+
it_behaves_like 'a runner'
|
469
|
+
end
|
464
470
|
|
465
|
-
describe Raheui::Runner, 'with vowel-useless.aheui' do
|
466
|
-
|
467
|
-
let(:source) { <<-END }
|
471
|
+
describe Raheui::Runner, 'with vowel-useless.aheui' do
|
472
|
+
let(:source) { <<-END }
|
468
473
|
우아앙배벤뱯볩뷜뫙뫵뮝뭥뮁우
|
469
474
|
배맹희맹멩먱몡뮝봘봽붣붠붸어
|
470
475
|
벤멩
|
@@ -479,18 +484,16 @@ describe Raheui::Runner, 'with vowel-useless.aheui' do
|
|
479
484
|
아오
|
480
485
|
|
481
486
|
기능 없음: ㅐ ㅔ ㅒ ㅖ ㅘ ㅙ ㅚ ㅝ ㅞ ㅟ (커서가 이동하는 방향은 변하지 않습니다.)
|
482
|
-
|
483
|
-
# rubocop:enable Metrics/LineLength
|
487
|
+
END
|
484
488
|
|
485
|
-
|
486
|
-
|
489
|
+
let(:result) { '54320543205432054320' }
|
490
|
+
let(:exit_code) { 0 }
|
487
491
|
|
488
|
-
|
489
|
-
end
|
492
|
+
it_behaves_like 'a runner'
|
493
|
+
end
|
490
494
|
|
491
|
-
describe Raheui::Runner, 'with vowel-useless2.aheui' do
|
492
|
-
|
493
|
-
let(:source) { <<-END }
|
495
|
+
describe Raheui::Runner, 'with vowel-useless2.aheui' do
|
496
|
+
let(:source) { <<-END }
|
494
497
|
와아앙배벤뱯볩뷜뫙뫵뮝뭥뮁우
|
495
498
|
배맹희맹멩먱몡뮝봘봽붣붠붸어
|
496
499
|
벤멩
|
@@ -505,11 +508,105 @@ describe Raheui::Runner, 'with vowel-useless2.aheui' do
|
|
505
508
|
아오
|
506
509
|
|
507
510
|
기능 없음: ㅐ ㅔ ㅒ ㅖ ㅘ ㅙ ㅚ ㅝ ㅞ ㅟ (커서가 이동하는 방향은 변하지 않습니다.)
|
508
|
-
|
509
|
-
|
511
|
+
END
|
512
|
+
|
513
|
+
let(:result) { '54320543205432054320' }
|
514
|
+
let(:exit_code) { 0 }
|
515
|
+
|
516
|
+
it_behaves_like 'a runner'
|
517
|
+
end
|
518
|
+
end
|
519
|
+
|
520
|
+
describe 'undefined specifications' do
|
521
|
+
describe Raheui::Runner, 'with 2steps.aheui' do
|
522
|
+
# rubocop:disable Metrics/LineLength
|
523
|
+
let(:source) { <<-END }
|
524
|
+
야ㅇ븐븐븓븓야이멍희
|
525
|
+
|
526
|
+
ㅡ - 커서가 가로로 왔으면 그 방향대로, 세로로 왔으면 전에 있던 자리로 옮깁니다.
|
527
|
+
기능 없음: ㅐ ㅔ ㅒ ㅖ ㅘ ㅙ ㅚ ㅝ ㅞ ㅟ (커서가 이동하는 방향은 변하지 않습니다.)
|
528
|
+
|
529
|
+
해설: 2칸 이동 후 다음 이동에 관해 방향은 정의되어 있지만 이동 간격을 유지하는지는 정의되어 있지 않습니다. 유지하는 경우 32가 나옵니다. 유지하지 않는 경우 무슨 동작을 할 지 짐작도 안되니 유지하는 편을 권장합니다.
|
530
|
+
END
|
531
|
+
# rubocop:enable Metrics/LineLength
|
532
|
+
|
533
|
+
let(:result) { '32' }
|
534
|
+
let(:exit_code) { 0 }
|
535
|
+
|
536
|
+
it_behaves_like 'a runner'
|
537
|
+
end
|
538
|
+
|
539
|
+
xdescribe Raheui::Runner, 'with bieup.aheui' do
|
540
|
+
let(:source) { <<-END }
|
541
|
+
밯이
|
542
|
+
|
543
|
+
ㅂ도 마찬가지로 ㅇ받침이 있으면 입력받은 숫자를, ㅎ받침이 있으면 입력받은 문자의 유니코드 코드값을 저장공간에 집어넣습니다.
|
510
544
|
|
511
|
-
|
512
|
-
|
545
|
+
해설: EOF를 만나거나 ㅇ 받침에 숫자로 해석할 수 없는 값이 들어올 경우의 동작이 정의되지 않았습니다. 권장 구현은 없습니다.
|
546
|
+
END
|
547
|
+
end
|
548
|
+
|
549
|
+
xdescribe Raheui::Runner, 'with boundary.aheui' do
|
550
|
+
# rubocop:disable Metrics/LineLength
|
551
|
+
let(:source) { <<-END }
|
552
|
+
아아아아아우
|
553
|
+
바야희망희야
|
554
|
+
|
555
|
+
코드 공간의 한 쪽 끝에 다다르면 커서는 반대편 끝으로 이동합니다. 이는 Funge-98의 wrapping algorithm과 동일합니다.
|
556
|
+
|
557
|
+
해설: Funge-98에는 2칸씩 이동하는 경우가 없으므로 줄끝에 '야'가 온 경우 '바'로 이동할지 '야'로 이동할지 불명확합니다. 2칸 이동을 하나의 이동으로 볼 경우 한 쪽 끝에 다다랐으므로 '바'로 이동합니다. 2칸 이동을 2개의 1칸 이동으로 볼 경우 한 쪽 끝에 다다라 '바'로 이동 후 한번 더 이동해 '야'로 이동합니다. 어느 쪽도 합리적인 해석이고 불이익을 판단하기 어려우므로 권장 구현은 없습니다.
|
558
|
+
END
|
559
|
+
# rubocop:enable Metrics/LineLength
|
560
|
+
end
|
561
|
+
|
562
|
+
describe Raheui::Runner, 'with chieut.aheui' do
|
563
|
+
let(:source) { <<-END }
|
564
|
+
반쵕반망희
|
565
|
+
|
566
|
+
ㅊ은 조건 명령으로 저장공간에서 값 하나를 뽑아내서 그 값이 0이 아니면 홀소리의 방향대로, 0이면 그 반대 방향대로 갑니다.
|
567
|
+
|
568
|
+
해설: 방향 없는 홀소리가 나왔을 때의 동작이 정의되지 않았습니다. 경로 유지 외에는 추측 가능한 동작이 없으므로 경로 유지를 권장합니다.
|
569
|
+
END
|
570
|
+
|
571
|
+
let(:result) { '2' }
|
572
|
+
let(:exit_code) { 0 }
|
573
|
+
|
574
|
+
it_behaves_like 'a runner'
|
575
|
+
end
|
513
576
|
|
514
|
-
|
577
|
+
describe Raheui::Runner, 'with emptyswap.aheui' do
|
578
|
+
# rubocop:disable Metrics/LineLength
|
579
|
+
let(:source) { <<-END }
|
580
|
+
뱐희파반망희
|
581
|
+
|
582
|
+
중복 명령을 포함한 모든 뽑아내기를 쓰는 명령에서 저장 공간에 값이 모자랄 경우, 커서는 그 명령을 실행하지 않고 커서가 있는 글자의 홀소리의 반대방향으로 움직입니다.
|
583
|
+
ㅍ은 바꿔치기 명령입니다. 지금 저장공간이 스택이라면 맨 위 값과 그 바로 아래 값을, 큐라면 맨 앞의 값과 그 바로 뒤 값을 바꿉니다. (통로라면?)
|
584
|
+
|
585
|
+
해설: 중복을 별도로 명시하고 있다는 점에서 큐에서 뽑기와 동작이 다른 경우 뽑기 동작으로 취급하지 않음을 알 수 있습니다. 큐의 바꿔치기도 역시 뽑기로는 구현이 불가능하므로 뽑아내기가 들어가는 명령이 아닌 것으로 추측되지만, 그 경우 동작은 정의되지 않으므로 반대로 가는 편을 권장합니다.
|
586
|
+
END
|
587
|
+
# rubocop:enable Metrics/LineLength
|
588
|
+
|
589
|
+
let(:result) { '' }
|
590
|
+
let(:exit_code) { 2 }
|
591
|
+
|
592
|
+
it_behaves_like 'a runner'
|
593
|
+
end
|
594
|
+
|
595
|
+
describe Raheui::Runner, 'with hieut-pop.aheui' do
|
596
|
+
# rubocop:disable Metrics/LineLength
|
597
|
+
let(:source) { <<-END }
|
598
|
+
하멍번버
|
599
|
+
|
600
|
+
- 조건1: ㅎ은 끝냄 명령으로 커서의 실행을 끝냅니다. 이 때 스택에서 맨 위 값을 뽑아서 운영체제에 돌려 줍니다.
|
601
|
+
- 조건2: 중복 명령을 포함한 모든 뽑아내기를 쓰는 명령에서 저장 공간에 값이 모자랄 경우, 커서는 그 명령을 실행하지 않고 커서가 있는 글자의 홀소리의 반대방향으로 움직입니다.
|
602
|
+
|
603
|
+
- 해설: 스택이 차 있을 경우 조건2에 의해 ㅎ은 프로그램을 종료하지 못하고 2를 출력 후 종료해야 합니다. 하지만 대부분의 구현체는 이 경우 프로그램을 종료합니다.
|
604
|
+
END
|
605
|
+
# rubocop:enable Metrics/LineLength
|
606
|
+
|
607
|
+
let(:result) { '' }
|
608
|
+
let(:exit_code) { 0 }
|
609
|
+
|
610
|
+
it_behaves_like 'a runner'
|
611
|
+
end
|
515
612
|
end
|
data/spec/raheui/stack_spec.rb
CHANGED
@@ -83,13 +83,22 @@ describe Raheui::Stack do
|
|
83
83
|
expect(subject.pop).to be(element)
|
84
84
|
expect(subject.pop).to be(element)
|
85
85
|
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'with more than one element' do
|
89
|
+
let(:one) { rand(10) }
|
90
|
+
let(:two) { rand(10...20) }
|
91
|
+
|
92
|
+
before(:example) do
|
93
|
+
subject.push(one)
|
94
|
+
subject.push(two)
|
95
|
+
end
|
86
96
|
|
87
97
|
it 'pushes last pushed element' do
|
88
|
-
subject.push(42)
|
89
98
|
subject.push_dup
|
90
|
-
expect(subject.pop).to be(
|
91
|
-
expect(subject.pop).to be(
|
92
|
-
expect(subject.pop).to be(
|
99
|
+
expect(subject.pop).to be(two)
|
100
|
+
expect(subject.pop).to be(two)
|
101
|
+
expect(subject.pop).to be(one)
|
93
102
|
end
|
94
103
|
end
|
95
104
|
end
|
data/spec/raheui/store_spec.rb
CHANGED
@@ -39,6 +39,20 @@ describe Raheui::Store do
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
context 'with implemented push_dup' do
|
43
|
+
let(:methods) { base_methods - [:push_dup] }
|
44
|
+
|
45
|
+
before(:context) { Raheui::Store.class_eval { def push_dup; end } }
|
46
|
+
after(:context) { Raheui::Store.class_eval { remove_method :push_dup } }
|
47
|
+
|
48
|
+
it 'raises NotImplementedError' do
|
49
|
+
expect(base_methods - methods).to contain_exactly(:push_dup)
|
50
|
+
expect { subject }
|
51
|
+
.to raise_error(NotImplementedError,
|
52
|
+
format(error_msg, methods.join(', ')))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
42
56
|
context 'with implemented swap' do
|
43
57
|
let(:methods) { base_methods - [:swap] }
|
44
58
|
|
@@ -60,6 +74,8 @@ describe Raheui::Store do
|
|
60
74
|
|
61
75
|
def pop; end
|
62
76
|
|
77
|
+
def push_dup; end
|
78
|
+
|
63
79
|
def swap; end
|
64
80
|
end
|
65
81
|
end
|
@@ -68,6 +84,7 @@ describe Raheui::Store do
|
|
68
84
|
Raheui::Store.class_eval do
|
69
85
|
remove_method :push
|
70
86
|
remove_method :pop
|
87
|
+
remove_method :push_dup
|
71
88
|
remove_method :swap
|
72
89
|
end
|
73
90
|
end
|
@@ -83,10 +100,4 @@ describe Raheui::Store do
|
|
83
100
|
expect(Raheui::Store.instance_methods(false)).to include(:size)
|
84
101
|
end
|
85
102
|
end
|
86
|
-
|
87
|
-
describe '#push_dup' do
|
88
|
-
it 'should respond to #push_dup' do
|
89
|
-
expect(Raheui::Store.instance_methods(false)).to include(:push_dup)
|
90
|
-
end
|
91
|
-
end
|
92
103
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raheui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Chayoung You
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.32.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: 0.32.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: simplecov
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
150
|
version: '0'
|
151
151
|
requirements: []
|
152
152
|
rubyforge_project:
|
153
|
-
rubygems_version: 2.4.
|
153
|
+
rubygems_version: 2.4.8
|
154
154
|
signing_key:
|
155
155
|
specification_version: 4
|
156
156
|
summary: Aheui interpreter in Ruby.
|