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
data/lib/Mapping.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# TODO I'm not sure I like this approach? - maybe just a hash would be clearer
|
2
|
+
class Mapping
|
3
|
+
|
4
|
+
attr_reader :hash
|
5
|
+
|
6
|
+
def initialize(hash={})
|
7
|
+
super()
|
8
|
+
@hash = hash
|
9
|
+
end
|
10
|
+
|
11
|
+
def values
|
12
|
+
return MappingValues.new(@hash.values)
|
13
|
+
end
|
14
|
+
|
15
|
+
def merge(mapping)
|
16
|
+
return Mapping.new(@hash.merge(mapping.hash))
|
17
|
+
end
|
18
|
+
|
19
|
+
# TODO Come back to this and include responds_to etc
|
20
|
+
# http://stackoverflow.com/questions/291132/method-missing-gotchas-in-ruby
|
21
|
+
def method_missing(sym, *args, &block)
|
22
|
+
return @hash.send(sym, *args, &block) if @hash.respond_to?(sym)
|
23
|
+
super(sym, *args, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class MappingValues < Array
|
2
|
+
|
3
|
+
def initialize(array=[])
|
4
|
+
super(array)
|
5
|
+
end
|
6
|
+
|
7
|
+
# TODO This approach isn't needed anymore
|
8
|
+
def -(val)
|
9
|
+
if val.kind_of?(MappingValues)
|
10
|
+
m = MappingValues.new
|
11
|
+
self.each do |x|
|
12
|
+
next if val.any? {|y| x.intrinsic_object_id == y.intrinsic_object_id}
|
13
|
+
m << x
|
14
|
+
end
|
15
|
+
return m
|
16
|
+
end
|
17
|
+
return super
|
18
|
+
end
|
19
|
+
|
20
|
+
def copy
|
21
|
+
return MappingValues.new(self.collect {|x| x.copy})
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/lib/Theory.rb
ADDED
@@ -0,0 +1,274 @@
|
|
1
|
+
class Theory
|
2
|
+
attr_reader :dependents, :action, :results, :theory_id, :example_runtime_method
|
3
|
+
|
4
|
+
# TODO This is only temporaily accessible for debug
|
5
|
+
attr_writer :results
|
6
|
+
|
7
|
+
attr_accessor :theory_instance_id
|
8
|
+
|
9
|
+
@@theory_id = 0
|
10
|
+
#
|
11
|
+
# @param example_runtime_method A runtime method instance with this theories action applied to it and
|
12
|
+
# which meets the theories dependents with a certain set of test cases.
|
13
|
+
#
|
14
|
+
def initialize(dependents,action,results,example_runtime_method=nil)
|
15
|
+
@dependents, @action, @results, @example_runtime_method = dependents, action, results, example_runtime_method
|
16
|
+
@theory_id = @@theory_id
|
17
|
+
@@theory_id += 1
|
18
|
+
end
|
19
|
+
|
20
|
+
def copy
|
21
|
+
#return Theory.new(@dependents.copy,@action.copy,@results.copy)
|
22
|
+
return Marshal.load(Marshal.dump(self))
|
23
|
+
end
|
24
|
+
|
25
|
+
# Identify the dependents and actions that haven't changed between adding the action.
|
26
|
+
#
|
27
|
+
def identify_unchanged
|
28
|
+
|
29
|
+
# Identify the dependents that change after the action is added
|
30
|
+
changing_dependents = []
|
31
|
+
@dependents.each do |dependent|
|
32
|
+
next if @results.any? {|x| x.write == dependent.write}
|
33
|
+
changing_dependents << dependent
|
34
|
+
end
|
35
|
+
|
36
|
+
# Identify the results that don't occur in the dependents
|
37
|
+
changing_results = []
|
38
|
+
@results.each do |result|
|
39
|
+
# TODO Should this use the changing_dependents
|
40
|
+
next if @dependents.any? {|x| x.write == result.write}
|
41
|
+
changing_results << result
|
42
|
+
end
|
43
|
+
|
44
|
+
# TODO Stripping out the dependents will mean that they won't be
|
45
|
+
# met and the theory might be dismissed unfairly. e.g. it
|
46
|
+
# needs var1.kind_of?(RuntimeMethod). It should probably start
|
47
|
+
# with the minimum and work backwards - e.g. adding the dependents
|
48
|
+
# until it doesn't fail.
|
49
|
+
|
50
|
+
# Create a new runtime method with the irrelevant changes removed
|
51
|
+
return Theory.new(changing_dependents,action.copy,changing_results,example_runtime_method.copy)
|
52
|
+
end
|
53
|
+
|
54
|
+
# # NOTE: This method might not be useful.
|
55
|
+
# # Returns a number of theories but with the number of dependents and results limited by the
|
56
|
+
# # the numbers specified.
|
57
|
+
# #
|
58
|
+
# def variants(dependent_limit=4,results_limit=4)
|
59
|
+
# results = []
|
60
|
+
# @dependents.copy.permutation(dependent_limit).each do |d|
|
61
|
+
# @results.copy.permutation(results_limit).each do |r|
|
62
|
+
# results << Theory.new(d.copy,action.copy,r,example_runtime_method.copy)
|
63
|
+
# end
|
64
|
+
# end
|
65
|
+
# return results
|
66
|
+
# end
|
67
|
+
|
68
|
+
# Loads a particular theory that has been saved to a file
|
69
|
+
#
|
70
|
+
def self.load_theory(theory_id)
|
71
|
+
directory_path = $LOC+File.join('test','fixtures','theories',theory_id.to_s)
|
72
|
+
raise StandardError.new("Theory fixture #{theory_id} does not exist") unless(File.exists?(directory_path))
|
73
|
+
dump_file = File.open(File.join(directory_path,'dump'),'r')
|
74
|
+
return Marshal.load(dump_file)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns a new theory where all the theory variables ids start from
|
78
|
+
# the supplied value.
|
79
|
+
#
|
80
|
+
def uniq_theory_variables(min_id)
|
81
|
+
|
82
|
+
ids = all_theory_variables.inject([]) {|total,x| total << x.theory_variable_id}
|
83
|
+
|
84
|
+
# Pair the olds with the new ones
|
85
|
+
map = ids.inject(Mapping.new) {|total,x| total[x] = TheoryVariable.new(min_id); min_id += 1; total}
|
86
|
+
|
87
|
+
# Duplicate the current theory and sustute the theory variables
|
88
|
+
# TODO Maybe shouldn't be a TheoryImplementation at this point
|
89
|
+
return self.map_to(map)
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns the component with the id supplied
|
94
|
+
#
|
95
|
+
def find_component(component_id)
|
96
|
+
return (dependents+results).find {|x| x.theory_component_id == component_id}
|
97
|
+
end
|
98
|
+
|
99
|
+
# Returns true if the theory contains a result that's structure is similar
|
100
|
+
# to that of the supplied result implementation.
|
101
|
+
#
|
102
|
+
# @param structure The theory result implementation that's structure is compared
|
103
|
+
# with this theorie's results.
|
104
|
+
#
|
105
|
+
def has_result_structure?(structure)
|
106
|
+
return @results.any? {|x| x.same_structure?(structure)}
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns the results thats structure matches that provided.
|
110
|
+
#
|
111
|
+
def select_result_structure(structure)
|
112
|
+
return @results.select {|x| x.same_structure?(structure)}
|
113
|
+
end
|
114
|
+
|
115
|
+
# Returns an array of any variables that only exist in the action. These
|
116
|
+
# are important for determining global ids, the results and dependents global
|
117
|
+
# id is determined my what they are connected to, these action variables aren't
|
118
|
+
# connected to anything.
|
119
|
+
#
|
120
|
+
def orphan_action_variables
|
121
|
+
return [] if @action.nil?
|
122
|
+
excluded_variables = (@dependents+@results).inject([]) {|total,x| total += x.theory_variables }
|
123
|
+
orphans = @action.theory_variables - excluded_variables
|
124
|
+
# TODO Should probably raise an error for this situation.
|
125
|
+
# TODO Actually as long as I include context when the value is added and the value it should
|
126
|
+
# be fine e.g. var2[:params][var3] for var3
|
127
|
+
StandardLogger.instance.warning "You really should not have variables that are not in dependents - there is no context for the value"
|
128
|
+
return orphans
|
129
|
+
end
|
130
|
+
|
131
|
+
# @param mapping { 1=>[],
|
132
|
+
# 2=>#<IntrinsicTestCases:0xb712d13c>,
|
133
|
+
# 3=>#<IntrinsicRuntimeMethod:0xb712c980>
|
134
|
+
# }
|
135
|
+
# @param values {
|
136
|
+
# 1=>0,
|
137
|
+
# 2=><#TestCases>
|
138
|
+
# 3=><#Runtime Method>
|
139
|
+
# }
|
140
|
+
#
|
141
|
+
def map_to(mapping,values={})
|
142
|
+
raise StandardError.new('Please use the maping datatype') unless mapping.kind_of?(Mapping)
|
143
|
+
return TheoryImplementation.new(
|
144
|
+
@dependents.collect {|y| y.map_to(mapping)},
|
145
|
+
@action ? @action.map_to(mapping) : nil,
|
146
|
+
@results.collect {|y| y.map_to(mapping)},
|
147
|
+
mapping,
|
148
|
+
values
|
149
|
+
)
|
150
|
+
end
|
151
|
+
|
152
|
+
# TODO Need to write tests for this that use the mapping
|
153
|
+
def rewrite_permutations(realisable_variables,partial_mapping=Mapping.new())
|
154
|
+
|
155
|
+
# Get an array of all the theory variables
|
156
|
+
a = all_theory_variables
|
157
|
+
|
158
|
+
# Strip out the theory variables that have already been accounted for
|
159
|
+
free_theory_variables = a.select {|x| !partial_mapping.has_key?(x.theory_variable_id) }
|
160
|
+
|
161
|
+
# If all the mapping has been determines just return the single permutation
|
162
|
+
return [self.map_to(partial_mapping)] if free_theory_variables.length == 0
|
163
|
+
# TODO This doesn't currentlt remove the initial finish values
|
164
|
+
arrangements = (realisable_variables - partial_mapping.values).permutation(free_theory_variables.length).to_a
|
165
|
+
|
166
|
+
# Map the arrangements to specific theory variables ids.
|
167
|
+
remaining_mapping = arrangements.inject([]) do |total,x|
|
168
|
+
# TODO I can probably get the 0 value to be the correct value
|
169
|
+
hash_table = Mapping.new(Hash[*free_theory_variables.collect { |v| [v.theory_variable_id,0] }.flatten])
|
170
|
+
free_theory_variables.zip(x) do |y,z|
|
171
|
+
hash_table[y.theory_variable_id] = z
|
172
|
+
end
|
173
|
+
total << hash_table
|
174
|
+
end
|
175
|
+
return remaining_mapping.inject([]) do |total,x|
|
176
|
+
total << self.map_to(x.merge(partial_mapping))
|
177
|
+
end
|
178
|
+
|
179
|
+
raise StandardError.new('Need to complete the rest of the mapping with the available realisable variables')
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
# Returns the highest theory variable id used by the theory
|
184
|
+
def highest_theory_variable_id
|
185
|
+
return all_theory_variables.sort {|y,z| y.theory_variable_id <=> z.theory_variable_id }.reverse.first.theory_variable_id
|
186
|
+
end
|
187
|
+
|
188
|
+
# Returns an array of all the theory variables used within the theory.
|
189
|
+
#
|
190
|
+
def all_theory_variables
|
191
|
+
|
192
|
+
# Get all the theory variables used in the @action, dependents and results
|
193
|
+
a = ([@action]+@dependents+@results).select{|x| x != nil}.inject([]) {|total,x| total += x.theory_variables }
|
194
|
+
|
195
|
+
# Filter out only the uniq theory vairables
|
196
|
+
# http://stackoverflow.com/questions/109781/uniq-by-object-attribute-in-ruby
|
197
|
+
return a.inject({}) {|total,x| total[x.theory_variable_id]=x; total}.values
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
# Returns an abstract description of theory with colour matching
|
202
|
+
# for common variables.
|
203
|
+
#
|
204
|
+
# TODO Include example here
|
205
|
+
#
|
206
|
+
def describe
|
207
|
+
|
208
|
+
# TODO include - theory_instance_id
|
209
|
+
# Describe the despendencies
|
210
|
+
description = 'if: '+"\n"
|
211
|
+
@dependents.inject(description) {|description, x| description += x.describe(1) }
|
212
|
+
|
213
|
+
# Describe the action
|
214
|
+
unless @action.nil?
|
215
|
+
description += "\n"+"action: \n"
|
216
|
+
description += @action.describe(1)
|
217
|
+
end
|
218
|
+
|
219
|
+
# Describe the result
|
220
|
+
description += "\n"+"result: \n"
|
221
|
+
@results.inject(description) {|description, x| description += x.describe(1) }
|
222
|
+
return description
|
223
|
+
|
224
|
+
end
|
225
|
+
|
226
|
+
def write
|
227
|
+
|
228
|
+
# Describe the despendencies
|
229
|
+
description = 'if: '+"\n"
|
230
|
+
@dependents.inject(description) {|description, x| description += x.write(1)+"\n" }
|
231
|
+
|
232
|
+
# Describe the action
|
233
|
+
unless @action.nil?
|
234
|
+
description += "\n"+"action: \n"
|
235
|
+
description += @action.write(1)
|
236
|
+
end
|
237
|
+
|
238
|
+
# Describe the result
|
239
|
+
description += "\n"+"result: \n"
|
240
|
+
@results.inject(description) {|description, x| description += x.write(1)+"\n" }
|
241
|
+
return description
|
242
|
+
end
|
243
|
+
|
244
|
+
def highlight(component_ids=[])
|
245
|
+
# @log.error("\033[0;31m\ "+msg+"\033[00m\ ")
|
246
|
+
# Describe the despendencies
|
247
|
+
description = 'if: '+"\n"
|
248
|
+
@dependents.inject(description) do |description, x|
|
249
|
+
if component_ids.include?(x.theory_component_id)
|
250
|
+
description += "\033[0;31m\ "+x.write(1)+"\033[00m\ "+"\n"
|
251
|
+
else
|
252
|
+
description += x.write(1)+"\n"
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
# Describe the action
|
257
|
+
unless @action.nil?
|
258
|
+
description += "\n"+"action: \n"
|
259
|
+
description += @action.write(1)
|
260
|
+
end
|
261
|
+
|
262
|
+
# Describe the result
|
263
|
+
description += "\n"+"result: \n"
|
264
|
+
@results.inject(description) {|description, x| description += x.write(1)+"\n" }
|
265
|
+
return description
|
266
|
+
end
|
267
|
+
|
268
|
+
# Returns an array of all the theory components used in the theory.
|
269
|
+
#
|
270
|
+
def components
|
271
|
+
return ([@action]+@dependents+@results).select{|x| x != nil}
|
272
|
+
end
|
273
|
+
|
274
|
+
end
|
data/lib/UnifiedChain.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
# A unified chain is no longer editable - all the links have been added. Unlike a normal
|
2
|
+
# chain there is no mapping, all the theories should have the correct ids if they are
|
3
|
+
# linked. A unified chain is always complete.
|
4
|
+
#
|
5
|
+
class UnifiedChain < Chain
|
6
|
+
# TODO I don't like that extending to Chain exposes the @nodes to public access
|
7
|
+
|
8
|
+
def initialize(nodes)
|
9
|
+
@nodes = nodes
|
10
|
+
end
|
11
|
+
|
12
|
+
def write(tab=0)
|
13
|
+
return @nodes.inject('') {|total,x| total += x.write}
|
14
|
+
end
|
15
|
+
|
16
|
+
def describe(tab=0)
|
17
|
+
return @nodes.inject('') {|total,x| total += x.describe}
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns an array of all the theory variables in the chain. All the
|
21
|
+
# theory variables should be global across the chain.
|
22
|
+
#
|
23
|
+
def theory_variables
|
24
|
+
results = @nodes.inject([]) do |total,theory|
|
25
|
+
total += theory.all_theory_variables.collect {|x| x}
|
26
|
+
total
|
27
|
+
end
|
28
|
+
return results.uniq
|
29
|
+
end
|
30
|
+
|
31
|
+
# Return an implemented version of the chain where all the theory variables have
|
32
|
+
# been replaced with read values.
|
33
|
+
#
|
34
|
+
def implement(mapping)
|
35
|
+
implemented_nodes = @nodes.inject([]) do |total,theory|
|
36
|
+
total << theory.map_to(mapping)
|
37
|
+
end
|
38
|
+
return ImplementedChain.new(implemented_nodes)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns an array of implemented chains using the various value
|
42
|
+
# permutations. Essential what it is looking for is mapping to convert
|
43
|
+
# all the theory variables to intrinsic variables.
|
44
|
+
#
|
45
|
+
# @param runtime_method The runtime method instance that will be populated to
|
46
|
+
# create the solution.<#RuntimeMethod >
|
47
|
+
# @param test_cases The test cases instance containing real values.
|
48
|
+
#
|
49
|
+
def implementation_permuatations(runtime_method,test_cases,mapping)
|
50
|
+
|
51
|
+
# Determine the number of variables without intrinsic values
|
52
|
+
theory_variable_ids = theory_variables.collect {|x| x.theory_variable_id}
|
53
|
+
|
54
|
+
# Collect the theory variables without intrinsic values
|
55
|
+
missing_intrinsic_values = theory_variable_ids-mapping.keys
|
56
|
+
|
57
|
+
# Take the first theory and identify all the accessors
|
58
|
+
# (need to work out what is the runtime method and what the test cases)
|
59
|
+
|
60
|
+
#pp missing_intrinsic_values
|
61
|
+
#puts @nodes.first.class.to_s
|
62
|
+
#@nodes.each {|x| puts x.class}
|
63
|
+
# TEMP: Why are these implemented theories
|
64
|
+
@nodes.first.all_theory_variables
|
65
|
+
|
66
|
+
# Create the theory generator
|
67
|
+
generator = TheoryGenerator.new()
|
68
|
+
accessors, temp_mapping = generator.generate_accessors_and_mapping(test_cases,runtime_method,1)
|
69
|
+
if temp_mapping.length > missing_intrinsic_values.length
|
70
|
+
|
71
|
+
# Now to assign real values to the chain
|
72
|
+
|
73
|
+
# Apply the values in the various permutaions
|
74
|
+
# (this is very crude and means that odd calls )
|
75
|
+
theory_variable_ids = @nodes.first.all_theory_variables.collect {|x| x.theory_variable_id }
|
76
|
+
|
77
|
+
# Get the posible sets for values in an array so that non of the arrays contain all the same values
|
78
|
+
res = temp_mapping.values.collect {|x| x}
|
79
|
+
|
80
|
+
# TODO This is a complete hack but I think I should be using intrinsic values rather than real
|
81
|
+
intrinsic_res = res.collect {|x| x.to_intrinsic}
|
82
|
+
value_permutaions = intrinsic_res.permutation(theory_variable_ids.length).to_a
|
83
|
+
uniq_value_permutations = value_permutaions.collect {|x| x.to_set}.uniq
|
84
|
+
|
85
|
+
possible_mappings = []
|
86
|
+
|
87
|
+
theory_variable_id_permutations = theory_variable_ids.permutation(theory_variable_ids.length).to_a
|
88
|
+
|
89
|
+
possible_mappings = []
|
90
|
+
theory_variable_id_permutations.each do |theory_variable_id_permutation|
|
91
|
+
uniq_value_permutations.each do |value_permutation|
|
92
|
+
m = Mapping.new
|
93
|
+
theory_variable_id_permutation.zip(value_permutation.to_a) do |key,value|
|
94
|
+
m[key] = value
|
95
|
+
end
|
96
|
+
possible_mappings << m
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
# Implemented changes
|
102
|
+
return possible_mappings.inject([]) { |total,mapping| total << self.copy.implement(mapping) }
|
103
|
+
|
104
|
+
else
|
105
|
+
raise StandardError.new('Could not generate enough real vlaues to test theory - try increasing the itterations')
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|