on master help sign in
Add more unit tests for pos_at_screen_coords.
ccecda4Nathan Vegdahl
helix-view/src/view.rs+68−27
@@ -245,76 +245,117 @@ impl View {
245mod tests {
245mod tests {
246 use super::*;
246 use super::*;
247 use helix_core::Rope;
247 use helix_core::Rope;
248+ const OFFSET: u16 = 7; // 1 diagnostic + 5 linenr + 1 gutter
248
249
249 #[test]
250 #[test]
250 fn test_text_pos_at_screen_coords() {
251 fn test_text_pos_at_screen_coords() {
251 let mut view = View::new(DocumentId::default());
252 let mut view = View::new(DocumentId::default());
252 view.area = Rect::new(40, 40, 40, 40);
253 view.area = Rect::new(40, 40, 40, 40);
253− let text = Rope::from_str("abc\n\tdef");
254+ let rope = Rope::from_str("abc\n\tdef");
255+ let text = rope.slice(..);
256+
257+ assert_eq!(view.text_pos_at_screen_coords(&text, 40, 2, 4), None);
258+
259+ assert_eq!(view.text_pos_at_screen_coords(&text, 40, 41, 4), None);
260+
261+ assert_eq!(view.text_pos_at_screen_coords(&text, 0, 2, 4), None);
262+
263+ assert_eq!(view.text_pos_at_screen_coords(&text, 0, 49, 4), None);
264+
265+ assert_eq!(view.text_pos_at_screen_coords(&text, 0, 41, 4), None);
266+
267+ assert_eq!(view.text_pos_at_screen_coords(&text, 40, 81, 4), None);
268+
269+ assert_eq!(view.text_pos_at_screen_coords(&text, 78, 41, 4), None);
254
270
255 assert_eq!(
271 assert_eq!(
256− view.text_pos_at_screen_coords(&text.slice(..), 40, 2, 4),
272+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 3, 4),
257− None
273+ Some(3)
258 );
274 );
259
275
276+ assert_eq!(view.text_pos_at_screen_coords(&text, 40, 80, 4), Some(3));
277+
260 assert_eq!(
278 assert_eq!(
261− view.text_pos_at_screen_coords(&text.slice(..), 40, 41, 4),
279+ view.text_pos_at_screen_coords(&text, 41, 40 + OFFSET + 1, 4),
262− None
280+ Some(5)
263 );
281 );
264
282
265 assert_eq!(
283 assert_eq!(
266− view.text_pos_at_screen_coords(&text.slice(..), 0, 2, 4),
284+ view.text_pos_at_screen_coords(&text, 41, 40 + OFFSET + 4, 4),
267− None
285+ Some(5)
268 );
286 );
269
287
270 assert_eq!(
288 assert_eq!(
271− view.text_pos_at_screen_coords(&text.slice(..), 0, 49, 4),
289+ view.text_pos_at_screen_coords(&text, 41, 40 + OFFSET + 7, 4),
272− None
290+ Some(8)
273 );
291 );
274
292
293+ assert_eq!(view.text_pos_at_screen_coords(&text, 41, 80, 4), Some(8));
294+ }
295+
296+ #[test]
297+ fn test_text_pos_at_screen_coords_cjk() {
298+ let mut view = View::new(DocumentId::default());
299+ view.area = Rect::new(40, 40, 40, 40);
300+ let rope = Rope::from_str("Hi! こんにちは皆さん");
301+ let text = rope.slice(..);
302+
275 assert_eq!(
303 assert_eq!(
276− view.text_pos_at_screen_coords(&text.slice(..), 0, 41, 4),
304+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 0, 4),
277− None
305+ Some(0)
278 );
306 );
279
307
280 assert_eq!(
308 assert_eq!(
281− view.text_pos_at_screen_coords(&text.slice(..), 40, 81, 4),
309+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 5, 4),
282− None
310+ Some(5)
283 );
311 );
284
312
285 assert_eq!(
313 assert_eq!(
286− view.text_pos_at_screen_coords(&text.slice(..), 78, 41, 4),
314+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 6, 4),
287− None
315+ Some(5)
288 );
316 );
289
317
290 assert_eq!(
318 assert_eq!(
291− view.text_pos_at_screen_coords(&text.slice(..), 40, 40 + 7 + 3, 4),
319+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 7, 4),
292− Some(3)
320+ Some(6)
293 );
321 );
294
322
295 assert_eq!(
323 assert_eq!(
296− view.text_pos_at_screen_coords(&text.slice(..), 40, 80, 4),
324+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 8, 4),
297− Some(3)
325+ Some(6)
298 );
326 );
327+ }
328+
329+ #[test]
330+ fn test_text_pos_at_screen_coords_graphemes() {
331+ let mut view = View::new(DocumentId::default());
332+ view.area = Rect::new(40, 40, 40, 40);
333+ let rope = Rope::from_str("Hèl̀l̀ò world!");
334+ let text = rope.slice(..);
299
335
300 assert_eq!(
336 assert_eq!(
301− view.text_pos_at_screen_coords(&text.slice(..), 41, 40 + 7 + 1, 4),
337+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 0, 4),
302− Some(5)
338+ Some(0)
303 );
339 );
304
340
305 assert_eq!(
341 assert_eq!(
306− view.text_pos_at_screen_coords(&text.slice(..), 41, 40 + 7 + 4, 4),
342+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 1, 4),
307− Some(5)
343+ Some(1)
308 );
344 );
309
345
310 assert_eq!(
346 assert_eq!(
311− view.text_pos_at_screen_coords(&text.slice(..), 41, 40 + 7 + 7, 4),
347+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 2, 4),
312− Some(8)
348+ Some(3)
313 );
349 );
314
350
315 assert_eq!(
351 assert_eq!(
316− view.text_pos_at_screen_coords(&text.slice(..), 41, 80, 4),
352+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 3, 4),
353+ Some(5)
354+ );
355+
356+ assert_eq!(
357+ view.text_pos_at_screen_coords(&text, 40, 40 + OFFSET + 4, 4),
317− Some(8)
358+ Some(7)
318 );
359 );
319 }
360 }
320}
361}