cauldron 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/Gemfile +2 -0
  2. data/Rakefile +7 -0
  3. data/VERSION +1 -1
  4. data/features/cauldron_generates_runtime_method.feature +3 -2
  5. data/features/step_definitions/cauldron_steps.rb +0 -1
  6. data/features/support/method_1.example +3 -0
  7. data/features/support/method_2.example +6 -0
  8. data/lib/Chain.rb +140 -264
  9. data/lib/CodeHandler.rb +0 -4
  10. data/lib/ScopeDependencies.rb +1 -0
  11. data/lib/Theory.rb +12 -15
  12. data/lib/UnifiedChain.rb +265 -8
  13. data/lib/cauldron.rb +1 -1
  14. data/lib/cauldron/demos.rb +280 -0
  15. data/lib/cauldron/pot.rb +56 -30
  16. data/lib/cauldron/sexp2cauldron.rb +109 -126
  17. data/lib/cauldron/terminal.rb +5 -74
  18. data/lib/core/ClassMethodCallContainer.rb +14 -0
  19. data/lib/core/Container.rb +12 -2
  20. data/lib/core/InstanceCallContainer.rb +30 -4
  21. data/lib/core/TheoryGenerator.rb +2 -9
  22. data/lib/core/assignment/Equal.rb +1 -1
  23. data/lib/core/assignment/Equivalent.rb +1 -1
  24. data/lib/core/assignment/NotEqual.rb +1 -1
  25. data/lib/core/call_container/CallContainer.rb +7 -1
  26. data/lib/core/instance_call/Chop.rb +0 -9
  27. data/lib/core/instance_call/instance_calls.rb +8 -0
  28. data/lib/core/instance_call/length_equal.rb +1 -1
  29. data/lib/core/requirement/Requirement.rb +1 -0
  30. data/lib/core/runtime_class/class_names.rb +12 -12
  31. data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +0 -7
  32. data/lib/core/runtime_method/RuntimeMethod.rb +59 -45
  33. data/lib/core/statement/ActsAsStatement.rb +1 -1
  34. data/lib/core/statement/ArrayAccess.rb +28 -2
  35. data/lib/core/statement/OpenStatement.rb +7 -0
  36. data/lib/core/statement/Statement.rb +22 -18
  37. data/lib/core/statement/TheoryStatement.rb +8 -1
  38. data/lib/core/syntax/Addition.rb +3 -2
  39. data/lib/core/syntax/If.rb +8 -0
  40. data/lib/core/syntax/Return.rb +1 -1
  41. data/lib/core/variable/BaseVariable.rb +0 -2
  42. data/lib/core/variable/MethodParameter.rb +4 -31
  43. data/lib/core/variable/Unknown.rb +1 -5
  44. data/lib/implemented_chain.rb +3 -2
  45. data/lib/required.rb +0 -1
  46. data/lib/ruby_code/String.rb +0 -17
  47. data/lib/theories.rb +25 -1
  48. data/lib/theory/TheoryAction.rb +35 -5
  49. data/lib/theory/TheoryChainValidator.rb +10 -8
  50. data/lib/theory/TheoryComponent.rb +17 -0
  51. data/lib/theory/TheoryConnector.rb +76 -9
  52. data/lib/theory/TheoryDependent.rb +2 -2
  53. data/lib/theory/TheoryImplementation.rb +7 -7
  54. data/lib/util/ClassEvaluation.rb +2 -7
  55. data/lib/util/MethodValidation.rb +10 -6
  56. data/lib/util/Parser.rb +26 -20
  57. data/lib/util/StringToTheory.rb +27 -3
  58. data/spec/cauldron/chain_spec.rb +24 -0
  59. data/spec/cauldron/demos_spec.rb +30 -0
  60. data/spec/cauldron/pot_spec.rb +66 -0
  61. data/spec/cauldron/runtime_method_spec.rb +47 -5
  62. data/spec/cauldron/sexp_2_cauldron_spec.rb +92 -0
  63. data/spec/cauldron/terminal_spec.rb +1 -1
  64. data/spec/cauldron/theory_action_spec.rb +20 -0
  65. data/spec/cauldron/theory_connector_spec.rb +52 -0
  66. data/spec/cauldron/theory_spec.rb +59 -0
  67. data/spec/cauldron/unified_chain_spec.rb +102 -0
  68. data/spec/spec_helper.rb +10 -1
  69. data/tasks/theory_tasks.rake +274 -0
  70. data/test/fixtures/implementation_results/0/dump +0 -0
  71. data/test/fixtures/theories/0/dump +0 -0
  72. data/test/fixtures/theories/1/dump +0 -0
  73. data/test/fixtures/theories/10/dump +0 -0
  74. data/test/fixtures/theories/11/dump +0 -0
  75. data/test/fixtures/theories/12/dump +0 -0
  76. data/test/fixtures/theories/13/declaration.txt +1 -1
  77. data/test/fixtures/theories/13/desc +1 -1
  78. data/test/fixtures/theories/13/dump +0 -0
  79. data/test/fixtures/theories/14/dump +0 -0
  80. data/test/fixtures/theories/15/dump +0 -0
  81. data/test/fixtures/theories/16/dump +0 -0
  82. data/test/fixtures/theories/17/dump +0 -0
  83. data/test/fixtures/theories/18/dump +0 -0
  84. data/test/fixtures/theories/19/dump +0 -0
  85. data/test/fixtures/theories/2/dump +0 -0
  86. data/test/fixtures/theories/20/declaration.txt +1 -1
  87. data/test/fixtures/theories/20/desc +1 -1
  88. data/test/fixtures/theories/20/dump +0 -0
  89. data/test/fixtures/theories/3/dump +0 -0
  90. data/test/fixtures/theories/4/dump +0 -0
  91. data/test/fixtures/theories/5/dump +0 -0
  92. data/test/fixtures/theories/6/dump +0 -0
  93. data/test/fixtures/theories/7/dump +0 -0
  94. data/test/fixtures/theories/8/dump +0 -0
  95. data/test/fixtures/theories/9/dump +0 -0
  96. data/test/fixtures/theory_implementations/0/declaration.txt +1 -1
  97. data/test/fixtures/theory_implementations/0/dump +0 -0
  98. data/test/fixtures/theory_implementations/1/declaration.txt +11 -0
  99. data/test/fixtures/theory_implementations/1/dump +0 -0
  100. data/test/fixtures/theory_implementations/2/declaration.txt +11 -0
  101. data/test/fixtures/theory_implementations/2/dump +0 -0
  102. data/test/output/simple_method.txt +0 -1
  103. data/test/tc_contextual_variables.rb +2 -41
  104. data/test/tc_describe.rb +1 -2
  105. data/test/tc_method.rb +2 -5
  106. data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +5 -3
  107. data/test/unit/core/runtime_method/tc_runtime_method.rb +34 -56
  108. data/test/unit/core/statement/tc_block_statement.rb +2 -0
  109. data/test/unit/core/statement/tc_open_statement.rb +15 -6
  110. data/test/unit/core/statement/tc_statement.rb +4 -5
  111. data/test/unit/core/statement/tc_statement_dependencies.rb +1 -0
  112. data/test/unit/core/statement/tc_theory_statement.rb +2 -0
  113. data/test/unit/core/syntax/tc_if_container.rb +5 -5
  114. data/test/unit/core/tc_theory_generator_heavy.rb +1 -1
  115. data/test/unit/core/tracking/tc_history.rb +3 -1
  116. data/test/unit/core/variable/tc_method_parameter_variable.rb +2 -2
  117. data/test/unit/tc_chain_with_case_1.rb +1 -1
  118. data/test/unit/tc_method_usage.rb +1 -1
  119. data/test/unit/tc_theory.rb +8 -2
  120. data/test/unit/theory/tc_theory_action.rb +37 -5
  121. data/test/unit/theory/tc_theory_chain_validator.rb +3 -3
  122. data/test/unit/theory/tc_theory_connector.rb +2 -37
  123. data/test/unit/theory/tc_theory_dependent.rb +2 -0
  124. data/test/unit/theory/tc_theory_implementation.rb +5 -1
  125. data/test/unit/theory/tc_theory_result.rb +3 -2
  126. data/test/unit/util/tc_method_validation.rb +4 -1
  127. data/test/unit/util/tc_parser.rb +2 -0
  128. data/test/unit/util/tc_string_to_theory.rb +3 -2
  129. data/tmp/runtime_method_evaluation.rb +7 -4
  130. metadata +59 -13
  131. data/lib/core/syntax/IfContainer.rb +0 -100
