From efcc447ebfafde91eba51ae04cdb8b0b776f8ac8 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sun, 17 Dec 2017 14:44:03 -0800 Subject: [PATCH] Add simple test for pattern API --- src/libcore/tests/lib.rs | 2 + src/libcore/tests/pattern.rs | 76 ++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/libcore/tests/pattern.rs diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs index 0e445cdac358..c4b85b829812 100644 --- a/src/libcore/tests/lib.rs +++ b/src/libcore/tests/lib.rs @@ -28,6 +28,7 @@ #![feature(iter_rfind)] #![feature(iter_rfold)] #![feature(nonzero)] +#![feature(pattern)] #![feature(raw)] #![feature(refcell_replace_swap)] #![feature(sip_hash_13)] @@ -61,6 +62,7 @@ mod nonzero; mod num; mod ops; mod option; +mod pattern; mod ptr; mod result; mod slice; diff --git a/src/libcore/tests/pattern.rs b/src/libcore/tests/pattern.rs new file mode 100644 index 000000000000..e12f0bc9e5f6 --- /dev/null +++ b/src/libcore/tests/pattern.rs @@ -0,0 +1,76 @@ +use std::str::pattern::*; + +// This macro makes it easier to write +// tests that do a series of iterations +macro_rules! search_asserts { + ($haystack:expr, $needle:expr, $testname:expr, [$($func:ident),*], $result:expr) => { + let mut searcher = $needle.into_searcher($haystack); + let arr = [$( Step::from(searcher.$func()) ),+]; + assert_eq!(&arr[..], &$result, $testname); + } +} + +/// Combined enum for the results of next() and next_match()/next_reject() +#[derive(Debug, PartialEq, Eq)] +enum Step { + // variant names purposely chosen to + // be the same length for easy alignment + Matches(usize, usize), + Rejects(usize, usize), + InRange(usize, usize), + Done +} + +use Step::*; + +impl From for Step { + fn from(x: SearchStep) -> Self { + match x { + SearchStep::Match(a, b) => Matches(a, b), + SearchStep::Reject(a, b) => Rejects(a, b), + SearchStep::Done => Done + } + } +} + +impl From> for Step { + fn from(x: Option<(usize, usize)>) -> Self { + match x { + Some((a, b)) => InRange(a, b), + None => Done + } + } +} + +#[test] +fn test_simple_iteration() { + search_asserts! ("abcdeabcd", 'a', "forward iteration for ASCII string", + // a b c d e a b c d EOF + [next, next, next, next, next, next, next, next, next, next], + [Matches(0, 1), Rejects(1, 2), Rejects(2, 3), Rejects(3, 4), Rejects(4, 5), Matches(5, 6), Rejects(6, 7), Rejects(7, 8), Rejects(8, 9), Done] + ); + + search_asserts! ("abcdeabcd", 'a', "reverse iteration for ASCII string", + // d c b a e d c b a EOF + [next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back], + [Rejects(8, 9), Rejects(7, 8), Rejects(6, 7), Matches(5, 6), Rejects(4, 5), Rejects(3, 4), Rejects(2, 3), Rejects(1, 2), Matches(0, 1), Done] + ); + + search_asserts! ("我爱我的猫", '我', "forward iteration for Chinese string", + // 我 愛 我 的 貓 EOF + [next, next, next, next, next, next], + [Matches(0, 3), Rejects(3, 6), Matches(6, 9), Rejects(9, 12), Rejects(12, 15), Done] + ); + + search_asserts! ("我的猫说meow", 'm', "forward iteration for mixed string", + // 我 的 猫 说 m e o w EOF + [next, next, next, next, next, next, next, next, next], + [Rejects(0, 3), Rejects(3, 6), Rejects(6, 9), Rejects(9, 12), Matches(12, 13), Rejects(13, 14), Rejects(14, 15), Rejects(15, 16), Done] + ); + + search_asserts! ("我的猫说meow", '猫', "reverse iteration for mixed string", + // w o e m 说 猫 的 我 EOF + [next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back, next_back], + [Rejects(15, 16), Rejects(14, 15), Rejects(13, 14), Rejects(12, 13), Rejects(9, 12), Matches(6, 9), Rejects(3, 6), Rejects(0, 3), Done] + ); +}