void wxExGuiReportTestFixture::testFrameWithHistory() { wxExFrameWithHistory* frame = (wxExFrameWithHistory *)wxTheApp->GetTopWindow(); CPPUNIT_ASSERT(!frame->OpenFile(wxExFileName(TEST_FILE))); // as we have no focused stc CPPUNIT_ASSERT(!frame->GetRecentFile().Contains("test.h")); CPPUNIT_ASSERT(!frame->OpenFile( wxExFileName(TEST_PRJ), 0, wxEmptyString, wxExFrameWithHistory::WIN_IS_PROJECT)); // It does not open, next should fail. CPPUNIT_ASSERT(!frame->GetRecentProject().Contains("test-rep.prj")); // As we do not have process output lists, execute fails. CPPUNIT_ASSERT( frame->GetProcess()->Execute("wc test.h", wxEXEC_ASYNC) == -1); CPPUNIT_ASSERT( frame->GetProcess()->IsSelected()); CPPUNIT_ASSERT( frame->SetRecentFile("xxx.cpp")); CPPUNIT_ASSERT(!frame->SetRecentProject("xxx.prj")); frame->FindInFilesDialog(ID_TOOL_REPORT_FIND); CPPUNIT_ASSERT(!frame->GetFindInCaption(ID_TOOL_REPORT_FIND).empty()); }
void wxExTestFixture::testTextFile() { wxExTextFile textFile(wxExFileName(TEST_FILE), ID_TOOL_REPORT_COUNT); CPPUNIT_ASSERT( textFile.RunTool()); CPPUNIT_ASSERT(!textFile.GetStatistics().GetElements().GetItems().empty()); CPPUNIT_ASSERT(!textFile.IsOpened()); // file should be closed after running tool CPPUNIT_ASSERT( textFile.RunTool()); // do the same test CPPUNIT_ASSERT(!textFile.GetStatistics().GetElements().GetItems().empty()); CPPUNIT_ASSERT(!textFile.IsOpened()); // file should be closed after running tool wxExTextFile textFile2(wxExFileName(TEST_FILE), ID_TOOL_REPORT_KEYWORD); CPPUNIT_ASSERT( textFile2.RunTool()); // we have no lexers, so no keywords CPPUNIT_ASSERT( textFile2.GetStatistics().GetKeywords().GetItems().empty()); }
void wxExGuiReportTestFixture::testUtil() { wxExFrameWithHistory* frame = (wxExFrameWithHistory *)wxTheApp->GetTopWindow(); wxExNotebook* notebook = new wxExNotebook(wxTheApp->GetTopWindow(), NULL); wxWindow* page1 = new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY); wxWindow* page2 = new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY); CPPUNIT_ASSERT( notebook->AddPage(page1, "page1") != NULL); CPPUNIT_ASSERT( notebook->AddPage(page2, "page2") != NULL); CPPUNIT_ASSERT( wxExForEach(notebook, ID_LIST_ALL_ITEMS)); // As we do not have process output lists, execute fails. CPPUNIT_ASSERT( wxExMake(frame, wxFileName("xxx")) == -1); // As we do not have process output lists, execute fails. // TODO: add makefile. CPPUNIT_ASSERT( wxExMake(frame, wxFileName("make.tst")) == -1); wxExListViewFileName* listView = new wxExListViewFileName( wxTheApp->GetTopWindow(), wxExListViewFileName::LIST_FILE); wxExListItem item(listView, wxExFileName("./test.h")); item.Insert(); wxExFileStatistics stat = wxExRun(item, ID_TOOL_REPORT_KEYWORD); }
void wxExGuiReportTestFixture::testSTCWithFrame() { wxExFrameWithHistory* frame = (wxExFrameWithHistory *)wxTheApp->GetTopWindow(); wxExSTCWithFrame stc(frame, frame, wxExFileName(TEST_FILE)); CPPUNIT_ASSERT(stc.GetFileName().GetFullPath().Contains("test.h")); stc.PropertiesMessage(); }
wxExSTCFile::wxExSTCFile(wxExSTC* stc, const std::string& filename) : m_STC(stc) , m_PreviousLength(0) { if (!filename.empty()) { Assign(wxExFileName(filename)); } }
void wxExTestFixture::testFile() { wxExFile file(wxExFileName(TEST_FILE)); CPPUNIT_ASSERT(!file.CheckSync()); CPPUNIT_ASSERT(!file.GetContentsChanged()); CPPUNIT_ASSERT( file.GetFileName().GetStat().IsOk()); // The fullpath should be normalized, test it. CPPUNIT_ASSERT( file.GetFileName().GetFullPath() != TEST_FILE); CPPUNIT_ASSERT(!file.GetFileName().GetStat().IsReadOnly()); CPPUNIT_ASSERT( file.FileLoad(wxExFileName(TEST_BIN))); CPPUNIT_ASSERT(!file.IsOpened()); CPPUNIT_ASSERT( file.Open(wxExFileName(TEST_BIN).GetFullPath())); CPPUNIT_ASSERT( file.IsOpened()); wxCharBuffer buffer = file.Read(); CPPUNIT_ASSERT(buffer.length() == 40); }
void wxExTestFixture::testFileStatistics() { wxExFileStatistics fileStatistics; wxExTextFile textFile(wxExFileName(TEST_FILE), ID_TOOL_REPORT_COUNT); CPPUNIT_ASSERT(fileStatistics.Get().empty()); CPPUNIT_ASSERT(fileStatistics.Get("xx") == 0); CPPUNIT_ASSERT( textFile.RunTool()); CPPUNIT_ASSERT(!textFile.GetStatistics().GetElements().GetItems().empty()); fileStatistics += textFile.GetStatistics(); CPPUNIT_ASSERT(!fileStatistics.Get().empty()); }
void wxExGuiReportTestFixture::testListViewFile() { wxExFrameWithHistory* frame = (wxExFrameWithHistory *)wxTheApp->GetTopWindow(); wxExListViewFile* listView = new wxExListViewFile(frame, frame, TEST_PRJ); listView->InsertColumn(wxExColumn("String", wxExColumn::COL_STRING)); listView->InsertColumn(wxExColumn("Number", wxExColumn::COL_INT)); // Remember that listview file already has columns. CPPUNIT_ASSERT(listView->FindColumn("String") > 1); CPPUNIT_ASSERT(listView->FindColumn("Number") > 1); CPPUNIT_ASSERT(listView->FileLoad(wxExFileName(TEST_PRJ))); CPPUNIT_ASSERT(listView->FileSave()); CPPUNIT_ASSERT(listView->ItemFromText("test1\ntest2\n")); }
void TestFixture::testFileTiming() { wxExFile file(wxExFileName(TEST_FILE)); CPPUNIT_ASSERT(file.IsOpened()); CPPUNIT_ASSERT(file.Length() > 0); wxStopWatch sw; const int max = 10000; for (int i = 0; i < max; i++) { CPPUNIT_ASSERT(file.Read().length() > 0); } const long exfile_read = sw.Time(); wxFile wxfile(TEST_FILE); CPPUNIT_ASSERT(wxfile.IsOpened()); const size_t l = wxfile.Length(); CPPUNIT_ASSERT(l > 0); sw.Start(); for (int j = 0; j < max; j++) { char* charbuffer = new char[l]; wxfile.Read(charbuffer, l); CPPUNIT_ASSERT(sizeof(charbuffer) > 0); delete charbuffer; } const long file_read = sw.Time(); Report(wxString::Format( "wxExFile::Read %d items in %ld ms wxFile::Read %d items in %ld ms", max, exfile_read, max, file_read).ToStdString()); }
void wxExTestFixture::testTiming() { wxExFile file(wxExFileName(TEST_FILE)); CPPUNIT_ASSERT(file.IsOpened()); wxStopWatch sw; const int max = 10000; for (int i = 0; i < max; i++) { CPPUNIT_ASSERT(file.Read().length() > 0); } const long exfile_read = sw.Time(); sw.Start(); wxFile wxfile(TEST_FILE); for (int j = 0; j < max; j++) { char* charbuffer = new char[wxfile.Length()]; wxfile.Read(charbuffer, wxfile.Length()); wxString* buffer = new wxString(charbuffer, wxfile.Length()); CPPUNIT_ASSERT(buffer->length() > 0); delete charbuffer; delete buffer; } const long file_read = sw.Time(); printf( "wxExFile::Read:%ld wxFile::Read:%ld\n", exfile_read, file_read); }
void Frame::OnCommand(wxCommandEvent& event) { switch (event.GetId()) { case wxID_ABOUT: { wxAboutDialogInfo info; info.SetIcon(GetIcon()); info.SetDescription(_("This program offers a general ODBC query.")); info.SetVersion(wxExGetVersionInfo().GetVersionOnlyString()); info.SetCopyright(wxExGetVersionInfo().GetCopyright()); info.AddDeveloper(wxExOTL::VersionInfo().GetVersionString()); wxAboutBox(info); } break; case wxID_EXECUTE: m_Stopped = false; RunQueries(m_Query->GetText()); break; case wxID_EXIT: Close(true); break; case wxID_NEW: m_Query->GetFile().FileNew(wxExFileName()); m_Query->SetLexer("sql"); m_Query->SetFocus(); GetManager().GetPane("QUERY").Show(); GetManager().Update(); break; case wxID_OPEN: wxExOpenFilesDialog( this, wxFD_OPEN | wxFD_CHANGE_DIR, "sql files (*.sql) | *.sql", true); break; case wxID_SAVE: m_Query->GetFile().FileSave(); break; case wxID_SAVEAS: { wxExFileDialog dlg( this, &m_Query->GetFile(), wxGetStockLabel(wxID_SAVEAS), wxFileSelectorDefaultWildcardStr, wxFD_SAVE); if (dlg.ShowModal() == wxID_OK) { m_Query->GetFile().FileSave(dlg.GetPath()); } } break; case wxID_STOP: m_Running = false; m_Stopped = true; break; case ID_DATABASE_CLOSE: if (m_otl.Logoff()) { m_Shell->SetPrompt(">"); } break; case ID_DATABASE_OPEN: if (m_otl.Logon(this)) { m_Shell->SetPrompt(m_otl.Datasource() + ">"); } break; case ID_SHELL_COMMAND: if (m_otl.IsConnected()) { try { const wxString query = event.GetString().substr( 0, event.GetString().length() - 1); m_Stopped = false; RunQuery(query, true); } catch (otl_exception& p) { if (m_Results->IsShown()) { m_Results->EndBatch(); } m_Shell->AppendText(_("\nerror: ") + wxExQuoted(p.msg)); } } else { m_Shell->AppendText(_("\nnot connected")); } m_Shell->Prompt(); break; case ID_SHELL_COMMAND_STOP: m_Stopped = true; m_Shell->Prompt(_("cancelled")); break; case ID_VIEW_QUERY: TogglePane("QUERY"); break; case ID_VIEW_RESULTS: TogglePane("RESULTS"); break; case ID_VIEW_STATISTICS: TogglePane("STATISTICS"); break; default: wxFAIL; } }
void OpenFile(wxExFrame* frame) const { frame->OpenFile(wxExFileName(m_File), m_LineNumber, std::string(), 0, STC_WIN_DEFAULT, m_Pattern); }
void fixture::testSTC() { // Some methods do not return values, just call them to // prevent cores, and improve test coverage. wxExSTC::ConfigDialog(m_Frame, "test stc", wxExSTC::STC_CONFIG_MODELESS); wxExSTC* stc = new wxExSTC(m_Frame, "hello stc"); CPPUNIT_ASSERT( stc->GetText() == "hello stc"); CPPUNIT_ASSERT( stc->FindNext(wxString("hello"))); CPPUNIT_ASSERT(!stc->FindNext(wxString("%d"))); CPPUNIT_ASSERT(!stc->FindNext(wxString("%ld"))); CPPUNIT_ASSERT(!stc->FindNext(wxString("%q"))); CPPUNIT_ASSERT( stc->FindNext(wxString("hello"), wxSTC_FIND_WHOLEWORD)); CPPUNIT_ASSERT(!stc->FindNext(wxString("HELLO"), wxSTC_FIND_MATCHCASE)); CPPUNIT_ASSERT( stc->GetSearchFlags() & wxSTC_FIND_MATCHCASE); wxExFindReplaceData::Get()->SetMatchCase(false); CPPUNIT_ASSERT( stc->FindNext(wxString("HELLO"))); // uses flags from frd CPPUNIT_ASSERT( stc->AllowChangeIndicator()); stc->AppendText("more text"); CPPUNIT_ASSERT( stc->GetText() != "hello stc"); CPPUNIT_ASSERT( stc->CanCut()); CPPUNIT_ASSERT( stc->CanPaste()); stc->DocumentStart(); wxExFindReplaceData::Get()->SetMatchWord(false); CPPUNIT_ASSERT( stc->FindNext(wxString("more text"))); CPPUNIT_ASSERT( stc->GetFindString() == "more text"); CPPUNIT_ASSERT( stc->ReplaceAll("more", "less") == 1); CPPUNIT_ASSERT( stc->ReplaceAll("more", "less") == 0); CPPUNIT_ASSERT(!stc->FindNext(wxString("more text"))); stc->SelectNone(); CPPUNIT_ASSERT(!stc->FindNext()); CPPUNIT_ASSERT( stc->FindNext(wxString("less text"))); CPPUNIT_ASSERT( stc->ReplaceNext("less text", "")); CPPUNIT_ASSERT(!stc->ReplaceNext()); CPPUNIT_ASSERT(!stc->FindNext(wxString("less text"))); CPPUNIT_ASSERT( stc->GetFindString() != "less text"); CPPUNIT_ASSERT( stc->ReplaceAll("%", "percent") == 0); stc->GotoLineAndSelect(1); CPPUNIT_ASSERT(stc->GetCurrentLine() == 0); CPPUNIT_ASSERT(stc->GetCurrentPos() == 0); stc->GotoLineAndSelect(1, wxEmptyString, 5); CPPUNIT_ASSERT(stc->GetCurrentLine() == 0); CPPUNIT_ASSERT(stc->GetCurrentPos() == 4); stc->SetText("new text"); CPPUNIT_ASSERT(stc->GetText() == "new text"); CPPUNIT_ASSERT(stc->SetLexer("cpp")); wxExLexer lexer; CPPUNIT_ASSERT( lexer.Reset(stc)); CPPUNIT_ASSERT( lexer.Set("cpp", stc, false)); CPPUNIT_ASSERT(!lexer.Set("xyz", stc, false)); CPPUNIT_ASSERT( stc->SetLexer(lexer)); // do the same test as with wxExFile in base for a binary file CPPUNIT_ASSERT(stc->Open(wxExFileName(GetTestDir() + "test.bin"))); CPPUNIT_ASSERT(stc->GetFlags() == 0); const wxCharBuffer& buffer = stc->GetTextRaw(); CPPUNIT_ASSERT(buffer.length() == 40); stc->AddText("hello"); CPPUNIT_ASSERT( stc->GetFile().GetContentsChanged()); stc->GetFile().ResetContentsChanged(); CPPUNIT_ASSERT(!stc->GetFile().GetContentsChanged()); stc->ConfigGet(); stc->Cut(); // stc->FileTypeMenu(); stc->Fold(); stc->Fold(true); // FoldAll CPPUNIT_ASSERT(!stc->GetEOL().empty()); stc->GuessType(); CPPUNIT_ASSERT(stc->MarkerDeleteAllChange()); stc->Paste(); CPPUNIT_ASSERT(!stc->PositionRestore()); stc->PositionSave(); CPPUNIT_ASSERT( stc->PositionRestore()); // stc->Print(); stc->PrintPreview(); stc->ProcessChar(5); stc->PropertiesMessage(); stc->Reload(); stc->ResetMargins(); stc->SelectNone(); CPPUNIT_ASSERT(!stc->SetIndicator(wxExIndicator(4,5), 100, 200)); stc->SetLexerProperty("xx", "yy"); CPPUNIT_ASSERT(!(stc->GetSearchFlags() & wxSTC_FIND_MATCHCASE)); wxExFindReplaceData::Get()->SetMatchCase(false); stc->SetSearchFlags(-1); CPPUNIT_ASSERT(!(stc->GetSearchFlags() & wxSTC_FIND_MATCHCASE)); // Test AutoIndentation // first test auto indentation on next line stc->SetText(" \n line with indentation"); stc->DocumentEnd(); CPPUNIT_ASSERT(!stc->AutoIndentation('x')); CPPUNIT_ASSERT( stc->GetText() == " \n line with indentation"); CPPUNIT_ASSERT( stc->GetLineCount() == 2); CPPUNIT_ASSERT( stc->AutoIndentation('\n')); // the \n is not added, but indentation does CPPUNIT_ASSERT( stc->GetText() == " \n line with indentation"); CPPUNIT_ASSERT( stc->GetLineCount() == 2); // test auto indentation for level change CPPUNIT_ASSERT(stc->SetLexer("cpp")); stc->SetText("if ()"); stc->NewLine(); stc->AddText("{"); // TODO: Fix. CPPUNIT_ASSERT(!stc->AutoIndentation('\n')); stc->Sync(false); stc->Sync(true); stc->Undo(); stc->UseModificationMarkers(true); stc->UseModificationMarkers(false); stc->ClearDocument(); stc->Reload(wxExSTC::STC_WIN_HEX); CPPUNIT_ASSERT(stc->HexMode()); stc->GetHexMode().AppendText("in hex mode"); // Test stc with file (not yet done ???). wxExSTC stc2(m_Frame, GetTestFile()); CPPUNIT_ASSERT( stc2.GetFileName().GetFullPath().Contains("test.h")); CPPUNIT_ASSERT( stc2.Open(GetTestFile())); CPPUNIT_ASSERT(!stc2.Open(wxExFileName("XXX"))); stc2.PropertiesMessage(); // Test events. wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED); event.SetInt(ID_EDIT_HEX_DEC_CALLTIP); wxPostEvent(stc, event); event.SetInt(ID_EDIT_MARKER_NEXT); wxPostEvent(stc, event); event.SetInt(ID_EDIT_MARKER_PREVIOUS); wxPostEvent(stc, event); event.SetInt(ID_EDIT_OPEN_LINK); wxPostEvent(stc, event); event.SetInt(ID_EDIT_SHOW_PROPERTIES); wxPostEvent(stc, event); event.SetInt(ID_EDIT_ZOOM_IN); wxPostEvent(stc, event); event.SetInt(ID_EDIT_ZOOM_OUT); wxPostEvent(stc, event); wxYield(); }
void fixture::testEx() { // Test modeline. const wxString modeline("set ts=120 ec=40 sy=sql"); wxExSTC* stc = new wxExSTC(m_Frame, "-- vi: " + modeline); wxExEx* ex = new wxExEx(stc); CPPUNIT_ASSERT(stc->GetTabWidth() == 120); CPPUNIT_ASSERT(stc->GetEdgeColumn() == 40); CPPUNIT_ASSERT(stc->GetLexer().GetScintillaLexer() == "sql"); CPPUNIT_ASSERT( ex->GetLastCommand() == ":" + modeline); wxExSTC* stc2 = new wxExSTC(m_Frame, wxExFileName("test-modeline.txt")); CPPUNIT_ASSERT(stc2->GetLexer().GetScintillaLexer() == "sql"); CPPUNIT_ASSERT( ex->GetIsActive()); ex->Use(false); CPPUNIT_ASSERT(!ex->GetIsActive()); ex->Use(true); CPPUNIT_ASSERT( ex->GetIsActive()); CPPUNIT_ASSERT( ex->GetMacros().GetCount() > 0); // Test commands and last command. for (auto& command : std::vector<std::pair<std::string, bool>> { {":ab",true}, // We have only one document, so :n, :prev return false. {":n",false},{":prev",false}, {":reg",true}, {":set",true},{":set xxx",false}, {":xxx",false},{":yyy",false}, {":10",true},{":.=",true}, {":g/is/s//ok",true},{":g/is/d",true},{":g/is/p",true}, {":%s/x/y",true},{":%/test//",false}, {":.s/$/\n",true}, {":.S",true}, {":.S0",false}, {":.S10",true}, {":.Sx",false}, {":.Sr",true}, {":.Su",true}, {":.Sru",true}, {":.S10r",true}, {":.S10u",true}, {":.S1,5u",true}, {":1,$s/this/ok",true}, {":1,$s/$/ZXXX/",true}, {":1,$s/$/ZXXX/",true}, {":1,$s/^/Zxxx/",true}, {":1,$s/s/w/",true}}) { #ifdef DEBUGGING wxLogMessage("%s %d", command.first.c_str(), command.second); #endif if (command.second) { CPPUNIT_ASSERT( ex->Command(command.first)); if (command.first != ":.=") { CPPUNIT_ASSERT( ex->GetLastCommand() == command.first); } } else { CPPUNIT_ASSERT(!ex->Command(command.first)); CPPUNIT_ASSERT( ex->GetLastCommand() != command.first); } } CPPUNIT_ASSERT( ex->Command(":1")); CPPUNIT_ASSERT( ex->MarkerAdd('t')); // do not use y or w marker, it is a token!! CPPUNIT_ASSERT( ex->Command(":$")); CPPUNIT_ASSERT( ex->MarkerAdd('u')); CPPUNIT_ASSERT( ex->Command(":'t,'us/s/w/")); CPPUNIT_ASSERT( ex->GetLastCommand() == ":'t,'us/s/w/"); // Test range. stc->SetText("a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\n"); CPPUNIT_ASSERT( ex->Command(":1,2>")); stc->SelectNone(); CPPUNIT_ASSERT(!ex->Command(":'<,'>>")); stc->GotoLine(2); stc->LineDownExtend(); CPPUNIT_ASSERT( ex->Command(":'<,'>m1")); stc->GotoLine(2); stc->LineDownExtend(); CPPUNIT_ASSERT( ex->Command(":'<,'>wtest-ex.txt")); CPPUNIT_ASSERT( ex->Command(":'<,'><")); CPPUNIT_ASSERT( ex->Command(":'<,'>>")); CPPUNIT_ASSERT( ex->Command(":'<,'>!sort")); stc->GotoLine(2); stc->LineDownExtend(); CPPUNIT_ASSERT(!ex->Command(":'<,'>x")); // Test set options. for (const auto& option : std::vector<std::pair<std::string, std::string>> { {"ec","5"},{"sy","cpp"},{"ts","10"}}) { CPPUNIT_ASSERT( ex->Command(":set " + option.first + "=" + option.second)); } // Test set switches. for (const auto& it : std::vector<std::string> { "ai", "ac", "el", "ic", "ln", "mw", "re", "wl", "ws"}) { CPPUNIT_ASSERT( ex->Command(":set " + it)); CPPUNIT_ASSERT( ex->Command(":set " + it + "!")); } CPPUNIT_ASSERT( ex->Command(":set ai")); // back to default CPPUNIT_ASSERT( ex->Command(":d")); //CPPUNIT_ASSERT( ex->Command(":e")); // shows dialog CPPUNIT_ASSERT(!ex->Command(":n")); CPPUNIT_ASSERT(!ex->Command(":prev")); CPPUNIT_ASSERT( ex->Command(":grep test")); CPPUNIT_ASSERT( ex->Command(":sed")); CPPUNIT_ASSERT( ex->Command(":r test")); CPPUNIT_ASSERT( ex->Command(":r !echo qwerty")); CPPUNIT_ASSERT( stc->GetText().Contains("qwerty")); CPPUNIT_ASSERT( ex->Command(":y")); CPPUNIT_ASSERT( ex->Command(":1,$s/^/BEGIN-OF-LINE")); CPPUNIT_ASSERT( ex->Command(":w test-ex.txt")); // Test macros. // Do not load macros yet, to test IsRecorded. CPPUNIT_ASSERT(!ex->GetMacros().IsRecording()); CPPUNIT_ASSERT(!ex->GetMacros().IsRecorded("a")); ex->MacroStartRecording("a"); CPPUNIT_ASSERT( ex->GetMacros().IsRecording()); CPPUNIT_ASSERT(!ex->GetMacros().IsRecorded("a")); ex->GetMacros().StopRecording(); CPPUNIT_ASSERT(!ex->GetMacros().IsRecording()); CPPUNIT_ASSERT(!ex->GetMacros().IsRecorded("a")); // still no macro ex->MacroStartRecording("a"); CPPUNIT_ASSERT( ex->Command(":10")); ex->GetMacros().StopRecording(); CPPUNIT_ASSERT(!ex->GetMacros().IsRecording()); CPPUNIT_ASSERT( ex->GetMacros().IsRecorded("a")); CPPUNIT_ASSERT( ex->GetMacros().StartsWith("a")); CPPUNIT_ASSERT(!ex->GetMacros().StartsWith("b")); CPPUNIT_ASSERT(!ex->GetMacros().IsRecorded("b")); CPPUNIT_ASSERT( ex->MacroPlayback("a")); // CPPUNIT_ASSERT(!ex->MacroPlayback("b")); CPPUNIT_ASSERT( ex->GetMacros().GetMacro() == "a"); CPPUNIT_ASSERT( ex->GetSTC() == stc); CPPUNIT_ASSERT( wxExViMacros::LoadDocument()); CPPUNIT_ASSERT(!ex->GetMacros().IsRecorded("xxx")); CPPUNIT_ASSERT( ex->GetMacros().GetCount() > 0); CPPUNIT_ASSERT( ex->GetMacros().StartsWith("Da")); CPPUNIT_ASSERT( ex->GetMacros().Expand(ex, "Date")); // CPPUNIT_ASSERT(!ex->GetMacros().Expand(ex, "xxx")); // Test markers. CPPUNIT_ASSERT( ex->MarkerAdd('a')); CPPUNIT_ASSERT( ex->MarkerLine('a') != -1); CPPUNIT_ASSERT( ex->MarkerGoto('a')); CPPUNIT_ASSERT( ex->MarkerDelete('a')); CPPUNIT_ASSERT(!ex->MarkerDelete('b')); CPPUNIT_ASSERT(!ex->MarkerGoto('a')); CPPUNIT_ASSERT(!ex->MarkerDelete('a')); // Test global delete (previous delete was on found text). const int max = 10; for (int i = 0; i < max; i++) stc->AppendText("line xxxx added\n"); const int lines = stc->GetLineCount(); CPPUNIT_ASSERT( ex->Command(":g/xxxx/d")); CPPUNIT_ASSERT( stc->GetLineCount() == lines - max); // Test global print. stc->AppendText("line xxxx 3 added\n"); stc->AppendText("line xxxx 4 added\n"); CPPUNIT_ASSERT( ex->Command(":g/xxxx/p")); // Test global substitute. stc->AppendText("line xxxx 6 added\n"); stc->AppendText("line xxxx 7 added\n"); CPPUNIT_ASSERT( ex->Command(":g/xxxx/s//yyyy")); CPPUNIT_ASSERT( stc->GetText().Contains("yyyy")); CPPUNIT_ASSERT( ex->Command(":g//")); // Test goto. stc->SetText("a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\n"); CPPUNIT_ASSERT( stc->GetLineCount() == 12); stc->GotoLine(2); for (auto& go : std::vector<std::pair<std::string, int>> { {":1",0},{":-10",0},{":10",9},{":10000",11}}) { CPPUNIT_ASSERT( ex->Command(go.first)); CPPUNIT_ASSERT( stc->GetCurrentLine() == go.second); } // Test registers. ex->SetRegistersDelete("x"); ex->SetRegisterYank("test"); CPPUNIT_ASSERT( ex->GetMacros().GetRegister('0') == "test"); CPPUNIT_ASSERT( ex->GetRegisterText() == "test"); ex->SetRegisterInsert("insert"); CPPUNIT_ASSERT( ex->GetRegisterInsert() == "insert"); stc->SetText("the chances"); stc->SelectAll(); ex->Yank(); CPPUNIT_ASSERT( ex->GetRegisterText() == "the chances"); ex->Cut(); CPPUNIT_ASSERT( ex->GetRegisterText() == "the chances"); CPPUNIT_ASSERT( ex->GetMacros().GetRegister('1') == "the chances"); CPPUNIT_ASSERT( ex->GetSelectedText().empty()); }
Frame::Frame() : wxExFrameWithHistory(nullptr, wxID_ANY, wxTheApp->GetAppDisplayName()) , m_Results(new wxExGrid(this)) , m_Query(new wxExSTC(this)) , m_Shell(new wxExShell(this, "", ";", true, 50)) { SetIcon(wxICON(app)); wxExMenu* menuFile = new wxExMenu; menuFile->Append(wxID_NEW); menuFile->Append(wxID_OPEN); GetFileHistory().UseMenu(ID_RECENTFILE_MENU, menuFile); menuFile->AppendSeparator(); menuFile->Append(wxID_SAVE); menuFile->Append(wxID_SAVEAS); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT); wxExMenu* menuDatabase = new wxExMenu; menuDatabase->Append(ID_DATABASE_OPEN, wxExEllipsed(_("&Open"))); menuDatabase->Append(ID_DATABASE_CLOSE, _("&Close")); wxExMenu* menuQuery = new wxExMenu; menuQuery->Append(wxID_EXECUTE); menuQuery->Append(wxID_STOP); wxMenu* menuOptions = new wxMenu(); menuOptions->Append(wxID_PREFERENCES); wxExMenu* menuView = new wxExMenu(); AppendPanes(menuView); menuView->AppendSeparator(); menuView->AppendCheckItem(ID_VIEW_QUERY, _("Query")); menuView->AppendCheckItem(ID_VIEW_RESULTS, _("Results")); menuView->AppendCheckItem(ID_VIEW_STATISTICS, _("Statistics")); wxMenu* menuHelp = new wxMenu(); menuHelp->Append(wxID_ABOUT); wxMenuBar *menubar = new wxMenuBar; menubar->Append(menuFile, wxGetStockLabel(wxID_FILE)); menubar->Append(menuView, _("&View")); menubar->Append(menuDatabase, _("&Connection")); menubar->Append(menuQuery, _("&Query")); menubar->Append(menuOptions, _("&Options")); menubar->Append(menuHelp, wxGetStockLabel(wxID_HELP)); SetMenuBar(menubar); m_Results->CreateGrid(0, 0); m_Results->EnableEditing(false); // this is a read-only grid m_Shell->SetFocus(); #if wxUSE_STATUSBAR SetupStatusBar(std::vector<wxExStatusBarPane>{ wxExStatusBarPane(), wxExStatusBarPane("PaneInfo", 100, _("Lines"))}); #endif GetToolBar()->AddControls(false); // no realize yet GetToolBar()->AddTool(wxID_EXECUTE, wxEmptyString, wxArtProvider::GetBitmap( wxART_GO_FORWARD, wxART_TOOLBAR, GetToolBar()->GetToolBitmapSize()), wxGetStockLabel(wxID_EXECUTE, wxSTOCK_NOFLAGS)); GetToolBar()->Realize(); GetManager().AddPane(m_Shell, wxAuiPaneInfo(). Name("CONSOLE"). CenterPane()); GetManager().AddPane(m_Results, wxAuiPaneInfo(). Name("RESULTS"). Caption(_("Results")). CloseButton(true). Bottom(). MaximizeButton(true)); GetManager().AddPane(m_Query, wxAuiPaneInfo(). Name("QUERY"). Caption(_("Query")). CloseButton(true). MaximizeButton(true)); GetManager().AddPane(m_Statistics.Show(this), wxAuiPaneInfo().Left(). Hide(). MaximizeButton(true). Caption(_("Statistics")). Name("STATISTICS")); GetManager().LoadPerspective(wxConfigBase::Get()->Read("Perspective")); GetManager().GetPane("QUERY").Show(false); GetManager().Update(); Bind(wxEVT_CLOSE_WINDOW, [=](wxCloseEvent& event) { if (wxExFileDialog(this, &m_Query->GetFile()).ShowModalIfChanged() != wxID_CANCEL) { wxConfigBase::Get()->Write("Perspective", GetManager().SavePerspective()); event.Skip(); }}); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { wxAboutDialogInfo info; info.SetIcon(GetIcon()); info.SetDescription(_("This program offers a general ODBC query.")); info.SetVersion(wxExGetVersionInfo().GetVersionOnlyString()); info.SetCopyright(wxExGetVersionInfo().GetCopyright()); info.AddDeveloper(wxExOTL::VersionInfo().GetVersionString()); wxAboutBox(info); }, wxID_ABOUT); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { m_Stopped = false; if (m_Query->GetText().empty()) return; if (m_Results->IsShown()) { m_Results->ClearGrid(); } // Skip sql comments. std::regex re("--.*$"); wxString output = std::regex_replace(m_Query->GetText().ToStdString(), re, "", std::regex_constants::format_sed); // Queries are seperated by ; character. wxStringTokenizer tkz(output, ";"); int no_queries = 0; m_Running = true; const auto start = std::chrono::system_clock::now(); // Run all queries. while (tkz.HasMoreTokens() && !m_Stopped) { wxString query = tkz.GetNextToken(); query.Trim(true); query.Trim(false); if (!query.empty()) { try { RunQuery(query, no_queries == 0); no_queries++; } catch (otl_exception& p) { m_Statistics.Inc(_("Number of query errors")); m_Shell->AppendText( _("\nerror: ") + wxString(wxExQuoted(p.msg)) + _(" in: ") + wxString(wxExQuoted(query))); } } } const auto end = std::chrono::system_clock::now(); const auto elapsed = end - start; const auto milli = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed); m_Shell->Prompt(wxString::Format(_("\n%d queries (%.3f seconds)"), no_queries, (float)milli.count() / (float)1000).ToStdString()); m_Running = false;}, wxID_EXECUTE); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { Close(true);}, wxID_EXIT); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { m_Query->GetFile().FileNew(wxExFileName()); m_Query->SetFocus(); ShowPane("QUERY");}, wxID_NEW); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { wxExOpenFilesDialog( this, wxFD_OPEN | wxFD_CHANGE_DIR, "sql files (*.sql)|*.sql|" + _("All Files") + wxString::Format(" (%s)|%s", wxFileSelectorDefaultWildcardStr, wxFileSelectorDefaultWildcardStr), true);}, wxID_OPEN); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { m_Query->GetFile().FileSave();}, wxID_SAVE); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { wxExFileDialog dlg( this, &m_Query->GetFile(), wxGetStockLabel(wxID_SAVEAS), wxFileSelectorDefaultWildcardStr, wxFD_SAVE); if (dlg.ShowModal() == wxID_OK) { m_Query->GetFile().FileSave(dlg.GetPath().ToStdString()); }}, wxID_SAVEAS); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { m_Running = false; m_Stopped = true;}, wxID_STOP); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { if (m_otl.Logoff()) { m_Shell->SetPrompt(">"); }}, ID_DATABASE_CLOSE); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { if (m_otl.Logon(this)) { m_Shell->SetPrompt(m_otl.Datasource().ToStdString() + ">"); }}, ID_DATABASE_OPEN); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { if (m_otl.IsConnected()) { try { const wxString input(event.GetString()); if (!input.empty()) { const wxString query = input.substr( 0, input.length() - 1); m_Stopped = false; RunQuery(query, true); } } catch (otl_exception& p) { if (m_Results->IsShown()) { m_Results->EndBatch(); } m_Shell->AppendText(_("\nerror: ") + wxString(wxExQuoted(p.msg))); } } else { m_Shell->AppendText(_("\nnot connected")); } m_Shell->Prompt();}, ID_SHELL_COMMAND); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { m_Stopped = true; m_Shell->Prompt("cancelled");}, ID_SHELL_COMMAND_STOP); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { TogglePane("QUERY");}, ID_VIEW_QUERY); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { TogglePane("RESULTS");}, ID_VIEW_RESULTS); Bind(wxEVT_MENU, [=](wxCommandEvent& event) { TogglePane("STATISTICS");}, ID_VIEW_STATISTICS); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Enable(m_Query->GetModify());}, wxID_SAVE); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Enable(m_Query->GetLength() > 0);}, wxID_SAVEAS); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Enable(m_Running);}, wxID_STOP); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Enable(m_otl.IsConnected());}, ID_DATABASE_CLOSE); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Enable(!m_otl.IsConnected());}, ID_DATABASE_OPEN); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { // If we have a query, you can hide it, but still run it. event.Enable(m_Query->GetLength() > 0 && m_otl.IsConnected());}, wxID_EXECUTE); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Enable(!GetFileHistory().GetHistoryFile().empty());}, ID_RECENTFILE_MENU); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Check(GetManager().GetPane("QUERY").IsShown());}, ID_VIEW_QUERY); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Check(GetManager().GetPane("RESULTS").IsShown());}, ID_VIEW_RESULTS); Bind(wxEVT_UPDATE_UI, [=](wxUpdateUIEvent& event) { event.Check(GetManager().GetPane("STATISTICS").IsShown());}, ID_VIEW_STATISTICS); // Do automatic connect. if (!m_otl.Datasource().empty() && m_otl.Logon()) { m_Shell->SetPrompt(m_otl.Datasource().ToStdString() + ">"); } else { m_Shell->SetPrompt(">"); } }
const wxExVCSEntry wxExVCS::FindEntry(const std::string& filename) { return FindEntry(wxExFileName(filename)); }
const std::string GetName() const { return wxExFileName(m_File).GetName();};