예제 #1
0
 def test_onLoadConfig_minimal(self):
     # GIVEN
     self.conf.loadFromString(r"")
     # WHEN
     self.p = TkPlugin(self.console, self.conf)
     self.p.onLoadConfig()
     # THEN
     self.assertEqual(400, self.p._maxPoints)
     self.assertDictEqual(
         {
             0: (2.0, 1.0, 2),
             1: (2.0, 1.0, 2),
             2: (1.0, 0.5, 1),
             20: (1.0, 0.5, 0),
             40: (0.75, 0.5, 0)
         }, self.p._levels)
     self.assertEqual(40, self.p._maxLevel)
     self.assertEqual(7, self.p._round_grace)
     self.assertEqual("sfire", self.p._issue_warning)
     self.assertTrue(self.p._grudge_enable)
     self.assertTrue(self.p._private_messages)
     self.assertEqual(100, self.p._damage_threshold)
     self.assertEqual(2, self.p._warn_level)
     self.assertEqual(0, self.p._tkpointsHalflife)
     self.assertEqual('1h', self.p._tk_warn_duration)
예제 #2
0
 def setUp(self):
     super(Test_Tk_default_config, self).setUp()
     b3.console.gameName = 'f00'
     self.conf = XmlConfigParser()
     self.conf.load(default_plugin_file)
     self.p = TkPlugin(b3.console, self.conf)
     self.p.onLoadConfig()
예제 #3
0
 def test_onLoadConfig(self, timer_patcher):
     self.conf.setXml(r"""
     <configuration plugin="tk">
         <settings name="settings">
             <set name="max_points">350</set>
             <set name="levels">0,1,2</set>
             <set name="round_grace">3</set>
             <set name="issue_warning">foo</set>
             <set name="private_messages">off</set>
         </settings>
         <settings name="level_0">
             <set name="kill_multiplier">2</set>
             <set name="damage_multiplier">1</set>
             <set name="ban_length">2</set>
         </settings>
         <settings name="level_1">
             <set name="kill_multiplier">2</set>
             <set name="damage_multiplier">1</set>
             <set name="ban_length">2</set>
         </settings>
         <settings name="level_2">
             <set name="kill_multiplier">1</set>
             <set name="damage_multiplier">0.5</set>
             <set name="ban_length">1</set>
         </settings>
     </configuration>
     """)
     self.p = TkPlugin(b3.console, self.conf)
     self.p.onLoadConfig()
     self.assertEqual(350, self.p._maxPoints)
     self.assertEqual(2, self.p._maxLevel)
     self.assertEqual(3, self.p._round_grace)
     self.assertEqual('foo', self.p._issue_warning)
     self.assertFalse(self.p._private_messages)
예제 #4
0
 def setUp(self):
     super(Test_Tk_default_config, self).setUp()
     self.console.gameName = 'f00'
     self.conf = CfgConfigParser()
     self.conf.load(b3.getAbsolutePath('@b3/conf/plugin_tk.ini'))
     self.p = TkPlugin(self.console, self.conf)
     self.p.onLoadConfig()
예제 #5
0
    def test_onLoadConfig(self):
        # GIVEN
        self.conf.loadFromString(
            dedent(r"""
            [settings]
            max_points: 350
            levels: 0,1,2
            round_grace: 3
            issue_warning: foo
            grudge_enable: no
            private_messages: off
            damage_threshold: 99
            warn_level: 10
            halflife: 3
            warn_duration: 3h
            [level_0]

            kill_multiplier: 2
            damage_multiplier: 1
            ban_length: 3
            [level_1]

            kill_multiplier: 2
            damage_multiplier: 1
            ban_length: 4
            [level_2]

            kill_multiplier: 1
            damage_multiplier: 0.5
            ban_length: 5
        """))
        self.p = TkPlugin(self.console, self.conf)
        # WHEN
        self.p.onLoadConfig()
        # THEN
        self.assertEqual(350, self.p._maxPoints)
        self.assertDictEqual(
            {
                0: (2.0, 1.0, 3),
                1: (2.0, 1.0, 4),
                2: (1.0, 0.5, 5),
            }, self.p._levels)
        self.assertEqual(2, self.p._maxLevel)
        self.assertEqual(3, self.p._round_grace)
        self.assertEqual("foo", self.p._issue_warning)
        self.assertFalse(self.p._grudge_enable)
        self.assertFalse(self.p._private_messages)
        self.assertEqual(99, self.p._damage_threshold)
        self.assertEqual(10, self.p._warn_level)
        self.assertEqual(3, self.p._tkpointsHalflife)
        self.assertEqual('3h', self.p._tk_warn_duration)
예제 #6
0
class Test_Tk_default_config(B3TestCase):

    def setUp(self):
        super(Test_Tk_default_config, self).setUp()
        self.console.gameName = 'f00'
        self.conf = CfgConfigParser()
        self.conf.load(b3.getAbsolutePath('@b3/conf/plugin_tk.ini'))
        self.p = TkPlugin(self.console, self.conf)
        self.p.onLoadConfig()

    def test_settings(self):
        self.assertEqual(400, self.p._maxPoints)
        self.assertEqual(40, self.p._maxLevel)
        self.assertEqual({
                0: (2.0, 1.0, 2),
                1: (2.0, 1.0, 2),
                2: (1.0, 0.5, 1),
                20: (1.0, 0.5, 0),
                40: (0.75, 0.5, 0)
        }, self.p._levels)
        self.assertEqual(7, self.p._round_grace)
        self.assertEqual("sfire", self.p._issue_warning)
        self.assertTrue(self.p._grudge_enable)
        self.assertTrue(self.p._private_messages)
        self.assertEqual(100, self.p._damage_threshold)
        self.assertEqual(2, self.p._warn_level)
        self.assertEqual(0, self.p._tkpointsHalflife)
        self.assertEqual('1h', self.p._tk_warn_duration)

    def test_messages(self):
        self.assertEqual("^7team damage over limit", self.p.config.get('messages', 'ban'))
        self.assertEqual("^7$vname^7 has forgiven $aname [^3$points^7]", self.p.config.get('messages', 'forgive'))
        self.assertEqual("^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]", self.p.config.get('messages', 'grudged'))
        self.assertEqual("^7$vname^7 has forgiven $attackers", self.p.config.get('messages', 'forgive_many'))
        self.assertEqual("^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]", self.p.config.get('messages', 'forgive_warning'))
        self.assertEqual("^7no one to forgive", self.p.config.get('messages', 'no_forgive'))
        self.assertEqual("^7Forgive who? %s", self.p.config.get('messages', 'players'))
        self.assertEqual("^7$name^7 has ^3$points^7 TK points", self.p.config.get('messages', 'forgive_info'))
        self.assertEqual("^7$name^7 cleared of ^3$points^7 TK points", self.p.config.get('messages', 'forgive_clear'))
        self.assertEqual("^3Do not attack teammates, ^1Attacked: ^7$vname ^7[^3$points^7]", self.p.config.get('messages', 'tk_warning_reason'))

    def test__default_messages(self):
        conf_items = self.p.config.items('messages')
        for conf_message_id, conf_message in conf_items:
            if conf_message_id not in self.p._default_messages:
                self.fail("%s should be added to the _default_messages dict" % conf_message_id)
            if conf_message != self.p._default_messages[conf_message_id]:
                self.fail("default message in the _default_messages dict for %s does not match the message from the config file" % conf_message_id)
        for default_message_id in self.p._default_messages:
            if default_message_id not in zip(*conf_items)[0]:
                self.fail("%s exists in the _default_messages dict, but not in the config file" % default_message_id)
