gobstones 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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: