|
1 |
| -// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT |
| 1 | +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT |
2 | 2 | // file at the top-level directory of this distribution and at
|
3 | 3 | // http://rust-lang.org/COPYRIGHT.
|
4 | 4 | //
|
@@ -1506,6 +1506,278 @@ fn test_str_from_utf8() {
|
1506 | 1506 | assert_eq!(from_utf8(xs), Err(Utf8Error::TooShort));
|
1507 | 1507 | }
|
1508 | 1508 |
|
| 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 | + |
1509 | 1781 | mod bench {
|
1510 | 1782 | use test::{Bencher, black_box};
|
1511 | 1783 |
|
@@ -1693,4 +1965,106 @@ malesuada sollicitudin quam eu fermentum.";
|
1693 | 1965 | assert!(haystack.contains(needle));
|
1694 | 1966 | })
|
1695 | 1967 | }
|
| 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()); |
1696 | 2070 | }
|
0 commit comments