예제 #7
0
class Test_Tk_default_config(B3TestCase):

    def setUp(self):
        super(Test_Tk_default_config, self).setUp()
        self.console.gameName = 'f00'
        self.conf = CfgConfigParser()
        self.conf.load(b3.getAbsolutePath('@b3/conf/plugin_tk.ini'))
        self.p = TkPlugin(self.console, self.conf)
        self.p.onLoadConfig()

    def test_settings(self):
        self.assertEqual(400, self.p._maxPoints)
        self.assertEqual(40, self.p._maxLevel)
        self.assertEqual({
                0: (2.0, 1.0, 2),
                1: (2.0, 1.0, 2),
                2: (1.0, 0.5, 1),
                20: (1.0, 0.5, 0),
                40: (0.75, 0.5, 0)
        }, self.p._levels)
        self.assertEqual(7, self.p._round_grace)
        self.assertEqual("sfire", self.p._issue_warning)
        self.assertTrue(self.p._grudge_enable)
        self.assertTrue(self.p._private_messages)
        self.assertEqual(100, self.p._damage_threshold)
        self.assertEqual(2, self.p._warn_level)
        self.assertEqual(0, self.p._tkpointsHalflife)
        self.assertEqual('1h', self.p._tk_warn_duration)

    def test_messages(self):
        self.assertEqual("^7team damage over limit", self.p.config.get('messages', 'ban'))
        self.assertEqual("^7$vname^7 has forgiven $aname [^3$points^7]", self.p.config.get('messages', 'forgive'))
        self.assertEqual("^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]", self.p.config.get('messages', 'grudged'))
        self.assertEqual("^7$vname^7 has forgiven $attackers", self.p.config.get('messages', 'forgive_many'))
        self.assertEqual("^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]", self.p.config.get('messages', 'forgive_warning'))
        self.assertEqual("^7no one to forgive", self.p.config.get('messages', 'no_forgive'))
        self.assertEqual("^7Forgive who? %s", self.p.config.get('messages', 'players'))
        self.assertEqual("^7$name^7 has ^3$points^7 TK points", self.p.config.get('messages', 'forgive_info'))
        self.assertEqual("^7$name^7 cleared of ^3$points^7 TK points", self.p.config.get('messages', 'forgive_clear'))
        self.assertEqual("^3Do not attack teammates, ^1Attacked: ^7$vname ^7[^3$points^7]", self.p.config.get('messages', 'tk_warning_reason'))

    def test__default_messages(self):
        conf_items = self.p.config.items('messages')
        for conf_message_id, conf_message in conf_items:
            if conf_message_id not in self.p._default_messages:
                self.fail("%s should be added to the _default_messages dict" % conf_message_id)
            if conf_message != self.p._default_messages[conf_message_id]:
                self.fail("default message in the _default_messages dict for %s does not match the message from the config file" % conf_message_id)
        for default_message_id in self.p._default_messages:
            if default_message_id not in zip(*conf_items)[0]:
                self.fail("%s exists in the _default_messages dict, but not in the config file" % default_message_id)
예제 #8
0
 def test_onLoadConfig_minimal(self, timer_patcher):
     self.conf.setXml(
         r"""
     <configuration plugin="tk">
         <settings name="settings">
             <set name="max_points">400</set>
             <set name="levels">0</set>
             <set name="round_grace">7</set>
             <set name="issue_warning">sfire</set>
         </settings>
         <settings name="level_0">
             <set name="kill_multiplier">2</set>
             <set name="damage_multiplier">1</set>
             <set name="ban_length">2</set>
         </settings>
     </configuration>
     """
     )
     self.p = TkPlugin(b3.console, self.conf)
     self.p.onLoadConfig()
     self.assertEqual(400, self.p._maxPoints)
     self.assertEqual(0, self.p._maxLevel)
     self.assertEqual(7, self.p._round_grace)
     self.assertEqual("sfire", self.p._issue_warning)
     self.assertTrue(self.p._private_messages)
예제 #9
0
 def setUp(self):
     super(Test_Tk_default_config, self).setUp()
     b3.console.gameName = "f00"
     self.conf = XmlConfigParser()
     self.conf.load(default_plugin_file)
     self.p = TkPlugin(b3.console, self.conf)
     self.p.onLoadConfig()
예제 #10
0
 def setUp(self):
     super(Test_Tk_default_config, self).setUp()
     self.console.gameName = 'f00'
     self.conf = CfgConfigParser()
     self.conf.load(b3.getAbsolutePath('@b3/conf/plugin_tk.ini'))
     self.p = TkPlugin(self.console, self.conf)
     self.p.onLoadConfig()
