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,68 @@
|
|
1
|
+
# Used to make calls to a dynamically written class.
|
2
|
+
#
|
3
|
+
class ClassEvaluation
|
4
|
+
#include WriteParameters
|
5
|
+
@@count = 0
|
6
|
+
|
7
|
+
# TODO What is original_method about - can I get rid of it. I need to
|
8
|
+
# pass through parameters.
|
9
|
+
#
|
10
|
+
def evaluate_class(runtime_class,runtime_call,original_method=nil)
|
11
|
+
|
12
|
+
# Create file to include the test method
|
13
|
+
#filepath = $LOC+File.join(['tmp','runtime_class_evaluation.rb'])
|
14
|
+
filepath = $LOC+File.join(['tmp',runtime_class.class_name+'.rb'])
|
15
|
+
file = File.open(filepath,'w+')
|
16
|
+
@@count += 1
|
17
|
+
|
18
|
+
# Include the sytax for the statement in the file
|
19
|
+
file << runtime_class.write
|
20
|
+
file.close
|
21
|
+
|
22
|
+
# Load the newly created class and check the statement
|
23
|
+
load filepath
|
24
|
+
begin
|
25
|
+
return eval("#{runtime_class.class_name}.new.#{runtime_call}")
|
26
|
+
rescue NameError => e
|
27
|
+
StandardLogger.instance.error(original_method.write()) unless original_method.nil?
|
28
|
+
StandardLogger.instance.info(runtime_class.write)
|
29
|
+
raise e
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
# TODO This duplicates allot of the code above
|
35
|
+
def evaluate_class_2(runtime_class,runtime_call,*params)
|
36
|
+
|
37
|
+
# Create file to include the test method
|
38
|
+
#filepath = $LOC+File.join(['tmp','runtime_class_evaluation.rb'])
|
39
|
+
filepath = $LOC+File.join(['tmp',runtime_class.class_name+'.rb'])
|
40
|
+
file = File.open(filepath,'w+')
|
41
|
+
@@count += 1
|
42
|
+
|
43
|
+
# Include the sytax for the statement in the file
|
44
|
+
file << runtime_class.write
|
45
|
+
file.close
|
46
|
+
|
47
|
+
# Load the newly created class and check the statement
|
48
|
+
load filepath
|
49
|
+
begin
|
50
|
+
# TODO Make this more generic
|
51
|
+
case params.length
|
52
|
+
when 0
|
53
|
+
return eval("#{runtime_class.class_name}.new.#{runtime_call}")
|
54
|
+
when 1
|
55
|
+
return eval("#{runtime_class.class_name}.new.#{runtime_call}(params[0])")
|
56
|
+
else
|
57
|
+
raise StandardError.new('Can only handle one parameter right now')
|
58
|
+
end
|
59
|
+
rescue NameError => e
|
60
|
+
StandardLogger.instance.error(original_method.write()) unless original_method.nil?
|
61
|
+
StandardLogger.instance.info(runtime_class.write)
|
62
|
+
raise e
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class CodeEvaluation
|
2
|
+
|
3
|
+
# TODO I should cap the number of CodeEvaluation classes that can be created
|
4
|
+
@@COUNT = 0
|
5
|
+
|
6
|
+
# Generates a class and dumps the passed in code into the
|
7
|
+
# a runtime method within the class and then runs it.
|
8
|
+
#
|
9
|
+
# @param code Ruby code as a string
|
10
|
+
#
|
11
|
+
def evaluate_code(code)
|
12
|
+
@@COUNT += 1
|
13
|
+
|
14
|
+
# Create file to include the test method
|
15
|
+
filepath = $LOC+File.join(['tmp',"runtime_code_evaluation_#{@@COUNT}.rb"])
|
16
|
+
file = File.open(filepath,'w+')
|
17
|
+
|
18
|
+
# Include the sytax for the statement in the file
|
19
|
+
file << "class RuntimeCodeEvaluation#{@@COUNT}"+"\n"
|
20
|
+
file << "\t"+'def check'+"\n"
|
21
|
+
code.each_line do |l|
|
22
|
+
file << "\t\t"+l+"\n"
|
23
|
+
end
|
24
|
+
file << "\t"+'end'+"\n"
|
25
|
+
file << 'end'
|
26
|
+
file.close
|
27
|
+
|
28
|
+
# Load the newly created class and check the statement
|
29
|
+
load filepath
|
30
|
+
|
31
|
+
return eval("RuntimeCodeEvaluation#{@@COUNT}.new.check")
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class DeclarationStatementEvaluation
|
2
|
+
|
3
|
+
# NOTE It might improve performance if this was a singleton
|
4
|
+
def evaluate(written_statement,runtime_methods=[])
|
5
|
+
|
6
|
+
# Create file to include the test method
|
7
|
+
filepath = $LOC+File.join(['tmp','runtime_declaration_statement_evaluation.rb'])
|
8
|
+
file = File.open(filepath,'w+')
|
9
|
+
|
10
|
+
# Include the sytax for the statement in the file
|
11
|
+
file << 'class RuntimeDeclarationStatementEvaluation'+"\n"
|
12
|
+
file << "\t"+'def check'+"\n"
|
13
|
+
file << written_statement
|
14
|
+
file << "\t"+'end'+"\n"
|
15
|
+
|
16
|
+
# Add and associated runtime methods
|
17
|
+
runtime_methods.each do |x|
|
18
|
+
file << x.write
|
19
|
+
end
|
20
|
+
|
21
|
+
file << 'end'
|
22
|
+
file.close
|
23
|
+
|
24
|
+
# Load the newly created class and check the statement
|
25
|
+
load filepath
|
26
|
+
return RuntimeDeclarationStatementEvaluation.new.check
|
27
|
+
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# This class is used to evaluate runtime variables.
|
2
|
+
|
3
|
+
class MethodEvaluation
|
4
|
+
@@COUNTER = 0
|
5
|
+
|
6
|
+
def evaluate_method(runtime_method,params,additional_methods=[])
|
7
|
+
|
8
|
+
# Create file to include the runtime method
|
9
|
+
filepath = $LOC+File.join(['tmp','runtime_method_evaluation.rb'])
|
10
|
+
#filepath = $LOC+File.join(['tmp','runtime_method_evaluation_'+@@COUNTER.to_s+'.rb'])
|
11
|
+
file = File.open(filepath,'w+')
|
12
|
+
|
13
|
+
# A new class name is created otherwise previously declared method names are peristent.
|
14
|
+
# e.g. if a "RuntimeMethodEvaluation" was created with the method_a it would still
|
15
|
+
# be available even if the class was overridden.
|
16
|
+
class_name = 'RuntimeMethodEvaluation'+@@COUNTER.to_s
|
17
|
+
@@COUNTER += 1
|
18
|
+
# TODO I shouldn't just be incrementing the counter number - these are separate classes
|
19
|
+
file_content = ''
|
20
|
+
|
21
|
+
# Include the sytax for the statement in the file
|
22
|
+
file_content << 'class '+class_name+"\n"
|
23
|
+
file_content << runtime_method.write(
|
24
|
+
ParametersContainer.new,1,
|
25
|
+
"This is the method that is being evaluated using '#{class_name}.new.#{runtime_method.method_name}"
|
26
|
+
)
|
27
|
+
|
28
|
+
# And any additional methods and close the file
|
29
|
+
additional_methods.each do |x|
|
30
|
+
file_content << x.write(ParametersContainer.new,1)
|
31
|
+
end
|
32
|
+
file_content << "\n"+'end'
|
33
|
+
file << file_content
|
34
|
+
file.close
|
35
|
+
|
36
|
+
evaluated_parameters = []
|
37
|
+
params.each do |x|
|
38
|
+
evaluated_parameters.push(x.value)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Load the generated class
|
42
|
+
load filepath
|
43
|
+
|
44
|
+
# Use the evaluated paramaters with the evaluated runtime method
|
45
|
+
return eval("#{class_name}.new."+runtime_method.method_name+"(*evaluated_parameters)")
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module MethodTester
|
2
|
+
|
3
|
+
# Returns a runtime method instance that will call the supplied
|
4
|
+
# runtime method and then test the result against the test
|
5
|
+
# runtime method.
|
6
|
+
#
|
7
|
+
# @param solution_method This is the method that should generate a runtime
|
8
|
+
# method instance that can be used and produce results
|
9
|
+
# that satisfy the requirements.
|
10
|
+
# @param return_value_evaluation_method This method is used to evaluate the result return
|
11
|
+
# from using the solution method.
|
12
|
+
#
|
13
|
+
def access_method(solution_method,return_value_evaluation_method)
|
14
|
+
|
15
|
+
# Construct the method to test the generated runtime method
|
16
|
+
testing_method = RuntimeMethod.new(MethodUsage.new)
|
17
|
+
generated_instance = Unknown.new
|
18
|
+
|
19
|
+
# Create the call that captures what is returned by the test method
|
20
|
+
testing_method << Statement.new(generated_instance,Equal.new,DefCall.new(nil,solution_method))
|
21
|
+
|
22
|
+
# Return the result of the "is_runtime_method_test"
|
23
|
+
testing_method << Statement.new(Return.new,DefCall.new(nil,return_value_evaluation_method,generated_instance))
|
24
|
+
|
25
|
+
return testing_method
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the results of calling the runtime method with the parameters
|
30
|
+
# provided.
|
31
|
+
#
|
32
|
+
# @param runtime_method A runtime method instance with on or more parameters
|
33
|
+
#
|
34
|
+
def use_runtime_method(runtime_method,params=ParametersContainer.new)
|
35
|
+
# MethodEvaluation.new.evaluate_method(
|
36
|
+
# requirement_testing_method,
|
37
|
+
# ParametersContainer.new,
|
38
|
+
# [reqs,copied_method]+@runtime_methods
|
39
|
+
# )
|
40
|
+
access_method = RuntimeMethod.new(MethodUsage.new)
|
41
|
+
access_method.push(Statement.new(Return.new,DefCall.new(nil,runtime_method,*params)))
|
42
|
+
return MethodEvaluation.new.evaluate_method(
|
43
|
+
access_method,
|
44
|
+
ParametersContainer.new,
|
45
|
+
[runtime_method]
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Generates a class that contains the passed through method and then
|
50
|
+
# calls the passed method using the params provided.
|
51
|
+
#
|
52
|
+
# So if the supplied runtime_method would when written looked like
|
53
|
+
#
|
54
|
+
# def method_7
|
55
|
+
# return true
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# It would then be put into the class and "method_7" would be called using
|
59
|
+
# the passed parameters.
|
60
|
+
#
|
61
|
+
# @param runtime_method A runtime method instance with zero of more parameters
|
62
|
+
#
|
63
|
+
#
|
64
|
+
def use_runtime_method_2(runtime_method,*params)
|
65
|
+
runtime_class = RuntimeClass.new('RuntimeMethodTester',runtime_method)
|
66
|
+
ClassEvaluation.new.evaluate_class_2(runtime_class,runtime_method.method_name,*params)
|
67
|
+
# return ClassEvaluation.new.evaluate_class(runtime_method,runtime_method.method_name)
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# The method generator is passed a number of runtime method instances that it uses
|
2
|
+
# to test the runtime methods it generates. Those that pass the tests are approved
|
3
|
+
# those that don't are rejected.
|
4
|
+
#
|
5
|
+
# Creating these runtime method instance is a bit verbose so I've created this
|
6
|
+
# class to generate them based on the condition passed through.
|
7
|
+
#
|
8
|
+
class MethodValidation
|
9
|
+
include MethodTester
|
10
|
+
|
11
|
+
# Returns a runtime method instance that expects to be passed
|
12
|
+
# a runtime method instance and evaluate an attribute of the
|
13
|
+
# instance.
|
14
|
+
#
|
15
|
+
# For example it might be passed the condition=> ".kind_of?(RuntimeMethod)"
|
16
|
+
# and would generate a runtime method instance that would be written like
|
17
|
+
# the following.
|
18
|
+
#
|
19
|
+
# def method_0(var)
|
20
|
+
# return true if var.kind_of?(RuntimeMethod)
|
21
|
+
# return false
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
def self.generate_attribute_test(condition)
|
25
|
+
method_var = MethodParameter.new
|
26
|
+
test_method = RuntimeMethod.new(MethodUsage.new(method_var))
|
27
|
+
test_method.push(HackStatement.new(
|
28
|
+
'return true if '+method_var.write+condition
|
29
|
+
))
|
30
|
+
test_method.push(Statement.new(Return.new,False.new))
|
31
|
+
return test_method
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a runtime method instance that expects a runtime
|
35
|
+
# method instance as a parameter. It will then use the passed
|
36
|
+
# in runtime method instance as runtime code and evaluate the
|
37
|
+
# response from the using the method.
|
38
|
+
#
|
39
|
+
# So if it was passed the condition=>' == "Dad"' and the params
|
40
|
+
# => ['Dad'] it would generate a runtime method instance that
|
41
|
+
# would write() like the following.
|
42
|
+
#
|
43
|
+
# def method_8(var_0)
|
44
|
+
# var_1 = RuntimeMethod.new(MethodUsage.new)
|
45
|
+
# var_1.push(Statement.new(Return.new,DefCall.new(nil,var_0,*<params>)))
|
46
|
+
# var_2 = RuntimeClass.new('TempClassName',var_0,var_1)
|
47
|
+
# return true if ClassEvaluation.new.evaluate_class(var_2,var_1.method_name) <condition>
|
48
|
+
# return false
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
def self.generate_response_test(condition,params)
|
52
|
+
method_var = MethodParameter.new
|
53
|
+
test_method = RuntimeMethod.new(MethodUsage.new(method_var))
|
54
|
+
|
55
|
+
# Create the enterance runtime method
|
56
|
+
# 1. var_1 = RuntimeMethod.new(MethodUsage.new)
|
57
|
+
var_1 = Unknown.new
|
58
|
+
test_method.push(
|
59
|
+
Statement.new(
|
60
|
+
var_1,
|
61
|
+
Equal.new,
|
62
|
+
ClassMethodCallContainer.new(
|
63
|
+
RuntimeMethodClass.new,
|
64
|
+
New.new,
|
65
|
+
ClassMethodCallContainer.new(MethodUsageClass.new,New.new)
|
66
|
+
)
|
67
|
+
)
|
68
|
+
)
|
69
|
+
# 2. var_1.push(Statement.new(Return.new,DefCall.new(nil,var_0,*<params>)))
|
70
|
+
test_method.push(
|
71
|
+
Statement.new(
|
72
|
+
InstanceCallContainer.new(
|
73
|
+
var_1,
|
74
|
+
Push.new,
|
75
|
+
ClassMethodCallContainer.new(
|
76
|
+
StatementClass.new,
|
77
|
+
New.new,
|
78
|
+
ClassMethodCallContainer.new(
|
79
|
+
ReturnClass.new,
|
80
|
+
New.new
|
81
|
+
),
|
82
|
+
ClassMethodCallContainer.new(
|
83
|
+
DefCallClass.new,
|
84
|
+
New.new,
|
85
|
+
Nil.new,
|
86
|
+
method_var,
|
87
|
+
*params
|
88
|
+
)
|
89
|
+
)
|
90
|
+
)
|
91
|
+
)
|
92
|
+
)
|
93
|
+
# 3. var_2 = RuntimeClass.new('TempClassName',var_0,var_1)
|
94
|
+
var_2 = Unknown.new
|
95
|
+
test_method.push(
|
96
|
+
Statement.new(
|
97
|
+
var_2,
|
98
|
+
Equal.new,
|
99
|
+
ClassMethodCallContainer.new(
|
100
|
+
RuntimeClassClass.new,
|
101
|
+
New.new,
|
102
|
+
'TempClassName'.to_literal,
|
103
|
+
method_var,
|
104
|
+
var_1
|
105
|
+
)
|
106
|
+
)
|
107
|
+
)
|
108
|
+
# 4. var_3 = ClassEvaluation.new
|
109
|
+
var_3 = Unknown.new
|
110
|
+
test_method.push(
|
111
|
+
Statement.new(
|
112
|
+
var_3,
|
113
|
+
Equal.new,
|
114
|
+
ClassMethodCallContainer.new(
|
115
|
+
ClassEvaluationClass.new,
|
116
|
+
New.new
|
117
|
+
)
|
118
|
+
)
|
119
|
+
)
|
120
|
+
# 5. return true if var_3.evaluate_class(var_2,var_1.method_name)<condition>
|
121
|
+
test_method.push(
|
122
|
+
Statement.new(
|
123
|
+
Return.new,
|
124
|
+
True.new,
|
125
|
+
If.new,
|
126
|
+
InstanceCallContainer.new(
|
127
|
+
var_3,
|
128
|
+
EvaluateClassCall.new,
|
129
|
+
var_2,
|
130
|
+
InstanceCallContainer.new(var_1,MethodNameCall.new)
|
131
|
+
),
|
132
|
+
Raw.new(condition)
|
133
|
+
)
|
134
|
+
)
|
135
|
+
# 6. return false
|
136
|
+
test_method.push(
|
137
|
+
Statement.new(
|
138
|
+
Return.new,
|
139
|
+
False.new
|
140
|
+
)
|
141
|
+
)
|
142
|
+
return test_method
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# TODO This instance should replace the write method in ActsAsRuntimeMethod
|
2
|
+
|
3
|
+
class MethodWriter
|
4
|
+
include WriteParameters
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
def write(params,statements,tab=0,method_id=0,additional_comments='')
|
11
|
+
|
12
|
+
line = "\n"
|
13
|
+
tab.times {|x| line += "\t" }
|
14
|
+
line += "#\n"
|
15
|
+
|
16
|
+
params.each_with_index do |var,i|
|
17
|
+
tab.times {|x| line += "\t" }
|
18
|
+
line += "#\t@param\t"
|
19
|
+
|
20
|
+
# Get a description of the requirements (this can multiple lines)
|
21
|
+
line_prefix = ''
|
22
|
+
|
23
|
+
desc = var.describe(tab)
|
24
|
+
desc.each_line do |l|
|
25
|
+
line += line_prefix+l
|
26
|
+
|
27
|
+
# Assides the first line pre-fix a "# " to the start
|
28
|
+
(tab-1).times {|x| line += "\t" }
|
29
|
+
line_prefix = "#\t\t\t"
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
# Add some some additional comment if supplied
|
36
|
+
unless additional_comments.nil?
|
37
|
+
tab.times {|x| line += "\t" }
|
38
|
+
line += "#"
|
39
|
+
tab.times {|x| line += "\t" }
|
40
|
+
line += additional_comments+"\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
tab.times {|x| line += "\t" }
|
44
|
+
line += "#\n"
|
45
|
+
|
46
|
+
tab.times {|x| line += "\t"}
|
47
|
+
line += 'def method_'+method_id.to_s
|
48
|
+
|
49
|
+
#line += write_params(@parameters)
|
50
|
+
line += write_params(params)
|
51
|
+
line += "\n"
|
52
|
+
|
53
|
+
# Write out any statements within the method
|
54
|
+
statements.each do |statement|
|
55
|
+
line += statement.write(tab+1)+"\n"
|
56
|
+
end
|
57
|
+
line += "\n" if statements.empty?
|
58
|
+
|
59
|
+
# Close the method
|
60
|
+
tab.times {|x| line += "\t" }
|
61
|
+
line += "end"+"\n"
|
62
|
+
|
63
|
+
return line
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|