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
+ class MethodUsageVariable < BaseVariable
2
+
3
+ def initialize(*parameters)
4
+ super()
5
+ raise StandardError.new('Only submit the paramaters on the usage variable') if parameters.first.kind_of?(MethodUsage)
6
+ # Go through each paramater in the method usage instance
7
+ parameters.each do |x|
8
+ self.push x.copy
9
+ end
10
+
11
+ end
12
+
13
+ def to_declaration
14
+ return VariableDeclaration.new('MethodUsageVariable',*self.collect {|x| x.to_declaration})
15
+ end
16
+
17
+ def copy
18
+ result = MethodUsageVariable.new(*self.collect {|x| x.copy}) {{:variable_id => self.variable_id,:uniq_id=>@uniq_id, :uniq_id_history=>@uniq_id_history.copy}}
19
+ return result
20
+ end
21
+
22
+ # # Only let this method be called from fellow Fixnum classes or Unknowns
23
+ # def variable_id=(id)
24
+ # # TODO This would be nicer if it wasn't so hard coded ./lib/core/variable/Unknown.rb
25
+ # unless caller.first.split(':')[0]==__FILE__ or caller.first.split(':')[0]=='./lib/core/variable/Unknown.rb'
26
+ # raise StandardError.new('Illegal attempt to set variable_id')
27
+ # end
28
+ # @variable_id = id
29
+ # end
30
+
31
+ # TODO Test this
32
+ def to_literal_string
33
+ l = 'MethodUsage.new('
34
+ self.each do |x|
35
+ l += x.to_literal_string
36
+ unless x.object_id == self.last.object_id
37
+ l += ','
38
+ end
39
+ end
40
+ l += ')'
41
+ return l
42
+ end
43
+
44
+ # TODO Write tests
45
+ # Compares the passed argument and returns true if they are
46
+ # the same class and contains the same values.
47
+ #
48
+ def equivalent?(to)
49
+ return false if to.class != self.class
50
+ to.zip(self) do |x,y|
51
+ return false unless x.equivalent?(y)
52
+ end
53
+ return true
54
+ end
55
+
56
+ def destructive_instance_calls(with=[])
57
+ return []
58
+ end
59
+
60
+ end
@@ -0,0 +1,29 @@
1
+ class NilVariable < TypeVariable
2
+
3
+ def initialize(id=nil)
4
+ super(nil)
5
+ end
6
+
7
+ def copy
8
+ copied = NilVariable.new {{:variable_id => self.variable_id,:uniq_id=>@uniq_id, :uniq_id_history=>@uniq_id_history.copy}}
9
+ #copied.variable_id = self.variable_id
10
+ return copied
11
+ end
12
+
13
+ # Only let this method be called from fellow NilVariable classes
14
+ def variable_id=(id)
15
+ unless caller.first.split(':')[0]==__FILE__
16
+ raise StandardError.new('Illegal attempt to set variable_id')
17
+ end
18
+ @variable_id = id
19
+ end
20
+
21
+ def realised?
22
+ return true
23
+ end
24
+
25
+ def to_declaration
26
+ return VariableDeclaration.new(self.class.to_s,nil.to_declaration)
27
+ end
28
+
29
+ end
@@ -0,0 +1,67 @@
1
+ class RuntimeMethodParameter < TypeVariable
2
+
3
+ def initialize(val)
4
+ super(val)
5
+ end
6
+
7
+ # def copy
8
+ # copied = self.class.new(@value)
9
+ # copied.variable_id = self.variable_id
10
+ # return copied
11
+ # end
12
+ #
13
+ # Only let this method be called from fellow Fixnum classes or Unknowns
14
+ def variable_id=(id)
15
+ # TODO I need a better way to restrict access to this
16
+ # TODO This would be nicer if it wasn't so hard coded ./lib/core/variable/Unknown.rb
17
+ #unless caller.first.split(':')[0]==__FILE__ or caller.first.split(':')[0]=='./lib/core/variable/Unknown.rb'
18
+ # raise StandardError.new('Illegal attempt to set variable_id')
19
+ #end
20
+ @variable_id = id
21
+ end
22
+
23
+ # Returns an array of instance calls that are possible given the
24
+ # provided variables.
25
+ #
26
+ # @param available
27
+ #
28
+ def instance_calls(available=[],used_in_declaration_statement=false)
29
+ results = []
30
+
31
+ # Create runtime_method.push(runtime_value)
32
+ ## Find all the statement variables
33
+ available.find_all {|x| x.kind_of?(StatementVariable)}.each do |y|
34
+ #results.push(InstanceCallContainer.new(self.copy,PushStatement.new,y.copy))
35
+ # TODO What is PushStatement for
36
+ results.push(InstanceCallContainer.new(self.copy,Push.new,y.copy))
37
+ end
38
+ return results
39
+ end
40
+
41
+ # Returns an array of instances calls that return a value and are
42
+ # therefore approriate for declaration statements.
43
+ #
44
+ # NOTE Although .push does return a value I have excluded it because
45
+ # I want to limit the number of variables declared.
46
+ #
47
+ def returning_instance_calls(available)
48
+ return []
49
+ end
50
+
51
+ # Returns an array of desctructive instance calls given the available
52
+ # variables.
53
+ #
54
+ # @param available An array of other variables that can be used as
55
+ # parameters.
56
+ #
57
+ def destructive_instance_calls(available=[])
58
+ return instance_calls(available)
59
+ end
60
+
61
+ # # Returns a declaration variable for this runtime method variable.
62
+ # #
63
+ # def to_declaration
64
+ # return VariableDeclaration.new(RuntimeMethodParameter)
65
+ # end
66
+
67
+ end
@@ -0,0 +1,72 @@
1
+ class StatementVariable < TypeVariable
2
+
3
+ def initialize(val)
4
+ super(val)
5
+ end
6
+
7
+ def copy
8
+ copied = self.class.new(@value.copy) {{:variable_id => self.variable_id,:uniq_id=>@uniq_id, :uniq_id_history=>@uniq_id_history.copy}}
9
+ copied.variable_id = self.variable_id
10
+ return copied
11
+ end
12
+
13
+ # Only let this method be called from fellow Fixnum classes or Unknowns
14
+ def variable_id=(id)
15
+ # TODO This would be nicer if it wasn't so hard coded ./lib/core/variable/Unknown.rb
16
+ unless caller.first.split(':')[0]==__FILE__ or caller.first.split(':')[0]=='./lib/core/statement/Statement.rb'
17
+ raise StandardError.new('Illegal attempt to set variable_id')
18
+ end
19
+ @variable_id = id
20
+ end
21
+
22
+ # Returns a copy of the variable, this method exists in the
23
+ # instance call class. It avoids distinguishing the two.
24
+ # Since variale is lowest level context doesn't matter.
25
+ #
26
+ def copy_contextual_variable
27
+ return copy
28
+ end
29
+
30
+ # Returns an array of instance calls the Statement instances can call. Some
31
+ # method calls require parameters. These parameters are in the available
32
+ # array.
33
+ #
34
+ # @param available An array of variables to be included in the creation
35
+ # of the InstanceCallContainer.
36
+ #
37
+ def instance_calls(available=[])
38
+ declared_variable_call = InstanceCallContainer.new(self.copy,DeclaredVariable.new)
39
+ return [declared_variable_call]
40
+ end
41
+
42
+ # Returns an array of instances calls that return a value and are
43
+ # therefore approriate for declaration statements.
44
+ #
45
+ def returning_instance_calls(available=[])
46
+ return instance_calls(available)
47
+ end
48
+
49
+ #
50
+ def destructive_instance_calls(available=[])
51
+ return []
52
+ end
53
+
54
+ # Compares the passed argument and returns true if it is a unknown
55
+ # variable which is treated as a wild card or a variable with
56
+ # the same value.
57
+ #
58
+ # TODO I'm not sure I like UnkownVariables being treated as wild cards
59
+ #
60
+ def equivalent?(to)
61
+ return true if to.kind_of?(Unknown)
62
+ return false if to.class != self.class
63
+ # TODO I don't know if this is an equivalent comparision
64
+ return false unless to.value.write == @value.write
65
+ return true
66
+ end
67
+
68
+ # def to_var
69
+ # raise StandardError.new('Already a variable')
70
+ # end
71
+
72
+ end
@@ -0,0 +1,7 @@
1
+ class StepVariable < TypeVariable
2
+
3
+ def initialize(val,id=nil)
4
+ super(val,id)
5
+ end
6
+
7
+ end
@@ -0,0 +1,46 @@
1
+ class StringVariable < TypeVariable
2
+
3
+ def initialize(val,id=nil)
4
+ super(val,id)
5
+ end
6
+
7
+ # Returns an array of instance calls for the particular type
8
+ # variable. For example:
9
+ #
10
+ # StringVariable.new('test').instance_calls
11
+ #
12
+ # might return [var.chop,var.length]
13
+ #
14
+ def instance_calls(available=[])
15
+
16
+ # Add the chop instance call
17
+ chop_call = InstanceCallContainer.new(self.copy,Chop.new)
18
+ length_call = InstanceCallContainer.new(self.copy,StringLength.new)
19
+ return [chop_call,length_call]
20
+
21
+ end
22
+
23
+ def to_declaration
24
+ return VariableDeclaration.new(self.class.to_s,@value.to_declaration)
25
+ end
26
+
27
+ def to_literal_string
28
+ return @value.to_literal_string
29
+ end
30
+
31
+ # TODO I wan't to get rid of this call entirly
32
+ def copy_contextual_variable
33
+ return copy
34
+ end
35
+
36
+ # Returns an array of desctructive instance calls given the available
37
+ # variables.
38
+ #
39
+ # @param available An array of other variables that can be used as
40
+ # parameters.
41
+ #
42
+ def destructive_instance_calls(available=[])
43
+ return []
44
+ end
45
+
46
+ end
@@ -0,0 +1,72 @@
1
+ # This variable doesn't represent a specific data type it is merely the parent
2
+ # of all the other typed variables e.g. FixnumVariable, StringVariable etc.
3
+ #
4
+ class TypeVariable < BaseVariable
5
+ attr_reader :value
6
+
7
+ def initialize(val,id=nil)
8
+ @value = val
9
+ super(id)
10
+ end
11
+
12
+ def copy
13
+ copied = self.class.new(@value.copy) {{:variable_id => self.variable_id,:uniq_id=>@uniq_id, :uniq_id_history=>@uniq_id_history.copy}}
14
+ copied.instance_variable = @instance_variable
15
+ return copied
16
+ end
17
+
18
+ # Only let this method be called from fellow Fixnum classes or Unknowns
19
+ # NOTE I have allowed variable ids to be set to allow runtime methods to change
20
+ # the id of passed variables.
21
+ def variable_id=(id)
22
+ # TODO This would be nicer if it wasn't so hard coded ./lib/core/variable/Unknown.rb
23
+ # unless caller.first.split(':')[0]==__FILE__ or caller.first.split(':')[0]=='./lib/core/variable/Unknown.rb'
24
+ # raise StandardError.new('Illegal attempt to set variable_id')
25
+ # end
26
+ @variable_id = id
27
+ end
28
+
29
+ def literalisable?
30
+ return true
31
+ end
32
+
33
+ def literalise
34
+ return Literal.new(@value.copy)
35
+ end
36
+
37
+ def realised?
38
+ return true unless @value.nil?
39
+ return false
40
+ end
41
+
42
+ def to_literal_string
43
+ return @value.to_literal_string
44
+ end
45
+
46
+ def describe(tab=0)
47
+ l = ''
48
+ tab.times {|x| l += "/t" }
49
+ l += '['+self.class.to_s+'] '+@value.write
50
+ l += "\n"
51
+ return l
52
+ end
53
+
54
+
55
+ def cauldron_method_calls
56
+ return ['.value']
57
+ end
58
+
59
+ # Compares the passed argument and returns true if it is a unknown
60
+ # variable which is treated as a wild card or a variable with
61
+ # the same value.
62
+ #
63
+ # TODO I'm not sure I like UnkownVariables being treated as wild cards
64
+ #
65
+ def equivalent?(to)
66
+ return true if to.kind_of?(Unknown)
67
+ return false if to.class != self.class
68
+ return false unless to.value == @value
69
+ return true
70
+ end
71
+
72
+ end
@@ -0,0 +1,116 @@
1
+ #require $LOC+File.join(['lib','core','variable','Variable'])
2
+ # TODO This is not strickly a Variable - it is a data type of it's own
3
+
4
+ class Unknown < BaseVariable
5
+ alias :variable_push :push
6
+
7
+ # TODO I think requirements here can be dropped
8
+ def initialize(*requirements)
9
+ super(*requirements)
10
+ end
11
+
12
+ # Adds a new requirement to the unknown variable. Unlike
13
+ # variables requirements can be added from outside the
14
+ # instance.
15
+ #
16
+ def push requirement
17
+ variable_push requirement
18
+ end
19
+
20
+ # Returns a typed version of the variable with the correct
21
+ # variable id. This occurs when an Unknown variable is
22
+ # used in a statement and its value can be determined.
23
+ #
24
+ def classify(value)
25
+ case value.class.to_s
26
+ when 'String'
27
+ var = StringVariable.new(value)
28
+ var.variable_id = variable_id
29
+ return var
30
+ when 'Fixnum'
31
+ var = FixnumVariable.new(value)
32
+ var.variable_id = variable_id
33
+ return var
34
+ else
35
+ raise StandardError.new('Unknown data type '+value.class.to_s)
36
+ end
37
+ end
38
+
39
+ # TODO Test this
40
+ # TODO Should 'Unknown' have a variable id
41
+ def copy
42
+ result = self.class.new(*self) {{:variable_id => variable_id,:uniq_id=>@uniq_id,:uniq_id_history=>@uniq_id_history.copy}}
43
+ result.instance_variable = @instance_variable
44
+ return result
45
+ end
46
+
47
+ #
48
+ def describe(tab=0,context=self)
49
+
50
+ # Create a temporay copy of the variable
51
+ copied_var = self.copy
52
+
53
+ unless context == self
54
+
55
+ # Return a duplicate variable with the requirements in the context indicated
56
+ copied_var = context.contextual_variable(copied_var.variable_id)
57
+
58
+ end
59
+
60
+ # Print the name of the variable
61
+ line = ''
62
+ line += write
63
+
64
+ # Print out each of the requirements
65
+ copied_var.each do |x|
66
+
67
+ #tmp = gets
68
+ desc = x.describe(context)
69
+
70
+ #tmp = gets
71
+ desc.each_line do |l|
72
+ line += "\t"+l
73
+ end
74
+ line += "\n" unless x == copied_var.last
75
+ end
76
+ line += "\n"
77
+
78
+ return line
79
+
80
+ end
81
+
82
+ # Returns a copy of the variable, this method exists in the
83
+ # instance call class. It avoids distinguishing the two.
84
+ # Since variale is lowest level context doesn't matter.
85
+ #
86
+ def copy_contextual_variable
87
+ return copy
88
+ end
89
+
90
+ def to_literal_string
91
+ return 'var'
92
+ end
93
+
94
+ def realised?
95
+ return false
96
+ end
97
+
98
+ def to_declaration
99
+ return VariableDeclaration.new('Unknown')
100
+ end
101
+
102
+ def to_var(id=nil,uniq_id=nil)
103
+ StandardLogger.instance.warning('"Unknown" is NOT a variable - it is a data type')
104
+ #super(id)
105
+ return UnknownVariable.new(self) {{:variable_id => id,:uniq_id=>uniq_id}}
106
+ end
107
+
108
+ # Unknown variables are evaluated are runtime so as along as it is
109
+ # a variable it is probably fine.
110
+ #
111
+ def equivalent?(to)
112
+ return true if to.kind_of?(BaseVariable)
113
+ return false
114
+ end
115
+
116
+ end