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,39 @@
1
+ class Fixnum
2
+
3
+ def to_var(id=nil,uniq_id=nil)
4
+ return FixnumVariable.new(self,id) {{:variable_id => id,:uniq_id=>uniq_id}}
5
+ end
6
+
7
+ def copy
8
+ return self
9
+ end
10
+
11
+ def to_declaration
12
+ return LiteralDeclaration.new(self)
13
+ end
14
+
15
+ def write
16
+ return self.to_s
17
+ end
18
+
19
+ def describe
20
+ write
21
+ end
22
+
23
+ def to_literal
24
+ return Literal.new(self)
25
+ end
26
+
27
+ def to_literal_string
28
+ return write
29
+ end
30
+
31
+ def cauldron_method_calls
32
+ return ['.kind_of?']
33
+ end
34
+
35
+ def to_intrinsic
36
+ return IntrinsicLiteral.new(self)
37
+ end
38
+
39
+ end
@@ -0,0 +1,25 @@
1
+ class Hash
2
+
3
+ def write
4
+ #raise StandardError.new('No "write" method has been created for '+self.class.to_s) unless self.class.to_s == 'Hash'
5
+ line = '{'
6
+ count = 0
7
+ self.each do |x,y|
8
+ line += x.write+'=>'+y.write
9
+ count += 1
10
+ next if count == self.length
11
+ line += ','
12
+ end
13
+ line += '}'
14
+ return line
15
+ end
16
+
17
+ def copy
18
+ raise StandardError.new('No "copy" method has been created for '+self.class.to_s) unless self.class.to_s == 'Hash'
19
+ return self.inject({}) do |x,(key,value)|
20
+ x[key] = value
21
+ x
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,19 @@
1
+ class NilClass
2
+
3
+ def to_var(id=nil)
4
+ return NilVariable.new(id) {{:variable_id => id,:uniq_id=>nil}}
5
+ end
6
+
7
+ def to_declaration
8
+ return LiteralDeclaration.new(nil)
9
+ end
10
+
11
+ def write
12
+ return 'nil'
13
+ end
14
+
15
+ def copy
16
+ return self
17
+ end
18
+
19
+ end
@@ -0,0 +1,24 @@
1
+ class Object
2
+
3
+ # This is a more useful 'public_methods' since it excludes
4
+ # the standard methods inheritated from the Object super
5
+ # class.
6
+ #
7
+ #def uniq_public_methods
8
+ # obj = Object.new
9
+ # return self.public_methods - obj.public_methods
10
+ #end
11
+
12
+ # Use p406
13
+ # Example.private_instance_methods(false)
14
+ # Example.public_instance_methods(false)
15
+
16
+ def instance_call_structures
17
+ return []
18
+ end
19
+
20
+ def cauldron_method_calls
21
+ return []
22
+ end
23
+
24
+ end
@@ -0,0 +1,86 @@
1
+ class String
2
+
3
+ def copy
4
+ return self.clone
5
+ end
6
+
7
+ def declaration_statement
8
+ return Statement.new(self.to_s)
9
+ end
10
+
11
+ def write
12
+ x = self.escape_single_quotes
13
+ return '\''+x+'\''
14
+ end
15
+
16
+ # TODO Write tests
17
+ def instance_call_structures
18
+ return [
19
+ InstanceCallContainerStructure.new(StringVariable,Chop.new),
20
+ InstanceCallContainerStructure.new(StringVariable,StringLength.new)
21
+ ]
22
+ end
23
+
24
+ #
25
+ # @param id You can specify the id of the newly created variable
26
+ #
27
+ def to_var(var_id=nil,unique_id=nil)
28
+ return StringVariable.new(self,var_id){{:variable_id => var_id,:uniq_id=>unique_id}}
29
+ end
30
+
31
+ # TODO This might have been superceeded by "to_declaration"
32
+ def creation
33
+ return self.write
34
+ end
35
+
36
+ def to_declaration
37
+ return LiteralDeclaration.new(self.clone)
38
+ end
39
+
40
+ def to_literal_string
41
+ return write
42
+ end
43
+
44
+ def to_literal
45
+ return Literal.new(self.clone)
46
+ end
47
+
48
+ # TODO Write tests
49
+ # Returns a requirement instance declaring this as a literal.
50
+ #
51
+ # Example 'test'.to_requirement -> Requirement.new(This.new,Equivalent.new,'test'.to_literal)
52
+ #
53
+ def to_requirement
54
+ return Requirement.new(This.new,Equivalent.new,self.to_literal)
55
+ end
56
+
57
+ # Returns a statement declaring a variable with the value of
58
+ # this string e.g.
59
+ #
60
+ # 'Sparky'.to_declaration_statement -> var_x = 'Sparky'
61
+ #
62
+ def to_declared_variable_statement
63
+ return Statement.new(StringVariable.new(self),Equal.new,self.to_declaration)
64
+ end
65
+
66
+ # http://snippets.dzone.com/posts/show/880
67
+ # TODO There is a BASH command `quote` and `quote_readline` that
68
+ # might be more useful here.
69
+ def escape_single_quotes
70
+ # TODO I don't properly follow this
71
+ return self.gsub(/[']/, '\\\\\'')
72
+ end
73
+
74
+ def cauldron_method_calls
75
+ return ['.length']
76
+ end
77
+
78
+ protected
79
+
80
+ def identify(x)
81
+ # Check if it is a assignment
82
+
83
+ end
84
+
85
+ end
86
+
@@ -0,0 +1,7 @@
1
+ class Symbol
2
+
3
+ def write
4
+ return ':'+self.to_s
5
+ end
6
+
7
+ end
@@ -0,0 +1,12 @@
1
+ class Tasks
2
+ include TSort
3
+
4
+ def initialize
5
+ @dependencies = []
6
+ end
7
+
8
+ def add_dependency(task,*relies_on)
9
+
10
+ end
11
+
12
+ end
data/lib/theories.rb ADDED
@@ -0,0 +1,143 @@
1
+
2
+ # TODO Not so keen on loading each theory in super - rather do it in the methods
3
+ # it is needed.
4
+
5
+ # TODO Allot of this functionalty should be moved to the rake tasks
6
+
7
+ module ContainsTheories
8
+
9
+ def setup
10
+ @theory_1 = Theory.load_theory(1)
11
+ @theory_2 = Theory.load_theory(2)
12
+ @theory_3 = Theory.load_theory(3)
13
+ end
14
+
15
+ def load_theory_implementation(implementation_id)
16
+ directory_path = $LOC+File.join('test','fixtures','theory_implementations',implementation_id.to_s)
17
+ raise StandardError.new("Theory fixture #{implementation_id} does not exist") unless(File.exists?(directory_path))
18
+ dump_file = File.open(File.join(directory_path,'dump'),'r')
19
+ return Marshal.load(dump_file.read)
20
+ end
21
+
22
+ def create_theory_implementation
23
+
24
+ theory = Theory.load_theory(6)
25
+ potential_values = [
26
+ Parser.run('test_cases[0][:params][0]'),
27
+ Parser.run('test_cases[0][:params]'),
28
+ Parser.run('test_cases[0][:output]'),
29
+ Parser.run('test_cases[0]'),
30
+ Parser.run('test_cases'),
31
+ Parser.run('runtime_method')
32
+ ]
33
+ results = theory.rewrite_permutations(potential_values)
34
+ # NOTE: Rember use grep -A and -B to match particular cases
35
+ implemented_theory = results[332]
36
+ return implemented_theory
37
+
38
+ end
39
+
40
+ def save_theory_implementation(implementation_id,theory_id,implementation=nil)
41
+ StandardLogger.instance.warning("Caution: Creating new theory implementation #{implementation_id}")
42
+ directory_path = $LOC+File.join('test','fixtures','theory_implementations',implementation_id.to_s)
43
+ if(File.exists?(directory_path))
44
+ StandardLogger.instance.warning("Theory Implementation ficture already exists #{theory_id} -cancelling")
45
+ return
46
+ else
47
+ FileUtils.mkdir_p(directory_path)
48
+ end
49
+
50
+ if implementation.nil? then implementation = create_theory_implementation end
51
+
52
+ desc_file = File.open(File.join(directory_path,'desc.txt'),'w')
53
+ desc_file << implementation.describe
54
+ desc_file.close
55
+
56
+ dump_file = File.open(File.join(directory_path,'dump'),'w')
57
+ data = Marshal.dump(implementation)
58
+ dump_file << data
59
+ dump_file.close
60
+
61
+ dump_file = File.open(File.join(directory_path,'theory_id'),'w')
62
+ dump_file << theory_id.to_s
63
+ dump_file.close
64
+
65
+ end
66
+
67
+ def load_implementation_result(result_id)
68
+ directory_path = $LOC+File.join('test','fixtures','implementation_results',result_id.to_s)
69
+ raise StandardError.new("ImplementationResult fixture #{result_id} does not exist") unless(File.exists?(directory_path))
70
+ dump_file = File.open(File.join(directory_path,'dump'),'r')
71
+ return Marshal.load(dump_file)
72
+ end
73
+
74
+ # This method is used on to create a theory fixture for use in the test
75
+ def create_theory
76
+
77
+ theory_id = "16"
78
+
79
+ StandardLogger.instance.warning("NOTE: Creating new theory fixture #{theory_id.to_s}")
80
+ # Does a directory for this theory fixture already exist.
81
+ directory_path = $LOC+File.join('test','fixtures','theories',theory_id.to_s)
82
+ if(File.exists?(directory_path))
83
+ StandardLogger.instance.warning("Theory ficture already exists #{theory_id.to_s} -cancelling")
84
+ return
85
+ else
86
+
87
+ # Create the directory
88
+ FileUtils.mkdir_p(directory_path)
89
+
90
+ end
91
+
92
+ # This is just updated here - nothing fancy
93
+ declaration = %q!
94
+ dependent_one = TheoryDependent.new(
95
+ StringToTheory.run(
96
+ "if(var1.kind_of?(RuntimeMethod))\nreturn true\nend"
97
+ )
98
+ )
99
+ dependent_two = TheoryDependent.new(
100
+ StringToTheory.run(
101
+ "if(var3[var4].kind_of?(CTestCase))\nreturn true\nend"
102
+ )
103
+ )
104
+ action = TheoryAction.new(
105
+ TheoryStatement.new(
106
+ StringToTheory.run(
107
+ 'BlockStatement.new(Statement.new(InstanceCallContainer.new(Container.new(InstanceCallContainer.new(var1.params[var2],StringLength.new),Subtract.new,1),Times.new)))'
108
+ )
109
+ ),
110
+ StringToTheory.run('var1.statement_id')
111
+ )
112
+ result_one = TheoryResult.new(
113
+ StringToTheory.run(
114
+ "if(var1.history2(var3[var4]).select {|x| x['statement_id'] == var3.last.statement_id} == var3[var4][:params][var2].length-1)\nreturn true\nend"
115
+ )
116
+ )
117
+ Theory.new(
118
+ [dependent_one,dependent_two],
119
+ action,
120
+ [result_one]
121
+ )
122
+ !
123
+
124
+ # Save the declaration (incase the theory needs modified
125
+ declaration_file = File.open(File.join(directory_path,'declaration.txt'),'w+')
126
+ declaration_file << declaration
127
+ declaration_file.close
128
+
129
+ theory = eval declaration
130
+ data = Marshal.dump(theory)
131
+
132
+ # TODO Shouldn't include colours for this description
133
+ desc_file = File.open(File.join(directory_path,'desc'),'w+')
134
+ desc_file << theory.describe
135
+ desc_file.close
136
+
137
+ dump_file = File.open(File.join(directory_path,'dump'),'w+')
138
+ dump_file << data
139
+ dump_file.close
140
+
141
+ end
142
+
143
+ end
@@ -0,0 +1,17 @@
1
+ class ActionImplementation < TheoryAction
2
+
3
+ attr_reader :target_id
4
+
5
+ def initialize(statement,target_id,theory_component_id=nil)
6
+ super(statement,target_id,theory_component_id)
7
+ end
8
+
9
+ def copy
10
+ return ActionImplementation.new(@action.copy,@target_id.copy,@theory_component_id)
11
+ end
12
+
13
+ def write(tab=0)
14
+ return ("\t"*tab)+"runtime_method.add_statement_at(#{@action.write},#{@target_id.write})"
15
+ end
16
+
17
+ end
@@ -0,0 +1,70 @@
1
+ # The theory action represents the what theory inserts into the
2
+ # main runtime method.
3
+ #
4
+ class TheoryAction
5
+ include TheoryComponent
6
+
7
+ attr_reader :target_id, :action
8
+ #
9
+ # @param action A statement to insert into the main runtime method.
10
+ # e.g. action.write => "return var8"
11
+ # @param target_id The id of the nested statement or method to add the generated statement to.
12
+ #
13
+ def initialize(action,target_id,theory_component_id=nil)
14
+ raise StandardError.new('Expecting theory statement but was '+action.class.to_s) unless action.kind_of?(TheoryStatement)
15
+ @action = action
16
+ @target_id = target_id
17
+ @theory_component_id = theory_component_id unless theory_component_id.nil?
18
+ generate_theory_component_id
19
+ end
20
+
21
+ # Provide a general description of the action, explaining the statement
22
+ # it will add to the runtime method and where. This is pseudo code
23
+ # and shouldn't be interpretted at runtime. Use "write" for runtime
24
+ # actions.
25
+ #
26
+ # @param tab
27
+ #
28
+ def describe(tab=0)
29
+ # TODO That is nicer way to do tabs - I should make the other methods consistent with it
30
+ return ("\t"*tab)+"<runtime_method>.add_statement_at(#{@action.describe},#{@target_id.describe})"
31
+ end
32
+
33
+ def write(tab=0)
34
+ return ("\t"*tab)+"<runtime_method>.add_statement_at(#{@action.write},#{@target_id.write})"
35
+ end
36
+
37
+ # Returns all the theory vairables in this theory action
38
+ #
39
+ def theory_variables
40
+ return @action.select_all {|x| x.kind_of?(TheoryVariable)}
41
+ end
42
+
43
+ # Returns a action implementation with the theory variable declarations replaced with
44
+ # the values in the mapping hash.
45
+ #
46
+ def map_to(mapping)
47
+
48
+ # Duplicate the current statement before it is rewritten
49
+ rewritten_statement = @action.copy
50
+ target_id = @target_id.copy
51
+
52
+ # Find all containers of VariableDeclarations that declare a TheoryVariable
53
+ containers = [rewritten_statement,target_id].select_all {|x| x.respond_to?(:has?)}
54
+ theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
55
+
56
+ # Rewrite the statement replacing the values
57
+ theory_variable_containers.each do |z|
58
+ z.replace_theory_variables!(mapping)
59
+ end
60
+
61
+ return ActionImplementation.new(rewritten_statement,target_id,@theory_component_id)
62
+
63
+ end
64
+
65
+ def copy
66
+ return TheoryAction.new(@action.copy,@target_id,@theory_component_id)
67
+ end
68
+
69
+
70
+ end