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,154 @@
1
+ #require "set"
2
+ # This was introduced so I could maintain the use of the class variable
3
+ # @@variable_id with the ArrayVarialble without having to include
4
+ # requirements with the array.
5
+ #
6
+ class BaseVariable < Array
7
+ attr_reader :variable_id , :instance_variable, :value, :uniq_id_history
8
+ attr_writer :instance_variable, :uniq_id_history
9
+
10
+ include Variable
11
+ include Token
12
+ # TODO VariableIncluded is in Variable so i can probably get rid of the VariableIncluded
13
+ #include VariableIncluded
14
+
15
+ # TODO I think I'll get rid of the id parameter and just use blocks
16
+ #
17
+ # NOTE: You can set the variable ids by passing it in a block
18
+ # e.g. BaseVariable.new {[8,9]}
19
+ # where 8 is the variable_id and unique_id is 9
20
+ #
21
+ def initialize(id=nil)
22
+ super()
23
+
24
+ # TODO I should maybe include a check on all .copy methods to ensure a block is provided
25
+ # Set the variable id for the newly created variable
26
+ if block_given?
27
+ # TEMP
28
+ if yield.kind_of?(Fixnum)
29
+ raise StandardError.new('Expecting array')
30
+ end
31
+ unless yield[:variable_id].nil?
32
+ @variable_id = yield[:variable_id]
33
+ else
34
+ @variable_id = @@variable_id
35
+ @@variable_id += 1
36
+ # TODO Should have a separate call that returns @@variable_id and increaments @@variable_id
37
+ end
38
+ unless yield[:uniq_id].nil?
39
+ raise StandardError.new('Expecting Fixnum') unless yield[:uniq_id].kind_of?(Fixnum)
40
+ @uniq_id = yield[:uniq_id]
41
+ else
42
+ @uniq_id = @@uniq_id
43
+ @@uniq_id += 1
44
+ end
45
+
46
+ @uniq_id_history = yield[:uniq_id_history] unless yield[:uniq_id_history].nil?
47
+
48
+ else
49
+ if id.nil?
50
+ @variable_id = @@variable_id
51
+ @@variable_id += 1
52
+ else
53
+ @variable_id = id
54
+ end
55
+
56
+ end
57
+
58
+ # Give the variable an unique id
59
+ if @uniq_id.nil?
60
+ @uniq_id = @@uniq_id
61
+ #raise StandardError.new('Uniq id change point') if (@uniq_id+1) == 86
62
+ @@uniq_id += 1
63
+ end
64
+
65
+ @uniq_id_history ||= []
66
+
67
+ # Flag indicating if this is a scope variable or a instance variable
68
+ @instance_variable = false
69
+
70
+ end
71
+
72
+ def self.reset_global_id
73
+ #http://www.zenspider.com/Languages/Ruby/QuickRef.html
74
+ unless $".include?('test/unit.rb')
75
+ StandardLogger.log 'WARNING: Resetting variable id, this should only be done for tests'
76
+ end
77
+ @@variable_id = 0
78
+ end
79
+
80
+ # Returns the variable if the ids matched
81
+ #
82
+ # @param id The uniq_id of the variable that is being looked for
83
+ #
84
+ def find_actual_variable(uniq_id)
85
+ return self if @uniq_id == uniq_id
86
+ throw :variable_not_found
87
+ end
88
+
89
+ # Returns an array of instance calls that can be created from
90
+ # this variable.
91
+ #
92
+ # NOTE: I checked that instance_calls wasn't a intrinsic method.
93
+ #
94
+ # TODO Test this (esp with ArrayVariable)
95
+ #
96
+ def instance_calls(with=[])
97
+ return [] unless self.realised?
98
+
99
+ # Attempt to retrieve the literal value for the variable
100
+ #val = self.literalise.value
101
+ val = self.value
102
+
103
+ # TODO I suspect this method is redundant since it is always overwritten
104
+
105
+ # Now retrieve all the possible instance call structures for that value
106
+ results = []
107
+ val.instance_call_structures.each do |struct|
108
+
109
+ if struct.instance_class != self.class then raise StandardError.new('Unexpected class type: - expecting '+val.class.to_s+' but was '+struct.instance_class.to_s) end
110
+
111
+ # Now create a method call of the instance call
112
+ inst_call = InstanceCallContainer.new(self.copy,struct.method_call.copy)
113
+ results.push inst_call
114
+
115
+ end
116
+ return results
117
+ end
118
+
119
+ # Returns an array of instances calls that return a value and are
120
+ # therefore approriate for declaration statements.
121
+ #
122
+ def returning_instance_calls(available=[])
123
+ return instance_calls(available)
124
+ end
125
+
126
+ def destructive_instance_calls(with=[])
127
+ raise StandardError.new(" 'destructive_instance_calls' method should be overridden for "+self.class.to_s)
128
+ end
129
+
130
+ #
131
+ #
132
+ #
133
+ def write()
134
+ if (@instance_variable)
135
+ return '@var_'+variable_id.to_s
136
+ end
137
+ return 'var_'+variable_id.to_s
138
+ end
139
+
140
+ def write_with_uniq_id
141
+ if (@instance_variable)
142
+ return '@var_'+variable_id.to_s+'_u'+uniq_id.to_s
143
+ end
144
+ return 'var_'+variable_id.to_s+'_u'+uniq_id.to_s
145
+ end
146
+
147
+ # Always returns true since realised variables should extend this class
148
+ # but overwrite this method.
149
+ #
150
+ def realised?
151
+ return false
152
+ end
153
+
154
+ end
@@ -0,0 +1,92 @@
1
+ # This is an odd sort of variable because it's actual value
2
+ # continually changes when used. It needs to have a variable
3
+ # id to prevent a duplicate variable being created.
4
+ #
5
+ class BlockVariable < BaseVariable
6
+
7
+ attr_writer :realised
8
+
9
+ def initialize
10
+ super()
11
+
12
+ @realised = false
13
+ end
14
+
15
+ # Returns a duplicate of the block variable.
16
+ #
17
+ def copy
18
+ # @uniq_id should probably be cloned or something
19
+ result = self.class.new() {{:variable_id => self.variable_id,:uniq_id=>@uniq_id, :uniq_id_history=>@uniq_id_history.copy}}
20
+ result.instance_variable = @instance_variable
21
+ self.each do |x|
22
+ result.push(x)
23
+ end
24
+ result.realised = @realised
25
+ return result
26
+ end
27
+
28
+ # Returns a string representing the block variable but with all the
29
+ # values of the block variable as well
30
+ def write_with_value
31
+ #return self.write+'('+self.inject {|line,x| line += x.value.write+} +')'
32
+ l = self.write+'('
33
+ self.each do |x|
34
+ l += x.value.write
35
+ l += '|' unless x.object_id == self.last.object_id
36
+ end
37
+ l += ')'
38
+ return l
39
+ end
40
+
41
+ # Returns the flag indicating whether the blockvariable had been
42
+ # realised yet. I can't just use whether all the contained variables
43
+ # are realised as an indication because the block variable may be
44
+ # empty. This would indicate either the block itself has no
45
+ # itterations or it hadn't been realised yet.
46
+ #
47
+ def realised?
48
+ return @realised
49
+ end
50
+
51
+ # Returns a duplicate block variable where all values for the block
52
+ # variable are included.
53
+ #
54
+ def realise(method_map)
55
+ x = method_map.find_realised_variable(self.variable_id,self.uniq_id,self.class.to_s)
56
+ # Flag the block variable as realised - this needs to be done maually oterwise empty
57
+ # blocks would flaged as realsied.
58
+ x.realised = true
59
+
60
+ return x
61
+ end
62
+
63
+ # Returns true if the block variable can be used as the specified variable
64
+ # type otherwise it returns false. It can be used as the specified variable
65
+ # type if all the variables it contains are of that type.
66
+ #
67
+ # @param variable_type The variable type that the block variable is expected
68
+ # to act like e.g. FixnumVariable.
69
+ #
70
+ def pass_as?(variable_type)
71
+ return self.all? {|x| x.pass_as?(variable_type)}
72
+ end
73
+
74
+ # This simple returns the block variable. It is a quick hack so that
75
+ # InstanceCallContainers and variables can be treated in the same way although
76
+ # it is a bit clunck and confusing.
77
+ #
78
+ def variable
79
+ return self
80
+ end
81
+
82
+ # This writes block variable as a literal. Now for normal variables this is
83
+ # fine as var_a might become '8' etc. However block variables have multiple
84
+ # values. I'm not sure why this is need so for now it will just display
85
+ # the first block variable.
86
+ #
87
+ def to_literal_string
88
+ if empty? then return '' end
89
+ return self.first.to_literal_string
90
+ end
91
+
92
+ end
@@ -0,0 +1,36 @@
1
+ class FixnumVariable < TypeVariable
2
+
3
+ def initialize(val,id=nil)
4
+ super(val,id)
5
+ end
6
+
7
+ # TODO Write test
8
+ def to_declaration
9
+ return VariableDeclaration.new('FixnumVariable',@value.to_declaration)
10
+ end
11
+
12
+ # TODO I wan't to get rid of this call entirly
13
+ def copy_contextual_variable
14
+ return copy
15
+ end
16
+
17
+ # Returns true if the variable type is Fixnum, this is used
18
+ # to determine whether a BlockVariable or VariableContainer
19
+ # can be used as a particular variable type.
20
+ #
21
+ def pass_as?(variable_type)
22
+ return true if variable_type==FixnumVariable
23
+ return false
24
+ end
25
+
26
+ # Returns an array of desctructive instance calls given the available
27
+ # variables.
28
+ #
29
+ # @param available An array of other variables that can be used as
30
+ # parameters.
31
+ #
32
+ def destructive_instance_calls(available=[])
33
+ return []
34
+ end
35
+
36
+ end
@@ -0,0 +1,8 @@
1
+ class HistoryVariable < BaseVariable
2
+
3
+ def initialize(val)
4
+ @value = val
5
+ super()
6
+ end
7
+
8
+ end
@@ -0,0 +1,206 @@
1
+ class MethodParameter < BaseVariable
2
+ attr_reader :usage_variable
3
+
4
+ # TODO I'm trying to move away from requirements
5
+ #
6
+ # @param *requirements Any number of requirements that describe the
7
+ # the properties of the method variable.
8
+ # For example self == 6
9
+ def initialize(*requirements)
10
+ super(nil)
11
+ end
12
+
13
+ # Returns true if this variables meets the requirements of the
14
+ # supplied variable. If the this meets the requirements of the
15
+ # supplied variable then this variable could replace the
16
+ # supplied variable in a statement.
17
+ #
18
+ # TODO Write tests for this
19
+ #
20
+ # @param of
21
+ #
22
+ # TODO Have an act_as call that doesn't return true/false but raises errors so I can identify
23
+ # why something can't be something else.
24
+ #
25
+ def meets_requirements? of
26
+
27
+ # Handle the possible datatypes of "of"
28
+ begin
29
+ if of.kind_of?(Variable)
30
+ return meets_requirements_of_variable(of)
31
+ elsif of.kind_of?(InstanceCallContainer)
32
+ return meets_requirements_of_instance_call(of)
33
+ else
34
+ raise StandardError.new('Not expecting class of type '+of.class.to_s)
35
+ end
36
+ rescue FailedVariableMatch
37
+ return false
38
+ end
39
+ end
40
+
41
+ # Raises an error to avoid me accidently trying to give this class the
42
+ # method.
43
+ #
44
+ def to_literal_string
45
+ # TODO I should turn this on further down the line - it realtes to tracking
46
+ #raise StandardError.new('Method Variables can\'t be converted to a literal string because they don\'t have a value')
47
+ return self.write
48
+ end
49
+
50
+ #
51
+ def describe(tab=0,context=self)
52
+
53
+ # Create a temporay copy of the variable
54
+ copied_var = self.copy
55
+
56
+ unless context == self
57
+
58
+ # Return a duplicate variable with the requirements in the context indicated
59
+ copied_var = context.contextual_variable(copied_var.variable_id)
60
+
61
+ end
62
+
63
+ # Print the name of the variable
64
+ line = ''
65
+ line += write
66
+
67
+ # Print out each of the requirements
68
+ copied_var.each do |x|
69
+
70
+ #tmp = gets
71
+ desc = x.describe(context)
72
+
73
+ #tmp = gets
74
+ desc.each_line do |l|
75
+ line += "\t"+l
76
+ end
77
+ line += "\n" unless x == copied_var.last
78
+ end
79
+ line += "\n"
80
+
81
+ return line
82
+
83
+ end
84
+
85
+ def copy
86
+ result = self.class.new(*self) {{:variable_id => self.variable_id,:uniq_id=>@uniq_id, :uniq_id_history=>@uniq_id_history.copy}}
87
+ result.instance_variable = @instance_variable
88
+ return result
89
+ end
90
+
91
+ # Returns a reference to the usage variable that is represented
92
+ # by this variable. Remember this MethodParameter represents
93
+ # a particular rule so its id doesn't reflect all cases.
94
+ #
95
+ def usage_variable
96
+ return @usage_variable
97
+ end
98
+
99
+ # Set the usage variable that this method variable should be used
100
+ # as. This is set when a method variable is added to a method.
101
+ #
102
+ def usage_variable= usage
103
+ @usage_variable = usage
104
+ end
105
+
106
+ # Attempts to return a literal that meets
107
+ # all the requirements.
108
+ #
109
+ def literalise
110
+
111
+ # Does the variable have any "equal to literal" requirements
112
+ self.each do |req|
113
+ if req.structure_match?([This,Equal,Literal])
114
+ return req[2].copy
115
+ end
116
+ end
117
+
118
+ raise StandardError.new('The literalise call is very basic right now and needs improved')
119
+ end
120
+
121
+ # Returns a statement showing the variable being declaraced
122
+ #
123
+ # MethodParameter.new(Requirement.new())
124
+ #
125
+ def declaration_statement
126
+ # TODO Check that .copy method call works across all the uses of "declaration_statement"
127
+ return Statement.new(ClassMethodCallContainer.new(MethodParameterClass.new,New.new,*self.collect {|x| x.copy.declaration_statement}))
128
+ end
129
+
130
+ def to_declaration
131
+ return VariableDeclaration.new('MethodParameter',*self.collect {|x| x.to_declaration})
132
+ end
133
+
134
+ private
135
+
136
+ # TODO Write tests for this
137
+ def meets_requirements_of_variable(this)
138
+
139
+ # Check if var has any requirements - if it doesn't have any then anything can be it
140
+ return 'is' if this.empty?
141
+
142
+ begin
143
+
144
+ # Can this be literised? (it makes it easy to check requirements)
145
+ if self.literalisable?
146
+
147
+ # then change it into a literal value
148
+ literal = self.literalise
149
+
150
+ # Good stuff - next lets see if we can confirm the requirements of 'var'
151
+ begin
152
+
153
+ # Goes through all of var requirements and substitutes self for the literal
154
+ this_could_be_that(literal,this)
155
+ return true
156
+ rescue IncompatiableRequirementsError => e
157
+ StandardLogger.instance.info e
158
+ return false
159
+ end
160
+
161
+ else # If self can't be literalised
162
+
163
+ # Go through each of the supplied variables requirements
164
+ all_requirements_matched = true
165
+ this.each do |req|
166
+ requirement_matched = false
167
+ self.each do |own_req|
168
+ if own_req.write == req.write
169
+ requirement_matched = true
170
+ break
171
+ end
172
+ end
173
+ all_requirements_matched = false unless requirement_matched
174
+ end
175
+
176
+ return true if all_requirements_matched
177
+ return false
178
+
179
+ end
180
+
181
+ rescue StandardError => e
182
+ StandardLogger.log e
183
+ return false
184
+ end
185
+ return false
186
+
187
+ end
188
+
189
+ # TODO Write tests for this
190
+ def meets_requirements_of_instance_call(instance_call)
191
+ #unless instance_call.literalisable?
192
+ # raise StandardError.new('Unable to litralise instance call '+instance_call.write)
193
+ #end
194
+
195
+ # Attempt to litralise the variable
196
+ # TODO The variable class returns a Literal the InstanceCallContainer returns a
197
+ # value. They don't need to do different things.
198
+ if(self.literalisable?)
199
+ return self.literalise.value == instance_call.literalise
200
+ else
201
+ raise FailedVariableMatch.new('Unable to litralise variable to see if it meets requirements')
202
+ end
203
+
204
+ end
205
+
206
+ end