cauldron 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/Rakefile +7 -0
- data/VERSION +1 -1
- data/features/cauldron_generates_runtime_method.feature +3 -2
- data/features/step_definitions/cauldron_steps.rb +0 -1
- data/features/support/method_1.example +3 -0
- data/features/support/method_2.example +6 -0
- data/lib/Chain.rb +140 -264
- data/lib/CodeHandler.rb +0 -4
- data/lib/ScopeDependencies.rb +1 -0
- data/lib/Theory.rb +12 -15
- data/lib/UnifiedChain.rb +265 -8
- data/lib/cauldron.rb +1 -1
- data/lib/cauldron/demos.rb +280 -0
- data/lib/cauldron/pot.rb +56 -30
- data/lib/cauldron/sexp2cauldron.rb +109 -126
- data/lib/cauldron/terminal.rb +5 -74
- data/lib/core/ClassMethodCallContainer.rb +14 -0
- data/lib/core/Container.rb +12 -2
- data/lib/core/InstanceCallContainer.rb +30 -4
- data/lib/core/TheoryGenerator.rb +2 -9
- data/lib/core/assignment/Equal.rb +1 -1
- data/lib/core/assignment/Equivalent.rb +1 -1
- data/lib/core/assignment/NotEqual.rb +1 -1
- data/lib/core/call_container/CallContainer.rb +7 -1
- data/lib/core/instance_call/Chop.rb +0 -9
- data/lib/core/instance_call/instance_calls.rb +8 -0
- data/lib/core/instance_call/length_equal.rb +1 -1
- data/lib/core/requirement/Requirement.rb +1 -0
- data/lib/core/runtime_class/class_names.rb +12 -12
- data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +0 -7
- data/lib/core/runtime_method/RuntimeMethod.rb +59 -45
- data/lib/core/statement/ActsAsStatement.rb +1 -1
- data/lib/core/statement/ArrayAccess.rb +28 -2
- data/lib/core/statement/OpenStatement.rb +7 -0
- data/lib/core/statement/Statement.rb +22 -18
- data/lib/core/statement/TheoryStatement.rb +8 -1
- data/lib/core/syntax/Addition.rb +3 -2
- data/lib/core/syntax/If.rb +8 -0
- data/lib/core/syntax/Return.rb +1 -1
- data/lib/core/variable/BaseVariable.rb +0 -2
- data/lib/core/variable/MethodParameter.rb +4 -31
- data/lib/core/variable/Unknown.rb +1 -5
- data/lib/implemented_chain.rb +3 -2
- data/lib/required.rb +0 -1
- data/lib/ruby_code/String.rb +0 -17
- data/lib/theories.rb +25 -1
- data/lib/theory/TheoryAction.rb +35 -5
- data/lib/theory/TheoryChainValidator.rb +10 -8
- data/lib/theory/TheoryComponent.rb +17 -0
- data/lib/theory/TheoryConnector.rb +76 -9
- data/lib/theory/TheoryDependent.rb +2 -2
- data/lib/theory/TheoryImplementation.rb +7 -7
- data/lib/util/ClassEvaluation.rb +2 -7
- data/lib/util/MethodValidation.rb +10 -6
- data/lib/util/Parser.rb +26 -20
- data/lib/util/StringToTheory.rb +27 -3
- data/spec/cauldron/chain_spec.rb +24 -0
- data/spec/cauldron/demos_spec.rb +30 -0
- data/spec/cauldron/pot_spec.rb +66 -0
- data/spec/cauldron/runtime_method_spec.rb +47 -5
- data/spec/cauldron/sexp_2_cauldron_spec.rb +92 -0
- data/spec/cauldron/terminal_spec.rb +1 -1
- data/spec/cauldron/theory_action_spec.rb +20 -0
- data/spec/cauldron/theory_connector_spec.rb +52 -0
- data/spec/cauldron/theory_spec.rb +59 -0
- data/spec/cauldron/unified_chain_spec.rb +102 -0
- data/spec/spec_helper.rb +10 -1
- data/tasks/theory_tasks.rake +274 -0
- data/test/fixtures/implementation_results/0/dump +0 -0
- data/test/fixtures/theories/0/dump +0 -0
- data/test/fixtures/theories/1/dump +0 -0
- data/test/fixtures/theories/10/dump +0 -0
- data/test/fixtures/theories/11/dump +0 -0
- data/test/fixtures/theories/12/dump +0 -0
- data/test/fixtures/theories/13/declaration.txt +1 -1
- data/test/fixtures/theories/13/desc +1 -1
- data/test/fixtures/theories/13/dump +0 -0
- data/test/fixtures/theories/14/dump +0 -0
- data/test/fixtures/theories/15/dump +0 -0
- data/test/fixtures/theories/16/dump +0 -0
- data/test/fixtures/theories/17/dump +0 -0
- data/test/fixtures/theories/18/dump +0 -0
- data/test/fixtures/theories/19/dump +0 -0
- data/test/fixtures/theories/2/dump +0 -0
- data/test/fixtures/theories/20/declaration.txt +1 -1
- data/test/fixtures/theories/20/desc +1 -1
- data/test/fixtures/theories/20/dump +0 -0
- data/test/fixtures/theories/3/dump +0 -0
- data/test/fixtures/theories/4/dump +0 -0
- data/test/fixtures/theories/5/dump +0 -0
- data/test/fixtures/theories/6/dump +0 -0
- data/test/fixtures/theories/7/dump +0 -0
- data/test/fixtures/theories/8/dump +0 -0
- data/test/fixtures/theories/9/dump +0 -0
- data/test/fixtures/theory_implementations/0/declaration.txt +1 -1
- data/test/fixtures/theory_implementations/0/dump +0 -0
- data/test/fixtures/theory_implementations/1/declaration.txt +11 -0
- data/test/fixtures/theory_implementations/1/dump +0 -0
- data/test/fixtures/theory_implementations/2/declaration.txt +11 -0
- data/test/fixtures/theory_implementations/2/dump +0 -0
- data/test/output/simple_method.txt +0 -1
- data/test/tc_contextual_variables.rb +2 -41
- data/test/tc_describe.rb +1 -2
- data/test/tc_method.rb +2 -5
- data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +5 -3
- data/test/unit/core/runtime_method/tc_runtime_method.rb +34 -56
- data/test/unit/core/statement/tc_block_statement.rb +2 -0
- data/test/unit/core/statement/tc_open_statement.rb +15 -6
- data/test/unit/core/statement/tc_statement.rb +4 -5
- data/test/unit/core/statement/tc_statement_dependencies.rb +1 -0
- data/test/unit/core/statement/tc_theory_statement.rb +2 -0
- data/test/unit/core/syntax/tc_if_container.rb +5 -5
- data/test/unit/core/tc_theory_generator_heavy.rb +1 -1
- data/test/unit/core/tracking/tc_history.rb +3 -1
- data/test/unit/core/variable/tc_method_parameter_variable.rb +2 -2
- data/test/unit/tc_chain_with_case_1.rb +1 -1
- data/test/unit/tc_method_usage.rb +1 -1
- data/test/unit/tc_theory.rb +8 -2
- data/test/unit/theory/tc_theory_action.rb +37 -5
- data/test/unit/theory/tc_theory_chain_validator.rb +3 -3
- data/test/unit/theory/tc_theory_connector.rb +2 -37
- data/test/unit/theory/tc_theory_dependent.rb +2 -0
- data/test/unit/theory/tc_theory_implementation.rb +5 -1
- data/test/unit/theory/tc_theory_result.rb +3 -2
- data/test/unit/util/tc_method_validation.rb +4 -1
- data/test/unit/util/tc_parser.rb +2 -0
- data/test/unit/util/tc_string_to_theory.rb +3 -2
- data/tmp/runtime_method_evaluation.rb +7 -4
- metadata +59 -13
- data/lib/core/syntax/IfContainer.rb +0 -100
data/lib/cauldron/pot.rb
CHANGED
@@ -6,60 +6,86 @@ module Cauldron
|
|
6
6
|
VERSION = '0-01'
|
7
7
|
|
8
8
|
def initialize()
|
9
|
-
|
9
|
+
#StandardLogger.instance.level = Logger::FATAL
|
10
10
|
end
|
11
11
|
|
12
12
|
def brew(test_cases)
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
chains = complete_chains(test_cases)
|
15
|
+
if chains.empty?
|
16
|
+
raise StandardError.new('Failed to generate a chain for this problem')
|
17
|
+
end
|
18
|
+
|
19
|
+
# => TODO This probably shouldn't be needed
|
20
|
+
written_chains = chains.collect {|x| x.write}
|
21
|
+
unique_written_chains = written_chains.uniq
|
22
|
+
unique_chains = []
|
23
|
+
chains.each do |x|
|
24
|
+
unless unique_chains.any? {|y| y.write == x.write}
|
25
|
+
unique_chains << x
|
26
|
+
end
|
27
|
+
end
|
28
|
+
chains = unique_chains
|
29
|
+
|
30
|
+
runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
|
31
|
+
chains.each do |chain|
|
32
|
+
|
33
|
+
unified_chain = chain.unify_chain
|
34
|
+
implementation_permutations = unified_chain.implementation_permuatations(runtime_method.copy,test_cases.copy,Mapping.new)
|
35
|
+
|
36
|
+
# Go through each of the permutations and create the runtime method for the chain
|
37
|
+
validator = TheoryChainValidator.new
|
38
|
+
begin
|
39
|
+
result = validator.build(runtime_method.copy,test_cases.copy,implementation_permutations)
|
40
|
+
rescue StandardError => e
|
41
|
+
StandardLogger.instance.warning e
|
42
|
+
next
|
43
|
+
end
|
44
|
+
return result
|
45
|
+
end
|
46
|
+
return nil
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
def complete_chains(test_cases)
|
51
|
+
|
52
|
+
theories = saved_theories
|
17
53
|
|
18
|
-
# Prepare the theory chain connector
|
19
54
|
runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
|
20
55
|
tc = Parser.run('test_cases')
|
21
56
|
tc_index_0 = IntrinsicLiteral.new(0)
|
22
57
|
tc_index_1 = IntrinsicLiteral.new(1)
|
23
58
|
param_0 = IntrinsicLiteral.new(0)
|
24
|
-
real_method = Parser.run('runtime_method')
|
25
|
-
|
26
|
-
# TODO Still need to include last_real_method
|
27
|
-
last_real_method = Parser.run('last_runtime_method')
|
59
|
+
real_method = Parser.run('runtime_method')
|
28
60
|
|
29
61
|
# Create the thoery connector and the values available
|
30
62
|
# TODO These values should actually be retreived progressively
|
31
|
-
potential_values = MappingValues.new([tc,tc_index_0,tc_index_1,param_0,real_method])
|
63
|
+
potential_values = MappingValues.new([tc,tc_index_0,tc_index_1,param_0,real_method])
|
32
64
|
connector = TheoryConnector.new(potential_values)
|
33
65
|
|
34
66
|
# Attempt to generate a complete chain for the solution
|
35
|
-
chains = connector.generate_chains(runtime_method,test_cases,theories)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
# chain_permutations = chain.unify_chain.implementation_permuatations(runtime_method,test_cases,Mapping.new)
|
43
|
-
# end
|
44
|
-
# TEMP just concentrate of one implementation_permutation
|
45
|
-
implementation_permutations = chains.first.unify_chain.implementation_permuatations(runtime_method,test_cases,Mapping.new)
|
46
|
-
|
47
|
-
# Go through each of the permutations and create the runtime method for the chain
|
48
|
-
validator = TheoryChainValidator.new
|
49
|
-
result = validator.build(runtime_method,test_cases,implementation_permutations)
|
50
|
-
return result
|
51
|
-
|
67
|
+
chains = connector.generate_chains(runtime_method,test_cases,theories)
|
68
|
+
return chains
|
69
|
+
end
|
70
|
+
|
71
|
+
def saved_theories
|
72
|
+
saved_theory_file_paths = Dir.glob(File.join(theory_repository_path,'*','dump'))
|
73
|
+
saved_theory_file_paths.collect {|x| Marshal.load(File.open(x,'r'))}
|
52
74
|
end
|
53
75
|
|
54
76
|
def simmer(demo)
|
55
77
|
raise StandardError.new('This demo does not work') unless demo_works?(demo)
|
56
78
|
|
57
79
|
# Generate a master theory for each stage of the runtime method when following the theory chains
|
58
|
-
generator = TheoryGenerator.new
|
59
|
-
master_theories = generator.master_theories(
|
80
|
+
# generator = TheoryGenerator.new
|
81
|
+
# master_theories = generator.master_theories(
|
82
|
+
# demo[:chain],
|
83
|
+
# demo[:initial_method],
|
84
|
+
# demo[:test_cases]
|
85
|
+
# )
|
60
86
|
|
61
87
|
# Add each of the theories in the chain to cauldron
|
62
|
-
master_theories.each {|x| save_theory(x,master_repository_path)}
|
88
|
+
#master_theories.each {|x| save_theory(x,master_repository_path)}
|
63
89
|
|
64
90
|
# Save each of the simple versions of the theory
|
65
91
|
demo[:chain].each {|x| save_theory(x,theory_repository_path)}
|
@@ -1,155 +1,138 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
require 'ruby2ruby'
|
2
3
|
require 'sexp_processor'
|
3
4
|
|
4
5
|
module Cauldron
|
5
6
|
|
6
7
|
class Sexp2Cauldron < SexpProcessor
|
7
8
|
|
9
|
+
VARIABLE_EXPRESSION = /var[|_]*(\d+)/
|
10
|
+
|
8
11
|
def initialize
|
9
12
|
super
|
10
|
-
self.strict = false
|
11
13
|
self.expected = Object
|
14
|
+
self.auto_shift_type = true
|
15
|
+
self.strict = true
|
12
16
|
@debug[:lasgn] = nil
|
13
17
|
@unsupported_checked = true
|
14
18
|
end
|
15
19
|
|
16
20
|
def process_lit(exp)
|
17
|
-
type = exp.shift
|
18
21
|
val = exp.shift
|
19
22
|
return Literal.new(val)
|
20
23
|
end
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
#
|
33
|
-
# yield
|
34
|
-
#
|
35
|
-
# self.context.shift
|
36
|
-
# end
|
37
|
-
|
38
|
-
# def process(exp)
|
39
|
-
# puts '--------------------------------calling process===================>'
|
40
|
-
# return nil if exp.nil?
|
41
|
-
# exp = self.rewrite(exp) if self.context.empty?
|
42
|
-
# puts '-------------------@unsupported_checked--------->>>>>>>>>>>.'
|
43
|
-
# puts @unsupported_checked
|
44
|
-
# puts '-------------------@unsupported_checked--------->>>>>>>>>>>.'
|
45
|
-
# unless @unsupported_checked then
|
46
|
-
# m = public_methods.grep(/^process_/) { |o| o.to_s.sub(/^process_/, '').to_sym }
|
47
|
-
# supported = m - (m - @unsupported)
|
48
|
-
#
|
49
|
-
# raise UnsupportedNodeError, "#{supported.inspect} shouldn't be in @unsupported" unless supported.empty?
|
50
|
-
#
|
51
|
-
# @unsupported_checked = true
|
52
|
-
# end
|
53
|
-
#
|
54
|
-
# result = self.expected.new
|
55
|
-
#
|
56
|
-
# type = exp.first
|
57
|
-
# raise "type should be a Symbol, not: #{exp.first.inspect}" unless
|
58
|
-
# Symbol === type
|
59
|
-
#
|
60
|
-
# in_context type do
|
61
|
-
#
|
62
|
-
# puts '==============================IN COTEXT('+exp.to_s+') ====================== '
|
63
|
-
#
|
64
|
-
# if @debug.has_key? type then
|
65
|
-
# str = exp.inspect
|
66
|
-
# puts "// DEBUG: #{str}" if str =~ @debug[type]
|
67
|
-
# end
|
68
|
-
#
|
69
|
-
# exp_orig = nil
|
70
|
-
# exp_orig = exp.deep_clone if $DEBUG or
|
71
|
-
# @debug.has_key? type or @exceptions.has_key?(type)
|
72
|
-
#
|
73
|
-
# raise UnsupportedNodeError, "'#{type}' is not a supported node type" if
|
74
|
-
# @unsupported.include? type
|
75
|
-
#
|
76
|
-
# if @debug.has_key? type then
|
77
|
-
# str = exp.inspect
|
78
|
-
# puts "// DEBUG (rewritten): #{str}" if str =~ @debug[type]
|
79
|
-
# end
|
80
|
-
#
|
81
|
-
# # now do a pass with the real processor (or generic)
|
82
|
-
# meth = @processors[type] || @default_method
|
83
|
-
# if meth then
|
84
|
-
#
|
85
|
-
# if @warn_on_default and meth == @default_method then
|
86
|
-
# warn "WARNING: Using default method #{meth} for #{type}"
|
87
|
-
# end
|
88
|
-
#
|
89
|
-
# exp.shift if @auto_shift_type and meth != @default_method
|
90
|
-
#
|
91
|
-
# puts 'Calling method ----------'+meth.to_s
|
92
|
-
# result = error_handler(type, exp_orig) do
|
93
|
-
# self.send(meth, exp)
|
94
|
-
# end
|
95
|
-
#
|
96
|
-
# raise SexpTypeError, "Result must be a #{@expected}, was #{result.class}:#{result.inspect}" unless @expected === result
|
97
|
-
#
|
98
|
-
# self.assert_empty(meth, exp, exp_orig) if @require_empty
|
99
|
-
# else
|
100
|
-
# unless @strict then
|
101
|
-
# until exp.empty? do
|
102
|
-
# sub_exp = exp.shift
|
103
|
-
# sub_result = nil
|
104
|
-
# if Array === sub_exp then
|
105
|
-
# sub_result = error_handler(type, exp_orig) do
|
106
|
-
# process(sub_exp)
|
107
|
-
# end
|
108
|
-
# raise "Result is a bad type" unless Array === sub_exp
|
109
|
-
# raise "Result does not have a type in front: #{sub_exp.inspect}" unless Symbol === sub_exp.first unless sub_exp.empty?
|
110
|
-
# else
|
111
|
-
# sub_result = sub_exp
|
112
|
-
# end
|
113
|
-
# result << sub_result
|
114
|
-
# end
|
115
|
-
#
|
116
|
-
# # NOTE: this is costly, but we are in the generic processor
|
117
|
-
# # so we shouldn't hit it too much with RubyToC stuff at least.
|
118
|
-
# #if Sexp === exp and not exp.sexp_type.nil? then
|
119
|
-
# begin
|
120
|
-
# result.sexp_type = exp.sexp_type
|
121
|
-
# rescue Exception
|
122
|
-
# # nothing to do, on purpose
|
123
|
-
# end
|
124
|
-
# else
|
125
|
-
# msg = "Bug! Unknown node-type #{type.inspect} to #{self.class}"
|
126
|
-
# msg += " in #{exp_orig.inspect} from #{caller.inspect}" if $DEBUG
|
127
|
-
# raise UnknownNodeError, msg
|
128
|
-
# end
|
129
|
-
# end
|
130
|
-
#
|
131
|
-
# puts '--------------------------------DONE ---------------------- context'
|
132
|
-
#
|
133
|
-
# end
|
134
|
-
#
|
135
|
-
# result
|
136
|
-
# end
|
137
|
-
#
|
25
|
+
def in_context type, &block
|
26
|
+
self.context.unshift type
|
27
|
+
yield
|
28
|
+
self.context.shift
|
29
|
+
end
|
30
|
+
|
31
|
+
def process_str(exp)
|
32
|
+
Literal.new(exp.shift)
|
33
|
+
end
|
34
|
+
|
138
35
|
# => Overwritten method
|
139
36
|
def process_lasgn(exp)
|
140
|
-
exp.shift
|
141
37
|
next_exp = exp.shift
|
142
|
-
if next_exp.to_s.match(
|
143
|
-
s = Statement.new(
|
38
|
+
if next_exp.to_s.match(VARIABLE_EXPRESSION)
|
39
|
+
s = Statement.new(convert_to_variable(next_exp),Equal.new)
|
144
40
|
end
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
41
|
+
a = process(exp.shift)
|
42
|
+
s.add a
|
43
|
+
return s
|
44
|
+
end
|
45
|
+
|
46
|
+
def process_if(exp)
|
47
|
+
inner_statement_sexp = exp.shift
|
48
|
+
scope = process(exp.shift) # => The content of the if statement
|
49
|
+
exp.shift
|
50
|
+
open_statement = OpenStatement.new(Statement.new(If.new,Container.new(process(inner_statement_sexp))))
|
51
|
+
open_statement << scope unless scope.nil?
|
52
|
+
return open_statement
|
53
|
+
end
|
54
|
+
|
55
|
+
def process_return(exp)
|
56
|
+
return Statement.new(Return.new,process(exp.shift))
|
57
|
+
end
|
58
|
+
|
59
|
+
def process_call(exp)
|
60
|
+
results = []
|
61
|
+
until exp.empty?
|
62
|
+
atom = exp.shift
|
63
|
+
if atom.to_s.match(VARIABLE_EXPRESSION)
|
64
|
+
results << convert_to_variable(atom)
|
65
|
+
next
|
66
|
+
end
|
67
|
+
if atom == :==
|
68
|
+
results << Equivalent.new
|
69
|
+
next
|
70
|
+
end
|
71
|
+
next if atom.nil?
|
72
|
+
res = process(atom)
|
73
|
+
next if res.nil?
|
74
|
+
results << res
|
149
75
|
end
|
150
|
-
|
76
|
+
return Statement.new(*results)
|
151
77
|
end
|
152
78
|
|
79
|
+
def process_arglist(exp)
|
80
|
+
return process exp.shift
|
81
|
+
end
|
82
|
+
|
83
|
+
def process_defn(exp)
|
84
|
+
type = exp.shift
|
85
|
+
args = exp.shift
|
86
|
+
scope = exp.shift
|
87
|
+
|
88
|
+
usage = (args.length==2) ? process(args) : MethodUsage.new
|
89
|
+
method_id = type.to_s.match(/method_(\d)+/)[1]
|
90
|
+
method = RuntimeMethod.new(usage,method_id)
|
91
|
+
statements = process(scope)
|
92
|
+
unless statements.nil?
|
93
|
+
statements.each do |statement|
|
94
|
+
method << statement unless statement.nil?
|
95
|
+
end
|
96
|
+
end
|
97
|
+
return method
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
def process_args(exp)
|
102
|
+
atom = exp.shift
|
103
|
+
variable_id = atom.to_s.match(VARIABLE_EXPRESSION)[1]
|
104
|
+
param = MethodParameter.new()
|
105
|
+
param.variable_id = variable_id
|
106
|
+
return MethodUsage.new(param)
|
107
|
+
end
|
108
|
+
|
109
|
+
def process_scope(exp)
|
110
|
+
block = exp.shift
|
111
|
+
res = process(block)
|
112
|
+
return res
|
113
|
+
end
|
114
|
+
|
115
|
+
def process_block(exp)
|
116
|
+
result = []
|
117
|
+
until exp.empty?
|
118
|
+
atom = exp.shift
|
119
|
+
next if atom.first == :nil
|
120
|
+
result << process(atom)
|
121
|
+
end
|
122
|
+
return result
|
123
|
+
end
|
124
|
+
|
125
|
+
def process_lvar(exp)
|
126
|
+
var = exp.shift
|
127
|
+
return convert_to_variable(var)
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def convert_to_variable(variable)
|
133
|
+
return Unknown.new(variable.to_s.match(VARIABLE_EXPRESSION)[1])
|
134
|
+
end
|
135
|
+
|
153
136
|
end
|
154
137
|
|
155
138
|
|
data/lib/cauldron/terminal.rb
CHANGED
@@ -3,11 +3,12 @@ module Cauldron
|
|
3
3
|
class Terminal
|
4
4
|
|
5
5
|
include Cauldron::Conversion
|
6
|
+
include Cauldron::Demos
|
6
7
|
|
7
8
|
attr_reader :cases
|
8
9
|
|
9
10
|
def initialize(output,auto=true)
|
10
|
-
@output, @cases
|
11
|
+
@output, @cases, @auto = output, [], auto
|
11
12
|
end
|
12
13
|
|
13
14
|
def start
|
@@ -15,7 +16,8 @@ module Cauldron
|
|
15
16
|
@pot = Cauldron::Pot.new
|
16
17
|
@pot.clear
|
17
18
|
@output.puts '* Adding example case'
|
18
|
-
|
19
|
+
#@pot.simmer(demo('1'))
|
20
|
+
@pot.simmer(demo_two)
|
19
21
|
|
20
22
|
@output.puts "Thanks for trying Cauldron - it's at really early stage right now"
|
21
23
|
@output.puts "in fact it can only generate a method that returns the parameter passed through"
|
@@ -42,78 +44,7 @@ module Cauldron
|
|
42
44
|
else
|
43
45
|
@cases << convert_to_example(separate_values(input))
|
44
46
|
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# => ==========================================================================
|
48
|
-
|
49
|
-
def convert_to_cauldron_test_cases(cases)
|
50
|
-
cases.inject([]) do |total,x|
|
51
|
-
cauldron_case = CTestCase.new
|
52
|
-
cauldron_case[:params] = x[0]
|
53
|
-
cauldron_case[:output] = x[1]
|
54
|
-
total << cauldron_case
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def demo(id)
|
59
|
-
|
60
|
-
@demo_1_test_cases = convert_to_cauldron_test_cases(
|
61
|
-
[
|
62
|
-
[['sparky'],'sparky'],
|
63
|
-
[['kel'],'kel']
|
64
|
-
]
|
65
|
-
)
|
66
|
-
|
67
|
-
# Create demonstration #2
|
68
|
-
demo_2_test_case_1 = CTestCase.new
|
69
|
-
demo_2_test_case_1[:params] = ['something']
|
70
|
-
demo_2_test_case_1[:output] = 'exists'
|
71
|
-
demo_2_test_case_2 = CTestCase.new
|
72
|
-
demo_2_test_case_2[:params] = ['my willpower']
|
73
|
-
demo_2_test_case_2[:output] = 'does not exist'
|
74
|
-
demo_2_test_cases = [
|
75
|
-
demo_2_test_case_1,demo_2_test_case_2
|
76
|
-
]
|
77
|
-
|
78
|
-
# Create demo #1 chain
|
79
|
-
# Create the head for the chain
|
80
|
-
head = Theory.new([],nil,[])
|
81
|
-
|
82
|
-
link_one_action = TheoryAction.new(
|
83
|
-
TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var2.params[var3])')),
|
84
|
-
StringToTheory.run('var1.statement_id')
|
85
|
-
)
|
86
|
-
# NOTE: I need to add one result so the theory can be flagged as complete - I might not need it
|
87
|
-
# to be complete -
|
88
|
-
link_one_result = TheoryResult.new(StringToTheory.run("if(var1.all_pass?(var2))\nreturn true\nend"))
|
89
|
-
link_one = Theory.new([],link_one_action,[link_one_result])
|
90
|
-
chain = Chain.new
|
91
|
-
chain = chain.add_link(head).first
|
92
|
-
chain = chain.add_link(
|
93
|
-
link_one,
|
94
|
-
{
|
95
|
-
1=>IntrinsicRuntimeMethod.new,
|
96
|
-
2=>IntrinsicTestCases.new,
|
97
|
-
3=>IntrinsicLiteral.new(0)
|
98
|
-
}
|
99
|
-
).first
|
100
|
-
|
101
|
-
# Now implement the chain
|
102
|
-
implemented_chain = chain.implement
|
103
|
-
|
104
|
-
# TODO It should generate the values too.(TheoryGenerator)
|
105
|
-
@demo_1 = {
|
106
|
-
:initial_method=>RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
|
107
|
-
:test_cases=>@demo_1_test_cases,
|
108
|
-
:chain=>chain,
|
109
|
-
:values=>{}
|
110
|
-
}
|
111
|
-
|
112
|
-
if id == '1'
|
113
|
-
return @demo_1
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
47
|
+
end
|
117
48
|
|
118
49
|
end
|
119
50
|
|