| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- // ================================================================================
- // == This file is a part of Turbo Badger. (C) 2011-2014, Emil Segerås ==
- // == See tb_core.h for more information. ==
- // ================================================================================
- #include "tb_test.h"
- #include "tb_editfield.h"
- #ifdef TB_UNIT_TESTING
- using namespace tb;
- TB_TEST_GROUP(tb_editfield)
- {
- TBEditField *edit;
- TBStyleEdit *sedit;
- // == Setup & helpers =====================================================
- TB_TEST(Setup)
- {
- TB_VERIFY(edit = new TBEditField());
- edit->SetMultiline(true);
- sedit = edit->GetStyleEdit();
- /** Set a size so the layout code will be called and we can do some layout tests. */
- edit->SetRect(TBRect(0, 0, 1000, 1000));
- /** Force windows style line breaks so testing is the same on all platforms. */
- sedit->SetWindowsStyleBreak(true);
- }
- TB_TEST(Cleanup) { delete edit; }
- // == Tests ===============================================================
- TB_TEST(settext_singleline)
- {
- edit->SetMultiline(false);
- edit->SetText("One\nTwo", TB_CARET_POS_END);
- TB_VERIFY_STR(edit->GetText(), "One");
- }
- TB_TEST(settext_multiline)
- {
- // Both unix and windows line endings should be ok.
- edit->SetText("One\nTwo", TB_CARET_POS_END);
- TB_VERIFY_STR(edit->GetText(), "One\nTwo");
- edit->SetText("One\r\nTwo", TB_CARET_POS_END);
- TB_VERIFY_STR(edit->GetText(), "One\r\nTwo");
- }
- TB_TEST(settext_singleline_malformed_utf8)
- {
- // Should not detect these sequences as having new line character
- edit->SetText("\xC0\x8A", TB_CARET_POS_END);
- TB_VERIFY(sedit->blocks.CountLinks() == 1);
- edit->SetText("\xE0\x80\x8A", TB_CARET_POS_END);
- TB_VERIFY(sedit->blocks.CountLinks() == 1);
- edit->SetText("\xF0\x80\x80\x8A", TB_CARET_POS_END);
- TB_VERIFY(sedit->blocks.CountLinks() == 1);
- edit->SetText("\xF8\x80\x80\x80\x8A", TB_CARET_POS_END);
- TB_VERIFY(sedit->blocks.CountLinks() == 1);
- edit->SetText("\xFC\x80\x80\x80\x80\x8A", TB_CARET_POS_END);
- TB_VERIFY(sedit->blocks.CountLinks() == 1);
- // Should detect the new line character
- edit->SetText("\xF0\nHello", TB_CARET_POS_END);
- TB_VERIFY(sedit->blocks.CountLinks() == 2);
- }
- TB_TEST(settext_undoredo_ins)
- {
- // 1 character insertions in sequence should be merged to word boundary.
- sedit->InsertText("O"); sedit->InsertText("N"); sedit->InsertText("E"); sedit->InsertText(" ");
- sedit->InsertText("T"); sedit->InsertText("W"); sedit->InsertText("O");
- TB_VERIFY_STR(edit->GetText(), "ONE TWO");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "ONE ");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "");
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "ONE ");
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "ONE TWO");
- // 1 character insertions that are multi byte utf8 should also merge.
- // Note: this will also replace "TWO" since redoing keeps the redoed part selected.
- sedit->InsertText("L"); sedit->InsertText("Ö"); sedit->InsertText("K");
- TB_VERIFY_STR(edit->GetText(), "ONE LÖK");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "ONE ");
- }
- TB_TEST(settext_undoredo_ins_scattered)
- {
- sedit->InsertText("AAA");
- sedit->caret.SetGlobalOfs(2);
- sedit->InsertText(".");
- sedit->caret.SetGlobalOfs(1);
- sedit->InsertText(".");
- TB_VERIFY_STR(edit->GetText(), "A.A.A");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "AA.A");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "AAA");
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "AA.A");
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "A.A.A");
- }
- TB_TEST(settext_undoredo_ins_multiline)
- {
- sedit->InsertText("ONE\nTWO");
- TB_VERIFY_STR(edit->GetText(), "ONE\nTWO");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "");
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "ONE\nTWO");
- }
- TB_TEST(settext_undoredo_del)
- {
- sedit->InsertText("ONE TWO");
- sedit->selection.Select(3, 7);
- sedit->selection.RemoveContent();
- TB_VERIFY_STR(edit->GetText(), "ONE");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "ONE TWO");
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "ONE");
- }
- TB_TEST(settext_undoredo_ins_linebreak_1)
- {
- sedit->InsertText("ONETWO");
- sedit->caret.SetGlobalOfs(3);
- sedit->InsertText("\n");
- TB_VERIFY_STR(edit->GetText(), "ONE\nTWO");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "ONETWO");
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "ONE\nTWO");
- }
- TB_TEST(settext_undoredo_ins_linebreak_2)
- {
- // Inserting a linebreak at the end when we don't end
- // the line with a linebreak character must generate
- // one extra linebreak.
- sedit->InsertBreak();
- TB_VERIFY_STR(edit->GetText(), "\r\n\r\n");
- sedit->InsertBreak();
- TB_VERIFY_STR(edit->GetText(), "\r\n\r\n\r\n");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "\r\n\r\n");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "");
- }
- TB_TEST(settext_undoredo_ins_linebreak_3)
- {
- sedit->SetWindowsStyleBreak(false);
- sedit->InsertBreak();
- TB_VERIFY_STR(edit->GetText(), "\n\n");
- sedit->InsertBreak();
- TB_VERIFY_STR(edit->GetText(), "\n\n\n");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "\n\n");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "");
- }
- TB_TEST(settext_undoredo_ins_linebreak_4)
- {
- sedit->InsertText("ONE");
- sedit->InsertBreak();
- TB_VERIFY_STR(edit->GetText(), "ONE\r\n\r\n");
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "ONE");
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "ONE\r\n\r\n");
- }
- TB_TEST(settext_undoredo_bugfix1)
- {
- // Make sure we use the test dummy font (ID 0), so we're not dependant on
- // the available fonts & font backend in this test.
- TBFontDescription fd;
- const int font_size = 48;
- fd.SetSize(font_size);
- edit->SetFontDescription(fd);
- sedit->InsertBreak();
- sedit->InsertText("A");
- TB_VERIFY_STR(edit->GetText(), "\r\nA\r\n");
- TB_VERIFY(sedit->GetContentHeight() == font_size * 2);
- sedit->KeyDown(0, TB_KEY_BACKSPACE, TB_MODIFIER_NONE);
- TB_VERIFY_STR(edit->GetText(), "\r\n\r\n");
- TB_VERIFY(sedit->GetContentHeight() == font_size * 2);
- sedit->Undo();
- TB_VERIFY_STR(edit->GetText(), "\r\nA\r\n");
- TB_VERIFY(sedit->GetContentHeight() == font_size * 2);
- sedit->Redo();
- TB_VERIFY_STR(edit->GetText(), "\r\n\r\n");
- TB_VERIFY(sedit->GetContentHeight() == font_size * 2);
- }
- TB_TEST(settext_insert_linebreaks_move)
- {
- sedit->InsertText("Foo\n");
- sedit->InsertText("Foo\n");
- sedit->InsertText("Foo\n");
- TB_VERIFY_STR(edit->GetText(), "Foo\nFoo\nFoo\n");
- }
- TB_TEST(multiline_overflow_1)
- {
- // Make sure we use the test dummy font (ID 0), so we're not dependant on
- // the available fonts & font backend in this test.
- TBFontDescription fd;
- const int font_size = 48;
- fd.SetSize(font_size);
- edit->SetFontDescription(fd);
- // Test that a long line that overflow but has no allowed break position doesn't wrap.
- edit->SetText("this_is_a_long_line_that_should_not_wrap\n"
- "this_is_a_long_line_that_should_not_wrap", TB_CARET_POS_END);
- TB_VERIFY(sedit->GetContentHeight() == font_size * 2);
- }
- }
- #endif // TB_UNIT_TESTING
|