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,40 @@
|
|
1
|
+
# Not sure how or is this class will be used but it is meant as contextual
|
2
|
+
# reference to a different instance.
|
3
|
+
#
|
4
|
+
# TODO Check whether this needs to be an array
|
5
|
+
#
|
6
|
+
class This < Array
|
7
|
+
|
8
|
+
#
|
9
|
+
# @param method_call The name of any method call if any. For example:
|
10
|
+
# self.class
|
11
|
+
#
|
12
|
+
def initialize(*parameters)
|
13
|
+
super()
|
14
|
+
|
15
|
+
# Save any requirements
|
16
|
+
parameters.collect {|param| self.push param}
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param variable The variable "self" refers to. This is dependent on
|
20
|
+
# where the instance is used.
|
21
|
+
#
|
22
|
+
def write(context=nil,variable=nil)
|
23
|
+
if context.nil? then return 'self' end
|
24
|
+
if variable.nil? then return 'self' end
|
25
|
+
return context.display_name_for(variable)
|
26
|
+
end
|
27
|
+
|
28
|
+
def describe(context=nil,variable=nil)
|
29
|
+
return write(context,variable)+"\n"
|
30
|
+
end
|
31
|
+
|
32
|
+
def copy
|
33
|
+
return This.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def declaration_statement
|
37
|
+
return ClassMethodCallContainer.new(ThisClass.new,New.new)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Next
|
2
|
+
include Code
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
def write(tab=0)
|
9
|
+
return ("\t"*tab)+'next'
|
10
|
+
end
|
11
|
+
|
12
|
+
def copy
|
13
|
+
return Next.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_declaration
|
17
|
+
return VariableDeclaration.new(self.class.to_s)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_literal_string
|
21
|
+
return write
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module ActsAsTrackable
|
2
|
+
|
3
|
+
# Returns a tracking statement for the line supplied. The tracking call
|
4
|
+
# contains the following values.
|
5
|
+
#
|
6
|
+
# line The line the statement occurs on
|
7
|
+
# action The statement written as a literal string - I'm not sure whether or not this is
|
8
|
+
# important value or not yet.
|
9
|
+
# variables An array of variables used in the statement - they are saved in the following format
|
10
|
+
# {'id'=>4,'value'=>'Project Purity'}. As such the variables only have literal values.
|
11
|
+
# NOTE: Currently I am only saving the variables in the statement but it might be
|
12
|
+
# prudent later to save all the variables available to statement.
|
13
|
+
# local_variables saves an array with the name of all the variables in scope.
|
14
|
+
#
|
15
|
+
# @param tracking_method The runtime method that gets called to retain to tracking information
|
16
|
+
# @param line The line the tracking call represents (NOTE Currently the line is represented
|
17
|
+
# by the length of an array to keep scope between methods)
|
18
|
+
# TODO I would rather be able to use a single variable.
|
19
|
+
# @param statement The statement represented by the tracking call this can be nil if it is
|
20
|
+
# the start of a method.
|
21
|
+
# @param variables_value An array of variable values and ids stored in a hash e.g.
|
22
|
+
# [{'id'=>4,'value'=>'Project Purity'},..]
|
23
|
+
#
|
24
|
+
def tracking_statement(tracking_method,line,statement_id=nil,variables_value=[],statement=nil)
|
25
|
+
(statement.nil?) ? action = '' : action = statement.to_literal_string
|
26
|
+
params = [line.length,statement_id,variables_value,action]
|
27
|
+
line.push(1)
|
28
|
+
track_statement = Statement.new(DefCall.new(NilVariable.new,tracking_method,*params))
|
29
|
+
return track_statement
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns an array of variables abstracted from the variable containers in
|
33
|
+
# the format used by the tracking statement. A variable container includes
|
34
|
+
# a statement, nested statement, block container and runtime method. This is
|
35
|
+
# essentially every variable used in the variable container.
|
36
|
+
#
|
37
|
+
# The variables are returned in the following format:
|
38
|
+
# [{id'=>4,'value'=>'Project Purity'},
|
39
|
+
# {id'=>4,'value'=>'Vault 101'},
|
40
|
+
# {id'=>4,'value'=>'Brotherhood of Steel'}]
|
41
|
+
#
|
42
|
+
# @param variable_containers Any number of elements that may contain variables.
|
43
|
+
#
|
44
|
+
def abstract_variables_for_tracking(*variable_containers)
|
45
|
+
results = []
|
46
|
+
variable_containers.each do |x|
|
47
|
+
# NOTE This breaks on the ParametersContainer
|
48
|
+
#x.each_variable do |y|
|
49
|
+
# NOTE This breaks on statements
|
50
|
+
#x.each do |y|
|
51
|
+
# NOTE: This breaks histroy
|
52
|
+
#x.select {|z| z.kind_of?(Variable)}.each do |y|
|
53
|
+
x.select_all {|z| z.kind_of?(Variable)}.each do |y|
|
54
|
+
results.push(Hash[
|
55
|
+
'id'=>y.variable_id,
|
56
|
+
'uniq_id'=>y.uniq_id,
|
57
|
+
'value'=>InstanceCallContainer.new(y,Copy.new),
|
58
|
+
'abs_id'=>EvalCall.new("#{y.write}.object_id.to_s")
|
59
|
+
])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
return results
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
# Contains the usage history of a method, or a statement group etc. The current structure is
|
2
|
+
# something like the following:
|
3
|
+
#
|
4
|
+
# [0] = {line:1,available_variables:[var_0,var_1],action:"'test'"}
|
5
|
+
# [1] = {line:2,available_variables:[var_0,var_1,var_2],action:"'test'.chop"}
|
6
|
+
#
|
7
|
+
# Actually the history object should probably save what happens to variables at
|
8
|
+
# each line aswell. Although I should frame this in a example so I rember.
|
9
|
+
#
|
10
|
+
# One of the purposes of the history object is to refactor code. So
|
11
|
+
# if I have three chop statements.
|
12
|
+
#
|
13
|
+
# var_0 = 'test'
|
14
|
+
# var_1 = var_0.chop
|
15
|
+
# var_2 = var_1.chop
|
16
|
+
# var_3 = var_2.chop (ending with var_3 = 't')
|
17
|
+
#
|
18
|
+
# Now I'm to abstract that process so I come up with the method
|
19
|
+
#
|
20
|
+
# var_0 = 'test'
|
21
|
+
# 3.times do |i|
|
22
|
+
# var_0 = var_0.chop
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# In both cases they end up with a value of 't' but how can we be sure that
|
26
|
+
# replacing one process with the other is equivalent? Well of course they're
|
27
|
+
# not identical and I am tempted to just use there final value but I would
|
28
|
+
# be concerned with the likes of numbers for example the number 2.
|
29
|
+
#
|
30
|
+
# What about if I consider them as literal values. Then their history can be
|
31
|
+
# expressed.
|
32
|
+
#
|
33
|
+
# 'test' -> 'test'.chop -> 'tes'.chop -> 'te'.chop -> 't'
|
34
|
+
#
|
35
|
+
class History < Array
|
36
|
+
|
37
|
+
def initialize(*paramaters)
|
38
|
+
super()
|
39
|
+
self.each do |x|
|
40
|
+
self.push(x)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Create a copy of the history instance.
|
45
|
+
#
|
46
|
+
def copy
|
47
|
+
return History.new(*self.collect {|x| x.copy} )
|
48
|
+
end
|
49
|
+
|
50
|
+
def cauldron_method_calls
|
51
|
+
result = ['.length','.any?']
|
52
|
+
return result
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns an array of steps that include the variable
|
56
|
+
# specified.
|
57
|
+
#
|
58
|
+
# @param id The id of the variable that should be included in all the
|
59
|
+
# returned steps.
|
60
|
+
#
|
61
|
+
def find_steps_with_variable(id)
|
62
|
+
results = []
|
63
|
+
self.each do |x|
|
64
|
+
results.push(x) if x['variables'].any? {|y| y['id'] == id}
|
65
|
+
end
|
66
|
+
return results
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns the values for the unique variable id specified. NOTE
|
70
|
+
# it is important to use the unique variable id to avoid any
|
71
|
+
# mistaken interpretation.
|
72
|
+
#
|
73
|
+
# TODO This should be using unique_variable id to avoid the risk of
|
74
|
+
# miss interpretation
|
75
|
+
#
|
76
|
+
def find_value_for(variable_id)
|
77
|
+
results = []
|
78
|
+
|
79
|
+
# Find all the values for the particular id
|
80
|
+
self.each do |x|
|
81
|
+
results += x['variables'].find_all {|y| y['id']==variable_id}
|
82
|
+
end
|
83
|
+
return results.first['value']
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns a realised variable reflecting the id supplied. It
|
88
|
+
# can be either a VariableContainer, TypedVariable and BlockVariable.
|
89
|
+
#
|
90
|
+
# TODO I still havn't properly worked how to distinguish between types of variables
|
91
|
+
#
|
92
|
+
# @param variable_id The variable id that should be realised and returned
|
93
|
+
# @param variable_type A string indicating the type of variable that is being
|
94
|
+
# realised. This is basically used to distinguish between
|
95
|
+
# block variables and variable containers. NOTE if the variable
|
96
|
+
# doesn't have multiple values it won't be VariableContainer - just
|
97
|
+
# a type variable.
|
98
|
+
#
|
99
|
+
def find_realised_variable(variable_id,uniq_id,variable_type='VariableContainer')
|
100
|
+
|
101
|
+
raise StandardError.new('Expecting Fixnum') unless uniq_id.kind_of?(Fixnum)
|
102
|
+
|
103
|
+
# Find all the values for the particular id
|
104
|
+
# TODO Because there is a step class I could use more custom methods
|
105
|
+
results = self.inject([]) do |total,x|
|
106
|
+
total += x['variables'].select {|y| y['uniq_id'] == uniq_id}
|
107
|
+
total
|
108
|
+
end
|
109
|
+
|
110
|
+
# If all values have the same absolute id return a type variable.
|
111
|
+
# (this means the value of the variable doesn't change through the method)
|
112
|
+
if results.all? {|x| x['abs_id']==results.first['abs_id']}
|
113
|
+
raise StandardError.new('Unable to find variable with id '+variable_id.to_s+' and uniq_id '+uniq_id.to_s) if results.empty?
|
114
|
+
|
115
|
+
# TODO I don't know how to handle the situation where I have a reference to
|
116
|
+
# a variable. So the value of var_570 points to the UnkownVariable. In
|
117
|
+
# which case we have a UnknownVariable - which is just getting
|
118
|
+
# a bit rediculous.
|
119
|
+
# #
|
120
|
+
# #
|
121
|
+
# def method_8
|
122
|
+
# var_12 = Statement.new(Unknown.new,Equal.new,8.to_declaration)
|
123
|
+
# var_570 = var_12.declared_variable
|
124
|
+
# end
|
125
|
+
# TODO This better track mulitple values - I should at least indicate them
|
126
|
+
return results.first['value'].to_var(variable_id,uniq_id)
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
raise StandardError.new('variable '+variable_id.to_s+' has multiple values but no variable_type was supplied') if variable_type.nil?
|
131
|
+
|
132
|
+
case variable_type
|
133
|
+
when 'BlockVariable'
|
134
|
+
|
135
|
+
# Find all the unique variable ids
|
136
|
+
unique_results = []
|
137
|
+
results.each do |x|
|
138
|
+
unique_results.push(x) unless unique_results.any? {|y| y[:abs_id] == x[:abs_id]}
|
139
|
+
end
|
140
|
+
|
141
|
+
# Convert each result into a variable and return a new block variable
|
142
|
+
new_block_variable = BlockVariable.new() {{:variable_id=>variable_id,:uniq_id=>uniq_id}}
|
143
|
+
unique_results.each do |x|
|
144
|
+
new_block_variable.push(x[:value].to_var(variable_id))
|
145
|
+
end
|
146
|
+
return new_block_variable
|
147
|
+
|
148
|
+
when 'VariableContainer'
|
149
|
+
|
150
|
+
# Find all the unique variable ids
|
151
|
+
unique_results = []
|
152
|
+
results.each do |x|
|
153
|
+
unique_results.push(x) unless unique_results.any? {|y| y[:abs_id] == x[:abs_id]}
|
154
|
+
end
|
155
|
+
|
156
|
+
# Convert each result into a variable and return a new block variable
|
157
|
+
# TODO This should probable include the uniq_id as well
|
158
|
+
new_container_variable = VariableContainer.new() {{:variable_id=>variable_id,:uniq_id=>uniq_id}}
|
159
|
+
unique_results.each do |x|
|
160
|
+
new_container_variable.push(x[:value].to_var(variable_id))
|
161
|
+
end
|
162
|
+
return new_container_variable
|
163
|
+
end
|
164
|
+
raise StandardError.new('Method not able to handle different type of variables')
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# This is a special runtime method that is used to track changes in a method
|
2
|
+
# as it is being run.
|
3
|
+
#
|
4
|
+
# The call to the tracking method looks something like this:
|
5
|
+
#
|
6
|
+
# tracking_method(line,action,variables=[])
|
7
|
+
#
|
8
|
+
class RuntimeTrackingMethod < RuntimeMethod
|
9
|
+
|
10
|
+
#
|
11
|
+
# @param instance_tracking_variable The instance variable that contains each tracked event.
|
12
|
+
#
|
13
|
+
def initialize(instance_tracking_variable)
|
14
|
+
@line = MethodParameter.new
|
15
|
+
@statement_id = MethodParameter.new
|
16
|
+
@variables = MethodParameter.new
|
17
|
+
@action = MethodParameter.new
|
18
|
+
super( MethodUsage.new(@line,@statement_id,@variables,@action) )
|
19
|
+
|
20
|
+
# Add the statements that are used in the tracking method
|
21
|
+
self.push HackStatement.new(instance_tracking_variable.write+' = History.new if '+instance_tracking_variable.write+'.nil?')
|
22
|
+
x = instance_tracking_variable.write+".push(Step.new(
|
23
|
+
#{@line.write},
|
24
|
+
#{@statement_id.write},
|
25
|
+
#{@variables.write},
|
26
|
+
#{@action.write}
|
27
|
+
))"
|
28
|
+
self.push HackStatement.new(x)
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# This class represents one of the steps inside a history object. It will look something
|
2
|
+
# like the following:
|
3
|
+
#
|
4
|
+
# {
|
5
|
+
# "variables"=>[
|
6
|
+
# {"id"=>3, "value"=>"Grim Fandang", "abs_id"=>-606538658, :uniq_id=>3},
|
7
|
+
# {"id"=>1, "value"=>"Grim Fandango", "abs_id"=>-606538498, :uniq_id=>2}
|
8
|
+
# ],
|
9
|
+
# "line"=>1,
|
10
|
+
# "statement_id"=>625,
|
11
|
+
# "action"=>"var='Grim Fandango'.chop"}
|
12
|
+
#
|
13
|
+
class Step < Hash
|
14
|
+
|
15
|
+
#
|
16
|
+
# @param variables TODO I'm not sure whether this should be the variables that have changed or just
|
17
|
+
# the ones available on this line. I think it is only the variables that change value.
|
18
|
+
#
|
19
|
+
def initialize(line,statement_id,variables,action)
|
20
|
+
super()
|
21
|
+
self['variables'] = variables
|
22
|
+
self['line'] = line
|
23
|
+
self['statement_id'] = statement_id
|
24
|
+
# TODO action can proably be dropped - or just replaced with statement.write - I don't
|
25
|
+
# think to_literal_string is useful.
|
26
|
+
self['action'] = action
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the data for the variable thats id was specified.
|
30
|
+
#
|
31
|
+
# @param id The id of the variable thats id should be returned
|
32
|
+
#
|
33
|
+
def find_data_for_variable(id)
|
34
|
+
missing_variable = lambda { raise StandardError.new('Couldn\'t find information on variable '+id.to_s) }
|
35
|
+
return self['variables'].detect(missing_variable) {|x| x['id']==id}
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_var(id=nil,uniq_id=nil)
|
39
|
+
# TODO I don't know if the the block is used anymore
|
40
|
+
return StepVariable.new(self,id) {{:variable_id => id,:uniq_id=>uniq_id}}
|
41
|
+
end
|
42
|
+
|
43
|
+
def copy
|
44
|
+
# TODO Don't use Marshal - do it properly
|
45
|
+
return Marshal.load(Marshal.dump(self))
|
46
|
+
end
|
47
|
+
|
48
|
+
def cauldron_method_calls
|
49
|
+
return ["['statement_id']"]
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
|
2
|
+
class ArrayVariable < TypeVariable
|
3
|
+
attr_reader :variable_id
|
4
|
+
|
5
|
+
# TODO Presumes that all parameters extends TypeVariable some are literals
|
6
|
+
def initialize(*parameters)
|
7
|
+
super(parameters)
|
8
|
+
parameters.each { |x| self.push(x) }
|
9
|
+
end
|
10
|
+
|
11
|
+
# TODO Temporary overwrite - I'm not sure how to apply select_all for array variables.
|
12
|
+
# When you write the variable it's var5 but it still contains addition variables.
|
13
|
+
def select_all(results=[],&block)
|
14
|
+
#results.push(self) if block.call(self)
|
15
|
+
return results
|
16
|
+
end
|
17
|
+
|
18
|
+
#TODO Write tests for all variables to maintain uniq_id_history
|
19
|
+
def copy
|
20
|
+
result = ArrayVariable.new(*self.collect {|x| x.copy} ) {{:variable_id => self.variable_id,:uniq_id=>@uniq_id,:uniq_id_history=>@uniq_id_history.copy}}
|
21
|
+
#result.variable_id = variable_id
|
22
|
+
result.instance_variable = @instance_variable
|
23
|
+
# TODO I need to check uniq_id for 'copy' accross all the variables
|
24
|
+
#result.uniq_id = @uniq_id
|
25
|
+
return result
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_declaration
|
29
|
+
return VariableDeclaration.new('ArrayVariable',*@value.collect {|x| x.to_declaration})
|
30
|
+
end
|
31
|
+
|
32
|
+
# Only let this method be called from fellow Fixnum classes or Unknowns
|
33
|
+
def variable_id=(id)
|
34
|
+
# TODO This would be nicer if it wasn't so hard coded ./lib/core/variable/Unknown.rb
|
35
|
+
unless caller.first.split(':')[0]==__FILE__ or caller.first.split(':')[0]=='./lib/core/variable/Unknown.rb'
|
36
|
+
unless caller.first.split(':')[0]==__FILE__ or caller.first.split(':')[0]=='./lib/ruby_code/Array.rb'
|
37
|
+
raise StandardError.new('Illegal attempt to set variable_id')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
@variable_id = id
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns an array of instance calls for the particular type
|
44
|
+
# variable. For example:
|
45
|
+
#
|
46
|
+
# StringVariable.new('test').instance_calls
|
47
|
+
#
|
48
|
+
# might return [var.chop,var.length]
|
49
|
+
#
|
50
|
+
def instance_calls(available=[])
|
51
|
+
|
52
|
+
# Add the chop instance call
|
53
|
+
results = []
|
54
|
+
results.push InstanceCallContainer.new(self.copy,ArrayLength.new)
|
55
|
+
|
56
|
+
# Attempt to create access calls - firstly with index
|
57
|
+
self.length.times do |i|
|
58
|
+
results.push ArrayAccess.new(self.copy,Literal.new(i))
|
59
|
+
end
|
60
|
+
|
61
|
+
return results
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_literal_string
|
66
|
+
l = '['
|
67
|
+
self.each do |x|
|
68
|
+
l += x.to_literal_string
|
69
|
+
unless x.object_id == self.last.object_id
|
70
|
+
l += ','
|
71
|
+
end
|
72
|
+
end
|
73
|
+
l += ']'
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|