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,23 @@
|
|
1
|
+
# This class is used to include code into a statement without having
|
2
|
+
# to create the correct classes etc.
|
3
|
+
#
|
4
|
+
# It is currently only used for method validation, where I want a quick
|
5
|
+
# check that a generated method is correct e.g.
|
6
|
+
#
|
7
|
+
# ' == "Test"'
|
8
|
+
#
|
9
|
+
class Raw
|
10
|
+
|
11
|
+
def initialize(value)
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def write()
|
16
|
+
return @value
|
17
|
+
end
|
18
|
+
|
19
|
+
def copy
|
20
|
+
return Raw.new(@value.copy)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# TODO Perhaps RuntimeMethodDeclaration might have worked better
|
2
|
+
#
|
3
|
+
class RuntimeMethodLiteral
|
4
|
+
|
5
|
+
def initialize(usage,return_variable)
|
6
|
+
raise StandardError.new('Where is this used')
|
7
|
+
@usage = usage
|
8
|
+
@return_variable = return_variable
|
9
|
+
end
|
10
|
+
|
11
|
+
def write
|
12
|
+
# TODO This shouldn't just make up values
|
13
|
+
return 'RuntimeMethod.new('+@usage.to_declaration.write+','+@return_variable.to_declaration.write+')'
|
14
|
+
end
|
15
|
+
|
16
|
+
# TODO This copy isn't accurate
|
17
|
+
def copy
|
18
|
+
return RuntimeMethodLiteral.new(@usage.copy, @return_variable.copy)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class StatementLiteral
|
2
|
+
|
3
|
+
# TODO I might not need the RuntimeMethodLiteral or StatementLiteral classes - I could just
|
4
|
+
# use the creation command.
|
5
|
+
|
6
|
+
#
|
7
|
+
#
|
8
|
+
def initialize(statement)
|
9
|
+
@statement = statement
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
#
|
14
|
+
def write
|
15
|
+
l = 'Statement.new('
|
16
|
+
@statement.each do |x|
|
17
|
+
l += x.creation
|
18
|
+
l += ',' unless x.object_id == @statement.last.object_id
|
19
|
+
end
|
20
|
+
l += ')'
|
21
|
+
return l
|
22
|
+
end
|
23
|
+
|
24
|
+
def copy
|
25
|
+
return StatementLiteral.new(@statement.copy)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class AvailableVariablesCall < InstanceCall
|
2
|
+
include WriteParameters
|
3
|
+
|
4
|
+
def initialize(*parameters)
|
5
|
+
super(*parameters)
|
6
|
+
|
7
|
+
# The requirements for the instance use this method call
|
8
|
+
@use_requirements = [Requirement.new(InstanceCallContainer.new(This.new,ClassCall.new), Equal.new , RuntimeMethodClass.new)]
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
def write
|
13
|
+
return '.available_variables'
|
14
|
+
end
|
15
|
+
|
16
|
+
# TODO Test this method works
|
17
|
+
def copy
|
18
|
+
return self.class.new(*self.collect {|x| x.copy})
|
19
|
+
end
|
20
|
+
|
21
|
+
def requirements
|
22
|
+
@use_requirements.each {|req| yield req}
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# TODO Change this to InstanceClassCall = remember it needs to be changed to InstanceClassCallClass
|
2
|
+
#
|
3
|
+
# TODO Move this to instance_call
|
4
|
+
#
|
5
|
+
# This represents the .class element of statements like
|
6
|
+
# e.g. var_a.class
|
7
|
+
#
|
8
|
+
class ClassCall <InstanceCall
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def write
|
15
|
+
return '.class'
|
16
|
+
end
|
17
|
+
|
18
|
+
def copy
|
19
|
+
return ClassCall.new
|
20
|
+
end
|
21
|
+
|
22
|
+
# The class call has no requirements since every object has
|
23
|
+
# this methods.
|
24
|
+
#
|
25
|
+
def requirements
|
26
|
+
return []
|
27
|
+
end
|
28
|
+
|
29
|
+
def declaration_statement
|
30
|
+
return ClassMethodCallContainer.new(ClassCallClass.new,New.new)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# This class represent calls to availble functions. This could be
|
2
|
+
# custom generated method calls e.g.
|
3
|
+
#
|
4
|
+
# m1
|
5
|
+
#
|
6
|
+
# if there was a method that looked like
|
7
|
+
#
|
8
|
+
# def m1
|
9
|
+
# # do something
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# it could also be core ruby calls
|
13
|
+
#
|
14
|
+
# TODO Write tests for this
|
15
|
+
#
|
16
|
+
class DefCall <InstanceCall
|
17
|
+
include WriteParameters
|
18
|
+
|
19
|
+
# TODO I'm still undecided on whether DefCall should have a scope id or not
|
20
|
+
attr_reader :runtime_method, :scope_id
|
21
|
+
attr_writer :scope_id
|
22
|
+
|
23
|
+
#
|
24
|
+
# TODO I suspect response isn't needed any more or at least should be the secound parameter
|
25
|
+
# @param response What is returned by the method -
|
26
|
+
#
|
27
|
+
def initialize(response,runtime_method,*parameters)
|
28
|
+
super(*parameters)
|
29
|
+
raise StandardError.new('Should be a runtime method instance') unless runtime_method.kind_of?(ActsAsRuntimeMethod)
|
30
|
+
@response = response.copy
|
31
|
+
@runtime_method = runtime_method.copy
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def write
|
36
|
+
l = @runtime_method.method_name
|
37
|
+
l += write_params(self)
|
38
|
+
return l
|
39
|
+
end
|
40
|
+
|
41
|
+
def describe
|
42
|
+
x = 'Call: '+write
|
43
|
+
return x
|
44
|
+
end
|
45
|
+
|
46
|
+
def copy
|
47
|
+
return DefCall.new(@response.copy,@runtime_method.copy,*self.collect {|x| x.copy})
|
48
|
+
end
|
49
|
+
|
50
|
+
def response
|
51
|
+
return @response.copy
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns true if the method call can pass as specified variable_type. This
|
55
|
+
# bascially depends on what the method call returns.
|
56
|
+
#
|
57
|
+
# @param variable_type The variable type the method call will be treated as. For
|
58
|
+
# example FixnumVariable.
|
59
|
+
#
|
60
|
+
def pass_as?(variable_type)
|
61
|
+
return @response.pass_as?(variable_type)
|
62
|
+
end
|
63
|
+
|
64
|
+
def equivalent?(to)
|
65
|
+
return false unless to.class == self.class
|
66
|
+
# TODO I should also include a method_interation value here - this should increment each time the
|
67
|
+
# the runtime method recieves a new statement because it essentially becomes a different method.
|
68
|
+
return true if @runtime_method.method_id == to.runtime_method.method_id
|
69
|
+
return false
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# NOTE: This class call shouldn't be made available during runtime method
|
2
|
+
# generation. - it would just get messy.
|
3
|
+
#
|
4
|
+
class EvaluateClassCall < InstanceCall
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def write
|
11
|
+
return '.evaluate_class'
|
12
|
+
end
|
13
|
+
|
14
|
+
def copy
|
15
|
+
return EvaluateClassCall.new
|
16
|
+
end
|
17
|
+
|
18
|
+
# The class call has no requirements since every object has
|
19
|
+
# this methods.
|
20
|
+
#
|
21
|
+
def requirements
|
22
|
+
return []
|
23
|
+
end
|
24
|
+
|
25
|
+
def declaration_statement
|
26
|
+
return ClassMethodCallContainer.new(EvaluateClassCall.new,New.new)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class MethodNameCall < InstanceCall
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
def write
|
9
|
+
return '.method_name'
|
10
|
+
end
|
11
|
+
|
12
|
+
def copy
|
13
|
+
return MethodNameCall.new
|
14
|
+
end
|
15
|
+
|
16
|
+
# The class call has no requirements since every object has
|
17
|
+
# this methods.
|
18
|
+
#
|
19
|
+
def requirements
|
20
|
+
return []
|
21
|
+
end
|
22
|
+
|
23
|
+
def declaration_statement
|
24
|
+
return ClassMethodCallContainer.new(MethodNameCall.new,New.new)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,291 @@
|
|
1
|
+
# A requirement is simply a statment that evaluates to true.
|
2
|
+
#
|
3
|
+
# For example this == 7
|
4
|
+
class Requirement < Array
|
5
|
+
include PrintVariables
|
6
|
+
|
7
|
+
attr_reader :parent
|
8
|
+
attr_writer :parent
|
9
|
+
|
10
|
+
alias :array_push :push
|
11
|
+
|
12
|
+
def initialize(*parameters)
|
13
|
+
super()
|
14
|
+
parameters.each do |param|
|
15
|
+
self.push param
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Compares another requirement to its self and to determine
|
20
|
+
# whether they are mutually exclusive.
|
21
|
+
#
|
22
|
+
# For example:
|
23
|
+
# self > 8 ~= requirement < 7
|
24
|
+
#
|
25
|
+
def mutually_exclusive?(requirement)
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
|
29
|
+
def describe(context=self)
|
30
|
+
|
31
|
+
line = ''
|
32
|
+
|
33
|
+
# Handle describing requirement
|
34
|
+
if context == self
|
35
|
+
self.each do |code|
|
36
|
+
line += code.write
|
37
|
+
end
|
38
|
+
line += "\n"
|
39
|
+
return line
|
40
|
+
end
|
41
|
+
|
42
|
+
# Handle the description for a higher context
|
43
|
+
after_equal_sign = false
|
44
|
+
self.each do |code|
|
45
|
+
next if code.kind_of? This
|
46
|
+
|
47
|
+
if code.kind_of? Equivalent
|
48
|
+
after_equal_sign = true
|
49
|
+
line += "\t"
|
50
|
+
end
|
51
|
+
|
52
|
+
# Handle instance calls (should be shown as .class = String
|
53
|
+
if code.kind_of? InstanceCallContainer
|
54
|
+
if after_equal_sign
|
55
|
+
line += code.write
|
56
|
+
else
|
57
|
+
line += '.'+code.method_call.write
|
58
|
+
end
|
59
|
+
else
|
60
|
+
line += code.write
|
61
|
+
end
|
62
|
+
|
63
|
+
line += ' ' unless code == self.last
|
64
|
+
end
|
65
|
+
return line
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns true if the requirement contains any other variables
|
70
|
+
# e.g. self.chop = 'test' returns false
|
71
|
+
# self.length = var4 returns true
|
72
|
+
#
|
73
|
+
def any_variables?
|
74
|
+
self.each do |code|
|
75
|
+
if code.kind_of? InstanceCallContainer
|
76
|
+
return true if code.subject.kind_of? Variable
|
77
|
+
end
|
78
|
+
return true if code.kind_of? Variable
|
79
|
+
end
|
80
|
+
return false
|
81
|
+
end
|
82
|
+
|
83
|
+
# Writes out the nature of the requirement.
|
84
|
+
#
|
85
|
+
# @param context The context in when the requirement is being written. This
|
86
|
+
# should be something that can print variables.
|
87
|
+
# @param variable The variable that represent 'self' in the requirement. Otherwise
|
88
|
+
# it defaults to 'self'
|
89
|
+
#
|
90
|
+
def write(context=self,variable=nil)
|
91
|
+
|
92
|
+
#variable = parent unless parent.nil?
|
93
|
+
|
94
|
+
line = ''
|
95
|
+
self.each do |x|
|
96
|
+
#if x.kind_of? This or x.kind_of? InstanceCallContainer
|
97
|
+
if x.kind_of? This or x.kind_of? InstanceCallContainer
|
98
|
+
line += x.write+' '
|
99
|
+
else
|
100
|
+
line += x.write+' '
|
101
|
+
end
|
102
|
+
end
|
103
|
+
return line
|
104
|
+
end
|
105
|
+
|
106
|
+
# Intended to be a more reliable clone. So will go deeper
|
107
|
+
# into the object.
|
108
|
+
#
|
109
|
+
def copy
|
110
|
+
copied_requirement = Requirement.new
|
111
|
+
self.each do |code|
|
112
|
+
copied_requirement.push code.copy
|
113
|
+
end
|
114
|
+
copied_requirement.parent = nil
|
115
|
+
return copied_requirement
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns true if the requirement contains a 'self'. I don't think
|
119
|
+
# it's possible or desirable not to so I'll probably end up dropping
|
120
|
+
# this method.
|
121
|
+
#
|
122
|
+
def contains_self?
|
123
|
+
self.each do |x|
|
124
|
+
if x.kind_of? This then return true end
|
125
|
+
|
126
|
+
# Check any instance calls for 'self'
|
127
|
+
if x.kind_of? InstanceCallContainer
|
128
|
+
return true
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
return false
|
133
|
+
end
|
134
|
+
|
135
|
+
# Changes the "self" value for a literal value to determine
|
136
|
+
# whether the literal value could be used in place. For
|
137
|
+
# example:
|
138
|
+
#
|
139
|
+
# self.chop = 8 -> subst self for 22 [WRONG]
|
140
|
+
# self.chop = 8 -> subst self for 'community' [CORRECT]
|
141
|
+
#
|
142
|
+
def subst_self_for literal
|
143
|
+
|
144
|
+
# Make a copy of the current requirement
|
145
|
+
copied_requirement = self.copy
|
146
|
+
copied_requirement.each_with_index do |x,i|
|
147
|
+
if x.kind_of? InstanceCallContainer
|
148
|
+
x.subst_self_for literal
|
149
|
+
end
|
150
|
+
if x.kind_of? This
|
151
|
+
copied_requirement[i] = literal
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
return copied_requirement
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
# Pretty much the same as each except that it includes
|
160
|
+
# instance calls as two elements e.g. the suject and
|
161
|
+
# the method call.
|
162
|
+
#
|
163
|
+
def each_bit
|
164
|
+
self.each do |g|
|
165
|
+
if g.kind_of? InstanceCallContainer
|
166
|
+
yield g.subject
|
167
|
+
yield g.method_call
|
168
|
+
next
|
169
|
+
end
|
170
|
+
yield g
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
# Checks whether the structure of the requirement
|
175
|
+
# matches that supplied.
|
176
|
+
#
|
177
|
+
# @param structure A structure is simply an array of
|
178
|
+
# classes e.g. [This,Equal,Literal]
|
179
|
+
#
|
180
|
+
def structure_match?(structure)
|
181
|
+
|
182
|
+
# Checks that they are at least the same length
|
183
|
+
if self.length != structure.length then return false end
|
184
|
+
|
185
|
+
structure.each_with_index do |x,i|
|
186
|
+
return false unless self[i].kind_of?(x)
|
187
|
+
end
|
188
|
+
return true
|
189
|
+
end
|
190
|
+
|
191
|
+
# Evaluates the code in the requirement to determine
|
192
|
+
# whether it generates a runtime error.
|
193
|
+
#
|
194
|
+
def evaluate
|
195
|
+
evaluation_code = ''
|
196
|
+
self.each do |x|
|
197
|
+
|
198
|
+
# Change the equal sign to equivalent for evaluation purposes
|
199
|
+
if x.kind_of? Equal
|
200
|
+
evaluation_code += ' == '
|
201
|
+
next
|
202
|
+
end
|
203
|
+
evaluation_code += x.write(self)
|
204
|
+
end
|
205
|
+
eval 'return '+evaluation_code
|
206
|
+
end
|
207
|
+
|
208
|
+
def valid?
|
209
|
+
begin
|
210
|
+
return evaluate
|
211
|
+
rescue NoMethodError => e
|
212
|
+
StandardLogger.log e
|
213
|
+
return false
|
214
|
+
rescue RuntimeError => e
|
215
|
+
StandardLogger.log e
|
216
|
+
return false
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
# Evaluates the literal by replacing 'self' with the
|
221
|
+
# literal value provided.
|
222
|
+
#
|
223
|
+
def use?(literal)
|
224
|
+
|
225
|
+
new_requirement = subst_self_for literal
|
226
|
+
|
227
|
+
# Change any equal(=) to equivalent(==)
|
228
|
+
new_requirement_string = 'if '
|
229
|
+
new_requirement.each do |code|
|
230
|
+
|
231
|
+
if code.kind_of? Equal
|
232
|
+
new_requirement_string += ' == '
|
233
|
+
next
|
234
|
+
end
|
235
|
+
|
236
|
+
new_requirement_string += code.write
|
237
|
+
end
|
238
|
+
|
239
|
+
new_requirement_string += ' then return true end'+"\n"+'return false'
|
240
|
+
|
241
|
+
# See if the evaluated requirement breaks anything
|
242
|
+
begin
|
243
|
+
eval new_requirement_string
|
244
|
+
rescue StandardError => e
|
245
|
+
StandardLogger.log e
|
246
|
+
return false
|
247
|
+
end
|
248
|
+
return true
|
249
|
+
|
250
|
+
end
|
251
|
+
|
252
|
+
# Returns a string of the requirement but also includes the variable
|
253
|
+
# id for any variables.
|
254
|
+
#
|
255
|
+
def write_with_variable_id(tab=0,context=self)
|
256
|
+
line = ''
|
257
|
+
tab.times {line += "\t" }
|
258
|
+
self.each do |x|
|
259
|
+
if x.kind_of? Variable
|
260
|
+
line += x.write(self)+'('+x.variable_id.to_s+') '
|
261
|
+
next
|
262
|
+
end
|
263
|
+
if x.kind_of? InstanceCallContainer
|
264
|
+
line += x.write(self)+'('+x.subject.variable_id.to_s+')'
|
265
|
+
next
|
266
|
+
end
|
267
|
+
line += x.write(self)
|
268
|
+
end
|
269
|
+
return line
|
270
|
+
end
|
271
|
+
|
272
|
+
# Returns a statement containing a MethodClass instance
|
273
|
+
# which is basicall Requirement.new(This.new,Equal.new,Something else)
|
274
|
+
#
|
275
|
+
def declaration_statement
|
276
|
+
|
277
|
+
# Create the class method call
|
278
|
+
instance_declaraction = ClassMethodCallContainer.new(RequirementClass.new,New.new,*self.collect{|x|x.copy.declaration_statement})
|
279
|
+
|
280
|
+
s = Statement.new(instance_declaraction)
|
281
|
+
return s
|
282
|
+
|
283
|
+
end
|
284
|
+
|
285
|
+
protected
|
286
|
+
|
287
|
+
def push(val)
|
288
|
+
array_push(val)
|
289
|
+
end
|
290
|
+
|
291
|
+
end
|