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,135 @@
1
+ # A theory dependent is the "if" part of a theory. It states what needs to be
2
+ # true for a theory to be valid. For example "if varA == 7", would be
3
+ # a theory dependent.
4
+ #
5
+ class TheoryDependent
6
+ include TheoryComponent
7
+
8
+ attr_reader :statement
9
+ #
10
+ # @param statement A theory statement
11
+ # e.g. StringToTheory.run("if(var1.pass?(var2))\nreturn true\nend")
12
+ #
13
+ def initialize(statement,theory_component_id=nil)
14
+ raise StandardError.new('Expecting open statement but was '+statement.class.to_s) unless statement.kind_of?(OpenStatement)
15
+ @statement = statement
16
+ @theory_component_id = theory_component_id unless theory_component_id.nil?
17
+ generate_theory_component_id
18
+ end
19
+
20
+ # Returns an abstract description of the dependent
21
+ def describe(tab=0)
22
+ return @statement.describe(tab)
23
+ end
24
+
25
+ def write(tab=0)
26
+ return @statement.write(tab)
27
+ end
28
+
29
+ # Returns a deep copy of the theory dependent but with a unique object_ids, all the
30
+ # data should be identical.
31
+ #
32
+ def copy
33
+ return TheoryDependent.new(@statement.copy,@theory_component_id)
34
+ end
35
+
36
+ # Returns all the theory vairables in this theory
37
+ # dependent.
38
+ #
39
+ def theory_variables
40
+ return @statement.select_all {|x| x.kind_of?(TheoryVariable)}
41
+ end
42
+
43
+ # TODO The same code is used for both TheoryDependent and TheoryResult
44
+ # Returns true if supplied statement has the same structure as this theory
45
+ # dependent's, it has the same structure if everything about the statement is
46
+ # the same except for the variables. This means that the map_to method
47
+ # could be used to make it write identically.
48
+ #
49
+ def same_structure?(structure)
50
+ return false unless structure.tokens.length == @statement.tokens.length
51
+ return false unless structure.write_structure == @statement.write_structure
52
+ return true
53
+ end
54
+
55
+ # Returns a new theory dependent with the theory variables replaced with
56
+ # the values in the mapping hash.
57
+ #
58
+ def map_to(mapping)
59
+
60
+ # Duplicate the current statement before it is rewritten
61
+ rewritten_statement = @statement.copy
62
+
63
+ # Find all the containers that contain TheoryVariables
64
+ # NOTE The statement is put in an array because select all doesn't include the array itself
65
+ containers = [rewritten_statement].select_all {|x| x.respond_to?(:has?)}
66
+ theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
67
+
68
+ # Rewrite the statement replacing the values
69
+ theory_variable_containers.each do |z|
70
+ z.replace_theory_variables!(mapping)
71
+ end
72
+
73
+ return TheoryDependent.new(rewritten_statement,@theory_component_id)
74
+ end
75
+
76
+ # Returns a duplicate theory dependent but with the theory
77
+ # variables replaced with those supplied.
78
+ #
79
+ def rewrite_with(replacement_variables)
80
+ raise StandardError.new("This theory dependent has #{theory_variables.length} not #{replacement_variables.length}") if replacement_variables.length != theory_variables.length
81
+ rewritten_statement = @statement.copy
82
+
83
+ # TODO I think as well as copy I should have a rewrite_where(['var1'=>replacement_variables[0])
84
+
85
+ # Find all the containers that contain TheoryVariables
86
+ containers = [rewritten_statement].select_all {|x| x.respond_to?(:has?)}
87
+ theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
88
+
89
+ # Collect all uniq variables
90
+ # TODO Check that only uniq variables are caught
91
+ uniq_variables = theory_variable_containers.inject([]) {|results,x| results + x.variables }
92
+
93
+ # Check that all the variables in the theory dependent can be replaced
94
+ unless replacement_variables.length == uniq_variables.length
95
+ raise StandardError.new('Mismatch in the number of variables to be replaced and the number supplied')
96
+ end
97
+
98
+ # Create a mapping from the existing variable to the replacement ones
99
+ # TODo I really should use the varible id or something as the key
100
+ mapping = []
101
+ replacement_variables.zip(uniq_variables) do |x,y|
102
+ mapping.push({:before=>y,:after=>x})
103
+ end
104
+ theory_variable_containers.each do |z|
105
+ replacements = mapping.select {|x| x[:before].theory_variable_id == z.subject.theory_variable_id}
106
+ z.subject = replacements.first[:after]
107
+ end
108
+ return rewritten_statement
109
+
110
+ end
111
+
112
+ # Returns an array of theory statements that realise this dependency
113
+ # using the passed variables.
114
+ #
115
+ # http://en.wikipedia.org/wiki/Combination
116
+ # http://chriscontinanza.com/2010/10/29/Array.html
117
+ # 5! FACTORIAL
118
+ #
119
+ def rewrite_permutations(realisable_variables)
120
+ # TODO Need to include a combination size check here - incase it is going to get insane
121
+ raise StandardError.new('Currently requires at least one theory variable') if theory_variables.length == 0
122
+
123
+ # Create an array of all the possible permutations that could replace this depenents' theory variables
124
+ arrangements = realisable_variables.permutation(theory_variables.length).to_a
125
+
126
+ # Construct a new theory dependent that use realisable variables inplace of
127
+ # the theory variables
128
+ realisable_theory_dependents = []
129
+ arrangements.each do |x|
130
+ realisable_theory_dependents.push(self.copy.rewrite_with(x))
131
+ end
132
+ return realisable_theory_dependents
133
+ end
134
+
135
+ end
@@ -0,0 +1,74 @@
1
+ # Instances of this class are realised theorys. The theory variables
2
+ # have been replaced with values that generate valid ruby code.
3
+
4
+ class TheoryImplementation < Theory
5
+ attr_reader :mapping, :accessor_values
6
+
7
+ #
8
+ # @param mapping The literal mapping indicating what variable should be converted
9
+ # to what literal value. {1=><#IntrinsicRuntimeMethod,2=><#IntrinsicLiteral val=9>,...}
10
+ # @param values
11
+ #
12
+ def initialize(dependents,action,results,mapping,accessor_values={})
13
+ super(dependents,action,results)
14
+ @mapping, @accessor_values = mapping, accessor_values
15
+ end
16
+
17
+ def copy
18
+ #return TheoryImplementation.new(@dependents.copy, @action.copy, @results.copy,@mapping.copy)
19
+ return Marshal.load(Marshal.dump(self))
20
+ end
21
+
22
+ # Returns true if the result descript matches any of the results
23
+ # for this theory.
24
+ #
25
+ # @param result_description A OpenStatement with an if statement inside e.g.
26
+ # if(runtime_method.all_pass?(test_cases))
27
+ # end
28
+ #
29
+ def leads_to?(result_description)
30
+ @results.any? {|x| x.statement.write == result_description.write}
31
+ end
32
+
33
+ # Returns true if the implemeted theories pass given the
34
+ # given runtime method and test cases.
35
+ #
36
+ # TODO There might be a bit of crossover between the TheoryResult validates?
37
+ # method.
38
+ #
39
+ def meets_dependencies?(runtime_method,test_cases)
40
+
41
+ self.dependents.collect {|y| y.copy}.each do |x|
42
+ # TODO I'm not sure there is much benefit in the ParametersContainer class
43
+ begin
44
+ unless evaluate_dependent(x,runtime_method.copy,test_cases)
45
+ return false
46
+ end
47
+ rescue NoMethodError => e
48
+ return false
49
+ rescue StandardError => e
50
+ return false
51
+ end
52
+
53
+ end
54
+ return true
55
+
56
+ end
57
+ # TODO If I remove the code from this method then tc_theory_implementation.rb still
58
+ # passes all the tests!
59
+ def evaluate_dependent(dependent,runtime_method,test_cases)
60
+ #dependent.statement.push(Parser.run('return true'))
61
+ last_runtime_method = runtime_method.copy
62
+ eval dependent.statement.write
63
+ return false
64
+ end
65
+
66
+ # Returns all the theory vairables in this theory
67
+ # dependent.
68
+ #
69
+ # TODO What is the point in this - why only the actions?
70
+ def theory_variables
71
+ return @action.select_all {|x| x.kind_of?(TheoryVariable)}
72
+ end
73
+
74
+ end
@@ -0,0 +1,131 @@
1
+ # This instances of this class describe the consequence of a theory, e.g. if the
2
+ # the theories dependencies are met and the action complete then this will be
3
+ # true.
4
+ #
5
+ class TheoryResult
6
+ include TheoryComponent
7
+
8
+ attr_reader :statement
9
+
10
+ #
11
+ # @param statement A theory statement explaining what will be tested
12
+ # e.g. <runtime_method>.all_pass?(<test_cases>)
13
+ #
14
+ def initialize(statement,result=nil,theory_component_id=nil)
15
+
16
+ # TEMPORARY - Deprecaction Change:
17
+ unless result.nil? then StandardLogger.instance.warning('Result is being phased out - just use if statements') end
18
+ unless statement.kind_of?(OpenStatement)
19
+ StandardLogger.instance.warning('Please use open statements for theory results')
20
+ end
21
+ unless statement.length > 0
22
+ StandardLogger.instance.warning('Please include a return true statement in the theory result')
23
+ end
24
+
25
+ @statement = statement
26
+ @result = result
27
+ @theory_component_id = theory_component_id unless theory_component_id.nil?
28
+ generate_theory_component_id
29
+ end
30
+
31
+ def describe(tab=0)
32
+ return @statement.describe(tab)
33
+ end
34
+
35
+ def write(tab=0)
36
+ return @statement.write(tab)
37
+ end
38
+
39
+ def copy
40
+ #return TheoryResult.new(@statement.copy,@result)
41
+ return Marshal.load(Marshal.dump(self))
42
+ end
43
+
44
+ # Returns a new theory result with the theory variables replaced with
45
+ # the values in the mapping hash.
46
+ #
47
+ # @param mapping { 1=>[],
48
+ # 2=>#<IntrinsicTestCases:0xb712d13c>,
49
+ # 3=>#<IntrinsicRuntimeMethod:0xb712c980>
50
+ # }
51
+ #
52
+ def map_to(mapping)
53
+
54
+ # Duplicate the current statement before it is rewritten
55
+ rewritten_statement = @statement.copy
56
+
57
+ # Find all the containers that contain TheoryVariables
58
+ # NOTE The statement is put in an array because select all doesn't include the array itself
59
+ containers = [rewritten_statement].select_all {|x| x.respond_to?(:has?)}
60
+ theory_variable_containers = containers.select {|x| x.has? {|y| y.kind_of?(TheoryVariable)}}
61
+
62
+ # Rewrite the statement replacing the values
63
+ theory_variable_containers.each do |z|
64
+ z.replace_theory_variables!(mapping)
65
+ end
66
+
67
+ return TheoryResult.new(rewritten_statement,nil,theory_component_id)
68
+ end
69
+
70
+ # Returns a mapping hash that will convert this result to the statement
71
+ # provided.
72
+ #
73
+ def mapping_for(statement)
74
+ mapping = Mapping.new()
75
+ @statement.tokens.zip(statement.tokens) do |x,y|
76
+ mapping[x.theory_variable_id] = y
77
+ end
78
+ return mapping
79
+ end
80
+
81
+ # Returns true if supplied statement has the same structure as this theory
82
+ # result's, it has the same structure if everything about the statement is
83
+ # the same except for the variables. This means that the map_to method
84
+ # could be used to make it write identically.
85
+ #
86
+ def same_structure?(structure)
87
+ return false unless structure.tokens.length == @statement.tokens.length
88
+ return false unless structure.write_structure == @statement.write_structure
89
+ return true
90
+ end
91
+
92
+ # Returns true if theory result is true with the supplied
93
+ # runtime method and test cases. The paramter are 'rutime_method'
94
+ # and 'test_cases' so the eval can use them.
95
+ #
96
+ # TODO Write tests for this
97
+ def validates?(runtime_method,test_cases)
98
+ catch :theory_result_failed do
99
+ return true if use_statement(runtime_method,test_cases) == true
100
+ end
101
+ return false
102
+ end
103
+
104
+ protected
105
+
106
+ # This uses the result statement with the supplied values so
107
+ # the result can be evaluted.
108
+ #
109
+ def use_statement(runtime_method,test_cases)
110
+ duplicate_statement = @statement.copy
111
+ # TODO I'm not certaion with is how last_runtime is being used - see spec
112
+ last_runtime_method = runtime_method.copy
113
+ begin
114
+ rescue StandardError => e
115
+ end
116
+ # if((last_runtime_method.history2(test_cases[0]).select{ |x| x['statement_id'] == test_cases.last.statement_id} ) == test_cases[0][:params][0].length - 1)
117
+ # #return true
118
+ # end
119
+
120
+ #last_runtime_method.history2(test_cases[0][:params]).each do |x|
121
+ #end
122
+ # TODO For future debugging I really need to generate a runtime method from a string.
123
+ eval duplicate_statement.write
124
+ throw :theory_result_failed
125
+ rescue NoMethodError => e
126
+ throw :theory_result_failed
127
+ rescue TypeError => e
128
+ throw :theory_result_failed
129
+ end
130
+
131
+ end
@@ -0,0 +1,63 @@
1
+ class TheoryVariable
2
+ include Variable
3
+ include Token
4
+
5
+ attr_reader :theory_variable_id
6
+ # colours http://forums.opensuse.org/archives/sls-archives/archives-suse-linux/archives-desktop-environments/379032-how-can-i-change-font-color-my-terminal.html
7
+ RED = "\033[31m"
8
+ GREEN = "\033[32m"
9
+ YELLOW = "\033[33m"
10
+ TURQUOISE = "\033[34m"
11
+ VIOLET = "\033[35m"
12
+ BLUE = "\033[36m"
13
+ NORMAL = "\033[m"
14
+
15
+ def initialize(theory_variable_id)
16
+ @theory_variable_id = theory_variable_id
17
+ end
18
+
19
+ def write
20
+ return "var#{@theory_variable_id}"
21
+ end
22
+
23
+ def describe
24
+ return TheoryVariable.variable_colour(@theory_variable_id)+"var#{@theory_variable_id}"+NORMAL
25
+ end
26
+
27
+ def copy
28
+ return TheoryVariable.new(@theory_variable_id.copy)
29
+ end
30
+
31
+ def to_declaration
32
+ return VariableDeclaration.new('TheoryVariable',Literal.new(@theory_variable_id).to_declaration)
33
+ end
34
+
35
+ def eql?(obj)
36
+ @theory_variable_id == obj.theory_variable_id
37
+ end
38
+
39
+ def hash
40
+ @theory_variable_id
41
+ end
42
+
43
+ # Returns the preset colour for that particular id for easier
44
+ # tracking.
45
+ #
46
+ def self.variable_colour(theory_variable_id)
47
+ case theory_variable_id
48
+ when 0
49
+ return RED
50
+ when 1
51
+ return GREEN
52
+ when 2
53
+ return YELLOW
54
+ when 3
55
+ return TURQUOISE
56
+ when 4
57
+ return VIOLET
58
+ else
59
+ return BLUE
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,62 @@
1
+ class TheoryCollection
2
+
3
+ attr_reader :theories
4
+
5
+ def initialize(theories)
6
+ @theories = theories
7
+ end
8
+
9
+ def each_with_result_structure(structure)
10
+ @theories.each do |t|
11
+ t.results.each do |r|
12
+ if r.same_structure?(structure)
13
+ yield t, r
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ def each_with_dependent_structure(structure)
20
+ @theories.each do |t|
21
+ t.dependents.each do |d|
22
+ if d.same_structure?(structure)
23
+ yield t, d
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ # Returns the number of theories that have dependents
30
+ # or results that match the structure supplied.
31
+ #
32
+ # @param approach Either :dependents or :results
33
+ #
34
+ def same_structure_count(structure,approach)
35
+ @theories.inject(0) do |total,theory|
36
+ total += theory.send(approach).count {|x| x.same_structure?(structure)}
37
+ end
38
+ end
39
+
40
+ # Returns all the dependents within the theories
41
+ #
42
+ def dependents
43
+ @theories.inject([]) {|total,theory| total += theory.dependents }
44
+ end
45
+
46
+ def results
47
+ @theories.inject([]) {|total,theory| total += theory.results }
48
+ end
49
+
50
+ def actions
51
+ @theories.select {|x| x.action != nil}.inject([]) {|total,theory| total << theory.action }
52
+ end
53
+
54
+ def components
55
+ return dependents+results
56
+ end
57
+
58
+ # Returns an array of all the uniq theory variables used.
59
+ def theory_variables
60
+ return @theories.inject([]) {|total,x| total += x.all_theory_variables}.uniq
61
+ end
62
+ end