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,60 @@
1
+ # This class represents the general descriptions used inside the three
2
+ # components of theories.
3
+ #
4
+ # TODO The statement class this extends is extremely bloated but I
5
+ # need to create some complex journeys before I can start to
6
+ # trim the fat.
7
+ #
8
+ class TheoryStatement < Statement
9
+
10
+ def initialize(*parameters)
11
+ super(*parameters)
12
+ end
13
+
14
+ # TODO map_to might replace the need for this method
15
+ # TODO How does this work for instance call containers and array access?
16
+ def replace_theory_variables!(mapping)
17
+ self.each_with_index do |x,i|
18
+ if x.kind_of?(TheoryVariable) && mapping.has_key?(x.theory_variable_id)
19
+ self[i] = mapping[x.theory_variable_id].copy
20
+ next
21
+ end
22
+ self[i].replace_theory_variables!(mapping) if self[i].respond_to?(:replace_theory_variables!)
23
+ end
24
+ end
25
+
26
+ # TODO This method was just nicked from TheoryDependent
27
+ # TODO A similar method exists in Statement
28
+ #
29
+ def map_to(mapping)
30
+
31
+ # Duplicate the current statement before it is rewritten
32
+ rewritten_statement = self.copy
33
+
34
+ # Find all the containers that contain TheoryVariables
35
+ # NOTE The statement is put in an array because select all doesn't include the array itself
36
+ containers = [rewritten_statement].select_all {|x| x.respond_to?(:has?)}
37
+ theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
38
+
39
+ # Rewrite the statement replacing the values
40
+ theory_variable_containers.each do |z|
41
+ z.replace_theory_variables!(mapping)
42
+ end
43
+
44
+ return rewritten_statement
45
+ #return TheoryDependent.new(rewritten_statement,@theory_component_id)
46
+ end
47
+
48
+ # TODO Maybe use a opject to handle the output of the statement.
49
+ def describe(tab=0)
50
+ line = ''
51
+ tab.times {line += "\t" }
52
+ self.each do |code|
53
+ line += code.describe
54
+ break if code.object_id == self.last.object_id
55
+ line += ' '
56
+ end
57
+ return line
58
+ end
59
+
60
+ end
@@ -0,0 +1,34 @@
1
+
2
+ #class TopologicalStatements
3
+ # include TSort
4
+ #
5
+ # def initialize
6
+ # @dependencies = {}
7
+ # end
8
+ #
9
+ # def add_dependency(task,*relies_on)
10
+ # @dependencies[task] = relies_on
11
+ # end
12
+ #
13
+ # def tsort_each_node(&block)
14
+ # @dependencies.each_key(&block)
15
+ # end
16
+ #
17
+ # def tsort_each_child(node,&block)
18
+ # deps = @dependencies[node]
19
+ # deps.each(&block) if deps
20
+ # end
21
+ #
22
+ #end
23
+
24
+ # See http://www.ruby-doc.org/stdlib/libdoc/tsort/rdoc/classes/TSort.html#M009366
25
+ class TopologicalStatements < Hash
26
+ include TSort
27
+
28
+ alias tsort_each_node each_key
29
+ def tsort_each_child(node, &block)
30
+ fetch(node).each(&block)
31
+ end
32
+
33
+
34
+ end
@@ -0,0 +1,49 @@
1
+ # Returns statements that declare new instances of the available classes
2
+ #
3
+ # Example:
4
+ # var_a = MethodUsage.new
5
+ # var_b = RuntimeMethod.new(var_a)
6
+ #
7
+ class DeclareNewInstanceStructure < StatementStructure
8
+
9
+ #
10
+ # @param available_classes Any number of class instances that can be used
11
+ # when generating statements, e.g. MethodUsageClass.new
12
+ #
13
+ def initialize(*available_classes)
14
+ super()
15
+ available_classes.each {|x| self.push(x)}
16
+ end
17
+
18
+ # Returns an array of instance declaration statements using
19
+ # the available variables.
20
+ #
21
+ # @param available An array of variables that are made available
22
+ # when declaring new statements.
23
+ #
24
+ def statements(available=[])
25
+
26
+ # Get all the various arrangements of parameters at all the lengths (capped at 5)
27
+ arrangements = [[]]
28
+
29
+ # Add one of each available variable
30
+ available.each do |x|
31
+ arrangements.push([x])
32
+ end
33
+
34
+ # For each arrangement create a new statement declaration
35
+ results = []
36
+
37
+ # Create a number of declaration statements using the method classes
38
+ # e.g. Unknown.new,Equal.new,ClassMethodCallContainer.new(MethodUsageClass.new,New.new)
39
+ self.each do |x|
40
+ x.class_method_calls(available).each do |y|
41
+ new_statement = Statement.new(Unknown.new,Equal.new,y)
42
+ results.push(new_statement)
43
+ end
44
+ end
45
+
46
+ return results
47
+ end
48
+
49
+ end
@@ -0,0 +1,34 @@
1
+ # TODO I think this structure has been super seeded by DeclareVariableAsVariableStructure
2
+ # Example - where the method_a returns a RuntimeMethod instance
3
+ #
4
+ # var_a = method_a()
5
+ #
6
+ class DeclareRuntimeMethodStructure < StatementStructure
7
+
8
+ def initialize()
9
+ super([Unknown,Equal,RuntimeMethodParameter])
10
+ end
11
+
12
+ # Returns an array of possible statements that can be created
13
+ # using the available variables. Currently the only way to
14
+ # create runtime method instances is via a separate runtime
15
+ # method call.
16
+ #
17
+ # @param available An array of variables that can be used to
18
+ # to create the statements that declared new
19
+ # runtime variables.
20
+ #
21
+ def statements(available=[])
22
+ return [] if available.empty?
23
+ def_calls = available.find_all {|x| x.kind_of?(DefCall)}
24
+ results = []
25
+ def_calls.each do |x|
26
+ if x.response.class == RuntimeMethodParameter
27
+ new_statement = Statement.new(Unknown.new,Equal.new,x.copy)
28
+ results.push(new_statement)
29
+ end
30
+ end
31
+ return results
32
+ end
33
+
34
+ end
@@ -0,0 +1,31 @@
1
+ #
2
+ # Example
3
+ #
4
+ # var = 6
5
+ # var = 'Shepard'
6
+ # var = []
7
+ #
8
+ class DeclareVariableAsLiteralStructure < StatementStructure
9
+
10
+ def initialize(*available_literals)
11
+ super([Unknown,Equal,Literal])
12
+ @available_literals = available_literals
13
+ end
14
+
15
+ # TODO Write tests for this
16
+ # Returns an array of possible statements that can be created
17
+ # given the variables supplied.
18
+ #
19
+ # @param available An array of possible variables that can be used to generate
20
+ # new statements. Although for this structure it is only
21
+ # interested in the literals.
22
+ #
23
+ def statements(available=[])
24
+ combined_available = @available_literals + available
25
+ return [] if combined_available.empty?
26
+ literals = combined_available.find_all {|x| x.kind_of?(Literal)}
27
+ results = literals.collect {|x| Statement.new(Unknown.new,Equal.new,x) }
28
+ return results
29
+ end
30
+
31
+ end
@@ -0,0 +1,52 @@
1
+ # NOTE: I'm not certain whether these types of strucutres are actually necessary
2
+ # but they did exist when I was using StatementStrucuture2.rb
3
+ #
4
+ # Example
5
+ #
6
+ # var_b = var_a
7
+ # var_c = var_b
8
+ # var_e = var_b.chop
9
+
10
+ class DeclareVariableAsVariableStructure < StatementStructure
11
+
12
+ def initialize()
13
+ super([Unknown,Equal,TypeVariable])
14
+ end
15
+
16
+ # Returns an array of statements constructed using the supplied
17
+ # variables.
18
+ #
19
+ def statements(available=[])
20
+ return [] if available.empty?
21
+ variables = available.select {|x| x.kind_of?(TypeVariable)}
22
+
23
+ # Generate all the possible direct variable declarations e.g. var_a = var_b
24
+ direct_declarations = variables.collect {|x| Statement.new(Unknown.new,Equal.new,x.copy)}
25
+
26
+ # Generate all the possible instance call declarations - I'm not sure if this will be used in this way
27
+ results = variables.collect do |x|
28
+ result = x.returning_instance_calls(available).collect do |y|
29
+ Statement.new(Unknown.new,Equal.new,y)
30
+ end
31
+ end
32
+
33
+ # TODO This seems a bit sloppy - I should do it in a nicer way
34
+ instance_call_declarations = []
35
+ results.each do |x|
36
+ x.each {|y| instance_call_declarations.push(y)}
37
+ end
38
+
39
+ # Find all the possible method calss
40
+ # TODO Write tests for this method call bit
41
+ # TODO This doesn't allow for parameters
42
+ available.each do |x|
43
+ if x.kind_of?(DefCall)
44
+ instance_call_declarations.push(Statement.new(Unknown.new,Equal.new,x.copy))
45
+ end
46
+ end
47
+
48
+ return direct_declarations.concat(instance_call_declarations)
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,56 @@
1
+ # Example
2
+ # e.g. var_a = var_b + var_c
3
+ #
4
+ class FixnumAdditionStructure < StatementStructure
5
+
6
+ def initialize()
7
+ super([Unknown,Equal,FixnumVariable,Addition,FixnumVariable])
8
+ end
9
+
10
+ # Returns an array of statements using the available variables that
11
+ # follow the structure var = 8 + 6
12
+ #
13
+ # @param available An array of runtime variables that can be used in the statements
14
+ # construction.
15
+ #
16
+ def statements(available=[])
17
+
18
+ # If there aren't any fixnum variables there is nothing to return
19
+ return [] unless available.any? {|x| x.pass_as?(FixnumVariable)}
20
+
21
+ # First find just varaibles that can pass as FixnumVariables
22
+ # NOTE: Currently I am not allowing method calls to be used
23
+ fixnum_variables = available.find_all {|x| x.pass_as?(FixnumVariable) and !x.kind_of?(DefCall)}
24
+
25
+ # Using the variables constuct statements
26
+ possible_statements = []
27
+ fixnum_variables.length.times do |x|
28
+ fixnum_variables.length.times do |y|
29
+ new_statement = Statement.new(Unknown.new,Equal.new,fixnum_variables[x].copy,Addition.new,fixnum_variables[y].copy)
30
+ #new_statement.statement_type = DECLARATION_STATEMENT
31
+ possible_statements.push(new_statement)
32
+ end
33
+ end
34
+
35
+ # Remove mirror statements - these are additions that are essentially the
36
+ # same statement written backwards.
37
+ # e.g. var_c = var_a+var_b
38
+ # var_d = var_b+var_a
39
+ possible_statements.copy.each do |x|
40
+ possible_statements.copy.each do |y|
41
+ next if x.statement_id == y.statement_id
42
+ if y.same_not_declared_variables?(x)
43
+
44
+ # If the first variable id is lower than the secound remove it.
45
+ if y[2].variable_id < y[4].variable_id
46
+ possible_statements.delete_if {|z| z.statement_id == y.statement_id}
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ return possible_statements
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,50 @@
1
+ # Example
2
+ # e.g. 'test'.chop
3
+ # e.g. 'test'.chop!
4
+ #
5
+ class InstanceCallContainerStructure < StatementStructure
6
+
7
+ def initialize()
8
+ super()
9
+ end
10
+
11
+ # Returns an array of possible statements that make an instance
12
+ # call. They don't declare a new variables so to be in any way
13
+ # relevant they must be destructive e.g.
14
+ #
15
+ # 'test'.chop # essential does nothing
16
+ # 'test'.chop! # Changes the value ('test' represents a variable with that value)
17
+ #
18
+ def statements(available=[])
19
+
20
+ # Exclude method calls for now - avoiding too complex statements
21
+ available.delete_if {|x| x.kind_of?(DefCall)}
22
+
23
+ # Go through each method call available to each of the variables
24
+ results = []
25
+ available.copy.each do |subject_var|
26
+
27
+ # Duplicate the available variables and exclude the current one
28
+ # to avoid less predicatable statements.
29
+ current_available = available.copy.delete_if do |x|
30
+ unless(x.kind_of?(Variable) and subject_var.kind_of?(Variable))
31
+ next false
32
+ end
33
+ x.variable_id == subject_var.variable_id
34
+ end
35
+
36
+ # Create statements that use the specified instance calls
37
+ subject_var.destructive_instance_calls(current_available).each do |inst_call|
38
+ new_statement = Statement.new(inst_call)
39
+
40
+ # TODO I'm not sure if all the instance calls are modifying - I should may have a StatementTemplate
41
+ # class that foces the {:review} to be false.
42
+ #new_statement.statement_type = MODIFYING_STATEMENT
43
+ results.push(new_statement)
44
+ end
45
+ end
46
+
47
+ return results
48
+ end
49
+
50
+ end
@@ -0,0 +1,53 @@
1
+ # TODO I think this class might have been replaced with InstanceCallContainerStructure
2
+ class InstanceCallStructure < Array
3
+ attr_reader :instance_class, :method_call
4
+
5
+ #
6
+ # @param instance_class The class of the instance that should be called e.g. StringVariable
7
+ # @param method_call An instance of the method_call
8
+ # @param parameters The parameters that the instance method call excepts
9
+ #
10
+ def initialize(instance_class,method_call,*parameters)
11
+ # TODO What are the two parameters an array expects
12
+ super()
13
+
14
+ # Declare the elements that make up the instance call
15
+ @instance_class = instance_class
16
+ @method_call = method_call
17
+
18
+ # Add the parameters to the array
19
+ parameters.each do |code|
20
+ self.push(code)
21
+ end
22
+ end
23
+
24
+ #
25
+ def instance_calls(available=[])
26
+
27
+ # Create an array of potential instance calls
28
+ potential_instance_calls = []
29
+
30
+ # Find a variable thats class is @instance_class
31
+ available.each do |avail|
32
+
33
+ if avail.class == @instance_class
34
+
35
+ # We have a possible instance class
36
+ # TODO Try with class and method call mismatch
37
+ if self.length == 0
38
+ potential_instance_calls.push(InstanceCallContainer.new(avail.copy,@method_call.copy))
39
+ next
40
+ end
41
+
42
+ # Retrieve appropriate values for each of the intance calls parameters
43
+
44
+
45
+ end
46
+
47
+ end
48
+
49
+ return potential_instance_calls
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,21 @@
1
+ # This a generic structure that can be used to create any number of
2
+ # instance method calls. For example if it was meant to represent
3
+ # an array instance it might be able to produce the statement:
4
+ #
5
+ # array.push(some_value)
6
+ #
7
+ # TODO This might duplicate the functionality of the InstanceCallContainerStructure
8
+ # although I can't remember what I created that for.
9
+ #
10
+ class InstanceMethodCallStructure < StatementStructure
11
+
12
+ #
13
+ # @param instance_class The class of the instance that has a method call
14
+ # @param method_call A method call instance that can be called from
15
+ # instances of the supplied instance_class.
16
+ #
17
+ def initialize(instance_class,method_call)
18
+
19
+ end
20
+
21
+ end