aboutsummaryrefslogtreecommitdiffstats
path: root/test/core/test_plugin.rb
blob: 6cc81de15f132f56cbba91b983a47f21b0fd97b2 (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
145
146
147
148
149
150
151
# -*- coding: utf-8 -*-

require 'test/unit'
require 'rubygems'
require 'mocha'
require File.expand_path(File.dirname(__FILE__) + '/../helper')

miquire :core, 'plugin'

class TC_Plugin < Test::Unit::TestCase
  def setup
    Plugin.clear!
  end

  must "basic plugin" do
    sum = 0
    Plugin.create(:event) do
      on_increase do |v|
        sum += v end

      filter_increase do |v|
        [v * 2]
      end
    end
    Event[:increase].call(1)
    Delayer.run while not Delayer.empty?
    assert_equal(2, sum)
  end

  must "filter in another thread" do
    filter_thread = nil
    Plugin.create(:event) do
      on_thread do
      end

      filter_thread do
        filter_thread = Thread.current
        []
      end
    end
    Event[:thread].call
    Delayer.run while not Delayer.empty?
    assert filter_thread
    assert_equal Thread.current, filter_thread

    Event.filter_another_thread = true
    filter_thread = nil
    r = true
    Event[:thread].call.next{ r = false }.trap{ r = false }

    Delayer.run while r
    # p r
    # p SerialThread.instance_eval{ @queue.size }
    # p Delayer.empty?
    assert filter_thread
    assert_not_equal Thread.current, filter_thread
  end

  must "uninstall" do
    sum = 0
    Plugin.create(:event) do
      on_increase do |v|
        sum += v end
      filter_increase do |v|
        [v * 2]
      end
    end
    Plugin.create(:event).uninstall
    Event[:increase].call(1)
    Delayer.run while not Delayer.empty?
    assert_equal(0, sum)
  end

  must "detach" do
    sum = 0
    event = filter = nil
    Plugin.create(:event) do
      event = on_increase do |v|
        sum += v end
      filter = filter_increase do |v|
        [v * 2]
      end
    end
    Event[:increase].call(1)
    Delayer.run while not Delayer.empty?
    assert_equal(2, sum)

    Plugin.create(:event).detach filter
    Event[:increase].call(1)
    Delayer.run while not Delayer.empty?
    assert_equal(3, sum)

    Plugin.create(:event).detach event
    Event[:increase].call(1)
    Delayer.run while not Delayer.empty?
    assert_equal(3, sum)
  end

  must "get plugin list" do
    assert_equal([], Plugin.plugin_list)
    Plugin.create(:plugin_0)
    assert_equal([:plugin_0], Plugin.plugin_list)
    Plugin.create(:plugin_1)
    assert_equal([:plugin_0, :plugin_1], Plugin.plugin_list)
  end

  must "dsl method defevent" do
    Plugin.create :defevent do
      defevent :increase, prototype: [Integer] end
    assert_equal([Integer], Event[:increase].options[:prototype])
    assert_equal(Plugin[:defevent], Event[:increase].options[:plugin])
  end

  must "unload hook" do
    value = 0
    Plugin.create(:unload) {
      on_unload {
        value += 2 }
      on_unload {
        value += 1 } }
    assert_equal(value, 0)
    Plugin.create(:unload).uninstall
    assert_equal(value, 3)
  end

  must "simple dsl" do
    Plugin.create :dsl_def do
      defdsl :twice do |number|
        number * 2
      end
    end

    dsl_use = Plugin.create(:dsl_use)
    assert_equal(4, dsl_use.twice(2))
    assert_equal(0, dsl_use.twice(0))
    assert_equal(-26, dsl_use.twice(-13))
  end

  must "callback dsl" do
    Plugin.create :dsl_def do
      defdsl :rejector do |value, &condition|
        value.reject(&condition)
      end
    end

    dsl_use = Plugin.create(:dsl_use)
    assert_equal([2, 4, 6], dsl_use.rejector(1..6){ |d| 0 != (d & 1) })
  end
end