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,135 @@
|
|
1
|
+
# A theory dependent is the "if" part of a theory. It states what needs to be
|
2
|
+
# true for a theory to be valid. For example "if varA == 7", would be
|
3
|
+
# a theory dependent.
|
4
|
+
#
|
5
|
+
class TheoryDependent
|
6
|
+
include TheoryComponent
|
7
|
+
|
8
|
+
attr_reader :statement
|
9
|
+
#
|
10
|
+
# @param statement A theory statement
|
11
|
+
# e.g. StringToTheory.run("if(var1.pass?(var2))\nreturn true\nend")
|
12
|
+
#
|
13
|
+
def initialize(statement,theory_component_id=nil)
|
14
|
+
raise StandardError.new('Expecting open statement but was '+statement.class.to_s) unless statement.kind_of?(OpenStatement)
|
15
|
+
@statement = statement
|
16
|
+
@theory_component_id = theory_component_id unless theory_component_id.nil?
|
17
|
+
generate_theory_component_id
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns an abstract description of the dependent
|
21
|
+
def describe(tab=0)
|
22
|
+
return @statement.describe(tab)
|
23
|
+
end
|
24
|
+
|
25
|
+
def write(tab=0)
|
26
|
+
return @statement.write(tab)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns a deep copy of the theory dependent but with a unique object_ids, all the
|
30
|
+
# data should be identical.
|
31
|
+
#
|
32
|
+
def copy
|
33
|
+
return TheoryDependent.new(@statement.copy,@theory_component_id)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns all the theory vairables in this theory
|
37
|
+
# dependent.
|
38
|
+
#
|
39
|
+
def theory_variables
|
40
|
+
return @statement.select_all {|x| x.kind_of?(TheoryVariable)}
|
41
|
+
end
|
42
|
+
|
43
|
+
# TODO The same code is used for both TheoryDependent and TheoryResult
|
44
|
+
# Returns true if supplied statement has the same structure as this theory
|
45
|
+
# dependent's, it has the same structure if everything about the statement is
|
46
|
+
# the same except for the variables. This means that the map_to method
|
47
|
+
# could be used to make it write identically.
|
48
|
+
#
|
49
|
+
def same_structure?(structure)
|
50
|
+
return false unless structure.tokens.length == @statement.tokens.length
|
51
|
+
return false unless structure.write_structure == @statement.write_structure
|
52
|
+
return true
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns a new theory dependent with the theory variables replaced with
|
56
|
+
# the values in the mapping hash.
|
57
|
+
#
|
58
|
+
def map_to(mapping)
|
59
|
+
|
60
|
+
# Duplicate the current statement before it is rewritten
|
61
|
+
rewritten_statement = @statement.copy
|
62
|
+
|
63
|
+
# Find all the containers that contain TheoryVariables
|
64
|
+
# NOTE The statement is put in an array because select all doesn't include the array itself
|
65
|
+
containers = [rewritten_statement].select_all {|x| x.respond_to?(:has?)}
|
66
|
+
theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
|
67
|
+
|
68
|
+
# Rewrite the statement replacing the values
|
69
|
+
theory_variable_containers.each do |z|
|
70
|
+
z.replace_theory_variables!(mapping)
|
71
|
+
end
|
72
|
+
|
73
|
+
return TheoryDependent.new(rewritten_statement,@theory_component_id)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns a duplicate theory dependent but with the theory
|
77
|
+
# variables replaced with those supplied.
|
78
|
+
#
|
79
|
+
def rewrite_with(replacement_variables)
|
80
|
+
raise StandardError.new("This theory dependent has #{theory_variables.length} not #{replacement_variables.length}") if replacement_variables.length != theory_variables.length
|
81
|
+
rewritten_statement = @statement.copy
|
82
|
+
|
83
|
+
# TODO I think as well as copy I should have a rewrite_where(['var1'=>replacement_variables[0])
|
84
|
+
|
85
|
+
# Find all the containers that contain TheoryVariables
|
86
|
+
containers = [rewritten_statement].select_all {|x| x.respond_to?(:has?)}
|
87
|
+
theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
|
88
|
+
|
89
|
+
# Collect all uniq variables
|
90
|
+
# TODO Check that only uniq variables are caught
|
91
|
+
uniq_variables = theory_variable_containers.inject([]) {|results,x| results + x.variables }
|
92
|
+
|
93
|
+
# Check that all the variables in the theory dependent can be replaced
|
94
|
+
unless replacement_variables.length == uniq_variables.length
|
95
|
+
raise StandardError.new('Mismatch in the number of variables to be replaced and the number supplied')
|
96
|
+
end
|
97
|
+
|
98
|
+
# Create a mapping from the existing variable to the replacement ones
|
99
|
+
# TODo I really should use the varible id or something as the key
|
100
|
+
mapping = []
|
101
|
+
replacement_variables.zip(uniq_variables) do |x,y|
|
102
|
+
mapping.push({:before=>y,:after=>x})
|
103
|
+
end
|
104
|
+
theory_variable_containers.each do |z|
|
105
|
+
replacements = mapping.select {|x| x[:before].theory_variable_id == z.subject.theory_variable_id}
|
106
|
+
z.subject = replacements.first[:after]
|
107
|
+
end
|
108
|
+
return rewritten_statement
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns an array of theory statements that realise this dependency
|
113
|
+
# using the passed variables.
|
114
|
+
#
|
115
|
+
# http://en.wikipedia.org/wiki/Combination
|
116
|
+
# http://chriscontinanza.com/2010/10/29/Array.html
|
117
|
+
# 5! FACTORIAL
|
118
|
+
#
|
119
|
+
def rewrite_permutations(realisable_variables)
|
120
|
+
# TODO Need to include a combination size check here - incase it is going to get insane
|
121
|
+
raise StandardError.new('Currently requires at least one theory variable') if theory_variables.length == 0
|
122
|
+
|
123
|
+
# Create an array of all the possible permutations that could replace this depenents' theory variables
|
124
|
+
arrangements = realisable_variables.permutation(theory_variables.length).to_a
|
125
|
+
|
126
|
+
# Construct a new theory dependent that use realisable variables inplace of
|
127
|
+
# the theory variables
|
128
|
+
realisable_theory_dependents = []
|
129
|
+
arrangements.each do |x|
|
130
|
+
realisable_theory_dependents.push(self.copy.rewrite_with(x))
|
131
|
+
end
|
132
|
+
return realisable_theory_dependents
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Instances of this class are realised theorys. The theory variables
|
2
|
+
# have been replaced with values that generate valid ruby code.
|
3
|
+
|
4
|
+
class TheoryImplementation < Theory
|
5
|
+
attr_reader :mapping, :accessor_values
|
6
|
+
|
7
|
+
#
|
8
|
+
# @param mapping The literal mapping indicating what variable should be converted
|
9
|
+
# to what literal value. {1=><#IntrinsicRuntimeMethod,2=><#IntrinsicLiteral val=9>,...}
|
10
|
+
# @param values
|
11
|
+
#
|
12
|
+
def initialize(dependents,action,results,mapping,accessor_values={})
|
13
|
+
super(dependents,action,results)
|
14
|
+
@mapping, @accessor_values = mapping, accessor_values
|
15
|
+
end
|
16
|
+
|
17
|
+
def copy
|
18
|
+
#return TheoryImplementation.new(@dependents.copy, @action.copy, @results.copy,@mapping.copy)
|
19
|
+
return Marshal.load(Marshal.dump(self))
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns true if the result descript matches any of the results
|
23
|
+
# for this theory.
|
24
|
+
#
|
25
|
+
# @param result_description A OpenStatement with an if statement inside e.g.
|
26
|
+
# if(runtime_method.all_pass?(test_cases))
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
def leads_to?(result_description)
|
30
|
+
@results.any? {|x| x.statement.write == result_description.write}
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns true if the implemeted theories pass given the
|
34
|
+
# given runtime method and test cases.
|
35
|
+
#
|
36
|
+
# TODO There might be a bit of crossover between the TheoryResult validates?
|
37
|
+
# method.
|
38
|
+
#
|
39
|
+
def meets_dependencies?(runtime_method,test_cases)
|
40
|
+
|
41
|
+
self.dependents.collect {|y| y.copy}.each do |x|
|
42
|
+
# TODO I'm not sure there is much benefit in the ParametersContainer class
|
43
|
+
begin
|
44
|
+
unless evaluate_dependent(x,runtime_method.copy,test_cases)
|
45
|
+
return false
|
46
|
+
end
|
47
|
+
rescue NoMethodError => e
|
48
|
+
return false
|
49
|
+
rescue StandardError => e
|
50
|
+
return false
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
return true
|
55
|
+
|
56
|
+
end
|
57
|
+
# TODO If I remove the code from this method then tc_theory_implementation.rb still
|
58
|
+
# passes all the tests!
|
59
|
+
def evaluate_dependent(dependent,runtime_method,test_cases)
|
60
|
+
#dependent.statement.push(Parser.run('return true'))
|
61
|
+
last_runtime_method = runtime_method.copy
|
62
|
+
eval dependent.statement.write
|
63
|
+
return false
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns all the theory vairables in this theory
|
67
|
+
# dependent.
|
68
|
+
#
|
69
|
+
# TODO What is the point in this - why only the actions?
|
70
|
+
def theory_variables
|
71
|
+
return @action.select_all {|x| x.kind_of?(TheoryVariable)}
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# This instances of this class describe the consequence of a theory, e.g. if the
|
2
|
+
# the theories dependencies are met and the action complete then this will be
|
3
|
+
# true.
|
4
|
+
#
|
5
|
+
class TheoryResult
|
6
|
+
include TheoryComponent
|
7
|
+
|
8
|
+
attr_reader :statement
|
9
|
+
|
10
|
+
#
|
11
|
+
# @param statement A theory statement explaining what will be tested
|
12
|
+
# e.g. <runtime_method>.all_pass?(<test_cases>)
|
13
|
+
#
|
14
|
+
def initialize(statement,result=nil,theory_component_id=nil)
|
15
|
+
|
16
|
+
# TEMPORARY - Deprecaction Change:
|
17
|
+
unless result.nil? then StandardLogger.instance.warning('Result is being phased out - just use if statements') end
|
18
|
+
unless statement.kind_of?(OpenStatement)
|
19
|
+
StandardLogger.instance.warning('Please use open statements for theory results')
|
20
|
+
end
|
21
|
+
unless statement.length > 0
|
22
|
+
StandardLogger.instance.warning('Please include a return true statement in the theory result')
|
23
|
+
end
|
24
|
+
|
25
|
+
@statement = statement
|
26
|
+
@result = result
|
27
|
+
@theory_component_id = theory_component_id unless theory_component_id.nil?
|
28
|
+
generate_theory_component_id
|
29
|
+
end
|
30
|
+
|
31
|
+
def describe(tab=0)
|
32
|
+
return @statement.describe(tab)
|
33
|
+
end
|
34
|
+
|
35
|
+
def write(tab=0)
|
36
|
+
return @statement.write(tab)
|
37
|
+
end
|
38
|
+
|
39
|
+
def copy
|
40
|
+
#return TheoryResult.new(@statement.copy,@result)
|
41
|
+
return Marshal.load(Marshal.dump(self))
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns a new theory result with the theory variables replaced with
|
45
|
+
# the values in the mapping hash.
|
46
|
+
#
|
47
|
+
# @param mapping { 1=>[],
|
48
|
+
# 2=>#<IntrinsicTestCases:0xb712d13c>,
|
49
|
+
# 3=>#<IntrinsicRuntimeMethod:0xb712c980>
|
50
|
+
# }
|
51
|
+
#
|
52
|
+
def map_to(mapping)
|
53
|
+
|
54
|
+
# Duplicate the current statement before it is rewritten
|
55
|
+
rewritten_statement = @statement.copy
|
56
|
+
|
57
|
+
# Find all the containers that contain TheoryVariables
|
58
|
+
# NOTE The statement is put in an array because select all doesn't include the array itself
|
59
|
+
containers = [rewritten_statement].select_all {|x| x.respond_to?(:has?)}
|
60
|
+
theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
|
61
|
+
|
62
|
+
# Rewrite the statement replacing the values
|
63
|
+
theory_variable_containers.each do |z|
|
64
|
+
z.replace_theory_variables!(mapping)
|
65
|
+
end
|
66
|
+
|
67
|
+
return TheoryResult.new(rewritten_statement,nil,theory_component_id)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns a mapping hash that will convert this result to the statement
|
71
|
+
# provided.
|
72
|
+
#
|
73
|
+
def mapping_for(statement)
|
74
|
+
mapping = Mapping.new()
|
75
|
+
@statement.tokens.zip(statement.tokens) do |x,y|
|
76
|
+
mapping[x.theory_variable_id] = y
|
77
|
+
end
|
78
|
+
return mapping
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns true if supplied statement has the same structure as this theory
|
82
|
+
# result's, it has the same structure if everything about the statement is
|
83
|
+
# the same except for the variables. This means that the map_to method
|
84
|
+
# could be used to make it write identically.
|
85
|
+
#
|
86
|
+
def same_structure?(structure)
|
87
|
+
return false unless structure.tokens.length == @statement.tokens.length
|
88
|
+
return false unless structure.write_structure == @statement.write_structure
|
89
|
+
return true
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns true if theory result is true with the supplied
|
93
|
+
# runtime method and test cases. The paramter are 'rutime_method'
|
94
|
+
# and 'test_cases' so the eval can use them.
|
95
|
+
#
|
96
|
+
# TODO Write tests for this
|
97
|
+
def validates?(runtime_method,test_cases)
|
98
|
+
catch :theory_result_failed do
|
99
|
+
return true if use_statement(runtime_method,test_cases) == true
|
100
|
+
end
|
101
|
+
return false
|
102
|
+
end
|
103
|
+
|
104
|
+
protected
|
105
|
+
|
106
|
+
# This uses the result statement with the supplied values so
|
107
|
+
# the result can be evaluted.
|
108
|
+
#
|
109
|
+
def use_statement(runtime_method,test_cases)
|
110
|
+
duplicate_statement = @statement.copy
|
111
|
+
# TODO I'm not certaion with is how last_runtime is being used - see spec
|
112
|
+
last_runtime_method = runtime_method.copy
|
113
|
+
begin
|
114
|
+
rescue StandardError => e
|
115
|
+
end
|
116
|
+
# if((last_runtime_method.history2(test_cases[0]).select{ |x| x['statement_id'] == test_cases.last.statement_id} ) == test_cases[0][:params][0].length - 1)
|
117
|
+
# #return true
|
118
|
+
# end
|
119
|
+
|
120
|
+
#last_runtime_method.history2(test_cases[0][:params]).each do |x|
|
121
|
+
#end
|
122
|
+
# TODO For future debugging I really need to generate a runtime method from a string.
|
123
|
+
eval duplicate_statement.write
|
124
|
+
throw :theory_result_failed
|
125
|
+
rescue NoMethodError => e
|
126
|
+
throw :theory_result_failed
|
127
|
+
rescue TypeError => e
|
128
|
+
throw :theory_result_failed
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class TheoryVariable
|
2
|
+
include Variable
|
3
|
+
include Token
|
4
|
+
|
5
|
+
attr_reader :theory_variable_id
|
6
|
+
# colours http://forums.opensuse.org/archives/sls-archives/archives-suse-linux/archives-desktop-environments/379032-how-can-i-change-font-color-my-terminal.html
|
7
|
+
RED = "\033[31m"
|
8
|
+
GREEN = "\033[32m"
|
9
|
+
YELLOW = "\033[33m"
|
10
|
+
TURQUOISE = "\033[34m"
|
11
|
+
VIOLET = "\033[35m"
|
12
|
+
BLUE = "\033[36m"
|
13
|
+
NORMAL = "\033[m"
|
14
|
+
|
15
|
+
def initialize(theory_variable_id)
|
16
|
+
@theory_variable_id = theory_variable_id
|
17
|
+
end
|
18
|
+
|
19
|
+
def write
|
20
|
+
return "var#{@theory_variable_id}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def describe
|
24
|
+
return TheoryVariable.variable_colour(@theory_variable_id)+"var#{@theory_variable_id}"+NORMAL
|
25
|
+
end
|
26
|
+
|
27
|
+
def copy
|
28
|
+
return TheoryVariable.new(@theory_variable_id.copy)
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_declaration
|
32
|
+
return VariableDeclaration.new('TheoryVariable',Literal.new(@theory_variable_id).to_declaration)
|
33
|
+
end
|
34
|
+
|
35
|
+
def eql?(obj)
|
36
|
+
@theory_variable_id == obj.theory_variable_id
|
37
|
+
end
|
38
|
+
|
39
|
+
def hash
|
40
|
+
@theory_variable_id
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the preset colour for that particular id for easier
|
44
|
+
# tracking.
|
45
|
+
#
|
46
|
+
def self.variable_colour(theory_variable_id)
|
47
|
+
case theory_variable_id
|
48
|
+
when 0
|
49
|
+
return RED
|
50
|
+
when 1
|
51
|
+
return GREEN
|
52
|
+
when 2
|
53
|
+
return YELLOW
|
54
|
+
when 3
|
55
|
+
return TURQUOISE
|
56
|
+
when 4
|
57
|
+
return VIOLET
|
58
|
+
else
|
59
|
+
return BLUE
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class TheoryCollection
|
2
|
+
|
3
|
+
attr_reader :theories
|
4
|
+
|
5
|
+
def initialize(theories)
|
6
|
+
@theories = theories
|
7
|
+
end
|
8
|
+
|
9
|
+
def each_with_result_structure(structure)
|
10
|
+
@theories.each do |t|
|
11
|
+
t.results.each do |r|
|
12
|
+
if r.same_structure?(structure)
|
13
|
+
yield t, r
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def each_with_dependent_structure(structure)
|
20
|
+
@theories.each do |t|
|
21
|
+
t.dependents.each do |d|
|
22
|
+
if d.same_structure?(structure)
|
23
|
+
yield t, d
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the number of theories that have dependents
|
30
|
+
# or results that match the structure supplied.
|
31
|
+
#
|
32
|
+
# @param approach Either :dependents or :results
|
33
|
+
#
|
34
|
+
def same_structure_count(structure,approach)
|
35
|
+
@theories.inject(0) do |total,theory|
|
36
|
+
total += theory.send(approach).count {|x| x.same_structure?(structure)}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns all the dependents within the theories
|
41
|
+
#
|
42
|
+
def dependents
|
43
|
+
@theories.inject([]) {|total,theory| total += theory.dependents }
|
44
|
+
end
|
45
|
+
|
46
|
+
def results
|
47
|
+
@theories.inject([]) {|total,theory| total += theory.results }
|
48
|
+
end
|
49
|
+
|
50
|
+
def actions
|
51
|
+
@theories.select {|x| x.action != nil}.inject([]) {|total,theory| total << theory.action }
|
52
|
+
end
|
53
|
+
|
54
|
+
def components
|
55
|
+
return dependents+results
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns an array of all the uniq theory variables used.
|
59
|
+
def theory_variables
|
60
|
+
return @theories.inject([]) {|total,x| total += x.all_theory_variables}.uniq
|
61
|
+
end
|
62
|
+
end
|