예제 #11
0
 def test_onLoadConfig(self, timer_patcher):
     self.conf.setXml(r"""
     <configuration plugin="tk">
         <settings name="settings">
             <set name="max_points">350</set>
             <set name="levels">0,1,2</set>
             <set name="round_grace">3</set>
             <set name="issue_warning">foo</set>
             <set name="private_messages">off</set>
         </settings>
         <settings name="level_0">
             <set name="kill_multiplier">2</set>
             <set name="damage_multiplier">1</set>
             <set name="ban_length">2</set>
         </settings>
         <settings name="level_1">
             <set name="kill_multiplier">2</set>
             <set name="damage_multiplier">1</set>
             <set name="ban_length">2</set>
         </settings>
         <settings name="level_2">
             <set name="kill_multiplier">1</set>
             <set name="damage_multiplier">0.5</set>
             <set name="ban_length">1</set>
         </settings>
     </configuration>
     """)
     self.p = TkPlugin(self.console, self.conf)
     self.p.onLoadConfig()
     self.assertEqual(350, self.p._maxPoints)
     self.assertEqual(2, self.p._maxLevel)
     self.assertEqual(3, self.p._round_grace)
     self.assertEqual('foo', self.p._issue_warning)
     self.assertFalse(self.p._private_messages)
예제 #12
0
    def setUpClass(cls):

        fakeConsole.gameName = 'f00'
        cls.conf = XmlConfigParser()
        cls.conf.setXml(r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">400</set>
                <set name="levels">0,1,2,20,40</set>
                <set name="round_grace">7</set>
                <set name="issue_warning">sfire</set>
                <set name="grudge_enable">True</set>
                <set name="private_messages">True</set>
            </settings>
            <settings name="messages">
                <set name="ban">^7team damage over limit</set>
                <set name="forgive">^7$vname^7 has forgiven $aname [^3$points^7]</set>
                <set name="grudged">^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]</set>
                <set name="forgive_many">^7$vname^7 has forgiven $attackers</set>
                <set name="forgive_warning">^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]</set>
                <set name="no_forgive">^7no one to forgive</set>
                <set name="no_punish">^7no one to punish</set>
                <set name="players">^7Forgive who? %s</set>
                <set name="forgive_info">^7$name^7 has ^3$points^7 TK points</set>
                <set name="grudge_info">^7$name^7 is ^1grudged ^3$points^7 TK points</set>
                <set name="forgive_clear">^7$name^7 cleared of ^3$points^7 TK points</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_1">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_2">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">1</set>
            </settings>
            <settings name="level_20">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
            <settings name="level_40">
                <set name="kill_multiplier">0.75</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
        </configuration>
        """)
        cls.p = TkPlugin(fakeConsole, cls.conf)
        cls.p.onLoadConfig()
        cls.p.onStartup()
예제 #13
0
class Test_Tk_default_config(B3TestCase):
    def setUp(self):
        super(Test_Tk_default_config, self).setUp()
        b3.console.gameName = "f00"
        self.conf = XmlConfigParser()
        self.conf.load(default_plugin_file)
        self.p = TkPlugin(b3.console, self.conf)
        self.p.onLoadConfig()

    def test(self):
        self.assertEqual("sfire", self.p._issue_warning)
        self.assertEqual(7, self.p._round_grace)
        self.assertEqual(40, self.p._maxLevel)
        self.assertEqual(400, self.p._maxPoints)
        self.assertEqual(
            {0: (2.0, 1.0, 2), 1: (2.0, 1.0, 2), 2: (1.0, 0.5, 1), 20: (1.0, 0.5, 0), 40: (0.75, 0.5, 0)},
            self.p._levels,
        )
        self.assertTrue(self.p._private_messages)
예제 #14
0
class Test_Tk_default_config(B3TestCase):
    def setUp(self):
        super(Test_Tk_default_config, self).setUp()
        b3.console.gameName = 'f00'
        self.conf = XmlConfigParser()
        self.conf.load(default_plugin_file)
        self.p = TkPlugin(b3.console, self.conf)
        self.p.onLoadConfig()

    def test(self):
        self.assertEqual("sfire", self.p._issue_warning)
        self.assertEqual(7, self.p._round_grace)
        self.assertEqual(40, self.p._maxLevel)
        self.assertEqual(400, self.p._maxPoints)
        self.assertEqual(
            {
                0: (2.0, 1.0, 2),
                1: (2.0, 1.0, 2),
                2: (1.0, 0.5, 1),
                20: (1.0, 0.5, 0),
                40: (0.75, 0.5, 0)
            }, self.p._levels)
        self.assertTrue(self.p._private_messages)
예제 #15
0
 def test_onLoadConfig_minimal(self, timer_patcher):
     self.conf.setXml(r"""
     <configuration plugin="tk">
         <settings name="settings">
             <set name="max_points">400</set>
             <set name="levels">0</set>
             <set name="round_grace">7</set>
             <set name="issue_warning">sfire</set>
         </settings>
         <settings name="level_0">
             <set name="kill_multiplier">2</set>
             <set name="damage_multiplier">1</set>
             <set name="ban_length">2</set>
         </settings>
     </configuration>
     """)
     self.p = TkPlugin(b3.console, self.conf)
     self.p.onLoadConfig()
     self.assertEqual(400, self.p._maxPoints)
     self.assertEqual(0, self.p._maxLevel)
     self.assertEqual(7, self.p._round_grace)
     self.assertEqual('sfire', self.p._issue_warning)
     self.assertTrue(self.p._private_messages)
예제 #16
0
    def test_onLoadConfig(self):
        # GIVEN
        self.conf.loadFromString(dedent(r"""
            [settings]
            max_points: 350
            levels: 0,1,2
            round_grace: 3
            issue_warning: foo
            grudge_enable: no
            private_messages: off
            damage_threshold: 99
            warn_level: 10
            halflife: 3
            warn_duration: 3h
            [level_0]

            kill_multiplier: 2
            damage_multiplier: 1
            ban_length: 3
            [level_1]

            kill_multiplier: 2
            damage_multiplier: 1
            ban_length: 4
            [level_2]

            kill_multiplier: 1
            damage_multiplier: 0.5
            ban_length: 5
        """))
        self.p = TkPlugin(self.console, self.conf)
        # WHEN
        self.p.onLoadConfig()
        # THEN
        self.assertEqual(350, self.p._maxPoints)
        self.assertDictEqual({
            0: (2.0, 1.0, 3),
            1: (2.0, 1.0, 4),
            2: (1.0, 0.5, 5),
        }, self.p._levels)
        self.assertEqual(2, self.p._maxLevel)
        self.assertEqual(3, self.p._round_grace)
        self.assertEqual("foo", self.p._issue_warning)
        self.assertFalse(self.p._grudge_enable)
        self.assertFalse(self.p._private_messages)
        self.assertEqual(99, self.p._damage_threshold)
        self.assertEqual(10, self.p._warn_level)
        self.assertEqual(3, self.p._tkpointsHalflife)
        self.assertEqual('3h', self.p._tk_warn_duration)
예제 #17
0
 def test_onLoadConfig_minimal(self):
     # GIVEN
     self.conf.loadFromString(r"")
     # WHEN
     self.p = TkPlugin(self.console, self.conf)
     self.p.onLoadConfig()
     # THEN
     self.assertEqual(400, self.p._maxPoints)
     self.assertDictEqual({
         0: (2.0, 1.0, 2),
         1: (2.0, 1.0, 2),
         2: (1.0, 0.5, 1),
         20: (1.0, 0.5, 0),
         40: (0.75, 0.5, 0)
     }, self.p._levels)
     self.assertEqual(40, self.p._maxLevel)
     self.assertEqual(7, self.p._round_grace)
     self.assertEqual("sfire", self.p._issue_warning)
     self.assertTrue(self.p._grudge_enable)
     self.assertTrue(self.p._private_messages)
     self.assertEqual(100, self.p._damage_threshold)
     self.assertEqual(2, self.p._warn_level)
     self.assertEqual(0, self.p._tkpointsHalflife)
     self.assertEqual('1h', self.p._tk_warn_duration)
예제 #18
0
class Test_Tk_plugin(B3TestCase):
    def setUp(self):
        super(Test_Tk_plugin, self).setUp()
        b3.console.gameName = "f00"
        self.conf = XmlConfigParser()
        self.p = TkPlugin(b3.console, self.conf)

    def test_onLoadConfig_minimal(self, timer_patcher):
        self.conf.setXml(
            r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">400</set>
                <set name="levels">0</set>
                <set name="round_grace">7</set>
                <set name="issue_warning">sfire</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
        </configuration>
        """
        )
        self.p = TkPlugin(b3.console, self.conf)
        self.p.onLoadConfig()
        self.assertEqual(400, self.p._maxPoints)
        self.assertEqual(0, self.p._maxLevel)
        self.assertEqual(7, self.p._round_grace)
        self.assertEqual("sfire", self.p._issue_warning)
        self.assertTrue(self.p._private_messages)

    def test_onLoadConfig(self, timer_patcher):
        self.conf.setXml(
            r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">350</set>
                <set name="levels">0,1,2</set>
                <set name="round_grace">3</set>
                <set name="issue_warning">foo</set>
                <set name="private_messages">off</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_1">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_2">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">1</set>
            </settings>
        </configuration>
        """
        )
        self.p = TkPlugin(b3.console, self.conf)
        self.p.onLoadConfig()
        self.assertEqual(350, self.p._maxPoints)
        self.assertEqual(2, self.p._maxLevel)
        self.assertEqual(3, self.p._round_grace)
        self.assertEqual("foo", self.p._issue_warning)
        self.assertFalse(self.p._private_messages)
예제 #19
0
 def setUp(self):
     super(Test_Tk_plugin, self).setUp()
     b3.console.gameName = "f00"
     self.conf = XmlConfigParser()
     self.p = TkPlugin(b3.console, self.conf)
예제 #20
0
    def setUp(self):
        B3TestCase.setUp(self)

        self.console.gameName = 'f00'

        self.adminPlugin = AdminPlugin(self.console,
                                       '@b3/conf/plugin_admin.ini')
        when(self.console).getPlugin("admin").thenReturn(self.adminPlugin)
        self.adminPlugin.onLoadConfig()
        self.adminPlugin.onStartup()

        self.conf = CfgConfigParser()
        self.conf.loadFromString(
            dedent(r"""
            [settings]
            max_points: 400
            levels: 0,1,2,20,40
            round_grace: 7
            issue_warning: sfire
            grudge_enable: True
            private_messages: True
            damage_threshold: 100
            warn_level: 2
            halflife: 0
            warn_duration: 1h

            [messages]
            ban: ^7team damage over limit
            forgive: ^7$vname^7 has forgiven $aname [^3$points^7]
            grudged: ^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]
            forgive_many: ^7$vname^7 has forgiven $attackers
            forgive_warning: ^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]
            no_forgive: ^7no one to forgive
            no_punish: ^7no one to punish
            players: ^7Forgive who? %s
            forgive_info: ^7$name^7 has ^3$points^7 TK points
            grudge_info: ^7$name^7 is ^1grudged ^3$points^7 TK points
            forgive_clear: ^7$name^7 cleared of ^3$points^7 TK points
            tk_warning_reason: ^3Do not attack teammates, ^1Attacked: ^7$vname ^7[^3$points^7]
            tk_request_action: ^7type ^3!fp ^7 to forgive ^3%s

            [level_0]
            kill_multiplier: 2
            damage_multiplier: 1
            ban_length: 2

            [level_1]
            kill_multiplier: 2
            damage_multiplier: 1
            ban_length: 2

            [level_2]
            kill_multiplier: 1
            damage_multiplier: 0.5
            ban_length: 1

            [level_20]
            kill_multiplier: 1
            damage_multiplier: 0.5
            ban_length: 0

            [level_40]
            kill_multiplier: 0.75
            damage_multiplier: 0.5
            ban_length: 0
        """))
        self.p = TkPlugin(self.console, self.conf)
        self.p.onLoadConfig()
        self.p.onStartup()

        self.joe = FakeClient(self.console,
                              name="Joe",
                              guid="joeguid",
                              groupBits=1,
                              team=b3.TEAM_RED)
        self.mike = FakeClient(self.console,
                               name="Mike",
                               guid="mikeguid",
                               groupBits=1,
                               team=b3.TEAM_RED)
        self.bill = FakeClient(self.console,
                               name="Bill",
                               guid="billguid",
                               groupBits=1,
                               team=b3.TEAM_RED)
        self.superadmin = FakeClient(self.console,
                                     name="superadmin",
                                     guid="superadminguid",
                                     groupBits=128,
                                     team=b3.TEAM_RED)
    def setUp(self):
        B3TestCase.setUp(self)

        self.console.gameName = 'f00'

        self.adminPlugin = AdminPlugin(self.console, ADMIN_CONFIG_FILE)
        when(self.console).getPlugin("admin").thenReturn(self.adminPlugin)
        self.adminPlugin.onLoadConfig()
        self.adminPlugin.onStartup()

        self.conf = XmlConfigParser()
        self.conf.setXml(r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">400</set>
                <set name="levels">0,1,2,20,40</set>
                <set name="round_grace">7</set>
                <set name="issue_warning">sfire</set>
                <set name="grudge_enable">True</set>
                <set name="private_messages">True</set>
            </settings>
            <settings name="messages">
                <set name="ban">^7team damage over limit</set>
                <set name="forgive">^7$vname^7 has forgiven $aname [^3$points^7]</set>
                <set name="grudged">^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]</set>
                <set name="forgive_many">^7$vname^7 has forgiven $attackers</set>
                <set name="forgive_warning">^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]</set>
                <set name="no_forgive">^7no one to forgive</set>
                <set name="no_punish">^7no one to punish</set>
                <set name="players">^7Forgive who? %s</set>
                <set name="forgive_info">^7$name^7 has ^3$points^7 TK points</set>
                <set name="grudge_info">^7$name^7 is ^1grudged ^3$points^7 TK points</set>
                <set name="forgive_clear">^7$name^7 cleared of ^3$points^7 TK points</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_1">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_2">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">1</set>
            </settings>
            <settings name="level_20">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
            <settings name="level_40">
                <set name="kill_multiplier">0.75</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
        </configuration>
        """)
        self.p = TkPlugin(self.console, self.conf)
        self.p.onLoadConfig()
        self.p.onStartup()

        self.joe = FakeClient(self.console,
                              name="Joe",
                              guid="joeguid",
                              groupBits=1,
                              team=b3.TEAM_RED)
        self.mike = FakeClient(self.console,
                               name="Mike",
                               guid="mikeguid",
                               groupBits=1,
                               team=b3.TEAM_RED)
        self.bill = FakeClient(self.console,
                               name="Bill",
                               guid="billguid",
                               groupBits=1,
                               team=b3.TEAM_RED)
        self.superadmin = FakeClient(self.console,
                                     name="superadmin",
                                     guid="superadminguid",
                                     groupBits=128,
                                     team=b3.TEAM_RED)
