66 EXPECT_EQ(L"", engine()->GetText());
68 engine()->Insert(0, L"");
69 EXPECT_EQ(L"", engine()->GetText());
70 EXPECT_EQ(0U, engine()->GetLength());
72 engine()->Insert(0, L"Hello");
73 EXPECT_EQ(L"Hello", engine()->GetText());
74 EXPECT_EQ(5U, engine()->GetLength());
76 engine()->Insert(5, L" World");
77 EXPECT_EQ(L"Hello World", engine()->GetText());
78 EXPECT_EQ(11U, engine()->GetLength());
80 engine()->Insert(5, L" New");
81 EXPECT_EQ(L"Hello New World", engine()->GetText());
83 engine()->Insert(100, L" Cat");
84 EXPECT_EQ(L"Hello New World Cat", engine()->GetText());
88 engine()->SetHasCharacterLimit(
true);
89 engine()->SetCharacterLimit(5);
90 engine()->Insert(0, L"Hello");
93 engine()->Insert(5, L" World");
94 EXPECT_EQ(L"Hello", engine()->GetText());
96 engine()->SetCharacterLimit(8);
97 engine()->Insert(5, L" World");
98 EXPECT_EQ(L"Hello Wo", engine()->GetText());
104 engine()->SetDelegate(delegate.get());
106 engine()->SetCharacterLimit(5);
107 engine()->Insert(0, L"Hello");
110 engine()->Insert(5, L" World");
111 EXPECT_TRUE(delegate->text_is_full);
112 EXPECT_EQ(L"Hello", engine()->GetText());
115 engine()->SetCharacterLimit(8);
116 engine()->Insert(5, L" World");
117 EXPECT_TRUE(delegate->text_is_full);
118 EXPECT_EQ(L"Hello Wo", engine()->GetText());
120 engine()->SetHasCharacterLimit(
false);
123 engine()->Insert(0, L"Hello");
126 delegate->fail_validation =
true;
127 engine()->EnableValidation(
true);
128 engine()->Insert(5, L" World");
129 EXPECT_EQ(L"Hello", engine()->GetText());
131 delegate->fail_validation =
false;
132 engine()->Insert(5, L" World");
133 EXPECT_EQ(L"Hello World", engine()->GetText());
134 engine()->EnableValidation(
false);
138 engine()->Insert(0, L"Hello\nWorld");
139 EXPECT_FALSE(delegate->text_is_full);
140 EXPECT_EQ(L"Hello\nWorld", engine()->GetText());
145 engine()->LimitHorizontalScroll(
true);
146 engine()->SetAvailableWidth(52.0f);
147 engine()->Insert(0, L"Hello");
148 EXPECT_FALSE(delegate->text_is_full);
149 engine()->Insert(5, L" World");
150 EXPECT_TRUE(delegate->text_is_full);
151 EXPECT_EQ(L"Hello Wo", engine()->GetText());
152 engine()->LimitHorizontalScroll(
false);
157 engine()->SetLineSpace(12.0f);
158 engine()->LimitVerticalScroll(
true);
160 engine()->Insert(0, L"Hello");
161 EXPECT_FALSE(delegate->text_is_full);
162 engine()->Insert(5, L" Wo\nrld");
163 EXPECT_TRUE(delegate->text_is_full);
164 EXPECT_EQ(L"Hello Wo\n", engine()->GetText());
165 engine()->LimitVerticalScroll(
false);
167 engine()->SetDelegate(
nullptr);
285 EXPECT_FALSE(engine()->HasSelection());
286 engine()->SelectAll();
287 EXPECT_FALSE(engine()->HasSelection());
289 engine()->Insert(0, L"Hello World");
290 EXPECT_EQ(L"", engine()->DeleteSelectedText());
292 EXPECT_FALSE(engine()->HasSelection());
293 engine()->SelectAll();
294 EXPECT_TRUE(engine()->HasSelection());
295 EXPECT_EQ(L"Hello World", engine()->GetSelectedText());
297 engine()->ClearSelection();
298 EXPECT_FALSE(engine()->HasSelection());
299 EXPECT_EQ(L"", engine()->GetSelectedText());
301 engine()->SelectAll();
302 auto [start_idx, count] = engine()->GetSelection();
303 EXPECT_EQ(0U, start_idx);
304 EXPECT_EQ(11U, count);
307 EXPECT_EQ(L"Hello World", engine()->GetSelectedText());
308 EXPECT_TRUE(engine()->HasSelection());
309 EXPECT_EQ(L"Hello World", engine()->GetText());
311 engine()->Insert(5, L" A");
312 EXPECT_FALSE(engine()->HasSelection());
313 EXPECT_EQ(L"", engine()->GetSelectedText());
316 engine()->SelectAll();
317 EXPECT_TRUE(engine()->HasSelection());
318 EXPECT_EQ(L"Hello A World", engine()->GetSelectedText());
321 engine()->Insert(0, L"Hello World");
322 engine()->SelectAll();
324 EXPECT_EQ(L"Hello World", engine()->DeleteSelectedText());
325 EXPECT_FALSE(engine()->HasSelection());
326 EXPECT_EQ(L"", engine()->GetText());
328 engine()->Insert(0, L"Hello World");
329 engine()->SetSelection(5, 5);
330 EXPECT_EQ(L" Worl", engine()->DeleteSelectedText());
331 EXPECT_FALSE(engine()->HasSelection());
332 EXPECT_EQ(L"Hellod", engine()->GetText());
335 engine()->Insert(0, L"Hello World");
336 engine()->SelectAll();
337 engine()->ReplaceSelectedText(L"Goodbye Everybody");
338 EXPECT_FALSE(engine()->HasSelection());
339 EXPECT_EQ(L"Goodbye Everybody", engine()->GetText());
342 engine()->Insert(0, L"Hello World");
343 engine()->SetSelection(1, 4);
344 engine()->ReplaceSelectedText(L"i,");
345 EXPECT_FALSE(engine()->HasSelection());
346 EXPECT_EQ(L"Hi, World", engine()->GetText());
350 engine()->Insert(0, L"Hello");
351 engine()->Insert(0, L"A ");
352 engine()->SetSelection(3, 6);
353 EXPECT_EQ(L"ello", engine()->GetSelectedText());
356 engine()->Insert(0, L"Hello World");
357 engine()->ClearSelection();
358 engine()->DeleteSelectedText();
359 EXPECT_EQ(L"Hello World", engine()->GetText());
363 EXPECT_FALSE(engine()->CanUndo());
364 EXPECT_FALSE(engine()->CanRedo());
365 EXPECT_FALSE(engine()->Undo());
366 EXPECT_FALSE(engine()->Redo());
368 engine()->Insert(0, L"Hello");
369 EXPECT_TRUE(engine()->CanUndo());
370 EXPECT_FALSE(engine()->CanRedo());
371 EXPECT_TRUE(engine()->Undo());
372 EXPECT_EQ(L"", engine()->GetText());
373 EXPECT_FALSE(engine()->CanUndo());
374 EXPECT_TRUE(engine()->CanRedo());
375 EXPECT_TRUE(engine()->Redo());
376 EXPECT_EQ(L"Hello", engine()->GetText());
377 EXPECT_TRUE(engine()->CanUndo());
378 EXPECT_FALSE(engine()->CanRedo());
381 EXPECT_FALSE(engine()->CanUndo());
382 EXPECT_FALSE(engine()->CanRedo());
384 engine()->Insert(0, L"Hello World");
385 engine()->SelectAll();
386 engine()->DeleteSelectedText();
387 EXPECT_EQ(L"", engine()->GetText());
388 EXPECT_TRUE(engine()->CanUndo());
389 EXPECT_TRUE(engine()->Undo());
390 EXPECT_EQ(L"Hello World", engine()->GetText());
391 EXPECT_TRUE(engine()->CanRedo());
392 EXPECT_TRUE(engine()->Redo());
393 EXPECT_EQ(L"", engine()->GetText());
394 EXPECT_TRUE(engine()->CanUndo());
395 EXPECT_FALSE(engine()->CanRedo());
397 engine()->Insert(0, L"Hello World");
398 engine()->SelectAll();
399 engine()->ReplaceSelectedText(L"Goodbye Friend");
400 EXPECT_EQ(L"Goodbye Friend", engine()->GetText());
401 EXPECT_TRUE(engine()->CanUndo());
402 EXPECT_TRUE(engine()->Undo());
403 EXPECT_EQ(L"Hello World", engine()->GetText());
404 EXPECT_TRUE(engine()->CanRedo());
405 EXPECT_TRUE(engine()->Redo());
406 EXPECT_EQ(L"Goodbye Friend", engine()->GetText());
409 engine()->SetMaxEditOperationsForTesting(3);
410 engine()->Insert(0, L"First ");
411 engine()->Insert(engine()->GetLength(), L"Second ");
412 engine()->Insert(engine()->GetLength(), L"Third");
414 EXPECT_TRUE(engine()->CanUndo());
415 EXPECT_TRUE(engine()->Undo());
416 EXPECT_EQ(L"First Second ", engine()->GetText());
417 EXPECT_TRUE(engine()->CanUndo());
418 EXPECT_TRUE(engine()->Undo());
420 engine()->CanUndo());
421 EXPECT_EQ(L"First ", engine()->GetText());
423 EXPECT_TRUE(engine()->CanRedo());
424 EXPECT_TRUE(engine()->Redo());
425 EXPECT_TRUE(engine()->CanRedo());
426 EXPECT_TRUE(engine()->Redo());
427 EXPECT_FALSE(engine()->CanRedo());
428 EXPECT_EQ(L"First Second Third", engine()->GetText());
432 engine()->SetMaxEditOperationsForTesting(4);
435 engine()->Insert(0, L"H");
436 engine()->Insert(1, L"e");
437 engine()->Insert(2, L"l");
438 engine()->Insert(3, L"l");
439 engine()->Insert(4, L"o");
440 engine()->Insert(5, L" World");
441 EXPECT_EQ(L"Hello World", engine()->GetText());
444 engine()->Delete(4, 3);
445 EXPECT_EQ(L"Hellorld", engine()->GetText());
446 EXPECT_TRUE(engine()->Undo());
447 EXPECT_EQ(L"Hello World", engine()->GetText());
448 engine()->Delete(5, 6);
449 EXPECT_EQ(L"Hello", engine()->GetText());
450 EXPECT_TRUE(engine()->Undo());
451 EXPECT_EQ(L"Hello World", engine()->GetText());
452 EXPECT_TRUE(engine()->Redo());
453 EXPECT_EQ(L"Hello", engine()->GetText());
456 EXPECT_TRUE(engine()->Undo());
457 EXPECT_EQ(L"Hello World", engine()->GetText());
458 EXPECT_TRUE(engine()->Undo());
459 EXPECT_EQ(L"Hello", engine()->GetText());
460 EXPECT_TRUE(engine()->Undo());
461 EXPECT_EQ(L"Hell", engine()->GetText());
462 EXPECT_FALSE(engine()->Undo());
463 EXPECT_EQ(L"Hell", engine()->GetText());
529 engine()->Insert(0, L"Hi!");
530 ASSERT_EQ(3U, engine()->GetLength());
532 char_info = engine()->GetCharacterInfo(0);
533 EXPECT_EQ(0, char_info.first);
534 EXPECT_FLOAT_EQ(0.0f, char_info.second.Left());
535 EXPECT_FLOAT_EQ(0.0f, char_info.second.Top());
536 EXPECT_FLOAT_EQ(8.664f, char_info.second.Width());
537 EXPECT_FLOAT_EQ(12.0f, char_info.second.Height());
539 char_info = engine()->GetCharacterInfo(1);
540 EXPECT_EQ(0, char_info.first);
541 EXPECT_FLOAT_EQ(8.664f, char_info.second.Left());
542 EXPECT_FLOAT_EQ(0.0f, char_info.second.Top());
543 EXPECT_FLOAT_EQ(3.324f, char_info.second.Width());
544 EXPECT_FLOAT_EQ(12.0f, char_info.second.Height());
546 char_info = engine()->GetCharacterInfo(2);
547 EXPECT_EQ(0, char_info.first);
548 EXPECT_FLOAT_EQ(11.988f, char_info.second.Left());
549 EXPECT_FLOAT_EQ(0.0f, char_info.second.Top());
550 EXPECT_FLOAT_EQ(3.996f, char_info.second.Width());
551 EXPECT_FLOAT_EQ(12.0f, char_info.second.Height());
556 char_info = engine()->GetCharacterInfo(3);
557 EXPECT_EQ(0, char_info.first);
558 EXPECT_FLOAT_EQ(15.984, char_info.second.Left());
559 EXPECT_FLOAT_EQ(0.0f, char_info.second.Top());
560 EXPECT_FLOAT_EQ(0.0f, char_info.second.Width());
561 EXPECT_FLOAT_EQ(12.0f, char_info.second.Height());
565 auto [start_idx, count] = engine()->BoundsForWordAt(100);
566 EXPECT_EQ(0U, start_idx);
567 EXPECT_EQ(0U, count);
568 engine()->SetSelection(start_idx, count);
569 EXPECT_EQ(L"", engine()->GetSelectedText());
572 engine()->Insert(0, L"Hello");
573 std::tie(start_idx, count) = engine()->BoundsForWordAt(0);
574 EXPECT_EQ(0U, start_idx);
575 EXPECT_EQ(5U, count);
576 engine()->SetSelection(start_idx, count);
577 EXPECT_EQ(L"Hello", engine()->GetSelectedText());
580 engine()->Insert(0, L"Hello World");
581 std::tie(start_idx, count) = engine()->BoundsForWordAt(100);
582 EXPECT_EQ(0U, start_idx);
583 EXPECT_EQ(0U, count);
584 engine()->SetSelection(start_idx, count);
585 EXPECT_EQ(L"", engine()->GetSelectedText());
587 std::tie(start_idx, count) = engine()->BoundsForWordAt(0);
588 EXPECT_EQ(0U, start_idx);
589 EXPECT_EQ(5U, count);
590 engine()->SetSelection(start_idx, count);
591 EXPECT_EQ(L"Hello", engine()->GetSelectedText());
593 std::tie(start_idx, count) = engine()->BoundsForWordAt(1);
594 EXPECT_EQ(0U, start_idx);
595 EXPECT_EQ(5U, count);
596 engine()->SetSelection(start_idx, count);
597 EXPECT_EQ(L"Hello", engine()->GetSelectedText());
599 std::tie(start_idx, count) = engine()->BoundsForWordAt(4);
600 EXPECT_EQ(0U, start_idx);
601 EXPECT_EQ(5U, count);
602 engine()->SetSelection(start_idx, count);
603 EXPECT_EQ(L"Hello", engine()->GetSelectedText());
606 std::tie(start_idx, count) = engine()->BoundsForWordAt(5);
607 EXPECT_EQ(5U, start_idx);
608 EXPECT_EQ(1U, count);
609 engine()->SetSelection(start_idx, count);
610 EXPECT_EQ(L" ", engine()->GetSelectedText());
612 std::tie(start_idx, count) = engine()->BoundsForWordAt(6);
613 EXPECT_EQ(6U, start_idx);
614 EXPECT_EQ(5U, count);
615 engine()->SetSelection(start_idx, count);
616 EXPECT_EQ(L"World", engine()->GetSelectedText());
619 engine()->Insert(0, L"123 456 789");
620 std::tie(start_idx, count) = engine()->BoundsForWordAt(5);
621 engine()->SetSelection(start_idx, count);
622 EXPECT_EQ(L"456", engine()->GetSelectedText());
625 engine()->Insert(0, L"123def789");
626 std::tie(start_idx, count) = engine()->BoundsForWordAt(5);
627 engine()->SetSelection(start_idx, count);
628 EXPECT_EQ(L"123def789", engine()->GetSelectedText());
631 engine()->Insert(0, L"abc456ghi");
632 std::tie(start_idx, count) = engine()->BoundsForWordAt(5);
633 engine()->SetSelection(start_idx, count);
634 EXPECT_EQ(L"abc456ghi", engine()->GetSelectedText());
637 engine()->Insert(0, L"hello, world");
638 std::tie(start_idx, count) = engine()->BoundsForWordAt(0);
639 engine()->SetSelection(start_idx, count);
640 EXPECT_EQ(L"hello", engine()->GetSelectedText());
643 engine()->Insert(0, L"hello, world");
644 std::tie(start_idx, count) = engine()->BoundsForWordAt(5);
645 engine()->SetSelection(start_idx, count);
646 EXPECT_EQ(L",", engine()->GetSelectedText());
649 engine()->Insert(0, L"np-complete");
650 std::tie(start_idx, count) = engine()->BoundsForWordAt(6);
651 engine()->SetSelection(start_idx, count);
652 EXPECT_EQ(L"complete", engine()->GetSelectedText());
655 engine()->Insert(0, L"(123) 456-7890");
656 std::tie(start_idx, count) = engine()->BoundsForWordAt(0);
657 engine()->SetSelection(start_idx, count);
658 EXPECT_EQ(L"(", engine()->GetSelectedText());
660 std::tie(start_idx, count) = engine()->BoundsForWordAt(1);
661 engine()->SetSelection(start_idx, count);
662 EXPECT_EQ(L"123", engine()->GetSelectedText());
664 std::tie(start_idx, count) = engine()->BoundsForWordAt(7);
665 engine()->SetSelection(start_idx, count);
666 EXPECT_EQ(L"456", engine()->GetSelectedText());
668 std::tie(start_idx, count) = engine()->BoundsForWordAt(11);
669 engine()->SetSelection(start_idx, count);
670 EXPECT_EQ(L"7890", engine()->GetSelectedText());
680 std::vector<
const wchar_t*> results;
688 {L"A::A", {L"A", L":", L":", L"A"}},
691 {L"A00A", {L"A00A"}},
693 {L"0,,0", {L"0", L",", L",", L"0"}},
694 {L"\u3031\u3031", {L"\u3031\u3031"}},
695 {L"A_0_\u3031_", {L"A_0_\u3031_"}},
696 {L"A__A", {L"A__A"}},
701 for (
auto t : tests) {
703 engine()->Insert(0, t.str);
706 for (
const auto* res : t.results) {
707 std::tie(start_idx, count) = engine()->BoundsForWordAt(idx);
708 engine()->SetSelection(start_idx, count);
709 EXPECT_EQ(res, engine()->GetSelectedText()) <<
"Input: '" << t.str <<
"'";
717 engine()->Insert(0, L"Hello");
719 EXPECT_EQ(0U, engine()->GetIndexLeft(0));
720 EXPECT_EQ(5U, engine()->GetIndexRight(5));
721 EXPECT_EQ(2U, engine()->GetIndexUp(2));
722 EXPECT_EQ(2U, engine()->GetIndexDown(2));
723 EXPECT_EQ(1U, engine()->GetIndexLeft(2));
724 EXPECT_EQ(3U, engine()->GetIndexRight(2));
725 EXPECT_EQ(0U, engine()->GetIndexAtStartOfLine(2));
726 EXPECT_EQ(5U, engine()->GetIndexAtEndOfLine(2));
729 engine()->Insert(0, L"The book is \"مدخل إلى C++\"");
730 EXPECT_FALSE(
FX_IsOdd(engine()->GetCharacterInfo(3).first));
731 EXPECT_EQ(2U, engine()->GetIndexLeft(3));
732 EXPECT_EQ(4U, engine()->GetIndexRight(3));
733 EXPECT_TRUE(
FX_IsOdd(engine()->GetCharacterInfo(15).first));
734 EXPECT_EQ(14U, engine()->GetIndexLeft(15));
735 EXPECT_EQ(16U, engine()->GetIndexRight(15));
736 EXPECT_FALSE(
FX_IsOdd(engine()->GetCharacterInfo(23).first));
737 EXPECT_EQ(22U, engine()->GetIndexLeft(23));
738 EXPECT_EQ(24U, engine()->GetIndexRight(23));
741 engine()->Insert(0, L"Hello\r\nWorld\r\nTest");
743 engine()->SetSelection(engine()->GetIndexLeft(7U), 7);
744 EXPECT_EQ(L"\r\nWorld", engine()->GetSelectedText());
747 engine()->SetSelection(engine()->GetIndexUp(8U), 2);
748 EXPECT_EQ(L"el", engine()->GetSelectedText());
751 engine()->SetSelection(engine()->GetIndexUp(15U), 2);
752 EXPECT_EQ(L"or", engine()->GetSelectedText());
755 engine()->SetSelection(engine()->GetIndexDown(1U), 2);
756 EXPECT_EQ(L"or", engine()->GetSelectedText());
759 engine()->SetSelection(engine()->GetIndexDown(8U), 2);
760 EXPECT_EQ(L"es", engine()->GetSelectedText());
762 size_t start_idx = engine()->GetIndexAtStartOfLine(8U);
763 size_t end_idx = engine()->GetIndexAtEndOfLine(8U);
764 engine()->SetSelection(start_idx, end_idx - start_idx);
765 EXPECT_EQ(L"World", engine()->GetSelectedText());
768 engine()->SetSelection(engine()->GetIndexRight(5U), 5);
769 EXPECT_EQ(L"World", engine()->GetSelectedText());
772 engine()->Insert(0, L"Short\nAnd a very long line");
773 engine()->SetSelection(engine()->GetIndexUp(14U), 11);
774 EXPECT_EQ(L"\nAnd a very", engine()->GetSelectedText());
777 engine()->Insert(0, L"A Very long line\nShort");
778 EXPECT_EQ(engine()->GetLength(), engine()->GetIndexDown(8U));
781 engine()->Insert(0, L"Hello\rWorld\rTest");
783 engine()->SetSelection(engine()->GetIndexLeft(6U), 6);
784 EXPECT_EQ(L"\rWorld", engine()->GetSelectedText());
787 engine()->SetSelection(engine()->GetIndexUp(7U), 2);
788 EXPECT_EQ(L"el", engine()->GetSelectedText());
791 engine()->SetSelection(engine()->GetIndexUp(13U), 2);
792 EXPECT_EQ(L"or", engine()->GetSelectedText());
795 engine()->SetSelection(engine()->GetIndexDown(1U), 2);
796 EXPECT_EQ(L"or", engine()->GetSelectedText());
799 engine()->SetSelection(engine()->GetIndexDown(7U), 2);
800 EXPECT_EQ(L"es", engine()->GetSelectedText());
802 start_idx = engine()->GetIndexAtStartOfLine(7U);
803 end_idx = engine()->GetIndexAtEndOfLine(7U);
804 engine()->SetSelection(start_idx, end_idx - start_idx);
805 EXPECT_EQ(L"World", engine()->GetSelectedText());
808 engine()->SetSelection(engine()->GetIndexRight(5U), 5);
809 EXPECT_EQ(L"World", engine()->GetSelectedText());
812 engine()->Insert(0, L"Hello\nWorld\nTest");
814 engine()->SetSelection(engine()->GetIndexLeft(6U), 6);
815 EXPECT_EQ(L"\nWorld", engine()->GetSelectedText());
818 engine()->SetSelection(engine()->GetIndexUp(7U), 2);
819 EXPECT_EQ(L"el", engine()->GetSelectedText());
822 engine()->SetSelection(engine()->GetIndexUp(13U), 2);
823 EXPECT_EQ(L"or", engine()->GetSelectedText());
826 engine()->SetSelection(engine()->GetIndexDown(1U), 2);
827 EXPECT_EQ(L"or", engine()->GetSelectedText());
830 engine()->SetSelection(engine()->GetIndexDown(7U), 2);
831 EXPECT_EQ(L"es", engine()->GetSelectedText());
833 start_idx = engine()->GetIndexAtStartOfLine(7U);
834 end_idx = engine()->GetIndexAtEndOfLine(7U);
835 engine()->SetSelection(start_idx, end_idx - start_idx);
836 EXPECT_EQ(L"World", engine()->GetSelectedText());
839 engine()->SetSelection(engine()->GetIndexRight(5U), 5);
840 EXPECT_EQ(L"World", engine()->GetSelectedText());