Skip to content

Commit c29559d

Browse files
committed
Moved coretest::str tests into collectiontest::str
1 parent c04f22a commit c29559d

File tree

2 files changed

+376
-376
lines changed

2 files changed

+376
-376
lines changed

src/libcollectionstest/str.rs

+375-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -1506,6 +1506,278 @@ fn test_str_from_utf8() {
15061506
assert_eq!(from_utf8(xs), Err(Utf8Error::TooShort));
15071507
}
15081508

1509+
#[test]
1510+
fn test_pattern_deref_forward() {
1511+
let data = "aabcdaa";
1512+
assert!(data.contains("bcd"));
1513+
assert!(data.contains(&"bcd"));
1514+
assert!(data.contains(&"bcd".to_string()));
1515+
}
1516+
1517+
#[test]
1518+
fn test_empty_match_indices() {
1519+
let data = "aä中!";
1520+
let vec: Vec<_> = data.match_indices("").collect();
1521+
assert_eq!(vec, [(0, 0), (1, 1), (3, 3), (6, 6), (7, 7)]);
1522+
}
1523+
1524+
#[test]
1525+
fn test_bool_from_str() {
1526+
assert_eq!("true".parse().ok(), Some(true));
1527+
assert_eq!("false".parse().ok(), Some(false));
1528+
assert_eq!("not even a boolean".parse::<bool>().ok(), None);
1529+
}
1530+
1531+
fn check_contains_all_substrings(s: &str) {
1532+
assert!(s.contains(""));
1533+
for i in 0..s.len() {
1534+
for j in i+1..s.len() + 1 {
1535+
assert!(s.contains(&s[i..j]));
1536+
}
1537+
}
1538+
}
1539+
1540+
#[test]
1541+
fn strslice_issue_16589() {
1542+
assert!("bananas".contains("nana"));
1543+
1544+
// prior to the fix for #16589, x.contains("abcdabcd") returned false
1545+
// test all substrings for good measure
1546+
check_contains_all_substrings("012345678901234567890123456789bcdabcdabcd");
1547+
}
1548+
1549+
#[test]
1550+
fn strslice_issue_16878() {
1551+
assert!(!"1234567ah012345678901ah".contains("hah"));
1552+
assert!(!"00abc01234567890123456789abc".contains("bcabc"));
1553+
}
1554+
1555+
1556+
#[test]
1557+
fn test_strslice_contains() {
1558+
let x = "There are moments, Jeeves, when one asks oneself, 'Do trousers matter?'";
1559+
check_contains_all_substrings(x);
1560+
}
1561+
1562+
#[test]
1563+
fn test_rsplitn_char_iterator() {
1564+
let data = "\nMäry häd ä little lämb\nLittle lämb\n";
1565+
1566+
let mut split: Vec<&str> = data.rsplitn(4, ' ').collect();
1567+
split.reverse();
1568+
assert_eq!(split, ["\nMäry häd ä", "little", "lämb\nLittle", "lämb\n"]);
1569+
1570+
let mut split: Vec<&str> = data.rsplitn(4, |c: char| c == ' ').collect();
1571+
split.reverse();
1572+
assert_eq!(split, ["\nMäry häd ä", "little", "lämb\nLittle", "lämb\n"]);
1573+
1574+
// Unicode
1575+
let mut split: Vec<&str> = data.rsplitn(4, 'ä').collect();
1576+
split.reverse();
1577+
assert_eq!(split, ["\nMäry häd ", " little l", "mb\nLittle l", "mb\n"]);
1578+
1579+
let mut split: Vec<&str> = data.rsplitn(4, |c: char| c == 'ä').collect();
1580+
split.reverse();
1581+
assert_eq!(split, ["\nMäry häd ", " little l", "mb\nLittle l", "mb\n"]);
1582+
}
1583+
1584+
#[test]
1585+
fn test_split_char_iterator() {
1586+
let data = "\nMäry häd ä little lämb\nLittle lämb\n";
1587+
1588+
let split: Vec<&str> = data.split(' ').collect();
1589+
assert_eq!( split, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]);
1590+
1591+
let mut rsplit: Vec<&str> = data.split(' ').rev().collect();
1592+
rsplit.reverse();
1593+
assert_eq!(rsplit, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]);
1594+
1595+
let split: Vec<&str> = data.split(|c: char| c == ' ').collect();
1596+
assert_eq!( split, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]);
1597+
1598+
let mut rsplit: Vec<&str> = data.split(|c: char| c == ' ').rev().collect();
1599+
rsplit.reverse();
1600+
assert_eq!(rsplit, ["\nMäry", "häd", "ä", "little", "lämb\nLittle", "lämb\n"]);
1601+
1602+
// Unicode
1603+
let split: Vec<&str> = data.split('ä').collect();
1604+
assert_eq!( split, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]);
1605+
1606+
let mut rsplit: Vec<&str> = data.split('ä').rev().collect();
1607+
rsplit.reverse();
1608+
assert_eq!(rsplit, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]);
1609+
1610+
let split: Vec<&str> = data.split(|c: char| c == 'ä').collect();
1611+
assert_eq!( split, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]);
1612+
1613+
let mut rsplit: Vec<&str> = data.split(|c: char| c == 'ä').rev().collect();
1614+
rsplit.reverse();
1615+
assert_eq!(rsplit, ["\nM", "ry h", "d ", " little l", "mb\nLittle l", "mb\n"]);
1616+
}
1617+
1618+
#[test]
1619+
fn test_rev_split_char_iterator_no_trailing() {
1620+
let data = "\nMäry häd ä little lämb\nLittle lämb\n";
1621+
1622+
let mut split: Vec<&str> = data.split('\n').rev().collect();
1623+
split.reverse();
1624+
assert_eq!(split, ["", "Märy häd ä little lämb", "Little lämb", ""]);
1625+
1626+
let mut split: Vec<&str> = data.split_terminator('\n').rev().collect();
1627+
split.reverse();
1628+
assert_eq!(split, ["", "Märy häd ä little lämb", "Little lämb"]);
1629+
}
1630+
1631+
#[test]
1632+
fn test_utf16_code_units() {
1633+
use unicode::str::Utf16Encoder;
1634+
assert_eq!(Utf16Encoder::new(vec!['é', '\u{1F4A9}'].into_iter()).collect::<Vec<u16>>(),
1635+
[0xE9, 0xD83D, 0xDCA9])
1636+
}
1637+
1638+
#[test]
1639+
fn starts_with_in_unicode() {
1640+
assert!(!"├── Cargo.toml".starts_with("# "));
1641+
}
1642+
1643+
#[test]
1644+
fn starts_short_long() {
1645+
assert!(!"".starts_with("##"));
1646+
assert!(!"##".starts_with("####"));
1647+
assert!("####".starts_with("##"));
1648+
assert!(!"##ä".starts_with("####"));
1649+
assert!("####ä".starts_with("##"));
1650+
assert!(!"##".starts_with("####ä"));
1651+
assert!("##ä##".starts_with("##ä"));
1652+
1653+
assert!("".starts_with(""));
1654+
assert!("ä".starts_with(""));
1655+
assert!("#ä".starts_with(""));
1656+
assert!("##ä".starts_with(""));
1657+
assert!("ä###".starts_with(""));
1658+
assert!("#ä##".starts_with(""));
1659+
assert!("##ä#".starts_with(""));
1660+
}
1661+
1662+
#[test]
1663+
fn contains_weird_cases() {
1664+
assert!("* \t".contains(' '));
1665+
assert!(!"* \t".contains('?'));
1666+
assert!(!"* \t".contains('\u{1F4A9}'));
1667+
}
1668+
1669+
#[test]
1670+
fn trim_ws() {
1671+
assert_eq!(" \t a \t ".trim_left_matches(|c: char| c.is_whitespace()),
1672+
"a \t ");
1673+
assert_eq!(" \t a \t ".trim_right_matches(|c: char| c.is_whitespace()),
1674+
" \t a");
1675+
assert_eq!(" \t a \t ".trim_matches(|c: char| c.is_whitespace()),
1676+
"a");
1677+
assert_eq!(" \t \t ".trim_left_matches(|c: char| c.is_whitespace()),
1678+
"");
1679+
assert_eq!(" \t \t ".trim_right_matches(|c: char| c.is_whitespace()),
1680+
"");
1681+
assert_eq!(" \t \t ".trim_matches(|c: char| c.is_whitespace()),
1682+
"");
1683+
}
1684+
1685+
mod pattern {
1686+
use std::str::pattern::Pattern;
1687+
use std::str::pattern::{Searcher, ReverseSearcher};
1688+
use std::str::pattern::SearchStep::{self, Match, Reject, Done};
1689+
1690+
macro_rules! make_test {
1691+
($name:ident, $p:expr, $h:expr, [$($e:expr,)*]) => {
1692+
mod $name {
1693+
use std::str::pattern::SearchStep::{Match, Reject};
1694+
use super::{cmp_search_to_vec};
1695+
#[test]
1696+
fn fwd() {
1697+
cmp_search_to_vec(false, $p, $h, vec![$($e),*]);
1698+
}
1699+
#[test]
1700+
fn bwd() {
1701+
cmp_search_to_vec(true, $p, $h, vec![$($e),*]);
1702+
}
1703+
}
1704+
}
1705+
}
1706+
1707+
fn cmp_search_to_vec<'a, P: Pattern<'a>>(rev: bool, pat: P, haystack: &'a str,
1708+
right: Vec<SearchStep>)
1709+
where P::Searcher: ReverseSearcher<'a>
1710+
{
1711+
let mut searcher = pat.into_searcher(haystack);
1712+
let mut v = vec![];
1713+
loop {
1714+
match if !rev {searcher.next()} else {searcher.next_back()} {
1715+
Match(a, b) => v.push(Match(a, b)),
1716+
Reject(a, b) => v.push(Reject(a, b)),
1717+
Done => break,
1718+
}
1719+
}
1720+
if rev {
1721+
v.reverse();
1722+
}
1723+
assert_eq!(v, right);
1724+
}
1725+
1726+
make_test!(str_searcher_ascii_haystack, "bb", "abbcbbd", [
1727+
Reject(0, 1),
1728+
Match (1, 3),
1729+
Reject(3, 4),
1730+
Match (4, 6),
1731+
Reject(6, 7),
1732+
]);
1733+
make_test!(str_searcher_empty_needle_ascii_haystack, "", "abbcbbd", [
1734+
Match(0, 0),
1735+
Match(1, 1),
1736+
Match(2, 2),
1737+
Match(3, 3),
1738+
Match(4, 4),
1739+
Match(5, 5),
1740+
Match(6, 6),
1741+
Match(7, 7),
1742+
]);
1743+
make_test!(str_searcher_mulibyte_haystack, " ", "├──", [
1744+
Reject(0, 3),
1745+
Reject(3, 6),
1746+
Reject(6, 9),
1747+
]);
1748+
make_test!(str_searcher_empty_needle_mulibyte_haystack, "", "├──", [
1749+
Match(0, 0),
1750+
Match(3, 3),
1751+
Match(6, 6),
1752+
Match(9, 9),
1753+
]);
1754+
make_test!(str_searcher_empty_needle_empty_haystack, "", "", [
1755+
Match(0, 0),
1756+
]);
1757+
make_test!(str_searcher_nonempty_needle_empty_haystack, "├", "", [
1758+
]);
1759+
make_test!(char_searcher_ascii_haystack, 'b', "abbcbbd", [
1760+
Reject(0, 1),
1761+
Match (1, 2),
1762+
Match (2, 3),
1763+
Reject(3, 4),
1764+
Match (4, 5),
1765+
Match (5, 6),
1766+
Reject(6, 7),
1767+
]);
1768+
make_test!(char_searcher_mulibyte_haystack, ' ', "├──", [
1769+
Reject(0, 3),
1770+
Reject(3, 6),
1771+
Reject(6, 9),
1772+
]);
1773+
make_test!(char_searcher_short_haystack, '\u{1F4A9}', "* \t", [
1774+
Reject(0, 1),
1775+
Reject(1, 2),
1776+
Reject(2, 3),
1777+
]);
1778+
1779+
}
1780+
15091781
mod bench {
15101782
use test::{Bencher, black_box};
15111783

@@ -1693,4 +1965,106 @@ malesuada sollicitudin quam eu fermentum.";
16931965
assert!(haystack.contains(needle));
16941966
})
16951967
}
1968+
1969+
macro_rules! make_test_inner {
1970+
($s:ident, $code:expr, $name:ident, $str:expr) => {
1971+
#[bench]
1972+
fn $name(bencher: &mut Bencher) {
1973+
let mut $s = $str;
1974+
black_box(&mut $s);
1975+
bencher.iter(|| $code);
1976+
}
1977+
}
1978+
}
1979+
1980+
macro_rules! make_test {
1981+
($name:ident, $s:ident, $code:expr) => {
1982+
mod $name {
1983+
use test::Bencher;
1984+
use test::black_box;
1985+
1986+
// Short strings: 65 bytes each
1987+
make_test_inner!($s, $code, short_ascii,
1988+
"Mary had a little lamb, Little lamb Mary had a littl lamb, lamb!");
1989+
make_test_inner!($s, $code, short_mixed,
1990+
"ศไทย中华Việt Nam; Mary had a little lamb, Little lam!");
1991+
make_test_inner!($s, $code, short_pile_of_poo,
1992+
"💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩!");
1993+
make_test_inner!($s, $code, long_lorem_ipsum,"\
1994+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis lorem sit amet dolor \
1995+
ultricies condimentum. Praesent iaculis purus elit, ac malesuada quam malesuada in. Duis sed orci \
1996+
eros. Suspendisse sit amet magna mollis, mollis nunc luctus, imperdiet mi. Integer fringilla non \
1997+
sem ut lacinia. Fusce varius tortor a risus porttitor hendrerit. Morbi mauris dui, ultricies nec \
1998+
tempus vel, gravida nec quam.
1999+
2000+
In est dui, tincidunt sed tempus interdum, adipiscing laoreet ante. Etiam tempor, tellus quis \
2001+
sagittis interdum, nulla purus mattis sem, quis auctor erat odio ac tellus. In nec nunc sit amet \
2002+
diam volutpat molestie at sed ipsum. Vestibulum laoreet consequat vulputate. Integer accumsan \
2003+
lorem ac dignissim placerat. Suspendisse convallis faucibus lorem. Aliquam erat volutpat. In vel \
2004+
eleifend felis. Sed suscipit nulla lorem, sed mollis est sollicitudin et. Nam fermentum egestas \
2005+
interdum. Curabitur ut nisi justo.
2006+
2007+
Sed sollicitudin ipsum tellus, ut condimentum leo eleifend nec. Cras ut velit ante. Phasellus nec \
2008+
mollis odio. Mauris molestie erat in arcu mattis, at aliquet dolor vehicula. Quisque malesuada \
2009+
lectus sit amet nisi pretium, a condimentum ipsum porta. Morbi at dapibus diam. Praesent egestas \
2010+
est sed risus elementum, eu rutrum metus ultrices. Etiam fermentum consectetur magna, id rutrum \
2011+
felis accumsan a. Aliquam ut pellentesque libero. Sed mi nulla, lobortis eu tortor id, suscipit \
2012+
ultricies neque. Morbi iaculis sit amet risus at iaculis. Praesent eget ligula quis turpis \
2013+
feugiat suscipit vel non arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. \
2014+
Aliquam sit amet placerat lorem.
2015+
2016+
Cras a lacus vel ante posuere elementum. Nunc est leo, bibendum ut facilisis vel, bibendum at \
2017+
mauris. Nullam adipiscing diam vel odio ornare, luctus adipiscing mi luctus. Nulla facilisi. \
2018+
Mauris adipiscing bibendum neque, quis adipiscing lectus tempus et. Sed feugiat erat et nisl \
2019+
lobortis pharetra. Donec vitae erat enim. Nullam sit amet felis et quam lacinia tincidunt. Aliquam \
2020+
suscipit dapibus urna. Sed volutpat urna in magna pulvinar volutpat. Phasellus nec tellus ac diam \
2021+
cursus accumsan.
2022+
2023+
Nam lectus enim, dapibus non nisi tempor, consectetur convallis massa. Maecenas eleifend dictum \
2024+
feugiat. Etiam quis mauris vel risus luctus mattis a a nunc. Nullam orci quam, imperdiet id \
2025+
vehicula in, porttitor ut nibh. Duis sagittis adipiscing nisl vitae congue. Donec mollis risus eu \
2026+
leo suscipit, varius porttitor nulla porta. Pellentesque ut sem nec nisi euismod vehicula. Nulla \
2027+
malesuada sollicitudin quam eu fermentum!");
2028+
}
2029+
}
2030+
}
2031+
2032+
make_test!(chars_count, s, s.chars().count());
2033+
2034+
make_test!(contains_bang_str, s, s.contains("!"));
2035+
make_test!(contains_bang_char, s, s.contains('!'));
2036+
2037+
make_test!(match_indices_a_str, s, s.match_indices("a").count());
2038+
2039+
make_test!(split_a_str, s, s.split("a").count());
2040+
2041+
make_test!(trim_ascii_char, s, {
2042+
use std::ascii::AsciiExt;
2043+
s.trim_matches(|c: char| c.is_ascii())
2044+
});
2045+
make_test!(trim_left_ascii_char, s, {
2046+
use std::ascii::AsciiExt;
2047+
s.trim_left_matches(|c: char| c.is_ascii())
2048+
});
2049+
make_test!(trim_right_ascii_char, s, {
2050+
use std::ascii::AsciiExt;
2051+
s.trim_right_matches(|c: char| c.is_ascii())
2052+
});
2053+
2054+
make_test!(find_underscore_char, s, s.find('_'));
2055+
make_test!(rfind_underscore_char, s, s.rfind('_'));
2056+
make_test!(find_underscore_str, s, s.find("_"));
2057+
2058+
make_test!(find_zzz_char, s, s.find('\u{1F4A4}'));
2059+
make_test!(rfind_zzz_char, s, s.rfind('\u{1F4A4}'));
2060+
make_test!(find_zzz_str, s, s.find("\u{1F4A4}"));
2061+
2062+
make_test!(split_space_char, s, s.split(' ').count());
2063+
make_test!(split_terminator_space_char, s, s.split_terminator(' ').count());
2064+
2065+
make_test!(splitn_space_char, s, s.splitn(10, ' ').count());
2066+
make_test!(rsplitn_space_char, s, s.rsplitn(10, ' ').count());
2067+
2068+
make_test!(split_space_str, s, s.split(" ").count());
2069+
make_test!(split_ad_str, s, s.split("ad").count());
16962070
}

0 commit comments

Comments
 (0)