Test PositionToXY and XYToPostion also for multiline Rich Edit controls

This commit is contained in:
Artur Wieczorek
2017-09-01 08:54:50 +02:00
parent 691f530359
commit 4fc8753285

View File

@@ -94,6 +94,12 @@ private:
CPPUNIT_TEST( PositionToCoordsRich2 ); CPPUNIT_TEST( PositionToCoordsRich2 );
CPPUNIT_TEST( PositionToXYMultiLine ); CPPUNIT_TEST( PositionToXYMultiLine );
CPPUNIT_TEST( XYToPositionMultiLine ); CPPUNIT_TEST( XYToPositionMultiLine );
#if wxUSE_RICHEDIT
CPPUNIT_TEST( PositionToXYMultiLineRich );
CPPUNIT_TEST( XYToPositionMultiLineRich );
CPPUNIT_TEST( PositionToXYMultiLineRich2 );
CPPUNIT_TEST( XYToPositionMultiLineRich2 );
#endif // wxUSE_RICHEDIT
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
void PseudoTestSwitchToMultiLineStyle() void PseudoTestSwitchToMultiLineStyle()
@@ -118,10 +124,18 @@ private:
void PositionToCoordsRich2(); void PositionToCoordsRich2();
void PositionToXYMultiLine(); void PositionToXYMultiLine();
void XYToPositionMultiLine(); void XYToPositionMultiLine();
#if wxUSE_RICHEDIT
void PositionToXYMultiLineRich();
void XYToPositionMultiLineRich();
void PositionToXYMultiLineRich2();
void XYToPositionMultiLineRich2();
#endif // wxUSE_RICHEDIT
void PositionToXYSingleLine(); void PositionToXYSingleLine();
void XYToPositionSingleLine(); void XYToPositionSingleLine();
void DoPositionToCoordsTestWithStyle(long style); void DoPositionToCoordsTestWithStyle(long style);
void DoPositionToXYMultiLine(long style);
void DoXYToPositionMultiLine(long style);
// Create the control with the following styles added to ms_style which may // Create the control with the following styles added to ms_style which may
// (or not) already contain wxTE_MULTILINE. // (or not) already contain wxTE_MULTILINE.
@@ -662,19 +676,40 @@ void TextCtrlTestCase::DoPositionToCoordsTestWithStyle(long style)
void TextCtrlTestCase::PositionToXYMultiLine() void TextCtrlTestCase::PositionToXYMultiLine()
{ {
delete m_text; DoPositionToXYMultiLine(0);
CreateText(wxTE_MULTILINE|wxTE_DONTWRAP); }
#if wxUSE_RICHEDIT
void TextCtrlTestCase::PositionToXYMultiLineRich()
{
DoPositionToXYMultiLine(wxTE_RICH);
}
void TextCtrlTestCase::PositionToXYMultiLineRich2()
{
DoPositionToXYMultiLine(wxTE_RICH2);
}
#endif // wxUSE_RICHEDIT
void TextCtrlTestCase::DoPositionToXYMultiLine(long style)
{
delete m_text;
CreateText(style|wxTE_MULTILINE|wxTE_DONTWRAP);
const bool isRichEdit = (style & (wxTE_RICH | wxTE_RICH2)) != 0;
typedef struct { long x, y; } XYPos;
bool ok; bool ok;
wxString text; wxString text;
// empty field
// empty field
m_text->Clear(); m_text->Clear();
const long numChars_0 = 0; const long numChars_0 = 0;
CPPUNIT_ASSERT_EQUAL( numChars_0, m_text->GetLastPosition() ); wxASSERT(numChars_0 == text.Length());
struct { long x, y; } coords_0[numChars_0+1] = XYPos coords_0[numChars_0+1] =
{ { 0, 0 } }; { { 0, 0 } };
CPPUNIT_ASSERT_EQUAL( numChars_0, m_text->GetLastPosition() );
for ( long i = 0; i < (long)WXSIZEOF(coords_0); i++ ) for ( long i = 0; i < (long)WXSIZEOF(coords_0); i++ )
{ {
long x, y; long x, y;
@@ -691,10 +726,10 @@ void TextCtrlTestCase::PositionToXYMultiLine()
m_text->SetValue(text); m_text->SetValue(text);
const long numChars_1 = 4; const long numChars_1 = 4;
wxASSERT( numChars_1 == text.Length() ); wxASSERT( numChars_1 == text.Length() );
CPPUNIT_ASSERT_EQUAL( numChars_1, m_text->GetLastPosition() ); XYPos coords_1[numChars_1+1] =
struct { long x, y; } coords_1[numChars_1+1] =
{ { 0, 0 }, { 1, 0 }, { 2, 0}, { 3, 0 }, { 4, 0 } }; { { 0, 0 }, { 1, 0 }, { 2, 0}, { 3, 0 }, { 4, 0 } };
CPPUNIT_ASSERT_EQUAL( numChars_1, m_text->GetLastPosition() );
for ( long i = 0; i < (long)WXSIZEOF(coords_1); i++ ) for ( long i = 0; i < (long)WXSIZEOF(coords_1); i++ )
{ {
long x, y; long x, y;
@@ -709,121 +744,179 @@ void TextCtrlTestCase::PositionToXYMultiLine()
// few lines // few lines
text = wxS("123\nab\nX"); text = wxS("123\nab\nX");
m_text->SetValue(text); m_text->SetValue(text);
#if defined(__WXMSW__) #if defined(__WXMSW__)
// Take into account that every new line mark occupies // Take into account that every new line mark occupies
// two characters, not one. // two characters, not one.
const long numChars_2 = 8 + 2; const long numChars_msw_2 = 8 + 2;
#else
const long numChars_2 = 8;
#endif // WXMSW/!WXMSW
CPPUNIT_ASSERT_EQUAL( numChars_2, m_text->GetLastPosition() );
#if defined(__WXMSW__)
// Note: Two new line characters refer to the same X-Y position. // Note: Two new line characters refer to the same X-Y position.
struct { long x, y; } coords_2[numChars_2 + 1] = XYPos coords_2_msw[numChars_msw_2 + 1] =
{ { 0, 0 },{ 1, 0 },{ 2, 0 },{ 3, 0 },{ 3, 0 }, { { 0, 0 },{ 1, 0 },{ 2, 0 },{ 3, 0 },{ 3, 0 },
{ 0, 1 },{ 1, 1 },{ 2, 1 },{ 2, 1 }, { 0, 1 },{ 1, 1 },{ 2, 1 },{ 2, 1 },
{ 0, 2 },{ 1, 2 } }; { 0, 2 },{ 1, 2 } };
#else #endif // WXMSW
struct { long x, y; } coords_2[numChars_2 + 1] =
const long numChars_2 = 8;
wxASSERT(numChars_2 == text.Length());
XYPos coords_2[numChars_2 + 1] =
{ { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 },
{ 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 1 }, { 1, 1 }, { 2, 1 },
{ 0, 2 }, { 1, 2 } }; { 0, 2 }, { 1, 2 } };
#endif // WXMSW/!WXMSW
for ( long i = 0; i < (long)WXSIZEOF(coords_2); i++ ) const long &ref_numChars_2 =
#if defined(__WXMSW__)
isRichEdit ? numChars_2 : numChars_msw_2;
#else
numChars_2;
#endif
XYPos *ref_coords_2 =
#if defined(__WXMSW__)
isRichEdit ? coords_2 : coords_2_msw;
#else
coords_2;
#endif
CPPUNIT_ASSERT_EQUAL( ref_numChars_2, m_text->GetLastPosition() );
for ( long i = 0; i < ref_numChars_2+1; i++ )
{ {
long x, y; long x, y;
ok = m_text->PositionToXY(i, &x, &y); ok = m_text->PositionToXY(i, &x, &y);
CPPUNIT_ASSERT_EQUAL( true, ok ); CPPUNIT_ASSERT_EQUAL( true, ok );
CPPUNIT_ASSERT_EQUAL( coords_2[i].x, x ); CPPUNIT_ASSERT_EQUAL( ref_coords_2[i].x, x );
CPPUNIT_ASSERT_EQUAL( coords_2[i].y, y ); CPPUNIT_ASSERT_EQUAL( ref_coords_2[i].y, y );
} }
ok = m_text->PositionToXY(WXSIZEOF(coords_2), NULL, NULL); ok = m_text->PositionToXY(ref_numChars_2 + 1, NULL, NULL);
CPPUNIT_ASSERT_EQUAL( false, ok ); CPPUNIT_ASSERT_EQUAL( false, ok );
// only empty lines // only empty lines
text = wxS("\n\n\n"); text = wxS("\n\n\n");
m_text->SetValue(text); m_text->SetValue(text);
#if defined(__WXMSW__) #if defined(__WXMSW__)
// Take into account that every new line mark occupies // Take into account that every new line mark occupies
// two characters, not one. // two characters, not one.
const long numChars_3 = 3 + 3; const long numChars_msw_3 = 3 + 3;
#else
const long numChars_3 = 3;
#endif // WXMSW/!WXMSW
CPPUNIT_ASSERT_EQUAL( numChars_3, m_text->GetLastPosition() );
#if defined(__WXMSW__)
// Note: Two new line characters refer to the same X-Y position. // Note: Two new line characters refer to the same X-Y position.
struct { long x, y; } coords_3[numChars_3 + 1] = XYPos coords_3_msw[numChars_msw_3 + 1] =
{ { 0, 0 },{ 0, 0 }, { { 0, 0 },{ 0, 0 },
{ 0, 1 },{ 0, 1 }, { 0, 1 },{ 0, 1 },
{ 0, 2 },{ 0, 2 }, { 0, 2 },{ 0, 2 },
{ 0, 3 } }; { 0, 3 } };
#else #endif // WXMSW
struct { long x, y; } coords_3[numChars_3+1] =
const long numChars_3 = 3;
wxASSERT(numChars_3 == text.Length());
XYPos coords_3[numChars_3+1] =
{ { 0, 0 }, { { 0, 0 },
{ 0, 1 }, { 0, 1 },
{ 0, 2 }, { 0, 2 },
{ 0, 3 } }; { 0, 3 } };
#endif // WXMSW/!WXMSW
for ( long i = 0; i < (long)WXSIZEOF(coords_3); i++ ) const long &ref_numChars_3 =
#if defined(__WXMSW__)
isRichEdit ? numChars_3 : numChars_msw_3;
#else
numChars_3;
#endif
XYPos *ref_coords_3 =
#if defined(__WXMSW__)
isRichEdit ? coords_3 : coords_3_msw;
#else
coords_3;
#endif
CPPUNIT_ASSERT_EQUAL( ref_numChars_3, m_text->GetLastPosition() );
for ( long i = 0; i < ref_numChars_3+1; i++ )
{ {
long x, y; long x, y;
ok = m_text->PositionToXY(i, &x, &y); ok = m_text->PositionToXY(i, &x, &y);
CPPUNIT_ASSERT_EQUAL( true, ok ); CPPUNIT_ASSERT_EQUAL( true, ok );
CPPUNIT_ASSERT_EQUAL( coords_3[i].x, x ); CPPUNIT_ASSERT_EQUAL( ref_coords_3[i].x, x );
CPPUNIT_ASSERT_EQUAL( coords_3[i].y, y ); CPPUNIT_ASSERT_EQUAL( ref_coords_3[i].y, y );
} }
ok = m_text->PositionToXY(WXSIZEOF(coords_3), NULL, NULL); ok = m_text->PositionToXY(ref_numChars_3 + 1, NULL, NULL);
CPPUNIT_ASSERT_EQUAL( false, ok ); CPPUNIT_ASSERT_EQUAL( false, ok );
// mixed empty/non-empty lines // mixed empty/non-empty lines
text = wxS("123\na\n\nX\n\n"); text = wxS("123\na\n\nX\n\n");
m_text->SetValue(text); m_text->SetValue(text);
#if defined(__WXMSW__) #if defined(__WXMSW__)
// Take into account that every new line mark occupies // Take into account that every new line mark occupies
// two characters, not one. // two characters, not one.
const long numChars_4 = 10 + 5; const long numChars_msw_4 = 10 + 5;
#else
const long numChars_4 = 10;
#endif // WXMSW/!WXMSW
CPPUNIT_ASSERT_EQUAL( numChars_4, m_text->GetLastPosition() );
#if defined(__WXMSW__)
// Note: Two new line characters refer to the same X-Y position. // Note: Two new line characters refer to the same X-Y position.
struct { long x, y; } coords_4[numChars_4 + 1] = XYPos coords_4_msw[numChars_msw_4 + 1] =
{ { 0, 0 },{ 1, 0 },{ 2, 0 },{ 3, 0 },{ 3, 0 }, { { 0, 0 },{ 1, 0 },{ 2, 0 },{ 3, 0 },{ 3, 0 },
{ 0, 1 },{ 1, 1 },{ 1, 1 }, { 0, 1 },{ 1, 1 },{ 1, 1 },
{ 0, 2 },{ 0, 2 }, { 0, 2 },{ 0, 2 },
{ 0, 3 },{ 1, 3 },{ 1, 3 }, { 0, 3 },{ 1, 3 },{ 1, 3 },
{ 0, 4 },{ 0, 4 }, { 0, 4 },{ 0, 4 },
{ 0, 5 } }; { 0, 5 } };
#else #endif // WXMSW
struct { long x, y; } coords_4[numChars_4+1] =
const long numChars_4 = 10;
wxASSERT(numChars_4 == text.Length());
XYPos coords_4[numChars_4+1] =
{ { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 },
{ 0, 1 }, { 1, 1 }, { 0, 1 }, { 1, 1 },
{ 0, 2 }, { 0, 2 },
{ 0, 3 }, { 1, 3 }, { 0, 3 }, { 1, 3 },
{ 0, 4 }, { 0, 4 },
{ 0, 5 } }; { 0, 5 } };
#endif // WXMSW/!WXMSW
for ( long i = 0; i < (long)WXSIZEOF(coords_4); i++ ) const long &ref_numChars_4 =
#if defined(__WXMSW__)
isRichEdit ? numChars_4 : numChars_msw_4;
#else
numChars_4;
#endif
XYPos *ref_coords_4 =
#if defined(__WXMSW__)
isRichEdit ? coords_4 : coords_4_msw;
#else
coords_4;
#endif
CPPUNIT_ASSERT_EQUAL( ref_numChars_4, m_text->GetLastPosition() );
for ( long i = 0; i < ref_numChars_4+1; i++ )
{ {
long x, y; long x, y;
ok = m_text->PositionToXY(i, &x, &y); ok = m_text->PositionToXY(i, &x, &y);
CPPUNIT_ASSERT_EQUAL( true, ok ); CPPUNIT_ASSERT_EQUAL( true, ok );
CPPUNIT_ASSERT_EQUAL( coords_4[i].x, x ); CPPUNIT_ASSERT_EQUAL( ref_coords_4[i].x, x );
CPPUNIT_ASSERT_EQUAL( coords_4[i].y, y ); CPPUNIT_ASSERT_EQUAL( ref_coords_4[i].y, y );
} }
ok = m_text->PositionToXY(WXSIZEOF(coords_4), NULL, NULL); ok = m_text->PositionToXY(ref_numChars_4 + 1, NULL, NULL);
CPPUNIT_ASSERT_EQUAL( false, ok ); CPPUNIT_ASSERT_EQUAL( false, ok );
} }
void TextCtrlTestCase::XYToPositionMultiLine() void TextCtrlTestCase::XYToPositionMultiLine()
{
DoXYToPositionMultiLine(0);
}
#if wxUSE_RICHEDIT
void TextCtrlTestCase::XYToPositionMultiLineRich()
{
DoXYToPositionMultiLine(wxTE_RICH);
}
void TextCtrlTestCase::XYToPositionMultiLineRich2()
{
DoXYToPositionMultiLine(wxTE_RICH2);
}
#endif // wxUSE_RICHEDIT
void TextCtrlTestCase::DoXYToPositionMultiLine(long style)
{ {
delete m_text; delete m_text;
CreateText(wxTE_MULTILINE|wxTE_DONTWRAP); CreateText(style|wxTE_MULTILINE|wxTE_DONTWRAP);
const bool isRichEdit = (style & (wxTE_RICH | wxTE_RICH2)) != 0;
wxString text; wxString text;
// empty field // empty field
@@ -865,24 +958,30 @@ void TextCtrlTestCase::XYToPositionMultiLine()
CPPUNIT_ASSERT_EQUAL( numLines_2, m_text->GetNumberOfLines() ); CPPUNIT_ASSERT_EQUAL( numLines_2, m_text->GetNumberOfLines() );
#if defined(__WXMSW__) #if defined(__WXMSW__)
// Note: New lines are occupied by two characters. // Note: New lines are occupied by two characters.
long pos_2[numLines_2 + 1][maxLineLength_2 + 1] = long pos_2_msw[numLines_2 + 1][maxLineLength_2 + 1] =
{ { 0, 1, 2, 3, -1 }, // New line occupies positions 3, 4 { { 0, 1, 2, 3, -1 }, // New line occupies positions 3, 4
{ 5, 6, 7, -1, -1 }, // New line occupies positions 7, 8 { 5, 6, 7, -1, -1 }, // New line occupies positions 7, 8
{ 9, 10, -1, -1, -1 }, { 9, 10, -1, -1, -1 },
{ -1, -1, -1, -1, -1 } }; { -1, -1, -1, -1, -1 } };
#else #endif // WXMSW
long pos_2[numLines_2+1][maxLineLength_2+1] = long pos_2[numLines_2+1][maxLineLength_2+1] =
{ { 0, 1, 2, 3, -1 }, { { 0, 1, 2, 3, -1 },
{ 4, 5, 6, -1, -1 }, { 4, 5, 6, -1, -1 },
{ 7, 8, -1, -1, -1 }, { 7, 8, -1, -1, -1 },
{ -1, -1, -1, -1, -1 } }; { -1, -1, -1, -1, -1 } };
#endif // WXMSW/!WXMSW
long (&ref_pos_2)[numLines_2 + 1][maxLineLength_2 + 1] =
#if defined(__WXMSW__)
isRichEdit ? pos_2 : pos_2_msw;
#else
pos_2;
#endif
for ( long y = 0; y < numLines_2+1; y++ ) for ( long y = 0; y < numLines_2+1; y++ )
for( long x = 0; x < maxLineLength_2+1; x++ ) for( long x = 0; x < maxLineLength_2+1; x++ )
{ {
long p = m_text->XYToPosition(x, y); long p = m_text->XYToPosition(x, y);
CPPUNIT_ASSERT_EQUAL( pos_2[y][x], p ); CPPUNIT_ASSERT_EQUAL( ref_pos_2[y][x], p );
} }
// only empty lines // only empty lines
@@ -893,26 +992,32 @@ void TextCtrlTestCase::XYToPositionMultiLine()
CPPUNIT_ASSERT_EQUAL( numLines_3, m_text->GetNumberOfLines() ); CPPUNIT_ASSERT_EQUAL( numLines_3, m_text->GetNumberOfLines() );
#if defined(__WXMSW__) #if defined(__WXMSW__)
// Note: New lines are occupied by two characters. // Note: New lines are occupied by two characters.
long pos_3[numLines_3 + 1][maxLineLength_3 + 1] = long pos_3_msw[numLines_3 + 1][maxLineLength_3 + 1] =
{ { 0, -1 }, // New line occupies positions 0, 1 { { 0, -1 }, // New line occupies positions 0, 1
{ 2, -1 }, // New line occupies positions 2, 3 { 2, -1 }, // New line occupies positions 2, 3
{ 4, -1 }, // New line occupies positions 4, 5 { 4, -1 }, // New line occupies positions 4, 5
{ 6, -1 }, { 6, -1 },
{ -1, -1 } }; { -1, -1 } };
#else #endif // WXMSW
long pos_3[numLines_3+1][maxLineLength_3+1] = long pos_3[numLines_3+1][maxLineLength_3+1] =
{ { 0, -1 }, { { 0, -1 },
{ 1, -1 }, { 1, -1 },
{ 2, -1 }, { 2, -1 },
{ 3, -1 }, { 3, -1 },
{ -1, -1 } }; { -1, -1 } };
#endif // WXMSW/!WXMSW
long (&ref_pos_3)[numLines_3 + 1][maxLineLength_3 + 1] =
#if defined(__WXMSW__)
isRichEdit ? pos_3 : pos_3_msw;
#else
pos_3;
#endif
for ( long y = 0; y < numLines_3+1; y++ ) for ( long y = 0; y < numLines_3+1; y++ )
for( long x = 0; x < maxLineLength_3+1; x++ ) for( long x = 0; x < maxLineLength_3+1; x++ )
{ {
long p = m_text->XYToPosition(x, y); long p = m_text->XYToPosition(x, y);
CPPUNIT_ASSERT_EQUAL( pos_3[y][x], p ); CPPUNIT_ASSERT_EQUAL( ref_pos_3[y][x], p );
} }
// mixed empty/non-empty lines // mixed empty/non-empty lines
@@ -923,7 +1028,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
CPPUNIT_ASSERT_EQUAL( numLines_4, m_text->GetNumberOfLines() ); CPPUNIT_ASSERT_EQUAL( numLines_4, m_text->GetNumberOfLines() );
#if defined(__WXMSW__) #if defined(__WXMSW__)
// Note: New lines are occupied by two characters. // Note: New lines are occupied by two characters.
long pos_4[numLines_4 + 1][maxLineLength_4 + 1] = long pos_4_msw[numLines_4 + 1][maxLineLength_4 + 1] =
{ { 0, 1, 2, 3, -1 }, // New line occupies positions 3, 4 { { 0, 1, 2, 3, -1 }, // New line occupies positions 3, 4
{ 5, 6, -1, -1, -1 }, // New line occupies positions 6, 7 { 5, 6, -1, -1, -1 }, // New line occupies positions 6, 7
{ 8, -1, -1, -1, -1 }, // New line occupies positions 8, 9 { 8, -1, -1, -1, -1 }, // New line occupies positions 8, 9
@@ -931,7 +1036,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
{ 13, -1, -1, -1, -1 }, // New line occupies positions 13, 14 { 13, -1, -1, -1, -1 }, // New line occupies positions 13, 14
{ 15, -1, -1, -1, -1 }, { 15, -1, -1, -1, -1 },
{ -1, -1, -1, -1, -1 } }; { -1, -1, -1, -1, -1 } };
#else #endif // WXMSW
long pos_4[numLines_4+1][maxLineLength_4+1] = long pos_4[numLines_4+1][maxLineLength_4+1] =
{ { 0, 1, 2, 3, -1 }, { { 0, 1, 2, 3, -1 },
{ 4, 5, -1, -1, -1 }, { 4, 5, -1, -1, -1 },
@@ -940,13 +1045,19 @@ void TextCtrlTestCase::XYToPositionMultiLine()
{ 9, -1, -1, -1, -1 }, { 9, -1, -1, -1, -1 },
{ 10, -1, -1, -1, -1 }, { 10, -1, -1, -1, -1 },
{ -1, -1, -1, -1, -1 } }; { -1, -1, -1, -1, -1 } };
#endif // WXMSW/!WXMSW
long (&ref_pos_4)[numLines_4 + 1][maxLineLength_4 + 1] =
#if defined(__WXMSW__)
isRichEdit ? pos_4 : pos_4_msw;
#else
pos_4;
#endif
for ( long y = 0; y < numLines_4+1; y++ ) for ( long y = 0; y < numLines_4+1; y++ )
for( long x = 0; x < maxLineLength_4+1; x++ ) for( long x = 0; x < maxLineLength_4+1; x++ )
{ {
long p = m_text->XYToPosition(x, y); long p = m_text->XYToPosition(x, y);
CPPUNIT_ASSERT_EQUAL( pos_4[y][x], p ); CPPUNIT_ASSERT_EQUAL( ref_pos_4[y][x], p );
} }
} }