@@ -1371,3 +1371,36 @@ fn fixed_length_sequences_reject_extra_elements() {
13711371 let mut d = b"[1]" . to_vec ( ) ;
13721372 assert ! ( from_slice:: <( u8 , u8 ) >( & mut d) . is_err( ) ) ;
13731373}
1374+
1375+ #[ test]
1376+ fn tuple_variants_reject_extra_elements ( ) {
1377+ // A tuple variant's array is a fixed-length sequence too, from text and from every Value.
1378+ use crate :: serde:: {
1379+ from_borrowed_value, from_owned_value, from_refborrowed_value, from_refowned_value,
1380+ } ;
1381+ #[ derive( Deserialize , Debug , PartialEq ) ]
1382+ enum Enm {
1383+ Var ( u8 , u8 ) ,
1384+ }
1385+ let mut d = br#"{"Var":[1,2,3]}"# . to_vec ( ) ;
1386+ assert ! ( from_slice:: <Enm >( & mut d) . is_err( ) ) ;
1387+ let mut d = br#"[{"Var":[1,2,3]},{"Var":[4,5]}]"# . to_vec ( ) ;
1388+ assert ! ( from_slice:: <Vec <Enm >>( & mut d) . is_err( ) ) ;
1389+
1390+ let mut d = br#"{"Var":[1,2,3]}"# . to_vec ( ) ;
1391+ let o = to_owned_value ( & mut d) . expect ( "valid" ) ;
1392+ let mut d2 = br#"{"Var":[1,2,3]}"# . to_vec ( ) ;
1393+ let b = to_borrowed_value ( & mut d2) . expect ( "valid" ) ;
1394+ assert ! ( from_owned_value:: <Enm >( o. clone( ) ) . is_err( ) ) ;
1395+ assert ! ( from_refowned_value:: <Enm >( & o) . is_err( ) ) ;
1396+ assert ! ( from_borrowed_value:: <Enm >( b. clone( ) ) . is_err( ) ) ;
1397+ assert ! ( from_refborrowed_value:: <Enm >( & b) . is_err( ) ) ;
1398+
1399+ // exact length is unchanged
1400+ let mut d = br#"{"Var":[1,2]}"# . to_vec ( ) ;
1401+ assert_eq ! ( from_slice:: <Enm >( & mut d) . ok( ) , Some ( Enm :: Var ( 1 , 2 ) ) ) ;
1402+ let mut d = br#"{"Var":[1,2]}"# . to_vec ( ) ;
1403+ let o = to_owned_value ( & mut d) . expect ( "valid" ) ;
1404+ assert_eq ! ( from_refowned_value:: <Enm >( & o) . ok( ) , Some ( Enm :: Var ( 1 , 2 ) ) ) ;
1405+ assert_eq ! ( from_owned_value:: <Enm >( o) . ok( ) , Some ( Enm :: Var ( 1 , 2 ) ) ) ;
1406+ }
0 commit comments