From a3aad90506250d31349510743183b1cfd1c14b09 Mon Sep 17 00:00:00 2001
From: Oscar Gustafsson <oscar.gustafsson@gmail.com>
Date: Fri, 3 Feb 2023 11:23:52 +0100
Subject: [PATCH] Add more tests for errors when creating an SFG

---
 test/test_sfg.py | 97 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 97 insertions(+)

diff --git a/test/test_sfg.py b/test/test_sfg.py
index 4a283160..a0e5be79 100644
--- a/test/test_sfg.py
+++ b/test/test_sfg.py
@@ -20,6 +20,7 @@ from b_asic.core_operations import (
     Multiplication,
     SquareRoot,
     Subtraction,
+    SymmetricTwoportAdaptor,
 )
 from b_asic.save_load_structure import python_to_sfg, sfg_to_python
 
@@ -1413,3 +1414,99 @@ class TestSFGGraph:
     def test_show_sfg_invalid_engine(self, sfg_simple_filter):
         with pytest.raises(ValueError):
             sfg_simple_filter.show_sfg(engine="ppddff")
+
+
+class TestSFGErrors:
+    def test_dangling_output(self):
+        in1 = Input()
+        in2 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1, in2)
+        out1 = Output(adaptor.output(0))
+        # No error, maybe should be?
+        _ = SFG([in1, in2], [out1])
+
+    def test_unconnected_input_port(self):
+        in1 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1)
+        out1 = Output(adaptor.output(0))
+        with pytest.raises(ValueError, match="Unconnected input port in SFG"):
+            SFG([in1], [out1])
+
+    def test_unconnected_output(self):
+        in1 = Input()
+        in2 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1, in2)
+        out1 = Output(adaptor.output(0))
+        out2 = Output()
+        # No error, should be
+        SFG([in1, in2], [out1, out2])
+
+    def test_unconnected_input(self):
+        in1 = Input()
+        in2 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1)
+        out1 = Output(adaptor.output(0))
+        out2 = Output(adaptor.output(1))
+        # Correct error?
+        with pytest.raises(ValueError, match="Unconnected input port in SFG"):
+            SFG([in1, in2], [out1, out2])
+
+    def test_duplicate_input(self):
+        in1 = Input()
+        in2 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1, in2)
+        out1 = Output(adaptor.output(0))
+        out2 = Output(adaptor.output(1))
+        with pytest.raises(ValueError, match="Duplicate input operation"):
+            SFG([in1, in1], [out1, out2])
+
+    def test_duplicate_output(self):
+        in1 = Input()
+        in2 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1, in2)
+        out1 = Output(adaptor.output(0))
+        out2 = Output(adaptor.output(1))
+        with pytest.raises(ValueError, match="Duplicate output operation"):
+            SFG([in1, in2], [out1, out1])
+
+    def test_unconnected_input_signal(self):
+        in1 = Input()
+        in2 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1, in2)
+        out1 = Output(adaptor.output(0))
+        out2 = Output(adaptor.output(1))
+        signal = Signal()
+        with pytest.raises(
+            ValueError, match="Input signal #0 is missing destination in SFG"
+        ):
+            SFG([in1, in2], [out1, out2], [signal])
+
+    def test_unconnected_output_signal(self):
+        in1 = Input()
+        in2 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1, in2)
+        out1 = Output(adaptor.output(0))
+        out2 = Output(adaptor.output(1))
+        signal = Signal()
+        with pytest.raises(
+            ValueError, match="Output signal #0 is missing source in SFG"
+        ):
+            SFG([in1, in2], [out1, out2], output_signals=[signal])
+
+    def test_duplicate_input_signal(self):
+        in1 = Input()
+        signal = Signal()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1, signal)
+        out1 = Output(adaptor.output(0))
+        out2 = Output(adaptor.output(1))
+        with pytest.raises(ValueError, match="Duplicate input signal"):
+            SFG([in1], [out1, out2], [signal, signal])
+
+    def test_duplicate_output_signal(self):
+        in1 = Input()
+        in2 = Input()
+        adaptor = SymmetricTwoportAdaptor(0.5, in1, in2)
+        out1 = Output(adaptor.output(0))
+        signal = Signal(adaptor.output(1))
+        # Should raise?
+        SFG([in1, in2], [out1], output_signals=[signal, signal])
-- 
GitLab