@@ -2360,3 +2360,118 @@ fn test_splice_wrapping_and_resize() {
23602360
23612361 assert_eq ! ( Vec :: from( vec) , [ 1 , 2 , 3 , 4 , 1 , 1 , 1 , 1 , 1 ] )
23622362}
2363+
2364+ #[ test]
2365+ fn truncate_to_range_basic ( ) {
2366+ // no-op
2367+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2368+ v. truncate_to_range ( ..) ;
2369+ assert_eq ! ( v, [ 0 , 1 , 2 , 3 , 4 , 5 ] ) ;
2370+
2371+ // clear
2372+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2373+ v. truncate_to_range ( 3 ..3 ) ;
2374+ assert_eq ! ( v, [ ] as [ i32 ; 0 ] ) ;
2375+
2376+ // truncate
2377+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2378+ v. truncate_to_range ( ..3 ) ;
2379+ assert_eq ! ( v, [ 0 , 1 , 2 ] ) ;
2380+
2381+ // truncate front
2382+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2383+ v. truncate_to_range ( 2 ..) ;
2384+ assert_eq ! ( v, [ 2 , 3 , 4 , 5 ] ) ;
2385+
2386+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2387+ v. truncate_to_range ( 2 ..5 ) ;
2388+ assert_eq ! ( v, [ 2 , 3 , 4 ] ) ;
2389+
2390+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2391+ v. truncate_to_range ( 3 ..=5 ) ;
2392+ assert_eq ! ( v, [ 3 , 4 , 5 ] ) ;
2393+
2394+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2395+ v. truncate_to_range ( ..=3 ) ;
2396+ assert_eq ! ( v, [ 0 , 1 , 2 , 3 ] ) ;
2397+ }
2398+
2399+ fn make_wrapped ( ) -> VecDeque < i32 > {
2400+ let mut v = VecDeque :: new ( ) ;
2401+ v. extend ( 0 ..5 ) ;
2402+ v. push_front ( -1 ) ;
2403+ v. push_front ( -2 ) ;
2404+ v. push_front ( -3 ) ;
2405+ assert_eq ! ( v. as_slices( ) , ( [ -3 , -2 , -1 ] . as_slice( ) , [ 0 , 1 , 2 , 3 , 4 ] . as_slice( ) ) ) ;
2406+ v
2407+ }
2408+
2409+ #[ test]
2410+ fn truncate_to_range_kept_in_front ( ) {
2411+ let mut v = make_wrapped ( ) ;
2412+ v. truncate_to_range ( 1 ..3 ) ;
2413+ assert_eq ! ( v, [ -2 , -1 ] ) ;
2414+ }
2415+
2416+ #[ test]
2417+ fn truncate_to_range_kept_in_back ( ) {
2418+ let mut v = make_wrapped ( ) ;
2419+ v. truncate_to_range ( 4 ..7 ) ;
2420+ assert_eq ! ( v, [ 1 , 2 , 3 ] ) ;
2421+ }
2422+
2423+ #[ test]
2424+ fn truncate_to_range_kept_straddles ( ) {
2425+ let mut v = make_wrapped ( ) ;
2426+ v. truncate_to_range ( 1 ..6 ) ;
2427+ assert_eq ! ( v, [ -2 , -1 , 0 , 1 , 2 ] ) ;
2428+ }
2429+
2430+ #[ test]
2431+ #[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
2432+ fn truncate_to_range_leak ( ) {
2433+ struct_with_counted_drop ! ( D ( bool ) , DROPS => |this: & D | if this. 0 { panic!( "panic in `drop`" ) ; } ) ;
2434+
2435+ let mut q = VecDeque :: new ( ) ;
2436+ q. push_back ( D ( true ) ) ;
2437+ q. push_back ( D ( false ) ) ;
2438+ q. push_back ( D ( false ) ) ;
2439+ q. push_back ( D ( false ) ) ;
2440+ q. push_back ( D ( false ) ) ;
2441+ q. push_front ( D ( false ) ) ;
2442+ q. push_front ( D ( false ) ) ;
2443+ q. push_front ( D ( false ) ) ;
2444+
2445+ catch_unwind ( AssertUnwindSafe ( || q. truncate_to_range ( 4 ..7 ) ) ) . ok ( ) ;
2446+
2447+ assert_eq ! ( DROPS . get( ) , 5 ) ;
2448+ }
2449+
2450+ #[ test]
2451+ #[ should_panic]
2452+ fn truncate_to_range_start_greater_than_end ( ) {
2453+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2454+ #[ allow( clippy:: reversed_empty_ranges) ]
2455+ v. truncate_to_range ( 4 ..2 ) ;
2456+ }
2457+
2458+ #[ test]
2459+ #[ should_panic]
2460+ fn truncate_to_range_end_past_len ( ) {
2461+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2462+ v. truncate_to_range ( 2 ..7 ) ;
2463+ }
2464+
2465+ #[ test]
2466+ #[ should_panic]
2467+ fn truncate_to_range_start_past_len ( ) {
2468+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2469+ v. truncate_to_range ( 7 ..8 ) ;
2470+ }
2471+
2472+ #[ test]
2473+ #[ should_panic]
2474+ fn truncate_to_range_inclusive_end_overflow ( ) {
2475+ let mut v: VecDeque < _ > = ( 0 ..6 ) . collect ( ) ;
2476+ v. truncate_to_range ( 0 ..=usize:: MAX ) ;
2477+ }
0 commit comments