genie 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (313) hide show
  1. data/genie-0.1.gem +0 -0
  2. data/genie-0.1/docs/classes/BasicCommand.html +249 -0
  3. data/genie-0.1/docs/classes/BasicCommand.src/M000070.html +18 -0
  4. data/genie-0.1/docs/classes/BasicCommand.src/M000071.html +18 -0
  5. data/genie-0.1/docs/classes/BasicCommand.src/M000072.html +18 -0
  6. data/genie-0.1/docs/classes/BasicCommand.src/M000073.html +18 -0
  7. data/genie-0.1/docs/classes/BasicCommand.src/M000074.html +16 -0
  8. data/genie-0.1/docs/classes/Command.html +277 -0
  9. data/genie-0.1/docs/classes/Command.src/M000052.html +20 -0
  10. data/genie-0.1/docs/classes/Command.src/M000053.html +18 -0
  11. data/genie-0.1/docs/classes/Command.src/M000054.html +20 -0
  12. data/genie-0.1/docs/classes/Command.src/M000055.html +20 -0
  13. data/genie-0.1/docs/classes/Command.src/M000056.html +18 -0
  14. data/genie-0.1/docs/classes/Command.src/M000057.html +18 -0
  15. data/genie-0.1/docs/classes/Command.src/M000058.html +23 -0
  16. data/genie-0.1/docs/classes/CommandMetainfo.html +362 -0
  17. data/genie-0.1/docs/classes/CommandMetainfo.src/M000042.html +18 -0
  18. data/genie-0.1/docs/classes/CommandMetainfo.src/M000043.html +18 -0
  19. data/genie-0.1/docs/classes/CommandMetainfo.src/M000044.html +19 -0
  20. data/genie-0.1/docs/classes/CommandMetainfo.src/M000045.html +25 -0
  21. data/genie-0.1/docs/classes/CommandMetainfo.src/M000046.html +21 -0
  22. data/genie-0.1/docs/classes/CommandMetainfo.src/M000047.html +21 -0
  23. data/genie-0.1/docs/classes/CompoundResult.html +359 -0
  24. data/genie-0.1/docs/classes/CompoundResult.src/M000075.html +18 -0
  25. data/genie-0.1/docs/classes/CompoundResult.src/M000076.html +18 -0
  26. data/genie-0.1/docs/classes/CompoundResult.src/M000078.html +18 -0
  27. data/genie-0.1/docs/classes/CompoundResult.src/M000079.html +18 -0
  28. data/genie-0.1/docs/classes/CompoundResult.src/M000080.html +18 -0
  29. data/genie-0.1/docs/classes/CompoundResult.src/M000082.html +18 -0
  30. data/genie-0.1/docs/classes/CompoundResult.src/M000084.html +20 -0
  31. data/genie-0.1/docs/classes/CompoundResult.src/M000085.html +18 -0
  32. data/genie-0.1/docs/classes/CompoundResult.src/M000086.html +18 -0
  33. data/genie-0.1/docs/classes/CompoundResult.src/M000087.html +20 -0
  34. data/genie-0.1/docs/classes/EntryProcessor.html +223 -0
  35. data/genie-0.1/docs/classes/EntryProcessor.src/M000008.html +18 -0
  36. data/genie-0.1/docs/classes/EntryProcessor.src/M000009.html +20 -0
  37. data/genie-0.1/docs/classes/EntryProcessor.src/M000010.html +18 -0
  38. data/genie-0.1/docs/classes/EntryProcessor.src/M000011.html +23 -0
  39. data/genie-0.1/docs/classes/Log4r.html +114 -0
  40. data/genie-0.1/docs/classes/Log4r/LogEvent.html +153 -0
  41. data/genie-0.1/docs/classes/Log4r/LogEvent.src/M000123.html +16 -0
  42. data/genie-0.1/docs/classes/NotifiedProcessor.html +155 -0
  43. data/genie-0.1/docs/classes/NotifiedProcessor.src/M000094.html +22 -0
  44. data/genie-0.1/docs/classes/NullTransactionController.html +191 -0
  45. data/genie-0.1/docs/classes/NullTransactionController.src/M000030.html +16 -0
  46. data/genie-0.1/docs/classes/NullTransactionController.src/M000031.html +16 -0
  47. data/genie-0.1/docs/classes/Object.html +154 -0
  48. data/genie-0.1/docs/classes/Object.src/M000103.html +16 -0
  49. data/genie-0.1/docs/classes/Periodic.html +564 -0
  50. data/genie-0.1/docs/classes/Periodic.src/M000124.html +26 -0
  51. data/genie-0.1/docs/classes/Periodic.src/M000125.html +21 -0
  52. data/genie-0.1/docs/classes/Periodic.src/M000126.html +18 -0
  53. data/genie-0.1/docs/classes/Periodic.src/M000127.html +18 -0
  54. data/genie-0.1/docs/classes/Periodic.src/M000128.html +31 -0
  55. data/genie-0.1/docs/classes/Periodic.src/M000129.html +30 -0
  56. data/genie-0.1/docs/classes/Periodic.src/M000130.html +18 -0
  57. data/genie-0.1/docs/classes/Periodic.src/M000131.html +18 -0
  58. data/genie-0.1/docs/classes/Periodic.src/M000132.html +16 -0
  59. data/genie-0.1/docs/classes/PollingProcessor.html +303 -0
  60. data/genie-0.1/docs/classes/PollingProcessor.src/M000088.html +23 -0
  61. data/genie-0.1/docs/classes/PollingProcessor.src/M000089.html +19 -0
  62. data/genie-0.1/docs/classes/PollingProcessor.src/M000091.html +22 -0
  63. data/genie-0.1/docs/classes/PollingProcessor.src/M000092.html +18 -0
  64. data/genie-0.1/docs/classes/PollingProcessor.src/M000093.html +18 -0
  65. data/genie-0.1/docs/classes/Queue.html +562 -0
  66. data/genie-0.1/docs/classes/Queue.src/M000104.html +22 -0
  67. data/genie-0.1/docs/classes/Queue.src/M000105.html +18 -0
  68. data/genie-0.1/docs/classes/Queue.src/M000106.html +18 -0
  69. data/genie-0.1/docs/classes/Queue.src/M000107.html +18 -0
  70. data/genie-0.1/docs/classes/Queue.src/M000108.html +21 -0
  71. data/genie-0.1/docs/classes/Queue.src/M000109.html +21 -0
  72. data/genie-0.1/docs/classes/Queue.src/M000110.html +22 -0
  73. data/genie-0.1/docs/classes/Queue.src/M000111.html +16 -0
  74. data/genie-0.1/docs/classes/Queue.src/M000112.html +18 -0
  75. data/genie-0.1/docs/classes/Queue.src/M000113.html +19 -0
  76. data/genie-0.1/docs/classes/Queue.src/M000114.html +23 -0
  77. data/genie-0.1/docs/classes/Queue.src/M000115.html +21 -0
  78. data/genie-0.1/docs/classes/Queue.src/M000116.html +19 -0
  79. data/genie-0.1/docs/classes/Queue.src/M000117.html +20 -0
  80. data/genie-0.1/docs/classes/Queue.src/M000118.html +25 -0
  81. data/genie-0.1/docs/classes/Queue.src/M000119.html +18 -0
  82. data/genie-0.1/docs/classes/Queue.src/M000120.html +22 -0
  83. data/genie-0.1/docs/classes/Queue.src/M000121.html +22 -0
  84. data/genie-0.1/docs/classes/Queue.src/M000122.html +20 -0
  85. data/genie-0.1/docs/classes/QueueDispatcher.html +247 -0
  86. data/genie-0.1/docs/classes/QueueDispatcher.src/M000048.html +18 -0
  87. data/genie-0.1/docs/classes/QueueDispatcher.src/M000049.html +21 -0
  88. data/genie-0.1/docs/classes/QueueDispatcher.src/M000050.html +18 -0
  89. data/genie-0.1/docs/classes/QueueDispatcher.src/M000051.html +32 -0
  90. data/genie-0.1/docs/classes/QueueEntry.html +522 -0
  91. data/genie-0.1/docs/classes/QueueEntry.src/M000012.html +21 -0
  92. data/genie-0.1/docs/classes/QueueEntry.src/M000013.html +18 -0
  93. data/genie-0.1/docs/classes/QueueEntry.src/M000014.html +18 -0
  94. data/genie-0.1/docs/classes/QueueEntry.src/M000015.html +18 -0
  95. data/genie-0.1/docs/classes/QueueEntry.src/M000017.html +16 -0
  96. data/genie-0.1/docs/classes/QueueEntry.src/M000018.html +19 -0
  97. data/genie-0.1/docs/classes/QueueEntry.src/M000020.html +19 -0
  98. data/genie-0.1/docs/classes/QueueEntry.src/M000022.html +19 -0
  99. data/genie-0.1/docs/classes/QueueEntry.src/M000023.html +21 -0
  100. data/genie-0.1/docs/classes/QueueEntry.src/M000024.html +19 -0
  101. data/genie-0.1/docs/classes/QueueEntry.src/M000025.html +18 -0
  102. data/genie-0.1/docs/classes/QueueEntry.src/M000026.html +18 -0
  103. data/genie-0.1/docs/classes/QueueEntry.src/M000028.html +18 -0
  104. data/genie-0.1/docs/classes/Result.html +289 -0
  105. data/genie-0.1/docs/classes/Result.src/M000063.html +20 -0
  106. data/genie-0.1/docs/classes/Result.src/M000064.html +18 -0
  107. data/genie-0.1/docs/classes/Result.src/M000066.html +18 -0
  108. data/genie-0.1/docs/classes/Result.src/M000068.html +18 -0
  109. data/genie-0.1/docs/classes/Result.src/M000069.html +19 -0
  110. data/genie-0.1/docs/classes/SemanticCommand.html +229 -0
  111. data/genie-0.1/docs/classes/SemanticCommand.src/M000059.html +19 -0
  112. data/genie-0.1/docs/classes/SemanticCommand.src/M000060.html +18 -0
  113. data/genie-0.1/docs/classes/SemanticCommand.src/M000061.html +18 -0
  114. data/genie-0.1/docs/classes/TransactionBundle.html +260 -0
  115. data/genie-0.1/docs/classes/TransactionBundle.src/M000001.html +18 -0
  116. data/genie-0.1/docs/classes/TransactionBundle.src/M000002.html +20 -0
  117. data/genie-0.1/docs/classes/TransactionBundle.src/M000003.html +20 -0
  118. data/genie-0.1/docs/classes/TransactionBundle.src/M000004.html +18 -0
  119. data/genie-0.1/docs/classes/TransactionBundle.src/M000005.html +18 -0
  120. data/genie-0.1/docs/classes/TransactionBundle.src/M000007.html +19 -0
  121. data/genie-0.1/docs/classes/UndoRedoCommand.html +308 -0
  122. data/genie-0.1/docs/classes/UndoRedoCommand.src/M000095.html +19 -0
  123. data/genie-0.1/docs/classes/UndoRedoCommand.src/M000096.html +16 -0
  124. data/genie-0.1/docs/classes/UndoRedoCommand.src/M000097.html +16 -0
  125. data/genie-0.1/docs/classes/UndoRedoCommand.src/M000098.html +16 -0
  126. data/genie-0.1/docs/classes/UndoRedoCommand.src/M000099.html +18 -0
  127. data/genie-0.1/docs/classes/UndoRedoCommand.src/M000101.html +18 -0
  128. data/genie-0.1/docs/classes/UndoRedoCommand.src/M000102.html +18 -0
  129. data/genie-0.1/docs/classes/UnitOfWork.html +322 -0
  130. data/genie-0.1/docs/classes/UnitOfWork.src/M000032.html +19 -0
  131. data/genie-0.1/docs/classes/UnitOfWork.src/M000033.html +18 -0
  132. data/genie-0.1/docs/classes/UnitOfWork.src/M000034.html +18 -0
  133. data/genie-0.1/docs/classes/UnitOfWork.src/M000035.html +18 -0
  134. data/genie-0.1/docs/classes/UnitOfWork.src/M000036.html +18 -0
  135. data/genie-0.1/docs/classes/UnitOfWork.src/M000037.html +18 -0
  136. data/genie-0.1/docs/classes/UnitOfWork.src/M000038.html +18 -0
  137. data/genie-0.1/docs/classes/UnitOfWork.src/M000039.html +18 -0
  138. data/genie-0.1/docs/classes/UnitOfWork.src/M000040.html +18 -0
  139. data/genie-0.1/docs/created.rid +1 -0
  140. data/genie-0.1/docs/dot/f_0.dot +14 -0
  141. data/genie-0.1/docs/dot/f_0.png +0 -0
  142. data/genie-0.1/docs/dot/f_1.dot +14 -0
  143. data/genie-0.1/docs/dot/f_1.png +0 -0
  144. data/genie-0.1/docs/dot/f_2.dot +14 -0
  145. data/genie-0.1/docs/dot/f_2.png +0 -0
  146. data/genie-0.1/docs/dot/f_3.dot +84 -0
  147. data/genie-0.1/docs/dot/f_3.png +0 -0
  148. data/genie-0.1/docs/dot/f_4.dot +14 -0
  149. data/genie-0.1/docs/dot/f_4.png +0 -0
  150. data/genie-0.1/docs/dot/f_5.dot +78 -0
  151. data/genie-0.1/docs/dot/f_5.png +0 -0
  152. data/genie-0.1/docs/dot/f_6.dot +50 -0
  153. data/genie-0.1/docs/dot/f_6.png +0 -0
  154. data/genie-0.1/docs/dot/f_7.dot +57 -0
  155. data/genie-0.1/docs/dot/f_7.png +0 -0
  156. data/genie-0.1/docs/dot/m_5_0.dot +30 -0
  157. data/genie-0.1/docs/dot/m_5_0.png +0 -0
  158. data/genie-0.1/docs/dot/m_7_0.dot +39 -0
  159. data/genie-0.1/docs/dot/m_7_0.png +0 -0
  160. data/genie-0.1/docs/files/License_txt.html +161 -0
  161. data/genie-0.1/docs/files/ReadMe_Amber_txt.html +491 -0
  162. data/genie-0.1/docs/files/ReadMe_txt.html +444 -0
  163. data/genie-0.1/docs/files/nist/genie/commands_rb.html +121 -0
  164. data/genie-0.1/docs/files/nist/genie/genie_rb.html +116 -0
  165. data/genie-0.1/docs/files/nist/genie/processors_rb.html +111 -0
  166. data/genie-0.1/docs/files/nist/genie/queues_rb.html +118 -0
  167. data/genie-0.1/docs/files/nist/genie/results_rb.html +117 -0
  168. data/genie-0.1/docs/fr_class_index.html +46 -0
  169. data/genie-0.1/docs/fr_file_index.html +34 -0
  170. data/genie-0.1/docs/fr_method_index.html +160 -0
  171. data/genie-0.1/docs/images/overview.jpg +0 -0
  172. data/genie-0.1/docs/index.html +24 -0
  173. data/genie-0.1/docs/rdoc-style.css +208 -0
  174. data/genie-0.1/lib/nist/genie/commands.rb +413 -0
  175. data/genie-0.1/lib/nist/genie/genie.rb +4 -0
  176. data/genie-0.1/lib/nist/genie/processors.rb +382 -0
  177. data/genie-0.1/lib/nist/genie/queues.rb +435 -0
  178. data/genie-0.1/lib/nist/genie/results.rb +113 -0
  179. data/genie-0.1/tests/helpers.rb +45 -0
  180. data/genie-0.1/tests/test_commands.rb +338 -0
  181. data/genie-0.1/tests/test_processors.rb +17 -0
  182. data/genie-0.1/tests/test_queues.rb +288 -0
  183. data/genie-0.1/tests/test_results.rb +37 -0
  184. data/trimurti-0.1.gem +0 -0
  185. data/trimurti-0.1/docs/classes/Array.html +176 -0
  186. data/trimurti-0.1/docs/classes/Array.src/M000005.html +19 -0
  187. data/trimurti-0.1/docs/classes/Array.src/M000006.html +19 -0
  188. data/trimurti-0.1/docs/classes/Asserter.html +136 -0
  189. data/trimurti-0.1/docs/classes/Brahma.html +360 -0
  190. data/trimurti-0.1/docs/classes/Brahma.src/M000029.html +21 -0
  191. data/trimurti-0.1/docs/classes/Brahma.src/M000030.html +20 -0
  192. data/trimurti-0.1/docs/classes/Brahma.src/M000031.html +36 -0
  193. data/trimurti-0.1/docs/classes/Brahma.src/M000032.html +18 -0
  194. data/trimurti-0.1/docs/classes/Brahma.src/M000033.html +20 -0
  195. data/trimurti-0.1/docs/classes/Brahma.src/M000034.html +21 -0
  196. data/trimurti-0.1/docs/classes/Brahma.src/M000035.html +25 -0
  197. data/trimurti-0.1/docs/classes/Brahma.src/M000036.html +22 -0
  198. data/trimurti-0.1/docs/classes/Brahma.src/M000037.html +22 -0
  199. data/trimurti-0.1/docs/classes/ComponentSpec.html +275 -0
  200. data/trimurti-0.1/docs/classes/ComponentSpec.src/M000001.html +21 -0
  201. data/trimurti-0.1/docs/classes/ComponentSpec.src/M000002.html +18 -0
  202. data/trimurti-0.1/docs/classes/DRb.html +165 -0
  203. data/trimurti-0.1/docs/classes/DRb.src/M000062.html +18 -0
  204. data/trimurti-0.1/docs/classes/DRb.src/M000063.html +18 -0
  205. data/trimurti-0.1/docs/classes/GUID.html +129 -0
  206. data/trimurti-0.1/docs/classes/Linda.html +444 -0
  207. data/trimurti-0.1/docs/classes/Linda.src/M000007.html +16 -0
  208. data/trimurti-0.1/docs/classes/Linda.src/M000008.html +16 -0
  209. data/trimurti-0.1/docs/classes/Linda.src/M000009.html +20 -0
  210. data/trimurti-0.1/docs/classes/Linda.src/M000010.html +16 -0
  211. data/trimurti-0.1/docs/classes/Linda.src/M000011.html +18 -0
  212. data/trimurti-0.1/docs/classes/Linda.src/M000012.html +21 -0
  213. data/trimurti-0.1/docs/classes/Linda.src/M000013.html +18 -0
  214. data/trimurti-0.1/docs/classes/Linda.src/M000014.html +18 -0
  215. data/trimurti-0.1/docs/classes/Linda.src/M000015.html +18 -0
  216. data/trimurti-0.1/docs/classes/Linda.src/M000016.html +18 -0
  217. data/trimurti-0.1/docs/classes/Linda.src/M000017.html +20 -0
  218. data/trimurti-0.1/docs/classes/Linda.src/M000018.html +20 -0
  219. data/trimurti-0.1/docs/classes/Object.html +153 -0
  220. data/trimurti-0.1/docs/classes/Object.src/M000021.html +18 -0
  221. data/trimurti-0.1/docs/classes/Plugins.html +174 -0
  222. data/trimurti-0.1/docs/classes/Plugins.src/M000024.html +32 -0
  223. data/trimurti-0.1/docs/classes/Plugins.src/M000025.html +32 -0
  224. data/trimurti-0.1/docs/classes/Plugins/Spec.html +267 -0
  225. data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000026.html +22 -0
  226. data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000027.html +18 -0
  227. data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000028.html +20 -0
  228. data/trimurti-0.1/docs/classes/QBE_ID.html +147 -0
  229. data/trimurti-0.1/docs/classes/QBE_ID.src/M000059.html +18 -0
  230. data/trimurti-0.1/docs/classes/QueryByExample.html +270 -0
  231. data/trimurti-0.1/docs/classes/QueryByExample.src/M000054.html +17 -0
  232. data/trimurti-0.1/docs/classes/QueryByExample.src/M000055.html +17 -0
  233. data/trimurti-0.1/docs/classes/QueryByExample.src/M000056.html +17 -0
  234. data/trimurti-0.1/docs/classes/QueryByExample.src/M000057.html +17 -0
  235. data/trimurti-0.1/docs/classes/QueryByExample.src/M000058.html +17 -0
  236. data/trimurti-0.1/docs/classes/Shiva.html +159 -0
  237. data/trimurti-0.1/docs/classes/Shiva.src/M000060.html +18 -0
  238. data/trimurti-0.1/docs/classes/Shiva.src/M000061.html +19 -0
  239. data/trimurti-0.1/docs/classes/String.html +176 -0
  240. data/trimurti-0.1/docs/classes/String.src/M000022.html +16 -0
  241. data/trimurti-0.1/docs/classes/String.src/M000023.html +16 -0
  242. data/trimurti-0.1/docs/classes/Symbol.html +176 -0
  243. data/trimurti-0.1/docs/classes/Symbol.src/M000003.html +16 -0
  244. data/trimurti-0.1/docs/classes/Symbol.src/M000004.html +16 -0
  245. data/trimurti-0.1/docs/classes/Trimurti.html +189 -0
  246. data/trimurti-0.1/docs/classes/Trimurti.src/M000019.html +16 -0
  247. data/trimurti-0.1/docs/classes/Trimurti.src/M000020.html +16 -0
  248. data/trimurti-0.1/docs/classes/Vishnu.html +563 -0
  249. data/trimurti-0.1/docs/classes/Vishnu.src/M000038.html +18 -0
  250. data/trimurti-0.1/docs/classes/Vishnu.src/M000039.html +18 -0
  251. data/trimurti-0.1/docs/classes/Vishnu.src/M000040.html +18 -0
  252. data/trimurti-0.1/docs/classes/Vishnu.src/M000041.html +22 -0
  253. data/trimurti-0.1/docs/classes/Vishnu.src/M000042.html +23 -0
  254. data/trimurti-0.1/docs/classes/Vishnu.src/M000043.html +24 -0
  255. data/trimurti-0.1/docs/classes/Vishnu.src/M000044.html +24 -0
  256. data/trimurti-0.1/docs/classes/Vishnu.src/M000045.html +18 -0
  257. data/trimurti-0.1/docs/classes/Vishnu.src/M000046.html +22 -0
  258. data/trimurti-0.1/docs/classes/Vishnu.src/M000047.html +20 -0
  259. data/trimurti-0.1/docs/classes/Vishnu.src/M000048.html +18 -0
  260. data/trimurti-0.1/docs/classes/Vishnu.src/M000049.html +22 -0
  261. data/trimurti-0.1/docs/classes/Vishnu.src/M000050.html +20 -0
  262. data/trimurti-0.1/docs/classes/Vishnu.src/M000051.html +19 -0
  263. data/trimurti-0.1/docs/classes/Vishnu.src/M000052.html +30 -0
  264. data/trimurti-0.1/docs/classes/Vishnu.src/M000053.html +21 -0
  265. data/trimurti-0.1/docs/created.rid +1 -0
  266. data/trimurti-0.1/docs/dot/f_0.dot +14 -0
  267. data/trimurti-0.1/docs/dot/f_0.png +0 -0
  268. data/trimurti-0.1/docs/dot/f_1.dot +14 -0
  269. data/trimurti-0.1/docs/dot/f_1.png +0 -0
  270. data/trimurti-0.1/docs/dot/f_2.dot +14 -0
  271. data/trimurti-0.1/docs/dot/f_2.png +0 -0
  272. data/trimurti-0.1/docs/dot/f_3.dot +39 -0
  273. data/trimurti-0.1/docs/dot/f_3.png +0 -0
  274. data/trimurti-0.1/docs/dot/f_4.dot +39 -0
  275. data/trimurti-0.1/docs/dot/f_4.png +0 -0
  276. data/trimurti-0.1/docs/dot/f_5.dot +69 -0
  277. data/trimurti-0.1/docs/dot/f_5.png +0 -0
  278. data/trimurti-0.1/docs/dot/f_6.dot +149 -0
  279. data/trimurti-0.1/docs/dot/f_6.png +0 -0
  280. data/trimurti-0.1/docs/dot/m_3_0.dot +30 -0
  281. data/trimurti-0.1/docs/dot/m_3_0.png +0 -0
  282. data/trimurti-0.1/docs/dot/m_4_0.dot +39 -0
  283. data/trimurti-0.1/docs/dot/m_4_0.png +0 -0
  284. data/trimurti-0.1/docs/dot/m_5_0.dot +40 -0
  285. data/trimurti-0.1/docs/dot/m_5_0.png +0 -0
  286. data/trimurti-0.1/docs/dot/m_5_1.dot +30 -0
  287. data/trimurti-0.1/docs/dot/m_5_1.png +0 -0
  288. data/trimurti-0.1/docs/dot/m_6_0.dot +40 -0
  289. data/trimurti-0.1/docs/dot/m_6_0.png +0 -0
  290. data/trimurti-0.1/docs/dot/m_6_1.dot +30 -0
  291. data/trimurti-0.1/docs/dot/m_6_1.png +0 -0
  292. data/trimurti-0.1/docs/dot/m_6_2.dot +30 -0
  293. data/trimurti-0.1/docs/dot/m_6_2.png +0 -0
  294. data/trimurti-0.1/docs/files/License_txt.html +132 -0
  295. data/trimurti-0.1/docs/files/ReadMe_Amber_txt.html +491 -0
  296. data/trimurti-0.1/docs/files/ReadMe_txt.html +694 -0
  297. data/trimurti-0.1/docs/files/nist/trimurti/linda_rb.html +129 -0
  298. data/trimurti-0.1/docs/files/nist/trimurti/plugins_rb.html +129 -0
  299. data/trimurti-0.1/docs/files/nist/trimurti/queryByExample_rb.html +128 -0
  300. data/trimurti-0.1/docs/files/nist/trimurti/trimurti_rb.html +151 -0
  301. data/trimurti-0.1/docs/fr_class_index.html +43 -0
  302. data/trimurti-0.1/docs/fr_file_index.html +33 -0
  303. data/trimurti-0.1/docs/fr_method_index.html +89 -0
  304. data/trimurti-0.1/docs/images/overview.jpg +0 -0
  305. data/trimurti-0.1/docs/index.html +24 -0
  306. data/trimurti-0.1/docs/rdoc-style.css +208 -0
  307. data/trimurti-0.1/lib/nist/trimurti/linda.rb +163 -0
  308. data/trimurti-0.1/lib/nist/trimurti/plugins.rb +107 -0
  309. data/trimurti-0.1/lib/nist/trimurti/queryByExample.rb +81 -0
  310. data/trimurti-0.1/lib/nist/trimurti/trimurti.rb +433 -0
  311. data/trimurti-0.1/tests/test_linda.rb +111 -0
  312. data/trimurti-0.1/tests/test_trimurti.rb +247 -0
  313. metadata +467 -0
