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,146 @@
1
+
2
+ require 'required'
3
+ require 'test/unit'
4
+
5
+ class TestStatementDependencies < Test::Unit::TestCase
6
+
7
+ def setup
8
+
9
+ #
10
+ # var_a = 'Wally'.chop
11
+ # var_b = var_a.length
12
+ # var_c = var_a.chop
13
+
14
+ # Create some statements with dependencies
15
+ @wally = Literal.new('Wally')
16
+ @chopped_wally = Unknown.new
17
+ @chop_wally = Statement.new(@chopped_wally,Equal.new,InstanceCallContainer.new(@wally,Chop.new))
18
+ @chopped_length = Unknown.new
19
+ @chop_length = Statement.new(@chopped_length,Equal.new,InstanceCallContainer.new(@chopped_wally,StringLength.new))
20
+ @wall = Unknown.new
21
+ @statement_c = Statement.new(@wall,Equal.new,InstanceCallContainer.new(@chopped_wally,Chop.new))
22
+ @hermot = Literal.new('Hermot')
23
+ @hermot_var = Unknown.new
24
+ @declared_hermot = Statement.new(@hermot_var,Equal.new,@hermot)
25
+ @hermo_wall = Unknown.new
26
+ @hermo_wall_statement = Statement.new(@hermo_wall,Equal.new,InstanceCallContainer.new(@hermot_var,Chop.new),Addition.new,InstanceCallContainer.new(@chopped_wally,Chop.new))
27
+
28
+ # This statement uses variables that haven't been declared in a statement
29
+ @bad_statement = Statement.new(Unknown.new,Equal.new,InstanceCallContainer.new(StringVariable.new('badboy'),Chop.new))
30
+
31
+ # Chopping wall
32
+ @wal = Unknown.new
33
+ @statement_d = Statement.new(@wal,Equal.new,InstanceCallContainer.new(@wall,Chop.new))
34
+
35
+ # Create a simple set of statement dependencies that use params
36
+ # var_a = MethodUsage.new
37
+ # var_b = RuntimeMethod.new(var_a)
38
+ @dependency_set_1 = StatementDependencies.new
39
+ @var_a = Unknown.new
40
+ @var_b = Unknown.new
41
+ @statement_a = Statement.new(@var_a,Equal.new,ClassMethodCallContainer.new(MethodUsageClass.new,New.new))
42
+ @statement_b = Statement.new(@var_b,Equal.new,ClassMethodCallContainer.new(RuntimeMethodClass.new,New.new,@var_a))
43
+ @dependency_set_1.push(@statement_a)
44
+ @dependency_set_1.push(@statement_b)
45
+
46
+
47
+ end
48
+
49
+ def teardown
50
+ System.reset
51
+ end
52
+
53
+ def test_push
54
+
55
+ # Check statements can be added
56
+ statement_depenencies = StatementDependencies.new(@chop_wally)
57
+ assert_equal(1,statement_depenencies.length)
58
+
59
+ # Check pushing new statements
60
+ statement_depenencies.push(@chop_length)
61
+ assert_equal(2,statement_depenencies.length)
62
+
63
+ # Check that an error is thrown if the statement dependencies can't be found
64
+ assert_raises(StandardError){statement_depenencies.push(@bad_statement)}
65
+
66
+ # Here we are check depenceys are found for statements with multiple variables in
67
+
68
+
69
+ end
70
+
71
+ def test_dependencies_for
72
+
73
+ statement_depenencies = StatementDependencies.new()
74
+ # hermot = 'Hermot'
75
+ statement_depenencies.push(@declared_hermot)
76
+
77
+ # This statement shouldn't have any depenencies
78
+ assert_equal(1,statement_depenencies.dependencies_for(@declared_hermot.statement_id).length)
79
+
80
+ # Add a statement dependent on the first statement
81
+ # chopped_wally = 'Wally'.chop
82
+ statement_depenencies.push(@chop_wally)
83
+ assert_equal(1,statement_depenencies.dependencies_for(@chop_wally.statement_id).length)
84
+ statement_chop_chop_wally = Statement.new(Unknown.new,Equal.new,InstanceCallContainer.new(@chopped_wally,Chop.new))
85
+ statement_depenencies.push(statement_chop_chop_wally)
86
+ assert_equal(2,statement_depenencies.dependencies_for(statement_chop_chop_wally.statement_id).length)
87
+
88
+ # Now add a string+string statement that uses the above statement
89
+ statement_depenencies.push(@hermo_wall_statement)
90
+ assert_equal(3,statement_depenencies.dependencies_for(@hermo_wall_statement.statement_id).length)
91
+
92
+ assert_equal(1,@dependency_set_1.dependencies_for(@statement_a.statement_id).length)
93
+ assert_equal(@statement_a.statement_id,@dependency_set_1.dependencies_for(@statement_a.statement_id).first)
94
+ assert_equal(2,@dependency_set_1.dependencies_for(@statement_b.statement_id).length)
95
+
96
+ # Create the statement with dependencies
97
+ statement_depenencies = StatementDependencies.new(@chop_wally,@chop_length,@statement_c)
98
+
99
+ # Find the needed variables for the statements
100
+ assert_equal(1,@chop_length.not_declared_variables.length)
101
+
102
+ # First statement doesn't have any dependecies
103
+ assert_equal(1,statement_depenencies.dependencies_for(@chop_wally.statement_id).length)
104
+
105
+ # The secound statement has one dependency
106
+ assert_equal(2,statement_depenencies.dependencies_for(@chop_length.statement_id).length)
107
+ assert_equal(@chop_wally.statement_id,statement_depenencies.dependencies_for(@chop_length.statement_id).first)
108
+
109
+ # The third statement also only has one dependency
110
+ assert_equal(@chop_wally.statement_id,statement_depenencies.dependencies_for(@statement_c.statement_id).first)
111
+
112
+ # Add a fourth statement with 2 dependencies 'Wally' then 'Wall'
113
+ statement_depenencies.push(@statement_d)
114
+ assert_equal(3,statement_depenencies.dependencies_for(@statement_d.statement_id).length)
115
+
116
+ # Check that an error is raised when looking for depencies for a variable that doesn't exist
117
+ assert_raises(StandardError){statement_depenencies.dependencies_for(@bad_statement.statement_id)}
118
+
119
+ end
120
+
121
+ def test_find_dependencies_for
122
+ assert_equal(0,@dependency_set_1.find_dependencies_for(@statement_a).length)
123
+ assert_equal(1,@dependency_set_1.find_dependencies_for(@statement_b).length)
124
+
125
+ # Check that dependies are found for modified statements
126
+ # var_a = 8
127
+ # var_b = []
128
+ # var_b.push(9)
129
+ # var_b.push(10)
130
+ statement_a_1 = Statement.new(Unknown.new,Equal.new,8.to_literal)
131
+ statement_a_2 = Statement.new(Unknown.new,Equal.new,[].to_literal)
132
+ statement_a_3 = Statement.new(InstanceCallContainer.new(statement_a_2.first.copy,Push.new,9.to_literal))
133
+ statement_a_4 = Statement.new(InstanceCallContainer.new(statement_a_3.first.subject.copy,Push.new,10.to_literal))
134
+ runtime_a = RuntimeMethod.new(MethodUsage.new)
135
+ runtime_a.push(statement_a_1)
136
+ runtime_a.push(statement_a_2)
137
+ runtime_a.push(statement_a_3)
138
+ runtime_a.push(statement_a_4)
139
+
140
+ # Realise the method and add each of statements
141
+ assert_nothing_raised(){runtime_a.realise2(ParametersContainer.new)}
142
+
143
+
144
+ end
145
+
146
+ end
@@ -0,0 +1,35 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestStatementGroup < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ end
9
+
10
+ def teardown
11
+ System.reset
12
+ RuntimeMethod.reset_global_id
13
+ end
14
+
15
+ def test_find_all_required_runtime_methods
16
+
17
+ # 1. Find all the runtime methods in a statement group with two statements in
18
+ # a. Create both statements and methods used in the statement group
19
+ method_1 = RuntimeMethod.new(MethodUsage.new)
20
+ method_2 = RuntimeMethod.new(MethodUsage.new)
21
+ statement_1 = Statement.new(Unknown.new,Equal.new,DefCall.new(nil.to_var,method_1))
22
+ statement_2 = Statement.new(Unknown.new,Equal.new,DefCall.new(nil.to_var,method_2))
23
+
24
+ # b. Create the statement group with the runtime methods and check that both
25
+ # runtime methods are retrieved.
26
+ statement_group_1 = StatementGroup.new(statement_1,statement_2)
27
+ assert_equal(2,statement_group_1.find_all_required_runtime_methods.length)
28
+ statement_group_1.find_all_required_runtime_methods.each do |x|
29
+ assert(x.kind_of?(RuntimeMethod))
30
+ end
31
+
32
+ end
33
+
34
+
35
+ end
@@ -0,0 +1,61 @@
1
+ # This test case tests the direct replacement of a variable within a statement.
2
+
3
+ require 'required'
4
+ require 'test/unit'
5
+
6
+ class TestStatementReplaceVariable < Test::Unit::TestCase
7
+
8
+ def setup
9
+
10
+ end
11
+
12
+ def teardown
13
+ System.reset
14
+ RuntimeMethod.reset_global_id
15
+ end
16
+
17
+ def test_variable_replacement_with_statement_with_three_variables
18
+
19
+ # Create the statement to be tested
20
+ var_A = Unknown.new
21
+ var_B = Unknown.new
22
+ var_C = Unknown.new
23
+ statement = Statement.new(var_C,Equal.new,var_A,Addition.new,var_B)
24
+ assert_nothing_raised(){statement.write}
25
+
26
+ # Check that the variable id in the statement matches
27
+ assert_equal(var_A.variable_id,statement[2].variable_id)
28
+
29
+ # Replace the variable in the statement
30
+ var_D = Unknown.new
31
+ assert_nothing_raised(){statement.replace_variable!(var_A.variable_id,var_D)}
32
+
33
+ # Check that the statement has been updated
34
+ assert_not_equal(var_A.variable_id,statement[2].variable_id)
35
+ assert_equal(var_D.variable_id,statement[2].variable_id)
36
+
37
+ end
38
+
39
+ def test_instance_call_replacement
40
+
41
+ # Create the statement with the instance call
42
+ var_A = Unknown.new
43
+ var_B = 'test'.to_var
44
+ statement = Statement.new(var_A,Equal.new,InstanceCallContainer.new(var_B,Chop.new))
45
+ assert_nothing_raised(){statement.write}
46
+
47
+ # Check that the variable id in the statement matches
48
+ assert_equal(var_B.variable_id,statement[2].variable_id)
49
+
50
+ # Replace var_B with variable C
51
+ var_C = 'scentilla'.to_var
52
+ assert_nothing_raised(){statement.replace_variable!(var_B.variable_id,var_C)}
53
+
54
+ # Check that the statement is still valid
55
+ assert(statement[2].kind_of?(InstanceCallContainer))
56
+ assert_equal(var_C.variable_id,statement[2].variable_id)
57
+ assert(statement[2].subject.kind_of?(Variable))
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,51 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestTheoryStatement < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @statement_1 = StringToTheory.run("var8 = 7")
8
+ end
9
+
10
+ def teardown
11
+ System.reset
12
+ RuntimeMethod.reset_global_id
13
+ end
14
+
15
+ def test_copy
16
+ assert(@statement_1.copy.kind_of?(TheoryStatement))
17
+ end
18
+
19
+ def test_select_all
20
+ assert_equal(
21
+ 3,
22
+ StringToTheory.run(
23
+ 'var1.realise2(var3).params[0].value.length == var2.length'
24
+ ).select_all {|x| x.kind_of?(TheoryVariable)}.length
25
+ )
26
+ end
27
+
28
+ # Using:
29
+ # if((var1.params[var3].length == var1) == false)
30
+ # return true
31
+ # end
32
+ #
33
+ def test_replace_theory_variables_with_case_1
34
+ theory = TheoryStatement.new(
35
+ StringToTheory.run("if((var1.params[var3].length == var1) == false)\nreturn true\nend")
36
+ )
37
+
38
+ # Create the intrinsic mapping for the theory
39
+ mapping = Mapping.new
40
+ mapping[1] = Parser.run('runtime_method')
41
+ mapping[3] = IntrinsicLiteral.new(0)
42
+
43
+ assert_equal(
44
+ "if((runtime_method.params[0].length == runtime_method) == false)\n\treturn true\nend",
45
+ theory.replace_theory_variables!(mapping).write
46
+ )
47
+
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,41 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestDeclareNewInstanceStructure < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ # Create the structure instance that generates the appropriate statement
9
+ @statement_generator = DeclareNewInstanceStructure.new(MethodUsageClass.new,RuntimeMethodClass.new)
10
+
11
+ end
12
+
13
+ def teardown
14
+ System.reset
15
+ end
16
+
17
+ def test_statements
18
+
19
+ # Test that "var = MethodUsage.new" can be created
20
+ assert_equal(true,@statement_generator.statements().all? {|x| x.kind_of?(Statement)})
21
+ assert_equal(true,(@statement_generator.statements().select_all {|x| x.kind_of?(MethodUsageClass) }.length > 0))
22
+
23
+ # Test that "var = RuntimeMethod.new(<#method_usage>")
24
+ method_usage = MethodUsageVariable.new()
25
+ assert_equal(1,@statement_generator.statements([method_usage]).select_all {|x| x.kind_of?(RuntimeMethodClass)}.length)
26
+
27
+ # Test that a statement that declares a new fixnum as variable can be created
28
+ new_statement_statement_generator = DeclareNewInstanceStructure.new(StatementClass.new)
29
+ assert_equal(
30
+ 1,
31
+ new_statement_statement_generator.statements([5.to_literal]).select_all {|x| x.kind_of?(StatementClass)}.length
32
+ )
33
+ assert_equal(
34
+ 'var_6 = Statement.new(Unknown.new, Equal.new, 5.to_declaration)',
35
+ new_statement_statement_generator.statements([5.to_literal]).first.write
36
+ )
37
+
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,41 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestDeclareVariableAsLiteralStructure < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ # Create the structure instance that generates the appropriate statement
9
+ @statement_generator = DeclareVariableAsLiteralStructure.new
10
+
11
+
12
+ end
13
+
14
+ def teardown
15
+ CodeHandler.reset_global_id
16
+ System.reset
17
+ RuntimeMethod.reset_global_id
18
+ end
19
+
20
+ def test_statements
21
+
22
+ # Test that "var = 7" can be created
23
+ assert_equal(true,@statement_generator.statements([7.to_literal]).all? {|x| x.kind_of?(Statement)})
24
+ assert_equal(1,@statement_generator.statements([7.to_literal]).length)
25
+ assert_equal('var_2 = 7',@statement_generator.statements([7.to_literal]).first.write())
26
+
27
+ # Test that "var = 8", "var = 'Grogg'" and 'var = []'
28
+ assert_equal(true,
29
+ @statement_generator.statements([
30
+ 8.to_literal,'Grogg'.to_literal,[].to_literal
31
+ ]).all? {|x| x.kind_of?(Statement)}
32
+ )
33
+ assert_equal(true,
34
+ @statement_generator.statements([
35
+ 8.to_literal,'Grogg'.to_literal,[].to_literal
36
+ ]).contains? {|x| x.kind_of?(Literal)}
37
+ )
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,66 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestDeclareVariableAsVariableStructure < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ # Create the structure instance that generates the appropriate statement
9
+ @statement_generator = DeclareVariableAsVariableStructure.new
10
+
11
+ # Create some simple variable declarations
12
+ @fixnum_variable = FixnumVariable.new(8)
13
+ @manny_variable = StringVariable.new('manny')
14
+
15
+ end
16
+
17
+ def teardown
18
+ System.reset
19
+ end
20
+
21
+ def test_statements
22
+
23
+ # Test that "var = var(8)" can be created
24
+ assert_equal(1,@statement_generator.statements([@fixnum_variable]).length)
25
+ assert(@statement_generator.statements([@fixnum_variable]).first.kind_of?(Statement))
26
+ assert_equal(@statement_generator.length,@statement_generator.statements([@fixnum_variable]).first.length)
27
+
28
+ assert_equal(3,@statement_generator.statements([@manny_variable]).length)
29
+ assert_equal(0,@statement_generator.statements([]).length)
30
+
31
+ # Attempt to generate structures that generate string variables
32
+ assert_equal(3,@statement_generator.statements([@manny_variable]).length)
33
+
34
+ # Attempt to generate a string+string statement
35
+ le = 'Le'.to_var
36
+ chuck = 'Chuck'.to_var
37
+ assert_equal(6,@statement_generator.statements([le,chuck]).length)
38
+
39
+ # Test that declared variables can be retrieved from statement variabies
40
+ # e.g. var = statement_var.declared_variable
41
+ statement_var_a_unknown = Unknown.new
42
+ statement_var_a = Statement.new(statement_var_a_unknown,Equal.new,8.to_literal).to_var
43
+ # TODO I'm not sure I should allow the re-dclaration of variables here
44
+ assert_equal(2,@statement_generator.statements([statement_var_a]).length)
45
+ assert_equal(
46
+ ' = var_'+statement_var_a.variable_id.to_s+'.declared_variable',
47
+ @statement_generator.statements([statement_var_a]).last.write[6..35]
48
+ )
49
+
50
+ # Check that the 'push' method isn't used in statement declarations
51
+ # Otherwise we generate allot of redundant variables.
52
+ # e.g.
53
+ # var_a = ['test','asdf']
54
+ # var_b = var_a.push('test2')
55
+ #
56
+ # var_a and var_b are essentially the same variable.
57
+ options_a = [
58
+ Statement.new(Return.new,6.to_literal).to_var,
59
+ RuntimeMethod.new(MethodUsage.new).to_var
60
+ ]
61
+ assert_equal(3,@statement_generator.statements(options_a).length)
62
+
63
+ end
64
+
65
+ end
66
+