genie 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/genie-0.1.gem +0 -0
- data/genie-0.1/docs/classes/BasicCommand.html +249 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000070.html +18 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000071.html +18 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000072.html +18 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000073.html +18 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000074.html +16 -0
- data/genie-0.1/docs/classes/Command.html +277 -0
- data/genie-0.1/docs/classes/Command.src/M000052.html +20 -0
- data/genie-0.1/docs/classes/Command.src/M000053.html +18 -0
- data/genie-0.1/docs/classes/Command.src/M000054.html +20 -0
- data/genie-0.1/docs/classes/Command.src/M000055.html +20 -0
- data/genie-0.1/docs/classes/Command.src/M000056.html +18 -0
- data/genie-0.1/docs/classes/Command.src/M000057.html +18 -0
- data/genie-0.1/docs/classes/Command.src/M000058.html +23 -0
- data/genie-0.1/docs/classes/CommandMetainfo.html +362 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000042.html +18 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000043.html +18 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000044.html +19 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000045.html +25 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000046.html +21 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000047.html +21 -0
- data/genie-0.1/docs/classes/CompoundResult.html +359 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000075.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000076.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000078.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000079.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000080.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000082.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000084.html +20 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000085.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000086.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000087.html +20 -0
- data/genie-0.1/docs/classes/EntryProcessor.html +223 -0
- data/genie-0.1/docs/classes/EntryProcessor.src/M000008.html +18 -0
- data/genie-0.1/docs/classes/EntryProcessor.src/M000009.html +20 -0
- data/genie-0.1/docs/classes/EntryProcessor.src/M000010.html +18 -0
- data/genie-0.1/docs/classes/EntryProcessor.src/M000011.html +23 -0
- data/genie-0.1/docs/classes/Log4r.html +114 -0
- data/genie-0.1/docs/classes/Log4r/LogEvent.html +153 -0
- data/genie-0.1/docs/classes/Log4r/LogEvent.src/M000123.html +16 -0
- data/genie-0.1/docs/classes/NotifiedProcessor.html +155 -0
- data/genie-0.1/docs/classes/NotifiedProcessor.src/M000094.html +22 -0
- data/genie-0.1/docs/classes/NullTransactionController.html +191 -0
- data/genie-0.1/docs/classes/NullTransactionController.src/M000030.html +16 -0
- data/genie-0.1/docs/classes/NullTransactionController.src/M000031.html +16 -0
- data/genie-0.1/docs/classes/Object.html +154 -0
- data/genie-0.1/docs/classes/Object.src/M000103.html +16 -0
- data/genie-0.1/docs/classes/Periodic.html +564 -0
- data/genie-0.1/docs/classes/Periodic.src/M000124.html +26 -0
- data/genie-0.1/docs/classes/Periodic.src/M000125.html +21 -0
- data/genie-0.1/docs/classes/Periodic.src/M000126.html +18 -0
- data/genie-0.1/docs/classes/Periodic.src/M000127.html +18 -0
- data/genie-0.1/docs/classes/Periodic.src/M000128.html +31 -0
- data/genie-0.1/docs/classes/Periodic.src/M000129.html +30 -0
- data/genie-0.1/docs/classes/Periodic.src/M000130.html +18 -0
- data/genie-0.1/docs/classes/Periodic.src/M000131.html +18 -0
- data/genie-0.1/docs/classes/Periodic.src/M000132.html +16 -0
- data/genie-0.1/docs/classes/PollingProcessor.html +303 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000088.html +23 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000089.html +19 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000091.html +22 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000092.html +18 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000093.html +18 -0
- data/genie-0.1/docs/classes/Queue.html +562 -0
- data/genie-0.1/docs/classes/Queue.src/M000104.html +22 -0
- data/genie-0.1/docs/classes/Queue.src/M000105.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000106.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000107.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000108.html +21 -0
- data/genie-0.1/docs/classes/Queue.src/M000109.html +21 -0
- data/genie-0.1/docs/classes/Queue.src/M000110.html +22 -0
- data/genie-0.1/docs/classes/Queue.src/M000111.html +16 -0
- data/genie-0.1/docs/classes/Queue.src/M000112.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000113.html +19 -0
- data/genie-0.1/docs/classes/Queue.src/M000114.html +23 -0
- data/genie-0.1/docs/classes/Queue.src/M000115.html +21 -0
- data/genie-0.1/docs/classes/Queue.src/M000116.html +19 -0
- data/genie-0.1/docs/classes/Queue.src/M000117.html +20 -0
- data/genie-0.1/docs/classes/Queue.src/M000118.html +25 -0
- data/genie-0.1/docs/classes/Queue.src/M000119.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000120.html +22 -0
- data/genie-0.1/docs/classes/Queue.src/M000121.html +22 -0
- data/genie-0.1/docs/classes/Queue.src/M000122.html +20 -0
- data/genie-0.1/docs/classes/QueueDispatcher.html +247 -0
- data/genie-0.1/docs/classes/QueueDispatcher.src/M000048.html +18 -0
- data/genie-0.1/docs/classes/QueueDispatcher.src/M000049.html +21 -0
- data/genie-0.1/docs/classes/QueueDispatcher.src/M000050.html +18 -0
- data/genie-0.1/docs/classes/QueueDispatcher.src/M000051.html +32 -0
- data/genie-0.1/docs/classes/QueueEntry.html +522 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000012.html +21 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000013.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000014.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000015.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000017.html +16 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000018.html +19 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000020.html +19 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000022.html +19 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000023.html +21 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000024.html +19 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000025.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000026.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000028.html +18 -0
- data/genie-0.1/docs/classes/Result.html +289 -0
- data/genie-0.1/docs/classes/Result.src/M000063.html +20 -0
- data/genie-0.1/docs/classes/Result.src/M000064.html +18 -0
- data/genie-0.1/docs/classes/Result.src/M000066.html +18 -0
- data/genie-0.1/docs/classes/Result.src/M000068.html +18 -0
- data/genie-0.1/docs/classes/Result.src/M000069.html +19 -0
- data/genie-0.1/docs/classes/SemanticCommand.html +229 -0
- data/genie-0.1/docs/classes/SemanticCommand.src/M000059.html +19 -0
- data/genie-0.1/docs/classes/SemanticCommand.src/M000060.html +18 -0
- data/genie-0.1/docs/classes/SemanticCommand.src/M000061.html +18 -0
- data/genie-0.1/docs/classes/TransactionBundle.html +260 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000001.html +18 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000002.html +20 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000003.html +20 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000004.html +18 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000005.html +18 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000007.html +19 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.html +308 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000095.html +19 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000096.html +16 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000097.html +16 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000098.html +16 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000099.html +18 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000101.html +18 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000102.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.html +322 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000032.html +19 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000033.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000034.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000035.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000036.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000037.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000038.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000039.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000040.html +18 -0
- data/genie-0.1/docs/created.rid +1 -0
- data/genie-0.1/docs/dot/f_0.dot +14 -0
- data/genie-0.1/docs/dot/f_0.png +0 -0
- data/genie-0.1/docs/dot/f_1.dot +14 -0
- data/genie-0.1/docs/dot/f_1.png +0 -0
- data/genie-0.1/docs/dot/f_2.dot +14 -0
- data/genie-0.1/docs/dot/f_2.png +0 -0
- data/genie-0.1/docs/dot/f_3.dot +84 -0
- data/genie-0.1/docs/dot/f_3.png +0 -0
- data/genie-0.1/docs/dot/f_4.dot +14 -0
- data/genie-0.1/docs/dot/f_4.png +0 -0
- data/genie-0.1/docs/dot/f_5.dot +78 -0
- data/genie-0.1/docs/dot/f_5.png +0 -0
- data/genie-0.1/docs/dot/f_6.dot +50 -0
- data/genie-0.1/docs/dot/f_6.png +0 -0
- data/genie-0.1/docs/dot/f_7.dot +57 -0
- data/genie-0.1/docs/dot/f_7.png +0 -0
- data/genie-0.1/docs/dot/m_5_0.dot +30 -0
- data/genie-0.1/docs/dot/m_5_0.png +0 -0
- data/genie-0.1/docs/dot/m_7_0.dot +39 -0
- data/genie-0.1/docs/dot/m_7_0.png +0 -0
- data/genie-0.1/docs/files/License_txt.html +161 -0
- data/genie-0.1/docs/files/ReadMe_Amber_txt.html +491 -0
- data/genie-0.1/docs/files/ReadMe_txt.html +444 -0
- data/genie-0.1/docs/files/nist/genie/commands_rb.html +121 -0
- data/genie-0.1/docs/files/nist/genie/genie_rb.html +116 -0
- data/genie-0.1/docs/files/nist/genie/processors_rb.html +111 -0
- data/genie-0.1/docs/files/nist/genie/queues_rb.html +118 -0
- data/genie-0.1/docs/files/nist/genie/results_rb.html +117 -0
- data/genie-0.1/docs/fr_class_index.html +46 -0
- data/genie-0.1/docs/fr_file_index.html +34 -0
- data/genie-0.1/docs/fr_method_index.html +160 -0
- data/genie-0.1/docs/images/overview.jpg +0 -0
- data/genie-0.1/docs/index.html +24 -0
- data/genie-0.1/docs/rdoc-style.css +208 -0
- data/genie-0.1/lib/nist/genie/commands.rb +413 -0
- data/genie-0.1/lib/nist/genie/genie.rb +4 -0
- data/genie-0.1/lib/nist/genie/processors.rb +382 -0
- data/genie-0.1/lib/nist/genie/queues.rb +435 -0
- data/genie-0.1/lib/nist/genie/results.rb +113 -0
- data/genie-0.1/tests/helpers.rb +45 -0
- data/genie-0.1/tests/test_commands.rb +338 -0
- data/genie-0.1/tests/test_processors.rb +17 -0
- data/genie-0.1/tests/test_queues.rb +288 -0
- data/genie-0.1/tests/test_results.rb +37 -0
- data/trimurti-0.1.gem +0 -0
- data/trimurti-0.1/docs/classes/Array.html +176 -0
- data/trimurti-0.1/docs/classes/Array.src/M000005.html +19 -0
- data/trimurti-0.1/docs/classes/Array.src/M000006.html +19 -0
- data/trimurti-0.1/docs/classes/Asserter.html +136 -0
- data/trimurti-0.1/docs/classes/Brahma.html +360 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000029.html +21 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000030.html +20 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000031.html +36 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000032.html +18 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000033.html +20 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000034.html +21 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000035.html +25 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000036.html +22 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000037.html +22 -0
- data/trimurti-0.1/docs/classes/ComponentSpec.html +275 -0
- data/trimurti-0.1/docs/classes/ComponentSpec.src/M000001.html +21 -0
- data/trimurti-0.1/docs/classes/ComponentSpec.src/M000002.html +18 -0
- data/trimurti-0.1/docs/classes/DRb.html +165 -0
- data/trimurti-0.1/docs/classes/DRb.src/M000062.html +18 -0
- data/trimurti-0.1/docs/classes/DRb.src/M000063.html +18 -0
- data/trimurti-0.1/docs/classes/GUID.html +129 -0
- data/trimurti-0.1/docs/classes/Linda.html +444 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000007.html +16 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000008.html +16 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000009.html +20 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000010.html +16 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000011.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000012.html +21 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000013.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000014.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000015.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000016.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000017.html +20 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000018.html +20 -0
- data/trimurti-0.1/docs/classes/Object.html +153 -0
- data/trimurti-0.1/docs/classes/Object.src/M000021.html +18 -0
- data/trimurti-0.1/docs/classes/Plugins.html +174 -0
- data/trimurti-0.1/docs/classes/Plugins.src/M000024.html +32 -0
- data/trimurti-0.1/docs/classes/Plugins.src/M000025.html +32 -0
- data/trimurti-0.1/docs/classes/Plugins/Spec.html +267 -0
- data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000026.html +22 -0
- data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000027.html +18 -0
- data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000028.html +20 -0
- data/trimurti-0.1/docs/classes/QBE_ID.html +147 -0
- data/trimurti-0.1/docs/classes/QBE_ID.src/M000059.html +18 -0
- data/trimurti-0.1/docs/classes/QueryByExample.html +270 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000054.html +17 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000055.html +17 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000056.html +17 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000057.html +17 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000058.html +17 -0
- data/trimurti-0.1/docs/classes/Shiva.html +159 -0
- data/trimurti-0.1/docs/classes/Shiva.src/M000060.html +18 -0
- data/trimurti-0.1/docs/classes/Shiva.src/M000061.html +19 -0
- data/trimurti-0.1/docs/classes/String.html +176 -0
- data/trimurti-0.1/docs/classes/String.src/M000022.html +16 -0
- data/trimurti-0.1/docs/classes/String.src/M000023.html +16 -0
- data/trimurti-0.1/docs/classes/Symbol.html +176 -0
- data/trimurti-0.1/docs/classes/Symbol.src/M000003.html +16 -0
- data/trimurti-0.1/docs/classes/Symbol.src/M000004.html +16 -0
- data/trimurti-0.1/docs/classes/Trimurti.html +189 -0
- data/trimurti-0.1/docs/classes/Trimurti.src/M000019.html +16 -0
- data/trimurti-0.1/docs/classes/Trimurti.src/M000020.html +16 -0
- data/trimurti-0.1/docs/classes/Vishnu.html +563 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000038.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000039.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000040.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000041.html +22 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000042.html +23 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000043.html +24 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000044.html +24 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000045.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000046.html +22 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000047.html +20 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000048.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000049.html +22 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000050.html +20 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000051.html +19 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000052.html +30 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000053.html +21 -0
- data/trimurti-0.1/docs/created.rid +1 -0
- data/trimurti-0.1/docs/dot/f_0.dot +14 -0
- data/trimurti-0.1/docs/dot/f_0.png +0 -0
- data/trimurti-0.1/docs/dot/f_1.dot +14 -0
- data/trimurti-0.1/docs/dot/f_1.png +0 -0
- data/trimurti-0.1/docs/dot/f_2.dot +14 -0
- data/trimurti-0.1/docs/dot/f_2.png +0 -0
- data/trimurti-0.1/docs/dot/f_3.dot +39 -0
- data/trimurti-0.1/docs/dot/f_3.png +0 -0
- data/trimurti-0.1/docs/dot/f_4.dot +39 -0
- data/trimurti-0.1/docs/dot/f_4.png +0 -0
- data/trimurti-0.1/docs/dot/f_5.dot +69 -0
- data/trimurti-0.1/docs/dot/f_5.png +0 -0
- data/trimurti-0.1/docs/dot/f_6.dot +149 -0
- data/trimurti-0.1/docs/dot/f_6.png +0 -0
- data/trimurti-0.1/docs/dot/m_3_0.dot +30 -0
- data/trimurti-0.1/docs/dot/m_3_0.png +0 -0
- data/trimurti-0.1/docs/dot/m_4_0.dot +39 -0
- data/trimurti-0.1/docs/dot/m_4_0.png +0 -0
- data/trimurti-0.1/docs/dot/m_5_0.dot +40 -0
- data/trimurti-0.1/docs/dot/m_5_0.png +0 -0
- data/trimurti-0.1/docs/dot/m_5_1.dot +30 -0
- data/trimurti-0.1/docs/dot/m_5_1.png +0 -0
- data/trimurti-0.1/docs/dot/m_6_0.dot +40 -0
- data/trimurti-0.1/docs/dot/m_6_0.png +0 -0
- data/trimurti-0.1/docs/dot/m_6_1.dot +30 -0
- data/trimurti-0.1/docs/dot/m_6_1.png +0 -0
- data/trimurti-0.1/docs/dot/m_6_2.dot +30 -0
- data/trimurti-0.1/docs/dot/m_6_2.png +0 -0
- data/trimurti-0.1/docs/files/License_txt.html +132 -0
- data/trimurti-0.1/docs/files/ReadMe_Amber_txt.html +491 -0
- data/trimurti-0.1/docs/files/ReadMe_txt.html +694 -0
- data/trimurti-0.1/docs/files/nist/trimurti/linda_rb.html +129 -0
- data/trimurti-0.1/docs/files/nist/trimurti/plugins_rb.html +129 -0
- data/trimurti-0.1/docs/files/nist/trimurti/queryByExample_rb.html +128 -0
- data/trimurti-0.1/docs/files/nist/trimurti/trimurti_rb.html +151 -0
- data/trimurti-0.1/docs/fr_class_index.html +43 -0
- data/trimurti-0.1/docs/fr_file_index.html +33 -0
- data/trimurti-0.1/docs/fr_method_index.html +89 -0
- data/trimurti-0.1/docs/images/overview.jpg +0 -0
- data/trimurti-0.1/docs/index.html +24 -0
- data/trimurti-0.1/docs/rdoc-style.css +208 -0
- data/trimurti-0.1/lib/nist/trimurti/linda.rb +163 -0
- data/trimurti-0.1/lib/nist/trimurti/plugins.rb +107 -0
- data/trimurti-0.1/lib/nist/trimurti/queryByExample.rb +81 -0
- data/trimurti-0.1/lib/nist/trimurti/trimurti.rb +433 -0
- data/trimurti-0.1/tests/test_linda.rb +111 -0
- data/trimurti-0.1/tests/test_trimurti.rb +247 -0
- 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
|