cauldron 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -1
  3. data/.rspec +1 -0
  4. data/Gemfile +16 -9
  5. data/Gemfile.lock +134 -64
  6. data/README.md +26 -0
  7. data/Rakefile +24 -99
  8. data/build_sandbox.rb +41 -0
  9. data/cucumber.yml +8 -0
  10. data/features/chop.feature +23 -0
  11. data/features/create_dynamic_statements.feature +14 -0
  12. data/features/generate_known_solution.feature +42 -0
  13. data/features/generate_new_statement.feature +20 -0
  14. data/features/step_definitions/cauldron_steps.rb +47 -0
  15. data/features/support/env.rb +1 -1
  16. data/features/use_existing_statements.feature +23 -0
  17. data/lib/cauldron.rb +41 -5
  18. data/lib/cauldron/actualized_composite.rb +35 -0
  19. data/lib/cauldron/array_collect_template/default.rb +95 -0
  20. data/lib/cauldron/array_collect_template/template.rb +57 -0
  21. data/lib/cauldron/builder.rb +60 -0
  22. data/lib/cauldron/caret.rb +50 -0
  23. data/lib/cauldron/dynamic_operator.rb +90 -0
  24. data/lib/cauldron/dynamic_operator_module.rb +140 -0
  25. data/lib/cauldron/example.rb +18 -0
  26. data/lib/cauldron/example_set.rb +36 -0
  27. data/lib/cauldron/histories.rb +53 -0
  28. data/lib/cauldron/history.rb +34 -0
  29. data/lib/cauldron/if_relationship.rb +4 -6
  30. data/lib/cauldron/number_addition_template/add_five.rb +71 -0
  31. data/lib/cauldron/number_addition_template/template.rb +56 -0
  32. data/lib/cauldron/operator.rb +62 -0
  33. data/lib/cauldron/operator/array_reverse_operator.rb +160 -0
  34. data/lib/cauldron/operator/concat_operator.rb +72 -0
  35. data/lib/cauldron/operator/hash_key_value_operator.rb +74 -0
  36. data/lib/cauldron/operator/numeric_operator.rb +115 -0
  37. data/lib/cauldron/operator/string_asterisk_operator.rb +131 -0
  38. data/lib/cauldron/operator/to_s_operator.rb +18 -0
  39. data/lib/cauldron/operator/var_collect_operator.rb +29 -0
  40. data/lib/cauldron/pot.rb +136 -26
  41. data/lib/cauldron/scope.rb +24 -0
  42. data/lib/cauldron/solution/composite.rb +236 -0
  43. data/lib/cauldron/solution/one.rb +49 -0
  44. data/lib/cauldron/statement_generator.rb +298 -0
  45. data/lib/cauldron/template_base.rb +14 -0
  46. data/lib/cauldron/tracer.rb +55 -0
  47. data/lib/cauldron/version.rb +1 -1
  48. data/lib/pry_tester.rb +76 -0
  49. data/ruby_to_sexp.rb +74 -0
  50. data/sandbox.rb +7 -0
  51. data/sexp_to_ruby.rb +150 -0
  52. data/spec/cauldron/actualized_composite_spec.rb +140 -0
  53. data/spec/cauldron/array_collect_template/default_spec.rb +41 -0
  54. data/spec/cauldron/builder_spec.rb +186 -0
  55. data/spec/cauldron/dynamic/add_number_template_spec.rb +30 -0
  56. data/spec/cauldron/dynamic_operator_spec.rb +416 -0
  57. data/spec/cauldron/example_set_spec.rb +49 -0
  58. data/spec/cauldron/example_spec.rb +33 -0
  59. data/spec/cauldron/histories_spec.rb +135 -0
  60. data/spec/cauldron/history_spec.rb +118 -0
  61. data/spec/cauldron/if_relationship_spec.rb +1 -1
  62. data/spec/cauldron/operator/array_reverse_operator_spec.rb +73 -0
  63. data/spec/cauldron/{concat_operator_spec.rb → operator/concat_operator_spec.rb} +30 -12
  64. data/spec/cauldron/operator/hash_key_value_operator_spec.rb +98 -0
  65. data/spec/cauldron/operator/numeric_operator_spec.rb +110 -0
  66. data/spec/cauldron/operator/string_asterisk_operator_spec.rb +196 -0
  67. data/spec/cauldron/operator/var_collect_operator_spec.rb +38 -0
  68. data/spec/cauldron/pot_spec.rb +176 -14
  69. data/spec/cauldron/solution/composite_spec.rb +421 -0
  70. data/spec/cauldron/solution/one_spec.rb +24 -0
  71. data/spec/cauldron/statement_generator_spec.rb +211 -0
  72. data/spec/cauldron/terminal_spec.rb +2 -2
  73. data/spec/spec_helper.rb +5 -1
  74. data/spec/support/code_matcher.rb +55 -0
  75. data/spec/support/include_instance_of_matcher.rb +9 -0
  76. data/spec/support/shared_examples_for_leaf_operators.rb +22 -0
  77. data/spec/support/shared_examples_for_operators.rb +23 -0
  78. data/syntax_spec.txt +2 -0
  79. metadata +104 -41
  80. data/README +0 -1
  81. data/README.rdoc +0 -19
  82. data/VERSION +0 -1
  83. data/features/cauldron_new_approach.feature +0 -46
  84. data/lib/cauldron/array_reverse_operator.rb +0 -39
  85. data/lib/cauldron/concat_operator.rb +0 -34
  86. data/lib/cauldron/numeric_operator.rb +0 -45
  87. data/lib/cauldron/relationship.rb +0 -5
  88. data/spec/cauldron/array_reverse_operator_spec.rb +0 -59
  89. data/spec/cauldron/numeric_operator_spec.rb +0 -70
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ module Cauldron::ArrayCollectTemplate
4
+
5
+ describe Default do
6
+
7
+ describe '#context_realizable?' do
8
+
9
+ context 'var2 is "Sparky"' do
10
+
11
+ let(:context) do
12
+ {:var2=>"Sparky", :var0=>["Sparky", "Kels"], :var1=>nil, :line=>0, :depth=>1, :total_line=>2, :point=>[0, 0]}
13
+ end
14
+
15
+ context 'using the index "2"' do
16
+
17
+ let(:subject) { Cauldron::ArrayCollectTemplate::Default.new([2]) }
18
+
19
+ it 'is false' do
20
+ subject.context_realizable?(context).should == false
21
+ end
22
+
23
+ end
24
+
25
+ context 'using the index "0"' do
26
+
27
+ let(:subject) { Cauldron::ArrayCollectTemplate::Default.new([0]) }
28
+
29
+ it 'is true' do
30
+ subject.context_realizable?(context).should == true
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,186 @@
1
+ require 'spec_helper'
2
+
3
+ module Cauldron
4
+
5
+ describe 'Builder' do
6
+
7
+ describe '#insertable_operators' do
8
+
9
+ context %q{with history "line: 0, depth:0, var0: ['Sparky','Kel'] "} do
10
+
11
+ let(:history) do
12
+ [
13
+ { :params => [['Sparky', 'Kel']], :solution => ['Spark','Ke'],
14
+ :history => [
15
+ { line: 0, depth: 0, total_line: 0, var0: ['Sparky', 'Kel'] }
16
+ ]
17
+ }
18
+ ]
19
+ end
20
+
21
+ let(:examples) do
22
+ Cauldron::ExampleSet.new(
23
+ [Example.new({ :arguments => [['Sparky', 'Kel']], :response => ['Spark','Ke'] })]
24
+ )
25
+ end
26
+
27
+ let(:composite) { Cauldron::Solution::Composite.new([]) }
28
+
29
+ let(:builder) { Cauldron::Builder.new(composite) }
30
+
31
+ it 'results include array ActualizedComposite' do
32
+ builder.insertable_operators(examples).should include_an_instance_of(Cauldron::ActualizedComposite)
33
+ end
34
+
35
+ it 'results do not include a string asterisk' do
36
+ builder.insertable_operators(examples).should_not include_an_instance_of(StringAsteriskOperator)
37
+ end
38
+
39
+ end
40
+
41
+ context %q{with history "line: 0, depth:0, var0: 'Sparky' "} do
42
+
43
+ let(:history) do
44
+ [
45
+ { :params => ['Sparky'], :solution => 'Spark',
46
+ :history => [
47
+ { line: 0, depth: 0, total_line: 0, var0: 'Sparky' }
48
+ ]
49
+ }
50
+ ]
51
+ end
52
+
53
+ let(:examples) do
54
+ Cauldron::ExampleSet.new(
55
+ [ Example.new({ :arguments => ['Sparky'], :response => 'Spark' })]
56
+ )
57
+ end
58
+
59
+ let(:composite) { Cauldron::Solution::Composite.new([]) }
60
+
61
+ let(:builder) { Cauldron::Builder.new(composite) }
62
+
63
+ it 'results do not include array collect' do
64
+ builder.insertable_operators(examples).should_not include_an_instance_of(Cauldron::ArrayCollectTemplate::Default)
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+
71
+ # describe '#insert_points' do
72
+
73
+ # let(:builder) { Cauldron::Builder.new(composite) }
74
+
75
+ # context 'empty method' do
76
+
77
+ # let(:composite) do
78
+ # Cauldron::Solution::Composite.new([])
79
+ # end
80
+
81
+ # it 'has 1' do
82
+ # builder.insert_points.length.should == 1
83
+ # end
84
+
85
+ # it 'is line 0 depth 0' do
86
+ # builder.insert_points.first.should == [0,0]
87
+ # end
88
+
89
+ # end
90
+
91
+ # context 'has line "var0 = 5"' do
92
+
93
+ # let(:composite) do
94
+ # Cauldron::Solution::Composite.new(
95
+ # [Tree::TreeNode.new('CHILD', NumericOperator.new([0],4))]
96
+ # )
97
+ # end
98
+
99
+ # it 'has 1' do
100
+ # builder.insert_points.length.should == 1
101
+ # end
102
+
103
+ # it 'is line 1 depth 0' do
104
+ # builder.insert_points.first.should == [1,0]
105
+ # end
106
+
107
+ # end
108
+
109
+ # context 'has line var0.collect {|x| x }' do
110
+
111
+ # let(:composite) do
112
+ # Cauldron::Solution::Composite.new(
113
+ # [Tree::TreeNode.new('CHILD', ArrayCollect.new([0]) )]
114
+ # )
115
+ # end
116
+
117
+ # it 'has 2' do
118
+ # builder.insert_points.length.should == 2
119
+ # end
120
+
121
+ # it 'has one point at line 1 depth 0' do
122
+ # builder.insert_points.should include([1,0])
123
+ # end
124
+
125
+ # it 'has one point at line 1 depth 1' do
126
+ # builder.insert_points.should include([1,1])
127
+ # end
128
+
129
+ # context 'has line "var1 = 6" at line 1 depth 0' do
130
+
131
+ # let(:composite) do
132
+ # Cauldron::Solution::Composite.new(
133
+ # [
134
+ # Tree::TreeNode.new('CHILD1', ArrayCollect.new([0]) ),
135
+ # Tree::TreeNode.new('CHILD2', NumericOperator.new([0],6) )
136
+ # ]
137
+ # )
138
+ # end
139
+
140
+ # it 'has 2' do
141
+ # builder.insert_points.length.should == 2
142
+ # end
143
+
144
+ # it 'has one point at line 2 depth 0' do
145
+ # builder.insert_points.should include([2,0])
146
+ # end
147
+
148
+ # it 'has one point at line 1 depth 1' do
149
+ # builder.insert_points.should include([1,1])
150
+ # end
151
+
152
+ # end
153
+
154
+ # context 'has line "var2 = 7" at line 2 depth 0' do
155
+
156
+ # let(:composite) do
157
+ # Cauldron::Solution::Composite.new(
158
+ # [
159
+ # Tree::TreeNode.new('CHILD1', ArrayCollect.new([0]) ),
160
+ # Tree::TreeNode.new('CHILD2', NumericOperator.new([0],6) ),
161
+ # Tree::TreeNode.new('CHILD3', NumericOperator.new([0],7) )
162
+ # ]
163
+ # )
164
+ # end
165
+
166
+ # it 'has 2' do
167
+ # builder.insert_points.length.should == 2
168
+ # end
169
+
170
+ # it 'has one point at line 3 depth 0' do
171
+ # builder.insert_points.should include([3,0])
172
+ # end
173
+
174
+ # it 'has one point at line 1 depth 1' do
175
+ # builder.insert_points.should include([1,1])
176
+ # end
177
+
178
+ # end
179
+
180
+ # end
181
+
182
+ # end
183
+
184
+ end
185
+
186
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ module Cauldron
4
+
5
+ describe 'DynamicNumberAddition' do
6
+
7
+ let(:generator) do
8
+ Cauldron::StatementGenerator.new.build_template(4, '+')
9
+ end
10
+
11
+ context 'given the example a = 4; return 6' do
12
+
13
+ let(:examples) do
14
+ Cauldron::ExampleSet.new(
15
+ [
16
+ Cauldron::Example.new({arguments: [4], response: 6}),
17
+ ]
18
+ )
19
+ end
20
+
21
+ it 'generates a statement a + 2' do
22
+ pending
23
+ generator.statement_classes(examples).should include_statement("a + 2")
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,416 @@
1
+ require 'spec_helper'
2
+
3
+ module Cauldron
4
+
5
+ describe DynamicOperator do
6
+
7
+ describe '#extend_validation' do
8
+
9
+ # PENDING - it should add more tracking as sexp
10
+ end
11
+
12
+ describe '#branch?' do
13
+
14
+ context 'var0.chop' do
15
+
16
+ let(:dynamic_operator) do
17
+ StatementGenerator.new.default_template('string',:chop).new([0])
18
+ end
19
+
20
+ it 'is false' do
21
+ dynamic_operator.branch?.should == false
22
+ end
23
+
24
+ end
25
+
26
+ context 'var1 = var0.collect { |var2| var2}' do
27
+
28
+ let(:dynamic_operator) do
29
+ StatementGenerator.new.default_template(
30
+ ['00sjack00','RowIAGE', 'iNathalie'],
31
+ :collect
32
+ ).new([0])
33
+ end
34
+
35
+ it 'is true' do
36
+ dynamic_operator.branch?.should == true
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ describe '#to_sexp' do
44
+
45
+ context 'var1 = var0.collect { |var2| var2}' do
46
+
47
+ let(:dynamic_operator) do
48
+ StatementGenerator.new.default_template(
49
+ ['00sjack00','RowIAGE', 'iNathalie'],
50
+ :collect
51
+ ).new([0])
52
+ end
53
+
54
+ let(:scope) { Cauldron::Scope.new(['var0']) }
55
+
56
+ it 'is var1 = var0.collect { |var2| var2}' do
57
+ dynamic_operator.to_sexp(scope,[]).should match_code_of(%q{
58
+ var1 = var0.collect do |var2|
59
+ end
60
+ }
61
+ )
62
+ end
63
+
64
+ context 'scope contains two parameters' do
65
+
66
+ let(:scope) { Cauldron::Scope.new(['var0', 'var1']) }
67
+
68
+ it 'is var1 = var0.collect { |var2| var2}' do
69
+ dynamic_operator.to_sexp(scope,[]).should match_code_of(%q{
70
+ var2 = var0.collect do |var3|
71
+
72
+ end
73
+ }
74
+ )
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+
81
+ end
82
+
83
+ describe '#realizable?' do
84
+
85
+ context 'var1 = var0.collect { |var2| var2}' do
86
+
87
+ let(:dynamic_operator) do
88
+ StatementGenerator.new.default_template(['a','b','c'],:collect).new([0])
89
+ end
90
+
91
+ context "when var0 only value is ['a','b','c']" do
92
+
93
+ let(:histories) do
94
+ Cauldron::Histories.new([Cauldron::History.new([{var0: ['a','b','c']}])])
95
+ end
96
+
97
+ it 'is true' do
98
+ dynamic_operator.realizable?(histories, [0,0]).should == true
99
+ end
100
+
101
+ end
102
+
103
+ context 'when var0 only value "string"' do
104
+
105
+ let(:histories) do
106
+ Cauldron::Histories.new([Cauldron::History.new([{var0: "string"}])])
107
+ end
108
+
109
+ it 'is false' do
110
+ dynamic_operator.realizable?(histories, [0,0]).should == false
111
+ end
112
+
113
+ end
114
+
115
+ context %q{adding statement inside:
116
+ var1 = var0.collect do |var2|
117
+ end
118
+ } do
119
+
120
+ let(:containing_statement) do
121
+ StatementGenerator.new.default_template(['a','b','c'],:collect).new([0])
122
+ end
123
+
124
+ let(:examples) do
125
+ Cauldron::ExampleSet.new(
126
+ [Cauldron::Example.new({ arguments: [["lion", "bear"]], response: ["bear", "lion"]})]
127
+ )
128
+ end
129
+
130
+ let(:composite) do
131
+ Cauldron::Solution::Composite.new(
132
+ [Tree::TreeNode.new("CHILD1", containing_statement )]
133
+ )
134
+ end
135
+
136
+ let(:histories) do
137
+ Cauldron::ActualizedComposite.new(composite,examples).histories
138
+ end
139
+
140
+ context 'adding statement "var3 = var2.collect { |var4| var4}"' do
141
+
142
+ let(:dynamic_operator) do
143
+ StatementGenerator.new.default_template(['a','b','c'],:collect).new([2])
144
+ end
145
+
146
+ it 'is false' do
147
+ dynamic_operator.realizable?(histories, [0,1]).should == false
148
+ end
149
+
150
+ end
151
+
152
+ context 'inserting statement "var3 = var1.collect { |var4| var4}"' do
153
+
154
+ let(:dynamic_operator) do
155
+ StatementGenerator.new.default_template(['a','b','c'],:collect).new([1])
156
+ end
157
+
158
+ it 'is false' do
159
+ dynamic_operator.realizable?(histories, [0,1]).should == false
160
+ end
161
+
162
+ end
163
+
164
+ end
165
+
166
+ end
167
+
168
+ context 'var0.chop' do
169
+
170
+ let(:dynamic_operator) do
171
+ StatementGenerator.new.default_template('string',:chop).new([0])
172
+ end
173
+
174
+ let(:composite) do
175
+ Cauldron::Solution::Composite.new(
176
+ [ Tree::TreeNode.new("CHILD1", dynamic_operator ) ]
177
+ )
178
+ end
179
+
180
+ describe '#context_instances' do
181
+
182
+ context %q{describe using [:var0 => 'asdas', :var1 => '3232']} do
183
+
184
+ let(:dynamic_operator_class) { StatementGenerator.new.default_template('string',:chop) }
185
+
186
+ it 'returns 2 instances' do
187
+ expect(dynamic_operator_class.context_instances(
188
+ [
189
+ {:var0=>["Sparky", "Kels"], :var1=>nil, :line=>0, :depth=>1, :total_line=>3, :point=>[0, 0]},
190
+ ]
191
+ ).length).to eql(2)
192
+ end
193
+
194
+ end
195
+
196
+ end
197
+
198
+ describe '#context_realizable?' do
199
+
200
+ let(:dynamic_operator_class) { StatementGenerator.new.default_template('string',:chop) }
201
+
202
+ context 'using var 0' do
203
+
204
+ context 'with context "{:var0=>["Sparky", "Kels"], :point=>[0, 0]}"' do
205
+
206
+ let(:context) do
207
+ {:var0=>["Sparky", "Kels"], :point=>[0, 0]}
208
+ end
209
+
210
+ it 'returns false' do
211
+ expect(dynamic_operator_class.new([0]).context_realizable?(context)).to be false
212
+ end
213
+
214
+ end
215
+
216
+ end
217
+
218
+ context 'var2 is "Sparky"' do
219
+
220
+ let(:context) do
221
+ {:var2=>"Sparky", :var0=>["Sparky", "Kels"], :var1=>nil, :line=>0, :depth=>1, :total_line=>2, :point=>[0, 0]}
222
+ end
223
+
224
+ context 'using the index "2"' do
225
+
226
+ it 'returns true' do
227
+ expect(dynamic_operator_class.new([2]).context_realizable?(context)).to be true
228
+ end
229
+
230
+ end
231
+
232
+ context 'using the index "0"' do
233
+
234
+ it 'returns true' do
235
+ expect(dynamic_operator_class.new([0]).context_realizable?(context)).to be false
236
+ end
237
+
238
+ end
239
+
240
+ end
241
+
242
+ end
243
+
244
+ context %q{adding statement inside:
245
+ var1 = var0.collect do |var2|
246
+ end
247
+ } do
248
+
249
+ let(:containing_statement) do
250
+ StatementGenerator.new.default_template(['lion','bear'],:collect).new([0])
251
+ end
252
+
253
+ context %q{var0 is ["lion", "bear"]} do
254
+
255
+ let(:examples) do
256
+ Cauldron::ExampleSet.new(
257
+ [Cauldron::Example.new({ arguments: [["lion", "bear"]], response: ["bear", "lion"]})]
258
+ )
259
+ end
260
+
261
+ let(:examples) do
262
+ Cauldron::ExampleSet.new(
263
+ [Cauldron::Example.new({ arguments: [["lion", "bear"]], response: ["bear", "lion"]})]
264
+ )
265
+ end
266
+
267
+ let(:composite) do
268
+ Cauldron::Solution::Composite.new(
269
+ [Tree::TreeNode.new("CHILD1", containing_statement )]
270
+ )
271
+ end
272
+
273
+ let(:histories) do
274
+ Cauldron::ActualizedComposite.new(composite,examples).histories
275
+ end
276
+
277
+ end
278
+
279
+ end
280
+
281
+ describe 'using incompatible variable' do
282
+
283
+ context 'when var0 is 8' do
284
+
285
+ let(:histories) do
286
+ Cauldron::Histories.new([Cauldron::History.new([{var0: 8}])])
287
+ end
288
+
289
+ it 'saves the failed example' do
290
+ expect{
291
+ dynamic_operator.realizable?(histories, [0,0])
292
+ }.to change{
293
+ dynamic_operator.failed_uses.length
294
+ }.from(0).to(1)
295
+ end
296
+
297
+ end
298
+
299
+ end
300
+
301
+ context 'when var0 is 8' do
302
+
303
+ let(:scope) { Cauldron::Scope.new(['var0']) }
304
+
305
+ let(:examples) do
306
+ Cauldron::ExampleSet.new(
307
+ [
308
+ Cauldron::Example.new({arguments: [8], response: 8}),
309
+ ]
310
+ )
311
+ end
312
+
313
+ let(:histories) do
314
+ Cauldron::Histories.new(
315
+ [Cauldron::History.new([{var0: 8}])]
316
+ )
317
+ end
318
+
319
+ it 'returns false' do
320
+ dynamic_operator.should_not be_realizable(histories, [0,0])
321
+ end
322
+
323
+ end
324
+
325
+ context 'when var0 is "test"' do
326
+
327
+ let(:scope) { Cauldron::Scope.new(['var0']) }
328
+
329
+ let(:examples) do
330
+ Cauldron::ExampleSet.new(
331
+ [
332
+ Cauldron::Example.new({arguments: ['test'], response: 'sdsas'}),
333
+ ]
334
+ )
335
+ end
336
+
337
+ let(:histories) do
338
+ Cauldron::Histories.new(
339
+ [Cauldron::History.new([{var0: 'test'}])]
340
+ )
341
+ end
342
+
343
+ it 'returns true' do
344
+ dynamic_operator.should be_realizable(histories,[0,0])
345
+ end
346
+
347
+ context 'when the history has "Sparky", "Kel"' do
348
+
349
+ let(:histories) do
350
+ Cauldron::Histories.new(
351
+ [
352
+ Cauldron::History.new([{:var0=>"Sparky", :line=>0, :depth=>0, :total_line=>0}]),
353
+ Cauldron::History.new([{:var0=>"Kel", :line=>0, :depth=>0, :total_line=>0}])
354
+ ]
355
+ )
356
+ end
357
+
358
+ it 'returns true' do
359
+ dynamic_operator.should be_realizable(histories,[0,0])
360
+ end
361
+
362
+ end
363
+
364
+ end
365
+
366
+ end
367
+
368
+ end
369
+
370
+ describe '#write_to_file' do
371
+
372
+ let(:filename) { 'temp.rb' }
373
+
374
+ let(:sexp) do
375
+ [:program,
376
+ [:stmts_add,
377
+ [:stmts_new],
378
+ [:def,
379
+ [:@ident, "test", [2, 4]],
380
+ [:paren,
381
+ [:params, [[:@ident, "var0", [2, 9]]], nil, nil, nil, nil, nil, nil]],
382
+ [:bodystmt,
383
+ [:stmts_add,
384
+ [:stmts_new],
385
+ [:call,
386
+ [:var_ref, [:@ident, "var0", [3, 2]]],
387
+ :".",
388
+ [:@ident, "bounce", [3, 7]]]],
389
+ nil,
390
+ nil,
391
+ nil]]]]
392
+ end
393
+
394
+ let(:dynamic_operator) do
395
+ DynamicOperator.new({}, sexp)
396
+ end
397
+
398
+ before(:each) do
399
+ if File.exists? File.join('tmp', 'temp.rb')
400
+ FileUtils.rm File.join('tmp', 'temp.rb')
401
+ end
402
+ end
403
+
404
+ it 'creates a file "tmp/temp.rb"' do
405
+ expect{
406
+ dynamic_operator.write_to_file('temp.rb')
407
+ }.to change{
408
+ File.exists?( File.join('tmp', 'temp.rb') )
409
+ }.from(false).to(true)
410
+ end
411
+
412
+ end
413
+
414
+ end
415
+
416
+ end