def test_get_children_ids(self):
     
     # konstrukcja grafu
     g = Graph(directed=False)
 
     sim_nodes = []
     
     
     # 1 - dodanie pierwszego wierzcholka do grafu
     root_vertex = g.add_vertex()
     root_node = Node(root_vertex, sim_nodes)
     root_node.memory['parent_id'] = 0
     sim_nodes.append(root_node)
     
     # root -> v1
     # v1 -> v2
     # v1 -> v3
     v1 = g.add_vertex()
     v1_node = Node(v1, sim_nodes)
     v1_node.memory['parent_id'] = 0
     sim_nodes.append(v1_node)
     g.add_edge(root_vertex, v1)
     
     v2 = g.add_vertex()
     v2_node = Node(v2, sim_nodes)
     v2_node.memory['parent_id'] = 1
     sim_nodes.append(v2_node)
     g.add_edge(v2, v1)
     
     v3 = g.add_vertex()
     v3_node = Node(v3, sim_nodes)
     v3_node.memory['parent_id'] = 1
     sim_nodes.append(v3_node)
     g.add_edge(v3, v1)
     
     # testowanie funkcji
     root_kids_ids = get_children_ids(root_vertex, 0)
     
     self.failUnless(root_kids_ids == [1])
     
     v1_kids_ids = get_children_ids(v1, 0)
     v1_kids_ids.sort()
     
     self.failUnless(v1_kids_ids == [2, 3])
 def _update_outbox(self, sim_node):
     """ Tworzenie nowych wiadomosci do wyslania innym wezlom.
         sim_node - instancja Node ktora rozpatrujemy
     """
     
     # 1 - wyznacz wszystkie swoje dzieci
     vertex_instance = self.graph.vertex(sim_node.id)
     children_ids = get_children_ids(vertex_instance, sim_node.memory['parent_id'])
     
     # 2 - dodawaj do swojej skrzynki nadawczej wiadomosci
     for child_id in children_ids:
         new_msg = Message(sim_node.id, child_id, sim_node.memory['color'])
         sim_node.outbox.append(new_msg)
 def _shift_down_v2(self, root_id):
     """ Metoda przekazuje rekurencyjnie kolory kazdego z wezlow jego dzieciom.
         Implementacja w drugiej czesci korzysta z iteratorow dla calego grafu.
         root_id - id wezla, ktorego uwazamy za roota
     """
     
     # faza 1 - wysylanie wiadomosci o swoim kolorze
     children_ids = [root_id]
     
     while children_ids:
         parent_id = children_ids.pop(0)
         
         parent_node = self.sim_nodes[parent_id]
         parent_vertex = self.graph.vertex(parent_id)
         parents_parent_id = self.sim_nodes[parent_id].memory['parent_id']
         
         new_children_ids = get_children_ids(parent_vertex, parents_parent_id)
         
         for child_id in new_children_ids:
             new_msg = Message(parent_id, child_id, parent_node.memory['color'])
             parent_node.outbox.append(new_msg)
         
         # do listy dodane sa juz wierzcholki z przydzielonymi kolorami
         children_ids.extend(new_children_ids)
         
     # faza 2 - otrzymywanie wiadomosci o swoim kolorze
     for sim_node in self.sim_nodes:
         sim_node.process_outbox()
         
     # faza 3 - zmiana informacji
     for sim_node in self.sim_nodes:
         assert len(sim_node.inbox) < 2
         
         if sim_node.inbox:
                 msg = sim_node.inbox.pop(0)
                 sim_node.memory['old_color'] = sim_node.memory['color']
                 sim_node.memory['color'] = msg.data
     
     old_root_color = self.sim_nodes[root_id].memory['color']
     possible_colors = range(3)
     if old_root_color in possible_colors:
         possible_colors.remove(old_root_color)
         
     self.sim_nodes[root_id].memory['color'] = random.choice(possible_colors)
 def test_update_outbox(self):
     g, sim_nodes = createRandomTree(5)
     
     c6instance = Color6(g, sim_nodes)
     root_node = sim_nodes[0]
     
     root_color = 15
     root_node.memory['color'] = root_color
     root_vertex = g.vertex(0)
     
     root_children_ids = get_children_ids(root_vertex, 0)
     
     c6instance._update_outbox(root_node)
     
     self.failUnless(len(root_children_ids) == len(root_node.outbox))
     
     for msg in root_node.outbox:
         self.failUnless(msg.source_id == 0)
         self.failUnless(msg.target_id in root_children_ids)
         self.failUnless(msg.data == root_color)