@@ -2,5 +2,71 @@ require 'spec_helper'
2
2
 
3
3
  module Cauldron
4
4
 
5
+ describe 'Pot' do
6
+
7
+ describe '#simmer' do
8
+ it 'can simmer with demo one' do
9
+ pot = Cauldron::Pot.new
10
+ pot.clear
11
+ lambda {pot.simmer(demo_one)}.should_not raise_error
12
+ end
13
+ it 'can simmer with demo two' do
14
+ pot = Cauldron::Pot.new
15
+ pot.clear
16
+ lambda {pot.simmer(demo_two)}.should_not raise_error
17
+ end
18
+ it 'can simmer with both demo one and two' do
19
+ pot = Cauldron::Pot.new
20
+ pot.clear
21
+ lambda {pot.simmer(demo_one)}.should_not raise_error
22
+ lambda {pot.simmer(demo_two)}.should_not raise_error
23
+ end
24
+ end
25
+
26
+ describe '#brew' do
27
+ it 'can come up with a solution after it has been given demo_one' do
28
+ pot = Cauldron::Pot.new
29
+ pot.clear
30
+ pot.simmer(demo_one)
31
+ cases = []
32
+ cases << convert_to_example(separate_values("'sparky','sparky'"))
33
+ cases << convert_to_example(separate_values("'kel','kel'"))
34
+
35
+ ruby = "
36
+ def method_0(var_0)
37
+ \treturn var_0
38
+ end
39
+ "
40
+ parser = RubyParser.new
41
+ sexp = parser.process(ruby)
42
+ sexp2cauldron = Sexp2Cauldron.new
43
+ pot.brew(cases).reset_ids!.basic_write.should == sexp2cauldron.process(sexp).basic_write
44
+ end
45
+
46
+ it 'can come up with a solution that fits demo two' do
47
+ pot = Cauldron::Pot.new
48
+ pot.clear
49
+ pot.simmer(demo_two)
50
+ cases = []
51
+ cases << convert_to_example(separate_values("'carrot','vegtable'"))
52
+ cases << convert_to_example(separate_values("'fish','animal'"))
53
+
54
+ ruby = "
55
+ def method_0(var_0)
56
+ \tif(var_0 == 'carrot')
57
+ \t\treturn 'vegtable'
58
+ \tend
59
+ \treturn 'animal'
60
+ end
61
+ "
62
+ parser = RubyParser.new
63
+ sexp = parser.process(ruby)
64
+ sexp2cauldron = Sexp2Cauldron.new
65
+ pot.brew(cases).reset_ids!.basic_write.should == sexp2cauldron.process(sexp).basic_write
66
+ end
67
+
68
+ end
69
+
70
+ end
5
71
 
6
72
  end
@@ -7,10 +7,8 @@ def fetch_runtime
7
7
  return var_2
8
8
  end
9
9
  !
10
- puts basic_runtime
11
10
  res = eval(basic_runtime)
12
11
  sexp = RubyParser.new.process(basic_runtime)
13
- p Ruby2Ruby.new.process(sexp)
14
12
 
15
13
  end
16
14
 
@@ -20,15 +18,59 @@ module Cauldron
20
18
  describe 'RuntimeMethod' do
21
19
 
22
20
  describe '#basic_write' do
23
-
24
21
  # => TODO I need a factory or better way to write the runtime methods
25
22
  it 'should return a string of the built method without comment information' do
26
23
  method_param = MethodParameter.new
27
24
  temporary_runtime_method = RuntimeMethod.new(MethodUsage.new(method_param))
28
25
  temporary_runtime_method << Statement.new(Return.new,method_param)
29
- temporary_runtime_method.basic_write.should == "def method_2(var_4)\n\treturn var_4\nend\n"
26
+ temporary_runtime_method.reset_ids!.basic_write.should == "def method_0(var_0)\n\treturn var_0\nend\n"
27
+ end
28
+ end
29
+
30
+ describe '#reset_ids!' do
31
+ context 'runtime method is empty' do
32
+ it 'should return a new runtime method with the method id and variables starting from 0(this is for comparision)' do
33
+ parser = RubyParser.new
34
+ ruby = "
35
+ def method_8
36
+ end
37
+ "
38
+ sexp = parser.process(ruby)
39
+ sexp2cauldron = Sexp2Cauldron.new
40
+ unprocessed_runtime_method = sexp2cauldron.process(sexp)
41
+ reset_runtime_method = unprocessed_runtime_method.reset_ids!
42
+ reset_runtime_method.method_id.should == '0'
43
+ end
44
+ end
45
+ context 'using runtime method with if statement' do
46
+ it 'it should reset all the ids to 0 and count up' do
47
+ parser = RubyParser.new
48
+ ruby = "
49
+ def method_3(var_8)
50
+ \tif(var_8 == 'apple')
51
+ \t\treturn 'fruit'
52
+ \tend
53
+ \treturn 'vegetable'
54
+ end
55
+ "
56
+ sexp = parser.process(ruby)
57
+ sexp2cauldron = Sexp2Cauldron.new
58
+ unprocessed_runtime_method = sexp2cauldron.process(sexp)
59
+ reset_runtime_method = unprocessed_runtime_method.reset_ids!
60
+ reset_runtime_method.method_id.should == '0'
61
+ reset_runtime_method.variables.length.should == 1
62
+
63
+ ruby_reset = "
64
+ def method_0(var_0)
65
+ \tif(var_0 == 'apple')
66
+ \t\treturn 'fruit'
67
+ \tend
68
+ \treturn 'vegetable'
69
+ end
70
+ "
71
+ reset_runtime_method.basic_write.should == strip_whitespace(ruby_reset)+"\n"
72
+ end
30
73
  end
