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,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,15 @@
1
+ class ToDeclarationCall <InstanceCall
2
+
3
+ def initialize
4
+ super
5
+ end
6
+
7
+ def write
8
+ return '.to_declaration'
9
+ end
10
+
11
+ def copy
12
+ return ToDeclarationCall.new
13
+ end
14
+
15
+ 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