wxWidgets/tests/controls/styledtextctrltest.cpp

171 lines
5.1 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/controls/styledtextctrltest.cpp
// Purpose: wxStyledTextCtrl unit test
// Author: New Pagodi
// Created: 2019-03-10
// Copyright: (c) 2019 wxWidgets development team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#include "testprec.h"
#if wxUSE_STC
#if defined(WXUSINGDLL)
#ifndef WX_PRECOMP
#include "wx/app.h"
#endif // WX_PRECOMP
#include "wx/stc/stc.h"
#include "wx/uiaction.h"
#include "testwindow.h"
#if defined(__WXOSX_COCOA__) || defined(__WXMSW__) || defined(__WXGTK__)
class StcPopupWindowsTestCase
{
public:
StcPopupWindowsTestCase()
: m_stc(new wxStyledTextCtrl(wxTheApp->GetTopWindow(), wxID_ANY))
{
m_focusAlwaysRetained=true;
m_calltipClickReceived=false;
m_stc->Bind(wxEVT_KILL_FOCUS,
&StcPopupWindowsTestCase::OnKillSTCFocus, this);
m_stc->Bind(wxEVT_STC_CALLTIP_CLICK,
&StcPopupWindowsTestCase::OnCallTipClick, this);
}
~StcPopupWindowsTestCase()
{
delete m_stc;
}
void OnKillSTCFocus(wxFocusEvent& WXUNUSED(event))
{
m_focusAlwaysRetained=false;
}
void OnCallTipClick(wxStyledTextEvent& WXUNUSED(event))
{
m_calltipClickReceived=true;
}
protected:
wxStyledTextCtrl* const m_stc;
bool m_focusAlwaysRetained;
bool m_calltipClickReceived;
};
// This set of tests is used to verify that an autocompletion popup does not
// take focus from its parent styled text control.
TEST_CASE_METHOD(StcPopupWindowsTestCase,
"wxStyledTextCtrl::AutoComp",
"[wxStyledTextCtrl][focus]")
{
m_stc->SetFocus();
m_focusAlwaysRetained = true;
m_stc->AutoCompShow(0,"ability able about above abroad absence absent");
#if wxUSE_UIACTIONSIMULATOR
// Pressing the tab key should cause the current entry in the list to be
// entered into the styled text control. However with GTK+, characters sent
// with the UI simulator seem to arrive too late, so select the current
// entry with a double click instead.
wxUIActionSimulator sim;
#ifdef __WXGTK__
wxPoint zeroPosition = m_stc->PointFromPosition(0);
int textHt = m_stc->TextHeight(0);
int textWd = m_stc->TextWidth(0,"ability");
wxPoint autoCompPoint(zeroPosition.x + textWd/2,
zeroPosition.y + textHt + textHt/2);
wxPoint scrnPoint = m_stc->ClientToScreen(autoCompPoint);
sim.MouseMove(scrnPoint);
sim.MouseDblClick();
#else
sim.Char(WXK_TAB);
#endif // __WXGTK__
::wxYield();
CHECK( m_stc->GetText() == "ability" );
#endif //wxUSE_UIACTIONSIMULATOR
if ( m_stc->AutoCompActive() )
m_stc->AutoCompCancel();
CHECK_FOCUS_IS( m_stc );
// Unfortunately under GTK we do get focus loss events, at least sometimes
// (and actually more often than not, especially with GTK2, but this
// happens with GTK3 too).
#ifndef __WXGTK__
CHECK( m_focusAlwaysRetained );
#endif // !__WXGTK__
}
// This test is used to verify that a call tip receives mouse clicks. However
// the clicks do sent with the UI simulator do not seem to be received on
// cocoa for some reason, so skip the test there for now.
#if !defined(__WXOSX_COCOA__)
TEST_CASE_METHOD(StcPopupWindowsTestCase,
"wxStyledTextCtrl::Calltip",
"[wxStyledTextCtrl][focus]")
{
m_stc->SetFocus();
m_calltipClickReceived = false;
m_focusAlwaysRetained = true;
wxString calltipText = "This is a calltip.";
m_stc->CallTipShow(0,calltipText);
#if wxUSE_UIACTIONSIMULATOR
wxUIActionSimulator sim;
wxPoint zeroPosition = m_stc->PointFromPosition(0);
int textHt = m_stc->TextHeight(0);
int textWd = m_stc->TextWidth(0,calltipText);
// zeroPosition is the top left of position 0 and the call tip should have
// roughly the same height as textHt (there seems to be some extra padding
// that makes it a little taller, but it's roughly the same height),
// so (zeroPosition.x+textWd/2,zeroPosition.y+textHt+textHt/2) should
// be the middle of the calltip.
wxPoint calltipMidPoint(zeroPosition.x + textWd/2,
zeroPosition.y + textHt + textHt/2);
wxPoint scrnPoint = m_stc->ClientToScreen(calltipMidPoint);
sim.MouseMove(scrnPoint);
sim.MouseClick();
::wxYield();
CHECK( m_calltipClickReceived );
#endif // wxUSE_UIACTIONSIMULATOR
if ( m_stc->CallTipActive() )
m_stc->CallTipCancel();
// Verify that clicking the call tip did not take focus from the STC.
//
// Unfortunately this test fails for unknown reasons under Xvfb (but only
// there).
if ( !IsRunningUnderXVFB() )
CHECK_FOCUS_IS( m_stc );
// With wxGTK there is the same problem here as in the test above.
#ifndef __WXGTK__
CHECK( m_focusAlwaysRetained );
#endif // !__WXGTK__
}
#endif // !defined(__WXOSX_COCOA__)
#endif // defined(__WXOSX_COCOA__) || defined(__WXMSW__) || defined(__WXGTK__)
#endif // WXUSINGDLL
#endif // wxUSE_STC