class Tk_functional_test(B3TestCase):
    def setUp(self):
        B3TestCase.setUp(self)

        self.console.gameName = 'f00'

        self.adminPlugin = AdminPlugin(self.console, ADMIN_CONFIG_FILE)
        when(self.console).getPlugin("admin").thenReturn(self.adminPlugin)
        self.adminPlugin.onLoadConfig()
        self.adminPlugin.onStartup()

        self.conf = XmlConfigParser()
        self.conf.setXml(r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">400</set>
                <set name="levels">0,1,2,20,40</set>
                <set name="round_grace">7</set>
                <set name="issue_warning">sfire</set>
                <set name="grudge_enable">True</set>
                <set name="private_messages">True</set>
            </settings>
            <settings name="messages">
                <set name="ban">^7team damage over limit</set>
                <set name="forgive">^7$vname^7 has forgiven $aname [^3$points^7]</set>
                <set name="grudged">^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]</set>
                <set name="forgive_many">^7$vname^7 has forgiven $attackers</set>
                <set name="forgive_warning">^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]</set>
                <set name="no_forgive">^7no one to forgive</set>
                <set name="no_punish">^7no one to punish</set>
                <set name="players">^7Forgive who? %s</set>
                <set name="forgive_info">^7$name^7 has ^3$points^7 TK points</set>
                <set name="grudge_info">^7$name^7 is ^1grudged ^3$points^7 TK points</set>
                <set name="forgive_clear">^7$name^7 cleared of ^3$points^7 TK points</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_1">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_2">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">1</set>
            </settings>
            <settings name="level_20">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
            <settings name="level_40">
                <set name="kill_multiplier">0.75</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
        </configuration>
        """)
        self.p = TkPlugin(self.console, self.conf)
        self.p.onLoadConfig()
        self.p.onStartup()

        self.joe = FakeClient(self.console,
                              name="Joe",
                              guid="joeguid",
                              groupBits=1,
                              team=b3.TEAM_RED)
        self.mike = FakeClient(self.console,
                               name="Mike",
                               guid="mikeguid",
                               groupBits=1,
                               team=b3.TEAM_RED)
        self.bill = FakeClient(self.console,
                               name="Bill",
                               guid="billguid",
                               groupBits=1,
                               team=b3.TEAM_RED)
        self.superadmin = FakeClient(self.console,
                                     name="superadmin",
                                     guid="superadminguid",
                                     groupBits=128,
                                     team=b3.TEAM_RED)

    def test_dammage_different_teams(self, timer_patch):
        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)
        self.mike.team = b3.TEAM_BLUE
        self.joe.damages(self.mike)
        self.assertEqual(0, self.joe.warn.call_count)

    def test_kill_different_teams(self, timer_patch):
        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)
        self.mike.team = b3.TEAM_BLUE
        self.joe.kills(self.mike)
        self.assertEqual(0, self.joe.warn.call_count)

    def test_kill_within_10s(self, timer_patch):
        self.p._round_grace = 10

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.kills(self.mike)
        self.assertEqual(1, self.joe.warn.call_count)

    def test_dammage(self, timer_patch):
        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.damages(self.mike)
        self.joe.damages(self.mike)
        self.joe.damages(self.mike)
        self.joe.damages(self.mike)
        self.joe.damages(self.mike)
        self.assertEqual(0, self.joe.warn.call_count)

    def test_kill(self, timer_patch):
        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.kills(self.mike)
        self.assertEqual(1, self.joe.warn.call_count)
        self.assertIsNotNone(
            self.mike.getMessageHistoryLike("^7type ^3!fp ^7 to forgive"))

    def test_multikill(self, timer_patch):
        self.p._round_grace = 0

        with patch.object(self.console, "say") as patched_say:
            self.joe.warn = Mock()
            self.joe.tempban = Mock()
            self.joe.connects(0)
            self.mike.connects(1)

            self.mike.clearMessageHistory()
            self.joe.kills(self.mike)
            self.assertEqual(1, self.joe.warn.call_count)
            self.assertEquals(
                1,
                len(
                    self.mike.getAllMessageHistoryLike(
                        "^7type ^3!fp ^7 to forgive")))

            self.joe.kills(self.mike)
            self.assertEqual(
                1,
                len([
                    call_args[0][0] for call_args in patched_say.call_args_list
                    if "auto-kick if not forgiven" in call_args[0][0]
                ]))

            self.joe.kills(self.mike)
            self.assertEqual(1, self.joe.tempban.call_count)

    def test_forgiveinfo(self, timer_patch):
        self.superadmin.connects(99)

        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)
        self.bill.connects(2)

        self.joe.kills(self.mike)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(['Joe has 200 TK points, Attacked: Mike (200)'],
                         self.superadmin.message_history)

        self.joe.damages(self.bill, points=6)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(
            ['Joe has 206 TK points, Attacked: Mike (200), Bill (6)'],
            self.superadmin.message_history)

        self.mike.damages(self.joe, points=27)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual([
            'Joe has 206 TK points, Attacked: Mike (200), Bill (6), Attacked By: Mike [27]'
        ], self.superadmin.message_history)

    def test_forgive(self, timer_patch):
        self.superadmin.connects(99)
        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.kills(self.mike)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(['Joe has 200 TK points, Attacked: Mike (200)'],
                         self.superadmin.message_history)

        self.mike.says("!forgive")

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(["Joe has 0 TK points"],
                         self.superadmin.message_history)

    def test_forgiveclear(self, timer_patch):
        self.superadmin.connects(99)

        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.kills(self.mike)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(['Joe has 200 TK points, Attacked: Mike (200)'],
                         self.superadmin.message_history)

        self.superadmin.says("!forgiveclear joe")

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(["Joe has 0 TK points"],
                         self.superadmin.message_history)

    def test_forgivelist(self, timer_patcher):
        self.p._round_grace = 0

        self.joe.connects(0)
        self.mike.connects(1)
        self.bill.connects(2)

        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(["no one to forgive"], self.joe.message_history)

        self.mike.damages(self.joe, points=14)
        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14]'],
                         self.joe.message_history)

        self.bill.damages(self.joe, points=84)
        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14], [2] Bill [84]'],
                         self.joe.message_history)

    def test_forgiveall(self, timer_patcher):
        self.p._round_grace = 0

        self.joe.connects(0)
        self.mike.connects(1)
        self.bill.connects(2)

        self.mike.damages(self.joe, points=14)
        self.bill.damages(self.joe, points=84)

        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14], [2] Bill [84]'],
                         self.joe.message_history)

        self.joe.says("!forgiveall")
        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertNotIn("Mike", self.joe.message_history[0])
        self.assertNotIn("Bill", self.joe.message_history[0])

    def test_forgiveprev(self, timer_patcher):
        self.p._round_grace = 0

        self.joe.connects(0)
        self.mike.connects(1)
        self.bill.connects(2)

        self.mike.damages(self.joe, points=14)
        self.bill.damages(self.joe, points=84)

        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14], [2] Bill [84]'],
                         self.joe.message_history)

        self.joe.says("!forgiveprev")
        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14]'],
                         self.joe.message_history)
예제 #23
0
class Test_Tk_plugin(B3TestCase):
    def setUp(self):
        super(Test_Tk_plugin, self).setUp()
        b3.console.gameName = 'f00'
        self.conf = XmlConfigParser()
        self.p = TkPlugin(b3.console, self.conf)

    def test_onLoadConfig_minimal(self, timer_patcher):
        self.conf.setXml(r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">400</set>
                <set name="levels">0</set>
                <set name="round_grace">7</set>
                <set name="issue_warning">sfire</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
        </configuration>
        """)
        self.p = TkPlugin(b3.console, self.conf)
        self.p.onLoadConfig()
        self.assertEqual(400, self.p._maxPoints)
        self.assertEqual(0, self.p._maxLevel)
        self.assertEqual(7, self.p._round_grace)
        self.assertEqual('sfire', self.p._issue_warning)
        self.assertTrue(self.p._private_messages)

    def test_onLoadConfig(self, timer_patcher):
        self.conf.setXml(r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">350</set>
                <set name="levels">0,1,2</set>
                <set name="round_grace">3</set>
                <set name="issue_warning">foo</set>
                <set name="private_messages">off</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_1">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_2">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">1</set>
            </settings>
        </configuration>
        """)
        self.p = TkPlugin(b3.console, self.conf)
        self.p.onLoadConfig()
        self.assertEqual(350, self.p._maxPoints)
        self.assertEqual(2, self.p._maxLevel)
        self.assertEqual(3, self.p._round_grace)
        self.assertEqual('foo', self.p._issue_warning)
        self.assertFalse(self.p._private_messages)
    def setUp(self):
        B3TestCase.setUp(self)

        self.console.gameName = 'f00'

        self.adminPlugin = AdminPlugin(self.console, ADMIN_CONFIG_FILE)
        when(self.console).getPlugin("admin").thenReturn(self.adminPlugin)
        self.adminPlugin.onLoadConfig()
        self.adminPlugin.onStartup()

        self.conf = XmlConfigParser()
        self.conf.setXml(r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">400</set>
                <set name="levels">0,1,2,20,40</set>
                <set name="round_grace">7</set>
                <set name="issue_warning">sfire</set>
                <set name="grudge_enable">True</set>
                <set name="private_messages">True</set>
            </settings>
            <settings name="messages">
                <set name="ban">^7team damage over limit</set>
                <set name="forgive">^7$vname^7 has forgiven $aname [^3$points^7]</set>
                <set name="grudged">^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]</set>
                <set name="forgive_many">^7$vname^7 has forgiven $attackers</set>
                <set name="forgive_warning">^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]</set>
                <set name="no_forgive">^7no one to forgive</set>
                <set name="no_punish">^7no one to punish</set>
                <set name="players">^7Forgive who? %s</set>
                <set name="forgive_info">^7$name^7 has ^3$points^7 TK points</set>
                <set name="grudge_info">^7$name^7 is ^1grudged ^3$points^7 TK points</set>
                <set name="forgive_clear">^7$name^7 cleared of ^3$points^7 TK points</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_1">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_2">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">1</set>
            </settings>
            <settings name="level_20">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
            <settings name="level_40">
                <set name="kill_multiplier">0.75</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
        </configuration>
        """)
        self.p = TkPlugin(self.console, self.conf)
        self.p.onLoadConfig()
        self.p.onStartup()

        self.joe = FakeClient(self.console, name="Joe", guid="joeguid", groupBits=1, team=b3.TEAM_RED)
        self.mike = FakeClient(self.console, name="Mike", guid="mikeguid", groupBits=1, team=b3.TEAM_RED)
        self.bill = FakeClient(self.console, name="Bill", guid="billguid", groupBits=1, team=b3.TEAM_RED)
        self.superadmin = FakeClient(self.console, name="superadmin",guid="superadminguid", groupBits=128, team=b3.TEAM_RED)
