def test_class_as_tag(self):
        """Test classes can be used as tags
        """
        graph = DeltaGraph()
        body_1 = PythonBody()
        body_2 = PyFuncBody(lambda: False)
        test_node = RealNode(graph, [body_1, body_2])

        test_node.select_body(preferred=[PyFuncBody])
        self.assertEqual(test_node.body, body_2)

        with self.assertRaises(ValueError):
            test_node.select_body(exclusions=[PythonBody])
            test_node.body
    def test_selection_exclusion_preference(self):
        """Test that selection works correctly with respect to body order,
        exclusions and preferences
        """
        graph = DeltaGraph()
        body_1 = PythonBody(tags=["exclude_me", "prefer_me"])
        body_2 = PythonBody()
        body_3 = PythonBody(tags=["prefer_me"])
        test_node = RealNode(graph, [body_1, body_2, body_3])

        test_node.select_body(exclusions=["exclude_me"])
        self.assertEqual(test_node.body, body_2)

        test_node.select_body(exclusions=["exclude_me"],
                              preferred=["prefer_me"])
        self.assertEqual(test_node.body, body_3)
    def test_no_bodies_node(self):
        """Test if no-body nodes throw errors on body access
        """
        graph = DeltaGraph()
        test_node = RealNode(graph, [])

        with self.assertRaises(ValueError):
            test_node.select_body()
            test_node.body

        body_1 = PythonBody(tags=["exclude_me"])
        body_2 = PythonBody(tags=["exclude_me"])
        test_node = RealNode(graph, [body_1, body_2])

        with self.assertRaises(ValueError):
            test_node.select_body(exclusions=["exclude_me"])
            test_node.body
    def test_selection_overide(self):
        """Test no override occurs without override == True
        """
        graph = DeltaGraph()
        body_1 = PythonBody(tags=["preferred_1"])
        body_2 = PythonBody(tags=["preferred_2"])
        test_node = RealNode(graph, [body_1, body_2])

        test_node.select_body(preferred=["preferred_1"])
        self.assertEqual(test_node.body, body_1)

        test_node.select_body(preferred=["preferred_2"], override=False)
        self.assertEqual(test_node.body, body_1)

        test_node.select_body(preferred=["preferred_2"])
        self.assertEqual(test_node.body, body_2)