@@ -14,6 +14,7 @@ def __init__(self) -> None:
1414 self .base_float = self .Parameter (FloatExpr ())
1515 self .base_port = self .Port (TestPortBase ()) # required to test required constraint
1616 self .base_port_constr = self .Port (TestPortBase (self .base_float ), optional = True )
17+ self .base_port_optional = self .Port (TestPortBase (), optional = self .base_port .is_connected ())
1718
1819
1920@abstract_block_default (lambda : TestBlock )
@@ -56,23 +57,36 @@ def test_param_def(self) -> None:
5657 self .assertTrue (self .pb .params [0 ].value .HasField ("floating" ))
5758
5859 def test_port_def (self ) -> None :
59- self .assertEqual (len (self .pb .ports ), 2 )
60+ self .assertEqual (len (self .pb .ports ), 3 )
6061 self .assertEqual (self .pb .ports [0 ].name , "base_port" )
6162 self .assertEqual (self .pb .ports [0 ].value .lib_elem .target .name , "edg.core.test_elaboration_common.TestPortBase" )
6263 self .assertEqual (self .pb .ports [1 ].name , "base_port_constr" )
6364 self .assertEqual (self .pb .ports [1 ].value .lib_elem .target .name , "edg.core.test_elaboration_common.TestPortBase" )
65+ self .assertEqual (self .pb .ports [2 ].name , "base_port_optional" )
66+ self .assertEqual (self .pb .ports [2 ].value .lib_elem .target .name , "edg.core.test_elaboration_common.TestPortBase" )
6467
65- def test_connected_constraint (self ) -> None :
68+ def test_required_constraint (self ) -> None :
6669 expected_constr = edgir .ValueExpr ()
6770 expected_constr .ref .steps .add ().name = "base_port"
6871 expected_constr .ref .steps .add ().reserved_param = edgir .IS_CONNECTED
6972 self .assertEqual (self .pb .constraints [0 ].name , "(reqd)base_port" )
7073 self .assertEqual (self .pb .constraints [0 ].value , expected_constr )
7174
75+ def test_optional_required_constraint (self ) -> None :
76+ expected_constr = edgir .ValueExpr ()
77+ expected_constr .binary .op = edgir .BinaryExpr .Op .IMPLIES
78+ expected_constr .binary .lhs .unary .op = edgir .UnaryExpr .Op .NOT
79+ expected_constr .binary .lhs .unary .val .ref .steps .add ().name = "base_port"
80+ expected_constr .binary .lhs .unary .val .ref .steps .add ().reserved_param = edgir .IS_CONNECTED
81+ expected_constr .binary .rhs .ref .steps .add ().name = "base_port_optional"
82+ expected_constr .binary .rhs .ref .steps .add ().reserved_param = edgir .IS_CONNECTED
83+ self .assertEqual (self .pb .constraints [1 ].name , "(reqd)base_port_optional" )
84+ self .assertEqual (self .pb .constraints [1 ].value , expected_constr )
85+
7286 def test_port_init (self ) -> None :
73- self .assertEqual (self .pb .constraints [1 ].name , "(init)base_port_constr.float_param" )
87+ self .assertEqual (self .pb .constraints [2 ].name , "(init)base_port_constr.float_param" )
7488 self .assertEqual (
75- self .pb .constraints [1 ].value , edgir .AssignRef (["base_port_constr" , "float_param" ], ["base_float" ])
89+ self .pb .constraints [2 ].value , edgir .AssignRef (["base_port_constr" , "float_param" ], ["base_float" ])
7690 )
7791
7892
@@ -114,10 +128,11 @@ def test_superclass(self) -> None:
114128 self .assertEqual (self .pb .ports [1 ].value .lib_elem .target .name , "edg.core.test_elaboration_common.TestPortBase" )
115129
116130 def test_port_def (self ) -> None :
117- self .assertEqual (len (self .pb .ports ), 3 )
118- self .assertEqual (self .pb .ports [2 ].name , "port_lit" )
119- self .assertEqual (self .pb .ports [2 ].value .lib_elem .target .name , "edg.core.test_elaboration_common.TestPortBase" )
131+ self .assertEqual (len (self .pb .ports ), 4 )
132+ self .assertEqual (self .pb .ports [3 ].name , "port_lit" )
133+ self .assertEqual (self .pb .ports [3 ].value .lib_elem .target .name , "edg.core.test_elaboration_common.TestPortBase" )
120134 self .assertEqual (self .pb .constraints [0 ].name , "(reqd)base_port" )
135+ self .assertEqual (self .pb .constraints [1 ].name , "(reqd)base_port_optional" )
121136
122137 def test_param_def (self ) -> None :
123138 self .assertEqual (len (self .pb .params ), 4 )
@@ -129,32 +144,32 @@ def test_param_def(self) -> None:
129144 self .assertTrue (self .pb .params [3 ].value .HasField ("array" ))
130145
131146 def test_superclass_init (self ) -> None :
132- self .assertEqual (self .pb .constraints [1 ].name , "(init)base_port_constr.float_param" )
147+ self .assertEqual (self .pb .constraints [2 ].name , "(init)base_port_constr.float_param" )
133148 self .assertEqual (
134- self .pb .constraints [1 ].value , edgir .AssignRef (["base_port_constr" , "float_param" ], ["base_float" ])
149+ self .pb .constraints [2 ].value , edgir .AssignRef (["base_port_constr" , "float_param" ], ["base_float" ])
135150 )
136151
137152 def test_port_init (self ) -> None :
138- self .assertEqual (self .pb .constraints [2 ].name , "(init)port_lit.float_param" )
153+ self .assertEqual (self .pb .constraints [3 ].name , "(init)port_lit.float_param" )
139154
140155 def test_param_init (self ) -> None :
141- self .assertEqual (self .pb .constraints [3 ].name , "(init)range_init" )
142- self .assertEqual (self .pb .constraints [3 ].value , edgir .AssignLit (["range_init" ], Range (- 4.2 , - 1.3 )))
156+ self .assertEqual (self .pb .constraints [4 ].name , "(init)range_init" )
157+ self .assertEqual (self .pb .constraints [4 ].value , edgir .AssignLit (["range_init" ], Range (- 4.2 , - 1.3 )))
143158
144159 expected_assign = edgir .ValueExpr ()
145160 expected_assign .assign .dst .CopyFrom (edgir .LocalPathList (["array_init" ]))
146161 expected_array = expected_assign .assign .src .array
147162 expected_array .vals .add ().CopyFrom (edgir .lit_to_expr (False ))
148163 expected_array .vals .add ().CopyFrom (edgir .lit_to_expr (True ))
149164 expected_array .vals .add ().CopyFrom (edgir .lit_to_expr (False ))
150- self .assertEqual (self .pb .constraints [4 ].name , "(init)array_init" )
151- self .assertEqual (self .pb .constraints [4 ].value , expected_assign )
165+ self .assertEqual (self .pb .constraints [5 ].name , "(init)array_init" )
166+ self .assertEqual (self .pb .constraints [5 ].value , expected_assign )
152167
153168 expected_assign = edgir .ValueExpr ()
154169 expected_assign .assign .dst .CopyFrom (edgir .LocalPathList (["array_empty" ]))
155170 expected_assign .assign .src .array .SetInParent ()
156- self .assertEqual (self .pb .constraints [5 ].name , "(init)array_empty" )
157- self .assertEqual (self .pb .constraints [5 ].value , expected_assign )
171+ self .assertEqual (self .pb .constraints [6 ].name , "(init)array_empty" )
172+ self .assertEqual (self .pb .constraints [6 ].value , expected_assign )
158173
159174 def test_docs (self ) -> None :
160175 self .assertEqual (self .pb .meta .members .node ["_docs" ].members .node ["" ].text_leaf , "Test docstring" )
0 commit comments