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.
Files changed (398) hide show
  1. data/.document +5 -0
  2. data/Gemfile +13 -0
  3. data/LICENSE.txt +20 -0
  4. data/README +1 -0
  5. data/README.rdoc +19 -0
  6. data/Rakefile +53 -0
  7. data/VERSION +1 -0
  8. data/bin/cauldron +10 -0
  9. data/cauldron/.autotest +23 -0
  10. data/cauldron/History.txt +6 -0
  11. data/cauldron/Manifest.txt +8 -0
  12. data/cauldron/README.txt +57 -0
  13. data/cauldron/Rakefile +27 -0
  14. data/cauldron/bin/cauldron +3 -0
  15. data/cauldron/lib/cauldron.rb +3 -0
  16. data/cauldron/test/test_cauldron.rb +8 -0
  17. data/features/cauldron_example_cases.feature +13 -0
  18. data/features/cauldron_generates_runtime_method.feature +12 -0
  19. data/features/cauldron_start_terminal.feature +13 -0
  20. data/features/step_definitions/cauldron_steps.rb +16 -0
  21. data/features/step_definitions/terminal_steps.rb +34 -0
  22. data/features/support/env.rb +19 -0
  23. data/lib/Chain.rb +879 -0
  24. data/lib/ChainMapping.rb +172 -0
  25. data/lib/CodeHandler.rb +517 -0
  26. data/lib/Mapping.rb +26 -0
  27. data/lib/MappingValues.rb +24 -0
  28. data/lib/ScopeDependencies.rb +7 -0
  29. data/lib/Theory.rb +274 -0
  30. data/lib/UnifiedChain.rb +110 -0
  31. data/lib/cauldron.rb +6 -0
  32. data/lib/cauldron/conversion.rb +15 -0
  33. data/lib/cauldron/pot.rb +134 -0
  34. data/lib/cauldron/sexp2cauldron.rb +156 -0
  35. data/lib/cauldron/terminal.rb +120 -0
  36. data/lib/cauldron/theory_factory.rb +10 -0
  37. data/lib/core/ActsAsCode.rb +25 -0
  38. data/lib/core/BlockToken.rb +33 -0
  39. data/lib/core/CCall.rb +7 -0
  40. data/lib/core/CTestCase.rb +27 -0
  41. data/lib/core/ClassMethodCallContainer.rb +45 -0
  42. data/lib/core/Container.rb +85 -0
  43. data/lib/core/InstanceCallContainer.rb +272 -0
  44. data/lib/core/MethodUsage.rb +66 -0
  45. data/lib/core/PrintVariables.rb +25 -0
  46. data/lib/core/TheoryGenerator.rb +764 -0
  47. data/lib/core/Token.rb +7 -0
  48. data/lib/core/assignment/Assignment.rb +18 -0
  49. data/lib/core/assignment/Equal.rb +39 -0
  50. data/lib/core/assignment/Equivalent.rb +20 -0
  51. data/lib/core/assignment/NotEqual.rb +14 -0
  52. data/lib/core/call_container/CallContainer.rb +66 -0
  53. data/lib/core/class_method_call/New.rb +15 -0
  54. data/lib/core/class_method_call/RuntimeClassMethodCall.rb +31 -0
  55. data/lib/core/declaration/Declaration.rb +16 -0
  56. data/lib/core/declaration/LiteralDeclaration.rb +47 -0
  57. data/lib/core/declaration/VariableDeclaration.rb +59 -0
  58. data/lib/core/instance_call/ArrayEach.rb +23 -0
  59. data/lib/core/instance_call/ArrayLength.rb +15 -0
  60. data/lib/core/instance_call/Chop.rb +28 -0
  61. data/lib/core/instance_call/Copy.rb +22 -0
  62. data/lib/core/instance_call/DeclaredVariable.rb +18 -0
  63. data/lib/core/instance_call/InstanceCall.rb +77 -0
  64. data/lib/core/instance_call/Params.rb +15 -0
  65. data/lib/core/instance_call/Push.rb +20 -0
  66. data/lib/core/instance_call/StringLength.rb +32 -0
  67. data/lib/core/instance_call/Times.rb +20 -0
  68. data/lib/core/instance_call/instance_calls.rb +168 -0
  69. data/lib/core/instance_call/length_equal.rb +15 -0
  70. data/lib/core/kernal/EvalCall.rb +15 -0
  71. data/lib/core/kernal/LocalVariablesCall.rb +15 -0
  72. data/lib/core/literal/Literal.rb +111 -0
  73. data/lib/core/literal/Raw.rb +23 -0
  74. data/lib/core/literal/RuntimeMethodLiteral.rb +21 -0
  75. data/lib/core/literal/StatementLiteral.rb +28 -0
  76. data/lib/core/method_call/AvailableVariablesCall.rb +25 -0
  77. data/lib/core/method_call/ClassCall.rb +33 -0
  78. data/lib/core/method_call/DefCall.rb +72 -0
  79. data/lib/core/method_call/EvaluateClassCall.rb +29 -0
  80. data/lib/core/method_call/MethodNameCall.rb +27 -0
  81. data/lib/core/method_call/ToDeclarationCall.rb +15 -0
  82. data/lib/core/requirement/Requirement.rb +291 -0
  83. data/lib/core/runtime_class/ArrayClass.rb +19 -0
  84. data/lib/core/runtime_class/ClassCallClass.rb +23 -0
  85. data/lib/core/runtime_class/ClassEvaluationClass.rb +19 -0
  86. data/lib/core/runtime_class/ClassName.rb +18 -0
  87. data/lib/core/runtime_class/DefCallClass.rb +21 -0
  88. data/lib/core/runtime_class/EqualClass.rb +19 -0
  89. data/lib/core/runtime_class/FixnumClass.rb +15 -0
  90. data/lib/core/runtime_class/IfStatementClass.rb +12 -0
  91. data/lib/core/runtime_class/InstanceCallClass.rb +19 -0
  92. data/lib/core/runtime_class/InstanceCallContainerClass.rb +16 -0
  93. data/lib/core/runtime_class/InstanceClassCallClass.rb +19 -0
  94. data/lib/core/runtime_class/LiteralClass.rb +19 -0
  95. data/lib/core/runtime_class/MethodParameterClass.rb +27 -0
  96. data/lib/core/runtime_class/MethodUsageClass.rb +27 -0
  97. data/lib/core/runtime_class/RequirementClass.rb +19 -0
  98. data/lib/core/runtime_class/ReturnClass.rb +21 -0
  99. data/lib/core/runtime_class/RuntimeClass.rb +30 -0
  100. data/lib/core/runtime_class/RuntimeClassClass.rb +19 -0
  101. data/lib/core/runtime_class/RuntimeMethodClass.rb +34 -0
  102. data/lib/core/runtime_class/StatementClass.rb +53 -0
  103. data/lib/core/runtime_class/StringClass.rb +23 -0
  104. data/lib/core/runtime_class/StringLengthClass.rb +19 -0
  105. data/lib/core/runtime_class/StringVariableClass.rb +19 -0
  106. data/lib/core/runtime_class/ThisClass.rb +15 -0
  107. data/lib/core/runtime_class/UnknownClass.rb +23 -0
  108. data/lib/core/runtime_class/class_names.rb +95 -0
  109. data/lib/core/runtime_class/runtime_class.rb +123 -0
  110. data/lib/core/runtime_method/ActsAsRuntimeMethod.rb +300 -0
  111. data/lib/core/runtime_method/ParametersContainer.rb +29 -0
  112. data/lib/core/runtime_method/RealisedRuntimeMethod.rb +94 -0
  113. data/lib/core/runtime_method/RuntimeMethod.rb +817 -0
  114. data/lib/core/runtime_method/WriteParameters.rb +35 -0
  115. data/lib/core/statement/ActsAsStatement.rb +116 -0
  116. data/lib/core/statement/ArrayAccess.rb +96 -0
  117. data/lib/core/statement/BlockStatement.rb +348 -0
  118. data/lib/core/statement/DeclarationStatement.rb +19 -0
  119. data/lib/core/statement/HackStatement.rb +25 -0
  120. data/lib/core/statement/HashAccess.rb +18 -0
  121. data/lib/core/statement/OpenStatement.rb +171 -0
  122. data/lib/core/statement/RealisedStatement.rb +5 -0
  123. data/lib/core/statement/SingleLineBlockStatement.rb +39 -0
  124. data/lib/core/statement/Statement.rb +1223 -0
  125. data/lib/core/statement/StatementDependencies.rb +271 -0
  126. data/lib/core/statement/StatementGroup.rb +157 -0
  127. data/lib/core/statement/StatementStructure2.rb +224 -0
  128. data/lib/core/statement/TheoryStatement.rb +60 -0
  129. data/lib/core/statement/TopologicalStatements.rb +34 -0
  130. data/lib/core/structure/DeclareNewInstanceStructure.rb +49 -0
  131. data/lib/core/structure/DeclareRuntimeMethodStructure.rb +34 -0
  132. data/lib/core/structure/DeclareVariableAsLiteralStructure.rb +31 -0
  133. data/lib/core/structure/DeclareVariableAsVariableStructure.rb +52 -0
  134. data/lib/core/structure/FixnumAdditionStructure.rb +56 -0
  135. data/lib/core/structure/InstanceCallContainerStructure.rb +50 -0
  136. data/lib/core/structure/InstanceCallStructure.rb +53 -0
  137. data/lib/core/structure/InstanceMethodCallStructure.rb +21 -0
  138. data/lib/core/structure/ReturnStructure.rb +20 -0
  139. data/lib/core/structure/StatementStructure.rb +11 -0
  140. data/lib/core/syntax/Addition.rb +25 -0
  141. data/lib/core/syntax/BlockContainer.rb +130 -0
  142. data/lib/core/syntax/Boolean.rb +15 -0
  143. data/lib/core/syntax/Code.rb +11 -0
  144. data/lib/core/syntax/Do.rb +20 -0
  145. data/lib/core/syntax/False.rb +12 -0
  146. data/lib/core/syntax/If.rb +28 -0
  147. data/lib/core/syntax/IfContainer.rb +100 -0
  148. data/lib/core/syntax/Nil.rb +15 -0
  149. data/lib/core/syntax/Return.rb +33 -0
  150. data/lib/core/syntax/Subtract.rb +19 -0
  151. data/lib/core/syntax/This.rb +40 -0
  152. data/lib/core/syntax/True.rb +20 -0
  153. data/lib/core/syntax/syntax.rb +24 -0
  154. data/lib/core/tracking/ActsAsTrackable.rb +65 -0
  155. data/lib/core/tracking/History.rb +167 -0
  156. data/lib/core/tracking/RuntimeTrackingMethod.rb +32 -0
  157. data/lib/core/tracking/Step.rb +52 -0
  158. data/lib/core/variable/ArrayVariable.rb +76 -0
  159. data/lib/core/variable/BaseVariable.rb +154 -0
  160. data/lib/core/variable/BlockVariable.rb +92 -0
  161. data/lib/core/variable/FixnumVariable.rb +36 -0
  162. data/lib/core/variable/HistoryVariable.rb +8 -0
  163. data/lib/core/variable/MethodParameter.rb +206 -0
  164. data/lib/core/variable/MethodUsageVariable.rb +60 -0
  165. data/lib/core/variable/NilVariable.rb +29 -0
  166. data/lib/core/variable/RuntimeMethodParameter.rb +67 -0
  167. data/lib/core/variable/StatementVariable.rb +72 -0
  168. data/lib/core/variable/StepVariable.rb +7 -0
  169. data/lib/core/variable/StringVariable.rb +46 -0
  170. data/lib/core/variable/TypeVariable.rb +72 -0
  171. data/lib/core/variable/Unknown.rb +116 -0
  172. data/lib/core/variable/UnknownVariable.rb +29 -0
  173. data/lib/core/variable/Variable.rb +70 -0
  174. data/lib/core/variable/VariableContainer.rb +28 -0
  175. data/lib/core/variable/VariableIncluded.rb +27 -0
  176. data/lib/core/variable/VariableReference.rb +85 -0
  177. data/lib/error/FailedToFindStatementContainerError.rb +7 -0
  178. data/lib/error/FailedToFindStatementError.rb +7 -0
  179. data/lib/error/FailedToFindVariableError.rb +7 -0
  180. data/lib/error/FailedToLiteraliseError.rb +7 -0
  181. data/lib/error/FailedVariableMatch.rb +7 -0
  182. data/lib/error/ImproperStatementUsageError.rb +7 -0
  183. data/lib/error/IncompatiableRequirementsError.rb +7 -0
  184. data/lib/error/InvalidStatementError.rb +7 -0
  185. data/lib/error/MethodSizeError.rb +7 -0
  186. data/lib/error/RuntimeSyntaxError.rb +7 -0
  187. data/lib/error/UnexpectedStatementTypeError.rb +7 -0
  188. data/lib/error/UnknownStatementType.rb +7 -0
  189. data/lib/error/UnliteralisableError.rb +7 -0
  190. data/lib/implemented_chain.rb +34 -0
  191. data/lib/intrinsic/IntrinsicLastRuntimeMethod.rb +20 -0
  192. data/lib/intrinsic/IntrinsicLiteral.rb +26 -0
  193. data/lib/intrinsic/IntrinsicObject.rb +22 -0
  194. data/lib/intrinsic/IntrinsicRuntimeMethod.rb +27 -0
  195. data/lib/intrinsic/IntrinsicTestCases.rb +17 -0
  196. data/lib/logger/StandardLogger.rb +62 -0
  197. data/lib/required.rb +236 -0
  198. data/lib/ruby_code/Array.rb +95 -0
  199. data/lib/ruby_code/Fixnum.rb +39 -0
  200. data/lib/ruby_code/Hash.rb +25 -0
  201. data/lib/ruby_code/NilClass.rb +19 -0
  202. data/lib/ruby_code/Object.rb +24 -0
  203. data/lib/ruby_code/String.rb +86 -0
  204. data/lib/ruby_code/Symbol.rb +7 -0
  205. data/lib/standard_library/Tasks.rb +12 -0
  206. data/lib/theories.rb +143 -0
  207. data/lib/theory/ActionImplementation.rb +17 -0
  208. data/lib/theory/TheoryAction.rb +70 -0
  209. data/lib/theory/TheoryChainValidator.rb +101 -0
  210. data/lib/theory/TheoryComponent.rb +42 -0
  211. data/lib/theory/TheoryConnector.rb +755 -0
  212. data/lib/theory/TheoryDependent.rb +135 -0
  213. data/lib/theory/TheoryImplementation.rb +74 -0
  214. data/lib/theory/TheoryResult.rb +131 -0
  215. data/lib/theory/TheoryVariable.rb +63 -0
  216. data/lib/theory/theory_collection.rb +62 -0
  217. data/lib/util/ClassEvaluation.rb +68 -0
  218. data/lib/util/CodeEvaluation.rb +35 -0
  219. data/lib/util/DeclarationStatementEvaluation.rb +31 -0
  220. data/lib/util/MethodEvaluation.rb +49 -0
  221. data/lib/util/MethodTester.rb +71 -0
  222. data/lib/util/MethodValidation.rb +145 -0
  223. data/lib/util/MethodWriter.rb +66 -0
  224. data/lib/util/Parser.rb +299 -0
  225. data/lib/util/StatementCheck.rb +42 -0
  226. data/lib/util/StringToTheory.rb +119 -0
  227. data/lib/util/System.rb +8 -0
  228. data/spec/cauldron/pot_spec.rb +6 -0
  229. data/spec/cauldron/runtime_method_spec.rb +36 -0
  230. data/spec/cauldron/sexp_2_cauldron_spec.rb +26 -0
  231. data/spec/cauldron/terminal_spec.rb +38 -0
  232. data/spec/cauldron/theory_action_spec.rb +5 -0
  233. data/spec/spec_helper.rb +4 -0
  234. data/test/fixtures/chains/1/declaration.txt +26 -0
  235. data/test/fixtures/chains/1/dump +0 -0
  236. data/test/fixtures/chains/2/declaration.txt +26 -0
  237. data/test/fixtures/chains/2/dump +0 -0
  238. data/test/fixtures/chains/3/declaration.txt +26 -0
  239. data/test/fixtures/chains/3/dump +0 -0
  240. data/test/fixtures/implementation_results/0/declaration.txt +3 -0
  241. data/test/fixtures/implementation_results/0/dump +0 -0
  242. data/test/fixtures/theories/0/declaration.txt +9 -0
  243. data/test/fixtures/theories/0/desc +10 -0
  244. data/test/fixtures/theories/0/dump +0 -0
  245. data/test/fixtures/theories/1/declaration.txt +15 -0
  246. data/test/fixtures/theories/1/desc +11 -0
  247. data/test/fixtures/theories/1/dump +0 -0
  248. data/test/fixtures/theories/10/declaration.txt +23 -0
  249. data/test/fixtures/theories/10/desc +17 -0
  250. data/test/fixtures/theories/10/dump +0 -0
  251. data/test/fixtures/theories/11/declaration.txt +20 -0
  252. data/test/fixtures/theories/11/desc +14 -0
  253. data/test/fixtures/theories/11/dump +0 -0
  254. data/test/fixtures/theories/12/declaration.txt +18 -0
  255. data/test/fixtures/theories/12/desc +12 -0
  256. data/test/fixtures/theories/12/dump +0 -0
  257. data/test/fixtures/theories/13/declaration.txt +24 -0
  258. data/test/fixtures/theories/13/desc +20 -0
  259. data/test/fixtures/theories/13/dump +0 -0
  260. data/test/fixtures/theories/14/declaration.txt +26 -0
  261. data/test/fixtures/theories/14/desc +20 -0
  262. data/test/fixtures/theories/14/dump +0 -0
  263. data/test/fixtures/theories/15/declaration.txt +20 -0
  264. data/test/fixtures/theories/15/desc +14 -0
  265. data/test/fixtures/theories/15/dump +0 -0
  266. data/test/fixtures/theories/16/declaration.txt +30 -0
  267. data/test/fixtures/theories/16/desc +14 -0
  268. data/test/fixtures/theories/16/dump +0 -0
  269. data/test/fixtures/theories/17/declaration.txt +25 -0
  270. data/test/fixtures/theories/17/desc +11 -0
  271. data/test/fixtures/theories/17/dump +0 -0
  272. data/test/fixtures/theories/18/declaration.txt +23 -0
  273. data/test/fixtures/theories/18/desc +11 -0
  274. data/test/fixtures/theories/18/dump +0 -0
  275. data/test/fixtures/theories/19/declaration.txt +23 -0
  276. data/test/fixtures/theories/19/desc +11 -0
  277. data/test/fixtures/theories/19/dump +0 -0
  278. data/test/fixtures/theories/2/declaration.txt +12 -0
  279. data/test/fixtures/theories/2/desc +10 -0
  280. data/test/fixtures/theories/2/dump +0 -0
  281. data/test/fixtures/theories/20/declaration.txt +23 -0
  282. data/test/fixtures/theories/20/desc +17 -0
  283. data/test/fixtures/theories/20/dump +0 -0
  284. data/test/fixtures/theories/3/declaration.txt +19 -0
  285. data/test/fixtures/theories/3/desc +11 -0
  286. data/test/fixtures/theories/3/dump +0 -0
  287. data/test/fixtures/theories/4/declaration.txt +11 -0
  288. data/test/fixtures/theories/4/desc +11 -0
  289. data/test/fixtures/theories/4/dump +0 -0
  290. data/test/fixtures/theories/5/declaration.txt +6 -0
  291. data/test/fixtures/theories/5/desc +9 -0
  292. data/test/fixtures/theories/5/dump +0 -0
  293. data/test/fixtures/theories/6/declaration.txt +13 -0
  294. data/test/fixtures/theories/6/desc +11 -0
  295. data/test/fixtures/theories/6/dump +0 -0
  296. data/test/fixtures/theories/7/declaration.txt +19 -0
  297. data/test/fixtures/theories/7/desc +11 -0
  298. data/test/fixtures/theories/7/dump +0 -0
  299. data/test/fixtures/theories/8/declaration.txt +21 -0
  300. data/test/fixtures/theories/8/desc +11 -0
  301. data/test/fixtures/theories/8/dump +0 -0
  302. data/test/fixtures/theories/9/declaration.txt +24 -0
  303. data/test/fixtures/theories/9/desc +20 -0
  304. data/test/fixtures/theories/9/dump +0 -0
  305. data/test/fixtures/theory_implementations/0/declaration.txt +11 -0
  306. data/test/fixtures/theory_implementations/0/desc.txt +9 -0
  307. data/test/fixtures/theory_implementations/0/dump +0 -0
  308. data/test/fixtures/theory_implementations/0/theory_id +1 -0
  309. data/test/fixtures/theory_implementations/1/desc.txt +9 -0
  310. data/test/fixtures/theory_implementations/1/dump +0 -0
  311. data/test/fixtures/theory_implementations/1/theory_id +1 -0
  312. data/test/fixtures/theory_implementations/2/desc.txt +9 -0
  313. data/test/fixtures/theory_implementations/2/dump +0 -0
  314. data/test/fixtures/theory_implementations/2/theory_id +1 -0
  315. data/test/output/simple_method.txt +6 -0
  316. data/test/output/test_method/first_possible_method.txt +6 -0
  317. data/test/output/test_simple_cases/simple_case_01.txt +8 -0
  318. data/test/output/test_simple_cases/simple_case_02.txt +7 -0
  319. data/test/output/test_simple_cases/simple_case_03.txt +8 -0
  320. data/test/output/test_simple_cases/simple_case_04.txt +8 -0
  321. data/test/output/test_simple_cases/simple_case_05.txt +8 -0
  322. data/test/output/test_simple_cases/simple_case_06.txt +9 -0
  323. data/test/output/test_simple_cases/simple_case_07.txt +9 -0
  324. data/test/output/test_simple_cases/simple_case_08.txt +9 -0
  325. data/test/tc_contextual_variables.rb +87 -0
  326. data/test/tc_describe.rb +47 -0
  327. data/test/tc_method.rb +133 -0
  328. data/test/tc_requirement.rb +30 -0
  329. data/test/tc_suite_complete.rb +26 -0
  330. data/test/tc_variable.rb +52 -0
  331. data/test/ts_complete.rb +84 -0
  332. data/test/ts_stable.rb +81 -0
  333. data/test/unit/core/declaration/tc_literal_declaration.rb +34 -0
  334. data/test/unit/core/method_call/tc_class_call.rb +20 -0
  335. data/test/unit/core/runtime_method/tc_realised_runtime_method.rb +129 -0
  336. data/test/unit/core/runtime_method/tc_runtime_method.rb +616 -0
  337. data/test/unit/core/statement/tc_array_access.rb +63 -0
  338. data/test/unit/core/statement/tc_block_statement.rb +51 -0
  339. data/test/unit/core/statement/tc_hack_statement.rb +26 -0
  340. data/test/unit/core/statement/tc_open_statement.rb +70 -0
  341. data/test/unit/core/statement/tc_statement.rb +681 -0
  342. data/test/unit/core/statement/tc_statement_dependencies.rb +146 -0
  343. data/test/unit/core/statement/tc_statement_group.rb +35 -0
  344. data/test/unit/core/statement/tc_statement_replace_variable.rb +61 -0
  345. data/test/unit/core/statement/tc_theory_statement.rb +51 -0
  346. data/test/unit/core/structure/tc_declare_new_instance_structure.rb +41 -0
  347. data/test/unit/core/structure/tc_declare_variable_as_literal_structure.rb +41 -0
  348. data/test/unit/core/structure/tc_declare_variable_as_variable_structure.rb +66 -0
  349. data/test/unit/core/structure/tc_instance_call_container_structure.rb +41 -0
  350. data/test/unit/core/structure/tc_return_structure.rb +32 -0
  351. data/test/unit/core/syntax/tc_block_container.rb +32 -0
  352. data/test/unit/core/syntax/tc_if_container.rb +39 -0
  353. data/test/unit/core/tc_class_method_call.rb +34 -0
  354. data/test/unit/core/tc_container.rb +41 -0
  355. data/test/unit/core/tc_ctest_case.rb +25 -0
  356. data/test/unit/core/tc_instance_call_container.rb +93 -0
  357. data/test/unit/core/tc_literal.rb +30 -0
  358. data/test/unit/core/tc_theory_generator.rb +336 -0
  359. data/test/unit/core/tc_theory_generator_heavy.rb +42 -0
  360. data/test/unit/core/tracking/tc_history.rb +102 -0
  361. data/test/unit/core/tracking/tc_step.rb +65 -0
  362. data/test/unit/core/variable/tc_array_variable.rb +61 -0
  363. data/test/unit/core/variable/tc_block_variable.rb +17 -0
  364. data/test/unit/core/variable/tc_fixnum_variable.rb +54 -0
  365. data/test/unit/core/variable/tc_method_parameter_variable.rb +22 -0
  366. data/test/unit/core/variable/tc_runtime_method_variable.rb +32 -0
  367. data/test/unit/core/variable/tc_string_variable.rb +37 -0
  368. data/test/unit/core/variable/tc_unknown.rb +24 -0
  369. data/test/unit/core/variable/tc_variable_reference.rb +28 -0
  370. data/test/unit/ruby_code/tc_array.rb +64 -0
  371. data/test/unit/ruby_code/tc_fixnum.rb +18 -0
  372. data/test/unit/ruby_code/tc_hash.rb +41 -0
  373. data/test/unit/ruby_code/tc_string.rb +38 -0
  374. data/test/unit/tc_chain.rb +434 -0
  375. data/test/unit/tc_chain_mapping.rb +62 -0
  376. data/test/unit/tc_chain_with_case_1.rb +169 -0
  377. data/test/unit/tc_instance_call.rb +40 -0
  378. data/test/unit/tc_instance_call_structure.rb +35 -0
  379. data/test/unit/tc_method_usage.rb +35 -0
  380. data/test/unit/tc_pot.rb +124 -0
  381. data/test/unit/tc_runtime_tracking_method.rb +40 -0
  382. data/test/unit/tc_statement_structure_2.rb +43 -0
  383. data/test/unit/tc_theory.rb +533 -0
  384. data/test/unit/tc_variable_declaration.rb +32 -0
  385. data/test/unit/theory/tc_theory_action.rb +80 -0
  386. data/test/unit/theory/tc_theory_action_implementation.rb +23 -0
  387. data/test/unit/theory/tc_theory_chain_validator.rb +340 -0
  388. data/test/unit/theory/tc_theory_connector.rb +396 -0
  389. data/test/unit/theory/tc_theory_dependent.rb +151 -0
  390. data/test/unit/theory/tc_theory_implementation.rb +133 -0
  391. data/test/unit/theory/tc_theory_result.rb +111 -0
  392. data/test/unit/theory/tc_theory_variable.rb +45 -0
  393. data/test/unit/util/tc_method_validation.rb +98 -0
  394. data/test/unit/util/tc_parser.rb +108 -0
  395. data/test/unit/util/tc_string_to_theory.rb +299 -0
  396. data/test/unit/variable/tc_method_usage_variable.rb +25 -0
  397. data/tmp/runtime_method_evaluation.rb +10 -0
  398. 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