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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb6a883aa4561c467f14dad8eff3594b5938d90384ff623480b61e68f5c3fdd0
4
- data.tar.gz: e767e18156efd53dcba54a17c63d8d80dba0067b65d29b71465907e959d495c3
3
+ metadata.gz: 1c8dd13b8a2733083eee3caa5696205ff1344db515b9f435eba542169296bc68
4
+ data.tar.gz: c093483120c87722d6131560d38a7e264de4215f688e45aa1ca4f5ef3c9fd137
5
5
  SHA512:
6
- metadata.gz: dabb3a15bee6dd1ceb78337f650bf9247b559d43eff596f51ec7d0a13b210627dcf88b4f1398c67d272ca9f26f47fdeee4431d6ef4f5abba8a235e91272ee7c7
7
- data.tar.gz: 29d5573efe47b2eacc7d1d53e2260ed400e52e68370f44c263c02b08116eb4c70c5d2ff298bb1500ce2df79ed6ebe995f031b4b76b00357880c930368db29395
6
+ metadata.gz: 810ded51d3f5612a7bb3c7490b3845cc5133ab62fdb996feda5b587dea4e864da16e2c9db9d349aa530ca031bd20bcd33cdbabc53be9e34508b3c54c7ef51d70
7
+ data.tar.gz: b744b92d9d7e947ba49eb5ef799ad01a144edfcbe089851f2dc4ac5e08918ebf9aa8b89f2c7a8db5319a21e44b438d5af5963563c16973a99ec8ca1797cd5872
@@ -5,10 +5,13 @@ require:
5
5
  - test_prof/rubocop
6
6
 
7
7
  AllCops:
8
- TargetRubyVersion: 2.5.1
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
- RSpec/AggregateFailures:
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: 10
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
@@ -1,28 +1,11 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2020-02-04 06:29:14 -0300 using RuboCop version 0.79.0.
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'
@@ -1 +1 @@
1
- ruby 2.7.0
1
+ ruby 2.7.1
@@ -1,11 +1,17 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  rvm:
4
- - 2.7.0
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
@@ -1,3 +1,15 @@
1
+ v 0.0.4 (2020.08.01)
2
+ ====================
3
+
4
+ Bug fixes:
5
+
6
+ * relative paths to commands failed while running using `gobstones` script
7
+
8
+ v 0.0.3 (20xx.xx.xx)
9
+ ====================
10
+
11
+ TODO
12
+
1
13
  v 0.0.2 (2015.01.10)
2
14
  ====================
3
15
 
@@ -1,7 +1,7 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- ast (2.4.0)
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.3)
12
+ diff-lcs (1.4.4)
13
13
  docile (1.3.2)
14
14
  error_handling_protocol (0.0.1)
15
- jaro_winkler (1.5.4)
16
- json (2.3.0)
17
- parallel (1.19.1)
18
- parser (2.7.0.2)
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.1)
28
- rspec-support (~> 3.9.1)
29
- rspec-expectations (3.9.0)
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.2)
36
- rubocop (0.79.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.0.1)
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, < 1.7)
43
- rubocop-rspec (1.37.1)
44
- rubocop (>= 0.68.1)
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.10.2)
59
+ test-prof (0.12.0)
55
60
  thor (1.0.1)
56
- tins (1.24.0)
61
+ tins (1.25.0)
57
62
  sync
58
63
  treetop (1.6.10)
59
64
  polyglot (~> 0.3)
60
- unicode-display_width (1.6.1)
65
+ unicode-display_width (1.7.0)
61
66
 
62
67
  PLATFORMS
63
68
  ruby
@@ -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.3'
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.5.1'
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 = Runner::NullExecutionContext.new)
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 = Runner::NullExecutionContext.new)
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 = Runner::NullExecutionContext.new)
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 = Runner::NullExecutionContext.new)
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 = Runner::NullExecutionContext.new)
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 = Runner::NullExecutionContext.new)
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 = Runner::NullExecutionContext.new)
62
+ def evaluate(_context)
63
63
  Oeste.new
64
64
  end
65
65
 
@@ -9,7 +9,7 @@ module Gobstones
9
9
  class Literal < Expression
10
10
  include Comparable
11
11
 
12
- def evaluate(_context = Runner::NullExecutionContext.new)
12
+ def evaluate(_context)
13
13
  self
14
14
  end
15
15
 
@@ -19,15 +19,20 @@ module Gobstones
19
19
  end
20
20
 
21
21
  def evaluate
22
- context = create_context
23
- return_values = main_definition.evaluate(context)
24
- Runner::ProgramResult.new(context.head, return_values)
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::ProgramExecutionContext.for(self)
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
@@ -61,7 +61,7 @@ module Gobstones
61
61
  end
62
62
 
63
63
  def multi_line_haskell_style_comments_regex
64
- /{-.*?\-}/m
64
+ /{-.*?-}/m
65
65
  end
66
66
  end
67
67
  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
- sub_n1_n2 = described_class.numbers(42, 15)
29
- sub = described_class.new(sub_n1_n2, 8.to_gbs_num)
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,6 +1,6 @@
1
1
  # TODO test/implement short-circuit?
2
2
  RSpec.describe 'evaluating boolean expressions' do
3
- let(:context) { clean_context }
3
+ let(:context) { any_context }
4
4
 
5
5
  describe And do
6
6
  it 'evaluates a simple and expression' do
@@ -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,5 +1,5 @@
1
1
  RSpec.describe EnclosedByParensExpression do
2
- let(:context) { clean_context }
2
+ let(:context) { any_context }
3
3
 
4
4
  it 'evaluates the inner expression' do
5
5
  expect(described_class.new(rojo).evaluate(context)).to eq(rojo)
@@ -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
@@ -1,7 +1,9 @@
1
1
  RSpec.describe Number do
2
+ let(:context) { any_context }
3
+
2
4
  it 'evaluates to itself' do
3
5
  num = 42.to_gbs_num
4
6
 
5
- expect(num.evaluate).to eq(num)
7
+ expect(num.evaluate(context)).to eq(num)
6
8
  end
7
9
  end
@@ -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 'non valid' do
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
- ProgramExecutionContext.for(program)
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.3
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-06 00:00:00.000000000 Z
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.5.1
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: