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,15 @@
1
+ module Cauldron
2
+
3
+ module Conversion
4
+
5
+ def convert_to_example(values)
6
+ CTestCase.new(values[0...(values.length-1)],values.last)
7
+ end
8
+
9
+ def separate_values(csv)
10
+ csv.split(',').inject([]) {|total,x| total << eval(x) }
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,134 @@
1
+ module Cauldron
2
+
3
+ class Pot
4
+ include ContainsTheories
5
+
6
+ VERSION = '0-01'
7
+
8
+ def initialize()
9
+
10
+ end
11
+
12
+ def brew(test_cases)
13
+
14
+ # * Load each of the theories from the directory
15
+ saved_theory_file_paths = Dir.glob(File.join(theory_repository_path,'*','dump'))
16
+ theories = saved_theory_file_paths.collect {|x| Marshal.load(File.open(x,'r'))}
17
+
18
+ # Prepare the theory chain connector
19
+ runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
20
+ tc = Parser.run('test_cases')
21
+ tc_index_0 = IntrinsicLiteral.new(0)
22
+ tc_index_1 = IntrinsicLiteral.new(1)
23
+ param_0 = IntrinsicLiteral.new(0)
24
+ real_method = Parser.run('runtime_method')
25
+
26
+ # TODO Still need to include last_real_method
27
+ last_real_method = Parser.run('last_runtime_method')
28
+
29
+ # Create the thoery connector and the values available
30
+ # TODO These values should actually be retreived progressively
31
+ potential_values = MappingValues.new([tc,tc_index_0,tc_index_1,param_0,real_method])
32
+ connector = TheoryConnector.new(potential_values)
33
+
34
+ # Attempt to generate a complete chain for the solution
35
+ chains = connector.generate_chains(runtime_method,test_cases,theories)
36
+ if chains.empty?
37
+ raise StandardError.new('Failed to generate a chain for this problem')
38
+ end
39
+
40
+ # Now validate each of the chains to check they work
41
+ # chains.each do |chain|
42
+ # chain_permutations = chain.unify_chain.implementation_permuatations(runtime_method,test_cases,Mapping.new)
43
+ # end
44
+ # TEMP just concentrate of one implementation_permutation
45
+ implementation_permutations = chains.first.unify_chain.implementation_permuatations(runtime_method,test_cases,Mapping.new)
46
+
47
+ # Go through each of the permutations and create the runtime method for the chain
48
+ validator = TheoryChainValidator.new
49
+ result = validator.build(runtime_method,test_cases,implementation_permutations)
50
+ return result
51
+
52
+ end
53
+
54
+ def simmer(demo)
55
+ raise StandardError.new('This demo does not work') unless demo_works?(demo)
56
+
57
+ # Generate a master theory for each stage of the runtime method when following the theory chains
58
+ generator = TheoryGenerator.new
59
+ master_theories = generator.master_theories(demo[:chain],demo[:initial_method],demo[:test_cases])
60
+
61
+ # Add each of the theories in the chain to cauldron
62
+ master_theories.each {|x| save_theory(x,master_repository_path)}
63
+
64
+ # Save each of the simple versions of the theory
65
+ demo[:chain].each {|x| save_theory(x,theory_repository_path)}
66
+
67
+ end
68
+
69
+ # Uses the chain in the demo to construct a runtime method and then checks that
70
+ # the runtime method indeed solves the example supplied.
71
+ #
72
+ def demo_works?(demo)
73
+ begin
74
+ runtime_method = TheoryChainValidator.new.build(
75
+ demo[:initial_method],
76
+ demo[:test_cases],
77
+ [demo[:chain].implement]
78
+ )
79
+ rescue StandardError => e
80
+ StandardLogger.instance.warning e
81
+ return false
82
+ end
83
+ return true
84
+ end
85
+
86
+ # Removes all the saved theories to start a fresh
87
+ def clear
88
+ cauldron_repository_paths = File.join(home,'cauldron',VERSION,'*')
89
+ FileUtils.rm_r Dir.glob(cauldron_repository_paths)
90
+ end
91
+
92
+ private
93
+
94
+ # Check that the home directory exists
95
+ def home
96
+ realHome = ["HOME", "HOMEPATH"].detect {|h| ENV[h] != nil}
97
+ if not realHome
98
+ StandardLogger.instance.warning "Couldn't detect a home directory"
99
+ end
100
+ return ENV[realHome]
101
+ end
102
+
103
+ # Saves the generic theory to file. This theory will have minimal
104
+ # dependents and results.
105
+ #
106
+ def save_theory(theory,repository)
107
+
108
+ # Define the theory's directory
109
+ theory_path = File.join(repository,theory.theory_id.to_s)
110
+ raise StandardError.new('Directory already exists - how as this happened?') if File.exists?(theory_path)
111
+
112
+ # Save a file containing the theory
113
+ FileUtils.mkdir_p(theory_path)
114
+ dump_file = File.open(File.join(theory_path,'dump'),'w+')
115
+ data = Marshal.dump(theory)
116
+ dump_file << data
117
+ dump_file.close
118
+
119
+ desc_file = File.open(File.join(theory_path,'desc'),'w+')
120
+ desc_file << theory.write
121
+ desc_file.close
122
+
123
+ end
124
+
125
+ def master_repository_path
126
+ File.join(home,'cauldron',VERSION,'master-theories')
127
+ end
128
+
129
+ def theory_repository_path
130
+ File.join(home,'cauldron',VERSION,'theories')
131
+ end
132
+
133
+ end
134
+ end
@@ -0,0 +1,156 @@
1
+ require 'rubygems'
2
+ require 'sexp_processor'
3
+
4
+ module Cauldron
5
+
6
+ class Sexp2Cauldron < SexpProcessor
7
+
8
+ def initialize
9
+ super
10
+ self.strict = false
11
+ self.expected = Object
12
+ @debug[:lasgn] = nil
13
+ @unsupported_checked = true
14
+ end
15
+
16
+ def process_lit(exp)
17
+ type = exp.shift
18
+ val = exp.shift
19
+ return Literal.new(val)
20
+ end
21
+
22
+ # def in_context type, &block
23
+ # # puts '-------------------------- in_context'
24
+ # # warn 'kadsjflkasj kldasfj lasdkfj ldksaf'
25
+ # # puts type
26
+ # # puts block_given?
27
+ # # pp self.context
28
+ # # puts @debug.has_key?(type)
29
+ # # pp &block
30
+ # # puts '--------------------999999999999999'
31
+ # self.context.unshift type
32
+ #
33
+ # yield
34
+ #
35
+ # self.context.shift
36
+ # end
37
+
38
+ # def process(exp)
39
+ # puts '--------------------------------calling process===================>'
40
+ # return nil if exp.nil?
41
+ # exp = self.rewrite(exp) if self.context.empty?
42
+ # puts '-------------------@unsupported_checked--------->>>>>>>>>>>.'
43
+ # puts @unsupported_checked
44
+ # puts '-------------------@unsupported_checked--------->>>>>>>>>>>.'
45
+ # unless @unsupported_checked then
46
+ # m = public_methods.grep(/^process_/) { |o| o.to_s.sub(/^process_/, '').to_sym }
47
+ # supported = m - (m - @unsupported)
48
+ #
49
+ # raise UnsupportedNodeError, "#{supported.inspect} shouldn't be in @unsupported" unless supported.empty?
50
+ #
51
+ # @unsupported_checked = true
52
+ # end
53
+ #
54
+ # result = self.expected.new
55
+ #
56
+ # type = exp.first
57
+ # raise "type should be a Symbol, not: #{exp.first.inspect}" unless
58
+ # Symbol === type
59
+ #
60
+ # in_context type do
61
+ #
62
+ # puts '==============================IN COTEXT('+exp.to_s+') ====================== '
63
+ #
64
+ # if @debug.has_key? type then
65
+ # str = exp.inspect
66
+ # puts "// DEBUG: #{str}" if str =~ @debug[type]
67
+ # end
68
+ #
69
+ # exp_orig = nil
70
+ # exp_orig = exp.deep_clone if $DEBUG or
71
+ # @debug.has_key? type or @exceptions.has_key?(type)
72
+ #
73
+ # raise UnsupportedNodeError, "'#{type}' is not a supported node type" if
74
+ # @unsupported.include? type
75
+ #
76
+ # if @debug.has_key? type then
77
+ # str = exp.inspect
78
+ # puts "// DEBUG (rewritten): #{str}" if str =~ @debug[type]
79
+ # end
80
+ #
81
+ # # now do a pass with the real processor (or generic)
82
+ # meth = @processors[type] || @default_method
83
+ # if meth then
84
+ #
85
+ # if @warn_on_default and meth == @default_method then
86
+ # warn "WARNING: Using default method #{meth} for #{type}"
87
+ # end
88
+ #
89
+ # exp.shift if @auto_shift_type and meth != @default_method
90
+ #
91
+ # puts 'Calling method ----------'+meth.to_s
92
+ # result = error_handler(type, exp_orig) do
93
+ # self.send(meth, exp)
94
+ # end
95
+ #
96
+ # raise SexpTypeError, "Result must be a #{@expected}, was #{result.class}:#{result.inspect}" unless @expected === result
97
+ #
98
+ # self.assert_empty(meth, exp, exp_orig) if @require_empty
99
+ # else
100
+ # unless @strict then
101
+ # until exp.empty? do
102
+ # sub_exp = exp.shift
103
+ # sub_result = nil
104
+ # if Array === sub_exp then
105
+ # sub_result = error_handler(type, exp_orig) do
106
+ # process(sub_exp)
107
+ # end
108
+ # raise "Result is a bad type" unless Array === sub_exp
109
+ # raise "Result does not have a type in front: #{sub_exp.inspect}" unless Symbol === sub_exp.first unless sub_exp.empty?
110
+ # else
111
+ # sub_result = sub_exp
112
+ # end
113
+ # result << sub_result
114
+ # end
115
+ #
116
+ # # NOTE: this is costly, but we are in the generic processor
117
+ # # so we shouldn't hit it too much with RubyToC stuff at least.
118
+ # #if Sexp === exp and not exp.sexp_type.nil? then
119
+ # begin
120
+ # result.sexp_type = exp.sexp_type
121
+ # rescue Exception
122
+ # # nothing to do, on purpose
123
+ # end
124
+ # else
125
+ # msg = "Bug! Unknown node-type #{type.inspect} to #{self.class}"
126
+ # msg += " in #{exp_orig.inspect} from #{caller.inspect}" if $DEBUG
127
+ # raise UnknownNodeError, msg
128
+ # end
129
+ # end
130
+ #
131
+ # puts '--------------------------------DONE ---------------------- context'
132
+ #
133
+ # end
134
+ #
135
+ # result
136
+ # end
137
+ #
138
+ # => Overwritten method
139
+ def process_lasgn(exp)
140
+ exp.shift
141
+ next_exp = exp.shift
142
+ if next_exp.to_s.match(/var(\d+)/)
143
+ s = Statement.new(Unknown.new($1),Equal.new)
144
+ end
145
+
146
+ if next_exp.kind_of?(Symbol)
147
+ res = process(exp.shift)
148
+ s.add res
149
+ end
150
+ s
151
+ end
152
+
153
+ end
154
+
155
+
156
+ end
@@ -0,0 +1,120 @@
1
+ module Cauldron
2
+
3
+ class Terminal
4
+
5
+ include Cauldron::Conversion
6
+
7
+ attr_reader :cases
8
+
9
+ def initialize(output,auto=true)
10
+ @output, @cases,@auto = output, [], auto
11
+ end
12
+
13
+ def start
14
+ @output.puts 'Starting....'
15
+ @pot = Cauldron::Pot.new
16
+ @pot.clear
17
+ @output.puts '* Adding example case'
18
+ @pot.simmer(demo('1'))
19
+
20
+ @output.puts "Thanks for trying Cauldron - it's at really early stage right now"
21
+ @output.puts "in fact it can only generate a method that returns the parameter passed through"
22
+ @output.puts ""
23
+ @output.puts "To start enter your first test like this"
24
+ @output.puts "input,input,output"
25
+ @output.puts "For example "
26
+ @output.puts "'fish','animal'"
27
+ @output.puts "'cat','animal'"
28
+ @output.puts "'carrot','vegtable'"
29
+ @output.puts "and when you're done just type RUN"
30
+
31
+ # Wait for the user's inputs
32
+ unless @auto
33
+ loop do
34
+ submit gets
35
+ end
36
+ end
37
+ end
38
+
39
+ def submit(input)
40
+ if input =~ /^RUN$/
41
+ @output.puts @pot.brew(@cases).basic_write
42
+ else
43
+ @cases << convert_to_example(separate_values(input))
44
+ end
45
+ end
46
+
47
+ # => ==========================================================================
48
+
49
+ def convert_to_cauldron_test_cases(cases)
50
+ cases.inject([]) do |total,x|
51
+ cauldron_case = CTestCase.new
52
+ cauldron_case[:params] = x[0]
53
+ cauldron_case[:output] = x[1]
54
+ total << cauldron_case
55
+ end
56
+ end
57
+
58
+ def demo(id)
59
+
60
+ @demo_1_test_cases = convert_to_cauldron_test_cases(
61
+ [
62
+ [['sparky'],'sparky'],
63
+ [['kel'],'kel']
64
+ ]
65
+ )
66
+
67
+ # Create demonstration #2
68
+ demo_2_test_case_1 = CTestCase.new
69
+ demo_2_test_case_1[:params] = ['something']
70
+ demo_2_test_case_1[:output] = 'exists'
71
+ demo_2_test_case_2 = CTestCase.new
72
+ demo_2_test_case_2[:params] = ['my willpower']
73
+ demo_2_test_case_2[:output] = 'does not exist'
74
+ demo_2_test_cases = [
75
+ demo_2_test_case_1,demo_2_test_case_2
76
+ ]
77
+
78
+ # Create demo #1 chain
79
+ # Create the head for the chain
80
+ head = Theory.new([],nil,[])
81
+
82
+ link_one_action = TheoryAction.new(
83
+ TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var2.params[var3])')),
84
+ StringToTheory.run('var1.statement_id')
85
+ )
86
+ # NOTE: I need to add one result so the theory can be flagged as complete - I might not need it
87
+ # to be complete -
88
+ link_one_result = TheoryResult.new(StringToTheory.run("if(var1.all_pass?(var2))\nreturn true\nend"))
89
+ link_one = Theory.new([],link_one_action,[link_one_result])
90
+ chain = Chain.new
91
+ chain = chain.add_link(head).first
92
+ chain = chain.add_link(
93
+ link_one,
94
+ {
95
+ 1=>IntrinsicRuntimeMethod.new,
96
+ 2=>IntrinsicTestCases.new,
97
+ 3=>IntrinsicLiteral.new(0)
98
+ }
99
+ ).first
100
+
101
+ # Now implement the chain
102
+ implemented_chain = chain.implement
103
+
104
+ # TODO It should generate the values too.(TheoryGenerator)
105
+ @demo_1 = {
106
+ :initial_method=>RuntimeMethod.new(MethodUsage.new(MethodParameter.new)),
107
+ :test_cases=>@demo_1_test_cases,
108
+ :chain=>chain,
109
+ :values=>{}
110
+ }
111
+
112
+ if id == '1'
113
+ return @demo_1
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,10 @@
1
+
2
+
3
+ module Cauldron
4
+
5
+ class TheoryFactory
6
+
7
+
8
+ end
9
+
10
+ end
@@ -0,0 +1,25 @@
1
+ #
2
+ # This module is used in the various code containers used in Cauldren
3
+ #
4
+ module ActsAsCode
5
+
6
+ # Returns a string description of the statement with any of tokens replaced with
7
+ # token markers.
8
+ #
9
+ # So var_1 = var_2 + 3
10
+ #
11
+ # becomes a = b + c
12
+ #
13
+ # The order of replacement is important, the first token becomes a, the second b
14
+ # and so forth.
15
+ #
16
+ def write_structure
17
+ # TODO Not sure how to handle duplicate literals
18
+ output = self.write
19
+ self.tokens.zip(('a'..'z').to_a) do |x,y|
20
+ output.gsub!(x.write,y)
21
+ end
22
+ return output
23
+ end
24
+
25
+ end