]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/commitdiff
Added unit test for botmodule event priorities.
authordoki_pen <rcorsaro@optaros.com>
Wed, 9 Apr 2008 12:37:23 +0000 (08:37 -0400)
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Wed, 9 Apr 2008 20:40:19 +0000 (22:40 +0200)
test/test_plugins_priority.rb [new file with mode: 0644]

diff --git a/test/test_plugins_priority.rb b/test/test_plugins_priority.rb
new file mode 100644 (file)
index 0000000..7559655
--- /dev/null
@@ -0,0 +1,167 @@
+$:.unshift File.join(File.dirname(__FILE__), '../lib')
+
+require 'test/unit'
+require 'rbot/config'
+require 'rbot/plugins'
+
+
+include Irc::Bot::Plugins
+
+class TestRealBotModule < BotModule
+  def initialize
+  end
+end
+
+class MockModule < BotModule
+  attr_reader :test_called_at
+  attr_reader :connect_called_at
+
+  def initialize(prio)
+    @test_called_at = []
+    @connect_called_at = []
+    @priority = prio
+  end
+
+  def test
+    @test_called_at << Time.new
+  end
+
+  # an connect fast-delegate event
+  def connect
+    @connect_called_at << Time.new
+  end
+
+  def botmodule_class
+    :CoreBotModule
+  end
+end
+
+class PluginsPriorityTest < Test::Unit::TestCase
+  @@manager = nil
+
+  def setup
+    @mock1 = MockModule.new(1)
+    @mock2 = MockModule.new(2)
+    @mock3 = MockModule.new(3)
+    @mock4 = MockModule.new(4)
+    @mock5 = MockModule.new(5)
+      
+    # This whole thing is a PITA because PluginManagerClass is a singleton
+    unless @@manager
+      @@manager = PluginManagerClass.instance
+
+      # this is needed because debug is setup in the rbot starter
+      def @@manager.debug(m); puts m; end
+      @@manager.instance_eval { alias real_sort_modules sort_modules }
+      def @@manager.sort_modules
+        @sort_call_count ||= 0
+        @sort_call_count += 1
+        real_sort_modules
+      end
+    end
+    @@manager.instance_eval { @sort_call_count = nil }
+    @@manager.mark_priorities_dirty
+
+    # We add the modules to the lists in the wrong order 
+    # on purpose to make sure the sort is working
+    @@manager.plugins.clear
+    @@manager.plugins << @mock1
+    @@manager.plugins << @mock4
+    @@manager.plugins << @mock3
+    @@manager.plugins << @mock2
+    @@manager.plugins << @mock5
+
+    dlist = @@manager.instance_eval {@delegate_list['connect'.intern]}
+    dlist.clear
+    dlist << @mock1
+    dlist << @mock4
+    dlist << @mock3
+    dlist << @mock2
+    dlist << @mock5
+  end
+    
+  def test_default_priority
+    plugin = TestRealBotModule.new
+    assert_equal 1, plugin.priority
+  end
+
+  def test_sort_called
+    @@manager.delegate('test')
+
+    assert @@manager.instance_eval { @sort_call_count }
+  end
+
+  def test_sort_called_once
+    @@manager.delegate('test')
+    @@manager.delegate('test')
+    @@manager.delegate('test')
+    @@manager.delegate('test')
+
+    assert_equal 1, @@manager.instance_eval { @sort_call_count }
+  end
+
+  def test_sorted
+    plugins = @@manager.plugins
+    assert_equal @mock1, plugins[0]
+    assert_equal @mock4, plugins[1]
+    assert_equal @mock3, plugins[2]
+    assert_equal @mock2, plugins[3]
+    assert_equal @mock5, plugins[4]
+
+    @@manager.sort_modules
+    plugins = @@manager.instance_eval { @sorted_modules }
+
+    assert_equal @mock1, plugins[0]
+    assert_equal @mock2, plugins[1]
+    assert_equal @mock3, plugins[2]
+    assert_equal @mock4, plugins[3]
+    assert_equal @mock5, plugins[4]
+  end
+
+  def test_fast_delegate_sort
+    list = @@manager.instance_eval {@delegate_list['connect'.intern]}
+    assert_equal @mock1, list[0]
+    assert_equal @mock4, list[1]
+    assert_equal @mock3, list[2]
+    assert_equal @mock2, list[3]
+    assert_equal @mock5, list[4]
+
+    @@manager.sort_modules
+    assert_equal @mock1, list[0]
+    assert_equal @mock2, list[1]
+    assert_equal @mock3, list[2]
+    assert_equal @mock4, list[3]
+    assert_equal @mock5, list[4]
+  end
+
+  def test_slow_called_in_order
+    @@manager.delegate('test')
+    assert_equal 1, @mock1.test_called_at.size
+    assert_equal 1, @mock2.test_called_at.size
+    assert_equal 1, @mock3.test_called_at.size
+    assert_equal 1, @mock4.test_called_at.size
+    assert_equal 1, @mock5.test_called_at.size
+
+    assert @mock1.test_called_at.first < @mock2.test_called_at.first
+    assert @mock2.test_called_at.first < @mock3.test_called_at.first
+    assert @mock3.test_called_at.first < @mock4.test_called_at.first
+    assert @mock4.test_called_at.first < @mock5.test_called_at.first
+  end
+
+  def test_fast_called_in_order
+    @@manager.delegate('connect')
+    assert_equal 1, @mock1.connect_called_at.size
+    assert_equal 1, @mock2.connect_called_at.size
+    assert_equal 1, @mock3.connect_called_at.size
+    assert_equal 1, @mock4.connect_called_at.size
+    assert_equal 1, @mock5.connect_called_at.size
+
+    assert @mock1.connect_called_at.first < @mock2.connect_called_at.first
+    assert @mock2.connect_called_at.first < @mock3.connect_called_at.first
+    assert @mock3.connect_called_at.first < @mock4.connect_called_at.first
+    assert @mock4.connect_called_at.first < @mock5.connect_called_at.first
+  end
+end
+
+
+