summaryrefslogtreecommitdiff
path: root/test/test_plugins_threshold.rb
blob: 2ae5742d7903f84bbb9648cd4a0c07d962570b0e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
$:.unshift File.join(File.dirname(__FILE__), '../lib')

require 'test/unit'
require 'rbot/config'
require 'rbot/plugins'
require 'rbot/message'

require 'pp'

include Irc::Bot::Plugins

class TestRealBotModule < BotModule
  def initialize
  end
end

class MockModule < BotModule
  attr_reader :test_called_at
  attr_reader :test_arg_called_at
  attr_reader :connect_called_at
  attr_reader :test_arg_val

  def initialize(prio)
    @test_called_at = []
    @test_arg_called_at = []
    @connect_called_at = []
    @priority = prio
    @test_arg_val = nil
  end

  def test
    @test_called_at << Time.new
  end

  def test_arg a
    @test_arg_val = a
    @test_arg_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
      def @@manager.error(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.core_modules.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_above
    @@manager.delegate('test', :above => 3)

    assert_equal 0, @mock1.test_called_at.size
    assert_equal 0, @mock2.test_called_at.size
    assert_equal 0, @mock3.test_called_at.size
    assert_equal 1, @mock4.test_called_at.size
    assert_equal 1, @mock5.test_called_at.size
  end

  def test_below
    @@manager.delegate('test', :below => 3)

    assert_equal 1, @mock1.test_called_at.size
    assert_equal 1, @mock2.test_called_at.size
    assert_equal 0, @mock3.test_called_at.size
    assert_equal 0, @mock4.test_called_at.size
    assert_equal 0, @mock5.test_called_at.size
  end

  def test_fast_delagate_above
    @@manager.delegate('connect', :above => 3)

    assert_equal 0, @mock1.connect_called_at.size
    assert_equal 0, @mock2.connect_called_at.size
    assert_equal 0, @mock3.connect_called_at.size
    assert_equal 1, @mock4.connect_called_at.size
    assert_equal 1, @mock5.connect_called_at.size
  end

  def test_fast_delagate_below
    @@manager.delegate('connect', :below => 3)

    assert_equal 1, @mock1.connect_called_at.size
    assert_equal 1, @mock2.connect_called_at.size
    assert_equal 0, @mock3.connect_called_at.size
    assert_equal 0, @mock4.connect_called_at.size
    assert_equal 0, @mock5.connect_called_at.size
  end

  def test_call_with_args
    @@manager.delegate('test_arg', 1, :above => 3)

    assert_equal 0, @mock3.test_arg_called_at.size
    assert_equal 1, @mock4.test_arg_called_at.size
    assert_equal 1, @mock4.test_arg_val
  end
end