31
-
32
74
  end
33
75
 
34
76
  end
@@ -20,6 +20,98 @@ module Cauldron
20
20
  sexp2cauldron.process(sexp).write.should == Statement.new(Unknown.new(4),Equal.new,Literal.new(9)).write
21
21
  end
22
22
 
23
+ it 'generates a basic if container' do
24
+ parser = RubyParser.new
25
+ ruby = %q!
26
+ if(var5 == 6)
27
+ end
28
+ !
29
+ sexp = parser.process(ruby)
30
+ sexp2cauldron = Sexp2Cauldron.new
31
+ sexp = parser.process(ruby)
32
+ sexp2cauldron.process(sexp).write.should == "if(var_5 == 6)\nend"
33
+ end
34
+
35
+ it 'generates an empty runtime method' do
36
+ parser = RubyParser.new
37
+ ruby = %q!
38
+ def method_4
39
+ end
40
+ !
41
+ sexp = parser.process(ruby)
42
+ sexp2cauldron = Sexp2Cauldron.new
43
+ sexp2cauldron.process(sexp).basic_write.should == strip_whitespace(ruby)+"\n"
44
+ end
45
+
46
+ it 'generates a method with a simple statement' do
47
+ parser = RubyParser.new
48
+ ruby = "
49
+ def method_3
50
+ \tvar_8 = 9
51
+ end
52
+ "
53
+ sexp = parser.process(ruby)
54
+ sexp2cauldron = Sexp2Cauldron.new
55
+ a = sexp2cauldron.process(sexp)
56
+ a.basic_write.should == strip_whitespace(ruby)+"\n"
57
+ end
58
+
59
+ it 'generates a method with a simple if statement' do
60
+ parser = RubyParser.new
61
+ ruby = "
62
+ def method_6
63
+ \tif(var_8 == 9)
64
+ \t\treturn var_8
65
+ \tend
66
+ end
67
+ "
68
+ sexp2cauldron = Sexp2Cauldron.new
69
+ sexp = parser.process(ruby)
70
+ sexp2cauldron.process(sexp).basic_write.should == strip_whitespace(ruby)+"\n"
71
+ end
72
+
73
+ it 'generates a method with an if statement and two exit points' do
74
+ parser = RubyParser.new
75
+ ruby = "
76
+ def method_3(var_0)
77
+ \tif(var_0 == 'apple')
78
+ \t\treturn 'fruit'
79
+ \tend
80
+ \treturn 'vegetable'
81
+ end
82
+ "
83
+ sexp2cauldron = Sexp2Cauldron.new
84
+ sexp = parser.process(ruby)
85
+ sexp2cauldron.process(sexp).basic_write.should == strip_whitespace(ruby)+"\n"
86
+ end
87
+
88
+ it 'generates the solution to demo 1' do
89
+ parser = RubyParser.new
90
+ ruby = "
91
+ def method_0(var_0)
92
+ \treturn var_0
93
+ end
94
+ "
95
+ sexp2cauldron = Sexp2Cauldron.new
96
+ sexp = parser.process(ruby)
97
+ sexp2cauldron.process(sexp).basic_write.should == strip_whitespace(ruby)+"\n"
98
+ end
99
+
100
+ it 'can parse the solution to demo 2' do
101
+ parser = RubyParser.new
102
+ ruby = "
103
+ def method_0(var_0)
104
+ \tif(var_0 == 'fish')
105
+ \t\treturn 'animal'
106
+ \tend
107
+ \treturn 'vegtable'
108
+ end
109
+ "
110
+ sexp2cauldron = Sexp2Cauldron.new
111
+ sexp = parser.process(ruby)
112
+ sexp2cauldron.process(sexp).basic_write.should == strip_whitespace(ruby)+"\n"
113
+ end
114
+
23
115
  end
24
116
  end
25
117
 
@@ -21,7 +21,7 @@ module Cauldron
21
21
  end
22
22
  end
23
23
 
24
- describe 'submit' do
24
+ describe '#submit' do
25
25
  context "with example case \"'sparky', 'sparky'\"" do
26
26
  subject do
27
27
  terminal.submit "'sparky','sparky'"
@@ -2,4 +2,24 @@ require 'spec_helper'
2
2
 
3
3
  module Cauldron
4
4
 
5
+ describe 'TheoryAction' do
6
+
7
+ describe '#statements_with_variable' do
8
+
9
+ it 'should return two statements for the action "Statement.new(Return.new, var0.params[var2]),var0.statement_id"' do
10
+ link_one_action = TheoryAction.new(
11
+ TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var1.params[var3])')),
12
+ StringToTheory.run('var1.statement_id')
13
+ )
14
+ link_one_action.statements_with_variable(1).length.should == 3
15
+ res = link_one_action.statements_with_variable(1).collect {|x| x.write }
16
+ res.should include('var1.statement_id')
17
+ res.should include('var1.params')
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
5
25
  end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ StandardLogger.instance.level = Logger::FATAL
4
+
5
+ module Cauldron
6
+
7
+ describe TheoryConnector do
8
+
9
+ describe '#generate_chains' do
10
+ context 'when it has demo 1 theories' do
11
+ it 'will generate just one chain' do
12
+ theories = demo_one[:chain].collect {|x| x}
13
+ runtime_method = demo_one[:initial_method]
14
+ test_cases = demo_one[:test_cases]
15
+
16
+ connector = TheoryConnector.new(demo_one[:values])
17
+ connector.generate_chains(runtime_method,test_cases,theories).length.should == 1
18
+ end
19
+ end
20
+ context "when it has demo two's theories" do
21
+ it 'will generate just one chain' do
22
+ theories = demo_two[:chain].collect {|x| x}
23
+ runtime_method = demo_two[:initial_method]
24
+ test_cases = demo_two[:test_cases]
25
+
26
+ connector = TheoryConnector.new(demo_two[:values])
27
+ connector.generate_chains(runtime_method,test_cases,theories).length.should == 1
28
+ end
29
+ end
30
+ context "when it has both demo one and two's theories" do
31
+ it 'will generate just one chain' do
32
+ @theories = demo_one[:chain].collect {|x| x} + demo_two[:chain].collect {|x| x}
33
+ runtime_method = demo_one[:initial_method]
34
+ test_cases = demo_one[:test_cases]
35
+
36
+ connector = TheoryConnector.new(demo_one[:values])
37
+ connector.generate_chains(runtime_method,test_cases,@theories).length.should == 1
38
+ end
39
+ it 'will generate two chains when given demo two test cases' do
40
+ @theories = demo_one[:chain].collect {|x| x} + demo_two[:chain].collect {|x| x}
41
+ runtime_method = demo_two[:initial_method]
42
+ test_cases = demo_two[:test_cases]
43
+
44
+ connector = TheoryConnector.new(demo_one[:values])
45
+ connector.generate_chains(runtime_method,test_cases,@theories).length.should == 1
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ module Cauldron
4
+
5
+ describe 'Theory' do
6
+
7
+ describe '#map_to' do
8
+ it 'can map a simple theory to new values' do
9
+ link_one_action = TheoryAction.new(
10
+ TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var2.params[var3])')),
11
+ StringToTheory.run('var1.statement_id')
12
+ )
13
+ link_one_result = TheoryResult.new(StringToTheory.run("if(var1.all_pass?(var2))\nreturn true\nend"))
14
+ theory = Theory.new([],link_one_action,[link_one_result])
15
+
16
+ # Create the mapping for the theory
17
+ mapping = Mapping.new({
18
+ 1=>IntrinsicRuntimeMethod.new,
19
+ 2=>IntrinsicTestCases.new,
20
+ 3=>IntrinsicLiteral.new(0)
21
+ })
22
+ # => TODO Why doesn't the tab character appear - or appear as a space
23
+ result = "
24
+ if:
25
+
26
+ action:
27
+ \truntime_method.add_statement_at(Statement.new(Return.new, test_cases.params[0]),runtime_method.statement_id)
28
+ result:
29
+ \tif(runtime_method.all_pass?(test_cases))
30
+ \t\treturn true
31
+ \tend
32
+ "
33
+ theory.map_to(mapping).write.strip.should == result.strip
34
+
35
+ end
36
+ it 'can map a theory with an if statement' do
37
+
38
+ link_one_action = TheoryAction.new(
39
+ TheoryStatement.new(StringToTheory.run(
40
+ 'OpenStatement.new(If.new,Container.new(var1.params[var3],Equivalent.new,var2[var4][:params][var5]))')
41
+ ),
42
+ StringToTheory.run('var1.statement_id')
43
+ )
44
+ theory = Theory.new([],link_one_action,[])
45
+ mapping = Mapping.new({
46
+ 1=>IntrinsicRuntimeMethod.new,
47
+ 2=>IntrinsicTestCases.new,
48
+ 3=>IntrinsicLiteral.new(0),
49
+ 4=>IntrinsicLiteral.new(0),
50
+ 5=>IntrinsicLiteral.new(0)
51
+ })
52
+ puts theory.map_to(mapping).describe
53
+
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,102 @@
1
+ require 'spec_helper'
2
+
3
+ module Cauldron
4
+
5
+ describe 'UnifiedChain' do
6
+
7
+ describe '#theory_variables' do
8
+ it 'gets the correct number of variables for demo 1' do
9
+ temp = Object.new
10
+ temp.extend(Cauldron::Demos)
11
+ demo = temp.demo_one
12
+ # => TODO Demos should probably only save unified chains
13
+ unified_chain = demo[:chain].unify_chain
14
+ unified_chain.theory_variables.length.should == 3
15
+ end
16
+ it 'gets the correct number of variables for demo 2' do
17
+ temp = Object.new
18
+ temp.extend(Cauldron::Demos)
19
+ demo = temp.demo_two
20
+ unified_chain = demo[:chain].unify_chain
21
+ unified_chain.theory_variables.length.should == 6
22
+ unified_chain.theory_variables.collect {|x| x.theory_variable_id}.uniq.length.should == 6
23
+ end
24
+ end
25
+
26
+ describe '#implementation_permuatations' do
27
+ context 'when using demo one chain' do
28
+
29
+ it 'creates just one implementation permutation' do
30
+ temp = Object.new
31
+ temp.extend(Cauldron::Demos)
32
+ demo = temp.demo_one
33
+ unified_chain = demo[:chain].unify_chain
34
+ test_cases = demo[:test_cases]
35
+
36
+ unified_chain.implementation_permuatations(
37
+ RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
38
+ test_cases,
39
+ Mapping.new
40
+ ).length.should == 1
41
+ end
42
+
43
+ it 'is a unified chain' do
44
+ temp = Object.new
45
+ temp.extend(Cauldron::Demos)
46
+ demo = temp.demo_one
47
+ unified_chain = demo[:chain].unify_chain
48
+ test_cases = demo[:test_cases]
49
+
50
+ unified_chain.implementation_permuatations(
51
+ RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
52
+ test_cases,
53
+ Mapping.new
54
+ )[0].should be_kind_of(ImplementedChain)
55
+
56
+ unified_chain.implementation_permuatations(
57
+ RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
58
+ test_cases,
59
+ Mapping.new
60
+ )[0].write.should_not include('var')
61
+
62
+ end
63
+ context 'when using demo two' do
64
+ it 'creates just one implementation permutation' do
65
+ temp = Object.new
66
+ temp.extend(Cauldron::Demos)
67
+ demo = temp.demo_two
68
+ unified_chain = demo[:chain].unify_chain
69
+ test_cases = demo[:test_cases]
70
+
71
+ unified_chain.implementation_permuatations(
72
+ RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
73
+ test_cases,
74
+ Mapping.new
75
+ ).each {|chain| chain.write.should_not include('var')}
76
+
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '#mapping_permutations' do
82
+ before(:each) {
83
+ temp = Object.new
84
+ temp.extend(Cauldron::Demos)
85
+ demo = temp.demo_one
86
+ @unified_chain = demo[:chain].unify_chain
87
+ }
88
+ it 'should create four permutations with one variable id and four values' do
89
+ values = [IntrinsicRuntimeMethod.new,IntrinsicTestCases.new,IntrinsicLiteral.new(0),IntrinsicLiteral.new(1)]
90
+ @unified_chain.mapping_permutations([0],values).length.should == 4
91
+ end
92
+ it 'should create 9 permutations with three variable id and three values' do
93
+ values = [IntrinsicRuntimeMethod.new,IntrinsicTestCases.new,IntrinsicLiteral.new(1)]
94
+ @unified_chain.mapping_permutations([0,1,2],values).length.should == 6
95
+ end
96
+ end
97
+
98
+ end
99
+
100
+ end
101
+
102
+ end