383 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			383 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        tests/interactive/input.cpp
 | |
| // Purpose:     Miscellaneous tests requiring user input
 | |
| // Author:      Francesco Montorsi (extracted from console sample)
 | |
| // Created:     2010-06-21
 | |
| // Copyright:   (c) 2010 wxWidgets team
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| // ============================================================================
 | |
| // declarations
 | |
| // ============================================================================
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // headers
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #include "testprec.h"
 | |
| 
 | |
| #ifdef __BORLANDC__
 | |
|     #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #include "wx/app.h"
 | |
| #include "wx/wxcrt.h"           // for wxPuts
 | |
| #include "wx/wxcrtvararg.h"     // for wxPrintf
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // conditional compilation
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #define TEST_SNGLINST
 | |
| #define TEST_FTP
 | |
| #define TEST_INFO_FUNCTIONS
 | |
| #if wxUSE_REGEX
 | |
|     #define TEST_REGEX
 | |
| #endif
 | |
| #define TEST_DATETIME
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // test class
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| class InteractiveInputTestCase : public CppUnit::TestCase
 | |
| {
 | |
| public:
 | |
|     InteractiveInputTestCase() { }
 | |
| 
 | |
| private:
 | |
|     CPPUNIT_TEST_SUITE( InteractiveInputTestCase );
 | |
|         CPPUNIT_TEST( TestSingleIstance );
 | |
|         CPPUNIT_TEST( TestFtpInteractive );
 | |
|         CPPUNIT_TEST( TestDiskInfo );
 | |
|         CPPUNIT_TEST( TestRegExInteractive );
 | |
|         CPPUNIT_TEST( TestDateTimeInteractive );
 | |
|     CPPUNIT_TEST_SUITE_END();
 | |
| 
 | |
|     void TestSingleIstance();
 | |
|     void TestFtpInteractive();
 | |
|     void TestDiskInfo();
 | |
|     void TestRegExInteractive();
 | |
|     void TestDateTimeInteractive();
 | |
| 
 | |
|     wxDECLARE_NO_COPY_CLASS(InteractiveInputTestCase);
 | |
| };
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // CppUnit macros
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| // Register this test case as hidden, it shouldn't be run by default.
 | |
| wxREGISTER_UNIT_TEST_WITH_TAGS(InteractiveInputTestCase,
 | |
|                                "[!hide][interactive][input]");
 | |
| 
 | |
| // ============================================================================
 | |
| // implementation
 | |
| // ============================================================================
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // misc information functions
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #include "wx/utils.h"
 | |
| 
 | |
| void InteractiveInputTestCase::TestDiskInfo()
 | |
| {
 | |
| #ifdef TEST_INFO_FUNCTIONS
 | |
|     wxPuts(wxT("*** Testing wxGetDiskSpace() ***"));
 | |
| 
 | |
|     for ( ;; )
 | |
|     {
 | |
|         wxChar pathname[128];
 | |
|         wxPrintf(wxT("Enter a directory name (press ENTER or type 'quit' to escape): "));
 | |
|         if ( !wxFgets(pathname, WXSIZEOF(pathname), stdin) )
 | |
|             break;
 | |
| 
 | |
|         // kill the last '\n'
 | |
|         pathname[wxStrlen(pathname) - 1] = 0;
 | |
| 
 | |
|         if (pathname[0] == '\0' || wxStrcmp(pathname, "quit") == 0)
 | |
|             break;
 | |
| 
 | |
|         wxLongLong total, free;
 | |
|         if ( !wxGetDiskSpace(pathname, &total, &free) )
 | |
|         {
 | |
|             wxPuts(wxT("ERROR: wxGetDiskSpace failed."));
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             wxPrintf(wxT("%sKb total, %sKb free on '%s'.\n"),
 | |
|                     (total / 1024).ToString(),
 | |
|                     (free / 1024).ToString(),
 | |
|                     pathname);
 | |
|         }
 | |
| 
 | |
|         wxPuts("\n");
 | |
|     }
 | |
| 
 | |
|     wxPuts("\n");
 | |
| #endif // TEST_INFO_FUNCTIONS
 | |
| }
 | |
| 
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // regular expressions
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #include "wx/regex.h"
 | |
| 
 | |
| void InteractiveInputTestCase::TestRegExInteractive()
 | |
