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,40 @@
1
+ # Not sure how or is this class will be used but it is meant as contextual
2
+ # reference to a different instance.
3
+ #
4
+ # TODO Check whether this needs to be an array
5
+ #
6
+ class This < Array
7
+
8
+ #
9
+ # @param method_call The name of any method call if any. For example:
10
+ # self.class
11
+ #
12
+ def initialize(*parameters)
13
+ super()
14
+
15
+ # Save any requirements
16
+ parameters.collect {|param| self.push param}
17
+ end
18
+
19
+ # @param variable The variable "self" refers to. This is dependent on
20
+ # where the instance is used.
21
+ #
22
+ def write(context=nil,variable=nil)
23
+ if context.nil? then return 'self' end
24
+ if variable.nil? then return 'self' end
25
+ return context.display_name_for(variable)
26
+ end
27
+
28
+ def describe(context=nil,variable=nil)
29
+ return write(context,variable)+"\n"
30
+ end
31
+
32
+ def copy
33
+ return This.new
34
+ end
35
+
36
+ def declaration_statement
37
+ return ClassMethodCallContainer.new(ThisClass.new,New.new)
38
+ end
39
+
40
+ end
@@ -0,0 +1,20 @@
1
+
2
+ class True < Boolean
3
+
4
+ def initialize
5
+
6
+ end
7
+
8
+ def write
9
+ return 'true'
10
+ end
11
+
12
+ def describe
13
+ return write
14
+ end
15
+
16
+ def copy
17
+ return True.new
18
+ end
19
+
20
+ end
@@ -0,0 +1,24 @@
1
+ class Next
2
+ include Code
3
+
4
+ def initialize
5
+ super
6
+ end
7
+
8
+ def write(tab=0)
9
+ return ("\t"*tab)+'next'
10
+ end
11
+
12
+ def copy
13
+ return Next.new
14
+ end
15
+
16
+ def to_declaration
17
+ return VariableDeclaration.new(self.class.to_s)
18
+ end
19
+
20
+ def to_literal_string
21
+ return write
22
+ end
23
+
24
+ end
@@ -0,0 +1,65 @@
1
+ module ActsAsTrackable
2
+
3
+ # Returns a tracking statement for the line supplied. The tracking call
4
+ # contains the following values.
5
+ #
6
+ # line The line the statement occurs on
7
+ # action The statement written as a literal string - I'm not sure whether or not this is
8
+ # important value or not yet.
9
+ # variables An array of variables used in the statement - they are saved in the following format
10
+ # {'id'=>4,'value'=>'Project Purity'}. As such the variables only have literal values.
11
+ # NOTE: Currently I am only saving the variables in the statement but it might be
12
+ # prudent later to save all the variables available to statement.
13
+ # local_variables saves an array with the name of all the variables in scope.
14
+ #
15
+ # @param tracking_method The runtime method that gets called to retain to tracking information
16
+ # @param line The line the tracking call represents (NOTE Currently the line is represented
17
+ # by the length of an array to keep scope between methods)
18
+ # TODO I would rather be able to use a single variable.
19
+ # @param statement The statement represented by the tracking call this can be nil if it is
20
+ # the start of a method.
21
+ # @param variables_value An array of variable values and ids stored in a hash e.g.
22
+ # [{'id'=>4,'value'=>'Project Purity'},..]
23
+ #
24
+ def tracking_statement(tracking_method,line,statement_id=nil,variables_value=[],statement=nil)
25
+ (statement.nil?) ? action = '' : action = statement.to_literal_string
26
+ params = [line.length,statement_id,variables_value,action]
27
+ line.push(1)
28
+ track_statement = Statement.new(DefCall.new(NilVariable.new,tracking_method,*params))
29
+ return track_statement
30
+ end
31
+
32
+ # Returns an array of variables abstracted from the variable containers in
33
+ # the format used by the tracking statement. A variable container includes
34
+ # a statement, nested statement, block container and runtime method. This is
35
+ # essentially every variable used in the variable container.
36
+ #
37
+ # The variables are returned in the following format:
38
+ # [{id'=>4,'value'=>'Project Purity'},
39
+ # {id'=>4,'value'=>'Vault 101'},
40
+ # {id'=>4,'value'=>'Brotherhood of Steel'}]
41
+ #
42
+ # @param variable_containers Any number of elements that may contain variables.
43
+ #
44
+ def abstract_variables_for_tracking(*variable_containers)
45
+ results = []
46
+ variable_containers.each do |x|
47
+ # NOTE This breaks on the ParametersContainer
48
+ #x.each_variable do |y|
49
+ # NOTE This breaks on statements
50
+ #x.each do |y|
51
+ # NOTE: This breaks histroy
52
+ #x.select {|z| z.kind_of?(Variable)}.each do |y|
53
+ x.select_all {|z| z.kind_of?(Variable)}.each do |y|
54
+ results.push(Hash[
55
+ 'id'=>y.variable_id,
56
+ 'uniq_id'=>y.uniq_id,
57
+ 'value'=>InstanceCallContainer.new(y,Copy.new),
58
+ 'abs_id'=>EvalCall.new("#{y.write}.object_id.to_s")
59
+ ])
60
+ end
61
+ end
62
+ return results
63
+ end
64
+
65
+ end
@@ -0,0 +1,167 @@
1
+ # Contains the usage history of a method, or a statement group etc. The current structure is
2
+ # something like the following:
3
+ #
4
+ # [0] = {line:1,available_variables:[var_0,var_1],action:"'test'"}
5
+ # [1] = {line:2,available_variables:[var_0,var_1,var_2],action:"'test'.chop"}
6
+ #
7
+ # Actually the history object should probably save what happens to variables at
8
+ # each line aswell. Although I should frame this in a example so I rember.
9
+ #
10
+ # One of the purposes of the history object is to refactor code. So
11
+ # if I have three chop statements.
12
+ #
13
+ # var_0 = 'test'
14
+ # var_1 = var_0.chop
15
+ # var_2 = var_1.chop
16
+ # var_3 = var_2.chop (ending with var_3 = 't')
17
+ #
18
+ # Now I'm to abstract that process so I come up with the method
19
+ #
20
+ # var_0 = 'test'
21
+ # 3.times do |i|
22
+ # var_0 = var_0.chop
23
+ # end
24
+ #
25
+ # In both cases they end up with a value of 't' but how can we be sure that
26
+ # replacing one process with the other is equivalent? Well of course they're
27
+ # not identical and I am tempted to just use there final value but I would
28
+ # be concerned with the likes of numbers for example the number 2.
29
+ #
30
+ # What about if I consider them as literal values. Then their history can be
31
+ # expressed.
32
+ #
33
+ # 'test' -> 'test'.chop -> 'tes'.chop -> 'te'.chop -> 't'
34
+ #
35
+ class History < Array
36
+
37
+ def initialize(*paramaters)
38
+ super()
39
+ self.each do |x|
40
+ self.push(x)
41
+ end
42
+ end
43
+
44
+ # Create a copy of the history instance.
45
+ #
46
+ def copy
47
+ return History.new(*self.collect {|x| x.copy} )
48
+ end
49
+
50
+ def cauldron_method_calls
51
+ result = ['.length','.any?']
52
+ return result
53
+ end
54
+
55
+ # Returns an array of steps that include the variable
56
+ # specified.
57
+ #
58
+ # @param id The id of the variable that should be included in all the
59
+ # returned steps.
60
+ #
61
+ def find_steps_with_variable(id)
62
+ results = []
63
+ self.each do |x|
64
+ results.push(x) if x['variables'].any? {|y| y['id'] == id}
65
+ end
66
+ return results
67
+ end
68
+
69
+ # Returns the values for the unique variable id specified. NOTE
70
+ # it is important to use the unique variable id to avoid any
71
+ # mistaken interpretation.
72
+ #
73
+ # TODO This should be using unique_variable id to avoid the risk of
74
+ # miss interpretation
75
+ #
76
+ def find_value_for(variable_id)
77
+ results = []
78
+
79
+ # Find all the values for the particular id
80
+ self.each do |x|
81
+ results += x['variables'].find_all {|y| y['id']==variable_id}
82
+ end
83
+ return results.first['value']
84
+
85
+ end
86
+
87
+ # Returns a realised variable reflecting the id supplied. It
88
+ # can be either a VariableContainer, TypedVariable and BlockVariable.
89
+ #
90
+ # TODO I still havn't properly worked how to distinguish between types of variables
91
+ #
92
+ # @param variable_id The variable id that should be realised and returned
93
+ # @param variable_type A string indicating the type of variable that is being
94
+ # realised. This is basically used to distinguish between
95
+ # block variables and variable containers. NOTE if the variable
96
+ # doesn't have multiple values it won't be VariableContainer - just
97
+ # a type variable.
98
+ #
99
+ def find_realised_variable(variable_id,uniq_id,variable_type='VariableContainer')
100
+
101
+ raise StandardError.new('Expecting Fixnum') unless uniq_id.kind_of?(Fixnum)
102
+
103
+ # Find all the values for the particular id
104
+ # TODO Because there is a step class I could use more custom methods
105
+ results = self.inject([]) do |total,x|
106
+ total += x['variables'].select {|y| y['uniq_id'] == uniq_id}
107
+ total
108
+ end
109
+
110
+ # If all values have the same absolute id return a type variable.
111
+ # (this means the value of the variable doesn't change through the method)
112
+ if results.all? {|x| x['abs_id']==results.first['abs_id']}
113
+ raise StandardError.new('Unable to find variable with id '+variable_id.to_s+' and uniq_id '+uniq_id.to_s) if results.empty?
114
+
115
+ # TODO I don't know how to handle the situation where I have a reference to
116
+ # a variable. So the value of var_570 points to the UnkownVariable. In
117
+ # which case we have a UnknownVariable - which is just getting
118
+ # a bit rediculous.
119
+ # #
120
+ # #
121
+ # def method_8
122
+ # var_12 = Statement.new(Unknown.new,Equal.new,8.to_declaration)
123
+ # var_570 = var_12.declared_variable
124
+ # end
125
+ # TODO This better track mulitple values - I should at least indicate them
126
+ return results.first['value'].to_var(variable_id,uniq_id)
127
+
128
+ end
129
+
130
+ raise StandardError.new('variable '+variable_id.to_s+' has multiple values but no variable_type was supplied') if variable_type.nil?
131
+
132
+ case variable_type
133
+ when 'BlockVariable'
134
+
135
+ # Find all the unique variable ids
136
+ unique_results = []
137
+ results.each do |x|
138
+ unique_results.push(x) unless unique_results.any? {|y| y[:abs_id] == x[:abs_id]}
139
+ end
140
+
141
+ # Convert each result into a variable and return a new block variable
142
+ new_block_variable = BlockVariable.new() {{:variable_id=>variable_id,:uniq_id=>uniq_id}}
143
+ unique_results.each do |x|
144
+ new_block_variable.push(x[:value].to_var(variable_id))
145
+ end
146
+ return new_block_variable
147
+
148
+ when 'VariableContainer'
149
+
150
+ # Find all the unique variable ids
151
+ unique_results = []
152
+ results.each do |x|
153
+ unique_results.push(x) unless unique_results.any? {|y| y[:abs_id] == x[:abs_id]}
154
+ end
155
+
156
+ # Convert each result into a variable and return a new block variable
157
+ # TODO This should probable include the uniq_id as well
158
+ new_container_variable = VariableContainer.new() {{:variable_id=>variable_id,:uniq_id=>uniq_id}}
159
+ unique_results.each do |x|
160
+ new_container_variable.push(x[:value].to_var(variable_id))
161
+ end
162
+ return new_container_variable
163
+ end
164
+ raise StandardError.new('Method not able to handle different type of variables')
165
+ end
166
+
167
+ end
@@ -0,0 +1,32 @@
1
+ # This is a special runtime method that is used to track changes in a method
2
+ # as it is being run.
3
+ #
4
+ # The call to the tracking method looks something like this:
5
+ #
6
+ # tracking_method(line,action,variables=[])
7
+ #
8
+ class RuntimeTrackingMethod < RuntimeMethod
9
+
10
+ #
11
+ # @param instance_tracking_variable The instance variable that contains each tracked event.
12
+ #
13
+ def initialize(instance_tracking_variable)
14
+ @line = MethodParameter.new
15
+ @statement_id = MethodParameter.new
16
+ @variables = MethodParameter.new
17
+ @action = MethodParameter.new
18
+ super( MethodUsage.new(@line,@statement_id,@variables,@action) )
19
+
20
+ # Add the statements that are used in the tracking method
21
+ self.push HackStatement.new(instance_tracking_variable.write+' = History.new if '+instance_tracking_variable.write+'.nil?')
22
+ x = instance_tracking_variable.write+".push(Step.new(
23
+ #{@line.write},
24
+ #{@statement_id.write},
25
+ #{@variables.write},
26
+ #{@action.write}
27
+ ))"
28
+ self.push HackStatement.new(x)
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,52 @@
1
+ # This class represents one of the steps inside a history object. It will look something
2
+ # like the following:
3
+ #
4
+ # {
5
+ # "variables"=>[
6
+ # {"id"=>3, "value"=>"Grim Fandang", "abs_id"=>-606538658, :uniq_id=>3},
7
+ # {"id"=>1, "value"=>"Grim Fandango", "abs_id"=>-606538498, :uniq_id=>2}
8
+ # ],
9
+ # "line"=>1,
10
+ # "statement_id"=>625,
11
+ # "action"=>"var='Grim Fandango'.chop"}
12
+ #
13
+ class Step < Hash
14
+
15
+ #
16
+ # @param variables TODO I'm not sure whether this should be the variables that have changed or just
17
+ # the ones available on this line. I think it is only the variables that change value.
18
+ #
19
+ def initialize(line,statement_id,variables,action)
20
+ super()
21
+ self['variables'] = variables
22
+ self['line'] = line
23
+ self['statement_id'] = statement_id
24
+ # TODO action can proably be dropped - or just replaced with statement.write - I don't
25
+ # think to_literal_string is useful.
26
+ self['action'] = action
27
+ end
28
+
29
+ # Returns the data for the variable thats id was specified.
30
+ #
31
+ # @param id The id of the variable thats id should be returned
32
+ #
33
+ def find_data_for_variable(id)
34
+ missing_variable = lambda { raise StandardError.new('Couldn\'t find information on variable '+id.to_s) }
35
+ return self['variables'].detect(missing_variable) {|x| x['id']==id}
36
+ end
37
+
38
+ def to_var(id=nil,uniq_id=nil)
39
+ # TODO I don't know if the the block is used anymore
40
+ return StepVariable.new(self,id) {{:variable_id => id,:uniq_id=>uniq_id}}
41
+ end
42
+
43
+ def copy
44
+ # TODO Don't use Marshal - do it properly
45
+ return Marshal.load(Marshal.dump(self))
46
+ end
47
+
48
+ def cauldron_method_calls
49
+ return ["['statement_id']"]
50
+ end
51
+
52
+ end
@@ -0,0 +1,76 @@
1
+
2
+ class ArrayVariable < TypeVariable
3
+ attr_reader :variable_id
4
+
5
+ # TODO Presumes that all parameters extends TypeVariable some are literals
6
+ def initialize(*parameters)
7
+ super(parameters)
8
+ parameters.each { |x| self.push(x) }
9
+ end
10
+
11
+ # TODO Temporary overwrite - I'm not sure how to apply select_all for array variables.
12
+ # When you write the variable it's var5 but it still contains addition variables.
13
+ def select_all(results=[],&block)
14
+ #results.push(self) if block.call(self)
15
+ return results
16
+ end
17
+
18
+ #TODO Write tests for all variables to maintain uniq_id_history
19
+ def copy
20
+ result = ArrayVariable.new(*self.collect {|x| x.copy} ) {{:variable_id => self.variable_id,:uniq_id=>@uniq_id,:uniq_id_history=>@uniq_id_history.copy}}
21
+ #result.variable_id = variable_id
22
+ result.instance_variable = @instance_variable
23
+ # TODO I need to check uniq_id for 'copy' accross all the variables
24
+ #result.uniq_id = @uniq_id
25
+ return result
26
+ end
27
+
28
+ def to_declaration
29
+ return VariableDeclaration.new('ArrayVariable',*@value.collect {|x| x.to_declaration})
30
+ end
31
+
32
+ # Only let this method be called from fellow Fixnum classes or Unknowns
33
+ def variable_id=(id)
34
+ # TODO This would be nicer if it wasn't so hard coded ./lib/core/variable/Unknown.rb
35
+ unless caller.first.split(':')[0]==__FILE__ or caller.first.split(':')[0]=='./lib/core/variable/Unknown.rb'
36
+ unless caller.first.split(':')[0]==__FILE__ or caller.first.split(':')[0]=='./lib/ruby_code/Array.rb'
37
+ raise StandardError.new('Illegal attempt to set variable_id')
38
+ end
39
+ end
40
+ @variable_id = id
41
+ end
42
+
43
+ # Returns an array of instance calls for the particular type
44
+ # variable. For example:
45
+ #
46
+ # StringVariable.new('test').instance_calls
47
+ #
48
+ # might return [var.chop,var.length]
49
+ #
50
+ def instance_calls(available=[])
51
+
52
+ # Add the chop instance call
53
+ results = []
54
+ results.push InstanceCallContainer.new(self.copy,ArrayLength.new)
55
+
56
+ # Attempt to create access calls - firstly with index
57
+ self.length.times do |i|
58
+ results.push ArrayAccess.new(self.copy,Literal.new(i))
59
+ end
60
+
61
+ return results
62
+
63
+ end
64
+
65
+ def to_literal_string
66
+ l = '['
67
+ self.each do |x|
68
+ l += x.to_literal_string
69
+ unless x.object_id == self.last.object_id
70
+ l += ','
71
+ end
72
+ end
73
+ l += ']'
74
+ end
75
+
76
+ end