#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pylint: disable=missing-docstring
from unittest import TestCase
from prettytypo.state_stack import StateDefault, StateSet, StateStack
[документация]class TestStateDefault(TestCase):
[документация] def test_init(self):
state = StateDefault()
self.assertIsInstance(state, StateDefault)
self.assertEqual(state.real_name, 'default')
self.assertEqual(state.init_name, 'default')
self.assertListEqual(state.result, [])
[документация] def test_init_fail(self):
with self.assertRaises(TypeError):
StateDefault(stack=0)
[документация] def test_bad_container(self):
class BadState(StateDefault):
real_name = 'bad'
container = int
with self.assertRaises(TypeError):
BadState()
[документация] def test_cond(self):
self.assertFalse(StateDefault.cond(None, None))
[документация] def test_exec(self):
state = StateDefault()
state([0])
self.assertListEqual(state.result, [0])
[документация] def test_exec_fail(self):
state = StateDefault()
with self.assertRaises(TypeError):
state(0)
[документация] def test_back(self):
state1 = StateDefault()
state2 = StateDefault()
state2([0])
state1.back(state2)
self.assertListEqual(state1.result, [0])
[документация]class TestStateSet(TestCase):
[документация] def test_init(self):
states = StateSet()
self.assertIsInstance(states, StateSet)
self.assertEqual(len(states), 1)
[документация] def test_getitem(self):
states = StateSet()
self.assertEqual(states['default'], StateDefault)
self.assertEqual(states['test'], StateDefault)
[документация] def test_setitem(self):
class TestState(StateDefault):
real_name = 'test'
states = StateSet()
with self.assertRaises(TypeError):
states['test'] = int
states['default'] = TestState
self.assertEqual(states['default'].real_name, 'test')
[документация]class TestMachine(TestCase):
[документация] def test_init(self):
stack = StateStack()
self.assertIsInstance(stack, StateStack)
self.assertEqual(len(stack), 0)
[документация] def test_register(self):
class TestState(StateDefault):
real_name = 'test'
stack = StateStack()
stack.register(TestState)
stack.push('test')
self.assertEqual(stack.current.real_name, 'test')
self.assertEqual(stack.current.init_name, 'test')
[документация] def test_register_fail(self):
stack = StateStack()
with self.assertRaises(TypeError):
stack.register(list)
[документация] def test_push(self):
stack = StateStack()
stack.push('state_name')
self.assertEqual(len(stack), 1)
self.assertEqual(stack.current.real_name, 'default')
self.assertEqual(stack.current.init_name, 'state_name')
[документация] def test_call(self):
stack = StateStack()
stack.push('state_name')
res = stack([0])
self.assertIsNone(res)
self.assertListEqual(stack.current.result, [0])
[документация] def test_call_fail(self):
stack = StateStack()
with self.assertRaises(LookupError):
stack(0)
[документация] def test_pop(self):
stack = StateStack()
stack.pop()
stack.push('state_name')
stack.push('state_name')
stack([0])
stack.pop()
self.assertListEqual(stack.current.result, [0])
[документация] def test_current(self):
stack = StateStack()
self.assertIsNone(stack.current)
[документация] def test_chain(self):
class FirstState(StateDefault):
real_name = 'first'
followers = ['second']
class SecondState(StateDefault):
real_name = 'second'
@classmethod
def cond(cls, chunk, _):
return chunk[0] == 0
def call(self, chunk):
if chunk[0] == 1:
self.done = True
return True
stack = StateStack()
stack.register(FirstState)
stack.register(SecondState)
stack.push('first')
stack([1])
self.assertEqual(stack.current.real_name, 'first')
self.assertLessEqual(stack.current.result, [1])
stack([0])
self.assertEqual(stack.current.real_name, 'second')
self.assertLessEqual(stack.current.result, [0])
stack([1])
self.assertEqual(stack.current.real_name, 'first')
self.assertLessEqual(stack.current.result, [1, 0, 1])