Fix starts_with() and ends_with().

d4a32386f3b6 broke these since slice_to() and slice_from() must get character
boundaries, and arbitrary needle lengths don't necessarily map to character
boundaries of the haystack.

This also adds new tests that would have caught this bug.
This commit is contained in:
Jack Moffitt 2013-10-17 23:32:46 -06:00
parent 3fd0e3a77b
commit 090b2453a1

View File

@ -2010,13 +2010,13 @@ impl<'self> StrSlice<'self> for &'self str {
#[inline]
fn starts_with<'a>(&self, needle: &'a str) -> bool {
let n = needle.len();
self.len() >= n && needle == self.slice_to(n)
self.len() >= n && needle.as_bytes() == self.as_bytes().slice_to(n)
}
#[inline]
fn ends_with(&self, needle: &str) -> bool {
let (m, n) = (self.len(), needle.len());
m >= n && needle == self.slice_from(m - n)
m >= n && needle.as_bytes() == self.as_bytes().slice_from(m - n)
}
fn escape_default(&self) -> ~str {
@ -2886,6 +2886,8 @@ mod tests {
assert!(("abc".starts_with("a")));
assert!((!"a".starts_with("abc")));
assert!((!"".starts_with("abc")));
assert!((!"ödd".starts_with("-")));
assert!(("ödd".starts_with("öd")));
}
#[test]
@ -2895,6 +2897,8 @@ mod tests {
assert!(("abc".ends_with("c")));
assert!((!"a".ends_with("abc")));
assert!((!"".ends_with("abc")));
assert!((!"ddö".ends_with("-")));
assert!(("ddö".ends_with("")));
}
#[test]