genie 0.1

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 (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