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,41 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestInstanceCallContainerStructure < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ # Create an array of variables to allow <runtime_method_var>.push(<statement_var>)
9
+ @runtime_method_var = RuntimeMethod.new(MethodUsage.new).to_var
10
+ @statement_var = Statement.new().to_var
11
+ @statement_and_runtime_method_var = [
12
+ @runtime_method_var,
13
+ @statement_var
14
+ ]
15
+
16
+ end
17
+
18
+ def teardown
19
+ System.reset
20
+ end
21
+
22
+ def test_statements
23
+
24
+ # Chect that <runtime_method_var>.push(<statement_var>) can be created
25
+ assert_equal(1,InstanceCallContainerStructure.new().statements(@statement_and_runtime_method_var).length)
26
+ assert_equal(
27
+ @runtime_method_var.write+'.push('+@statement_var.write+')',
28
+ InstanceCallContainerStructure.new().statements(@statement_and_runtime_method_var).first.write
29
+ )
30
+
31
+ # Check that <runtime_method_var>.push(<statement_var>) changes uniq_id but retains old reference
32
+ resulting_statement = InstanceCallContainerStructure.new().statements(@statement_and_runtime_method_var).first
33
+ assert_equal(resulting_statement.first.subject.variable_id,@runtime_method_var.variable_id)
34
+ #assert_not_equal(resulting_statement.first.subject.uniq_id,@runtime_method_var.uniq_id)
35
+ assert(resulting_statement.first.subject.uniq_id_history.kind_of?(Array))
36
+ #assert(resulting_statement.first.subject.uniq_id_history.any? {|x| x == @runtime_method_var.uniq_id})
37
+ #assert_equal(1,resulting_statement.first.subject.uniq_id_history.length)
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,32 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestReturnStructure < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ # Create the structure instance that generates the appropriate statement
9
+ @statement_generator = ReturnStructure.new()
10
+ @scabb = 'Scabb'.to_var
11
+
12
+
13
+ end
14
+
15
+ def teardown
16
+ CodeHandler.reset_global_id
17
+ System.reset
18
+ RuntimeMethod.reset_global_id
19
+ end
20
+
21
+ def test_statements
22
+
23
+ # Check that 'scabb' was returned
24
+ assert_equal(1,@statement_generator.statements([@scabb]).length)
25
+ assert_equal(
26
+ 'return var_'+@scabb.variable_id.to_s,
27
+ @statement_generator.statements([@scabb]).first.write
28
+ )
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,32 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestBlockContainer < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ # Create block containers with different numbers of variables
9
+ @block_container_1 = BlockContainer.new('lotus'.to_var)
10
+ @block_container_2 = BlockContainer.new(9.to_var,'test'.to_var)
11
+
12
+ end
13
+
14
+ def teardown
15
+ System.reset
16
+ RuntimeMethod.reset_global_id
17
+ end
18
+
19
+ def test_write
20
+ assert_equal('|var_0|',@block_container_1.write)
21
+ assert_equal('|var_1, var_2|',@block_container_2.write)
22
+ end
23
+
24
+ def test_copy
25
+ assert_equal(@block_container_1.length,@block_container_1.copy.length)
26
+ assert_equal(@block_container_2.length,@block_container_2.copy.length)
27
+ assert_equal(@block_container_1.first.variable_id,@block_container_1.copy.first.variable_id)
28
+ assert_equal(@block_container_2.first.variable_id,@block_container_2.copy.first.variable_id)
29
+ assert_equal(@block_container_2.last.variable_id,@block_container_2.copy.last.variable_id)
30
+ end
31
+
32
+ end
@@ -0,0 +1,39 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestIfContainer < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ end
9
+
10
+ def teardown
11
+ System.reset
12
+ RuntimeMethod.reset_global_id
13
+ end
14
+
15
+ def test_write
16
+
17
+ # 1. if(true)
18
+ assert_equal('if(true)',IfContainer.new(True.new).write)
19
+
20
+ # 2. if(var_x == 'test')
21
+ unknown_variable_2 = Unknown.new
22
+ if_statement_2 = IfContainer.new(unknown_variable_2,Equivalent.new,Literal.new('test'))
23
+ assert_equal('if(var_'+unknown_variable_2.variable_id.to_s+" == 'test')",if_statement_2.write)
24
+
25
+ end
26
+
27
+ def test_copy
28
+
29
+ # 1. Check copy works if(true)
30
+ assert_equal(IfContainer.new(True.new).write,IfContainer.new(True.new).copy.write)
31
+
32
+ # 2. Check copy works for "if(var_x == 'test')"
33
+ unknown_variable_2 = Unknown.new
34
+ if_statement_2 = IfContainer.new(unknown_variable_2,Equivalent.new,Literal.new('test'))
35
+ assert_equal(if_statement_2.copy.write,if_statement_2.write)
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,34 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestClassMethodCallContainer < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ # Create a simple method call var_a = MethodUsage.new
9
+ @simple_method_usage = ClassMethodCallContainer.new(MethodUsageClass.new,New.new)
10
+
11
+ # Create a simple method usage instance
12
+ @simple_method_usage_var = MethodUsage.new().to_var
13
+ @simple_runtime_method_instance = ClassMethodCallContainer.new(RuntimeMethodClass.new,New.new,@simple_method_usage_var)
14
+
15
+ end
16
+
17
+ def teardown
18
+ System.reset
19
+ RuntimeMethod.reset_global_id
20
+ end
21
+
22
+ def test_select_all
23
+
24
+ # Test where method doesn't exist
25
+ assert_equal(0,@simple_method_usage.select_all {|x| x.kind_of?(MethodUsageVariable)}.length)
26
+
27
+ assert_equal(
28
+ @simple_method_usage_var.variable_id,
29
+ @simple_runtime_method_instance.select_all {|x| x.kind_of?(Variable)}.first.variable_id
30
+ )
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,41 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestContainer < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @simple_container = Container.new(Parser.run('var3'),Equivalent.new,Parser.run('var2'))
8
+ end
9
+
10
+ def teardown
11
+ System.reset
12
+ RuntimeMethod.reset_global_id
13
+ end
14
+
15
+ def test_initialize
16
+ Container.new(
17
+ Parser.run('var3'),
18
+ Equivalent.new,
19
+ Parser.run('var2')
20
+ )
21
+ end
22
+
23
+ def test_write
24
+ assert_equal(
25
+ Container.new(
26
+ Parser.run('var3'),
27
+ Equivalent.new,
28
+ Parser.run('var2')
29
+ ).write,
30
+ '(var_3 == var_2)'
31
+ )
32
+ end
33
+
34
+ def test_select_all
35
+ assert_equal(
36
+ 2,
37
+ @simple_container.select_all {|x| x.kind_of?(BaseVariable)}.length
38
+ )
39
+ end
40
+
41
+ end
@@ -0,0 +1,25 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestCTestCase < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @cauldron_test_case_1 = CTestCase.new()
8
+ @cauldron_test_case_1[:params] = ['something']
9
+ @cauldron_test_case_1[:output] = 'exists'
10
+ end
11
+
12
+ def teardown
13
+ System.reset
14
+ RuntimeMethod.reset_global_id
15
+ end
16
+
17
+ def test_cauldron_method_calls
18
+ assert_equal(2,@cauldron_test_case_1.cauldron_method_calls.length)
19
+ assert_equal(
20
+ "[:output]",
21
+ @cauldron_test_case_1.cauldron_method_calls.first
22
+ )
23
+ end
24
+
25
+ end
@@ -0,0 +1,93 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestInstanceCallContainer < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ end
9
+
10
+ def teardown
11
+ System.reset
12
+ RuntimeMethod.reset_global_id
13
+ end
14
+
15
+ def test_equivalent
16
+
17
+ # Create a push statement and confirm they are captured as equivalent
18
+ instance_call_container_a = InstanceCallContainer.new(RuntimeMethod.new(MethodUsage.new).to_var,Push.new,Statement.new.to_var)
19
+ assert(true,instance_call_container_a.equivalent?(instance_call_container_a.copy))
20
+
21
+ end
22
+
23
+ def test_subst!
24
+
25
+ # Test that variables are replaced in the instance call
26
+ # 'warren'.length -> 'marc'.length
27
+ warren = 'warren'.to_var
28
+ new_var_length = InstanceCallContainer.new(warren,StringLength.new)
29
+ marc = 'marc'.to_var
30
+ assert_equal(warren.uniq_id,new_var_length.subject.uniq_id)
31
+ new_var_length.subst!(marc) {|x| x.uniq_id == warren.uniq_id}
32
+ assert_equal(marc.uniq_id,new_var_length.subject.uniq_id)
33
+ assert_not_equal(warren.uniq_id,new_var_length.subject.uniq_id)
34
+
35
+ # Test the paramters are properly replaced
36
+ # [].push('dragon') -> [].push('unicorn')
37
+ dragon = 'dragon'.to_var
38
+ unicorn = 'unicorn'.to_var
39
+ pushing_call = InstanceCallContainer.new([].to_var,Push.new,dragon)
40
+ assert_equal(pushing_call.parameters.last.uniq_id,dragon.uniq_id)
41
+ pushing_call.subst!(unicorn){|x| x.uniq_id == dragon.uniq_id}
42
+ assert_not_equal(pushing_call.parameters.last.uniq_id,dragon.uniq_id)
43
+ assert_equal(pushing_call.parameters.last.uniq_id,unicorn.uniq_id)
44
+
45
+ end
46
+
47
+ def test_select_all
48
+ assert_equal(
49
+ 2,
50
+ StringToTheory.run(
51
+ "var1.realise2(var3).params[0].value.length"
52
+ ).select_all {|x| x.kind_of?(TheoryVariable)}.length
53
+ )
54
+ end
55
+
56
+ def test_contains
57
+ assert_equal(
58
+ true,
59
+ Parser.run('var1.push(8)').kind_of?(InstanceCallContainer)
60
+ )
61
+ assert_equal(
62
+ true,
63
+ Parser.run('var1.push(8)').contains? {|x| x.kind_of?(Unknown)}
64
+ )
65
+ assert_equal(
66
+ true,
67
+ Parser.run('var1.push(8)').contains? {|x| x.kind_of?(Push)}
68
+ )
69
+ assert_equal(
70
+ true,
71
+ Parser.run('var1.push(8)').contains? {|x| x.kind_of?(Literal)}
72
+ )
73
+ end
74
+
75
+ def test_equivalent
76
+ assert_equal(
77
+ true,
78
+ Parser.run('var1.push(8)').equivalent?(Parser.run('var1.push(8)'))
79
+ )
80
+ assert_equal(
81
+ true,
82
+ Parser.run('var2.push(8)').equivalent?(Parser.run('var1.push(8)'))
83
+ )
84
+ assert_equal(
85
+ true,
86
+ Parser.run('var2.push(var8)').equivalent?(Parser.run('var1.push(var9)'))
87
+ )
88
+ assert_equal(
89
+ false,
90
+ Parser.run('var2.push(var8)').equivalent?(Parser.run('var1.push(var9,var7)'))
91
+ )
92
+ end
93
+ end
@@ -0,0 +1,30 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestLiteral < Test::Unit::TestCase
5
+
6
+ def setup
7
+
8
+ @spectre = Literal.new('spectre')
9
+ @num_2009 = Literal.new(2009)
10
+
11
+ end
12
+
13
+ def teardown
14
+ System.reset
15
+ RuntimeMethod.reset_global_id
16
+ end
17
+
18
+ def test_initialize
19
+
20
+ # Attempt to create an unknown literal
21
+ assert_raises(UnliteralisableError){Literal.new(MethodUsage.new)}
22
+
23
+ end
24
+
25
+ def test_to_literal_string
26
+ assert_equal("'spectre'",@spectre.to_literal_string)
27
+ assert_equal("2009",@num_2009.to_literal_string)
28
+ end
29
+
30
+ end
@@ -0,0 +1,336 @@
1
+ require 'required'
2
+ require 'test/unit'
3
+
4
+ class TestTheoryGenerator < Test::Unit::TestCase
5
+ include ContainsTheories
6
+
7
+ def setup
8
+
9
+ test_case_1 = CTestCase.new
10
+ test_case_1[:params] = ['something']
11
+ test_case_1[:output] = 'exists'
12
+ test_case_2 = CTestCase.new
13
+ test_case_2[:params] = ['my willpower']
14
+ test_case_2[:output] = 'does not exist'
15
+ @set_1_test_cases = [
16
+ test_case_1,test_case_2
17
+ ]
18
+ @runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
19
+
20
+ end
21
+
22
+ def teardown
23
+ System.reset
24
+ RuntimeMethod.reset_global_id
25
+ end
26
+
27
+ def test_initialize
28
+ assert_nothing_raised(){TheoryGenerator.new}
29
+ end
30
+
31
+ # This is testing the generator for the problem that can be solved with
32
+ # the following solution:
33
+ #
34
+ # def identifyType(word)
35
+ # if(word == ‘go’)
36
+ # return ‘verb’
37
+ # end
38
+ # return ‘adjective’
39
+ # end
40
+ #
41
+ def test_generate_with_first_case
42
+ test_case_1 = CTestCase.new
43
+ test_case_1[:params] = ['something']
44
+ test_case_1[:output] = 'exists'
45
+ test_case_2 = CTestCase.new
46
+ test_case_2[:params] = ['my willpower']
47
+ test_case_2[:output] = 'does not exist'
48
+ test_cases = [
49
+ test_case_1,test_case_2
50
+ ]
51
+ runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
52
+
53
+ end
54
+
55
+ def test_generate_theories_for_actions
56
+
57
+ # The folling are the actions that need included in the statement to solve the problem
58
+ # var1 = RuntimeMethod, var2 = test_cases, var3 = 0, var4 = 0
59
+ action_one = TheoryAction.new(
60
+ TheoryStatement.new(StringToTheory.run(
61
+ 'IfStatement.new(var2[var3][:params][var4],Equivalent.new,var2[var3][:output])'
62
+ )
63
+ ),
64
+ StringToTheory.run('var1.statement_id')
65
+ )
66
+ action_two = TheoryAction.new(
67
+ TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var2[var3][:output])')),
68
+ StringToTheory.run('var1.last.statement_id')
69
+ )
70
+ action_three = TheoryAction.new(
71
+ TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var2[var4][:output])')),
72
+ StringToTheory.run('var1.statement_id')
73
+ )
74
+ actions = [action_one,action_two,action_three]
75
+
76
+ end
77
+
78
+ def test_actions_validate_runtime_method
79
+
80
+ # The folling are the actions that need included in the statement to solve the problem
81
+ # var1 = RuntimeMethod, var2 = test_cases, var3 = 0, var4 = 0
82
+ action_one = TheoryAction.new(
83
+ TheoryStatement.new(StringToTheory.run(
84
+ 'IfStatement.new(var2[var3][:params][var4],Equivalent.new,var2[var3][:output])'
85
+ )
86
+ ),
87
+ StringToTheory.run('var1.statement_id')
88
+ )
89
+ action_two = TheoryAction.new(
90
+ TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var2[var3][:output])')),
91
+ StringToTheory.run('var1.last.statement_id')
92
+ )
93
+ action_three = TheoryAction.new(
94
+ TheoryStatement.new(StringToTheory.run('Statement.new(Return.new,var2[var4][:output])')),
95
+ StringToTheory.run('var1.statement_id')
96
+ )
97
+ actions = [action_one,action_two,action_three]
98
+ generator = TheoryGenerator.new
99
+ generator.actions_validate_runtime_method?(@runtime_method,@test_cases,actions)
100
+
101
+ end
102
+
103
+ def test_generate_theories_with_some_simple_cases
104
+
105
+ @set_1_test_cases
106
+ @runtime_method
107
+ mapping = Mapping.new({
108
+ 1 => @runtime_method.copy,
109
+ 2 => @set_1_test_cases.copy
110
+ })
111
+ accessors = [
112
+ {:value=>@runtime_method.copy,:statement=>TheoryStatement.new(TheoryVariable.new(1)),:step=>0},
113
+ {:value=>@set_1_test_cases.copy,:statement=>TheoryStatement.new(TheoryVariable.new(2)),:step=>0}
114
+ ]
115
+ # TODO I can probably use the runtime method and test case in the mapping
116
+ assert_kind_of(
117
+ Array,TheoryGenerator.new.generate_theories(@set_1_test_cases,@runtime_method,accessors,mapping)
118
+ )
119
+ assert_equal(
120
+ true,
121
+ TheoryGenerator.new.generate_theories(@set_1_test_cases,@runtime_method,accessors,mapping).all? {|x| x.kind_of?(Theory)}
122
+ )
123
+
124
+ end
125
+
126
+ def test_extend_accessors_with_some_simple_cases
127
+
128
+ @set_1_test_cases
129
+ @runtime_method
130
+ mapping = Mapping.new({
131
+ 1 => @runtime_method.copy,
132
+ 2 => @set_1_test_cases.copy
133
+ })
134
+ accessors = [
135
+ {:value=>@runtime_method.copy,:statement=>TheoryStatement.new(TheoryVariable.new(1)),:step=>0},
136
+ {:value=>@set_1_test_cases.copy,:statement=>TheoryStatement.new(TheoryVariable.new(2)),:step=>0}
137
+ ]
138
+ assert_equal(
139
+ 2,
140
+ TheoryGenerator.new.extend_accessors(accessors,mapping,[0,1,2],0).length
141
+ )
142
+ assert_equal(
143
+ 9,
144
+ TheoryGenerator.new.extend_accessors(accessors,mapping,[0,1,2],1).length
145
+ )
146
+ # Check that the two test case access has been added e.g. test_case[var3], test_case[var4]
147
+ assert_equal(4,mapping.length)
148
+
149
+ # NOTE: The step is NOT the number of itterations - it determines what accessors are available
150
+ # to construct new statements.
151
+ assert_equal(
152
+ 2,
153
+ TheoryGenerator.new.extend_accessors(accessors,mapping,[0,1,2],2).length
154
+ )
155
+ end
156
+
157
+ def test_statements_with_first_case
158
+
159
+ potential_values = MappingValues.new([@set_1_test_cases,@runtime_method])
160
+ generator = TheoryGenerator.new
161
+
162
+ # Test one itteration mapping has the correct number of accessors
163
+ one_itteration_accessors, one_itteration_mapping = generator.generate_accessors_and_mapping(@set_1_test_cases,@runtime_method,1)
164
+ assert_equal(one_itteration_accessors.length,one_itteration_accessors.uniq.length)
165
+ assert_equal(9,one_itteration_accessors.length)
166
+ assert_equal(4,one_itteration_mapping.length)
167
+
168
+ two_itteration_accessors, two_itteration_mapping = generator.generate_accessors_and_mapping(@set_1_test_cases,@runtime_method,2)
169
+ assert_equal(two_itteration_accessors.length,two_itteration_accessors.collect {|x| x[:statement].write}.uniq.length)
170
+ assert_equal(18,two_itteration_accessors.length)
171
+ assert_equal(5,two_itteration_mapping.length)
172
+
173
+ three_itteration_accessors, three_itteration_mapping = generator.generate_accessors_and_mapping(@set_1_test_cases,@runtime_method,3)
174
+ assert_equal(29,three_itteration_accessors.length)
175
+ assert_equal(7,three_itteration_mapping.length)
176
+ assert_equal(three_itteration_accessors.length,three_itteration_accessors.collect {|x| x[:statement].write}.uniq.length)
177
+
178
+ # TODO Need to check why four itteration doesn't have any effect
179
+ end
180
+
181
+ # Check that indexes are re-used. This allows the test case params to referer to the
182
+ # same param in the runtime method.
183
+ #
184
+ # var1.params[var5] == var2[var3][:params][var5]
185
+ # NOTE: var5 are the same reference
186
+ #
187
+ def test_indexes_are_shared
188
+ potential_values = MappingValues.new([@set_1_test_cases,@runtime_method])
189
+ generator = TheoryGenerator.new
190
+ accessors, mapping = generator.generate_accessors_and_mapping(@set_1_test_cases,@runtime_method,3)
191
+ assert_equal(true,accessors.any? {|x| x[:statement].write == 'var1.params[var5]'})
192
+ assert_equal(true,accessors.any? {|x| x[:statement].write == 'var2[var3][:params][var5]'})
193
+ end
194
+
195
+ # Checks that the theory to add the 'return 'does not exist' statement is generated
196
+ # return var2[var4][:params][var5]
197
+ #
198
+ def test_generate_theories_with_case_1_statement_2
199
+
200
+ # Create the runtime method with and add the initial "ifstatement" to it
201
+ @runtime_method << Parser.run("if(var0 == 'my willpower')\nend\n")
202
+
203
+ # Create the mapping for the generator
204
+ mapping = Mapping.new({1 => @runtime_method.copy,2 => @set_1_test_cases.copy})
205
+ mapping[3] = 0
206
+ mapping[4] = 0
207
+ mapping[5] = 1
208
+ # TODO Should it generate 7 variables surely 6,7 refer to [var2][var3][:params][var6] and [var2][var4][:params][var7]
209
+ # - I might only want var6 since you can't right code to account for the difference. - Warren this is a proper
210
+ # don't ignore it.
211
+ mapping[6] = 0
212
+ mapping[7] = 0
213
+
214
+ # Create the accessors used to generate the action
215
+ accessors = [
216
+ {:value=>'does not exist',:statement=>StringToTheory.run('var2[var4][:params][var5]')},
217
+ {:value=>1,:statement=>StringToTheory.run('var1.last.statement_id')}
218
+ ]
219
+ assert_equal('var2[var4][:params][var5]',accessors[0][:statement].write)
220
+
221
+ # Check that all the accessors could be generated
222
+ generated_accessors, mapping = TheoryGenerator.new.generate_accessors_and_mapping(@set_1_test_cases,@runtime_method,3)
223
+ accessors.each do |accessor|
224
+ assert(generated_accessors.any? {|x| x[:statement].write == accessor[:statement].write })
225
+ end
226
+
227
+ # Generate possible theories given the limited number of accessors
228
+ theories = TheoryGenerator.new.generate_theories(@set_1_test_cases,@runtime_method,accessors,mapping)
229
+ assert_equal(
230
+ true,
231
+ theories.any? do |theory|
232
+ theory.action.write == '<runtime_method>.add_statement_at(Statement.new(Return.new, var2[var4][:params][var5]),var1.last.statement_id)'
233
+ end
234
+ )
235
+
236
+ end
237
+
238
+ def test_generate_theories_with_case_1_statement_3
239
+
240
+ # Create the runtime method with and add the initial "ifstatement" to it
241
+ @runtime_method << Parser.run("if(var0 == 'my willpower')\nend\n")
242
+ @runtime_method.add_statement_at(Parser.run("return 'does not exist'"),@runtime_method.last.statement_id)
243
+
244
+ # Create the mapping for the generator
245
+ mapping = Mapping.new({1 => @runtime_method.copy,2 => @set_1_test_cases.copy})
246
+ mapping[3] = 0
247
+ mapping[4] = 0
248
+ mapping[5] = 1
249
+ # TODO Should it generate 7 variables surely 6,7 refer to [var2][var3][:params][var6] and [var2][var4][:params][var7]
250
+ # - I might only want var6 since you can't right code to account for the difference.
251
+ mapping[6] = 0
252
+ mapping[7] = 0
253
+
254
+ # Create the accessors used to generate the action
255
+ accessors = [
256
+ {:value=>'exists',:statement=>StringToTheory.run('var2[var4][:output]')},
257
+ {:value=>0,:statement=>StringToTheory.run('var1.statement_id')}
258
+ ]
259
+ assert_equal('var2[var4][:output]',accessors[0][:statement].write)
260
+
261
+ # Check that all the accessors could be generated
262
+ generated_accessors, mapping = TheoryGenerator.new.generate_accessors_and_mapping(@set_1_test_cases,@runtime_method,3)
263
+ accessors.each do |accessor|
264
+ assert(generated_accessors.any? {|x| x[:statement].write == accessor[:statement].write })
265
+ end
266
+
267
+ end
268
+
269
+ def test_simple_chain_head_creation
270
+
271
+ # Create the simple runtime method and test cases used to create the head
272
+ runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
273
+ sparky = CTestCase.new
274
+ sparky[:params] = ['sparky']
275
+ sparky[:output] = 'sparky'
276
+ pip = CTestCase.new
277
+ pip[:params] = ['pip']
278
+ pip[:output] = 'pip'
279
+ test_cases = [
280
+ sparky,pip
281
+ ]
282
+
283
+ # Generate the head theory - this is the starting point and doesn't have any dependents
284
+ accessors, mapping = TheoryGenerator.new.generate_accessors_and_mapping(test_cases,runtime_method,4,0)
285
+
286
+ # * Generate all the possible results of this runtime method
287
+ theory_results = TheoryGenerator.new.get_theory_results(accessors)
288
+
289
+ # * Create the actual head theory
290
+ head_theory = Theory.new([],nil,theory_results,runtime_method.copy)
291
+
292
+ # Check that the generated theory can be implemented - and all the variables have been replaced
293
+ intrinsic_mapping = TheoryGenerator.new.covert_to_intrinsic_mapping(mapping)
294
+
295
+ # Go through each result and check that the variables can be mapped to intrinsic values
296
+ head_theory.results.each do |res|
297
+ mapped_res = res.map_to(intrinsic_mapping)
298
+ assert_equal(false,mapped_res.write.include?('var'))
299
+ end
300
+
301
+ implemented_thoery = head_theory.map_to(intrinsic_mapping)
302
+ assert_not_equal(
303
+ true,
304
+ implemented_thoery.write.include?('var')
305
+ )
306
+
307
+ end
308
+
309
+ def test_generate_accessors_and_mapping_with_theory_6
310
+
311
+ runtime_method = RuntimeMethod.new(MethodUsage.new(MethodParameter.new))
312
+ sparky = CTestCase.new
313
+ sparky[:params] = ['sparky']
314
+ sparky[:output] = 'sparky'
315
+ pip = CTestCase.new
316
+ pip[:params] = ['pip']
317
+ pip[:output] = 'pip'
318
+ test_cases = [
319
+ sparky,pip
320
+ ]
321
+
322
+ # Generate the head theory - this is the starting point and doesn't have any dependents
323
+ accessors, mapping = TheoryGenerator.new.generate_accessors_and_mapping(test_cases,runtime_method,7,0)
324
+
325
+ # * Generate all the possible results of this runtime method
326
+ theory_results = TheoryGenerator.new.get_theory_results(accessors)
327
+
328
+ # Check that the results (that would be used in the head) include each do theory_6's dependents
329
+ theory_6 = Theory.load_theory(6)
330
+ theory_6.dependents.each do |theory_dependent|
331
+ assert_equal(true,theory_results.any? {|x| x.write == theory_dependent.write})
332
+ end
333
+
334
+ end
335
+
336
+ end