예제 #25
0
 def setUp(self):
     super(Test_Tk_plugin, self).setUp()
     b3.console.gameName = 'f00'
     self.conf = XmlConfigParser()
     self.p = TkPlugin(b3.console, self.conf)
예제 #26
0
    def setUp(self):
        B3TestCase.setUp(self)

        self.console.gameName = 'f00'

        self.adminPlugin = AdminPlugin(self.console, '@b3/conf/plugin_admin.ini')
        when(self.console).getPlugin("admin").thenReturn(self.adminPlugin)
        self.adminPlugin.onLoadConfig()
        self.adminPlugin.onStartup()

        self.conf = CfgConfigParser()
        self.conf.loadFromString(dedent(r"""
            [settings]
            max_points: 400
            levels: 0,1,2,20,40
            round_grace: 7
            issue_warning: sfire
            grudge_enable: True
            private_messages: True
            damage_threshold: 100
            warn_level: 2
            halflife: 0
            warn_duration: 1h

            [messages]
            ban: ^7team damage over limit
            forgive: ^7$vname^7 has forgiven $aname [^3$points^7]
            grudged: ^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]
            forgive_many: ^7$vname^7 has forgiven $attackers
            forgive_warning: ^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]
            no_forgive: ^7no one to forgive
            no_punish: ^7no one to punish
            players: ^7Forgive who? %s
            forgive_info: ^7$name^7 has ^3$points^7 TK points
            grudge_info: ^7$name^7 is ^1grudged ^3$points^7 TK points
            forgive_clear: ^7$name^7 cleared of ^3$points^7 TK points
            tk_warning_reason: ^3Do not attack teammates, ^1Attacked: ^7$vname ^7[^3$points^7]
            tk_request_action: ^7type ^3!fp ^7 to forgive ^3%s

            [level_0]
            kill_multiplier: 2
            damage_multiplier: 1
            ban_length: 2

            [level_1]
            kill_multiplier: 2
            damage_multiplier: 1
            ban_length: 2

            [level_2]
            kill_multiplier: 1
            damage_multiplier: 0.5
            ban_length: 1

            [level_20]
            kill_multiplier: 1
            damage_multiplier: 0.5
            ban_length: 0

            [level_40]
            kill_multiplier: 0.75
            damage_multiplier: 0.5
            ban_length: 0
        """))
        self.p = TkPlugin(self.console, self.conf)
        self.p.onLoadConfig()
        self.p.onStartup()

        self.joe = FakeClient(self.console, name="Joe", guid="joeguid", groupBits=1, team=b3.TEAM_RED)
        self.mike = FakeClient(self.console, name="Mike", guid="mikeguid", groupBits=1, team=b3.TEAM_RED)
        self.bill = FakeClient(self.console, name="Bill", guid="billguid", groupBits=1, team=b3.TEAM_RED)
        self.superadmin = FakeClient(self.console, name="superadmin", guid="superadminguid", groupBits=128, team=b3.TEAM_RED)
