cauldron 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|