@@ -13,12 +13,15 @@ use hugr::types::Type;
1313use hugr:: {
1414 builder:: { Container , Dataflow } ,
1515 extension:: prelude:: { bool_t, qb_t} ,
16+ hugr:: HugrView ,
17+ hugr:: hugrmut:: HugrMut ,
1618 std_extensions:: arithmetic:: float_types:: float64_type,
1719 types:: Signature ,
1820} ;
1921use hugr_cli:: validate:: VALID_PRINT ;
2022use predicates:: { prelude:: * , str:: contains} ;
2123use rstest:: { fixture, rstest} ;
24+ use serde_json:: json;
2225
2326#[ fixture]
2427fn cmd ( ) -> Command {
@@ -123,6 +126,7 @@ fn test_mermaid_invalid(bad_hugr_string: String, mut cmd: Command) {
123126 cmd. write_stdin ( bad_hugr_string) ;
124127 cmd. assert ( )
125128 . failure ( )
129+ . stderr ( contains ( "unconnected port" ) )
126130 . stderr ( contains ( "Error validating HUGR" ) ) ;
127131}
128132
@@ -134,6 +138,7 @@ fn test_bad_hugr(bad_hugr_string: String, mut val_cmd: Command) {
134138 val_cmd
135139 . assert ( )
136140 . failure ( )
141+ . stderr ( contains ( "unconnected port" ) )
137142 . stderr ( contains ( "Error validating HUGR" ) ) ;
138143}
139144
@@ -146,7 +151,8 @@ fn test_bad_json(mut val_cmd: Command) {
146151 val_cmd
147152 . assert ( )
148153 . failure ( )
149- . stderr ( contains ( "Error decoding HUGR envelope" ) ) ;
154+ . stderr ( contains ( "Error decoding HUGR envelope" ) )
155+ . stderr ( contains ( "missing field" ) ) ;
150156}
151157
152158#[ rstest]
@@ -199,3 +205,38 @@ fn test_package_validation(package_string: String, mut val_cmd: Command) {
199205
200206 val_cmd. assert ( ) . success ( ) . stderr ( contains ( VALID_PRINT ) ) ;
201207}
208+
209+ /// Create a deliberately invalid HUGR with a known generator
210+ #[ fixture]
211+ fn invalid_hugr_with_generator ( ) -> Vec < u8 > {
212+ // Create an invalid HUGR (missing outputs in a dataflow)
213+ let df = DFGBuilder :: new ( Signature :: new_endo ( vec ! [ qb_t( ) ] ) ) . unwrap ( ) ;
214+ let mut bad_hugr = df. hugr ( ) . clone ( ) ; // Missing outputs makes this invalid
215+ bad_hugr. set_metadata (
216+ bad_hugr. module_root ( ) ,
217+ hugr:: envelope:: GENERATOR_KEY ,
218+ json ! ( { "name" : "test-generator" , "version" : "1.0.1" } ) ,
219+ ) ;
220+ // Create envelope with a specific generator
221+ let envelope_config = EnvelopeConfig :: binary ( ) ;
222+
223+ let mut buff = Vec :: new ( ) ;
224+ // Serialize to string
225+ bad_hugr. store ( & mut buff, envelope_config) . unwrap ( ) ;
226+ buff
227+ }
228+
229+ #[ rstest]
230+ fn test_validate_known_generator ( invalid_hugr_with_generator : Vec < u8 > , mut val_cmd : Command ) {
231+ // Write the invalid HUGR to stdin
232+ val_cmd. write_stdin ( invalid_hugr_with_generator) ;
233+ val_cmd. arg ( "-" ) ;
234+
235+ // Expect a failure with the generator name in the error message
236+ val_cmd
237+ . assert ( )
238+ . failure ( )
239+ . stderr ( contains ( "Error validating HUGR" ) )
240+ . stderr ( contains ( "unconnected port" ) )
241+ . stderr ( contains ( "generated by test-generator-v1.0.1" ) ) ;
242+ }
0 commit comments