From 090b2453a1a2df8ebd6216855515339822823d80 Mon Sep 17 00:00:00 2001 From: Jack Moffitt Date: Thu, 17 Oct 2013 23:32:46 -0600 Subject: [PATCH] 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. --- src/libstd/str.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libstd/str.rs b/src/libstd/str.rs index 5c6974de17d..9d2f60fc27c 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -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("dö"))); } #[test]