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,33 @@
|
|
1
|
+
# I'm not sure whether to keep this class as I already have BlockVariable but that
|
2
|
+
# is a bit overkill - I'm not sure I need to keep BlockVariable either.
|
3
|
+
#
|
4
|
+
# Instances of this are used in theories where a variable that shouldn't be
|
5
|
+
# replaced is used. This might be a Global variable or a block variable.
|
6
|
+
#
|
7
|
+
# if(var1.any? {|x| x == var2})
|
8
|
+
# return false
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# In the theory above if x was a normal TheoryVariable it would be replaced and the theory
|
12
|
+
# would break.
|
13
|
+
#
|
14
|
+
class BlockToken
|
15
|
+
include Token
|
16
|
+
|
17
|
+
def initialize(identitiy)
|
18
|
+
@identitiy = identitiy
|
19
|
+
end
|
20
|
+
|
21
|
+
def write
|
22
|
+
return @identitiy
|
23
|
+
end
|
24
|
+
|
25
|
+
def describe
|
26
|
+
return write
|
27
|
+
end
|
28
|
+
|
29
|
+
def copy
|
30
|
+
return BlockToken.new(@identitiy.copy)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/lib/core/CCall.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# This is an individual test case that has an input an output. It is essentially
|
2
|
+
# just a hash but I've created a new class for it just for the convenience of using
|
3
|
+
# the .kind_of? method in theory chains.
|
4
|
+
#
|
5
|
+
# TODO Don't like extending core datatypes
|
6
|
+
class CTestCase < Hash
|
7
|
+
|
8
|
+
# TODO Should be able pass the hash directly or usea variable to contain the hash
|
9
|
+
def initialize(inputs=nil,output=nil)
|
10
|
+
super()
|
11
|
+
self[:params] = inputs
|
12
|
+
self[:output] = output
|
13
|
+
end
|
14
|
+
|
15
|
+
def copy
|
16
|
+
return Marshal.load(Marshal.dump(self))
|
17
|
+
end
|
18
|
+
|
19
|
+
def cauldron_method_calls
|
20
|
+
results = self.collect do |key,value|
|
21
|
+
'[:'+key.to_s+']'
|
22
|
+
end
|
23
|
+
results << '.kind_of?'
|
24
|
+
return results
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#
|
2
|
+
# FixnumVariable.new(8)
|
3
|
+
#
|
4
|
+
class ClassMethodCallContainer < CallContainer
|
5
|
+
attr_reader :method_call, :parameters
|
6
|
+
|
7
|
+
def initialize(class_name,method_call,*parameters)
|
8
|
+
|
9
|
+
# Check the type for the class name
|
10
|
+
raise StandardError.new('Unexpected data type '+class_name.class.to_s) unless class_name.kind_of?(ClassName)
|
11
|
+
@class_name = class_name
|
12
|
+
|
13
|
+
super(class_name,method_call,*parameters)
|
14
|
+
end
|
15
|
+
|
16
|
+
def class_name
|
17
|
+
return @subject
|
18
|
+
end
|
19
|
+
|
20
|
+
def copy
|
21
|
+
return ClassMethodCallContainer.new(@subject.copy,@method_call.copy,*@parameters.collect {|x| x.copy})
|
22
|
+
end
|
23
|
+
|
24
|
+
# This method is used during tracking to print a general description of what
|
25
|
+
# the instance call is doing. e.g. MethodUsage.new.
|
26
|
+
#
|
27
|
+
def to_literal_string
|
28
|
+
return @class_name.write+'.'+@method_call.to_literal_string
|
29
|
+
end
|
30
|
+
|
31
|
+
# TODO Write tests
|
32
|
+
# Returns true if the supplied argument is the same class, has the equivalent subjects
|
33
|
+
# and parameters.
|
34
|
+
#
|
35
|
+
def equivalent?(to)
|
36
|
+
return false unless self.class == to.class
|
37
|
+
return false unless @class_name.class == to.class_name.class
|
38
|
+
return false unless @method_call.class == to.method_call.class
|
39
|
+
@parameters.each_with_index do |x,i|
|
40
|
+
return false unless x.equivalent?(to.parameters[i])
|
41
|
+
end
|
42
|
+
return true
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# This is just a wrapper for elements that should be wrapped in parenthesis.
|
2
|
+
#
|
3
|
+
class Container
|
4
|
+
|
5
|
+
def initialize(*tokens)
|
6
|
+
@tokens = tokens
|
7
|
+
end
|
8
|
+
|
9
|
+
def replace_theory_variables!(mapping)
|
10
|
+
@tokens.each_with_index do |x,i|
|
11
|
+
if x.kind_of?(TheoryVariable) && mapping.has_key?(x.theory_variable_id)
|
12
|
+
@tokens[i] = mapping[x.theory_variable_id].copy
|
13
|
+
next
|
14
|
+
end
|
15
|
+
@tokens[i].replace_theory_variables!(mapping) if @tokens[i].respond_to?(:replace_theory_variables!)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def write(tab=0)
|
20
|
+
line = '('
|
21
|
+
tab.times {line += "\t" }
|
22
|
+
@tokens.each do |code|
|
23
|
+
line += code.write
|
24
|
+
break if code.object_id == @tokens.last.object_id
|
25
|
+
line += ' '
|
26
|
+
end
|
27
|
+
return line+')'
|
28
|
+
end
|
29
|
+
|
30
|
+
def describe(tab=0)
|
31
|
+
line = '('
|
32
|
+
tab.times {line += "\t" }
|
33
|
+
@tokens.each do |code|
|
34
|
+
line += code.describe
|
35
|
+
break if code.object_id == @tokens.last.object_id
|
36
|
+
line += ' '
|
37
|
+
end
|
38
|
+
return line+')'
|
39
|
+
end
|
40
|
+
|
41
|
+
def copy
|
42
|
+
return Container.new(*@tokens.collect {|x| x.copy} )
|
43
|
+
end
|
44
|
+
|
45
|
+
def select_all(results=[],&block)
|
46
|
+
results.push self if block.call(self)
|
47
|
+
@tokens.each do |x|
|
48
|
+
if block.call(x)
|
49
|
+
results.push(x)
|
50
|
+
end
|
51
|
+
if x.respond_to?(:select_all)
|
52
|
+
x.select_all(results,&block)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
return results
|
56
|
+
end
|
57
|
+
|
58
|
+
def has?(&block)
|
59
|
+
return true if block.call(self)
|
60
|
+
@tokens.each do |x|
|
61
|
+
return true if block.call(x)
|
62
|
+
end
|
63
|
+
return false
|
64
|
+
end
|
65
|
+
|
66
|
+
# This method writes the statement out as a literal string. In the sense
|
67
|
+
# that any of the variables used in the statement are converted to literals
|
68
|
+
# and written. Unknown variables are not written yet though.
|
69
|
+
#
|
70
|
+
# This method is called during tracking to give an indication what the statement
|
71
|
+
# being tracked is doing.
|
72
|
+
#
|
73
|
+
# TODO I am treating unknown variables as a special case that is the same
|
74
|
+
# value e.g. 'var' - but for determining equivalent processes it isn't
|
75
|
+
# ideal becuase you loose track of what variables is used in each
|
76
|
+
# statement. Although I'll wait unitl I can come up with an example
|
77
|
+
# and come up with a solution then.
|
78
|
+
#
|
79
|
+
def to_literal_string
|
80
|
+
return @tokens.inject('') do |complete,part|
|
81
|
+
complete += part.to_literal_string
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,272 @@
|
|
1
|
+
# This class represents any instance method call. For example:
|
2
|
+
#
|
3
|
+
# 'test'.length
|
4
|
+
# foo.class
|
5
|
+
# bar.nil?
|
6
|
+
#
|
7
|
+
# TODO The InstanceCallContainer should may be be replaced with just statement - the parser
|
8
|
+
# just has :call types.
|
9
|
+
#
|
10
|
+
class InstanceCallContainer < CallContainer
|
11
|
+
include PrintVariables
|
12
|
+
include VariableIncluded
|
13
|
+
|
14
|
+
attr_reader :subject, :method_call
|
15
|
+
attr_reader :value
|
16
|
+
|
17
|
+
#
|
18
|
+
# @param subject The variable or literal that is being acted upon
|
19
|
+
# @param method_call The method call being made against the variable
|
20
|
+
# or literal
|
21
|
+
#
|
22
|
+
def initialize(subject,method_call,*params)
|
23
|
+
raise StandardError.new('Use ClassMethodCallContainer here') if subject.kind_of?(ClassName)
|
24
|
+
super(subject,method_call,*params)
|
25
|
+
end
|
26
|
+
|
27
|
+
def write_with_uniq_id
|
28
|
+
if @subject.respond_to?('write_with_uniq_id')
|
29
|
+
return @subject.write_with_uniq_id+'.'+method_call.write+write_params(@parameters)
|
30
|
+
end
|
31
|
+
return @subject.write+'.'+method_call.write+write_params(@parameters)
|
32
|
+
end
|
33
|
+
|
34
|
+
# TODO There are many similar version of this method used
|
35
|
+
def replace_theory_variables!(mapping)
|
36
|
+
if @subject.kind_of?(TheoryVariable) && mapping.has_key?(@subject.theory_variable_id)
|
37
|
+
@subject = mapping[@subject.theory_variable_id].copy
|
38
|
+
elsif @subject.respond_to?(:replace_theory_variables!)
|
39
|
+
@subject.replace_theory_variables!(mapping)
|
40
|
+
end
|
41
|
+
@parameters.each_with_index do |x,i|
|
42
|
+
if x.kind_of?(TheoryVariable) && mapping.has_key?(x.theory_variable_id)
|
43
|
+
@parameters[i] = mapping[x.theory_variable_id].copy
|
44
|
+
next
|
45
|
+
end
|
46
|
+
@parameters[i].replace_theory_variables!(mapping) if @parameters[i].respond_to?(:replace_theory_variables!)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
# TODO This can probably replace replace_theory_variables!
|
52
|
+
def replace_variables!(mapping)
|
53
|
+
if @subject.kind_of?(Variable) && mapping.has_key?(@subject.variable_id)
|
54
|
+
@subject = mapping[@subject.variable_id].copy
|
55
|
+
elsif @subject.respond_to?(:replace_variables!)
|
56
|
+
@subject.replace_variables!(mapping)
|
57
|
+
end
|
58
|
+
@parameters.each_with_index do |x,i|
|
59
|
+
if x.kind_of?(Variable) && mapping.has_key?(x.variable_id)
|
60
|
+
@parameters[i] = mapping[x.variable_id].copy
|
61
|
+
next
|
62
|
+
end
|
63
|
+
@parameters[i].replace_variables!(mapping) if @parameters[i].respond_to?(:replace_variables!)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns a duplicate instance call container with any matching
|
69
|
+
# variables replaced with the variable supplied.
|
70
|
+
#
|
71
|
+
# @param var The variable that will replace any matching variables
|
72
|
+
#
|
73
|
+
def replace_variable_if(var,&block)
|
74
|
+
container = self.copy.clear
|
75
|
+
if block.call(@subject)
|
76
|
+
container.subject = var if block.call(@subject)
|
77
|
+
end
|
78
|
+
@parameters.each do |x|
|
79
|
+
if x.kind_of?(Variable)
|
80
|
+
container.push(var) if block.call(x)
|
81
|
+
end
|
82
|
+
container.push(x.copy)
|
83
|
+
end
|
84
|
+
return container
|
85
|
+
end
|
86
|
+
|
87
|
+
def contains?(&block)
|
88
|
+
return true if @parameters.contains?(&block)
|
89
|
+
return true if block.call(@subject)
|
90
|
+
return true if block.call(@method_call)
|
91
|
+
return false
|
92
|
+
end
|
93
|
+
|
94
|
+
def write_in_context(context=self)
|
95
|
+
return @subject.write_in_context(context)+'.'+method_call.write
|
96
|
+
end
|
97
|
+
|
98
|
+
def copy
|
99
|
+
copied_subject = @subject.copy
|
100
|
+
return InstanceCallContainer.new(copied_subject,@method_call.copy,*@parameters.collect {|x| x.copy})
|
101
|
+
end
|
102
|
+
|
103
|
+
def variable
|
104
|
+
return @subject
|
105
|
+
end
|
106
|
+
|
107
|
+
def literalisable?
|
108
|
+
return @subject.literalisable?
|
109
|
+
end
|
110
|
+
|
111
|
+
# Attempts to return a literal value for the result of calling
|
112
|
+
# this instance call.
|
113
|
+
#
|
114
|
+
def literalise(context=self)
|
115
|
+
unless(@subject.literalisable?)
|
116
|
+
raise FailedToLiteraliseError.new('Failed to literalise '+self.write+' couln\'t literalise '+@subject.write)
|
117
|
+
end
|
118
|
+
return eval(@subject.literalise.write(context)+@method_call.write)
|
119
|
+
end
|
120
|
+
|
121
|
+
def value
|
122
|
+
return literalise
|
123
|
+
end
|
124
|
+
|
125
|
+
# Returns the actual variable with the specified id.
|
126
|
+
#
|
127
|
+
# @param id
|
128
|
+
#
|
129
|
+
def find_actual_variable(id)
|
130
|
+
return @subject if @subject.uniq_id == id
|
131
|
+
@parameters.each do |x|
|
132
|
+
return x if x.uniq_id == id
|
133
|
+
end
|
134
|
+
throw :variable_not_found
|
135
|
+
end
|
136
|
+
|
137
|
+
def response
|
138
|
+
case value.class.to_s
|
139
|
+
when 'string'.class.to_s
|
140
|
+
return StringVariable.new(value)
|
141
|
+
break
|
142
|
+
when 8.class.to_s
|
143
|
+
return FixnumVariable.new(value)
|
144
|
+
else
|
145
|
+
raise StandardError.new('Unknown class '+value.class.to_s)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Set the value of the container for the subject
|
150
|
+
#
|
151
|
+
def container=(val)
|
152
|
+
@container = val
|
153
|
+
@subject.container = @container
|
154
|
+
end
|
155
|
+
|
156
|
+
# Determines whether the is an imediate 'self' in the instance
|
157
|
+
# call.
|
158
|
+
def contains_self?
|
159
|
+
return true if subject.kind_of? This
|
160
|
+
return false
|
161
|
+
end
|
162
|
+
|
163
|
+
# Substitutes one variable for another one providing the
|
164
|
+
# the block returns true.
|
165
|
+
#
|
166
|
+
def subst!(var,&block)
|
167
|
+
@subject = var.copy if block.call(@subject)
|
168
|
+
@parameters.each_with_index do |x,i|
|
169
|
+
if block.call(x)
|
170
|
+
@parameters[i] = var.copy
|
171
|
+
end
|
172
|
+
end
|
173
|
+
return self
|
174
|
+
end
|
175
|
+
|
176
|
+
# Substitutes the 'self' in the instance call for a literal
|
177
|
+
# value and evaluates it.
|
178
|
+
#
|
179
|
+
def subst_self_for literal
|
180
|
+
if subject.kind_of? This
|
181
|
+
@subject = literal
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def subject=(val)
|
186
|
+
@subject = val
|
187
|
+
end
|
188
|
+
|
189
|
+
def variable_id
|
190
|
+
return @subject.variable_id
|
191
|
+
end
|
192
|
+
|
193
|
+
def find_variable(id)
|
194
|
+
raise StandardError.new('This instance call does not contain the variable with the id '+id.to_s) unless variable_id == id
|
195
|
+
return contextual_subject
|
196
|
+
end
|
197
|
+
|
198
|
+
#
|
199
|
+
def copy_contextual_variable
|
200
|
+
return contextual_subject
|
201
|
+
end
|
202
|
+
|
203
|
+
def declaration_statement
|
204
|
+
new_instance_call = ClassMethodCallContainer.new(InstanceCallContainerClass.new,New.new,@subject.copy.declaration_statement,@method_call.copy.declaration_statement)
|
205
|
+
return Statement.new(new_instance_call)
|
206
|
+
end
|
207
|
+
|
208
|
+
# This method is used during tracking to print a general description of what
|
209
|
+
# the instance call is doing. e.g. 'test'.chop.
|
210
|
+
#
|
211
|
+
def to_literal_string
|
212
|
+
return @subject.to_literal_string+'.'+@method_call.to_literal_string
|
213
|
+
end
|
214
|
+
|
215
|
+
# Returns a declaration instance that will create a InstanceCallContainer with
|
216
|
+
# same properies as this InstanceCallContainer.
|
217
|
+
#
|
218
|
+
def to_declaration
|
219
|
+
return VariableDeclaration.new('InstanceCallContainer',*[@subject.to_declaration,@method_call.to_declaration,*@parameters.collect {|x| x.to_declaration}])
|
220
|
+
end
|
221
|
+
|
222
|
+
# Returns an array of all the variables used in this instance call.
|
223
|
+
#
|
224
|
+
def variables
|
225
|
+
if @subject.kind_of?(Variable)
|
226
|
+
results = [@subject.copy]
|
227
|
+
end
|
228
|
+
results ||= []
|
229
|
+
@parameters.each do |x|
|
230
|
+
results.push(x.copy)
|
231
|
+
end
|
232
|
+
return results
|
233
|
+
end
|
234
|
+
|
235
|
+
# Returns true if the supplied argument is equivant to this instance call
|
236
|
+
# container. They are equivalent if the their classes are the same, their
|
237
|
+
# subjects are equivalent, their method_calls are the same and use equivalent
|
238
|
+
# arguments.
|
239
|
+
#
|
240
|
+
def equivalent?(to)
|
241
|
+
return false unless self.class == to.class
|
242
|
+
return false unless self.length == to.length
|
243
|
+
return false unless @subject.equivalent?(to.subject)
|
244
|
+
return false unless @method_call.class == to.method_call.class
|
245
|
+
return false if @parameters.length != to.parameters.length
|
246
|
+
@parameters.each_with_index do |x,i|
|
247
|
+
return false unless x.equivalent?(to.parameters[i])
|
248
|
+
end
|
249
|
+
return true
|
250
|
+
end
|
251
|
+
|
252
|
+
protected
|
253
|
+
|
254
|
+
def contextual_subject
|
255
|
+
|
256
|
+
# Check that the literal supports the method call
|
257
|
+
if @subject.kind_of? Literal
|
258
|
+
raise NameError.new('Literal '+self.write+' does not have the method call '+@method_call.write) unless @subject.allowed? @method_call
|
259
|
+
end
|
260
|
+
|
261
|
+
# Copy the subject variable
|
262
|
+
copied_subject = @subject.copy
|
263
|
+
|
264
|
+
# Retrieve any requirements associated with the method call
|
265
|
+
@method_call.requirements do |req|
|
266
|
+
copied_subject.push(req)
|
267
|
+
end
|
268
|
+
return copied_subject
|
269
|
+
|
270
|
+
end
|
271
|
+
|
272
|
+
end
|