@@ -0,0 +1,45 @@
1
+ # This file contains some classes used to simplify
2
+ # some of the tests.
3
+ #
4
+ # Author: A. Griesser
5
+
6
+ # Registered commands that can be looked up by semantics.
7
+ class RC < Command
8
+ @@registry = Hash.new
9
+ def initialize(semantics)
10
+ @@registry[semantics]=self
11
+ super
12
+ end
13
+ def self.[](sem); @@registry[sem]; end
14
+ end
15
+
16
+ # Makes both a MetaInfo and a Command (an RC to be exact).
17
+ def make(semantics, log=nil)
18
+ CommandMetainfo.new(semantics).max_attempts=2
19
+ answer = RC.new(semantics)
20
+ answer.target=DebugTarget.new(log)
21
+ answer
22
+ end
23
+
24
+ # Simpler than the FakeTarget in test_commands.
25
+ class DebugTarget
26
+ attr_accessor :log
27
+ def initialize(log=nil)
28
+ self.log = log || Array.new
29
+ end
30
+ def method_missing(aSymbol, *args)
31
+ log << [aSymbol].concat(args)
32
+ 'Result_'+aSymbol.to_s
33
+ end
34
+ def to_a; log; end
35
+ end # DebugTarget
36
+
37
+ # Saves the entries that it decides to process.
38
+ # Handles everything except the String 'wind'.
39
+ class DebugWatcher < Array
40
+ def entry_added(entry)
41
+ handled = entry!='wind'
42
+ self << entry if handled
43
+ handled
44
+ end
45
+ end # DebugWatcher
@@ -0,0 +1,338 @@
1
+
2
+ require 'nist/common/log'
3
+ # Don't bother to output test warnings.
4
+ Object.outputters.clear
5
+
6
+ require 'nist/genie/genie'
7
+ require 'test/unit'
8
+ require 'helpers'
9
+
10
+
11
+ CommandMetainfo.new(:Rubbish)
12
+ CommandMetainfo.new(:Fatal)
13
+ CommandMetainfo.new(:Err)
14
+
15
+ # ====================================================
16
+
17
+ class FakeTarget
18
+
19
+ attr_accessor :internal_state
20
+
21
+ def self.fatal_message; "It's the end of the world as we know it"; end
22
+ def self.err_message; 'That does not compute'; end
23
+
24
+ def initialize
25
+ self.internal_state=Array.new
26
+ end
27
+
28
+ def do_Rubbish(args, undo_data)
29
+ undo_data[:superHero]=:FlamingCarrot
30
+ internal_state << [:do_Rubbish, args]
31
+ sleep(2)
32
+ warn('Sufferen Succotash!')
33
+ :Squid
34
+ end
35
+
36
+ def undo_Rubbish(args)
37
+ internal_state << [:undo_Rubbish, args]
38
+ sleep(1)
39
+ warn('Yumpin Yimminy')
40
+ 42
41
+ end
42
+
43
+ def do_Fatal(args, undo_data)
44
+ fatal FakeTarget.fatal_message
45
+ end
46
+
47
+ def undo_Fatal(args)
48
+ fatal FakeTarget.fatal_message
49
+ end
50
+
51
+ def do_Err(args, undo_data)
52
+ raise FakeTarget.err_message
53
+ end
54
+
55
+ def undo_Err(args)
56
+ raise FakeTarget.err_message
57
+ end
58
+
59
+ end
60
+
61
+
62
+ # ====================================================
63
+
64
+ class Test_Commands < Test::Unit::TestCase
65
+
66
+ def test_Command
67
+ c1 = make(:Spoon)
68
+ assert_kind_of(Command, c1)
69
+ c2 = c1.inverse
70
+ assert_kind_of(UndoRedoCommand, c2)
71
+ c3 = c2.inverse
72
+ assert_kind_of(UndoRedoCommand, c2)
73
+ e1 = c1.to_entry
74
+ e2 = c2.to_entry
75
+ e3 = c3.to_entry
76
+ assert_equal('Spoon', c1.description)
77
+ assert_equal('Spoon', c2.description)
78
+ assert_equal('Spoon', c3.description)
79
+ CommandMetainfo[:Spoon].description = 'Eating untensil'
80
+ assert_equal('Eating untensil', c1.description)
81
+ assert_equal('Eating untensil', c2.description)
82
+ assert_equal('Eating untensil', c3.description)
83
+ assert_equal(:do, c1.type)
84
+ assert_equal(:undo, c2.type)
85
+ assert_equal(:redo, c3.type)
86
+ assert_equal(:undo, c3.inverse.type)
87
+ assert_equal([c1], c1.command_chain)
88
+ assert_equal([c1, c2], c2.command_chain)
89
+ assert_equal([c1, c2, c3], c3.command_chain)
90
+ assert(c1.is_undoable)
91
+ assert(c2.is_undoable)
92
+ assert(c3.is_undoable)
93
+ assert( e1.can_undo)
94
+ assert(!e1.can_redo)
95
+ assert(!e2.can_undo)
96
+ assert( e2.can_redo)
97
+ assert( e3.can_undo)
98
+ assert(!e3.can_redo)
99
+ CommandMetainfo[:Spoon].undo_proc=nil
100
+ assert(!c1.is_undoable)
101
+ assert(!e1.can_undo)
102
+ assert(!e1.can_redo)
103
+ end
104
+
105
+ def test_metainfo
106
+ cm = CommandMetainfo[:Rubbish]
107
+ assert_nil(CommandMetainfo[:Gargoyle], 'CommandMetainfo registry somehow found nonexistant instance.')
108
+ assert_not_nil(cm, 'CommandMetainfo registry failed to find expected instance.')
109
+ assert_equal(:Rubbish, cm.semantics)
110
+ assert_equal(1, cm.max_attempts)
111
+ assert_equal(true, cm.may_have_side_effects)
112
+ assert_equal('Rubbish', cm.description)
113
+ end
114
+
115
+ def test_metainfo_resolution
116
+ c = Command.new(:Rubbish)
117
+ assert_not_nil(c.metainfo, "Command failed to lookup metainfo")
118
+ assert_equal(1, c.max_attempts)
119
+ assert_equal(true, c.may_have_side_effects)
120
+ end
121
+
122
+ def test_Command_do
123
+ c = common_command
124
+ result = c.do
125
+ verify_do(c, result, true)
126
+ end
127
+
128
+ def test_Command_undo
129
+ c = common_command
130
+ c.undo_data[:wascally]=:wabbit
131
+ result = c.undo
132
+ verify_undo(c, result)
133
+ end
134
+
135
+ def test_UndoRedo_undo
136
+ c = common_command
137
+ c2 = UndoRedoCommand.new(c)
138
+ result = c2.undo
139
+ verify_do(c, result, false)
140
+ end
141
+
142
+ def test_UndoRedo_do
143
+ c = common_command
144
+ c.undo_data[:wascally]=:wabbit
145
+ c2 = UndoRedoCommand.new(c)
146
+ result = c2.do
147
+ verify_undo(c, result)
148
+ end
149
+
150
+ def test_UnitOfWork_do
151
+ c1 = common_command
152
+ c2 = UndoRedoCommand.new(c1)
153
+ c3 = UndoRedoCommand.new(c2)
154
+ c = UnitOfWork.new(:Muddle, c1, c2, c3)
155
+ assert_equal(3, c.size)
156
+ r = c.do
157
+ verify_UnitOfWork(true, r, c, c1, c2, c3)
158
+ end
159
+
160
+
161
+ def test_UnitOfWork_redo
162
+ c1 = common_command
163
+ c2 = c1.inverse
164
+ c3 = c2.inverse
165
+ c = UnitOfWork.new(:Muddle, c1, c2, c3)
166
+ assert_equal(3, c.size)
167
+ r = c.redo
168
+ verify_UnitOfWork(false, r, c, c1, c2, c3)
169
+ end
170
+
171
+
172
+ def test_UnitOfWork_undo
173
+ c1 = common_command
174
+ c2 = c1.inverse
175
+ c3 = c1.inverse
176
+ # The order is fudged so that we can use the
177
+ # same tests we used for redo.
178
+ c = UnitOfWork.new(:Muddle, c2, c1, c3)
179
+ assert_equal(3, c.size)
180
+ r = c.undo
181
+ verify_UnitOfWork(false, r, c, c1, c2, c3)
182
+ end
183
+
184
+ def test_Fatal_do
185
+ c = common_command(:Fatal)
186
+ result = c.do
187
+ assert(result.error?)
188
+ assert_equal(1, result.notices.size)
189
+ assert_equal(FakeTarget.fatal_message, result.notices[0].message)
190
+ end
191
+
192
+ def test_Fatal_redo
193
+ c = common_command(:Fatal)
194
+ result = c.redo
195
+ assert(result.error?)
196
+ assert_equal(1, result.notices.size)
197
+ assert_equal(FakeTarget.fatal_message, result.notices[0].message)
198
+ end
199
+
200
+ def test_Fatal_undo
201
+ c = common_command(:Fatal)
202
+ result = c.undo
203
+ assert(result.error?)
204
+ assert_equal(1, result.notices.size)
205
+ assert_equal(FakeTarget.fatal_message, result.notices[0].message)
206
+ end
207
+
208
+ def test_Err_do
209
+ c = common_command(:Err)
210
+ result = c.do
211
+ assert(result.error?)
212
+ assert_equal(1, result.notices.size)
213
+ assert(result.notices[0].message.index(FakeTarget.err_message))
214
+ end
215
+
216
+ def test_Err_redo
217
+ c = common_command(:Err)
218
+ result = c.redo
219
+ assert(result.error?)
220
+ assert_equal(1, result.notices.size)
221
+ assert(result.notices[0].message.index(FakeTarget.err_message))
222
+ end
223
+
224
+ def test_Err_undo
225
+ c = common_command(:Err)
226
+ result = c.undo
227
+ assert(result.error?)
228
+ assert_equal(1, result.notices.size)
229
+ assert(result.notices[0].message.index(FakeTarget.err_message) )
230
+ end
231
+
232
+ # ==== support code =====
233
+
234
+ def common_command(semantics=:Rubbish)
235
+ c = Command.new(semantics)
236
+ c.target = FakeTarget.new
237
+ c.args[:wombat]= :gizzard
238
+ c
239
+ end
240
+
241
+ def verify_do(c, result, has_undo_data)
242
+ if result.error?
243
+ require 'nist/common/treeDump'
244
+ result.treeDump
245
+ end
246
+ assert(!result.error?)
247
+ assert_equal([[:do_Rubbish, {:wombat => :gizzard}]], c.target.internal_state )
248
+ assert_equal(:Squid, result.result)
249
+ assert_equal({:superHero => :FlamingCarrot}, result.undo_data)
250
+ expected = has_undo_data ? {:superHero => :FlamingCarrot} : {}
251
+ assert_equal(expected, c.undo_data)
252
+ assert_in_delta(2.0, result.execution_seconds, 0.1)
253
+ assert_equal(1, result.notices.size)
254
+ n = result.notices[0]
255
+ assert_equal('WARN', n.level_name)
256
+ assert_equal('FakeTarget', n.name)
257
+ assert_equal('Sufferen Succotash!', n.message)
258
+ assert(n.backtrace.size > 20)
259
+ end
260
+
261
+ def verify_undo(c, result)
262
+ if result.error?
263
+ require 'nist/common/treeDump'
264
+ result.treeDump
265
+ end
266
+ assert(!result.error?)
267
+ assert_equal([[:undo_Rubbish, {:wombat => :gizzard, :wascally => :wabbit}]], c.target.internal_state )
268
+ assert_equal(42, result.result)
269
+ assert_equal({}, result.undo_data)
270
+ assert_equal({:wascally => :wabbit}, c.undo_data)
271
+ assert_in_delta(1.0, result.execution_seconds, 0.1)
272
+ assert_equal(1, result.notices.size)
273
+ n = result.notices[0]
274
+ assert_equal('WARN', n.level_name)
275
+ assert_equal('FakeTarget', n.name)
276
+ assert_equal('Yumpin Yimminy', n.message)
277
+ assert(n.backtrace.size > 20)
278
+ end
279
+
280
+ # is_do is a Boolean,
281
+ # true for 'do'
282
+ # false for 'undo'
283
+ # The difference is not very large: it results from the different ways the two methods cache undo data.
284
+ def verify_UnitOfWork(is_do, r, c, c1, c2, c3)
285
+ assert_instance_of(Array, r.result)
286
+ assert_equal(3, r.size)
287
+ r1 = r[0]
288
+ r2 = r[1]
289
+ r3 = r[2]
290
+ # == Test shared data ==
291
+ undo_data = is_do ? {:wombat => :gizzard, :superHero => :FlamingCarrot} : {:wombat => :gizzard}
292
+ assert_equal([[:do_Rubbish, {:wombat => :gizzard}], [:undo_Rubbish, undo_data], [:do_Rubbish, {:wombat => :gizzard}]], c1.target.internal_state )
293
+ # == Test first command & result ==
294
+ assert_equal(:Squid, r1.result)
295
+ assert_equal({:superHero => :FlamingCarrot}, r1.undo_data)
296
+ undo_data = is_do ? {:superHero => :FlamingCarrot} : {}
297
+ assert_equal(undo_data, c1.undo_data)
298
+ assert_in_delta(2.0, r1.execution_seconds, 0.1)
299
+ assert_equal(1, r1.notices.size)
300
+ n = r1.notices[0]
301
+ assert_equal('WARN', n.level_name)
302
+ assert_equal('FakeTarget', n.name)
303
+ assert_equal('Sufferen Succotash!', n.message)
304
+ assert(n.backtrace.size > 20)
305
+ # == Test second command & result ==
306
+ assert_equal(42, r2.result)
307
+ assert_equal({}, r2.undo_data)
308
+ assert_in_delta(1.0, r2.execution_seconds, 0.1)
309
+ assert_equal(1, r2.notices.size)
310
+ n = r2.notices[0]
311
+ assert_equal('WARN', n.level_name)
312
+ assert_equal('FakeTarget', n.name)
313
+ assert_equal('Yumpin Yimminy', n.message)
314
+ assert(n.backtrace.size > 20)
315
+ # == Test third command & result ==
316
+ # Identical to test for first command, except:
317
+ # r1=>r3 and c1=>c3
318
+ # c3 undo_data does not exist, so is not tested
319
+ assert_equal(:Squid, r3.result)
320
+ assert_equal({:superHero => :FlamingCarrot}, r3.undo_data)
321
+ assert_in_delta(2.0, r3.execution_seconds, 0.1)
322
+ assert_equal(1, r3.notices.size)
323
+ n = r1.notices[0]
324
+ assert_equal('WARN', n.level_name)
325
+ assert_equal('FakeTarget', n.name)
326
+ assert_equal('Sufferen Succotash!', n.message)
327
+ assert(n.backtrace.size > 20)
328
+ end
329
+
330
+
331
+ end # Test_Commands
332
+
333
+ # ====================================================
334
+
335
+ if __FILE__ == $0 #directlyInvoked?
336
+ require 'test/unit/ui/console/testrunner'
337
+ Test::Unit::UI::Console::TestRunner.run(Test_Commands)
338
+ end
@@ -0,0 +1,17 @@
1
+ require 'nist/genie/genie'
2
+ require 'test/unit'
3
+
4
+ # ====================================================
5
+
6
+ class Test_Processors < Test::Unit::TestCase
7
+
8
+ def test_nothing; end
9
+
10
+ end # Test_Processors
11
+
12
+ # ====================================================
13
+
14
+ if __FILE__ == $0 #directlyInvoked?
15
+ require 'test/unit/ui/console/testrunner'
16
+ Test::Unit::UI::Console::TestRunner.run(Test_Processors)
17
+ end
@@ -0,0 +1,288 @@
1
+ require 'nist/genie/genie'
2
+ require 'test/unit'
3
+ require 'helpers'
4
+
5
+ # Not yet tested:
6
+ # Queue#processed (but called methods are tested)
7
+ # Queue#claim_seconds (but called methods are tested)
8
+
9
+ # For testing purposes, it is convenient to regard all errors are retryable.
10
+ class Log4r::LogEvent
11
+ alias retryable_error? error?
12
+ end
13
+
14
+ # ====================================================
15
+
16
+ class Test_Queues < Test::Unit::TestCase
17
+
18
+ def test_TransactionBundle
19
+ semantics = [:electron, :proton, :neutron]
20
+ entries = semantics.collect {|sem| make(sem).to_entry }
21
+ entry = TransactionBundle.new(entries)
22
+ entry.do()
23
+ assert(!entry.retry?)
24
+ assert(!entry.retry_individually(true))
25
+ assert(entry.retry_individually(false))
26
+ notDone, done = entry.partition(false)
27
+ assert_equal([], notDone)
28
+ assert_equal(entries, done)
29
+ notDone, done = entry.partition(true)
30
+ assert_equal([], notDone)
31
+ assert_equal(entries, done)
32
+ # Fake an error
33
+ bad = entries[1]
34
+ good = [entries[0], entries[2]]
35
+ bad.result.add_error('Self destruct activated')
36
+ assert(entry.retry?)
37
+ assert(!entry.retry_individually(true))
38
+ assert(!entry.retry_individually(false)) # Because of may_have_side_effects
39
+ notDone, done = entry.partition(false)
40
+ assert_equal(entries, notDone)
41
+ assert_equal([], done)
42
+ notDone, done = entry.partition(true)
43
+ assert_equal(entries, notDone)
44
+ assert_equal([], done)
45
+ # Set may_have_side_effects to false
46
+ CommandMetainfo[:proton].may_have_side_effects=false
47
+ assert(!entry.retry_individually(true))
48
+ assert(entry.retry_individually(false))
49
+ notDone, done = entry.partition(false)
50
+ assert_equal([bad], notDone)
51
+ assert_equal(good, done)
52
+ notDone, done = entry.partition(true)
53
+ assert_equal(entries, notDone)
54
+ assert_equal([], done)
55
+ end
56
+
57
+ def verify_do_undo_redo(entry)
58
+ log = entries[0].command.target.log
59
+ methods = log.collect {|e| e[0] }
60
+ assert_equal(['do_electron', 'do_proton', 'do_neutron'], methods)
61
+ end
62
+
63
+ def test_QueueEntry
64
+ cmnd = make(:Wretched)
65
+ entry = cmnd.to_entry
66
+ sleep(1)
67
+ assert_in_delta(1.0, entry.age, 0.1)
68
+ assert_equal(0, entry.num_attempts)
69
+ assert_equal(2, entry.remaining_attempts)
70
+ assert(entry.has_remaining_attempts)
71
+ assert(entry.remaining_attempts?)
72
+ assert_nil(entry.result)
73
+ assert(!entry.error?)
74
+ assert(!entry.retry?)
75
+ assert_nil(entry.when_finished)
76
+ assert_nil(entry.thread)
77
+ # Finally, run the command
78
+ entry.do()
79
+ assert_equal(1, entry.num_attempts)
80
+ assert_equal(1, entry.remaining_attempts)
81
+ assert(entry.has_remaining_attempts)
82
+ assert(entry.remaining_attempts?)
83
+ result = entry.result
84
+ assert_instance_of(Result, result)
85
+ assert_equal('Result_do_Wretched', result.result)
86
+ assert_equal(0, result.notices.size)
87
+ assert(!entry.error?)
88
+ assert(!entry.retry?)
89
+ assert_nil(entry.when_finished)
90
+ notDone, done = entry.partition(:ignoredNonsnse) # Argument is not ignored by TransactionBundle.
91
+ assert_equal([], notDone)
92
+ assert_equal([entry], done)
93
+ # Fake an error
94
+ result.notices << Log4r::LogEvent.new(5, Object.logger, [], 'Self destruct activated')
95
+ assert(entry.error?)
96
+ assert(entry.retry?)
97
+ notDone, done = entry.partition(:ignoredNonsnse)
98
+ assert_equal([entry], notDone)
99
+ assert_equal([], done)
100
+ # Test finishing timestamp (does not make sense when retry? is true, but not prevented)
101
+ assert_nil(entry.when_finished)
102
+ entry.finish
103
+ assert_instance_of(Time, entry.when_finished)
104
+ end
105
+
106
+ # Tests the distribution of que entries among the various watchers.
107
+ def test_Queue_roundrobbin
108
+ q = Queue.new
109
+ q.add_watcher(w1 = DebugWatcher.new)
110
+ q.add_watcher(w2 = DebugWatcher.new)
111
+ q.add_watcher(w3 = DebugWatcher.new)
112
+ 'Find what wind serves to advance an honest mind'.split.each {|word|
113
+ # Argument really should be a QueueEntry, but a String is
114
+ # good enough to test the distribution.
115
+ q.notify_watchers(word)
116
+ }
117
+ require 'nist/common/treeDump'
118
+ assert_equal(['Find', 'to', 'honest'], w1.to_a)
119
+ assert_equal(['what', 'advance', 'mind'], w2.to_a)
120
+ assert_equal(['serves', 'an'], w3.to_a)
121
+ end
122
+
123
+ def test_Queue
124
+ q = Queue.new
125
+ q.add_watcher(watcher = DebugWatcher.new)
126
+ t = Time.now
127
+ # Make a bunch of entries and add them to the queue
128
+ q.enqueue make(:Camembert)
129
+ q.enqueue make(:Brie)
130
+ q.enqueue make(:Gorgozola)
131
+ q.enqueue make(:Wensleydale)
132
+ q.enqueue make(:Limburger)
133
+ CommandMetainfo[:Camembert].estimated_seconds=3.0
134
+ CommandMetainfo[:Brie].estimated_seconds=5.0
135
+ CommandMetainfo[:Gorgozola].estimated_seconds=7.0
136
+ CommandMetainfo[:Wensleydale].estimated_seconds=9.0
137
+ CommandMetainfo[:Limburger].estimated_seconds=13.0
138
+ sleep(1)
139
+ expected_age = Time.now-t
140
+ assert_in_delta(expected_age, q.age_oldest_available, expected_age / 10)
141
+ assert_equal(37, q.estimated_seconds)
142
+ assert_equal(5, q.num_available)
143
+ # Test computation of number of entries to claim
144
+ # Test unlimited num_for_estimated_seconds
145
+ assert_equal(0, q.num_for_estimated_seconds(2))
146
+ assert_equal(1, q.num_for_estimated_seconds(4))
147
+ assert_equal(2, q.num_for_estimated_seconds(9))
148
+ assert_equal(3, q.num_for_estimated_seconds(16))
149
+ assert_equal(4, q.num_for_estimated_seconds(25))
150
+ assert_equal(5, q.num_for_estimated_seconds(38))
151
+ # Test limited num_for_estimated_seconds
152
+ assert_equal(1, q.num_for_estimated_seconds(9, 1))
153
+ assert_equal(2, q.num_for_estimated_seconds(16, 2))
154
+ assert_equal(2, q.num_for_estimated_seconds(25, 2))
155
+ assert_equal(2, q.num_for_estimated_seconds(38, 2))
156
+ # Now try claiming some entries
157
+ # Claim 1
158
+ entry = e1 = q.claim_one
159
+ assert_instance_of(QueueEntry, entry)
160
+ assert_same(RC[:Camembert], entry.command)
161
+ entry = e2 = q.claim_num(1)
162
+ assert_instance_of(QueueEntry, entry)
163
+ assert_same(RC[:Brie], entry.command)
164
+ assert_equal(2, q.claimed.size)
165
+ assert_same(entry, q.claimed[1])
166
+ # Claim 2
167
+ entry = e3 = q.claim_num(2)
168
+ assert_instance_of(TransactionBundle, entry)
169
+ kids = entry.children
170
+ assert_equal(2, kids.size)
171
+ assert_same(RC[:Gorgozola], kids[0].command)
172
+ assert_same(RC[:Wensleydale], kids[1].command)
173
+ assert_equal(3, q.claimed.size)
174
+ assert_same(entry, q.claimed[2])
175
+ # Claim 3
176
+ q.enqueue make(:Sapsago)
177
+ q.enqueue make(:Asiago)
178
+ entry = e4 = q.claim_num(3)
179
+ assert_instance_of(TransactionBundle, entry)
180
+ kids = entry.children
181
+ assert_equal(3, kids.size)
182
+ assert_same(RC[:Limburger], kids[0].command)
183
+ assert_same(RC[:Sapsago], kids[1].command)
184
+ assert_same(RC[:Asiago], kids[2].command)
185
+ assert_equal(4, q.claimed.size)
186
+ assert_same(entry, q.claimed[3])
187
+ # Test some private, internally used messages
188
+ # _relinquish
189
+ q.enqueue make(:Chocolate)
190
+ e5 = q.claim_one
191
+ assert_equal(5, q.claimed.size)
192
+ assert_same(e5, q.claimed[4])
193
+ q._relinquish(e5)
194
+ # _finish
195
+ assert_equal(0, q.num_available)
196
+ assert_equal(4, q.claimed.size)
197
+ assert_equal(0, q.history.size)
198
+ q._finish(e2)
199
+ assert_equal(0, q.num_available)
200
+ assert_equal(3, q.claimed.size)
201
+ assert_equal(1, q.history.size)
202
+ assert_same(e2, q.history[0])
203
+ assert_same(e1, q.claimed[0])
204
+ assert_same(e3, q.claimed[1])
205
+ # _reschedule
206
+ q.enqueue make(:Waffle)
207
+ q._reschedule(e1)
208
+ assert_equal(2, q.num_available)
209
+ assert_equal(2, q.claimed.size)
210
+ assert_equal(1, q.history.size)
211
+ assert_same(e1, q.available[0])
212
+ assert_same(e3, q.claimed[0])
213
+ assert_same(e4, q.claimed[1])
214
+ end
215
+
216
+ def test_do
217
+ q = Queue.new
218
+ q.add_watcher(watcher = DebugWatcher.new)
219
+ log = Array.new
220
+ semantics = [:mercury, :venus, :mars, :saturn, :jupiter]
221
+ commands = semantics.collect {|sem| make(sem, log) }
222
+ threads = commands.collect {|cmnd|
223
+ Thread.new(q, cmnd, log) {|queue, c, lg|
224
+ sem = c.semantics.to_s
225
+ lg << 'Enqueue_'+sem
226
+ queue.do(c)
227
+ lg << 'Fini_'+ sem
228
+ }
229
+ sleep(0.1) # Let the new thread get as far as it can before spawning a new one
230
+ }
231
+ semantics.each {|sem|
232
+ s = sem.to_s
233
+ log << 'Claim_'+s
234
+ entry = q.claim_one
235
+ log << 'Execute_'+s
236
+ entry.do
237
+ log << 'Done_'+s
238
+ q.processed(entry)
239
+ sleep(0.1) # Let revived thread get as far as it can
240
+ log << 'Finished_'+s
241
+ }
242
+ expected = [
243
+ 'Enqueue_mercury',
244
+ 'Enqueue_venus',
245
+ 'Enqueue_mars',
246
+ 'Enqueue_saturn',
247
+ 'Enqueue_jupiter',
248
+ 'Claim_mercury',
249
+ 'Execute_mercury',
250
+ [:do_mercury, {}, {}],
251
+ 'Done_mercury',
252
+ 'Fini_mercury',
253
+ 'Finished_mercury',
254
+ 'Claim_venus',
255
+ 'Execute_venus',
256
+ [:do_venus, {}, {}],
257
+ 'Done_venus',
258
+ 'Fini_venus',
259
+ 'Finished_venus',
260
+ 'Claim_mars',
261
+ 'Execute_mars',
262
+ [:do_mars, {}, {}],
263
+ 'Done_mars',
264
+ 'Fini_mars',
265
+ 'Finished_mars',
266
+ 'Claim_saturn',
267
+ 'Execute_saturn',
268
+ [:do_saturn, {}, {}],
269
+ 'Done_saturn',
270
+ 'Fini_saturn',
271
+ 'Finished_saturn',
272
+ 'Claim_jupiter',
273
+ 'Execute_jupiter',
274
+ [:do_jupiter, {}, {}],
275
+ 'Done_jupiter',
276
+ 'Fini_jupiter',
277
+ 'Finished_jupiter' ]
278
+ assert_equal(expected, log)
279
+ end
280
+
281
+ end # Test_Queues
282
+
283
+ # ====================================================
284
+
285
+ if __FILE__ == $0 #directlyInvoked?
286
+ require 'test/unit/ui/console/testrunner'
287
+ Test::Unit::UI::Console::TestRunner.run(Test_Queues)
288
+ end