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,154 @@
|
|
1
|
+
#require "set"
|
2
|
+
# This was introduced so I could maintain the use of the class variable
|
3
|
+
# @@variable_id with the ArrayVarialble without having to include
|
4
|
+
# requirements with the array.
|
5
|
+
#
|
6
|
+
class BaseVariable < Array
|
7
|
+
attr_reader :variable_id , :instance_variable, :value, :uniq_id_history
|
8
|
+
attr_writer :instance_variable, :uniq_id_history
|
9
|
+
|
10
|
+
include Variable
|
11
|
+
include Token
|
12
|
+
# TODO VariableIncluded is in Variable so i can probably get rid of the VariableIncluded
|
13
|
+
#include VariableIncluded
|
14
|
+
|
15
|
+
# TODO I think I'll get rid of the id parameter and just use blocks
|
16
|
+
#
|
17
|
+
# NOTE: You can set the variable ids by passing it in a block
|
18
|
+
# e.g. BaseVariable.new {[8,9]}
|
19
|
+
# where 8 is the variable_id and unique_id is 9
|
20
|
+
#
|
21
|
+
def initialize(id=nil)
|
22
|
+
super()
|
23
|
+
|
24
|
+
# TODO I should maybe include a check on all .copy methods to ensure a block is provided
|
25
|
+
# Set the variable id for the newly created variable
|
26
|
+
if block_given?
|
27
|
+
# TEMP
|
28
|
+
if yield.kind_of?(Fixnum)
|
29
|
+
raise StandardError.new('Expecting array')
|
30
|
+
end
|
31
|
+
unless yield[:variable_id].nil?
|
32
|
+
@variable_id = yield[:variable_id]
|
33
|
+
else
|
34
|
+
@variable_id = @@variable_id
|
35
|
+
@@variable_id += 1
|
36
|
+
# TODO Should have a separate call that returns @@variable_id and increaments @@variable_id
|
37
|
+
end
|
38
|
+
unless yield[:uniq_id].nil?
|
39
|
+
raise StandardError.new('Expecting Fixnum') unless yield[:uniq_id].kind_of?(Fixnum)
|
40
|
+
@uniq_id = yield[:uniq_id]
|
41
|
+
else
|
42
|
+
@uniq_id = @@uniq_id
|
43
|
+
@@uniq_id += 1
|
44
|
+
end
|
45
|
+
|
46
|
+
@uniq_id_history = yield[:uniq_id_history] unless yield[:uniq_id_history].nil?
|
47
|
+
|
48
|
+
else
|
49
|
+
if id.nil?
|
50
|
+
@variable_id = @@variable_id
|
51
|
+
@@variable_id += 1
|
52
|
+
else
|
53
|
+
@variable_id = id
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
# Give the variable an unique id
|
59
|
+
if @uniq_id.nil?
|
60
|
+
@uniq_id = @@uniq_id
|
61
|
+
#raise StandardError.new('Uniq id change point') if (@uniq_id+1) == 86
|
62
|
+
@@uniq_id += 1
|
63
|
+
end
|
64
|
+
|
65
|
+
@uniq_id_history ||= []
|
66
|
+
|
67
|
+
# Flag indicating if this is a scope variable or a instance variable
|
68
|
+
@instance_variable = false
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.reset_global_id
|
73
|
+
#http://www.zenspider.com/Languages/Ruby/QuickRef.html
|
74
|
+
unless $".include?('test/unit.rb')
|
75
|
+
StandardLogger.log 'WARNING: Resetting variable id, this should only be done for tests'
|
76
|
+
end
|
77
|
+
@@variable_id = 0
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returns the variable if the ids matched
|
81
|
+
#
|
82
|
+
# @param id The uniq_id of the variable that is being looked for
|
83
|
+
#
|
84
|
+
def find_actual_variable(uniq_id)
|
85
|
+
return self if @uniq_id == uniq_id
|
86
|
+
throw :variable_not_found
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns an array of instance calls that can be created from
|
90
|
+
# this variable.
|
91
|
+
#
|
92
|
+
# NOTE: I checked that instance_calls wasn't a intrinsic method.
|
93
|
+
#
|
94
|
+
# TODO Test this (esp with ArrayVariable)
|
95
|
+
#
|
96
|
+
def instance_calls(with=[])
|
97
|
+
return [] unless self.realised?
|
98
|
+
|
99
|
+
# Attempt to retrieve the literal value for the variable
|
100
|
+
#val = self.literalise.value
|
101
|
+
val = self.value
|
102
|
+
|
103
|
+
# TODO I suspect this method is redundant since it is always overwritten
|
104
|
+
|
105
|
+
# Now retrieve all the possible instance call structures for that value
|
106
|
+
results = []
|
107
|
+
val.instance_call_structures.each do |struct|
|
108
|
+
|
109
|
+
if struct.instance_class != self.class then raise StandardError.new('Unexpected class type: - expecting '+val.class.to_s+' but was '+struct.instance_class.to_s) end
|
110
|
+
|
111
|
+
# Now create a method call of the instance call
|
112
|
+
inst_call = InstanceCallContainer.new(self.copy,struct.method_call.copy)
|
113
|
+
results.push inst_call
|
114
|
+
|
115
|
+
end
|
116
|
+
return results
|
117
|
+
end
|
118
|
+
|
119
|
+
# Returns an array of instances calls that return a value and are
|
120
|
+
# therefore approriate for declaration statements.
|
121
|
+
#
|
122
|
+
def returning_instance_calls(available=[])
|
123
|
+
return instance_calls(available)
|
124
|
+
end
|
125
|
+
|
126
|
+
def destructive_instance_calls(with=[])
|
127
|
+
raise StandardError.new(" 'destructive_instance_calls' method should be overridden for "+self.class.to_s)
|
128
|
+
end
|
129
|
+
|
130
|
+
#
|
131
|
+
#
|
132
|
+
#
|
133
|
+
def write()
|
134
|
+
if (@instance_variable)
|
135
|
+
return '@var_'+variable_id.to_s
|
136
|
+
end
|
137
|
+
return 'var_'+variable_id.to_s
|
138
|
+
end
|
139
|
+
|
140
|
+
def write_with_uniq_id
|
141
|
+
if (@instance_variable)
|
142
|
+
return '@var_'+variable_id.to_s+'_u'+uniq_id.to_s
|
143
|
+
end
|
144
|
+
return 'var_'+variable_id.to_s+'_u'+uniq_id.to_s
|
145
|
+
end
|
146
|
+
|
147
|
+
# Always returns true since realised variables should extend this class
|
148
|
+
# but overwrite this method.
|
149
|
+
#
|
150
|
+
def realised?
|
151
|
+
return false
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# This is an odd sort of variable because it's actual value
|
2
|
+
# continually changes when used. It needs to have a variable
|
3
|
+
# id to prevent a duplicate variable being created.
|
4
|
+
#
|
5
|
+
class BlockVariable < BaseVariable
|
6
|
+
|
7
|
+
attr_writer :realised
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super()
|
11
|
+
|
12
|
+
@realised = false
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns a duplicate of the block variable.
|
16
|
+
#
|
17
|
+
def copy
|
18
|
+
# @uniq_id should probably be cloned or something
|
19
|
+
result = self.class.new() {{:variable_id => self.variable_id,:uniq_id=>@uniq_id, :uniq_id_history=>@uniq_id_history.copy}}
|
20
|
+
result.instance_variable = @instance_variable
|
21
|
+
self.each do |x|
|
22
|
+
result.push(x)
|
23
|
+
end
|
24
|
+
result.realised = @realised
|
25
|
+
return result
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns a string representing the block variable but with all the
|
29
|
+
# values of the block variable as well
|
30
|
+
def write_with_value
|
31
|
+
#return self.write+'('+self.inject {|line,x| line += x.value.write+} +')'
|
32
|
+
l = self.write+'('
|
33
|
+
self.each do |x|
|
34
|
+
l += x.value.write
|
35
|
+
l += '|' unless x.object_id == self.last.object_id
|
36
|
+
end
|
37
|
+
l += ')'
|
38
|
+
return l
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns the flag indicating whether the blockvariable had been
|
42
|
+
# realised yet. I can't just use whether all the contained variables
|
43
|
+
# are realised as an indication because the block variable may be
|
44
|
+
# empty. This would indicate either the block itself has no
|
45
|
+
# itterations or it hadn't been realised yet.
|
46
|
+
#
|
47
|
+
def realised?
|
48
|
+
return @realised
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns a duplicate block variable where all values for the block
|
52
|
+
# variable are included.
|
53
|
+
#
|
54
|
+
def realise(method_map)
|
55
|
+
x = method_map.find_realised_variable(self.variable_id,self.uniq_id,self.class.to_s)
|
56
|
+
# Flag the block variable as realised - this needs to be done maually oterwise empty
|
57
|
+
# blocks would flaged as realsied.
|
58
|
+
x.realised = true
|
59
|
+
|
60
|
+
return x
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns true if the block variable can be used as the specified variable
|
64
|
+
# type otherwise it returns false. It can be used as the specified variable
|
65
|
+
# type if all the variables it contains are of that type.
|
66
|
+
#
|
67
|
+
# @param variable_type The variable type that the block variable is expected
|
68
|
+
# to act like e.g. FixnumVariable.
|
69
|
+
#
|
70
|
+
def pass_as?(variable_type)
|
71
|
+
return self.all? {|x| x.pass_as?(variable_type)}
|
72
|
+
end
|
73
|
+
|
74
|
+
# This simple returns the block variable. It is a quick hack so that
|
75
|
+
# InstanceCallContainers and variables can be treated in the same way although
|
76
|
+
# it is a bit clunck and confusing.
|
77
|
+
#
|
78
|
+
def variable
|
79
|
+
return self
|
80
|
+
end
|
81
|
+
|
82
|
+
# This writes block variable as a literal. Now for normal variables this is
|
83
|
+
# fine as var_a might become '8' etc. However block variables have multiple
|
84
|
+
# values. I'm not sure why this is need so for now it will just display
|
85
|
+
# the first block variable.
|
86
|
+
#
|
87
|
+
def to_literal_string
|
88
|
+
if empty? then return '' end
|
89
|
+
return self.first.to_literal_string
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class FixnumVariable < TypeVariable
|
2
|
+
|
3
|
+
def initialize(val,id=nil)
|
4
|
+
super(val,id)
|
5
|
+
end
|
6
|
+
|
7
|
+
# TODO Write test
|
8
|
+
def to_declaration
|
9
|
+
return VariableDeclaration.new('FixnumVariable',@value.to_declaration)
|
10
|
+
end
|
11
|
+
|
12
|
+
# TODO I wan't to get rid of this call entirly
|
13
|
+
def copy_contextual_variable
|
14
|
+
return copy
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns true if the variable type is Fixnum, this is used
|
18
|
+
# to determine whether a BlockVariable or VariableContainer
|
19
|
+
# can be used as a particular variable type.
|
20
|
+
#
|
21
|
+
def pass_as?(variable_type)
|
22
|
+
return true if variable_type==FixnumVariable
|
23
|
+
return false
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns an array of desctructive instance calls given the available
|
27
|
+
# variables.
|
28
|
+
#
|
29
|
+
# @param available An array of other variables that can be used as
|
30
|
+
# parameters.
|
31
|
+
#
|
32
|
+
def destructive_instance_calls(available=[])
|
33
|
+
return []
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
class MethodParameter < BaseVariable
|
2
|
+
attr_reader :usage_variable
|
3
|
+
|
4
|
+
# TODO I'm trying to move away from requirements
|
5
|
+
#
|
6
|
+
# @param *requirements Any number of requirements that describe the
|
7
|
+
# the properties of the method variable.
|
8
|
+
# For example self == 6
|
9
|
+
def initialize(*requirements)
|
10
|
+
super(nil)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns true if this variables meets the requirements of the
|
14
|
+
# supplied variable. If the this meets the requirements of the
|
15
|
+
# supplied variable then this variable could replace the
|
16
|
+
# supplied variable in a statement.
|
17
|
+
#
|
18
|
+
# TODO Write tests for this
|
19
|
+
#
|
20
|
+
# @param of
|
21
|
+
#
|
22
|
+
# TODO Have an act_as call that doesn't return true/false but raises errors so I can identify
|
23
|
+
# why something can't be something else.
|
24
|
+
#
|
25
|
+
def meets_requirements? of
|
26
|
+
|
27
|
+
# Handle the possible datatypes of "of"
|
28
|
+
begin
|
29
|
+
if of.kind_of?(Variable)
|
30
|
+
return meets_requirements_of_variable(of)
|
31
|
+
elsif of.kind_of?(InstanceCallContainer)
|
32
|
+
return meets_requirements_of_instance_call(of)
|
33
|
+
else
|
34
|
+
raise StandardError.new('Not expecting class of type '+of.class.to_s)
|
35
|
+
end
|
36
|
+
rescue FailedVariableMatch
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Raises an error to avoid me accidently trying to give this class the
|
42
|
+
# method.
|
43
|
+
#
|
44
|
+
def to_literal_string
|
45
|
+
# TODO I should turn this on further down the line - it realtes to tracking
|
46
|
+
#raise StandardError.new('Method Variables can\'t be converted to a literal string because they don\'t have a value')
|
47
|
+
return self.write
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
def describe(tab=0,context=self)
|
52
|
+
|
53
|
+
# Create a temporay copy of the variable
|
54
|
+
copied_var = self.copy
|
55
|
+
|
56
|
+
unless context == self
|
57
|
+
|
58
|
+
# Return a duplicate variable with the requirements in the context indicated
|
59
|
+
copied_var = context.contextual_variable(copied_var.variable_id)
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
# Print the name of the variable
|
64
|
+
line = ''
|
65
|
+
line += write
|
66
|
+
|
67
|
+
# Print out each of the requirements
|
68
|
+
copied_var.each do |x|
|
69
|
+
|
70
|
+
#tmp = gets
|
71
|
+
desc = x.describe(context)
|
72
|
+
|
73
|
+
#tmp = gets
|
74
|
+
desc.each_line do |l|
|
75
|
+
line += "\t"+l
|
76
|
+
end
|
77
|
+
line += "\n" unless x == copied_var.last
|
78
|
+
end
|
79
|
+
line += "\n"
|
80
|
+
|
81
|
+
return line
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
def copy
|
86
|
+
result = self.class.new(*self) {{:variable_id => self.variable_id,:uniq_id=>@uniq_id, :uniq_id_history=>@uniq_id_history.copy}}
|
87
|
+
result.instance_variable = @instance_variable
|
88
|
+
return result
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns a reference to the usage variable that is represented
|
92
|
+
# by this variable. Remember this MethodParameter represents
|
93
|
+
# a particular rule so its id doesn't reflect all cases.
|
94
|
+
#
|
95
|
+
def usage_variable
|
96
|
+
return @usage_variable
|
97
|
+
end
|
98
|
+
|
99
|
+
# Set the usage variable that this method variable should be used
|
100
|
+
# as. This is set when a method variable is added to a method.
|
101
|
+
#
|
102
|
+
def usage_variable= usage
|
103
|
+
@usage_variable = usage
|
104
|
+
end
|
105
|
+
|
106
|
+
# Attempts to return a literal that meets
|
107
|
+
# all the requirements.
|
108
|
+
#
|
109
|
+
def literalise
|
110
|
+
|
111
|
+
# Does the variable have any "equal to literal" requirements
|
112
|
+
self.each do |req|
|
113
|
+
if req.structure_match?([This,Equal,Literal])
|
114
|
+
return req[2].copy
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
raise StandardError.new('The literalise call is very basic right now and needs improved')
|
119
|
+
end
|
120
|
+
|
121
|
+
# Returns a statement showing the variable being declaraced
|
122
|
+
#
|
123
|
+
# MethodParameter.new(Requirement.new())
|
124
|
+
#
|
125
|
+
def declaration_statement
|
126
|
+
# TODO Check that .copy method call works across all the uses of "declaration_statement"
|
127
|
+
return Statement.new(ClassMethodCallContainer.new(MethodParameterClass.new,New.new,*self.collect {|x| x.copy.declaration_statement}))
|
128
|
+
end
|
129
|
+
|
130
|
+
def to_declaration
|
131
|
+
return VariableDeclaration.new('MethodParameter',*self.collect {|x| x.to_declaration})
|
132
|
+
end
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
# TODO Write tests for this
|
137
|
+
def meets_requirements_of_variable(this)
|
138
|
+
|
139
|
+
# Check if var has any requirements - if it doesn't have any then anything can be it
|
140
|
+
return 'is' if this.empty?
|
141
|
+
|
142
|
+
begin
|
143
|
+
|
144
|
+
# Can this be literised? (it makes it easy to check requirements)
|
145
|
+
if self.literalisable?
|
146
|
+
|
147
|
+
# then change it into a literal value
|
148
|
+
literal = self.literalise
|
149
|
+
|
150
|
+
# Good stuff - next lets see if we can confirm the requirements of 'var'
|
151
|
+
begin
|
152
|
+
|
153
|
+
# Goes through all of var requirements and substitutes self for the literal
|
154
|
+
this_could_be_that(literal,this)
|
155
|
+
return true
|
156
|
+
rescue IncompatiableRequirementsError => e
|
157
|
+
StandardLogger.instance.info e
|
158
|
+
return false
|
159
|
+
end
|
160
|
+
|
161
|
+
else # If self can't be literalised
|
162
|
+
|
163
|
+
# Go through each of the supplied variables requirements
|
164
|
+
all_requirements_matched = true
|
165
|
+
this.each do |req|
|
166
|
+
requirement_matched = false
|
167
|
+
self.each do |own_req|
|
168
|
+
if own_req.write == req.write
|
169
|
+
requirement_matched = true
|
170
|
+
break
|
171
|
+
end
|
172
|
+
end
|
173
|
+
all_requirements_matched = false unless requirement_matched
|
174
|
+
end
|
175
|
+
|
176
|
+
return true if all_requirements_matched
|
177
|
+
return false
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
rescue StandardError => e
|
182
|
+
StandardLogger.log e
|
183
|
+
return false
|
184
|
+
end
|
185
|
+
return false
|
186
|
+
|
187
|
+
end
|
188
|
+
|
189
|
+
# TODO Write tests for this
|
190
|
+
def meets_requirements_of_instance_call(instance_call)
|
191
|
+
#unless instance_call.literalisable?
|
192
|
+
# raise StandardError.new('Unable to litralise instance call '+instance_call.write)
|
193
|
+
#end
|
194
|
+
|
195
|
+
# Attempt to litralise the variable
|
196
|
+
# TODO The variable class returns a Literal the InstanceCallContainer returns a
|
197
|
+
# value. They don't need to do different things.
|
198
|
+
if(self.literalisable?)
|
199
|
+
return self.literalise.value == instance_call.literalise
|
200
|
+
else
|
201
|
+
raise FailedVariableMatch.new('Unable to litralise variable to see if it meets requirements')
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|