view nagslang/tests/test_environment.py @ 686:ffac68f1c5ce

Update action tests
author Neil Muller <drnlmuller@gmail.com>
date Wed, 11 Sep 2013 16:35:53 +0200
parents 0e49648f8d74
children
line wrap: on
line source

from unittest import TestCase

from nagslang import environment


class YesCondition(environment.ProtagonistCondition):
    def check(self, protagonist):
        return True


class NoCondition(environment.ProtagonistCondition):
    def check(self, protagonist):
        return False


class ErrorCondition(environment.ProtagonistCondition):
    def check(self, protagonist):
        raise Exception()


class FakeProtagonist(object):
    def __init__(self, wolf=False, human=False, item=False):
        self._wolf = wolf
        self._human = human
        self._item = item

    def in_wolf_form(self):
        return self._wolf

    def in_human_form(self):
        return self._human

    def has_item(self, item):
        return self._item


class TestConditions(TestCase):
    def assert_met(self, condition, protagonist=None):
        self.assertTrue(condition.check(protagonist))

    def assert_not_met(self, condition, protagonist=None):
        self.assertFalse(condition.check(protagonist))

    def assert_error(self, condition, protagonist=None):
        self.assertRaises(Exception, condition.check, protagonist)

    def test_test_conditions(self):
        self.assert_met(YesCondition())
        self.assert_not_met(NoCondition())
        self.assert_error(ErrorCondition())

    def test_all_conditions(self):
        yes = YesCondition()
        no = NoCondition()
        err = ErrorCondition()
        self.assert_met(environment.AllConditions(yes, yes))
        self.assert_not_met(environment.AllConditions(yes, no))
        self.assert_not_met(environment.AllConditions(no, err))
        self.assert_error(environment.AllConditions(err, yes))
        self.assert_error(environment.AllConditions(yes, err))

    def test_any_condition(self):
        yes = YesCondition()
        no = NoCondition()
        err = ErrorCondition()
        self.assert_met(environment.AnyCondition(no, yes))
        self.assert_not_met(environment.AnyCondition(no, no))
        self.assert_met(environment.AnyCondition(yes, err))
        self.assert_error(environment.AnyCondition(err, yes))
        self.assert_error(environment.AnyCondition(no, err))

    def test_wolf_form_condition(self):
        wolf = environment.WolfFormCondition()
        self.assert_met(wolf, FakeProtagonist(wolf=True, human=True))
        self.assert_met(wolf, FakeProtagonist(wolf=True, human=False))
        self.assert_not_met(wolf, FakeProtagonist(wolf=False, human=True))
        self.assert_not_met(wolf, FakeProtagonist(wolf=False, human=False))

    def test_human_form_condition(self):
        human = environment.HumanFormCondition()
        self.assert_met(human, FakeProtagonist(human=True, wolf=True))
        self.assert_met(human, FakeProtagonist(human=True, wolf=False))
        self.assert_not_met(human, FakeProtagonist(human=False, wolf=True))
        self.assert_not_met(human, FakeProtagonist(human=False, wolf=False))

    def test_item_required_condition(self):
        item = environment.ItemRequiredCondition('item')
        self.assert_met(item, FakeProtagonist(item=True))
        self.assert_not_met(item, FakeProtagonist(item=False))

    def test_function_condition(self):
        condition = environment.FunctionCondition(lambda p: p.startswith('x'))
        self.assert_met(condition, 'xxx')
        self.assert_not_met(condition, 'yyy')


class TestActions(TestCase):
    def setUp(self):
        self.state = {}

    def make_action_func(self, name):
        self.state.setdefault(name, [])

        def action_func(protagonist):
            self.state[name].append(protagonist)
            return len(self.state[name])

        return action_func

    def make_action(self, name, condition=None):
        return environment.Action(self.make_action_func(name), condition)

    def assert_state(self, **kw):
        self.assertEqual(self.state, kw)

    def assert_action_selected(self, action, interactible, protagonist):
        self.assertEqual(action, interactible.select_action(protagonist))

    def test_unconditional_action(self):
        action = self.make_action('action')
        self.assert_state(action=[])
        self.assertTrue(action.check(None))
        self.assert_state(action=[])
        self.assertEqual(1, action.perform('p'))
        self.assert_state(action=['p'])
        self.assertEqual(2, action.perform('p2'))
        self.assert_state(action=['p', 'p2'])

    def test_conditional_action(self):
        yes_action = self.make_action('yes_action', YesCondition())
        no_action = self.make_action('no_action', NoCondition())
        self.assert_state(yes_action=[], no_action=[])
        self.assertTrue(yes_action.check(None))
        self.assert_state(yes_action=[], no_action=[])
        self.assertFalse(no_action.check(None))
        self.assert_state(yes_action=[], no_action=[])
        self.assertEqual(1, yes_action.perform('p'))
        self.assert_state(yes_action=['p'], no_action=[])

    def test_perform_bad_action(self):
        action = self.make_action('action', NoCondition())
        self.assert_state(action=[])
        self.assertFalse(action.check(None))
        self.assert_state(action=[])
        self.assertRaises(ValueError, action.perform, 'p')

    def test_interactible_no_actions(self):
        interactible = environment.Interactible()
        self.assert_action_selected(None, interactible, None)

    def test_interactible_unconditional_action(self):
        action = self.make_action('action')
        interactible = environment.Interactible(action)
        self.assert_action_selected(action, interactible, None)

    def test_interactible_conditional_actions(self):
        wolf_action = self.make_action('wolf', environment.WolfFormCondition())
        item_action = self.make_action(
            'item', environment.ItemRequiredCondition('item'))
        interactible = environment.Interactible(wolf_action, item_action)
        self.assert_action_selected(
            wolf_action, interactible, FakeProtagonist(wolf=True))
        self.assert_action_selected(
            item_action, interactible, FakeProtagonist(item=True))
        self.assert_action_selected(
            wolf_action, interactible, FakeProtagonist(wolf=True, item=True))