| {
 | |
| #ifdef TEST_REGEX
 | |
|     wxPuts(wxT("*** Testing RE interactively ***"));
 | |
| 
 | |
|     for ( ;; )
 | |
|     {
 | |
|         wxChar pattern[128];
 | |
|         wxPrintf(wxT("Enter a pattern (press ENTER or type 'quit' to escape): "));
 | |
|         if ( !wxFgets(pattern, WXSIZEOF(pattern), stdin) )
 | |
|             break;
 | |
| 
 | |
|         // kill the last '\n'
 | |
|         pattern[wxStrlen(pattern) - 1] = 0;
 | |
| 
 | |
|         if (pattern[0] == '\0' || wxStrcmp(pattern, "quit") == 0)
 | |
|             break;
 | |
| 
 | |
|         wxRegEx re;
 | |
|         if ( !re.Compile(pattern) )
 | |
|         {
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         wxChar text[128];
 | |
|         for ( ;; )
 | |
|         {
 | |
|             wxPrintf(wxT("Enter text to match: "));
 | |
|             if ( !wxFgets(text, WXSIZEOF(text), stdin) )
 | |
|                 break;
 | |
| 
 | |
|             // kill the last '\n'
 | |
|             text[wxStrlen(text) - 1] = 0;
 | |
| 
 | |
|             if ( !re.Matches(text) )
 | |
|             {
 | |
|                 wxPrintf(wxT("No match.\n"));
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 wxPrintf(wxT("Pattern matches at '%s'\n"), re.GetMatch(text));
 | |
| 
 | |
|                 size_t start, len;
 | |
|                 for ( size_t n = 1; ; n++ )
 | |
|                 {
 | |
|                     if ( !re.GetMatch(&start, &len, n) )
 | |
|                     {
 | |
|                         break;
 | |
|                     }
 | |
| 
 | |
|                     wxPrintf(wxT("Subexpr %zu matched '%s'\n"),
 | |
|                              n, wxString(text + start, len));
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         wxPuts("\n");
 | |
|     }
 | |
| #endif // TEST_REGEX
 | |
| }
 | |
| 
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // FTP
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #include "wx/protocol/ftp.h"
 | |
| #include "wx/protocol/log.h"
 | |
| 
 | |
| #define FTP_ANONYMOUS
 | |
| #ifdef FTP_ANONYMOUS
 | |
|     static const wxChar *hostname = wxT("ftp.wxwidgets.org");
 | |
| #else
 | |
|     static const wxChar *hostname = "localhost";
 | |
| #endif
 | |
| 
 | |
| void InteractiveInputTestCase::TestFtpInteractive()
 | |
| {
 | |
| #ifdef TEST_FTP
 | |
|     wxFTP ftp;
 | |
| 
 | |
|     wxPuts(wxT("\n*** Interactive wxFTP test ***"));
 | |
| 
 | |
| #ifdef FTP_ANONYMOUS
 | |
|     wxPrintf(wxT("--- Attempting to connect to %s:21 anonymously...\n"), hostname);
 | |
| #else // !FTP_ANONYMOUS
 | |
|     wxChar user[256];
 | |
|     wxFgets(user, WXSIZEOF(user), stdin);
 | |
|     user[wxStrlen(user) - 1] = '\0'; // chop off '\n'
 | |
|     ftp.SetUser(user);
 | |
| 
 | |
|     wxChar password[256];
 | |
|     wxPrintf(wxT("Password for %s: "), password);
 | |
|     wxFgets(password, WXSIZEOF(password), stdin);
 | |
|     password[wxStrlen(password) - 1] = '\0'; // chop off '\n'
 | |
|     ftp.SetPassword(password);
 | |
| 
 | |
|     wxPrintf(wxT("--- Attempting to connect to %s:21 as %s...\n"), hostname, user);
 | |
| #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
 | |
| 
 | |
|     if ( !ftp.Connect(hostname) )
 | |
|     {
 | |
|         wxPrintf(wxT("ERROR: failed to connect to %s\n"), hostname);
 | |
| 
 | |
|         return;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         wxPrintf(wxT("--- Connected to %s, current directory is '%s'\n"),
 | |
|                  hostname, ftp.Pwd());
 | |
|     }
 | |
| 
 | |
|     wxChar buf[128];
 | |
|     for ( ;; )
 | |
|     {
 | |
|         wxPrintf(wxT("Enter FTP command (press ENTER or type 'quit' to escape): "));
 | |
|         if ( !wxFgets(buf, WXSIZEOF(buf), stdin) )
 | |
|             break;
 | |
| 
 | |
|         // kill the last '\n'
 | |
|         buf[wxStrlen(buf) - 1] = 0;
 | |
| 
 | |
|         if (buf[0] == '\0' || wxStrcmp(buf, "quit") == 0)
 | |
|             break;
 | |
| 
 | |
|         // special handling of LIST and NLST as they require data connection
 | |
|         wxString start(buf, 4);
 | |
|         start.MakeUpper();
 | |
|         if ( start == wxT("LIST") || start == wxT("NLST") )
 | |
|         {
 | |
|             wxString wildcard;
 | |
|             if ( wxStrlen(buf) > 4 )
 | |
|                 wildcard = buf + 5;
 | |
| 
 | |
|             wxArrayString files;
 | |
|             if ( !ftp.GetList(files, wildcard, start == wxT("LIST")) )
 | |
|             {
 | |
|                 wxPrintf(wxT("ERROR: failed to get %s of files\n"), start);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 wxPrintf(wxT("--- %s of '%s' under '%s':\n"),
 | |
|                          start, wildcard, ftp.Pwd());
 | |
|                 size_t count = files.GetCount();
 | |
|                 for ( size_t n = 0; n < count; n++ )
 | |
|                 {
 | |
|                     wxPrintf(wxT("\t%s\n"), files[n]);
 | |
|                 }
 | |
|                 wxPuts(wxT("--- End of the file list"));
 | |
|             }
 | |
|         }
 | |
|         else // !list
 | |
|         {
 | |
|             wxChar ch = ftp.SendCommand(buf);
 | |
|             wxPrintf(wxT("Command %s"), ch ? wxT("succeeded") : wxT("failed"));
 | |
|             if ( ch )
 | |
|             {
 | |
|                 wxPrintf(wxT(" (return code %c)"), ch);
 | |
|             }
 | |
| 
 | |
|             wxPrintf(wxT(", server reply:\n%s\n\n"), ftp.GetLastResult());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     wxPuts(wxT("\n"));
 | |
| #endif // TEST_FTP
 | |
| }
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // date time
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #include "wx/math.h"
 | |
| #include "wx/datetime.h"
 | |
| 
 | |
| void InteractiveInputTestCase::TestDateTimeInteractive()
 | |
| {
 | |
| #ifdef TEST_DATETIME
 | |
|     wxPuts(wxT("\n*** interactive wxDateTime tests ***"));
 | |
| 
 | |
|     wxChar buf[128];
 | |
| 
 | |
|     for ( ;; )
 | |
|     {
 | |
|         wxPrintf(wxT("Enter a date (press ENTER or type 'quit' to escape): "));
 | |
|         if ( !wxFgets(buf, WXSIZEOF(buf), stdin) )
 | |
|             break;
 | |
| 
 | |
|         // kill the last '\n'
 | |
|         buf[wxStrlen(buf) - 1] = 0;
 | |
| 
 | |
|         if ( buf[0] == '\0' || wxStrcmp(buf, "quit") == 0 )
 | |
|             break;
 | |
| 
 | |
|         wxDateTime dt;
 | |
|         const wxChar *p = dt.ParseDate(buf);
 | |
|         if ( !p )
 | |
|         {
 | |
|             wxPrintf(wxT("ERROR: failed to parse the date '%s'.\n"), buf);
 | |
| 
 | |
|             continue;
 | |
|         }
 | |
|         else if ( *p )
 | |
|         {
 | |
|             wxPrintf(wxT("WARNING: parsed only first %u characters.\n"), p - buf);
 | |
|         }
 | |
| 
 | |
|         wxPrintf(wxT("%s: day %u, week of month %u/%u, week of year %u\n"),
 | |
|                  dt.Format(wxT("%b %d, %Y")),
 | |
|                  dt.GetDayOfYear(),
 | |
|                  dt.GetWeekOfMonth(wxDateTime::Monday_First),
 | |
|                  dt.GetWeekOfMonth(wxDateTime::Sunday_First),
 | |
|                  dt.GetWeekOfYear(wxDateTime::Monday_First));
 | |
|     }
 | |
| 
 | |
|     wxPuts("\n");
 | |
| #endif // TEST_DATETIME
 | |
| }
 | |
| 
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // single instance
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #include "wx/snglinst.h"
 | |
| 
 | |
| void InteractiveInputTestCase::TestSingleIstance()
 | |
| {
 | |
| #ifdef TEST_SNGLINST
 | |
|     wxPuts(wxT("\n*** Testing wxSingleInstanceChecker ***"));
 | |
| 
 | |
|     wxSingleInstanceChecker checker;
 | |
|     if ( checker.Create(wxT(".wxconsole.lock")) )
 | |
|     {
 | |
|         if ( checker.IsAnotherRunning() )
 | |
|         {
 | |
|             wxPrintf(wxT("Another instance of the program is running, exiting.\n"));
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         // wait some time to give time to launch another instance
 | |
|         wxPuts(wxT("If you try to run another instance of this program now, it won't start."));
 | |
|         wxPrintf(wxT("Press \"Enter\" to exit wxSingleInstanceChecker test and proceed..."));
 | |
|         wxFgetc(stdin);
 | |
|     }
 | |
|     else // failed to create
 | |
|     {
 | |
|         wxPrintf(wxT("Failed to init wxSingleInstanceChecker.\n"));
 | |
|     }
 | |
| 
 | |
|     wxPuts("\n");
 | |
| #endif // defined(TEST_SNGLINST)
 | |
| }
 | |
| 
 |