raheui 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/yous/raheui.svg?branch=master)](https://travis-ci.org/yous/raheui)
|
5
5
|
[![Dependency Status](https://gemnasium.com/yous/raheui.svg)](https://gemnasium.com/yous/raheui)
|
6
6
|
[![Code Climate](https://codeclimate.com/github/yous/raheui/badges/gpa.svg)](https://codeclimate.com/github/yous/raheui)
|
7
|
-
[![
|
7
|
+
[![codecov.io](http://codecov.io/github/yous/raheui/coverage.svg?branch=master)](http://codecov.io/github/yous/raheui?branch=master)
|
8
8
|
[![Inline docs](http://inch-ci.org/github/yous/raheui.svg?branch=master)](http://inch-ci.org/github/yous/raheui)
|
9
9
|
[![raheui API Documentation](https://www.omniref.com/ruby/gems/raheui.png)](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.
|