Advertisement
Te4nick

Task10

Mar 19th, 2023 (edited)
516
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.43 KB | None | 0 0
  1. import re
  2.  
  3.  
  4. class MealyError(Exception):
  5.     pass
  6.  
  7.  
  8. class Mealy:
  9.     paths: dict = {}
  10.     func_names: list = []
  11.     currentVertex = ''
  12.  
  13.     def build(self, s: str = 'A -> foo 0 -> B') -> None:
  14.         s = re.sub("(?m)^\\s+", "", s)
  15.         s = s.split('\n')[:-1]
  16.         keys = ['vertex', 'del1', 'func', 'res', 'del2', 'vTo']
  17.         s = [dict(zip(keys, line.split(' '))) for line in s]
  18.         db: dict = {}
  19.         self.currentVertex = s[0].get('vertex')
  20.         for item in s:
  21.             if item['vertex'] not in db:
  22.                 db[item['vertex']] = {
  23.                     item['func']: {
  24.                         'res': int(item['res']),
  25.                         'vTo': item['vTo']
  26.                     }
  27.                 }
  28.             else:
  29.                 db[item['vertex']][item['func']] = {
  30.                     'res': int(item['res']),
  31.                     'vTo': item['vTo']
  32.                 }
  33.             if item['vTo'] not in db:
  34.                 db[item['vTo']] = {}
  35.             if item['func'] not in self.func_names:
  36.                 self.func_names.append(item['func'])
  37.                 self.__add_func(item['func'])
  38.         self.paths = db
  39.  
  40.     def test(self):
  41.         for v in self.paths:
  42.             self.__invoke_func_test(v)
  43.         pass
  44.  
  45.     def __add_func(self, func_name: str = 'foo'):
  46.         def func():
  47.             return self.__invoke_func(func_name)
  48.         func.__name__ = func_name
  49.         self.__setattr__(func_name, func)
  50.  
  51.     def __build_test(self):
  52.         data = '''
  53.            A -> foo 0 -> B
  54.            A -> bar 1 -> D
  55.            B -> cat 2 -> C
  56.            B -> foo 3 -> D
  57.            C -> cat 5 -> C
  58.            C -> bar 4 -> D
  59.        '''
  60.         self.build(data)
  61.         paths = {'A': {'foo': {'res': 0, 'vTo': 'B'},
  62.                        'bar': {'res': 1, 'vTo': 'D'}},
  63.                  'B': {'cat': {'res': 2, 'vTo': 'C'},
  64.                        'foo': {'res': 3, 'vTo': 'D'}},
  65.                  'C': {'cat': {'res': 5, 'vTo': 'C'},
  66.                        'bar': {'res': 4, 'vTo': 'D'}},
  67.                  'D': {}}
  68.         assert self.currentVertex == 'A'
  69.         assert self.paths == paths
  70.         assert self.func_names == ['foo', 'bar', 'cat']
  71.         for func_name in self.func_names:
  72.             self.__delattr__(func_name)
  73.         self.currentVertex = ''
  74.         self.paths = {}
  75.         self.func_names = []
  76.  
  77.     def __invoke_func(self, func_name: str = '') -> int:
  78.         try:
  79.             func_res: dict = self.paths[self.currentVertex][func_name]
  80.             self.currentVertex = func_res['vTo']
  81.             return func_res['res']
  82.         except KeyError:
  83.             raise MealyError(func_name)
  84.  
  85.     def __add_func_test(self):
  86.         self.currentVertex = 'A'
  87.         self.paths = {'A': {'foo': {'res': 0, 'vTo': 'B'}},
  88.                       'B': {'bar': {'res': 1, 'vTo': 'C'}},
  89.                       'C': {'cat': {'res': 2, 'vTo': 'A'}}}
  90.         for vertex, func in self.paths.items():
  91.             func_name = list(func.keys())[0]
  92.             self.__add_func(func_name=func_name)
  93.             assert self.__getattribute__(func_name)() == \
  94.                    func[func_name]['res']
  95.             self.__delattr__(func_name)
  96.  
  97.     def __invoke_func_test(self, vertex: str = 'A'):
  98.         initial_vertex = self.currentVertex
  99.         self.currentVertex = vertex
  100.         v_funcs = self.paths[vertex]
  101.         for func_name in self.func_names:
  102.             if func_name in v_funcs:
  103.                 assert self.__invoke_func(func_name) == \
  104.                        v_funcs[func_name].get('res')
  105.                 assert self.currentVertex == \
  106.                        v_funcs[func_name].get('vTo')
  107.                 self.currentVertex = vertex
  108.             else:
  109.                 try:
  110.                     self.__invoke_func(func_name)
  111.                 except MealyError as e:
  112.                     assert e.args[0] == func_name
  113.         self.currentVertex = initial_vertex
  114.  
  115.     def __init__(self):
  116.         self.__build_test()
  117.         self.__add_func_test()
  118.         pass
  119.  
  120.  
  121. def main():
  122.     o = Mealy()
  123.     o.build('''
  124.    A -> log 0 -> B
  125.    A -> make 1 -> D
  126.    B -> jog 2 -> C
  127.    B -> log 3 -> D
  128.    C -> log 5 -> C
  129.    C -> make 4 -> D
  130.    D -> log 6 -> E
  131.    D -> pose 8 -> F
  132.    D -> jog 7 -> G
  133.    E -> jog 9 -> F
  134.    F -> pose 10 -> G
  135.    G -> log 11 -> H
  136.    ''')
  137.     return o
  138.  
  139.  
  140. def test():
  141.     o = main()
  142.     o.test()
  143.  
  144.  
  145. if __name__ == '__main__':
  146.     test()
  147.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement