gobstones 0.0.3 → 0.0.4
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.yml +99 -3
- data/.rubocop_todo.yml +1 -56
- data/.tool-versions +1 -1
- data/.travis.yml +7 -1
- data/CHANGELOG +12 -0
- data/Gemfile.lock +25 -20
- data/gobstones.gemspec +2 -2
- data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +1 -1
- data/lib/gobstones/lang/expressions/type_bound_functions.rb +6 -6
- data/lib/gobstones/lang/literals/literal.rb +1 -1
- data/lib/gobstones/lang/program.rb +9 -4
- data/lib/gobstones/parser/ast/ast.rb +17 -17
- data/lib/gobstones/parser/treetop_parser.rb +1 -1
- data/lib/gobstones/runner/execution_context.rb +4 -18
- data/spec/lang/expressions/arithmetic_expressions_spec.rb +18 -16
- data/spec/lang/expressions/boolean_expressions_spec.rb +1 -1
- data/spec/lang/expressions/comparison_expressions_spec.rb +74 -72
- data/spec/lang/expressions/enclosed_by_parens_expression_spec.rb +1 -1
- data/spec/lang/expressions/type_bound_functions_spec.rb +8 -6
- data/spec/lang/literals/boolean_spec.rb +4 -2
- data/spec/lang/literals/color_spec.rb +2 -1
- data/spec/lang/literals/direction_spec.rb +2 -1
- data/spec/lang/literals/number_spec.rb +3 -1
- data/spec/runner/head_spec.rb +2 -2
- data/spec/support/gobstones_lang_test_objects.rb +5 -1
- metadata +6 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1c8dd13b8a2733083eee3caa5696205ff1344db515b9f435eba542169296bc68
|
|
4
|
+
data.tar.gz: c093483120c87722d6131560d38a7e264de4215f688e45aa1ca4f5ef3c9fd137
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 810ded51d3f5612a7bb3c7490b3845cc5133ab62fdb996feda5b587dea4e864da16e2c9db9d349aa530ca031bd20bcd33cdbabc53be9e34508b3c54c7ef51d70
|
|
7
|
+
data.tar.gz: b744b92d9d7e947ba49eb5ef799ad01a144edfcbe089851f2dc4ac5e08918ebf9aa8b89f2c7a8db5319a21e44b438d5af5963563c16973a99ec8ca1797cd5872
|
data/.rubocop.yml
CHANGED
|
@@ -5,10 +5,13 @@ require:
|
|
|
5
5
|
- test_prof/rubocop
|
|
6
6
|
|
|
7
7
|
AllCops:
|
|
8
|
-
TargetRubyVersion: 2.
|
|
8
|
+
TargetRubyVersion: 2.7.1
|
|
9
9
|
Exclude:
|
|
10
10
|
- 'db/**/*'
|
|
11
11
|
|
|
12
|
+
Naming/VariableNumber:
|
|
13
|
+
EnforcedStyle: snake_case
|
|
14
|
+
|
|
12
15
|
# revisit this once Ruby 3 is out
|
|
13
16
|
Style/FrozenStringLiteralComment:
|
|
14
17
|
Enabled: false
|
|
@@ -40,6 +43,11 @@ Style/CollectionMethods:
|
|
|
40
43
|
detect: 'detect'
|
|
41
44
|
find_all: 'select'
|
|
42
45
|
|
|
46
|
+
Style/MixinUsage:
|
|
47
|
+
Exclude:
|
|
48
|
+
- 'lib/gobstones/cli/runner.rb'
|
|
49
|
+
- 'spec/spec_helper.rb'
|
|
50
|
+
|
|
43
51
|
Style/WordArray:
|
|
44
52
|
MinSize: 3
|
|
45
53
|
|
|
@@ -115,14 +123,33 @@ Layout/TrailingWhitespace:
|
|
|
115
123
|
Exclude:
|
|
116
124
|
- 'spec/parser/treetop_parser_spec.rb'
|
|
117
125
|
|
|
118
|
-
|
|
126
|
+
Naming/MethodParameterName:
|
|
119
127
|
Enabled: true
|
|
128
|
+
AllowedNames: on, x, y
|
|
129
|
+
|
|
130
|
+
Metrics/ParameterLists:
|
|
131
|
+
Max: 6
|
|
132
|
+
|
|
133
|
+
Metrics/AbcSize:
|
|
134
|
+
Max: 20
|
|
135
|
+
|
|
136
|
+
RSpec/AggregateExamples:
|
|
137
|
+
Enabled: false # Rule is broken in 2.7, and rubocop 0.88
|
|
120
138
|
Include:
|
|
121
139
|
- 'spec/**/*.rb'
|
|
122
140
|
|
|
141
|
+
RSpec/FilePath:
|
|
142
|
+
Enabled: false
|
|
143
|
+
|
|
144
|
+
RSpec/DescribeMethod:
|
|
145
|
+
Enabled: false
|
|
146
|
+
|
|
123
147
|
RSpec/DescribeClass:
|
|
124
148
|
Enabled: false
|
|
125
149
|
|
|
150
|
+
RSpec/ContextWording:
|
|
151
|
+
Enabled: true
|
|
152
|
+
|
|
126
153
|
RSpec/ExpectActual:
|
|
127
154
|
Enabled: false
|
|
128
155
|
|
|
@@ -130,4 +157,73 @@ RSpec/MultipleExpectations:
|
|
|
130
157
|
Max: 5
|
|
131
158
|
|
|
132
159
|
RSpec/ExampleLength:
|
|
133
|
-
Max:
|
|
160
|
+
Max: 13
|
|
161
|
+
|
|
162
|
+
Layout/EmptyLinesAroundAttributeAccessor:
|
|
163
|
+
Enabled: true
|
|
164
|
+
|
|
165
|
+
Layout/SpaceAroundMethodCallOperator:
|
|
166
|
+
Enabled: true
|
|
167
|
+
|
|
168
|
+
Lint/DeprecatedOpenSSLConstant:
|
|
169
|
+
Enabled: true
|
|
170
|
+
|
|
171
|
+
Lint/DuplicateElsifCondition:
|
|
172
|
+
Enabled: true
|
|
173
|
+
|
|
174
|
+
Lint/MixedRegexpCaptureTypes:
|
|
175
|
+
Enabled: true
|
|
176
|
+
|
|
177
|
+
Lint/RaiseException:
|
|
178
|
+
Enabled: true
|
|
179
|
+
|
|
180
|
+
Lint/StructNewOverride:
|
|
181
|
+
Enabled: true
|
|
182
|
+
|
|
183
|
+
Style/AccessorGrouping:
|
|
184
|
+
Enabled: true
|
|
185
|
+
|
|
186
|
+
Style/ArrayCoercion:
|
|
187
|
+
Enabled: true
|
|
188
|
+
|
|
189
|
+
Style/BisectedAttrAccessor:
|
|
190
|
+
Enabled: true
|
|
191
|
+
|
|
192
|
+
Style/CaseLikeIf:
|
|
193
|
+
Enabled: true
|
|
194
|
+
|
|
195
|
+
Style/ExponentialNotation:
|
|
196
|
+
Enabled: true
|
|
197
|
+
|
|
198
|
+
Style/HashAsLastArrayItem:
|
|
199
|
+
Enabled: true
|
|
200
|
+
|
|
201
|
+
Style/HashEachMethods:
|
|
202
|
+
Enabled: true
|
|
203
|
+
|
|
204
|
+
Style/HashLikeCase:
|
|
205
|
+
Enabled: true
|
|
206
|
+
|
|
207
|
+
Style/HashTransformKeys:
|
|
208
|
+
Enabled: true
|
|
209
|
+
|
|
210
|
+
Style/HashTransformValues:
|
|
211
|
+
Enabled: true
|
|
212
|
+
|
|
213
|
+
Style/RedundantAssignment:
|
|
214
|
+
Enabled: true
|
|
215
|
+
|
|
216
|
+
Style/RedundantFetchBlock:
|
|
217
|
+
Enabled: true
|
|
218
|
+
|
|
219
|
+
Style/RedundantFileExtensionInRequire:
|
|
220
|
+
Enabled: true
|
|
221
|
+
|
|
222
|
+
Style/RedundantRegexpCharacterClass:
|
|
223
|
+
Enabled: true
|
|
224
|
+
|
|
225
|
+
Style/RedundantRegexpEscape:
|
|
226
|
+
Enabled: true
|
|
227
|
+
|
|
228
|
+
Style/SlicingWithRange:
|
|
229
|
+
Enabled: true
|
data/.rubocop_todo.yml
CHANGED
|
@@ -1,28 +1,11 @@
|
|
|
1
1
|
# This configuration was generated by
|
|
2
2
|
# `rubocop --auto-gen-config`
|
|
3
|
-
# on 2020-
|
|
3
|
+
# on 2020-08-01 23:04:28 UTC using RuboCop version 0.88.0.
|
|
4
4
|
# The point is for the user to remove these configuration records
|
|
5
5
|
# one by one as the offenses are removed from the code base.
|
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
|
8
8
|
|
|
9
|
-
# Offense count: 5
|
|
10
|
-
Metrics/AbcSize:
|
|
11
|
-
Max: 20
|
|
12
|
-
|
|
13
|
-
# Offense count: 1
|
|
14
|
-
# Configuration parameters: CountKeywordArgs.
|
|
15
|
-
Metrics/ParameterLists:
|
|
16
|
-
Max: 6
|
|
17
|
-
|
|
18
|
-
# Offense count: 18
|
|
19
|
-
# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
|
|
20
|
-
# AllowedNames: io, id, to, by, on, in, at, ip, db, os
|
|
21
|
-
Naming/MethodParameterName:
|
|
22
|
-
Exclude:
|
|
23
|
-
- 'lib/gobstones/cli/printer.rb'
|
|
24
|
-
- 'lib/gobstones/runner/board.rb'
|
|
25
|
-
|
|
26
9
|
# Offense count: 4
|
|
27
10
|
# Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros.
|
|
28
11
|
# NamePrefix: is_, has_, have_
|
|
@@ -35,41 +18,3 @@ Naming/PredicateName:
|
|
|
35
18
|
- 'lib/gobstones/lang/expressions/expression.rb'
|
|
36
19
|
- 'lib/gobstones/lang/expressions/function_call.rb'
|
|
37
20
|
- 'lib/gobstones/runner/execution_context.rb'
|
|
38
|
-
|
|
39
|
-
# Offense count: 10
|
|
40
|
-
# Configuration parameters: EnforcedStyle.
|
|
41
|
-
# SupportedStyles: snake_case, normalcase, non_integer
|
|
42
|
-
Naming/VariableNumber:
|
|
43
|
-
Exclude:
|
|
44
|
-
- 'spec/lang/expressions/arithmetic_expressions_spec.rb'
|
|
45
|
-
- 'spec/parser/gobstones_program_spec.rb'
|
|
46
|
-
|
|
47
|
-
# Offense count: 2
|
|
48
|
-
# Configuration parameters: Prefixes.
|
|
49
|
-
# Prefixes: when, with, without
|
|
50
|
-
RSpec/ContextWording:
|
|
51
|
-
Exclude:
|
|
52
|
-
- 'spec/runner/head_spec.rb'
|
|
53
|
-
|
|
54
|
-
# Offense count: 19
|
|
55
|
-
RSpec/DescribeMethod:
|
|
56
|
-
Enabled: false
|
|
57
|
-
|
|
58
|
-
# Offense count: 5
|
|
59
|
-
# Configuration parameters: Max.
|
|
60
|
-
RSpec/ExampleLength:
|
|
61
|
-
Exclude:
|
|
62
|
-
- 'spec/lang/commands/procedure_call_spec.rb'
|
|
63
|
-
- 'spec/parser/gobstones_program_spec.rb'
|
|
64
|
-
- 'spec/parser/treetop_parser_spec.rb'
|
|
65
|
-
|
|
66
|
-
# Offense count: 20
|
|
67
|
-
# Configuration parameters: CustomTransform, IgnoreMethods.
|
|
68
|
-
RSpec/FilePath:
|
|
69
|
-
Enabled: false
|
|
70
|
-
|
|
71
|
-
# Offense count: 7
|
|
72
|
-
Style/MixinUsage:
|
|
73
|
-
Exclude:
|
|
74
|
-
- 'lib/gobstones/cli/runner.rb'
|
|
75
|
-
- 'spec/spec_helper.rb'
|
data/.tool-versions
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
ruby 2.7.
|
|
1
|
+
ruby 2.7.1
|
data/.travis.yml
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
sudo: false
|
|
3
3
|
rvm:
|
|
4
|
-
- 2.7.
|
|
4
|
+
- 2.7.1
|
|
5
5
|
before_install:
|
|
6
6
|
- gem install bundler:2.1.4
|
|
7
7
|
install:
|
|
8
8
|
- bundle install --jobs=3 --retry=3
|
|
9
|
+
before_script:
|
|
10
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
|
11
|
+
- chmod +x ./cc-test-reporter
|
|
12
|
+
- ./cc-test-reporter before-build
|
|
9
13
|
script:
|
|
10
14
|
- bundle exec rubocop
|
|
11
15
|
- bundle exec rake spec
|
|
16
|
+
after_script:
|
|
17
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
data/CHANGELOG
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: https://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
-
ast (2.4.
|
|
4
|
+
ast (2.4.1)
|
|
5
5
|
autotest-standalone (4.5.11)
|
|
6
6
|
coveralls (0.8.23)
|
|
7
7
|
json (>= 1.8, < 3)
|
|
@@ -9,39 +9,44 @@ GEM
|
|
|
9
9
|
term-ansicolor (~> 1.3)
|
|
10
10
|
thor (>= 0.19.4, < 2.0)
|
|
11
11
|
tins (~> 1.6)
|
|
12
|
-
diff-lcs (1.
|
|
12
|
+
diff-lcs (1.4.4)
|
|
13
13
|
docile (1.3.2)
|
|
14
14
|
error_handling_protocol (0.0.1)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
ast (~> 2.4.0)
|
|
15
|
+
json (2.3.1)
|
|
16
|
+
parallel (1.19.2)
|
|
17
|
+
parser (2.7.1.4)
|
|
18
|
+
ast (~> 2.4.1)
|
|
20
19
|
polyglot (0.3.5)
|
|
21
20
|
rainbow (3.0.0)
|
|
22
21
|
rake (13.0.1)
|
|
22
|
+
regexp_parser (1.7.1)
|
|
23
|
+
rexml (3.2.4)
|
|
23
24
|
rspec (3.9.0)
|
|
24
25
|
rspec-core (~> 3.9.0)
|
|
25
26
|
rspec-expectations (~> 3.9.0)
|
|
26
27
|
rspec-mocks (~> 3.9.0)
|
|
27
|
-
rspec-core (3.9.
|
|
28
|
-
rspec-support (~> 3.9.
|
|
29
|
-
rspec-expectations (3.9.
|
|
28
|
+
rspec-core (3.9.2)
|
|
29
|
+
rspec-support (~> 3.9.3)
|
|
30
|
+
rspec-expectations (3.9.2)
|
|
30
31
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
31
32
|
rspec-support (~> 3.9.0)
|
|
32
33
|
rspec-mocks (3.9.1)
|
|
33
34
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
34
35
|
rspec-support (~> 3.9.0)
|
|
35
|
-
rspec-support (3.9.
|
|
36
|
-
rubocop (0.
|
|
37
|
-
jaro_winkler (~> 1.5.1)
|
|
36
|
+
rspec-support (3.9.3)
|
|
37
|
+
rubocop (0.88.0)
|
|
38
38
|
parallel (~> 1.10)
|
|
39
|
-
parser (>= 2.7.
|
|
39
|
+
parser (>= 2.7.1.1)
|
|
40
40
|
rainbow (>= 2.2.2, < 4.0)
|
|
41
|
+
regexp_parser (>= 1.7)
|
|
42
|
+
rexml
|
|
43
|
+
rubocop-ast (>= 0.1.0, < 1.0)
|
|
41
44
|
ruby-progressbar (~> 1.7)
|
|
42
|
-
unicode-display_width (>= 1.4.0, <
|
|
43
|
-
rubocop-
|
|
44
|
-
|
|
45
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
|
46
|
+
rubocop-ast (0.2.0)
|
|
47
|
+
parser (>= 2.7.0.1)
|
|
48
|
+
rubocop-rspec (1.42.0)
|
|
49
|
+
rubocop (>= 0.87.0)
|
|
45
50
|
ruby-progressbar (1.10.1)
|
|
46
51
|
simplecov (0.16.1)
|
|
47
52
|
docile (~> 1.1)
|
|
@@ -51,13 +56,13 @@ GEM
|
|
|
51
56
|
sync (0.5.0)
|
|
52
57
|
term-ansicolor (1.7.1)
|
|
53
58
|
tins (~> 1.0)
|
|
54
|
-
test-prof (0.
|
|
59
|
+
test-prof (0.12.0)
|
|
55
60
|
thor (1.0.1)
|
|
56
|
-
tins (1.
|
|
61
|
+
tins (1.25.0)
|
|
57
62
|
sync
|
|
58
63
|
treetop (1.6.10)
|
|
59
64
|
polyglot (~> 0.3)
|
|
60
|
-
unicode-display_width (1.
|
|
65
|
+
unicode-display_width (1.7.0)
|
|
61
66
|
|
|
62
67
|
PLATFORMS
|
|
63
68
|
ruby
|
data/gobstones.gemspec
CHANGED
|
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |spec|
|
|
5
5
|
spec.name = 'gobstones'
|
|
6
|
-
spec.version = '0.0.
|
|
6
|
+
spec.version = '0.0.4'
|
|
7
7
|
spec.licenses = ['GPLv3']
|
|
8
8
|
spec.authors = ['Nahuel Garbezza']
|
|
9
9
|
spec.email = ['n.garbezza@gmail.com']
|
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
|
11
11
|
spec.summary = 'Ruby implementation of the Gobstones programming language'
|
|
12
12
|
spec.description = 'Ruby implementation of the Gobstones programming language'
|
|
13
13
|
|
|
14
|
-
spec.required_ruby_version = '>= 2.
|
|
14
|
+
spec.required_ruby_version = '>= 2.7.1'
|
|
15
15
|
spec.required_rubygems_version = '>= 2.7.6'
|
|
16
16
|
|
|
17
17
|
spec.add_development_dependency 'rspec', '~> 3'
|
|
@@ -24,7 +24,7 @@ module Gobstones
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
class Div < ArithmeticExpression
|
|
27
|
-
def evaluate(context
|
|
27
|
+
def evaluate(context)
|
|
28
28
|
left_expr.evaluate(context) / right_expr.evaluate(context)
|
|
29
29
|
rescue ZeroDivisionError
|
|
30
30
|
raise Runner::GobstonesRuntimeError, 'zero division'
|
|
@@ -9,7 +9,7 @@ module Gobstones
|
|
|
9
9
|
TypeBoundFunc = Class.new(Expression)
|
|
10
10
|
|
|
11
11
|
class MinBool < TypeBoundFunc
|
|
12
|
-
def evaluate(_context
|
|
12
|
+
def evaluate(_context)
|
|
13
13
|
False.new
|
|
14
14
|
end
|
|
15
15
|
|
|
@@ -19,7 +19,7 @@ module Gobstones
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
class MaxBool < TypeBoundFunc
|
|
22
|
-
def evaluate(_context
|
|
22
|
+
def evaluate(_context)
|
|
23
23
|
True.new
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -29,7 +29,7 @@ module Gobstones
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
class MinColor < TypeBoundFunc
|
|
32
|
-
def evaluate(_context
|
|
32
|
+
def evaluate(_context)
|
|
33
33
|
Azul.new
|
|
34
34
|
end
|
|
35
35
|
|
|
@@ -39,7 +39,7 @@ module Gobstones
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
class MaxColor < TypeBoundFunc
|
|
42
|
-
def evaluate(_context
|
|
42
|
+
def evaluate(_context)
|
|
43
43
|
Verde.new
|
|
44
44
|
end
|
|
45
45
|
|
|
@@ -49,7 +49,7 @@ module Gobstones
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
class MinDir < TypeBoundFunc
|
|
52
|
-
def evaluate(_context
|
|
52
|
+
def evaluate(_context)
|
|
53
53
|
Norte.new
|
|
54
54
|
end
|
|
55
55
|
|
|
@@ -59,7 +59,7 @@ module Gobstones
|
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
class MaxDir < TypeBoundFunc
|
|
62
|
-
def evaluate(_context
|
|
62
|
+
def evaluate(_context)
|
|
63
63
|
Oeste.new
|
|
64
64
|
end
|
|
65
65
|
|
|
@@ -19,15 +19,20 @@ module Gobstones
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def evaluate
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
with_execution_context do |context|
|
|
23
|
+
return_values = main_definition.evaluate(context)
|
|
24
|
+
Runner::ProgramResult.new(context.head, return_values)
|
|
25
|
+
end
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
private
|
|
28
29
|
|
|
30
|
+
def with_execution_context
|
|
31
|
+
yield create_context
|
|
32
|
+
end
|
|
33
|
+
|
|
29
34
|
def create_context
|
|
30
|
-
Runner::
|
|
35
|
+
Runner::ExecutionContext.for_program(self)
|
|
31
36
|
end
|
|
32
37
|
end
|
|
33
38
|
end
|
|
@@ -115,35 +115,35 @@ module Gobstones
|
|
|
115
115
|
end
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
-
ast_node(:SkipCmdNode) { Skip.new }
|
|
119
|
-
ast_node(:BoomCmdNode) { Boom.new(string.text_value[1..-2]) }
|
|
118
|
+
ast_node(:SkipCmdNode) { Commands::Skip.new }
|
|
119
|
+
ast_node(:BoomCmdNode) { Commands::Boom.new(string.text_value[1..-2]) }
|
|
120
120
|
|
|
121
|
-
ast_node(:PonerCmdNode) { Poner.new(gexp.value) }
|
|
122
|
-
ast_node(:SacarCmdNode) { Sacar.new(gexp.value) }
|
|
123
|
-
ast_node(:MoverCmdNode) { Mover.new(gexp.value) }
|
|
121
|
+
ast_node(:PonerCmdNode) { Commands::Poner.new(gexp.value) }
|
|
122
|
+
ast_node(:SacarCmdNode) { Commands::Sacar.new(gexp.value) }
|
|
123
|
+
ast_node(:MoverCmdNode) { Commands::Mover.new(gexp.value) }
|
|
124
124
|
|
|
125
|
-
ast_node(:IrAlOrigenCmdNode) { IrAlOrigen.new }
|
|
126
|
-
ast_node(:VaciarTableroCmdNode) { VaciarTablero.new }
|
|
125
|
+
ast_node(:IrAlOrigenCmdNode) { Commands::IrAlOrigen.new }
|
|
126
|
+
ast_node(:VaciarTableroCmdNode) { Commands::VaciarTablero.new }
|
|
127
127
|
|
|
128
|
-
ast_node(:ProcCallNode) { ProcedureCall.new(proc_name.text_value, gexp_tuple.value) }
|
|
128
|
+
ast_node(:ProcCallNode) { Commands::ProcedureCall.new(proc_name.text_value, gexp_tuple.value) }
|
|
129
129
|
|
|
130
|
-
ast_node(:SingleAssignmentNode) { SingleAssignment.new(var_name.value, gexp.value) }
|
|
131
|
-
ast_node(:MultipleAssignmentNode) { MultipleAssignment.new(var_tuple.value, gexp.value) }
|
|
130
|
+
ast_node(:SingleAssignmentNode) { Commands::SingleAssignment.new(var_name.value, gexp.value) }
|
|
131
|
+
ast_node(:MultipleAssignmentNode) { Commands::MultipleAssignment.new(var_tuple.value, gexp.value) }
|
|
132
132
|
|
|
133
|
-
ast_node(:CmdBlockNode) { CommandBlock.new(create_commands(commands)) }
|
|
133
|
+
ast_node(:CmdBlockNode) { Commands::CommandBlock.new(create_commands(commands)) }
|
|
134
134
|
|
|
135
135
|
ast_node :IfCmdNode do
|
|
136
136
|
if else_clause.empty?
|
|
137
|
-
If.new(gexp.value, then_block.value)
|
|
137
|
+
Commands::If.new(gexp.value, then_block.value)
|
|
138
138
|
else
|
|
139
|
-
IfThenElse.new(gexp.value, then_block.value, else_clause.else_block.value)
|
|
139
|
+
Commands::IfThenElse.new(gexp.value, then_block.value, else_clause.else_block.value)
|
|
140
140
|
end
|
|
141
141
|
end
|
|
142
142
|
|
|
143
|
-
ast_node(:WhileCmdNode) { While.new(gexp.value, cmd_block.value) }
|
|
143
|
+
ast_node(:WhileCmdNode) { Commands::While.new(gexp.value, cmd_block.value) }
|
|
144
144
|
|
|
145
145
|
ast_node :RepeatWithCmdNode do
|
|
146
|
-
RepeatWith.new(var_name.value, range_min.value, range_max.value, cmd_block.value)
|
|
146
|
+
Commands::RepeatWith.new(var_name.value, range_min.value, range_max.value, cmd_block.value)
|
|
147
147
|
end
|
|
148
148
|
|
|
149
149
|
# TODO abstract duplication, very similar to GexpsNode
|
|
@@ -167,7 +167,7 @@ module Gobstones
|
|
|
167
167
|
end
|
|
168
168
|
|
|
169
169
|
ast_node(:FunctionNode) do
|
|
170
|
-
cmd_block = CommandBlock.new(create_commands(commands))
|
|
170
|
+
cmd_block = Commands::CommandBlock.new(create_commands(commands))
|
|
171
171
|
Function.new(func_name.text_value, var_tuple.value, cmd_block, func_return.value)
|
|
172
172
|
end
|
|
173
173
|
|
|
@@ -175,7 +175,7 @@ module Gobstones
|
|
|
175
175
|
ast_node(:MainReturnNode) { ReturnFromMain.new(var_tuple.value) }
|
|
176
176
|
|
|
177
177
|
ast_node(:MainDefNode) do
|
|
178
|
-
command_block = CommandBlock.new(create_commands(commands))
|
|
178
|
+
command_block = Commands::CommandBlock.new(create_commands(commands))
|
|
179
179
|
return_statement = ret.empty? ? NoReturnStatement.new : ret.value
|
|
180
180
|
Main.new(command_block, return_statement)
|
|
181
181
|
end
|
|
@@ -5,6 +5,10 @@ require 'error_handling_protocol'
|
|
|
5
5
|
module Gobstones
|
|
6
6
|
module Runner
|
|
7
7
|
class ExecutionContext
|
|
8
|
+
def self.for_program(program)
|
|
9
|
+
ProgramExecutionContext.new(program)
|
|
10
|
+
end
|
|
11
|
+
|
|
8
12
|
def initialize
|
|
9
13
|
@values = {}
|
|
10
14
|
end
|
|
@@ -100,23 +104,5 @@ module Gobstones
|
|
|
100
104
|
@outer_context.program_context
|
|
101
105
|
end
|
|
102
106
|
end
|
|
103
|
-
|
|
104
|
-
class NullExecutionContext < ExecutionContext
|
|
105
|
-
def set(variable_name, value); end
|
|
106
|
-
|
|
107
|
-
def get(variable_name)
|
|
108
|
-
undefined_variable_error(variable_name)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def clear(variable_name); end
|
|
112
|
-
|
|
113
|
-
def has_variable_named?(_variable_name)
|
|
114
|
-
false
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def program_context
|
|
118
|
-
raise 'a null execution does not know its program context'
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
107
|
end
|
|
122
108
|
end
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
RSpec.describe 'arithmetic expressions' do
|
|
2
|
+
let(:context) { any_context }
|
|
3
|
+
|
|
2
4
|
describe Add do
|
|
3
5
|
it 'evaluates with two numbers' do
|
|
4
|
-
expect(described_class.numbers(42, 23).evaluate).to eq(65.to_gbs_num)
|
|
6
|
+
expect(described_class.numbers(42, 23).evaluate(context)).to eq(65.to_gbs_num)
|
|
5
7
|
end
|
|
6
8
|
|
|
7
9
|
it 'evaluates nested add expressions' do
|
|
@@ -11,24 +13,24 @@ RSpec.describe 'arithmetic expressions' do
|
|
|
11
13
|
add_43_23 = described_class.new(add_27_16, 23.to_gbs_num)
|
|
12
14
|
add_66_42 = described_class.new(add_43_23, 42.to_gbs_num)
|
|
13
15
|
|
|
14
|
-
expect(add_66_42.evaluate).to eq(108.to_gbs_num)
|
|
16
|
+
expect(add_66_42.evaluate(context)).to eq(108.to_gbs_num)
|
|
15
17
|
end
|
|
16
18
|
end
|
|
17
19
|
|
|
18
20
|
describe Sub do
|
|
19
21
|
it 'evaluates with two numbers' do
|
|
20
|
-
expect(described_class.numbers(42, 15).evaluate).to eq(27.to_gbs_num)
|
|
22
|
+
expect(described_class.numbers(42, 15).evaluate(context)).to eq(27.to_gbs_num)
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
it 'evaluates returning a negative result' do
|
|
24
|
-
expect(described_class.numbers(15, 42).evaluate).to eq(-27.to_gbs_num)
|
|
26
|
+
expect(described_class.numbers(15, 42).evaluate(context)).to eq(-27.to_gbs_num)
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
it 'evaluates nested sub expressions' do
|
|
28
|
-
|
|
29
|
-
sub = described_class.new(
|
|
30
|
+
sub_42_15 = described_class.numbers(42, 15)
|
|
31
|
+
sub = described_class.new(sub_42_15, 8.to_gbs_num)
|
|
30
32
|
|
|
31
|
-
expect(sub.evaluate).to eq(19.to_gbs_num)
|
|
33
|
+
expect(sub.evaluate(context)).to eq(19.to_gbs_num)
|
|
32
34
|
end
|
|
33
35
|
end
|
|
34
36
|
|
|
@@ -40,42 +42,42 @@ RSpec.describe 'arithmetic expressions' do
|
|
|
40
42
|
it 'evaluates a nested mul expression' do
|
|
41
43
|
mul = described_class.numbers(-2, 4)
|
|
42
44
|
|
|
43
|
-
expect(described_class.new(mul, 5.to_gbs_num).evaluate).to eq(-40.to_gbs_num)
|
|
45
|
+
expect(described_class.new(mul, 5.to_gbs_num).evaluate(context)).to eq(-40.to_gbs_num)
|
|
44
46
|
end
|
|
45
47
|
end
|
|
46
48
|
|
|
47
49
|
describe Div do
|
|
48
50
|
it 'evaluates a simple div' do
|
|
49
|
-
expect(described_class.numbers(12, 3).evaluate).to eq(4.to_gbs_num)
|
|
51
|
+
expect(described_class.numbers(12, 3).evaluate(context)).to eq(4.to_gbs_num)
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
it 'evaluates to an integer division' do
|
|
53
|
-
expect(described_class.numbers(10, 3).evaluate).to eq(3.to_gbs_num)
|
|
55
|
+
expect(described_class.numbers(10, 3).evaluate(context)).to eq(3.to_gbs_num)
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
it 'raises an error when dividing by zero' do
|
|
57
|
-
expect { described_class.numbers(42, 0).evaluate }.to raise_error(GobstonesRuntimeError, 'zero division')
|
|
59
|
+
expect { described_class.numbers(42, 0).evaluate(context) }.to raise_error(GobstonesRuntimeError, 'zero division')
|
|
58
60
|
end
|
|
59
61
|
end
|
|
60
62
|
|
|
61
63
|
describe Mod do
|
|
62
64
|
it 'evaluates a mod with result 0' do
|
|
63
|
-
expect(described_class.numbers(4, 4).evaluate).to eq(0.to_gbs_num)
|
|
65
|
+
expect(described_class.numbers(4, 4).evaluate(context)).to eq(0.to_gbs_num)
|
|
64
66
|
end
|
|
65
67
|
|
|
66
68
|
it 'evaluates a mod with result > 0' do
|
|
67
|
-
expect(described_class.numbers(10, 3).evaluate).to eq(1.to_gbs_num)
|
|
69
|
+
expect(described_class.numbers(10, 3).evaluate(context)).to eq(1.to_gbs_num)
|
|
68
70
|
end
|
|
69
71
|
end
|
|
70
72
|
|
|
71
73
|
describe Pow do
|
|
72
74
|
it 'returns 1 as a result if the power is 0' do
|
|
73
|
-
expect(described_class.numbers(1, 0).evaluate).to eq(1.to_gbs_num)
|
|
74
|
-
expect(described_class.numbers(42, 0).evaluate).to eq(1.to_gbs_num)
|
|
75
|
+
expect(described_class.numbers(1, 0).evaluate(context)).to eq(1.to_gbs_num)
|
|
76
|
+
expect(described_class.numbers(42, 0).evaluate(context)).to eq(1.to_gbs_num)
|
|
75
77
|
end
|
|
76
78
|
|
|
77
79
|
it 'evaluates 2 raised to 4' do
|
|
78
|
-
expect(described_class.numbers(2, 4).evaluate).to eq(16.to_gbs_num)
|
|
80
|
+
expect(described_class.numbers(2, 4).evaluate(context)).to eq(16.to_gbs_num)
|
|
79
81
|
end
|
|
80
82
|
end
|
|
81
83
|
end
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
RSpec.describe 'evaluating comparison expressions' do
|
|
2
|
+
let(:context) { any_context }
|
|
3
|
+
|
|
2
4
|
describe Equal do
|
|
3
5
|
it 'evaluates same booleans as equal' do
|
|
4
|
-
expect(described_class.new(false_value, false_value).evaluate).to eq(true_value)
|
|
5
|
-
expect(described_class.new(true_value, true_value).evaluate).to eq(true_value)
|
|
6
|
-
expect(described_class.new(false_value, true_value).evaluate).to eq(false_value)
|
|
7
|
-
expect(described_class.new(true_value, false_value).evaluate).to eq(false_value)
|
|
6
|
+
expect(described_class.new(false_value, false_value).evaluate(context)).to eq(true_value)
|
|
7
|
+
expect(described_class.new(true_value, true_value).evaluate(context)).to eq(true_value)
|
|
8
|
+
expect(described_class.new(false_value, true_value).evaluate(context)).to eq(false_value)
|
|
9
|
+
expect(described_class.new(true_value, false_value).evaluate(context)).to eq(false_value)
|
|
8
10
|
end
|
|
9
11
|
|
|
10
12
|
it 'evaluates same colors as equal' do
|
|
11
13
|
color_classes = Color.all
|
|
12
14
|
color_classes.each do |color_class|
|
|
13
|
-
expect(described_class.new(color_class.new, color_class.new).evaluate).to eq(true_value)
|
|
15
|
+
expect(described_class.new(color_class.new, color_class.new).evaluate(context)).to eq(true_value)
|
|
14
16
|
(color_classes - [color_class]).each do |different_color_class|
|
|
15
|
-
expect(described_class.new(color_class.new, different_color_class.new).evaluate).to eq(false_value)
|
|
17
|
+
expect(described_class.new(color_class.new, different_color_class.new).evaluate(context)).to eq(false_value)
|
|
16
18
|
end
|
|
17
19
|
end
|
|
18
20
|
end
|
|
@@ -20,33 +22,33 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
20
22
|
it 'evaluates same directions as equal' do
|
|
21
23
|
dir_classes = Direction.all
|
|
22
24
|
dir_classes.each do |dir_class|
|
|
23
|
-
expect(described_class.new(dir_class.new, dir_class.new).evaluate).to eq(true_value)
|
|
25
|
+
expect(described_class.new(dir_class.new, dir_class.new).evaluate(context)).to eq(true_value)
|
|
24
26
|
(dir_classes - [dir_class]).each do |different_dir_class|
|
|
25
|
-
expect(described_class.new(dir_class.new, different_dir_class.new).evaluate).to eq(false_value)
|
|
27
|
+
expect(described_class.new(dir_class.new, different_dir_class.new).evaluate(context)).to eq(false_value)
|
|
26
28
|
end
|
|
27
29
|
end
|
|
28
30
|
end
|
|
29
31
|
|
|
30
32
|
it 'evaluates same numbers as equal' do
|
|
31
|
-
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
|
|
32
|
-
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(false_value)
|
|
33
|
+
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(true_value)
|
|
34
|
+
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate(context)).to eq(false_value)
|
|
33
35
|
end
|
|
34
36
|
end
|
|
35
37
|
|
|
36
38
|
describe NotEqual do
|
|
37
39
|
it 'evaluates booleans as not equal' do
|
|
38
|
-
expect(described_class.new(false_value, false_value).evaluate).to eq(false_value)
|
|
39
|
-
expect(described_class.new(true_value, true_value).evaluate).to eq(false_value)
|
|
40
|
-
expect(described_class.new(false_value, true_value).evaluate).to eq(true_value)
|
|
41
|
-
expect(described_class.new(true_value, false_value).evaluate).to eq(true_value)
|
|
40
|
+
expect(described_class.new(false_value, false_value).evaluate(context)).to eq(false_value)
|
|
41
|
+
expect(described_class.new(true_value, true_value).evaluate(context)).to eq(false_value)
|
|
42
|
+
expect(described_class.new(false_value, true_value).evaluate(context)).to eq(true_value)
|
|
43
|
+
expect(described_class.new(true_value, false_value).evaluate(context)).to eq(true_value)
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
it 'evaluates same colors as equal' do
|
|
45
47
|
color_classes = Color.all
|
|
46
48
|
color_classes.each do |color_class|
|
|
47
|
-
expect(described_class.new(color_class.new, color_class.new).evaluate).to eq(false_value)
|
|
49
|
+
expect(described_class.new(color_class.new, color_class.new).evaluate(context)).to eq(false_value)
|
|
48
50
|
(color_classes - [color_class]).each do |different_color_class|
|
|
49
|
-
expect(described_class.new(color_class.new, different_color_class.new).evaluate).to eq(true_value)
|
|
51
|
+
expect(described_class.new(color_class.new, different_color_class.new).evaluate(context)).to eq(true_value)
|
|
50
52
|
end
|
|
51
53
|
end
|
|
52
54
|
end
|
|
@@ -54,45 +56,45 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
54
56
|
it 'evaluates same directions as equal' do
|
|
55
57
|
dir_classes = Direction.all
|
|
56
58
|
dir_classes.each do |dir_class|
|
|
57
|
-
expect(described_class.new(dir_class.new, dir_class.new).evaluate).to eq(false_value)
|
|
59
|
+
expect(described_class.new(dir_class.new, dir_class.new).evaluate(context)).to eq(false_value)
|
|
58
60
|
(dir_classes - [dir_class]).each do |different_dir_class|
|
|
59
|
-
expect(described_class.new(dir_class.new, different_dir_class.new).evaluate).to eq(true_value)
|
|
61
|
+
expect(described_class.new(dir_class.new, different_dir_class.new).evaluate(context)).to eq(true_value)
|
|
60
62
|
end
|
|
61
63
|
end
|
|
62
64
|
end
|
|
63
65
|
|
|
64
66
|
it 'evaluates same numbers as equal' do
|
|
65
|
-
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
|
|
66
|
-
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(true_value)
|
|
67
|
+
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(false_value)
|
|
68
|
+
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate(context)).to eq(true_value)
|
|
67
69
|
end
|
|
68
70
|
end
|
|
69
71
|
|
|
70
72
|
describe LessThan do
|
|
71
73
|
it 'evaluates for booleans' do
|
|
72
|
-
expect(described_class.new(false_value, false_value).evaluate).to eq(false_value)
|
|
73
|
-
expect(described_class.new(false_value, true_value).evaluate).to eq(true_value)
|
|
74
|
-
expect(described_class.new(true_value, false_value).evaluate).to eq(false_value)
|
|
75
|
-
expect(described_class.new(true_value, true_value).evaluate).to eq(false_value)
|
|
74
|
+
expect(described_class.new(false_value, false_value).evaluate(context)).to eq(false_value)
|
|
75
|
+
expect(described_class.new(false_value, true_value).evaluate(context)).to eq(true_value)
|
|
76
|
+
expect(described_class.new(true_value, false_value).evaluate(context)).to eq(false_value)
|
|
77
|
+
expect(described_class.new(true_value, true_value).evaluate(context)).to eq(false_value)
|
|
76
78
|
end
|
|
77
79
|
|
|
78
80
|
it 'evaluates for numbers' do
|
|
79
|
-
expect(described_class.new(15.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
|
|
80
|
-
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(false_value)
|
|
81
|
-
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
|
|
81
|
+
expect(described_class.new(15.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(true_value)
|
|
82
|
+
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate(context)).to eq(false_value)
|
|
83
|
+
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(false_value)
|
|
82
84
|
end
|
|
83
85
|
|
|
84
86
|
it 'evaluates for colors' do
|
|
85
87
|
color_classes = Color.order
|
|
86
88
|
color_classes.each_with_index do |color_class, index|
|
|
87
89
|
# should not be less than itself
|
|
88
|
-
expect(described_class.new(color_class.new, color_class.new).evaluate).to eq(false_value)
|
|
90
|
+
expect(described_class.new(color_class.new, color_class.new).evaluate(context)).to eq(false_value)
|
|
89
91
|
color_classes.take(index).each do |previous_color_class|
|
|
90
92
|
# should not be less than any previous value
|
|
91
|
-
expect(described_class.new(color_class.new, previous_color_class.new).evaluate).to eq(false_value)
|
|
93
|
+
expect(described_class.new(color_class.new, previous_color_class.new).evaluate(context)).to eq(false_value)
|
|
92
94
|
end
|
|
93
95
|
color_classes.drop(index + 1).each do |next_color_class|
|
|
94
96
|
# should be less than any next value
|
|
95
|
-
expect(described_class.new(color_class.new, next_color_class.new).evaluate).to eq(true_value)
|
|
97
|
+
expect(described_class.new(color_class.new, next_color_class.new).evaluate(context)).to eq(true_value)
|
|
96
98
|
end
|
|
97
99
|
end
|
|
98
100
|
end
|
|
@@ -100,12 +102,12 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
100
102
|
it 'evaluates for directions' do
|
|
101
103
|
dir_classes = Direction.order
|
|
102
104
|
dir_classes.each_with_index do |dir_class, index|
|
|
103
|
-
expect(described_class.new(dir_class.new, dir_class.new).evaluate).to eq(false_value)
|
|
105
|
+
expect(described_class.new(dir_class.new, dir_class.new).evaluate(context)).to eq(false_value)
|
|
104
106
|
dir_classes.take(index).each do |previous_dir_class|
|
|
105
|
-
expect(described_class.new(dir_class.new, previous_dir_class.new).evaluate).to eq(false_value)
|
|
107
|
+
expect(described_class.new(dir_class.new, previous_dir_class.new).evaluate(context)).to eq(false_value)
|
|
106
108
|
end
|
|
107
109
|
dir_classes.drop(index + 1).each do |next_dir_class|
|
|
108
|
-
expect(described_class.new(dir_class.new, next_dir_class.new).evaluate).to eq(true_value)
|
|
110
|
+
expect(described_class.new(dir_class.new, next_dir_class.new).evaluate(context)).to eq(true_value)
|
|
109
111
|
end
|
|
110
112
|
end
|
|
111
113
|
end
|
|
@@ -113,27 +115,27 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
113
115
|
|
|
114
116
|
describe LessEqual do
|
|
115
117
|
it 'evaluates for booleans' do
|
|
116
|
-
expect(described_class.new(false_value, false_value).evaluate).to eq(true_value)
|
|
117
|
-
expect(described_class.new(false_value, true_value).evaluate).to eq(true_value)
|
|
118
|
-
expect(described_class.new(true_value, false_value).evaluate).to eq(false_value)
|
|
119
|
-
expect(described_class.new(true_value, true_value).evaluate).to eq(true_value)
|
|
118
|
+
expect(described_class.new(false_value, false_value).evaluate(context)).to eq(true_value)
|
|
119
|
+
expect(described_class.new(false_value, true_value).evaluate(context)).to eq(true_value)
|
|
120
|
+
expect(described_class.new(true_value, false_value).evaluate(context)).to eq(false_value)
|
|
121
|
+
expect(described_class.new(true_value, true_value).evaluate(context)).to eq(true_value)
|
|
120
122
|
end
|
|
121
123
|
|
|
122
124
|
it 'evaluates for numbers' do
|
|
123
|
-
expect(described_class.new(15.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
|
|
124
|
-
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(false_value)
|
|
125
|
-
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
|
|
125
|
+
expect(described_class.new(15.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(true_value)
|
|
126
|
+
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate(context)).to eq(false_value)
|
|
127
|
+
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(true_value)
|
|
126
128
|
end
|
|
127
129
|
|
|
128
130
|
it 'evaluates for colors' do
|
|
129
131
|
color_classes = Color.order
|
|
130
132
|
color_classes.each_with_index do |color_class, index|
|
|
131
|
-
expect(described_class.new(color_class.new, color_class.new).evaluate).to eq(true_value)
|
|
133
|
+
expect(described_class.new(color_class.new, color_class.new).evaluate(context)).to eq(true_value)
|
|
132
134
|
color_classes.take(index).each do |previous_color_class|
|
|
133
|
-
expect(described_class.new(color_class.new, previous_color_class.new).evaluate).to eq(false_value)
|
|
135
|
+
expect(described_class.new(color_class.new, previous_color_class.new).evaluate(context)).to eq(false_value)
|
|
134
136
|
end
|
|
135
137
|
color_classes.drop(index + 1).each do |next_color_class|
|
|
136
|
-
expect(described_class.new(color_class.new, next_color_class.new).evaluate).to eq(true_value)
|
|
138
|
+
expect(described_class.new(color_class.new, next_color_class.new).evaluate(context)).to eq(true_value)
|
|
137
139
|
end
|
|
138
140
|
end
|
|
139
141
|
end
|
|
@@ -141,12 +143,12 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
141
143
|
it 'evaluates for directions' do
|
|
142
144
|
dir_classes = Direction.order
|
|
143
145
|
dir_classes.each_with_index do |dir_class, index|
|
|
144
|
-
expect(described_class.new(dir_class.new, dir_class.new).evaluate).to eq(true_value)
|
|
146
|
+
expect(described_class.new(dir_class.new, dir_class.new).evaluate(context)).to eq(true_value)
|
|
145
147
|
dir_classes.take(index).each do |previous_dir_class|
|
|
146
|
-
expect(described_class.new(dir_class.new, previous_dir_class.new).evaluate).to eq(false_value)
|
|
148
|
+
expect(described_class.new(dir_class.new, previous_dir_class.new).evaluate(context)).to eq(false_value)
|
|
147
149
|
end
|
|
148
150
|
dir_classes.drop(index + 1).each do |next_dir_class|
|
|
149
|
-
expect(described_class.new(dir_class.new, next_dir_class.new).evaluate).to eq(true_value)
|
|
151
|
+
expect(described_class.new(dir_class.new, next_dir_class.new).evaluate(context)).to eq(true_value)
|
|
150
152
|
end
|
|
151
153
|
end
|
|
152
154
|
end
|
|
@@ -154,27 +156,27 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
154
156
|
|
|
155
157
|
describe GreaterThan do
|
|
156
158
|
it 'evaluates for booleans' do
|
|
157
|
-
expect(described_class.new(false_value, false_value).evaluate).to eq(false_value)
|
|
158
|
-
expect(described_class.new(false_value, true_value).evaluate).to eq(false_value)
|
|
159
|
-
expect(described_class.new(true_value, false_value).evaluate).to eq(true_value)
|
|
160
|
-
expect(described_class.new(true_value, true_value).evaluate).to eq(false_value)
|
|
159
|
+
expect(described_class.new(false_value, false_value).evaluate(context)).to eq(false_value)
|
|
160
|
+
expect(described_class.new(false_value, true_value).evaluate(context)).to eq(false_value)
|
|
161
|
+
expect(described_class.new(true_value, false_value).evaluate(context)).to eq(true_value)
|
|
162
|
+
expect(described_class.new(true_value, true_value).evaluate(context)).to eq(false_value)
|
|
161
163
|
end
|
|
162
164
|
|
|
163
165
|
it 'evaluates for numbers' do
|
|
164
|
-
expect(described_class.new(15.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
|
|
165
|
-
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(true_value)
|
|
166
|
-
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
|
|
166
|
+
expect(described_class.new(15.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(false_value)
|
|
167
|
+
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate(context)).to eq(true_value)
|
|
168
|
+
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(false_value)
|
|
167
169
|
end
|
|
168
170
|
|
|
169
171
|
it 'evaluates for colors' do
|
|
170
172
|
color_classes = Color.order
|
|
171
173
|
color_classes.each_with_index do |color_class, index|
|
|
172
|
-
expect(described_class.new(color_class.new, color_class.new).evaluate).to eq(false_value)
|
|
174
|
+
expect(described_class.new(color_class.new, color_class.new).evaluate(context)).to eq(false_value)
|
|
173
175
|
color_classes.take(index).each do |previous_color_class|
|
|
174
|
-
expect(described_class.new(color_class.new, previous_color_class.new).evaluate).to eq(true_value)
|
|
176
|
+
expect(described_class.new(color_class.new, previous_color_class.new).evaluate(context)).to eq(true_value)
|
|
175
177
|
end
|
|
176
178
|
color_classes.drop(index + 1).each do |next_color_class|
|
|
177
|
-
expect(described_class.new(color_class.new, next_color_class.new).evaluate).to eq(false_value)
|
|
179
|
+
expect(described_class.new(color_class.new, next_color_class.new).evaluate(context)).to eq(false_value)
|
|
178
180
|
end
|
|
179
181
|
end
|
|
180
182
|
end
|
|
@@ -182,12 +184,12 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
182
184
|
it 'evaluates for directions' do
|
|
183
185
|
dir_classes = Direction.order
|
|
184
186
|
dir_classes.each_with_index do |dir_class, index|
|
|
185
|
-
expect(described_class.new(dir_class.new, dir_class.new).evaluate).to eq(false_value)
|
|
187
|
+
expect(described_class.new(dir_class.new, dir_class.new).evaluate(context)).to eq(false_value)
|
|
186
188
|
dir_classes.take(index).each do |previous_dir_class|
|
|
187
|
-
expect(described_class.new(dir_class.new, previous_dir_class.new).evaluate).to eq(true_value)
|
|
189
|
+
expect(described_class.new(dir_class.new, previous_dir_class.new).evaluate(context)).to eq(true_value)
|
|
188
190
|
end
|
|
189
191
|
dir_classes.drop(index + 1).each do |next_dir_class|
|
|
190
|
-
expect(described_class.new(dir_class.new, next_dir_class.new).evaluate).to eq(false_value)
|
|
192
|
+
expect(described_class.new(dir_class.new, next_dir_class.new).evaluate(context)).to eq(false_value)
|
|
191
193
|
end
|
|
192
194
|
end
|
|
193
195
|
end
|
|
@@ -195,27 +197,27 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
195
197
|
|
|
196
198
|
describe GreaterEqual do
|
|
197
199
|
it 'evaluates for booleans' do
|
|
198
|
-
expect(described_class.new(false_value, false_value).evaluate).to eq(true_value)
|
|
199
|
-
expect(described_class.new(false_value, true_value).evaluate).to eq(false_value)
|
|
200
|
-
expect(described_class.new(true_value, false_value).evaluate).to eq(true_value)
|
|
201
|
-
expect(described_class.new(true_value, true_value).evaluate).to eq(true_value)
|
|
200
|
+
expect(described_class.new(false_value, false_value).evaluate(context)).to eq(true_value)
|
|
201
|
+
expect(described_class.new(false_value, true_value).evaluate(context)).to eq(false_value)
|
|
202
|
+
expect(described_class.new(true_value, false_value).evaluate(context)).to eq(true_value)
|
|
203
|
+
expect(described_class.new(true_value, true_value).evaluate(context)).to eq(true_value)
|
|
202
204
|
end
|
|
203
205
|
|
|
204
206
|
it 'evaluates for numbers' do
|
|
205
|
-
expect(described_class.new(15.to_gbs_num, 42.to_gbs_num).evaluate).to eq(false_value)
|
|
206
|
-
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate).to eq(true_value)
|
|
207
|
-
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate).to eq(true_value)
|
|
207
|
+
expect(described_class.new(15.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(false_value)
|
|
208
|
+
expect(described_class.new(42.to_gbs_num, 15.to_gbs_num).evaluate(context)).to eq(true_value)
|
|
209
|
+
expect(described_class.new(42.to_gbs_num, 42.to_gbs_num).evaluate(context)).to eq(true_value)
|
|
208
210
|
end
|
|
209
211
|
|
|
210
212
|
it 'evaluates for colors' do
|
|
211
213
|
color_classes = Color.order
|
|
212
214
|
color_classes.each_with_index do |color_class, index|
|
|
213
|
-
expect(described_class.new(color_class.new, color_class.new).evaluate).to eq(true_value)
|
|
215
|
+
expect(described_class.new(color_class.new, color_class.new).evaluate(context)).to eq(true_value)
|
|
214
216
|
color_classes.take(index).each do |previous_color_class|
|
|
215
|
-
expect(described_class.new(color_class.new, previous_color_class.new).evaluate).to eq(true_value)
|
|
217
|
+
expect(described_class.new(color_class.new, previous_color_class.new).evaluate(context)).to eq(true_value)
|
|
216
218
|
end
|
|
217
219
|
color_classes.drop(index + 1).each do |next_color_class|
|
|
218
|
-
expect(described_class.new(color_class.new, next_color_class.new).evaluate).to eq(false_value)
|
|
220
|
+
expect(described_class.new(color_class.new, next_color_class.new).evaluate(context)).to eq(false_value)
|
|
219
221
|
end
|
|
220
222
|
end
|
|
221
223
|
end
|
|
@@ -223,12 +225,12 @@ RSpec.describe 'evaluating comparison expressions' do
|
|
|
223
225
|
it 'evaluates for directions' do
|
|
224
226
|
dir_classes = Direction.order
|
|
225
227
|
dir_classes.each_with_index do |dir_class, index|
|
|
226
|
-
expect(described_class.new(dir_class.new, dir_class.new).evaluate).to eq(true_value)
|
|
228
|
+
expect(described_class.new(dir_class.new, dir_class.new).evaluate(context)).to eq(true_value)
|
|
227
229
|
dir_classes.take(index).each do |previous_dir_class|
|
|
228
|
-
expect(described_class.new(dir_class.new, previous_dir_class.new).evaluate).to eq(true_value)
|
|
230
|
+
expect(described_class.new(dir_class.new, previous_dir_class.new).evaluate(context)).to eq(true_value)
|
|
229
231
|
end
|
|
230
232
|
dir_classes.drop(index + 1).each do |next_dir_class|
|
|
231
|
-
expect(described_class.new(dir_class.new, next_dir_class.new).evaluate).to eq(false_value)
|
|
233
|
+
expect(described_class.new(dir_class.new, next_dir_class.new).evaluate(context)).to eq(false_value)
|
|
232
234
|
end
|
|
233
235
|
end
|
|
234
236
|
end
|
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
RSpec.describe 'type bound functions' do
|
|
2
|
+
let(:context) { any_context }
|
|
3
|
+
|
|
2
4
|
describe 'for booleans' do
|
|
3
5
|
it 'evaluates minBool() to False' do
|
|
4
|
-
expect(MinBool.new.evaluate).to eq(false_value)
|
|
6
|
+
expect(MinBool.new.evaluate(context)).to eq(false_value)
|
|
5
7
|
end
|
|
6
8
|
|
|
7
9
|
it 'evaluates maxBool() to True' do
|
|
8
|
-
expect(MaxBool.new.evaluate).to eq(true_value)
|
|
10
|
+
expect(MaxBool.new.evaluate(context)).to eq(true_value)
|
|
9
11
|
end
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
describe 'for colors' do
|
|
13
15
|
it 'evaluates minColor() to Azul' do
|
|
14
|
-
expect(MinColor.new.evaluate).to eq(azul)
|
|
16
|
+
expect(MinColor.new.evaluate(context)).to eq(azul)
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
it 'evaluates maxColor() to Verde' do
|
|
18
|
-
expect(MaxColor.new.evaluate).to eq(verde)
|
|
20
|
+
expect(MaxColor.new.evaluate(context)).to eq(verde)
|
|
19
21
|
end
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
describe 'for directions' do
|
|
23
25
|
it 'evaluates minDir() to Norte' do
|
|
24
|
-
expect(MinDir.new.evaluate).to eq(norte)
|
|
26
|
+
expect(MinDir.new.evaluate(context)).to eq(norte)
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
it 'evaluates maxDir() to Oeste' do
|
|
28
|
-
expect(MaxDir.new.evaluate).to eq(oeste)
|
|
30
|
+
expect(MaxDir.new.evaluate(context)).to eq(oeste)
|
|
29
31
|
end
|
|
30
32
|
end
|
|
31
33
|
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
RSpec.describe Boolean do
|
|
2
|
+
let(:context) { any_context }
|
|
3
|
+
|
|
2
4
|
it 'evaluates true to itself' do
|
|
3
|
-
expect(true_value.evaluate).to eq(true_value)
|
|
5
|
+
expect(true_value.evaluate(context)).to eq(true_value)
|
|
4
6
|
end
|
|
5
7
|
|
|
6
8
|
it 'evaluates false to itself' do
|
|
7
|
-
expect(false_value.evaluate).to eq(false_value)
|
|
9
|
+
expect(false_value.evaluate(context)).to eq(false_value)
|
|
8
10
|
end
|
|
9
11
|
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
RSpec.describe Color do
|
|
2
2
|
let(:all) { described_class.all.map(&:new) }
|
|
3
|
+
let(:context) { any_context }
|
|
3
4
|
|
|
4
5
|
it 'includes Azul, Negro, Rojo and Verde' do
|
|
5
6
|
expect(all).to contain_exactly(azul, negro, rojo, verde)
|
|
@@ -10,7 +11,7 @@ RSpec.describe Color do
|
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
it 'evaluates any color to itself' do
|
|
13
|
-
all.each { |color| expect(color.evaluate).to eq(color) }
|
|
14
|
+
all.each { |color| expect(color.evaluate(context)).to eq(color) }
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
it 'returns the string representation' do
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
RSpec.describe Direction do
|
|
2
2
|
let(:all) { described_class.all.map(&:new) }
|
|
3
|
+
let(:context) { any_context }
|
|
3
4
|
|
|
4
5
|
it 'includes Norte, Este, Sur and Oeste' do
|
|
5
6
|
expect(all.include?(norte)).to be(true)
|
|
@@ -13,7 +14,7 @@ RSpec.describe Direction do
|
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
it 'evaluates any direction to itself' do
|
|
16
|
-
all.each { |dir| expect(dir.evaluate).to eq(dir) }
|
|
17
|
+
all.each { |dir| expect(dir.evaluate(context)).to eq(dir) }
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
it 'returns the string representation' do
|
data/spec/runner/head_spec.rb
CHANGED
|
@@ -19,7 +19,7 @@ RSpec.describe Head do
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
describe 'movements' do
|
|
22
|
-
context 'valid' do
|
|
22
|
+
context 'when is a valid movement' do
|
|
23
23
|
it 'moves north' do
|
|
24
24
|
expect(head.can_move?(norte)).to be(true)
|
|
25
25
|
expect { head.move(norte) }.not_to raise_error
|
|
@@ -62,7 +62,7 @@ RSpec.describe Head do
|
|
|
62
62
|
end
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
context '
|
|
65
|
+
context 'when it is not a valid movement' do
|
|
66
66
|
it 'fails moving north' do
|
|
67
67
|
(Head::MAX_COLS - 1).times { head.move norte }
|
|
68
68
|
|
|
@@ -5,8 +5,12 @@ module GobstonesLangTestObjects
|
|
|
5
5
|
program_context_for(empty_program)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
+
def any_context
|
|
9
|
+
clean_context
|
|
10
|
+
end
|
|
11
|
+
|
|
8
12
|
def program_context_for(program)
|
|
9
|
-
|
|
13
|
+
ExecutionContext.for_program(program)
|
|
10
14
|
end
|
|
11
15
|
|
|
12
16
|
def empty_program
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gobstones
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nahuel Garbezza
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-02
|
|
11
|
+
date: 2020-08-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rspec
|
|
@@ -200,7 +200,7 @@ homepage: https://github.com/ngarbezza/gobstones-rb
|
|
|
200
200
|
licenses:
|
|
201
201
|
- GPLv3
|
|
202
202
|
metadata: {}
|
|
203
|
-
post_install_message:
|
|
203
|
+
post_install_message:
|
|
204
204
|
rdoc_options: []
|
|
205
205
|
require_paths:
|
|
206
206
|
- lib
|
|
@@ -208,7 +208,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
208
208
|
requirements:
|
|
209
209
|
- - ">="
|
|
210
210
|
- !ruby/object:Gem::Version
|
|
211
|
-
version: 2.
|
|
211
|
+
version: 2.7.1
|
|
212
212
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
213
|
requirements:
|
|
214
214
|
- - ">="
|
|
@@ -216,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
216
216
|
version: 2.7.6
|
|
217
217
|
requirements: []
|
|
218
218
|
rubygems_version: 3.1.2
|
|
219
|
-
signing_key:
|
|
219
|
+
signing_key:
|
|
220
220
|
specification_version: 4
|
|
221
221
|
summary: Ruby implementation of the Gobstones programming language
|
|
222
222
|
test_files:
|