cauldron 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +20 -0
- data/README +1 -0
- data/README.rdoc +19 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/bin/cauldron +10 -0
- data/cauldron/.autotest +23 -0
- data/cauldron/History.txt +6 -0
- data/cauldron/Manifest.txt +8 -0
- data/cauldron/README.txt +57 -0
- data/cauldron/Rakefile +27 -0
- data/cauldron/bin/cauldron +3 -0
- data/cauldron/lib/cauldron.rb +3 -0
- data/cauldron/test/test_cauldron.rb +8 -0
- data/features/cauldron_example_cases.feature +13 -0
- data/features/cauldron_generates_runtime_method.feature +12 -0
- data/features/cauldron_start_terminal.feature +13 -0
- data/features/step_definitions/cauldron_steps.rb +16 -0
- data/features/step_definitions/terminal_steps.rb +34 -0
- data/features/support/env.rb +19 -0
- data/lib/Chain.rb +879 -0
- data/lib/ChainMapping.rb +172 -0
- data/lib/CodeHandler.rb +517 -0
- data/lib/Mapping.rb +26 -0
- data/lib/MappingValues.rb +24 -0
- data/lib/ScopeDependencies.rb +7 -0
- data/lib/Theory.rb +274 -0
- data/lib/UnifiedChain.rb +110 -0
- data/lib/cauldron.rb +6 -0
- data/lib/cauldron/conversion.rb +15 -0
- data/lib/cauldron/pot.rb +134 -0
- data/lib/cauldron/sexp2cauldron.rb +156 -0
- data/lib/cauldron/terminal.rb +120 -0
- data/lib/cauldron/theory_factory.rb +10 -0
- data/lib/core/ActsAsCode.rb +25 -0
- data/lib/core/BlockToken.rb +33 -0
- data/lib/core/CCall.rb +7 -0
- data/lib/core/CTestCase.rb +27 -0
- data/lib/core/ClassMethodCallContainer.rb +45 -0
- data/lib/core/Container.rb +85 -0
- data/lib/core/InstanceCallContainer.rb +272 -0
- data/lib/core/MethodUsage.rb +66 -0
- data/lib/core/PrintVariables.rb +25 -0
- data/lib/core/TheoryGenerator.rb +764 -0
- data/lib/core/Token.rb +7 -0
- data/lib/core/assignment/Assignment.rb +18 -0
- data/lib/core/assignment/Equal.rb +39 -0
- data/lib/core/assignment/Equivalent.rb +20 -0
- data/lib/core/assignment/NotEqual.rb +14 -0
- data/lib/core/call_container/CallContainer.rb +66 -0
- data/lib/core/class_method_call/New.rb +15 -0
- data/lib/core/class_method_call/RuntimeClassMethodCall.rb +31 -0
- data/lib/core/declaration/Declaration.rb +16 -0
- data/lib/core/declaration/LiteralDeclaration.rb +47 -0
- data/lib/core/declaration/VariableDeclaration.rb +59 -0
- data/lib/core/instance_call/ArrayEach.rb +23 -0
- data/lib/core/instance_call/ArrayLength.rb +15 -0
- data/lib/core/instance_call/Chop.rb +28 -0
- data/lib/core/instance_call/Copy.rb +22 -0
- data/lib/core/instance_call/DeclaredVariable.rb +18 -0
- data/lib/core/instance_call/InstanceCall.rb +77 -0
- data/lib/core/instance_call/Params.rb +15 -0
- data/lib/core/instance_call/Push.rb +20 -0
- data/lib/core/instance_call/StringLength.rb +32 -0
- data/lib/core/instance_call/Times.rb +20 -0
- data/lib/core/instance_call/instance_calls.rb +168 -0
- data/lib/core/instance_call/length_equal.rb +15 -0
- data/lib/core/kernal/EvalCall.rb +15 -0
- data/lib/core/kernal/LocalVariablesCall.rb +15 -0
- data/lib/core/literal/Literal.rb +111 -0
- data/lib/core/literal/Raw.rb +23 -0
- data/lib/core/literal/RuntimeMethodLiteral.rb +21 -0
- data/lib/core/literal/StatementLiteral.rb +28 -0
- data/lib/core/method_call/AvailableVariablesCall.rb +25 -0
- data/lib/core/method_call/ClassCall.rb +33 -0
- data/lib/core/method_call/DefCall.rb +72 -0
- data/lib/core/method_call/EvaluateClassCall.rb +29 -0
- data/lib/core/method_call/MethodNameCall.rb +27 -0
- data/lib/core/method_call/ToDeclarationCall.rb +15 -0
- data/lib/core/requirement/Requirement.rb +291 -0
- data/lib/core/runtime_class/ArrayClass.rb +19 -0
- data/lib/core/runtime_class/ClassCallClass.rb +23 -0
- data/lib/core/runtime_class/ClassEvaluationClass.rb +19 -0
- data/lib/core/runtime_class/ClassName.rb +18 -0
- data/lib/core/runtime_class/DefCallClass.rb +21 -0
- data/lib/core/runtime_class/EqualClass.rb +19 -0
- data/lib/core/runtime_class/FixnumClass.rb +15 -0
- data/lib/core/runtime_class/IfStatementClass.rb +12 -0
- data/lib/core/runtime_class/InstanceCallClass.rb +19 -0
- data/lib/core/runtime_class/InstanceCallContainerClass.rb +16 -0
- data/lib/core/runtime_class/InstanceClassCallClass.rb +19 -0
- data/lib/core/runtime_class/LiteralClass.rb +19 -0
- data/lib/core/runtime_class/MethodParameterClass.rb +27 -0
- data/lib/core/runtime_class/MethodUsageClass.rb +27 -0
- data/lib/core/runtime_class/RequirementClass.rb +19 -0
- data/lib/core/runtime_class/ReturnClass.rb +21 -0
- data/lib/core/runtime_class/RuntimeClass.rb +30 -0
- data/lib/core/runtime_class/RuntimeClassClass.rb +19 -0
- data/lib/core/runtime_class/RuntimeMethodClass.rb +34 -0
- data/lib/core/runtime_class/StatementClass.rb +53 -0
- data/lib/core/runtime_class/StringClass.rb +23 -0
- data/lib/core/runtime_class/StringLengthClass.rb +19 -0
- data/lib/core/runtime_class/StringVariableClass.rb +19 -0
- data/lib/core/runtime_class/ThisClass.rb +15 -0
- data/lib/core/runtime_class/UnknownClass.rb +23 -0
- data/lib/core/runtime_class/class_names.rb +95 -0
- data/lib/core/runtime_class/runtime_class.rb +123 -0
- data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +300 -0
- data/lib/core/runtime_method/ParametersContainer.rb +29 -0
- data/lib/core/runtime_method/RealisedRuntimeMethod.rb +94 -0
- data/lib/core/runtime_method/RuntimeMethod.rb +817 -0
- data/lib/core/runtime_method/WriteParameters.rb +35 -0
- data/lib/core/statement/ActsAsStatement.rb +116 -0
- data/lib/core/statement/ArrayAccess.rb +96 -0
- data/lib/core/statement/BlockStatement.rb +348 -0
- data/lib/core/statement/DeclarationStatement.rb +19 -0
- data/lib/core/statement/HackStatement.rb +25 -0
- data/lib/core/statement/HashAccess.rb +18 -0
- data/lib/core/statement/OpenStatement.rb +171 -0
- data/lib/core/statement/RealisedStatement.rb +5 -0
- data/lib/core/statement/SingleLineBlockStatement.rb +39 -0
- data/lib/core/statement/Statement.rb +1223 -0
- data/lib/core/statement/StatementDependencies.rb +271 -0
- data/lib/core/statement/StatementGroup.rb +157 -0
- data/lib/core/statement/StatementStructure2.rb +224 -0
- data/lib/core/statement/TheoryStatement.rb +60 -0
- data/lib/core/statement/TopologicalStatements.rb +34 -0
- data/lib/core/structure/DeclareNewInstanceStructure.rb +49 -0
- data/lib/core/structure/DeclareRuntimeMethodStructure.rb +34 -0
- data/lib/core/structure/DeclareVariableAsLiteralStructure.rb +31 -0
- data/lib/core/structure/DeclareVariableAsVariableStructure.rb +52 -0
- data/lib/core/structure/FixnumAdditionStructure.rb +56 -0
- data/lib/core/structure/InstanceCallContainerStructure.rb +50 -0
- data/lib/core/structure/InstanceCallStructure.rb +53 -0
- data/lib/core/structure/InstanceMethodCallStructure.rb +21 -0
- data/lib/core/structure/ReturnStructure.rb +20 -0
- data/lib/core/structure/StatementStructure.rb +11 -0
- data/lib/core/syntax/Addition.rb +25 -0
- data/lib/core/syntax/BlockContainer.rb +130 -0
- data/lib/core/syntax/Boolean.rb +15 -0
- data/lib/core/syntax/Code.rb +11 -0
- data/lib/core/syntax/Do.rb +20 -0
- data/lib/core/syntax/False.rb +12 -0
- data/lib/core/syntax/If.rb +28 -0
- data/lib/core/syntax/IfContainer.rb +100 -0
- data/lib/core/syntax/Nil.rb +15 -0
- data/lib/core/syntax/Return.rb +33 -0
- data/lib/core/syntax/Subtract.rb +19 -0
- data/lib/core/syntax/This.rb +40 -0
- data/lib/core/syntax/True.rb +20 -0
- data/lib/core/syntax/syntax.rb +24 -0
- data/lib/core/tracking/ActsAsTrackable.rb +65 -0
- data/lib/core/tracking/History.rb +167 -0
- data/lib/core/tracking/RuntimeTrackingMethod.rb +32 -0
- data/lib/core/tracking/Step.rb +52 -0
- data/lib/core/variable/ArrayVariable.rb +76 -0
- data/lib/core/variable/BaseVariable.rb +154 -0
- data/lib/core/variable/BlockVariable.rb +92 -0
- data/lib/core/variable/FixnumVariable.rb +36 -0
- data/lib/core/variable/HistoryVariable.rb +8 -0
- data/lib/core/variable/MethodParameter.rb +206 -0
- data/lib/core/variable/MethodUsageVariable.rb +60 -0
- data/lib/core/variable/NilVariable.rb +29 -0
- data/lib/core/variable/RuntimeMethodParameter.rb +67 -0
- data/lib/core/variable/StatementVariable.rb +72 -0
- data/lib/core/variable/StepVariable.rb +7 -0
- data/lib/core/variable/StringVariable.rb +46 -0
- data/lib/core/variable/TypeVariable.rb +72 -0
- data/lib/core/variable/Unknown.rb +116 -0
- data/lib/core/variable/UnknownVariable.rb +29 -0
- data/lib/core/variable/Variable.rb +70 -0
- data/lib/core/variable/VariableContainer.rb +28 -0
- data/lib/core/variable/VariableIncluded.rb +27 -0
- data/lib/core/variable/VariableReference.rb +85 -0
- data/lib/error/FailedToFindStatementContainerError.rb +7 -0
- data/lib/error/FailedToFindStatementError.rb +7 -0
- data/lib/error/FailedToFindVariableError.rb +7 -0
- data/lib/error/FailedToLiteraliseError.rb +7 -0
- data/lib/error/FailedVariableMatch.rb +7 -0
- data/lib/error/ImproperStatementUsageError.rb +7 -0
- data/lib/error/IncompatiableRequirementsError.rb +7 -0
- data/lib/error/InvalidStatementError.rb +7 -0
- data/lib/error/MethodSizeError.rb +7 -0
- data/lib/error/RuntimeSyntaxError.rb +7 -0
- data/lib/error/UnexpectedStatementTypeError.rb +7 -0
- data/lib/error/UnknownStatementType.rb +7 -0
- data/lib/error/UnliteralisableError.rb +7 -0
- data/lib/implemented_chain.rb +34 -0
- data/lib/intrinsic/IntrinsicLastRuntimeMethod.rb +20 -0
- data/lib/intrinsic/IntrinsicLiteral.rb +26 -0
- data/lib/intrinsic/IntrinsicObject.rb +22 -0
- data/lib/intrinsic/IntrinsicRuntimeMethod.rb +27 -0
- data/lib/intrinsic/IntrinsicTestCases.rb +17 -0
- data/lib/logger/StandardLogger.rb +62 -0
- data/lib/required.rb +236 -0
- data/lib/ruby_code/Array.rb +95 -0
- data/lib/ruby_code/Fixnum.rb +39 -0
- data/lib/ruby_code/Hash.rb +25 -0
- data/lib/ruby_code/NilClass.rb +19 -0
- data/lib/ruby_code/Object.rb +24 -0
- data/lib/ruby_code/String.rb +86 -0
- data/lib/ruby_code/Symbol.rb +7 -0
- data/lib/standard_library/Tasks.rb +12 -0
- data/lib/theories.rb +143 -0
- data/lib/theory/ActionImplementation.rb +17 -0
- data/lib/theory/TheoryAction.rb +70 -0
- data/lib/theory/TheoryChainValidator.rb +101 -0
- data/lib/theory/TheoryComponent.rb +42 -0
- data/lib/theory/TheoryConnector.rb +755 -0
- data/lib/theory/TheoryDependent.rb +135 -0
- data/lib/theory/TheoryImplementation.rb +74 -0
- data/lib/theory/TheoryResult.rb +131 -0
- data/lib/theory/TheoryVariable.rb +63 -0
- data/lib/theory/theory_collection.rb +62 -0
- data/lib/util/ClassEvaluation.rb +68 -0
- data/lib/util/CodeEvaluation.rb +35 -0
- data/lib/util/DeclarationStatementEvaluation.rb +31 -0
- data/lib/util/MethodEvaluation.rb +49 -0
- data/lib/util/MethodTester.rb +71 -0
- data/lib/util/MethodValidation.rb +145 -0
- data/lib/util/MethodWriter.rb +66 -0
- data/lib/util/Parser.rb +299 -0
- data/lib/util/StatementCheck.rb +42 -0
- data/lib/util/StringToTheory.rb +119 -0
- data/lib/util/System.rb +8 -0
- data/spec/cauldron/pot_spec.rb +6 -0
- data/spec/cauldron/runtime_method_spec.rb +36 -0
- data/spec/cauldron/sexp_2_cauldron_spec.rb +26 -0
- data/spec/cauldron/terminal_spec.rb +38 -0
- data/spec/cauldron/theory_action_spec.rb +5 -0
- data/spec/spec_helper.rb +4 -0
- data/test/fixtures/chains/1/declaration.txt +26 -0
- data/test/fixtures/chains/1/dump +0 -0
- data/test/fixtures/chains/2/declaration.txt +26 -0
- data/test/fixtures/chains/2/dump +0 -0
- data/test/fixtures/chains/3/declaration.txt +26 -0
- data/test/fixtures/chains/3/dump +0 -0
- data/test/fixtures/implementation_results/0/declaration.txt +3 -0
- data/test/fixtures/implementation_results/0/dump +0 -0
- data/test/fixtures/theories/0/declaration.txt +9 -0
- data/test/fixtures/theories/0/desc +10 -0
- data/test/fixtures/theories/0/dump +0 -0
- data/test/fixtures/theories/1/declaration.txt +15 -0
- data/test/fixtures/theories/1/desc +11 -0
- data/test/fixtures/theories/1/dump +0 -0
- data/test/fixtures/theories/10/declaration.txt +23 -0
- data/test/fixtures/theories/10/desc +17 -0
- data/test/fixtures/theories/10/dump +0 -0
- data/test/fixtures/theories/11/declaration.txt +20 -0
- data/test/fixtures/theories/11/desc +14 -0
- data/test/fixtures/theories/11/dump +0 -0
- data/test/fixtures/theories/12/declaration.txt +18 -0
- data/test/fixtures/theories/12/desc +12 -0
- data/test/fixtures/theories/12/dump +0 -0
- data/test/fixtures/theories/13/declaration.txt +24 -0
- data/test/fixtures/theories/13/desc +20 -0
- data/test/fixtures/theories/13/dump +0 -0
- data/test/fixtures/theories/14/declaration.txt +26 -0
- data/test/fixtures/theories/14/desc +20 -0
- data/test/fixtures/theories/14/dump +0 -0
- data/test/fixtures/theories/15/declaration.txt +20 -0
- data/test/fixtures/theories/15/desc +14 -0
- data/test/fixtures/theories/15/dump +0 -0
- data/test/fixtures/theories/16/declaration.txt +30 -0
- data/test/fixtures/theories/16/desc +14 -0
- data/test/fixtures/theories/16/dump +0 -0
- data/test/fixtures/theories/17/declaration.txt +25 -0
- data/test/fixtures/theories/17/desc +11 -0
- data/test/fixtures/theories/17/dump +0 -0
- data/test/fixtures/theories/18/declaration.txt +23 -0
- data/test/fixtures/theories/18/desc +11 -0
- data/test/fixtures/theories/18/dump +0 -0
- data/test/fixtures/theories/19/declaration.txt +23 -0
- data/test/fixtures/theories/19/desc +11 -0
- data/test/fixtures/theories/19/dump +0 -0
- data/test/fixtures/theories/2/declaration.txt +12 -0
- data/test/fixtures/theories/2/desc +10 -0
- data/test/fixtures/theories/2/dump +0 -0
- data/test/fixtures/theories/20/declaration.txt +23 -0
- data/test/fixtures/theories/20/desc +17 -0
- data/test/fixtures/theories/20/dump +0 -0
- data/test/fixtures/theories/3/declaration.txt +19 -0
- data/test/fixtures/theories/3/desc +11 -0
- data/test/fixtures/theories/3/dump +0 -0
- data/test/fixtures/theories/4/declaration.txt +11 -0
- data/test/fixtures/theories/4/desc +11 -0
- data/test/fixtures/theories/4/dump +0 -0
- data/test/fixtures/theories/5/declaration.txt +6 -0
- data/test/fixtures/theories/5/desc +9 -0
- data/test/fixtures/theories/5/dump +0 -0
- data/test/fixtures/theories/6/declaration.txt +13 -0
- data/test/fixtures/theories/6/desc +11 -0
- data/test/fixtures/theories/6/dump +0 -0
- data/test/fixtures/theories/7/declaration.txt +19 -0
- data/test/fixtures/theories/7/desc +11 -0
- data/test/fixtures/theories/7/dump +0 -0
- data/test/fixtures/theories/8/declaration.txt +21 -0
- data/test/fixtures/theories/8/desc +11 -0
- data/test/fixtures/theories/8/dump +0 -0
- data/test/fixtures/theories/9/declaration.txt +24 -0
- data/test/fixtures/theories/9/desc +20 -0
- data/test/fixtures/theories/9/dump +0 -0
- data/test/fixtures/theory_implementations/0/declaration.txt +11 -0
- data/test/fixtures/theory_implementations/0/desc.txt +9 -0
- data/test/fixtures/theory_implementations/0/dump +0 -0
- data/test/fixtures/theory_implementations/0/theory_id +1 -0
- data/test/fixtures/theory_implementations/1/desc.txt +9 -0
- data/test/fixtures/theory_implementations/1/dump +0 -0
- data/test/fixtures/theory_implementations/1/theory_id +1 -0
- data/test/fixtures/theory_implementations/2/desc.txt +9 -0
- data/test/fixtures/theory_implementations/2/dump +0 -0
- data/test/fixtures/theory_implementations/2/theory_id +1 -0
- data/test/output/simple_method.txt +6 -0
- data/test/output/test_method/first_possible_method.txt +6 -0
- data/test/output/test_simple_cases/simple_case_01.txt +8 -0
- data/test/output/test_simple_cases/simple_case_02.txt +7 -0
- data/test/output/test_simple_cases/simple_case_03.txt +8 -0
- data/test/output/test_simple_cases/simple_case_04.txt +8 -0
- data/test/output/test_simple_cases/simple_case_05.txt +8 -0
- data/test/output/test_simple_cases/simple_case_06.txt +9 -0
- data/test/output/test_simple_cases/simple_case_07.txt +9 -0
- data/test/output/test_simple_cases/simple_case_08.txt +9 -0
- data/test/tc_contextual_variables.rb +87 -0
- data/test/tc_describe.rb +47 -0
- data/test/tc_method.rb +133 -0
- data/test/tc_requirement.rb +30 -0
- data/test/tc_suite_complete.rb +26 -0
- data/test/tc_variable.rb +52 -0
- data/test/ts_complete.rb +84 -0
- data/test/ts_stable.rb +81 -0
- data/test/unit/core/declaration/tc_literal_declaration.rb +34 -0
- data/test/unit/core/method_call/tc_class_call.rb +20 -0
- data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +129 -0
- data/test/unit/core/runtime_method/tc_runtime_method.rb +616 -0
- data/test/unit/core/statement/tc_array_access.rb +63 -0
- data/test/unit/core/statement/tc_block_statement.rb +51 -0
- data/test/unit/core/statement/tc_hack_statement.rb +26 -0
- data/test/unit/core/statement/tc_open_statement.rb +70 -0
- data/test/unit/core/statement/tc_statement.rb +681 -0
- data/test/unit/core/statement/tc_statement_dependencies.rb +146 -0
- data/test/unit/core/statement/tc_statement_group.rb +35 -0
- data/test/unit/core/statement/tc_statement_replace_variable.rb +61 -0
- data/test/unit/core/statement/tc_theory_statement.rb +51 -0
- data/test/unit/core/structure/tc_declare_new_instance_structure.rb +41 -0
- data/test/unit/core/structure/tc_declare_variable_as_literal_structure.rb +41 -0
- data/test/unit/core/structure/tc_declare_variable_as_variable_structure.rb +66 -0
- data/test/unit/core/structure/tc_instance_call_container_structure.rb +41 -0
- data/test/unit/core/structure/tc_return_structure.rb +32 -0
- data/test/unit/core/syntax/tc_block_container.rb +32 -0
- data/test/unit/core/syntax/tc_if_container.rb +39 -0
- data/test/unit/core/tc_class_method_call.rb +34 -0
- data/test/unit/core/tc_container.rb +41 -0
- data/test/unit/core/tc_ctest_case.rb +25 -0
- data/test/unit/core/tc_instance_call_container.rb +93 -0
- data/test/unit/core/tc_literal.rb +30 -0
- data/test/unit/core/tc_theory_generator.rb +336 -0
- data/test/unit/core/tc_theory_generator_heavy.rb +42 -0
- data/test/unit/core/tracking/tc_history.rb +102 -0
- data/test/unit/core/tracking/tc_step.rb +65 -0
- data/test/unit/core/variable/tc_array_variable.rb +61 -0
- data/test/unit/core/variable/tc_block_variable.rb +17 -0
- data/test/unit/core/variable/tc_fixnum_variable.rb +54 -0
- data/test/unit/core/variable/tc_method_parameter_variable.rb +22 -0
- data/test/unit/core/variable/tc_runtime_method_variable.rb +32 -0
- data/test/unit/core/variable/tc_string_variable.rb +37 -0
- data/test/unit/core/variable/tc_unknown.rb +24 -0
- data/test/unit/core/variable/tc_variable_reference.rb +28 -0
- data/test/unit/ruby_code/tc_array.rb +64 -0
- data/test/unit/ruby_code/tc_fixnum.rb +18 -0
- data/test/unit/ruby_code/tc_hash.rb +41 -0
- data/test/unit/ruby_code/tc_string.rb +38 -0
- data/test/unit/tc_chain.rb +434 -0
- data/test/unit/tc_chain_mapping.rb +62 -0
- data/test/unit/tc_chain_with_case_1.rb +169 -0
- data/test/unit/tc_instance_call.rb +40 -0
- data/test/unit/tc_instance_call_structure.rb +35 -0
- data/test/unit/tc_method_usage.rb +35 -0
- data/test/unit/tc_pot.rb +124 -0
- data/test/unit/tc_runtime_tracking_method.rb +40 -0
- data/test/unit/tc_statement_structure_2.rb +43 -0
- data/test/unit/tc_theory.rb +533 -0
- data/test/unit/tc_variable_declaration.rb +32 -0
- data/test/unit/theory/tc_theory_action.rb +80 -0
- data/test/unit/theory/tc_theory_action_implementation.rb +23 -0
- data/test/unit/theory/tc_theory_chain_validator.rb +340 -0
- data/test/unit/theory/tc_theory_connector.rb +396 -0
- data/test/unit/theory/tc_theory_dependent.rb +151 -0
- data/test/unit/theory/tc_theory_implementation.rb +133 -0
- data/test/unit/theory/tc_theory_result.rb +111 -0
- data/test/unit/theory/tc_theory_variable.rb +45 -0
- data/test/unit/util/tc_method_validation.rb +98 -0
- data/test/unit/util/tc_parser.rb +108 -0
- data/test/unit/util/tc_string_to_theory.rb +299 -0
- data/test/unit/variable/tc_method_usage_variable.rb +25 -0
- data/tmp/runtime_method_evaluation.rb +10 -0
- metadata +522 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
module Cauldron
|
2
|
+
|
3
|
+
module Conversion
|
4
|
+
|
5
|
+
def convert_to_example(values)
|
6
|
+
CTestCase.new(values[0...(values.length-1)],values.last)
|
7
|
+
end
|
8
|
+
|
9
|
+
def separate_values(csv)
|
10
|
+
csv.split(',').inject([]) {|total,x| total << eval(x) }
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/lib/cauldron/pot.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
module Cauldron
|
2
|
+
|
3
|
+
class Pot
|
4
|
+
include ContainsTheories
|
5
|
+
|
6
|
+
VERSION = '0-01'
|
7
|
+
|
8
|
+
def initialize()
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
def brew(test_cases)
|
13
|
+
|
14
|
+
# * Load each of the theories from the directory
|
15
|
+
saved_theory_file_paths = Dir.glob(File.join(theory_repository_path,'*','dump'))
|
16
|
+
theories = saved_theory_file_paths.collect {|x| Marshal.load(File.open(x,'r'))}
|
17
|
+
|
18
|
+
# Prepare the theory chain connector
|
19
|
+
runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
|
20
|
+
tc = Parser.run('test_cases')
|
21
|
+
tc_index_0 = IntrinsicLiteral.new(0)
|
22
|
+
tc_index_1 = IntrinsicLiteral.new(1)
|
23
|
+
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')
|
28
|
+
|
29
|
+
# Create the thoery connector and the values available
|
30
|
+
# TODO These values should actually be retreived progressively
|
31
|
+
potential_values = MappingValues.new([tc,tc_index_0,tc_index_1,param_0,real_method])
|
32
|
+
connector = TheoryConnector.new(potential_values)
|
33
|
+
|
34
|
+
# Attempt to generate a complete chain for the solution
|
35
|
+
chains = connector.generate_chains(runtime_method,test_cases,theories)
|
36
|
+
if chains.empty?
|
37
|
+
raise StandardError.new('Failed to generate a chain for this problem')
|
38
|
+
end
|
39
|
+
|
40
|
+
# Now validate each of the chains to check they work
|
41
|
+
# chains.each do |chain|
|
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
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
def simmer(demo)
|
55
|
+
raise StandardError.new('This demo does not work') unless demo_works?(demo)
|
56
|
+
|
57
|
+
# 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(demo[:chain],demo[:initial_method],demo[:test_cases])
|
60
|
+
|
61
|
+
# Add each of the theories in the chain to cauldron
|
62
|
+
master_theories.each {|x| save_theory(x,master_repository_path)}
|
63
|
+
|
64
|
+
# Save each of the simple versions of the theory
|
65
|
+
demo[:chain].each {|x| save_theory(x,theory_repository_path)}
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
# Uses the chain in the demo to construct a runtime method and then checks that
|
70
|
+
# the runtime method indeed solves the example supplied.
|
71
|
+
#
|
72
|
+
def demo_works?(demo)
|
73
|
+
begin
|
74
|
+
runtime_method = TheoryChainValidator.new.build(
|
75
|
+
demo[:initial_method],
|
76
|
+
demo[:test_cases],
|
77
|
+
[demo[:chain].implement]
|
78
|
+
)
|
79
|
+
rescue StandardError => e
|
80
|
+
StandardLogger.instance.warning e
|
81
|
+
return false
|
82
|
+
end
|
83
|
+
return true
|
84
|
+
end
|
85
|
+
|
86
|
+
# Removes all the saved theories to start a fresh
|
87
|
+
def clear
|
88
|
+
cauldron_repository_paths = File.join(home,'cauldron',VERSION,'*')
|
89
|
+
FileUtils.rm_r Dir.glob(cauldron_repository_paths)
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
# Check that the home directory exists
|
95
|
+
def home
|
96
|
+
realHome = ["HOME", "HOMEPATH"].detect {|h| ENV[h] != nil}
|
97
|
+
if not realHome
|
98
|
+
StandardLogger.instance.warning "Couldn't detect a home directory"
|
99
|
+
end
|
100
|
+
return ENV[realHome]
|
101
|
+
end
|
102
|
+
|
103
|
+
# Saves the generic theory to file. This theory will have minimal
|
104
|
+
# dependents and results.
|
105
|
+
#
|
106
|
+
def save_theory(theory,repository)
|
107
|
+
|
108
|
+
# Define the theory's directory
|
109
|
+
theory_path = File.join(repository,theory.theory_id.to_s)
|
110
|
+
raise StandardError.new('Directory already exists - how as this happened?') if File.exists?(theory_path)
|
111
|
+
|
112
|
+
# Save a file containing the theory
|
113
|
+
FileUtils.mkdir_p(theory_path)
|
114
|
+
dump_file = File.open(File.join(theory_path,'dump'),'w+')
|
115
|
+
data = Marshal.dump(theory)
|
116
|
+
dump_file << data
|
117
|
+
dump_file.close
|
118
|
+
|
119
|
+
desc_file = File.open(File.join(theory_path,'desc'),'w+')
|
120
|
+
desc_file << theory.write
|
121
|
+
desc_file.close
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
def master_repository_path
|
126
|
+
File.join(home,'cauldron',VERSION,'master-theories')
|
127
|
+
end
|
128
|
+
|
129
|
+
def theory_repository_path
|
130
|
+
File.join(home,'cauldron',VERSION,'theories')
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sexp_processor'
|
3
|
+
|
4
|
+
module Cauldron
|
5
|
+
|
6
|
+
class Sexp2Cauldron < SexpProcessor
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super
|
10
|
+
self.strict = false
|
11
|
+
self.expected = Object
|
12
|
+
@debug[:lasgn] = nil
|
13
|
+
@unsupported_checked = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def process_lit(exp)
|
17
|
+
type = exp.shift
|
18
|
+
val = exp.shift
|
19
|
+
return Literal.new(val)
|
20
|
+
end
|
21
|
+
|
22
|
+
# def in_context type, &block
|
23
|
+
# # puts '-------------------------- in_context'
|
24
|
+
# # warn 'kadsjflkasj kldasfj lasdkfj ldksaf'
|
25
|
+
# # puts type
|
26
|
+
# # puts block_given?
|
27
|
+
# # pp self.context
|
28
|
+
# # puts @debug.has_key?(type)
|
29
|
+
# # pp &block
|
30
|
+
# # puts '--------------------999999999999999'
|
31
|
+
# self.context.unshift type
|
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
|
+
#
|
138
|
+
# => Overwritten method
|
139
|
+
def process_lasgn(exp)
|
140
|
+
exp.shift
|
141
|
+
next_exp = exp.shift
|
142
|
+
if next_exp.to_s.match(/var(\d+)/)
|
143
|
+
s = Statement.new(Unknown.new($1),Equal.new)
|
144
|
+
end
|
145
|
+
|
146
|
+
if next_exp.kind_of?(Symbol)
|
147
|
+
res = process(exp.shift)
|
148
|
+
s.add res
|
149
|
+
end
|
150
|
+
s
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module Cauldron
|
2
|
+
|
3
|
+
class Terminal
|
4
|
+
|
5
|
+
include Cauldron::Conversion
|
6
|
+
|
7
|
+
attr_reader :cases
|
8
|
+
|
9
|
+
def initialize(output,auto=true)
|
10
|
+
@output, @cases,@auto = output, [], auto
|
11
|
+
end
|
12
|
+
|
13
|
+
def start
|
14
|
+
@output.puts 'Starting....'
|
15
|
+
@pot = Cauldron::Pot.new
|
16
|
+
@pot.clear
|
17
|
+
@output.puts '* Adding example case'
|
18
|
+
@pot.simmer(demo('1'))
|
19
|
+
|
20
|
+
@output.puts "Thanks for trying Cauldron - it's at really early stage right now"
|
21
|
+
@output.puts "in fact it can only generate a method that returns the parameter passed through"
|
22
|
+
@output.puts ""
|
23
|
+
@output.puts "To start enter your first test like this"
|
24
|
+
@output.puts "input,input,output"
|
25
|
+
@output.puts "For example "
|
26
|
+
@output.puts "'fish','animal'"
|
27
|
+
@output.puts "'cat','animal'"
|
28
|
+
@output.puts "'carrot','vegtable'"
|
29
|
+
@output.puts "and when you're done just type RUN"
|
30
|
+
|
31
|
+
# Wait for the user's inputs
|
32
|
+
unless @auto
|
33
|
+
loop do
|
34
|
+
submit gets
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def submit(input)
|
40
|
+
if input =~ /^RUN$/
|
41
|
+
@output.puts @pot.brew(@cases).basic_write
|
42
|
+
else
|
43
|
+
@cases << convert_to_example(separate_values(input))
|
44
|
+
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
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# This module is used in the various code containers used in Cauldren
|
3
|
+
#
|
4
|
+
module ActsAsCode
|
5
|
+
|
6
|
+
# Returns a string description of the statement with any of tokens replaced with
|
7
|
+
# token markers.
|
8
|
+
#
|
9
|
+
# So var_1 = var_2 + 3
|
10
|
+
#
|
11
|
+
# becomes a = b + c
|
12
|
+
#
|
13
|
+
# The order of replacement is important, the first token becomes a, the second b
|
14
|
+
# and so forth.
|
15
|
+
#
|
16
|
+
def write_structure
|
17
|
+
# TODO Not sure how to handle duplicate literals
|
18
|
+
output = self.write
|
19
|
+
self.tokens.zip(('a'..'z').to_a) do |x,y|
|
20
|
+
output.gsub!(x.write,y)
|
21
|
+
end
|
22
|
+
return output
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|