class Tk_functional_test(B3TestCase):


    def setUp(self):
        B3TestCase.setUp(self)

        self.console.gameName = 'f00'

        self.adminPlugin = AdminPlugin(self.console, ADMIN_CONFIG_FILE)
        when(self.console).getPlugin("admin").thenReturn(self.adminPlugin)
        self.adminPlugin.onLoadConfig()
        self.adminPlugin.onStartup()

        self.conf = XmlConfigParser()
        self.conf.setXml(r"""
        <configuration plugin="tk">
            <settings name="settings">
                <set name="max_points">400</set>
                <set name="levels">0,1,2,20,40</set>
                <set name="round_grace">7</set>
                <set name="issue_warning">sfire</set>
                <set name="grudge_enable">True</set>
                <set name="private_messages">True</set>
            </settings>
            <settings name="messages">
                <set name="ban">^7team damage over limit</set>
                <set name="forgive">^7$vname^7 has forgiven $aname [^3$points^7]</set>
                <set name="grudged">^7$vname^7 has a ^1grudge ^7against $aname [^3$points^7]</set>
                <set name="forgive_many">^7$vname^7 has forgiven $attackers</set>
                <set name="forgive_warning">^1ALERT^7: $name^7 auto-kick if not forgiven. Type ^3!forgive $cid ^7to forgive. [^3damage: $points^7]</set>
                <set name="no_forgive">^7no one to forgive</set>
                <set name="no_punish">^7no one to punish</set>
                <set name="players">^7Forgive who? %s</set>
                <set name="forgive_info">^7$name^7 has ^3$points^7 TK points</set>
                <set name="grudge_info">^7$name^7 is ^1grudged ^3$points^7 TK points</set>
                <set name="forgive_clear">^7$name^7 cleared of ^3$points^7 TK points</set>
            </settings>
            <settings name="level_0">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_1">
                <set name="kill_multiplier">2</set>
                <set name="damage_multiplier">1</set>
                <set name="ban_length">2</set>
            </settings>
            <settings name="level_2">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">1</set>
            </settings>
            <settings name="level_20">
                <set name="kill_multiplier">1</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
            <settings name="level_40">
                <set name="kill_multiplier">0.75</set>
                <set name="damage_multiplier">0.5</set>
                <set name="ban_length">0</set>
            </settings>
        </configuration>
        """)
        self.p = TkPlugin(self.console, self.conf)
        self.p.onLoadConfig()
        self.p.onStartup()

        self.joe = FakeClient(self.console, name="Joe", guid="joeguid", groupBits=1, team=b3.TEAM_RED)
        self.mike = FakeClient(self.console, name="Mike", guid="mikeguid", groupBits=1, team=b3.TEAM_RED)
        self.bill = FakeClient(self.console, name="Bill", guid="billguid", groupBits=1, team=b3.TEAM_RED)
        self.superadmin = FakeClient(self.console, name="superadmin",guid="superadminguid", groupBits=128, team=b3.TEAM_RED)


    def test_dammage_different_teams(self, timer_patch):
        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)
        self.mike.team = b3.TEAM_BLUE
        self.joe.damages(self.mike)
        self.assertEqual(0, self.joe.warn.call_count)


    def test_kill_different_teams(self, timer_patch):
        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)
        self.mike.team = b3.TEAM_BLUE
        self.joe.kills(self.mike)
        self.assertEqual(0, self.joe.warn.call_count)


    def test_kill_within_10s(self, timer_patch):
        self.p._round_grace = 10

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.kills(self.mike)
        self.assertEqual(1, self.joe.warn.call_count)

    def test_dammage(self, timer_patch):
        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.damages(self.mike)
        self.joe.damages(self.mike)
        self.joe.damages(self.mike)
        self.joe.damages(self.mike)
        self.joe.damages(self.mike)
        self.assertEqual(0, self.joe.warn.call_count)


    def test_kill(self, timer_patch):
        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.kills(self.mike)
        self.assertEqual(1, self.joe.warn.call_count)
        self.assertIsNotNone(self.mike.getMessageHistoryLike("^7type ^3!fp ^7 to forgive"))


    def test_multikill(self, timer_patch):
        self.p._round_grace = 0

        with patch.object(self.console, "say") as patched_say:
            self.joe.warn = Mock()
            self.joe.tempban = Mock()
            self.joe.connects(0)
            self.mike.connects(1)

            self.mike.clearMessageHistory()
            self.joe.kills(self.mike)
            self.assertEqual(1, self.joe.warn.call_count)
            self.assertEquals(1, len(self.mike.getAllMessageHistoryLike("^7type ^3!fp ^7 to forgive")))

            self.joe.kills(self.mike)
            self.assertEqual(1, len([call_args[0][0] for call_args in patched_say.call_args_list if "auto-kick if not forgiven" in call_args[0][0]]))

            self.joe.kills(self.mike)
            self.assertEqual(1, self.joe.tempban.call_count)


    def test_forgiveinfo(self, timer_patch):
        self.superadmin.connects(99)

        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)
        self.bill.connects(2)

        self.joe.kills(self.mike)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(['Joe has 200 TK points, Attacked: Mike (200)'], self.superadmin.message_history)

        self.joe.damages(self.bill, points=6)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(['Joe has 206 TK points, Attacked: Mike (200), Bill (6)'], self.superadmin.message_history)

        self.mike.damages(self.joe, points=27)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(['Joe has 206 TK points, Attacked: Mike (200), Bill (6), Attacked By: Mike [27]'], self.superadmin.message_history)


    def test_forgive(self, timer_patch):
        self.superadmin.connects(99)
        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.kills(self.mike)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(['Joe has 200 TK points, Attacked: Mike (200)'], self.superadmin.message_history)

        self.mike.says("!forgive")

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(["Joe has 0 TK points"], self.superadmin.message_history)


    def test_forgiveclear(self, timer_patch):
        self.superadmin.connects(99)

        self.p._round_grace = 0

        self.joe.warn = Mock()
        self.joe.connects(0)
        self.mike.connects(1)

        self.joe.kills(self.mike)

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(['Joe has 200 TK points, Attacked: Mike (200)'], self.superadmin.message_history)

        self.superadmin.says("!forgiveclear joe")

        self.superadmin.clearMessageHistory()
        self.superadmin.says("!forgiveinfo joe")
        self.assertEqual(["Joe has 0 TK points"], self.superadmin.message_history)


    def test_forgivelist(self, timer_patcher):
        self.p._round_grace = 0

        self.joe.connects(0)
        self.mike.connects(1)
        self.bill.connects(2)

        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(["no one to forgive"], self.joe.message_history)

        self.mike.damages(self.joe, points=14)
        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14]'], self.joe.message_history)


        self.bill.damages(self.joe, points=84)
        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14], [2] Bill [84]'], self.joe.message_history)


    def test_forgiveall(self, timer_patcher):
        self.p._round_grace = 0

        self.joe.connects(0)
        self.mike.connects(1)
        self.bill.connects(2)

        self.mike.damages(self.joe, points=14)
        self.bill.damages(self.joe, points=84)

        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14], [2] Bill [84]'], self.joe.message_history)

        self.joe.says("!forgiveall")
        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertNotIn("Mike", self.joe.message_history[0])
        self.assertNotIn("Bill", self.joe.message_history[0])


    def test_forgiveprev(self, timer_patcher):
        self.p._round_grace = 0

        self.joe.connects(0)
        self.mike.connects(1)
        self.bill.connects(2)

        self.mike.damages(self.joe, points=14)
        self.bill.damages(self.joe, points=84)

        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14], [2] Bill [84]'], self.joe.message_history)

        self.joe.says("!forgiveprev")
        self.joe.clearMessageHistory()
        self.joe.says("!forgivelist")
        self.assertEqual(['Forgive who? [1] Mike [14]'], self.joe.message_history)