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
data/lib/Mapping.rb ADDED
@@ -0,0 +1,26 @@
1
+ # TODO I'm not sure I like this approach? - maybe just a hash would be clearer
2
+ class Mapping
3
+
4
+ attr_reader :hash
5
+
6
+ def initialize(hash={})
7
+ super()
8
+ @hash = hash
9
+ end
10
+
11
+ def values
12
+ return MappingValues.new(@hash.values)
13
+ end
14
+
15
+ def merge(mapping)
16
+ return Mapping.new(@hash.merge(mapping.hash))
17
+ end
18
+
19
+ # TODO Come back to this and include responds_to etc
20
+ # http://stackoverflow.com/questions/291132/method-missing-gotchas-in-ruby
21
+ def method_missing(sym, *args, &block)
22
+ return @hash.send(sym, *args, &block) if @hash.respond_to?(sym)
23
+ super(sym, *args, &block)
24
+ end
25
+
26
+ end
@@ -0,0 +1,24 @@
1
+ class MappingValues < Array
2
+
3
+ def initialize(array=[])
4
+ super(array)
5
+ end
6
+
7
+ # TODO This approach isn't needed anymore
8
+ def -(val)
9
+ if val.kind_of?(MappingValues)
10
+ m = MappingValues.new
11
+ self.each do |x|
12
+ next if val.any? {|y| x.intrinsic_object_id == y.intrinsic_object_id}
13
+ m << x
14
+ end
15
+ return m
16
+ end
17
+ return super
18
+ end
19
+
20
+ def copy
21
+ return MappingValues.new(self.collect {|x| x.copy})
22
+ end
23
+
24
+ end
@@ -0,0 +1,7 @@
1
+ class ScopeDependencies < Array
2
+
3
+ def initialize
4
+ super()
5
+ end
6
+
7
+ end
data/lib/Theory.rb ADDED
@@ -0,0 +1,274 @@
1
+ class Theory
2
+ attr_reader :dependents, :action, :results, :theory_id, :example_runtime_method
3
+
4
+ # TODO This is only temporaily accessible for debug
5
+ attr_writer :results
6
+
7
+ attr_accessor :theory_instance_id
8
+
9
+ @@theory_id = 0
10
+ #
11
+ # @param example_runtime_method A runtime method instance with this theories action applied to it and
12
+ # which meets the theories dependents with a certain set of test cases.
13
+ #
14
+ def initialize(dependents,action,results,example_runtime_method=nil)
15
+ @dependents, @action, @results, @example_runtime_method = dependents, action, results, example_runtime_method
16
+ @theory_id = @@theory_id
17
+ @@theory_id += 1
18
+ end
19
+
20
+ def copy
21
+ #return Theory.new(@dependents.copy,@action.copy,@results.copy)
22
+ return Marshal.load(Marshal.dump(self))
23
+ end
24
+
25
+ # Identify the dependents and actions that haven't changed between adding the action.
26
+ #
27
+ def identify_unchanged
28
+
29
+ # Identify the dependents that change after the action is added
30
+ changing_dependents = []
31
+ @dependents.each do |dependent|
32
+ next if @results.any? {|x| x.write == dependent.write}
33
+ changing_dependents << dependent
34
+ end
35
+
36
+ # Identify the results that don't occur in the dependents
37
+ changing_results = []
38
+ @results.each do |result|
39
+ # TODO Should this use the changing_dependents
40
+ next if @dependents.any? {|x| x.write == result.write}
41
+ changing_results << result
42
+ end
43
+
44
+ # TODO Stripping out the dependents will mean that they won't be
45
+ # met and the theory might be dismissed unfairly. e.g. it
46
+ # needs var1.kind_of?(RuntimeMethod). It should probably start
47
+ # with the minimum and work backwards - e.g. adding the dependents
48
+ # until it doesn't fail.
49
+
50
+ # Create a new runtime method with the irrelevant changes removed
51
+ return Theory.new(changing_dependents,action.copy,changing_results,example_runtime_method.copy)
52
+ end
53
+
54
+ # # NOTE: This method might not be useful.
55
+ # # Returns a number of theories but with the number of dependents and results limited by the
56
+ # # the numbers specified.
57
+ # #
58
+ # def variants(dependent_limit=4,results_limit=4)
59
+ # results = []
60
+ # @dependents.copy.permutation(dependent_limit).each do |d|
61
+ # @results.copy.permutation(results_limit).each do |r|
62
+ # results << Theory.new(d.copy,action.copy,r,example_runtime_method.copy)
63
+ # end
64
+ # end
65
+ # return results
66
+ # end
67
+
68
+ # Loads a particular theory that has been saved to a file
69
+ #
70
+ def self.load_theory(theory_id)
71
+ directory_path = $LOC+File.join('test','fixtures','theories',theory_id.to_s)
72
+ raise StandardError.new("Theory fixture #{theory_id} does not exist") unless(File.exists?(directory_path))
73
+ dump_file = File.open(File.join(directory_path,'dump'),'r')
74
+ return Marshal.load(dump_file)
75
+ end
76
+
77
+ # Returns a new theory where all the theory variables ids start from
78
+ # the supplied value.
79
+ #
80
+ def uniq_theory_variables(min_id)
81
+
82
+ ids = all_theory_variables.inject([]) {|total,x| total << x.theory_variable_id}
83
+
84
+ # Pair the olds with the new ones
85
+ map = ids.inject(Mapping.new) {|total,x| total[x] = TheoryVariable.new(min_id); min_id += 1; total}
86
+
87
+ # Duplicate the current theory and sustute the theory variables
88
+ # TODO Maybe shouldn't be a TheoryImplementation at this point
89
+ return self.map_to(map)
90
+
91
+ end
92
+
93
+ # Returns the component with the id supplied
94
+ #
95
+ def find_component(component_id)
96
+ return (dependents+results).find {|x| x.theory_component_id == component_id}
97
+ end
98
+
99
+ # Returns true if the theory contains a result that's structure is similar
100
+ # to that of the supplied result implementation.
101
+ #
102
+ # @param structure The theory result implementation that's structure is compared
103
+ # with this theorie's results.
104
+ #
105
+ def has_result_structure?(structure)
106
+ return @results.any? {|x| x.same_structure?(structure)}
107
+ end
108
+
109
+ # Returns the results thats structure matches that provided.
110
+ #
111
+ def select_result_structure(structure)
112
+ return @results.select {|x| x.same_structure?(structure)}
113
+ end
114
+
115
+ # Returns an array of any variables that only exist in the action. These
116
+ # are important for determining global ids, the results and dependents global
117
+ # id is determined my what they are connected to, these action variables aren't
118
+ # connected to anything.
119
+ #
120
+ def orphan_action_variables
121
+ return [] if @action.nil?
122
+ excluded_variables = (@dependents+@results).inject([]) {|total,x| total += x.theory_variables }
123
+ orphans = @action.theory_variables - excluded_variables
124
+ # TODO Should probably raise an error for this situation.
125
+ # TODO Actually as long as I include context when the value is added and the value it should
126
+ # be fine e.g. var2[:params][var3] for var3
127
+ StandardLogger.instance.warning "You really should not have variables that are not in dependents - there is no context for the value"
128
+ return orphans
129
+ end
130
+
131
+ # @param mapping { 1=>[],
132
+ # 2=>#<IntrinsicTestCases:0xb712d13c>,
133
+ # 3=>#<IntrinsicRuntimeMethod:0xb712c980>
134
+ # }
135
+ # @param values {
136
+ # 1=>0,
137
+ # 2=><#TestCases>
138
+ # 3=><#Runtime Method>
139
+ # }
140
+ #
141
+ def map_to(mapping,values={})
142
+ raise StandardError.new('Please use the maping datatype') unless mapping.kind_of?(Mapping)
143
+ return TheoryImplementation.new(
144
+ @dependents.collect {|y| y.map_to(mapping)},
145
+ @action ? @action.map_to(mapping) : nil,
146
+ @results.collect {|y| y.map_to(mapping)},
147
+ mapping,
148
+ values
149
+ )
150
+ end
151
+
152
+ # TODO Need to write tests for this that use the mapping
153
+ def rewrite_permutations(realisable_variables,partial_mapping=Mapping.new())
154
+
155
+ # Get an array of all the theory variables
156
+ a = all_theory_variables
157
+
158
+ # Strip out the theory variables that have already been accounted for
159
+ free_theory_variables = a.select {|x| !partial_mapping.has_key?(x.theory_variable_id) }
160
+
161
+ # If all the mapping has been determines just return the single permutation
162
+ return [self.map_to(partial_mapping)] if free_theory_variables.length == 0
163
+ # TODO This doesn't currentlt remove the initial finish values
164
+ arrangements = (realisable_variables - partial_mapping.values).permutation(free_theory_variables.length).to_a
165
+
166
+ # Map the arrangements to specific theory variables ids.
167
+ remaining_mapping = arrangements.inject([]) do |total,x|
168
+ # TODO I can probably get the 0 value to be the correct value
169
+ hash_table = Mapping.new(Hash[*free_theory_variables.collect { |v| [v.theory_variable_id,0] }.flatten])
170
+ free_theory_variables.zip(x) do |y,z|
171
+ hash_table[y.theory_variable_id] = z
172
+ end
173
+ total << hash_table
174
+ end
175
+ return remaining_mapping.inject([]) do |total,x|
176
+ total << self.map_to(x.merge(partial_mapping))
177
+ end
178
+
179
+ raise StandardError.new('Need to complete the rest of the mapping with the available realisable variables')
180
+
181
+ end
182
+
183
+ # Returns the highest theory variable id used by the theory
184
+ def highest_theory_variable_id
185
+ return all_theory_variables.sort {|y,z| y.theory_variable_id <=> z.theory_variable_id }.reverse.first.theory_variable_id
186
+ end
187
+
188
+ # Returns an array of all the theory variables used within the theory.
189
+ #
190
+ def all_theory_variables
191
+
192
+ # Get all the theory variables used in the @action, dependents and results
193
+ a = ([@action]+@dependents+@results).select{|x| x != nil}.inject([]) {|total,x| total += x.theory_variables }
194
+
195
+ # Filter out only the uniq theory vairables
196
+ # http://stackoverflow.com/questions/109781/uniq-by-object-attribute-in-ruby
197
+ return a.inject({}) {|total,x| total[x.theory_variable_id]=x; total}.values
198
+
199
+ end
200
+
201
+ # Returns an abstract description of theory with colour matching
202
+ # for common variables.
203
+ #
204
+ # TODO Include example here
205
+ #
206
+ def describe
207
+
208
+ # TODO include - theory_instance_id
209
+ # Describe the despendencies
210
+ description = 'if: '+"\n"
211
+ @dependents.inject(description) {|description, x| description += x.describe(1) }
212
+
213
+ # Describe the action
214
+ unless @action.nil?
215
+ description += "\n"+"action: \n"
216
+ description += @action.describe(1)
217
+ end
218
+
219
+ # Describe the result
220
+ description += "\n"+"result: \n"
221
+ @results.inject(description) {|description, x| description += x.describe(1) }
222
+ return description
223
+
224
+ end
225
+
226
+ def write
227
+
228
+ # Describe the despendencies
229
+ description = 'if: '+"\n"
230
+ @dependents.inject(description) {|description, x| description += x.write(1)+"\n" }
231
+
232
+ # Describe the action
233
+ unless @action.nil?
234
+ description += "\n"+"action: \n"
235
+ description += @action.write(1)
236
+ end
237
+
238
+ # Describe the result
239
+ description += "\n"+"result: \n"
240
+ @results.inject(description) {|description, x| description += x.write(1)+"\n" }
241
+ return description
242
+ end
243
+
244
+ def highlight(component_ids=[])
245
+ # @log.error("\033[0;31m\ "+msg+"\033[00m\ ")
246
+ # Describe the despendencies
247
+ description = 'if: '+"\n"
248
+ @dependents.inject(description) do |description, x|
249
+ if component_ids.include?(x.theory_component_id)
250
+ description += "\033[0;31m\ "+x.write(1)+"\033[00m\ "+"\n"
251
+ else
252
+ description += x.write(1)+"\n"
253
+ end
254
+ end
255
+
256
+ # Describe the action
257
+ unless @action.nil?
258
+ description += "\n"+"action: \n"
259
+ description += @action.write(1)
260
+ end
261
+
262
+ # Describe the result
263
+ description += "\n"+"result: \n"
264
+ @results.inject(description) {|description, x| description += x.write(1)+"\n" }
265
+ return description
266
+ end
267
+
268
+ # Returns an array of all the theory components used in the theory.
269
+ #
270
+ def components
271
+ return ([@action]+@dependents+@results).select{|x| x != nil}
272
+ end
273
+
274
+ end
@@ -0,0 +1,110 @@
1
+ # A unified chain is no longer editable - all the links have been added. Unlike a normal
2
+ # chain there is no mapping, all the theories should have the correct ids if they are
3
+ # linked. A unified chain is always complete.
4
+ #
5
+ class UnifiedChain < Chain
6
+ # TODO I don't like that extending to Chain exposes the @nodes to public access
7
+
8
+ def initialize(nodes)
9
+ @nodes = nodes
10
+ end
11
+
12
+ def write(tab=0)
13
+ return @nodes.inject('') {|total,x| total += x.write}
14
+ end
15
+
16
+ def describe(tab=0)
17
+ return @nodes.inject('') {|total,x| total += x.describe}
18
+ end
19
+
20
+ # Returns an array of all the theory variables in the chain. All the
21
+ # theory variables should be global across the chain.
22
+ #
23
+ def theory_variables
24
+ results = @nodes.inject([]) do |total,theory|
25
+ total += theory.all_theory_variables.collect {|x| x}
26
+ total
27
+ end
28
+ return results.uniq
29
+ end
30
+
31
+ # Return an implemented version of the chain where all the theory variables have
32
+ # been replaced with read values.
33
+ #
34
+ def implement(mapping)
35
+ implemented_nodes = @nodes.inject([]) do |total,theory|
36
+ total << theory.map_to(mapping)
37
+ end
38
+ return ImplementedChain.new(implemented_nodes)
39
+ end
40
+
41
+ # Returns an array of implemented chains using the various value
42
+ # permutations. Essential what it is looking for is mapping to convert
43
+ # all the theory variables to intrinsic variables.
44
+ #
45
+ # @param runtime_method The runtime method instance that will be populated to
46
+ # create the solution.<#RuntimeMethod >
47
+ # @param test_cases The test cases instance containing real values.
48
+ #
49
+ def implementation_permuatations(runtime_method,test_cases,mapping)
50
+
51
+ # Determine the number of variables without intrinsic values
52
+ theory_variable_ids = theory_variables.collect {|x| x.theory_variable_id}
53
+
54
+ # Collect the theory variables without intrinsic values
55
+ missing_intrinsic_values = theory_variable_ids-mapping.keys
56
+
57
+ # Take the first theory and identify all the accessors
58
+ # (need to work out what is the runtime method and what the test cases)
59
+
60
+ #pp missing_intrinsic_values
61
+ #puts @nodes.first.class.to_s
62
+ #@nodes.each {|x| puts x.class}
63
+ # TEMP: Why are these implemented theories
64
+ @nodes.first.all_theory_variables
65
+
66
+ # Create the theory generator
67
+ generator = TheoryGenerator.new()
68
+ accessors, temp_mapping = generator.generate_accessors_and_mapping(test_cases,runtime_method,1)
69
+ if temp_mapping.length > missing_intrinsic_values.length
70
+
71
+ # Now to assign real values to the chain
72
+
73
+ # Apply the values in the various permutaions
74
+ # (this is very crude and means that odd calls )
75
+ theory_variable_ids = @nodes.first.all_theory_variables.collect {|x| x.theory_variable_id }
76
+
77
+ # Get the posible sets for values in an array so that non of the arrays contain all the same values
78
+ res = temp_mapping.values.collect {|x| x}
79
+
80
+ # TODO This is a complete hack but I think I should be using intrinsic values rather than real
81
+ intrinsic_res = res.collect {|x| x.to_intrinsic}
82
+ value_permutaions = intrinsic_res.permutation(theory_variable_ids.length).to_a
83
+ uniq_value_permutations = value_permutaions.collect {|x| x.to_set}.uniq
84
+
85
+ possible_mappings = []
86
+
87
+ theory_variable_id_permutations = theory_variable_ids.permutation(theory_variable_ids.length).to_a
88
+
89
+ possible_mappings = []
90
+ theory_variable_id_permutations.each do |theory_variable_id_permutation|
91
+ uniq_value_permutations.each do |value_permutation|
92
+ m = Mapping.new
93
+ theory_variable_id_permutation.zip(value_permutation.to_a) do |key,value|
94
+ m[key] = value
95
+ end
96
+ possible_mappings << m
97
+ end
98
+
99
+ end
100
+
101
+ # Implemented changes
102
+ return possible_mappings.inject([]) { |total,mapping| total << self.copy.implement(mapping) }
103
+
104
+ else
105
+ raise StandardError.new('Could not generate enough real vlaues to test theory - try increasing the itterations')
106
+ end
107
+
108
+ end
109
+
110
+ end
data/lib/cauldron.rb ADDED
@@ -0,0 +1,6 @@
1
+
2
+ require 'required'
3
+
4
+ require 'cauldron/sexp2cauldron'
5
+ require 'cauldron/conversion'
6
+ require 'cauldron/terminal'