]> git.saurik.com Git - wxWidgets.git/blame - tests/controls/richtextctrltest.cpp
Add test for absence of events from wxSpinCtrlDouble ctor.
[wxWidgets.git] / tests / controls / richtextctrltest.cpp
CommitLineData
232fdc63
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: tests/controls/richtextctrltest.cpp
3// Purpose: wxRichTextCtrl unit test
4// Author: Steven Lamerton
5// Created: 2010-07-07
232fdc63
VZ
6// Copyright: (c) 2010 Steven Lamerton
7///////////////////////////////////////////////////////////////////////////////
8
9#include "testprec.h"
10
11#if wxUSE_RICHTEXT
12
13#ifdef __BORLANDC__
14 #pragma hdrstop
15#endif
16
17#ifndef WX_PRECOMP
18 #include "wx/app.h"
19#endif // WX_PRECOMP
20
21#include "wx/richtext/richtextctrl.h"
22#include "wx/richtext/richtextstyles.h"
23#include "testableframe.h"
24#include "asserthelper.h"
25#include "wx/uiaction.h"
26
27class RichTextCtrlTestCase : public CppUnit::TestCase
28{
29public:
30 RichTextCtrlTestCase() { }
31
32 void setUp();
33 void tearDown();
34
35private:
36 CPPUNIT_TEST_SUITE( RichTextCtrlTestCase );
37 WXUISIM_TEST( CharacterEvent );
38 WXUISIM_TEST( DeleteEvent );
39 WXUISIM_TEST( ReturnEvent );
40 CPPUNIT_TEST( StyleEvent );
41 CPPUNIT_TEST( BufferResetEvent );
42 WXUISIM_TEST( UrlEvent );
43 WXUISIM_TEST( TextEvent );
44 CPPUNIT_TEST( CutCopyPaste );
45 CPPUNIT_TEST( UndoRedo );
46 CPPUNIT_TEST( CaretPosition );
47 CPPUNIT_TEST( Selection );
48 WXUISIM_TEST( Editable );
49 CPPUNIT_TEST( Range );
50 CPPUNIT_TEST( Alignment );
51 CPPUNIT_TEST( Bold );
52 CPPUNIT_TEST( Italic );
53 CPPUNIT_TEST( Underline );
54 CPPUNIT_TEST( Indent );
55 CPPUNIT_TEST( LineSpacing );
56 CPPUNIT_TEST( ParagraphSpacing );
57 CPPUNIT_TEST( TextColour );
58 CPPUNIT_TEST( NumberedBullet );
59 CPPUNIT_TEST( SymbolBullet );
60 CPPUNIT_TEST( FontSize );
61 CPPUNIT_TEST( Font );
62 CPPUNIT_TEST( Delete );
63 CPPUNIT_TEST( Url );
31be8400 64 CPPUNIT_TEST( Table );
232fdc63
VZ
65 CPPUNIT_TEST_SUITE_END();
66
67 void CharacterEvent();
68 void DeleteEvent();
69 void ReturnEvent();
70 void StyleEvent();
71 void BufferResetEvent();
72 void UrlEvent();
73 void TextEvent();
74 void CutCopyPaste();
75 void UndoRedo();
76 void CaretPosition();
77 void Selection();
78 void Editable();
79 void Range();
80 void Alignment();
81 void Bold();
82 void Italic();
83 void Underline();
84 void Indent();
85 void LineSpacing();
86 void ParagraphSpacing();
87 void TextColour();
88 void NumberedBullet();
89 void SymbolBullet();
90 void FontSize();
91 void Font();
92 void Delete();
93 void Url();
31be8400 94 void Table();
232fdc63
VZ
95
96 wxRichTextCtrl* m_rich;
97
98 DECLARE_NO_COPY_CLASS(RichTextCtrlTestCase)
99};
100
101// register in the unnamed registry so that these tests are run by default
102CPPUNIT_TEST_SUITE_REGISTRATION( RichTextCtrlTestCase );
103
e3778b4d 104// also include in its own registry so that these tests can be run alone
232fdc63
VZ
105CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( RichTextCtrlTestCase, "RichTextCtrlTestCase" );
106
107void RichTextCtrlTestCase::setUp()
108{
109 m_rich = new wxRichTextCtrl(wxTheApp->GetTopWindow(), wxID_ANY, "",
39a18da1 110 wxDefaultPosition, wxSize(400, 200), wxWANTS_CHARS);
232fdc63
VZ
111}
112
113void RichTextCtrlTestCase::tearDown()
114{
115 wxDELETE(m_rich);
116}
117
118void RichTextCtrlTestCase::CharacterEvent()
119{
120#if wxUSE_UIACTIONSIMULATOR
9be7f47c
JS
121
122 // There seems to be an event sequence problem on GTK+ that causes the events
123 // to be disconnected before they're processed, generating spurious errors.
124#if !defined(__WXGTK__)
ce7fe42e
VZ
125 EventCounter character(m_rich, wxEVT_RICHTEXT_CHARACTER);
126 EventCounter content(m_rich, wxEVT_RICHTEXT_CONTENT_INSERTED);
232fdc63
VZ
127
128 m_rich->SetFocus();
129
130 wxUIActionSimulator sim;
131 sim.Text("abcdef");
132 wxYield();
133
744d91d4
SL
134 CPPUNIT_ASSERT_EQUAL(6, character.GetCount());
135 CPPUNIT_ASSERT_EQUAL(6, content.GetCount());
136
137 character.Clear();
138 content.Clear();
232fdc63
VZ
139
140 //As these are not characters they shouldn't count
141 sim.Char(WXK_RETURN);
142 sim.Char(WXK_SHIFT);
143 wxYield();
144
744d91d4
SL
145 CPPUNIT_ASSERT_EQUAL(0, character.GetCount());
146 CPPUNIT_ASSERT_EQUAL(1, content.GetCount());
232fdc63 147#endif
9be7f47c 148#endif
232fdc63
VZ
149}
150
151void RichTextCtrlTestCase::DeleteEvent()
152{
153#if wxUSE_UIACTIONSIMULATOR
9be7f47c
JS
154 // There seems to be an event sequence problem on GTK+ that causes the events
155 // to be disconnected before they're processed, generating spurious errors.
156#if !defined(__WXGTK__)
ce7fe42e
VZ
157 EventCounter deleteevent(m_rich, wxEVT_RICHTEXT_DELETE);
158 EventCounter contentdelete(m_rich, wxEVT_RICHTEXT_CONTENT_DELETED);
232fdc63
VZ
159
160 m_rich->SetFocus();
161
162 wxUIActionSimulator sim;
163 sim.Text("abcdef");
164 sim.Char(WXK_BACK);
165 sim.Char(WXK_DELETE);
166 wxYield();
167
744d91d4 168 CPPUNIT_ASSERT_EQUAL(2, deleteevent.GetCount());
232fdc63 169 //Only one as the delete doesn't delete anthing
744d91d4 170 CPPUNIT_ASSERT_EQUAL(1, contentdelete.GetCount());
232fdc63 171#endif
9be7f47c 172#endif
232fdc63
VZ
173}
174
175void RichTextCtrlTestCase::ReturnEvent()
176{
177#if wxUSE_UIACTIONSIMULATOR
9be7f47c
JS
178 // There seems to be an event sequence problem on GTK+ that causes the events
179 // to be disconnected before they're processed, generating spurious errors.
180#if !defined(__WXGTK__)
ce7fe42e 181 EventCounter returnevent(m_rich, wxEVT_RICHTEXT_RETURN);
232fdc63
VZ
182
183 m_rich->SetFocus();
184
185 wxUIActionSimulator sim;
186 sim.Char(WXK_RETURN);
187 wxYield();
188
744d91d4 189 CPPUNIT_ASSERT_EQUAL(1, returnevent.GetCount());
232fdc63 190#endif
9be7f47c 191#endif
232fdc63
VZ
192}
193
194void RichTextCtrlTestCase::StyleEvent()
195{
ce7fe42e 196 EventCounter stylechanged(m_rich, wxEVT_RICHTEXT_STYLE_CHANGED);
232fdc63
VZ
197
198 m_rich->SetValue("Sometext");
199 m_rich->SetStyle(0, 8, wxTextAttr(*wxRED, *wxWHITE));
200
744d91d4 201 CPPUNIT_ASSERT_EQUAL(1, stylechanged.GetCount());
232fdc63
VZ
202}
203
204void RichTextCtrlTestCase::BufferResetEvent()
205{
ce7fe42e 206 EventCounter reset(m_rich, wxEVT_RICHTEXT_BUFFER_RESET);
232fdc63
VZ
207
208 m_rich->AppendText("more text!");
209 m_rich->SetValue("");
210
744d91d4 211 CPPUNIT_ASSERT_EQUAL(1, reset.GetCount());
232fdc63 212
744d91d4 213 reset.Clear();
232fdc63
VZ
214 m_rich->AppendText("more text!");
215 m_rich->Clear();
216
744d91d4
SL
217 CPPUNIT_ASSERT_EQUAL(1, reset.GetCount());
218
219 reset.Clear();
232fdc63
VZ
220
221 //We expect a buffer reset here as setvalue clears the existing text
222 m_rich->SetValue("replace");
744d91d4 223 CPPUNIT_ASSERT_EQUAL(1, reset.GetCount());
232fdc63
VZ
224}
225
226void RichTextCtrlTestCase::UrlEvent()
227{
228#if wxUSE_UIACTIONSIMULATOR
9be7f47c
JS
229 // Mouse up event not being caught on GTK+
230#if !defined(__WXGTK__)
ce7fe42e 231 EventCounter url(m_rich, wxEVT_TEXT_URL);
232fdc63
VZ
232
233 m_rich->BeginURL("http://www.wxwidgets.org");
234 m_rich->WriteText("http://www.wxwidgets.org");
235 m_rich->EndURL();
236
237 wxUIActionSimulator sim;
b083f3e8 238 sim.MouseMove(m_rich->ClientToScreen(wxPoint(10, 10)));
232fdc63
VZ
239 wxYield();
240
241 sim.MouseClick();
242 wxYield();
243
744d91d4 244 CPPUNIT_ASSERT_EQUAL(1, url.GetCount());
232fdc63 245#endif
9be7f47c 246#endif
232fdc63
VZ
247}
248
249void RichTextCtrlTestCase::TextEvent()
250{
251#if wxUSE_UIACTIONSIMULATOR
9be7f47c 252#if !defined(__WXGTK__)
ce7fe42e 253 EventCounter updated(m_rich, wxEVT_TEXT);
232fdc63
VZ
254
255 m_rich->SetFocus();
256
257 wxUIActionSimulator sim;
258 sim.Text("abcdef");
259 wxYield();
260
261 CPPUNIT_ASSERT_EQUAL("abcdef", m_rich->GetValue());
744d91d4 262 CPPUNIT_ASSERT_EQUAL(6, updated.GetCount());
232fdc63 263#endif
9be7f47c 264#endif
232fdc63
VZ
265}
266
267void RichTextCtrlTestCase::CutCopyPaste()
268{
269#ifndef __WXOSX__
270 m_rich->AppendText("sometext");
271 m_rich->SelectAll();
272
273 if(m_rich->CanCut() && m_rich->CanPaste())
274 {
275 m_rich->Cut();
276 CPPUNIT_ASSERT(m_rich->IsEmpty());
277
278 wxYield();
279
280 m_rich->Paste();
281 CPPUNIT_ASSERT_EQUAL("sometext", m_rich->GetValue());
282 }
283
284 m_rich->SelectAll();
285
286 if(m_rich->CanCopy() && m_rich->CanPaste())
287 {
288 m_rich->Copy();
289 m_rich->Clear();
290 CPPUNIT_ASSERT(m_rich->IsEmpty());
291
292 wxYield();
293
294 m_rich->Paste();
295 CPPUNIT_ASSERT_EQUAL("sometext", m_rich->GetValue());
296 }
297#endif
298}
299
300void RichTextCtrlTestCase::UndoRedo()
301{
302 m_rich->AppendText("sometext");
303
304 CPPUNIT_ASSERT(m_rich->CanUndo());
305
306 m_rich->Undo();
307
308 CPPUNIT_ASSERT(m_rich->IsEmpty());
309 CPPUNIT_ASSERT(m_rich->CanRedo());
310
311 m_rich->Redo();
312
313 CPPUNIT_ASSERT_EQUAL("sometext", m_rich->GetValue());
314
315 m_rich->AppendText("Batch undo");
316 m_rich->SelectAll();
317
318 //Also test batch operations
319 m_rich->BeginBatchUndo("batchtest");
320
321 m_rich->ApplyBoldToSelection();
322 m_rich->ApplyItalicToSelection();
323
324 m_rich->EndBatchUndo();
325
326 CPPUNIT_ASSERT(m_rich->CanUndo());
327
328 m_rich->Undo();
329
330 CPPUNIT_ASSERT(!m_rich->IsSelectionBold());
331 CPPUNIT_ASSERT(!m_rich->IsSelectionItalics());
332 CPPUNIT_ASSERT(m_rich->CanRedo());
333
334 m_rich->Redo();
335
336 CPPUNIT_ASSERT(m_rich->IsSelectionBold());
337 CPPUNIT_ASSERT(m_rich->IsSelectionItalics());
338
339 //And surpressing undo
340 m_rich->BeginSuppressUndo();
341
342 m_rich->AppendText("Can't undo this");
343
344 CPPUNIT_ASSERT(m_rich->CanUndo());
345
346 m_rich->EndSuppressUndo();
347}
348
349void RichTextCtrlTestCase::CaretPosition()
350{
351 m_rich->AddParagraph("This is paragraph one");
352 m_rich->AddParagraph("Paragraph two\n has \nlots of\n lines");
353
04b2b47a 354 m_rich->SetInsertionPoint(2);
232fdc63
VZ
355
356 CPPUNIT_ASSERT_EQUAL(1, m_rich->GetCaretPosition());
357
358 m_rich->MoveToParagraphStart();
359
360 CPPUNIT_ASSERT_EQUAL(0, m_rich->GetCaretPosition());
361
362 m_rich->MoveRight();
363 m_rich->MoveRight(2);
364 m_rich->MoveLeft(1);
365 m_rich->MoveLeft(0);
366
367 CPPUNIT_ASSERT_EQUAL(2, m_rich->GetCaretPosition());
368
369 m_rich->MoveToParagraphEnd();
370
371 CPPUNIT_ASSERT_EQUAL(21, m_rich->GetCaretPosition());
372
373 m_rich->MoveToLineStart();
374
375 CPPUNIT_ASSERT_EQUAL(0, m_rich->GetCaretPosition());
376
377 m_rich->MoveToLineEnd();
378
379 CPPUNIT_ASSERT_EQUAL(21, m_rich->GetCaretPosition());
380}
381
382void RichTextCtrlTestCase::Selection()
383{
384 m_rich->SetValue("some more text");
385
386 m_rich->SelectAll();
387
388 CPPUNIT_ASSERT_EQUAL("some more text", m_rich->GetStringSelection());
389
390 m_rich->SelectNone();
391
392 CPPUNIT_ASSERT_EQUAL("", m_rich->GetStringSelection());
393
394 m_rich->SelectWord(1);
395
396 CPPUNIT_ASSERT_EQUAL("some", m_rich->GetStringSelection());
397
398 m_rich->SetSelection(5, 14);
399
400 CPPUNIT_ASSERT_EQUAL("more text", m_rich->GetStringSelection());
401
402 wxRichTextRange range(5, 9);
403
404 m_rich->SetSelectionRange(range);
405
406 CPPUNIT_ASSERT_EQUAL("more", m_rich->GetStringSelection());
407}
408
409void RichTextCtrlTestCase::Editable()
410{
411#if wxUSE_UIACTIONSIMULATOR
9be7f47c 412#if !defined(__WXGTK__)
ce7fe42e 413 EventCounter updated(m_rich, wxEVT_TEXT);
232fdc63
VZ
414
415 m_rich->SetFocus();
416
417 wxUIActionSimulator sim;
418 sim.Text("abcdef");
419 wxYield();
420
421 CPPUNIT_ASSERT_EQUAL("abcdef", m_rich->GetValue());
744d91d4
SL
422 CPPUNIT_ASSERT_EQUAL(6, updated.GetCount());
423 updated.Clear();
232fdc63
VZ
424
425 m_rich->SetEditable(false);
426 sim.Text("gh");
427 wxYield();
428
429 CPPUNIT_ASSERT_EQUAL("abcdef", m_rich->GetValue());
744d91d4 430 CPPUNIT_ASSERT_EQUAL(0, updated.GetCount());
232fdc63 431#endif
9be7f47c 432#endif
232fdc63
VZ
433}
434
435void RichTextCtrlTestCase::Range()
436{
437 wxRichTextRange range(0, 10);
438
439 CPPUNIT_ASSERT_EQUAL(0, range.GetStart());
440 CPPUNIT_ASSERT_EQUAL(10, range.GetEnd());
441 CPPUNIT_ASSERT_EQUAL(11, range.GetLength());
442 CPPUNIT_ASSERT(range.Contains(5));
443
444 wxRichTextRange outside(12, 14);
445
446 CPPUNIT_ASSERT(outside.IsOutside(range));
447
448 wxRichTextRange inside(6, 7);
449
450 CPPUNIT_ASSERT(inside.IsWithin(range));
451
452 range.LimitTo(inside);
453
454 CPPUNIT_ASSERT(inside == range);
455 CPPUNIT_ASSERT(inside + range == outside);
456 CPPUNIT_ASSERT(outside - range == inside);
457
458 range.SetStart(4);
459 range.SetEnd(6);
460
461 CPPUNIT_ASSERT_EQUAL(4, range.GetStart());
462 CPPUNIT_ASSERT_EQUAL(6, range.GetEnd());
463 CPPUNIT_ASSERT_EQUAL(3, range.GetLength());
464
465 inside.SetRange(6, 4);
466 inside.Swap();
467
468 CPPUNIT_ASSERT(inside == range);
469}
470
471void RichTextCtrlTestCase::Alignment()
472{
473 m_rich->SetValue("text to align");
474 m_rich->SelectAll();
475
476 m_rich->ApplyAlignmentToSelection(wxTEXT_ALIGNMENT_RIGHT);
477
478 CPPUNIT_ASSERT(m_rich->IsSelectionAligned(wxTEXT_ALIGNMENT_RIGHT));
479
480 m_rich->BeginAlignment(wxTEXT_ALIGNMENT_CENTRE);
481 m_rich->AddParagraph("middle aligned");
482 m_rich->EndAlignment();
483
484 m_rich->SetSelection(20, 25);
485
486 CPPUNIT_ASSERT(m_rich->IsSelectionAligned(wxTEXT_ALIGNMENT_CENTRE));
487}
488
489void RichTextCtrlTestCase::Bold()
490{
491 m_rich->SetValue("text to bold");
492 m_rich->SelectAll();
493 m_rich->ApplyBoldToSelection();
494
495 CPPUNIT_ASSERT(m_rich->IsSelectionBold());
496
497 m_rich->BeginBold();
498 m_rich->AddParagraph("bold paragraph");
499 m_rich->EndBold();
500 m_rich->AddParagraph("not bold paragraph");
501
502 m_rich->SetSelection(15, 20);
503
504 CPPUNIT_ASSERT(m_rich->IsSelectionBold());
505
506 m_rich->SetSelection(30, 35);
507
508 CPPUNIT_ASSERT(!m_rich->IsSelectionBold());
509}
510
511void RichTextCtrlTestCase::Italic()
512{
513 m_rich->SetValue("text to italic");
514 m_rich->SelectAll();
515 m_rich->ApplyItalicToSelection();
516
517 CPPUNIT_ASSERT(m_rich->IsSelectionItalics());
518
519 m_rich->BeginItalic();
520 m_rich->AddParagraph("italic paragraph");
521 m_rich->EndItalic();
522 m_rich->AddParagraph("not italic paragraph");
523
524 m_rich->SetSelection(20, 25);
525
526 CPPUNIT_ASSERT(m_rich->IsSelectionItalics());
527
528 m_rich->SetSelection(35, 40);
529
530 CPPUNIT_ASSERT(!m_rich->IsSelectionItalics());
531}
532
533void RichTextCtrlTestCase::Underline()
534{
535 m_rich->SetValue("text to underline");
536 m_rich->SelectAll();
537 m_rich->ApplyUnderlineToSelection();
538
539 CPPUNIT_ASSERT(m_rich->IsSelectionUnderlined());
540
541 m_rich->BeginUnderline();
542 m_rich->AddParagraph("underline paragraph");
543 m_rich->EndUnderline();
544 m_rich->AddParagraph("not underline paragraph");
545
546 m_rich->SetSelection(20, 25);
547
548 CPPUNIT_ASSERT(m_rich->IsSelectionUnderlined());
549
550 m_rich->SetSelection(40, 45);
551
552 CPPUNIT_ASSERT(!m_rich->IsSelectionUnderlined());
553}
554
555void RichTextCtrlTestCase::Indent()
556{
557 m_rich->BeginLeftIndent(12, -5);
558 m_rich->BeginRightIndent(14);
559 m_rich->AddParagraph("A paragraph with indents");
560 m_rich->EndLeftIndent();
561 m_rich->EndRightIndent();
562 m_rich->AddParagraph("No more indent");
563
564 wxTextAttr indent;
565 m_rich->GetStyle(5, indent);
566
567 CPPUNIT_ASSERT_EQUAL(12, indent.GetLeftIndent());
568 CPPUNIT_ASSERT_EQUAL(-5, indent.GetLeftSubIndent());
569 CPPUNIT_ASSERT_EQUAL(14, indent.GetRightIndent());
570
571 m_rich->GetStyle(35, indent);
572
573 CPPUNIT_ASSERT_EQUAL(0, indent.GetLeftIndent());
574 CPPUNIT_ASSERT_EQUAL(0, indent.GetLeftSubIndent());
575 CPPUNIT_ASSERT_EQUAL(0, indent.GetRightIndent());
576}
577
578void RichTextCtrlTestCase::LineSpacing()
579{
580 m_rich->BeginLineSpacing(20);
581 m_rich->AddParagraph("double spaced");
582 m_rich->EndLineSpacing();
583 m_rich->BeginLineSpacing(wxTEXT_ATTR_LINE_SPACING_HALF);
584 m_rich->AddParagraph("1.5 spaced");
585 m_rich->EndLineSpacing();
586 m_rich->AddParagraph("normally spaced");
587
588 wxTextAttr spacing;
589 m_rich->GetStyle(5, spacing);
590
591 CPPUNIT_ASSERT_EQUAL(20, spacing.GetLineSpacing());
592
593 m_rich->GetStyle(20, spacing);
594
595 CPPUNIT_ASSERT_EQUAL(15, spacing.GetLineSpacing());
596
597 m_rich->GetStyle(30, spacing);
598
599 CPPUNIT_ASSERT_EQUAL(10, spacing.GetLineSpacing());
600}
601
602void RichTextCtrlTestCase::ParagraphSpacing()
603{
604 m_rich->BeginParagraphSpacing(15, 20);
605 m_rich->AddParagraph("spaced paragraph");
606 m_rich->EndParagraphSpacing();
607 m_rich->AddParagraph("non-spaced paragraph");
608
609 wxTextAttr spacing;
610 m_rich->GetStyle(5, spacing);
611
612 CPPUNIT_ASSERT_EQUAL(15, spacing.GetParagraphSpacingBefore());
613 CPPUNIT_ASSERT_EQUAL(20, spacing.GetParagraphSpacingAfter());
614
615 m_rich->GetStyle(25, spacing);
616
617 //Make sure we test against the defaults
618 CPPUNIT_ASSERT_EQUAL(m_rich->GetBasicStyle().GetParagraphSpacingBefore(),
619 spacing.GetParagraphSpacingBefore());
620 CPPUNIT_ASSERT_EQUAL(m_rich->GetBasicStyle().GetParagraphSpacingAfter(),
621 spacing.GetParagraphSpacingAfter());
622}
623
624void RichTextCtrlTestCase::TextColour()
625{
626 m_rich->BeginTextColour(*wxRED);
627 m_rich->AddParagraph("red paragraph");
628 m_rich->EndTextColour();
629 m_rich->AddParagraph("default paragraph");
630
631 wxTextAttr colour;
632 m_rich->GetStyle(5, colour);
633
634 CPPUNIT_ASSERT_EQUAL(*wxRED, colour.GetTextColour());
635
636 m_rich->GetStyle(25, colour);
637
638 CPPUNIT_ASSERT_EQUAL(m_rich->GetBasicStyle().GetTextColour(),
639 colour.GetTextColour());
640}
641
642void RichTextCtrlTestCase::NumberedBullet()
643{
644 m_rich->BeginNumberedBullet(1, 15, 20);
645 m_rich->AddParagraph("bullet one");
646 m_rich->EndNumberedBullet();
647 m_rich->BeginNumberedBullet(2, 25, -5);
648 m_rich->AddParagraph("bullet two");
649 m_rich->EndNumberedBullet();
650
651 wxTextAttr bullet;
652 m_rich->GetStyle(5, bullet);
653
654 CPPUNIT_ASSERT(bullet.HasBulletStyle());
655 CPPUNIT_ASSERT(bullet.HasBulletNumber());
656 CPPUNIT_ASSERT_EQUAL(1, bullet.GetBulletNumber());
657 CPPUNIT_ASSERT_EQUAL(15, bullet.GetLeftIndent());
658 CPPUNIT_ASSERT_EQUAL(20, bullet.GetLeftSubIndent());
659
660 m_rich->GetStyle(15, bullet);
661
662 CPPUNIT_ASSERT(bullet.HasBulletStyle());
663 CPPUNIT_ASSERT(bullet.HasBulletNumber());
664 CPPUNIT_ASSERT_EQUAL(2, bullet.GetBulletNumber());
665 CPPUNIT_ASSERT_EQUAL(25, bullet.GetLeftIndent());
666 CPPUNIT_ASSERT_EQUAL(-5, bullet.GetLeftSubIndent());
667}
668
669void RichTextCtrlTestCase::SymbolBullet()
670{
671 m_rich->BeginSymbolBullet("*", 15, 20);
672 m_rich->AddParagraph("bullet one");
673 m_rich->EndSymbolBullet();
674 m_rich->BeginSymbolBullet("%", 25, -5);
675 m_rich->AddParagraph("bullet two");
676 m_rich->EndSymbolBullet();
677
678 wxTextAttr bullet;
679 m_rich->GetStyle(5, bullet);
680
681 CPPUNIT_ASSERT(bullet.HasBulletStyle());
682 CPPUNIT_ASSERT(bullet.HasBulletText());
683 CPPUNIT_ASSERT_EQUAL("*", bullet.GetBulletText());
684 CPPUNIT_ASSERT_EQUAL(15, bullet.GetLeftIndent());
685 CPPUNIT_ASSERT_EQUAL(20, bullet.GetLeftSubIndent());
686
687 m_rich->GetStyle(15, bullet);
688
689 CPPUNIT_ASSERT(bullet.HasBulletStyle());
690 CPPUNIT_ASSERT(bullet.HasBulletText());
691 CPPUNIT_ASSERT_EQUAL("%", bullet.GetBulletText());
692 CPPUNIT_ASSERT_EQUAL(25, bullet.GetLeftIndent());
693 CPPUNIT_ASSERT_EQUAL(-5, bullet.GetLeftSubIndent());
694}
695
696void RichTextCtrlTestCase::FontSize()
697{
698 m_rich->BeginFontSize(24);
699 m_rich->AddParagraph("Large text");
700 m_rich->EndFontSize();
701
702 wxTextAttr size;
703 m_rich->GetStyle(5, size);
704
705 CPPUNIT_ASSERT(size.HasFontSize());
706 CPPUNIT_ASSERT_EQUAL(24, size.GetFontSize());
707}
708
709void RichTextCtrlTestCase::Font()
710{
711 wxFont font(14, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
712 m_rich->BeginFont(font);
713 m_rich->AddParagraph("paragraph with font");
714 m_rich->EndFont();
715
716 wxTextAttr fontstyle;
717 m_rich->GetStyle(5, fontstyle);
718
719 CPPUNIT_ASSERT_EQUAL(font, fontstyle.GetFont());
720}
721
722void RichTextCtrlTestCase::Delete()
723{
724 m_rich->AddParagraph("here is a long long line in a paragraph");
725 m_rich->SetSelection(0, 6);
726
727 CPPUNIT_ASSERT(m_rich->CanDeleteSelection());
728
729 m_rich->DeleteSelection();
730
731 CPPUNIT_ASSERT_EQUAL("is a long long line in a paragraph", m_rich->GetValue());
732
733 m_rich->SetSelection(0, 5);
734
735 CPPUNIT_ASSERT(m_rich->CanDeleteSelection());
736
737 m_rich->DeleteSelectedContent();
738
739 CPPUNIT_ASSERT_EQUAL("long long line in a paragraph", m_rich->GetValue());
740
741 m_rich->Delete(wxRichTextRange(14, 29));
742
743 CPPUNIT_ASSERT_EQUAL("long long line", m_rich->GetValue());
744}
745
746void RichTextCtrlTestCase::Url()
747{
748 m_rich->BeginURL("http://www.wxwidgets.org");
749 m_rich->WriteText("http://www.wxwidgets.org");
750 m_rich->EndURL();
751
752 wxTextAttr url;
753 m_rich->GetStyle(5, url);
754
755 CPPUNIT_ASSERT(url.HasURL());
756 CPPUNIT_ASSERT_EQUAL("http://www.wxwidgets.org", url.GetURL());
757}
758
31be8400
JS
759 // Helper function for ::Table()
760wxRichTextTable* GetCurrentTableInstance(wxRichTextParagraph* para)
761{
762 wxRichTextTable* table = wxDynamicCast(para->FindObjectAtPosition(0), wxRichTextTable);
763 CPPUNIT_ASSERT(table);
764 return table;
765}
766
767void RichTextCtrlTestCase::Table()
768{
769 m_rich->BeginSuppressUndo();
770 wxRichTextTable* table = m_rich->WriteTable(1, 1);
771 m_rich->EndSuppressUndo();
772 CPPUNIT_ASSERT(table);
773 CPPUNIT_ASSERT(m_rich->CanUndo() == false);
774
775 // Run the tests twice: first for the original table, then for a contained one
776 for (int t = 0; t < 2; ++t)
65663456
VZ
777 {
778 size_t n; // FIXME-VC6: outside of the loops for VC6 only.
779
31be8400
JS
780 // Undo() and Redo() switch table instances, so invalidating 'table'
781 // The containing paragraph isn't altered, and so can be used to find the current object
782 wxRichTextParagraph* para = wxDynamicCast(table->GetParent(), wxRichTextParagraph);
783 CPPUNIT_ASSERT(para);
784
785 CPPUNIT_ASSERT(table->GetColumnCount() == 1);
786 CPPUNIT_ASSERT(table->GetRowCount() == 1);
787
788 // Test adding columns and rows
65663456 789 for (n = 0; n < 3; ++n)
31be8400
JS
790 {
791 m_rich->BeginBatchUndo("Add col and row");
792
793 table->AddColumns(0, 1);
794 table->AddRows(0, 1);
65663456 795
31be8400
JS
796 m_rich->EndBatchUndo();
797 }
798 CPPUNIT_ASSERT(table->GetColumnCount() == 4);
799 CPPUNIT_ASSERT(table->GetRowCount() == 4);
800
801 // Test deleting columns and rows
65663456 802 for (n = 0; n < 3; ++n)
31be8400
JS
803 {
804 m_rich->BeginBatchUndo("Delete col and row");
805
806 table->DeleteColumns(table->GetColumnCount() - 1, 1);
807 table->DeleteRows(table->GetRowCount() - 1, 1);
65663456 808
31be8400
JS
809 m_rich->EndBatchUndo();
810 }
811 CPPUNIT_ASSERT(table->GetColumnCount() == 1);
812 CPPUNIT_ASSERT(table->GetRowCount() == 1);
813
814 // Test undo, first of the deletions...
815 CPPUNIT_ASSERT(m_rich->CanUndo());
65663456 816 for (n = 0; n < 3; ++n)
31be8400
JS
817 {
818 m_rich->Undo();
819 }
820 table = GetCurrentTableInstance(para);
821 CPPUNIT_ASSERT(table->GetColumnCount() == 4);
822 CPPUNIT_ASSERT(table->GetRowCount() == 4);
823
824 // ...then the additions
65663456 825 for (n = 0; n < 3; ++n)
31be8400
JS
826 {
827 m_rich->Undo();
828 }
829 table = GetCurrentTableInstance(para);
830 CPPUNIT_ASSERT(table->GetColumnCount() == 1);
831 CPPUNIT_ASSERT(table->GetRowCount() == 1);
832 CPPUNIT_ASSERT(m_rich->CanUndo() == false);
833
834 // Similarly test redo. Additions:
835 CPPUNIT_ASSERT(m_rich->CanRedo());
65663456 836 for (n = 0; n < 3; ++n)
31be8400
JS
837 {
838 m_rich->Redo();
839 }
840 table = GetCurrentTableInstance(para);
841 CPPUNIT_ASSERT(table->GetColumnCount() == 4);
842 CPPUNIT_ASSERT(table->GetRowCount() == 4);
843
844 // Deletions:
65663456 845 for (n = 0; n < 3; ++n)
31be8400
JS
846 {
847 m_rich->Redo();
848 }
849 table = GetCurrentTableInstance(para);
850 CPPUNIT_ASSERT(table->GetColumnCount() == 1);
851 CPPUNIT_ASSERT(table->GetRowCount() == 1);
852 CPPUNIT_ASSERT(m_rich->CanRedo() == false);
853
854 // Now test multiple addition and deletion, and also suppression
855 m_rich->BeginSuppressUndo();
856 table->AddColumns(0, 3);
857 table->AddRows(0, 3);
858 CPPUNIT_ASSERT(table->GetColumnCount() == 4);
859 CPPUNIT_ASSERT(table->GetRowCount() == 4);
860
861 // Only delete 2 of these. This makes it easy to be sure we're dealing with the child table when we loop
862 table->DeleteColumns(0, 2);
863 table->DeleteRows(0, 2);
864 CPPUNIT_ASSERT(table->GetColumnCount() == 2);
865 CPPUNIT_ASSERT(table->GetRowCount() == 2);
866 m_rich->EndSuppressUndo();
65663456 867
31be8400
JS
868 m_rich->GetCommandProcessor()->ClearCommands(); // otherwise the command-history from this loop will cause CPPUNIT_ASSERT failures in the next one
869
870 if (t == 0)
871 {
872 // For round 2, re-run the tests on another table inside the last cell of the first one
873 wxRichTextCell* cell = table->GetCell(table->GetRowCount() - 1, table->GetColumnCount() - 1);
874 CPPUNIT_ASSERT(cell);
875 m_rich->SetFocusObject(cell);
876 m_rich->BeginSuppressUndo();
877 table = m_rich->WriteTable(1, 1);
878 m_rich->EndSuppressUndo();
879 CPPUNIT_ASSERT(table);
880 }
881 }
882
0a6ec346
VZ
883 // Test ClearTable()
884 table->ClearTable();
885 CPPUNIT_ASSERT_EQUAL(0, table->GetCells().GetCount());
886 CPPUNIT_ASSERT_EQUAL(0, table->GetColumnCount());
887 CPPUNIT_ASSERT_EQUAL(0, table->GetRowCount());
888
31be8400
JS
889 m_rich->Clear();
890 m_rich->SetFocusObject(NULL);
891}
892
232fdc63 893#endif //wxUSE_RICHTEXT