From fb5d7b6714d265aae844ce8f7df35d675505026f Mon Sep 17 00:00:00 2001 From: Jun Mukai Date: Fri, 16 Mar 2018 13:34:53 -0700 Subject: [PATCH 1/2] fix crashes on prev_boundary Fixes #38, #39 --- src/grapheme.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/grapheme.rs b/src/grapheme.rs index c07fc8c..e7a3161 100644 --- a/src/grapheme.rs +++ b/src/grapheme.rs @@ -624,6 +624,9 @@ impl GraphemeCursor { if self.offset == 0 { return Ok(None); } + if self.offset == chunk_start { + return Err(GraphemeIncomplete::PrevChunk); + } let mut iter = chunk[..self.offset - chunk_start].chars().rev(); let mut ch = iter.next().unwrap(); loop { @@ -647,6 +650,7 @@ impl GraphemeCursor { self.decide(true); } else { self.resuming = true; + self.cat_after = Some(gr::grapheme_category(ch)); return Err(GraphemeIncomplete::PrevChunk); } } @@ -659,3 +663,19 @@ impl GraphemeCursor { } } } + +#[test] +fn test_grapheme_cursor_prev_boundary() { + let s = "abcd"; + let mut c = GraphemeCursor::new(3, s.len(), true); + assert_eq!(c.prev_boundary(&s[2..], 2), Err(GraphemeIncomplete::PrevChunk)); + assert_eq!(c.prev_boundary(&s[..2], 0), Ok(Some(2))); +} + +#[test] +fn test_grapheme_cursor_prev_boundary_chunk_start() { + let s = "abcd"; + let mut c = GraphemeCursor::new(2, s.len(), true); + assert_eq!(c.prev_boundary(&s[2..], 2), Err(GraphemeIncomplete::PrevChunk)); + assert_eq!(c.prev_boundary(&s[..2], 0), Ok(Some(1))); +} From 1f2f59149e82c8177c0f3154fb5d383b6a9a795e Mon Sep 17 00:00:00 2001 From: Jun Mukai Date: Mon, 19 Mar 2018 17:22:12 -0700 Subject: [PATCH 2/2] fix typo contained through manual merge --- src/grapheme.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/grapheme.rs b/src/grapheme.rs index b815dd2..f6062f7 100644 --- a/src/grapheme.rs +++ b/src/grapheme.rs @@ -669,6 +669,7 @@ impl GraphemeCursor { } } +#[test] fn test_grapheme_cursor_ris_precontext() { let s = "\u{1f1fa}\u{1f1f8}\u{1f1fa}\u{1f1f8}\u{1f1fa}\u{1f1f8}"; let mut c = GraphemeCursor::new(8, s.len(), true);