From 26b19e3989ba481b0b433a2c8c3fadbce3914b29 Mon Sep 17 00:00:00 2001
From: Jacob Wahlman <jacwa448@student.liu.se>
Date: Wed, 15 Apr 2020 09:52:18 +0200
Subject: [PATCH] Added tests and definition of method

---
 b_asic/signal_flow_graph.py | 12 +++++++
 test/test_sfg.py            | 72 +++++++++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+)

diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py
index 2f2a0240..324ffb7d 100644
--- a/b_asic/signal_flow_graph.py
+++ b/b_asic/signal_flow_graph.py
@@ -350,6 +350,18 @@ class SFG(AbstractOperation):
             input_values.append(self._evaluate_source(input_src))
         return src.operation.evaluate_output(src.index, input_values)
 
+    def replace_component(self, component_type, _id=None, _type=None):
+        """Find and replace all components matching either on GraphID, Type or both.
+        Then return a new deepcopy of the sfg with the replaced component.
+
+        Arguments:
+        component_type: The type of the new component, e.g Multiplication
+    
+        Keyword arguments:
+        _id: The GraphID to match the component to replace.
+        _type: The Type to match the component to replace.
+        """
+        pass
     
     def __str__(self):
         """Prints operations, inputs and outputs in a SFG 
diff --git a/test/test_sfg.py b/test/test_sfg.py
index af9dfe17..a133c087 100644
--- a/test/test_sfg.py
+++ b/test/test_sfg.py
@@ -114,3 +114,75 @@ class TestComponents:
 
         assert set([comp.name for comp in mac_sfg.components]) == {
             "INP1", "INP2", "INP3", "ADD1", "ADD2", "MUL1", "OUT1", "S1", "S2", "S3", "S4", "S5", "S6", "S7"}
+
+
+class TestReplaceComponents:
+
+    def test_replace_addition(self, operation_tree):
+        sfg = SFG(outputs=[Output(operation_tree)])
+        component_id = "add3"
+
+        sfg = sfg.replace_component(Multiplication(name="Multi"), _id=component_id)
+        assert component_id not in sfg._components_by_id.keys()
+        assert "Multi" in sfg._components_by_name.keys()
+
+    def test_replace_addition_large_tree(self, large_operation_tree):
+        sfg = SFG(outputs=[Output(large_operation_tree)])
+        component_id = "add2"
+
+        sfg = sfg.replace_component(Multiplication(name="Multi"), _id=component_id)
+        assert component_id not in sfg._components_by_id.keys()
+        assert "Multi" in sfg._components_by_name.keys()
+    
+    def test_replace_no_input_component(self, operation_tree):
+        sfg = SFG(outputs=[Output(operation_tree)])
+        component_id = "c1"
+
+        sfg = sfg.replace_component(Constant(10), _id=component_id)
+        assert component_id not in sfg._components_by_id.keys()
+
+    def test_replace_no_destination_component(self, operation_tree):
+        sfg = SFG(outputs=[Output(operation_tree)])
+        component_id = "add1"
+
+        sfg.replace_component(Multiplication(name="Multi"), _id=component_id)
+        assert component_id not in sfg._components_by_id.keys()
+        assert "Multi" in sfg._components_by_name.keys()
+
+    def test_replace_several_components(self, large_operation_tree):
+        sfg = SFG(outputs=[Output(large_operation_tree)])
+        component_id = ("add1", "add2", "add3")
+        
+        sfg = sfg.replace_component(Multiplication(name="Multi"), _id=component_id)
+        assert all([_id not in sfg._components_by_id.keys() for _id in component_id])
+        assert "Multi" in sfg._components_by_name.keys()
+        assert len(sfg._components_by_name["Multi"]) == 3
+
+    def test_replace_all_of_type_components(self, large_operation_tree):
+        sfg = SFG(outputs=[Output(large_operation_tree)])
+        component_type = Addition
+
+        sfg.replace_component(Multiplication(name="Multi"), _type=component_type)
+        assert all([not isinstance(_type, Addition) for _type in sfg.components])
+        assert "Multi" in sfg._components_by_name.keys()
+        assert len(sfg._components_by_name["Multi"]) == 3
+
+    def test_no_match_on_replace(self, large_operation_tree):
+        sfg = SFG(outputs=[Output(large_operation_tree)])
+        component_id = "addd1"
+
+        _sfg = sfg.replace_component(Multiplication(name="Multi"), _id=component_id)
+        assert all([comp in sfg.components for comp in _sfg])
+        assert "Multi" not in sfg._components_by_name.keys()
+
+    def test_not_equal_input(self, large_operation_tree):
+        sfg = SFG(outputs=[Output(large_operation_tree)])
+        component_id = "c1"
+
+        # Couldn't import pytest.raises
+        try:
+            sfg = sfg.replace_component(Multiplication(name="Multi"), component_id)
+        except AssertionError:
+            assert True
+        
+        assert False
-- 
GitLab