#endif // WX_PRECOMP
#include "wx/menu.h"
+#include "wx/uiaction.h"
+
#include <stdarg.h>
// ----------------------------------------------------------------------------
CPPUNIT_TEST_SUITE( MenuTestCase );
CPPUNIT_TEST( FindInMenubar );
CPPUNIT_TEST( FindInMenu );
+ CPPUNIT_TEST( EnableTop );
CPPUNIT_TEST( Count );
CPPUNIT_TEST( Labels );
+ CPPUNIT_TEST( RadioItems );
+ CPPUNIT_TEST( RemoveAdd );
+ WXUISIM_TEST( Events );
CPPUNIT_TEST_SUITE_END();
void CreateFrame();
void FindInMenubar();
void FindInMenu();
+ void EnableTop();
void Count();
void Labels();
+ void RadioItems();
+ void RemoveAdd();
+ void Events();
wxFrame* m_frame;
wxArrayString m_menuLabels;
+ // The menu containing the item with MenuTestCase_Bar id.
+ wxMenu* m_menuWithBar;
+
DECLARE_NO_COPY_CLASS(MenuTestCase)
};
PopulateMenu(helpMenu, "Helpmenu item ", itemcount);
- helpMenu->Append(MenuTestCase_Bar, "Bar");
+ helpMenu->Append(MenuTestCase_Bar, "Bar\tF1");
+ m_menuWithBar = helpMenu;
helpMenu->AppendSubMenu(subMenu, "Sub&menu", "Test a submenu");
// +2 for "Foo" and "Bar", +2 for the 2 submenus
}
}
+void MenuTestCase::EnableTop()
+{
+ wxMenuBar* const bar = m_frame->GetMenuBar();
+ CPPUNIT_ASSERT( bar->IsEnabledTop(0) );
+ bar->EnableTop( 0, false );
+ CPPUNIT_ASSERT( !bar->IsEnabledTop(0) );
+ bar->EnableTop( 0, true );
+ CPPUNIT_ASSERT( bar->IsEnabledTop(0) );
+}
+
void MenuTestCase::Count()
{
wxMenuBar* bar = m_frame->GetMenuBar();
CPPUNIT_ASSERT_EQUAL( "Foo", itemFoo->GetItemLabelText() );
CPPUNIT_ASSERT_EQUAL( "Foo", wxMenuItem::GetLabelText("&Foo\tCtrl-F") );
}
+
+void MenuTestCase::RadioItems()
+{
+ wxMenuBar * const bar = m_frame->GetMenuBar();
+ wxMenu * const menu = new wxMenu;
+ bar->Append(menu, "&Radio");
+
+ // Adding consecutive radio items creates a radio group.
+ menu->AppendRadioItem(MenuTestCase_First, "Radio 0");
+ menu->AppendRadioItem(MenuTestCase_First + 1, "Radio 1");
+
+ // First item of a radio group is checked by default.
+ CPPUNIT_ASSERT( menu->IsChecked(MenuTestCase_First) );
+
+ // Checking the second one make the first one unchecked however.
+ menu->Check(MenuTestCase_First + 1, true);
+ CPPUNIT_ASSERT( !menu->IsChecked(MenuTestCase_First) );
+ CPPUNIT_ASSERT( menu->IsChecked(MenuTestCase_First + 1) );
+
+ // Adding more radio items after a separator creates another radio group...
+ menu->AppendSeparator();
+ menu->AppendRadioItem(MenuTestCase_First + 2, "Radio 2");
+ menu->AppendRadioItem(MenuTestCase_First + 3, "Radio 3");
+ menu->AppendRadioItem(MenuTestCase_First + 4, "Radio 4");
+
+ // ... which is independent from the first one.
+ CPPUNIT_ASSERT( menu->IsChecked(MenuTestCase_First + 2) );
+
+ menu->Check(MenuTestCase_First + 3, true);
+ CPPUNIT_ASSERT( menu->IsChecked(MenuTestCase_First + 3) );
+ CPPUNIT_ASSERT( !menu->IsChecked(MenuTestCase_First + 2) );
+ CPPUNIT_ASSERT( menu->IsChecked(MenuTestCase_First + 1) );
+
+
+ // Insert an item in the middle of an existing radio group.
+ menu->InsertRadioItem(4, MenuTestCase_First + 5, "Radio 5");
+ CPPUNIT_ASSERT( menu->IsChecked(MenuTestCase_First + 3) );
+
+ menu->Check( MenuTestCase_First + 5, true );
+ CPPUNIT_ASSERT( !menu->IsChecked(MenuTestCase_First + 3) );
+
+
+ // Prepend a couple of items before the first group.
+ menu->PrependRadioItem(MenuTestCase_First + 6, "Radio 6");
+ menu->PrependRadioItem(MenuTestCase_First + 7, "Radio 7");
+ menu->Check(MenuTestCase_First + 7, true);
+ CPPUNIT_ASSERT( !menu->IsChecked(MenuTestCase_First + 1) );
+
+
+ // Check that the last radio group still works as expected.
+ menu->Check(MenuTestCase_First + 4, true);
+ CPPUNIT_ASSERT( !menu->IsChecked(MenuTestCase_First + 5) );
+}
+
+void MenuTestCase::RemoveAdd()
+{
+ wxMenuBar* bar = m_frame->GetMenuBar();
+
+ wxMenu* menu0 = bar->GetMenu(0);
+ wxMenu* menu1 = bar->GetMenu(1);
+ wxMenuItem* item = new wxMenuItem(menu0, MenuTestCase_Foo + 100, "t&ext\tCtrl-E");
+ menu0->Insert(0, item);
+ CPPUNIT_ASSERT( menu0->FindItemByPosition(0) == item );
+ menu0->Remove(item);
+ CPPUNIT_ASSERT( menu0->FindItemByPosition(0) != item );
+ menu1->Insert(0, item);
+ CPPUNIT_ASSERT( menu1->FindItemByPosition(0) == item );
+ menu1->Remove(item);
+ CPPUNIT_ASSERT( menu1->FindItemByPosition(0) != item );
+ menu0->Insert(0, item);
+ CPPUNIT_ASSERT( menu0->FindItemByPosition(0) == item );
+ menu0->Delete(item);
+}
+
+void MenuTestCase::Events()
+{
+#if wxUSE_UIACTIONSIMULATOR
+ class MenuEventHandler : public wxEvtHandler
+ {
+ public:
+ MenuEventHandler(wxWindow* win)
+ : m_win(win)
+ {
+ m_win->Connect(wxEVT_MENU,
+ wxCommandEventHandler(MenuEventHandler::OnMenu),
+ NULL,
+ this);
+
+ m_gotEvent = false;
+ m_event = NULL;
+ }
+
+ virtual ~MenuEventHandler()
+ {
+ m_win->Disconnect(wxEVT_MENU,
+ wxCommandEventHandler(MenuEventHandler::OnMenu),
+ NULL,
+ this);
+
+ delete m_event;
+ }
+
+ const wxCommandEvent& GetEvent()
+ {
+ CPPUNIT_ASSERT( m_gotEvent );
+
+ m_gotEvent = false;
+
+ return *m_event;
+ }
+
+ private:
+ void OnMenu(wxCommandEvent& event)
+ {
+ CPPUNIT_ASSERT( !m_gotEvent );
+
+ delete m_event;
+ m_event = static_cast<wxCommandEvent*>(event.Clone());
+ m_gotEvent = true;
+ }
+
+ wxWindow* const m_win;
+ wxCommandEvent* m_event;
+ bool m_gotEvent;
+ };
+
+ MenuEventHandler handler(m_frame);
+
+ // Invoke the accelerator.
+ m_frame->Show();
+ m_frame->SetFocus();
+ wxYield();
+
+ wxUIActionSimulator sim;
+ sim.KeyDown(WXK_F1);
+ sim.KeyUp(WXK_F1);
+ wxYield();
+
+ const wxCommandEvent& ev = handler.GetEvent();
+ CPPUNIT_ASSERT_EQUAL( static_cast<int>(MenuTestCase_Bar), ev.GetId() );
+
+ wxObject* const src = ev.GetEventObject();
+ CPPUNIT_ASSERT( src );
+
+ CPPUNIT_ASSERT_EQUAL( "wxMenu",
+ wxString(src->GetClassInfo()->GetClassName()) );
+ CPPUNIT_ASSERT_EQUAL( static_cast<wxObject*>(m_menuWithBar),
+ src );
+#endif // wxUSE_UIACTIONSIMULATOR
+}