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,33 @@
1
+ # I'm not sure whether to keep this class as I already have BlockVariable but that
2
+ # is a bit overkill - I'm not sure I need to keep BlockVariable either.
3
+ #
4
+ # Instances of this are used in theories where a variable that shouldn't be
5
+ # replaced is used. This might be a Global variable or a block variable.
6
+ #
7
+ # if(var1.any? {|x| x == var2})
8
+ # return false
9
+ # end
10
+ #
11
+ # In the theory above if x was a normal TheoryVariable it would be replaced and the theory
12
+ # would break.
13
+ #
14
+ class BlockToken
15
+ include Token
16
+
17
+ def initialize(identitiy)
18
+ @identitiy = identitiy
19
+ end
20
+
21
+ def write
22
+ return @identitiy
23
+ end
24
+
25
+ def describe
26
+ return write
27
+ end
28
+
29
+ def copy
30
+ return BlockToken.new(@identitiy.copy)
31
+ end
32
+
33
+ end
data/lib/core/CCall.rb ADDED
@@ -0,0 +1,7 @@
1
+ class CCall
2
+
3
+ def initialize
4
+
5
+ end
6
+
7
+ end
@@ -0,0 +1,27 @@
1
+ # This is an individual test case that has an input an output. It is essentially
2
+ # just a hash but I've created a new class for it just for the convenience of using
3
+ # the .kind_of? method in theory chains.
4
+ #
5
+ # TODO Don't like extending core datatypes
6
+ class CTestCase < Hash
7
+
8
+ # TODO Should be able pass the hash directly or usea variable to contain the hash
9
+ def initialize(inputs=nil,output=nil)
10
+ super()
11
+ self[:params] = inputs
12
+ self[:output] = output
13
+ end
14
+
15
+ def copy
16
+ return Marshal.load(Marshal.dump(self))
17
+ end
18
+
19
+ def cauldron_method_calls
20
+ results = self.collect do |key,value|
21
+ '[:'+key.to_s+']'
22
+ end
23
+ results << '.kind_of?'
24
+ return results
25
+ end
26
+
27
+ end
@@ -0,0 +1,45 @@
1
+ #
2
+ # FixnumVariable.new(8)
3
+ #
4
+ class ClassMethodCallContainer < CallContainer
5
+ attr_reader :method_call, :parameters
6
+
7
+ def initialize(class_name,method_call,*parameters)
8
+
9
+ # Check the type for the class name
10
+ raise StandardError.new('Unexpected data type '+class_name.class.to_s) unless class_name.kind_of?(ClassName)
11
+ @class_name = class_name
12
+
13
+ super(class_name,method_call,*parameters)
14
+ end
15
+
16
+ def class_name
17
+ return @subject
18
+ end
19
+
20
+ def copy
21
+ return ClassMethodCallContainer.new(@subject.copy,@method_call.copy,*@parameters.collect {|x| x.copy})
22
+ end
23
+
24
+ # This method is used during tracking to print a general description of what
25
+ # the instance call is doing. e.g. MethodUsage.new.
26
+ #
27
+ def to_literal_string
28
+ return @class_name.write+'.'+@method_call.to_literal_string
29
+ end
30
+
31
+ # TODO Write tests
32
+ # Returns true if the supplied argument is the same class, has the equivalent subjects
33
+ # and parameters.
34
+ #
35
+ def equivalent?(to)
36
+ return false unless self.class == to.class
37
+ return false unless @class_name.class == to.class_name.class
38
+ return false unless @method_call.class == to.method_call.class
39
+ @parameters.each_with_index do |x,i|
40
+ return false unless x.equivalent?(to.parameters[i])
41
+ end
42
+ return true
43
+ end
44
+
45
+ end
@@ -0,0 +1,85 @@
1
+ # This is just a wrapper for elements that should be wrapped in parenthesis.
2
+ #
3
+ class Container
4
+
5
+ def initialize(*tokens)
6
+ @tokens = tokens
7
+ end
8
+
9
+ def replace_theory_variables!(mapping)
10
+ @tokens.each_with_index do |x,i|
11
+ if x.kind_of?(TheoryVariable) && mapping.has_key?(x.theory_variable_id)
12
+ @tokens[i] = mapping[x.theory_variable_id].copy
13
+ next
14
+ end
15
+ @tokens[i].replace_theory_variables!(mapping) if @tokens[i].respond_to?(:replace_theory_variables!)
16
+ end
17
+ end
18
+
19
+ def write(tab=0)
20
+ line = '('
21
+ tab.times {line += "\t" }
22
+ @tokens.each do |code|
23
+ line += code.write
24
+ break if code.object_id == @tokens.last.object_id
25
+ line += ' '
26
+ end
27
+ return line+')'
28
+ end
29
+
30
+ def describe(tab=0)
31
+ line = '('
32
+ tab.times {line += "\t" }
33
+ @tokens.each do |code|
34
+ line += code.describe
35
+ break if code.object_id == @tokens.last.object_id
36
+ line += ' '
37
+ end
38
+ return line+')'
39
+ end
40
+
41
+ def copy
42
+ return Container.new(*@tokens.collect {|x| x.copy} )
43
+ end
44
+
45
+ def select_all(results=[],&block)
46
+ results.push self if block.call(self)
47
+ @tokens.each do |x|
48
+ if block.call(x)
49
+ results.push(x)
50
+ end
51
+ if x.respond_to?(:select_all)
52
+ x.select_all(results,&block)
53
+ end
54
+ end
55
+ return results
56
+ end
57
+
58
+ def has?(&block)
59
+ return true if block.call(self)
60
+ @tokens.each do |x|
61
+ return true if block.call(x)
62
+ end
63
+ return false
64
+ end
65
+
66
+ # This method writes the statement out as a literal string. In the sense
67
+ # that any of the variables used in the statement are converted to literals
68
+ # and written. Unknown variables are not written yet though.
69
+ #
70
+ # This method is called during tracking to give an indication what the statement
71
+ # being tracked is doing.
72
+ #
73
+ # TODO I am treating unknown variables as a special case that is the same
74
+ # value e.g. 'var' - but for determining equivalent processes it isn't
75
+ # ideal becuase you loose track of what variables is used in each
76
+ # statement. Although I'll wait unitl I can come up with an example
77
+ # and come up with a solution then.
78
+ #
79
+ def to_literal_string
80
+ return @tokens.inject('') do |complete,part|
81
+ complete += part.to_literal_string
82
+ end
83
+ end
84
+
85
+ end
@@ -0,0 +1,272 @@
1
+ # This class represents any instance method call. For example:
2
+ #
3
+ # 'test'.length
4
+ # foo.class
5
+ # bar.nil?
6
+ #
7
+ # TODO The InstanceCallContainer should may be be replaced with just statement - the parser
8
+ # just has :call types.
9
+ #
10
+ class InstanceCallContainer < CallContainer
11
+ include PrintVariables
12
+ include VariableIncluded
13
+
14
+ attr_reader :subject, :method_call
15
+ attr_reader :value
16
+
17
+ #
18
+ # @param subject The variable or literal that is being acted upon
19
+ # @param method_call The method call being made against the variable
20
+ # or literal
21
+ #
22
+ def initialize(subject,method_call,*params)
23
+ raise StandardError.new('Use ClassMethodCallContainer here') if subject.kind_of?(ClassName)
24
+ super(subject,method_call,*params)
25
+ end
26
+
27
+ def write_with_uniq_id
28
+ if @subject.respond_to?('write_with_uniq_id')
29
+ return @subject.write_with_uniq_id+'.'+method_call.write+write_params(@parameters)
30
+ end
31
+ return @subject.write+'.'+method_call.write+write_params(@parameters)
32
+ end
33
+
34
+ # TODO There are many similar version of this method used
35
+ def replace_theory_variables!(mapping)
36
+ if @subject.kind_of?(TheoryVariable) && mapping.has_key?(@subject.theory_variable_id)
37
+ @subject = mapping[@subject.theory_variable_id].copy
38
+ elsif @subject.respond_to?(:replace_theory_variables!)
39
+ @subject.replace_theory_variables!(mapping)
40
+ end
41
+ @parameters.each_with_index do |x,i|
42
+ if x.kind_of?(TheoryVariable) && mapping.has_key?(x.theory_variable_id)
43
+ @parameters[i] = mapping[x.theory_variable_id].copy
44
+ next
45
+ end
46
+ @parameters[i].replace_theory_variables!(mapping) if @parameters[i].respond_to?(:replace_theory_variables!)
47
+ end
48
+
49
+ end
50
+
51
+ # TODO This can probably replace replace_theory_variables!
52
+ def replace_variables!(mapping)
53
+ if @subject.kind_of?(Variable) && mapping.has_key?(@subject.variable_id)
54
+ @subject = mapping[@subject.variable_id].copy
55
+ elsif @subject.respond_to?(:replace_variables!)
56
+ @subject.replace_variables!(mapping)
57
+ end
58
+ @parameters.each_with_index do |x,i|
59
+ if x.kind_of?(Variable) && mapping.has_key?(x.variable_id)
60
+ @parameters[i] = mapping[x.variable_id].copy
61
+ next
62
+ end
63
+ @parameters[i].replace_variables!(mapping) if @parameters[i].respond_to?(:replace_variables!)
64
+ end
65
+
66
+ end
67
+
68
+ # Returns a duplicate instance call container with any matching
69
+ # variables replaced with the variable supplied.
70
+ #
71
+ # @param var The variable that will replace any matching variables
72
+ #
73
+ def replace_variable_if(var,&block)
74
+ container = self.copy.clear
75
+ if block.call(@subject)
76
+ container.subject = var if block.call(@subject)
77
+ end
78
+ @parameters.each do |x|
79
+ if x.kind_of?(Variable)
80
+ container.push(var) if block.call(x)
81
+ end
82
+ container.push(x.copy)
83
+ end
84
+ return container
85
+ end
86
+
87
+ def contains?(&block)
88
+ return true if @parameters.contains?(&block)
89
+ return true if block.call(@subject)
90
+ return true if block.call(@method_call)
91
+ return false
92
+ end
93
+
94
+ def write_in_context(context=self)
95
+ return @subject.write_in_context(context)+'.'+method_call.write
96
+ end
97
+
98
+ def copy
99
+ copied_subject = @subject.copy
100
+ return InstanceCallContainer.new(copied_subject,@method_call.copy,*@parameters.collect {|x| x.copy})
101
+ end
102
+
103
+ def variable
104
+ return @subject
105
+ end
106
+
107
+ def literalisable?
108
+ return @subject.literalisable?
109
+ end
110
+
111
+ # Attempts to return a literal value for the result of calling
112
+ # this instance call.
113
+ #
114
+ def literalise(context=self)
115
+ unless(@subject.literalisable?)
116
+ raise FailedToLiteraliseError.new('Failed to literalise '+self.write+' couln\'t literalise '+@subject.write)
117
+ end
118
+ return eval(@subject.literalise.write(context)+@method_call.write)
119
+ end
120
+
121
+ def value
122
+ return literalise
123
+ end
124
+
125
+ # Returns the actual variable with the specified id.
126
+ #
127
+ # @param id
128
+ #
129
+ def find_actual_variable(id)
130
+ return @subject if @subject.uniq_id == id
131
+ @parameters.each do |x|
132
+ return x if x.uniq_id == id
133
+ end
134
+ throw :variable_not_found
135
+ end
136
+
137
+ def response
138
+ case value.class.to_s
139
+ when 'string'.class.to_s
140
+ return StringVariable.new(value)
141
+ break
142
+ when 8.class.to_s
143
+ return FixnumVariable.new(value)
144
+ else
145
+ raise StandardError.new('Unknown class '+value.class.to_s)
146
+ end
147
+ end
148
+
149
+ # Set the value of the container for the subject
150
+ #
151
+ def container=(val)
152
+ @container = val
153
+ @subject.container = @container
154
+ end
155
+
156
+ # Determines whether the is an imediate 'self' in the instance
157
+ # call.
158
+ def contains_self?
159
+ return true if subject.kind_of? This
160
+ return false
161
+ end
162
+
163
+ # Substitutes one variable for another one providing the
164
+ # the block returns true.
165
+ #
166
+ def subst!(var,&block)
167
+ @subject = var.copy if block.call(@subject)
168
+ @parameters.each_with_index do |x,i|
169
+ if block.call(x)
170
+ @parameters[i] = var.copy
171
+ end
172
+ end
173
+ return self
174
+ end
175
+
176
+ # Substitutes the 'self' in the instance call for a literal
177
+ # value and evaluates it.
178
+ #
179
+ def subst_self_for literal
180
+ if subject.kind_of? This
181
+ @subject = literal
182
+ end
183
+ end
184
+
185
+ def subject=(val)
186
+ @subject = val
187
+ end
188
+
189
+ def variable_id
190
+ return @subject.variable_id
191
+ end
192
+
193
+ def find_variable(id)
194
+ raise StandardError.new('This instance call does not contain the variable with the id '+id.to_s) unless variable_id == id
195
+ return contextual_subject
196
+ end
197
+
198
+ #
199
+ def copy_contextual_variable
200
+ return contextual_subject
201
+ end
202
+
203
+ def declaration_statement
204
+ new_instance_call = ClassMethodCallContainer.new(InstanceCallContainerClass.new,New.new,@subject.copy.declaration_statement,@method_call.copy.declaration_statement)
205
+ return Statement.new(new_instance_call)
206
+ end
207
+
208
+ # This method is used during tracking to print a general description of what
209
+ # the instance call is doing. e.g. 'test'.chop.
210
+ #
211
+ def to_literal_string
212
+ return @subject.to_literal_string+'.'+@method_call.to_literal_string
213
+ end
214
+
215
+ # Returns a declaration instance that will create a InstanceCallContainer with
216
+ # same properies as this InstanceCallContainer.
217
+ #
218
+ def to_declaration
219
+ return VariableDeclaration.new('InstanceCallContainer',*[@subject.to_declaration,@method_call.to_declaration,*@parameters.collect {|x| x.to_declaration}])
220
+ end
221
+
222
+ # Returns an array of all the variables used in this instance call.
223
+ #
224
+ def variables
225
+ if @subject.kind_of?(Variable)
226
+ results = [@subject.copy]
227
+ end
228
+ results ||= []
229
+ @parameters.each do |x|
230
+ results.push(x.copy)
231
+ end
232
+ return results
233
+ end
234
+
235
+ # Returns true if the supplied argument is equivant to this instance call
236
+ # container. They are equivalent if the their classes are the same, their
237
+ # subjects are equivalent, their method_calls are the same and use equivalent
238
+ # arguments.
239
+ #
240
+ def equivalent?(to)
241
+ return false unless self.class == to.class
242
+ return false unless self.length == to.length
243
+ return false unless @subject.equivalent?(to.subject)
244
+ return false unless @method_call.class == to.method_call.class
245
+ return false if @parameters.length != to.parameters.length
246
+ @parameters.each_with_index do |x,i|
247
+ return false unless x.equivalent?(to.parameters[i])
248
+ end
249
+ return true
250
+ end
251
+
252
+ protected
253
+
254
+ def contextual_subject
255
+
256
+ # Check that the literal supports the method call
257
+ if @subject.kind_of? Literal
258
+ raise NameError.new('Literal '+self.write+' does not have the method call '+@method_call.write) unless @subject.allowed? @method_call
259
+ end
260
+
261
+ # Copy the subject variable
262
+ copied_subject = @subject.copy
263
+
264
+ # Retrieve any requirements associated with the method call
265
+ @method_call.requirements do |req|
266
+ copied_subject.push(req)
267
+ end
268
+ return copied_subject
269
+
270
+ end
271
+
272
+ end