IRC Framework: Channel.npname()
[rbot] / test / test_plugins_threshold.rb
1 $:.unshift File.join(File.dirname(__FILE__), '../lib')
2
3 require 'test/unit'
4 require 'rbot/config'
5 require 'rbot/plugins'
6
7 require 'pp'
8
9 include Irc::Bot::Plugins
10
11 class TestRealBotModule < BotModule
12   def initialize
13   end
14 end
15
16 class MockModule < BotModule
17   attr_reader :test_called_at
18   attr_reader :test_arg_called_at
19   attr_reader :connect_called_at
20   attr_reader :test_arg_val
21
22   def initialize(prio)
23     @test_called_at = []
24     @test_arg_called_at = []
25     @connect_called_at = []
26     @priority = prio
27     @test_arg_val = nil
28   end
29
30   def test
31     @test_called_at << Time.new
32   end
33
34   def test_arg a
35     @test_arg_val = a
36     @test_arg_called_at << Time.new
37   end
38
39   # an connect fast-delegate event
40   def connect
41     @connect_called_at << Time.new
42   end
43
44   def botmodule_class
45     :CoreBotModule
46   end
47 end
48
49 class PluginsPriorityTest < Test::Unit::TestCase
50   @@manager = nil
51
52   def setup
53     @mock1 = MockModule.new(1)
54     @mock2 = MockModule.new(2)
55     @mock3 = MockModule.new(3)
56     @mock4 = MockModule.new(4)
57     @mock5 = MockModule.new(5)
58
59     # This whole thing is a PITA because PluginManagerClass is a singleton
60     unless @@manager
61       @@manager = PluginManagerClass.instance
62
63       # this is needed because debug is setup in the rbot starter
64       def @@manager.debug(m); puts m; end
65       def @@manager.error(m); puts m; end
66       @@manager.instance_eval { alias real_sort_modules sort_modules }
67       def @@manager.sort_modules
68         @sort_call_count ||= 0
69         @sort_call_count += 1
70         real_sort_modules
71       end
72     end
73     @@manager.instance_eval { @sort_call_count = nil }
74     @@manager.mark_priorities_dirty
75
76     # We add the modules to the lists in the wrong order
77     # on purpose to make sure the sort is working
78     @@manager.plugins.clear
79     @@manager.core_modules.clear
80     @@manager.plugins << @mock1
81     @@manager.plugins << @mock4
82     @@manager.plugins << @mock3
83     @@manager.plugins << @mock2
84     @@manager.plugins << @mock5
85
86     dlist = @@manager.instance_eval {@delegate_list['connect'.intern]}
87     dlist.clear
88     dlist << @mock1
89     dlist << @mock4
90     dlist << @mock3
91     dlist << @mock2
92     dlist << @mock5
93   end
94
95   def test_above
96     @@manager.delegate_event('test', :above => 3)
97
98     assert_equal 0, @mock1.test_called_at.size
99     assert_equal 0, @mock2.test_called_at.size
100     assert_equal 0, @mock3.test_called_at.size
101     assert_equal 1, @mock4.test_called_at.size
102     assert_equal 1, @mock5.test_called_at.size
103   end
104
105   def test_below
106     @@manager.delegate_event('test', :below => 3)
107
108     assert_equal 1, @mock1.test_called_at.size
109     assert_equal 1, @mock2.test_called_at.size
110     assert_equal 0, @mock3.test_called_at.size
111     assert_equal 0, @mock4.test_called_at.size
112     assert_equal 0, @mock5.test_called_at.size
113   end
114
115   def test_fast_delagate_above
116     @@manager.delegate_event('connect', :above => 3)
117
118     assert_equal 0, @mock1.connect_called_at.size
119     assert_equal 0, @mock2.connect_called_at.size
120     assert_equal 0, @mock3.connect_called_at.size
121     assert_equal 1, @mock4.connect_called_at.size
122     assert_equal 1, @mock5.connect_called_at.size
123   end
124
125   def test_fast_delagate_above
126     @@manager.delegate_event('connect', :below => 3)
127
128     assert_equal 1, @mock1.connect_called_at.size
129     assert_equal 1, @mock2.connect_called_at.size
130     assert_equal 0, @mock3.connect_called_at.size
131     assert_equal 0, @mock4.connect_called_at.size
132     assert_equal 0, @mock5.connect_called_at.size
133   end
134
135   def test_call_with_args
136     @@manager.delegate_event('test_arg', :above => 3, :args => [1])
137
138     assert_equal 0, @mock3.test_arg_called_at.size
139     assert_equal 1, @mock4.test_arg_called_at.size
140     assert_equal 1, @mock4.test_arg_val
141   end
142 end
143