@@ -353,6 +353,27 @@ mod tests {
353353 assert ! ( json[ "solution" ] . is_array( ) ) ;
354354 }
355355
356+ #[ test]
357+ fn test_solve_customized_supported_problem ( ) {
358+ let server = McpServer :: new ( ) ;
359+ let problem_json = serde_json:: json!( {
360+ "type" : "MinimumCardinalityKey" ,
361+ "variant" : { } ,
362+ "data" : {
363+ "num_attributes" : 4 ,
364+ "dependencies" : [ [ [ 0 ] , [ 1 , 2 ] ] , [ [ 1 , 2 ] , [ 3 ] ] ] ,
365+ "bound" : 2
366+ }
367+ } )
368+ . to_string ( ) ;
369+
370+ let result = server. solve_inner ( & problem_json, Some ( "customized" ) , None ) ;
371+ assert ! ( result. is_ok( ) , "solve failed: {:?}" , result) ;
372+ let json: serde_json:: Value = serde_json:: from_str ( & result. unwrap ( ) ) . unwrap ( ) ;
373+ assert_eq ! ( json[ "solver" ] , "customized" ) ;
374+ assert ! ( json[ "solution" ] . is_array( ) , "{json}" ) ;
375+ }
376+
356377 #[ test]
357378 fn test_solve_unknown_solver ( ) {
358379 let server = McpServer :: new ( ) ;
@@ -374,6 +395,20 @@ mod tests {
374395 assert_eq ! ( json[ "problem" ] , "MaximumIndependentSet" ) ;
375396 }
376397
398+ #[ test]
399+ fn test_solve_customized_bundle_rejects_unsupported_target_without_panicking ( ) {
400+ let server = McpServer :: new ( ) ;
401+ let problem_json = create_test_mis ( & server) ;
402+ let bundle_json = server. reduce_inner ( & problem_json, "QUBO" ) . unwrap ( ) ;
403+ let result = server. solve_inner ( & bundle_json, Some ( "customized" ) , None ) ;
404+ assert ! ( result. is_err( ) ) ;
405+ let err = result. unwrap_err ( ) . to_string ( ) ;
406+ assert ! (
407+ err. contains( "unsupported by customized solver" ) ,
408+ "unexpected error: {err}"
409+ ) ;
410+ }
411+
377412 #[ test]
378413 fn test_inspect_bundle ( ) {
379414 let server = McpServer :: new ( ) ;
@@ -421,6 +456,35 @@ mod tests {
421456 assert_eq ! ( solvers, vec![ "brute-force" ] ) ;
422457 }
423458
459+ #[ test]
460+ fn test_inspect_minimum_cardinality_key_lists_customized_solver ( ) {
461+ let server = McpServer :: new ( ) ;
462+ let problem_json = serde_json:: json!( {
463+ "type" : "MinimumCardinalityKey" ,
464+ "variant" : { } ,
465+ "data" : {
466+ "num_attributes" : 4 ,
467+ "dependencies" : [ [ [ 0 ] , [ 1 , 2 ] ] , [ [ 1 , 2 ] , [ 3 ] ] ] ,
468+ "bound" : 2
469+ }
470+ } )
471+ . to_string ( ) ;
472+
473+ let result = server. inspect_problem_inner ( & problem_json) ;
474+ assert ! ( result. is_ok( ) , "inspect failed: {:?}" , result) ;
475+ let json: serde_json:: Value = serde_json:: from_str ( & result. unwrap ( ) ) . unwrap ( ) ;
476+ let solvers: Vec < & str > = json[ "solvers" ]
477+ . as_array ( )
478+ . unwrap ( )
479+ . iter ( )
480+ . map ( |v| v. as_str ( ) . unwrap ( ) )
481+ . collect ( ) ;
482+ assert ! (
483+ solvers. contains( & "customized" ) ,
484+ "inspect should list customized when supported, got: {json}"
485+ ) ;
486+ }
487+
424488 #[ test]
425489 fn test_solve_sat_problem ( ) {
426490 let server = McpServer :: new ( ) ;
0 commit comments