Skip to content

Commit b5cb393

Browse files
committed
Use is_empty in range iteration exhaustion tests
1 parent 7fe182f commit b5cb393

File tree

2 files changed

+70
-9
lines changed

2 files changed

+70
-9
lines changed

src/libcore/ops/range.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,13 @@ impl<Idx: PartialOrd<Idx>> RangeTo<Idx> {
262262
/// The `RangeInclusive` `start..=end` contains all values with `x >= start`
263263
/// and `x <= end`.
264264
///
265+
/// This iterator is [fused], but the specific values of `start` and `end` after
266+
/// iteration has finished are **unspecified** other than that [`.is_empty()`]
267+
/// will return `true` once no more values will be produced.
268+
///
269+
/// [fused]: ../iter/trait.FusedIterator.html
270+
/// [`.is_empty()`]: #method.is_empty
271+
///
265272
/// # Examples
266273
///
267274
/// ```
@@ -329,6 +336,17 @@ impl<Idx: PartialOrd<Idx>> RangeInclusive<Idx> {
329336
/// assert!(!(3..=3).is_empty());
330337
/// assert!( (3..=2).is_empty());
331338
/// ```
339+
///
340+
/// This method returns `true` after iteration has finished:
341+
///
342+
/// ```
343+
/// #![feature(range_is_empty,inclusive_range_syntax)]
344+
///
345+
/// let mut r = 3..=5;
346+
/// for _ in r.by_ref() {}
347+
/// // Precise field values are unspecified here
348+
/// assert!(r.is_empty());
349+
/// ```
332350
#[unstable(feature = "range_is_empty", reason = "recently added", issue = "123456789")]
333351
pub fn is_empty(&self) -> bool {
334352
!(self.start <= self.end)

src/libcore/tests/iter.rs

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,42 +1322,84 @@ fn test_range() {
13221322
(isize::MAX as usize + 2, Some(isize::MAX as usize + 2)));
13231323
}
13241324

1325+
#[test]
1326+
fn test_range_exhaustion() {
1327+
let mut r = 10..10;
1328+
assert!(r.is_empty());
1329+
assert_eq!(r.next(), None);
1330+
assert_eq!(r.next_back(), None);
1331+
assert_eq!(r, 10..10);
1332+
1333+
let mut r = 10..12;
1334+
assert_eq!(r.next(), Some(10));
1335+
assert_eq!(r.next(), Some(11));
1336+
assert!(r.is_empty());
1337+
assert_eq!(r, 12..12);
1338+
assert_eq!(r.next(), None);
1339+
1340+
let mut r = 10..12;
1341+
assert_eq!(r.next_back(), Some(11));
1342+
assert_eq!(r.next_back(), Some(10));
1343+
assert!(r.is_empty());
1344+
assert_eq!(r, 10..10);
1345+
assert_eq!(r.next_back(), None);
1346+
1347+
let mut r = 100..10;
1348+
assert!(r.is_empty());
1349+
assert_eq!(r.next(), None);
1350+
assert_eq!(r.next_back(), None);
1351+
assert_eq!(r, 100..10);
1352+
}
1353+
13251354
#[test]
13261355
fn test_range_inclusive_exhaustion() {
13271356
let mut r = 10..=10;
13281357
assert_eq!(r.next(), Some(10));
1329-
assert_eq!(r, 1..=0);
1358+
assert!(r.is_empty());
1359+
assert_eq!(r.next(), None);
1360+
assert_eq!(r.next(), None);
13301361

13311362
let mut r = 10..=10;
13321363
assert_eq!(r.next_back(), Some(10));
1333-
assert_eq!(r, 1..=0);
1364+
assert!(r.is_empty());
1365+
assert_eq!(r.next_back(), None);
13341366

13351367
let mut r = 10..=12;
13361368
assert_eq!(r.next(), Some(10));
13371369
assert_eq!(r.next(), Some(11));
13381370
assert_eq!(r.next(), Some(12));
1339-
assert_eq!(r, 1..=0);
1371+
assert!(r.is_empty());
1372+
assert_eq!(r.next(), None);
13401373

13411374
let mut r = 10..=12;
13421375
assert_eq!(r.next_back(), Some(12));
13431376
assert_eq!(r.next_back(), Some(11));
13441377
assert_eq!(r.next_back(), Some(10));
1345-
assert_eq!(r, 1..=0);
1378+
assert!(r.is_empty());
1379+
assert_eq!(r.next_back(), None);
13461380

13471381
let mut r = 10..=12;
13481382
assert_eq!(r.nth(2), Some(12));
1349-
assert_eq!(r, 1..=0);
1383+
assert!(r.is_empty());
1384+
assert_eq!(r.next(), None);
13501385

13511386
let mut r = 10..=12;
13521387
assert_eq!(r.nth(5), None);
1353-
assert_eq!(r, 1..=0);
1388+
assert!(r.is_empty());
1389+
assert_eq!(r.next(), None);
13541390

13551391
let mut r = 100..=10;
13561392
assert_eq!(r.next(), None);
1393+
assert!(r.is_empty());
1394+
assert_eq!(r.next(), None);
1395+
assert_eq!(r.next(), None);
13571396
assert_eq!(r, 100..=10);
13581397

13591398
let mut r = 100..=10;
13601399
assert_eq!(r.next_back(), None);
1400+
assert!(r.is_empty());
1401+
assert_eq!(r.next_back(), None);
1402+
assert_eq!(r.next_back(), None);
13611403
assert_eq!(r, 100..=10);
13621404
}
13631405

@@ -1427,10 +1469,11 @@ fn test_range_inclusive_nth() {
14271469
assert_eq!(r, 13..=20);
14281470
assert_eq!(r.nth(2), Some(15));
14291471
assert_eq!(r, 16..=20);
1472+
assert_eq!(r.is_empty(), false);
14301473
assert_eq!(ExactSizeIterator::is_empty(&r), false);
14311474
assert_eq!(r.nth(10), None);
1475+
assert_eq!(r.is_empty(), true);
14321476
assert_eq!(ExactSizeIterator::is_empty(&r), true);
1433-
assert_eq!(r, 1..=0); // We may not want to document/promise this detail
14341477
}
14351478

14361479
#[test]
@@ -1514,11 +1557,11 @@ fn test_range_inclusive_folds() {
15141557

15151558
let mut it = 10..=20;
15161559
assert_eq!(it.try_fold(0, |a,b| Some(a+b)), Some(165));
1517-
assert_eq!(it, 1..=0);
1560+
assert!(it.is_empty());
15181561

15191562
let mut it = 10..=20;
15201563
assert_eq!(it.try_rfold(0, |a,b| Some(a+b)), Some(165));
1521-
assert_eq!(it, 1..=0);
1564+
assert!(it.is_empty());
15221565
}
15231566

15241567
#[test]

0 commit comments

Comments
 (0)