Skip to content

Commit

Permalink
Added some index tests
Browse files Browse the repository at this point in the history
  • Loading branch information
flying-sheep committed Nov 9, 2018
1 parent 7bc613d commit 2d5e03b
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 9 deletions.
35 changes: 27 additions & 8 deletions pest/src/parser_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1060,20 +1060,39 @@ impl<'i, R: RuleType> ParserState<'i, R> {
}

fn constrain_idxs(start_: i32, end_: Option<i32>, len: usize) -> Option<std::ops::Range<usize>> {
if start_ > len as i32 || end_.map_or(false, |e| e > len as i32) { return None }
let start = match negative_index(start_, len) { Some(s) => s, None => return None };
let end = match end_ {
Some(end_) => match negative_index(end_, len) { Some(s) => s, None => return None },
None => len,
};
let start = normalize_index(start_, len)?;
let end = end_.map_or(Some(len), |e| normalize_index(e, len))?;
Some(start..end)
}

fn negative_index(i: i32, len: usize) -> Option<usize> {
if i >= 0 {
/// Normalizes the index using its sequence’s length.
/// Returns `None` if the normalized index is OOB.
fn normalize_index(i: i32, len: usize) -> Option<usize> {
if i > len as i32 {
None
} else if i >= 0 {
Some(i as usize)
} else {
let real_i = len as i32 + i;
if real_i >= 0 { Some(real_i as usize) } else { None }
}
}

#[cfg(test)]
mod test {
use super::*;

#[test]
fn normalize_index_pos() {
assert_eq!(normalize_index(4, 6), Some(4));
assert_eq!(normalize_index(5, 5), Some(5));
assert_eq!(normalize_index(6, 3), None);
}

#[test]
fn normalize_index_neg() {
assert_eq!(normalize_index(-4, 6), Some(2));
assert_eq!(normalize_index(-5, 5), Some(0));
assert_eq!(normalize_index(-6, 3), None);
}
}
2 changes: 1 addition & 1 deletion pest/src/stack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ impl<T: Clone> Stack<T> {
popped
}

/// Returns an iterator to the current state of the cache in fifo order.
/// Returns an iterator to the current state of the cache in lifo order (top to bottom).
#[allow(dead_code)]
pub fn iter(&self) -> impl Iterator<Item = &T> {
self.cache.iter().rev()
Expand Down

0 comments on commit 2d5e03b

Please sign in to comment.