]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/filekind/filekind.cpp
Rename wxGetFileType to wxGetFileKind
[wxWidgets.git] / tests / filekind / filekind.cpp
diff --git a/tests/filekind/filekind.cpp b/tests/filekind/filekind.cpp
new file mode 100644 (file)
index 0000000..7cb6aa3
--- /dev/null
@@ -0,0 +1,202 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        tests/filetype/filetype.cpp
+// Purpose:     Test wxGetFileKind and wxStreamBase::IsSeekable
+// Author:      Mike Wetherell
+// RCS-ID:      $Id$
+// Copyright:   (c) 2005 Mike Wetherell
+// Licence:     wxWidgets licence
+///////////////////////////////////////////////////////////////////////////////
+
+#include "testprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+
+#ifdef __UNIX__
+    #include <sys/socket.h>
+#endif
+
+#include "wx/file.h"
+#include "wx/ffile.h"
+#include "wx/wfstream.h"
+#include "wx/filename.h"
+#include "wx/socket.h"
+#include "wx/sckstrm.h"
+#include "wx/mstream.h"
+
+#if wxUSE_STREAMS
+
+///////////////////////////////////////////////////////////////////////////////
+// The test case
+
+class FileKindTestCase : public CppUnit::TestCase
+{
+    CPPUNIT_TEST_SUITE(FileKindTestCase);
+        CPPUNIT_TEST(File);
+#if defined __UNIX__ || defined _MSC_VER || defined __MINGW32__
+        CPPUNIT_TEST(Pipe);
+#endif
+#if defined __UNIX__
+        CPPUNIT_TEST(Socket);
+#endif
+        CPPUNIT_TEST(Stdin);
+        CPPUNIT_TEST(MemoryStream);
+        CPPUNIT_TEST(SocketStream);
+    CPPUNIT_TEST_SUITE_END();
+
+    void File();
+    void Pipe();
+    void Socket();
+    void Stdin();
+    void MemoryStream();
+    void SocketStream();
+
+    void TestFILE(wxFFile& file, bool expected);
+    void TestFd(wxFile& file, bool expected);
+};
+
+// test a wxFFile and wxFFileInput/OutputStreams of a known type
+// 
+void FileKindTestCase::TestFILE(wxFFile& file, bool expected)
+{
+    CPPUNIT_ASSERT(file.IsOpened());
+    CPPUNIT_ASSERT((wxGetFileKind(file.fp()) == wxFILE_KIND_DISK) == expected);
+    CPPUNIT_ASSERT((file.GetKind() == wxFILE_KIND_DISK) == expected);
+
+    wxFFileInputStream inStream(file);
+    CPPUNIT_ASSERT(inStream.IsSeekable() == expected);
+
+    wxFFileOutputStream outStream(file);
+    CPPUNIT_ASSERT(outStream.IsSeekable() == expected);
+}
+
+// test a wxFile and wxFileInput/OutputStreams of a known type
+//
+void FileKindTestCase::TestFd(wxFile& file, bool expected)
+{
+    CPPUNIT_ASSERT(file.IsOpened());
+    CPPUNIT_ASSERT((wxGetFileKind(file.fd()) == wxFILE_KIND_DISK) == expected);
+    CPPUNIT_ASSERT((file.GetKind() == wxFILE_KIND_DISK) == expected);
+
+    wxFileInputStream inStream(file);
+    CPPUNIT_ASSERT(inStream.IsSeekable() == expected);
+
+    wxFileOutputStream outStream(file);
+    CPPUNIT_ASSERT(outStream.IsSeekable() == expected);
+}
+
+struct TempFile
+{
+    ~TempFile() { if (!m_name.IsEmpty()) wxRemoveFile(m_name); }
+    wxString m_name;
+};
+
+// test with an ordinary file
+//
+void FileKindTestCase::File()
+{
+    TempFile tmp; // put first
+    wxFile file;
+    tmp.m_name = wxFileName::CreateTempFileName(_T("wxft"), &file);
+    TestFd(file, true);
+    file.Close();
+
+    wxFFile ffile(tmp.m_name);
+    TestFILE(ffile, true);
+}
+
+// test with a pipe
+//
+#if defined __UNIX__ || defined _MSC_VER || defined __MINGW32__
+void FileKindTestCase::Pipe()
+{
+    int afd[2];
+#ifdef __UNIX__
+    pipe(afd);
+#else
+    _pipe(afd, 256, O_BINARY);
+#endif
+
+    wxFile file0(afd[0]);
+    wxFile file1(afd[1]);
+    TestFd(file0, false);
+    file0.Detach();
+
+    wxFFile ffile(fdopen(afd[0], "r"));
+    TestFILE(ffile, false);
+}
+#endif
+
+// test with a socket
+//
+#if defined __UNIX__
+void FileKindTestCase::Socket()
+{
+    int s = socket(PF_INET, SOCK_STREAM, 0);
+
+    wxFile file(s);
+    TestFd(file, false);
+    file.Detach();
+
+    wxFFile ffile(fdopen(s, "r"));
+    TestFILE(ffile, false);
+}
+#endif
+
+// Socket streams should be non-seekable
+//
+#if wxUSE_SOCKETS
+void FileKindTestCase::SocketStream()
+{
+    wxSocketClient client;
+    wxSocketInputStream inStream(client);
+    CPPUNIT_ASSERT(!inStream.IsSeekable());
+    wxSocketOutputStream outStream(client);
+    CPPUNIT_ASSERT(!outStream.IsSeekable());
+
+    wxBufferedInputStream nonSeekableBufferedInput(inStream);
+    CPPUNIT_ASSERT(!nonSeekableBufferedInput.IsSeekable());
+    wxBufferedOutputStream nonSeekableBufferedOutput(outStream);
+    CPPUNIT_ASSERT(!nonSeekableBufferedOutput.IsSeekable());
+}
+#endif
+
+// Memory streams should be seekable
+//
+void FileKindTestCase::MemoryStream()
+{
+    char buf[20];
+    wxMemoryInputStream inStream(buf, sizeof(buf));
+    CPPUNIT_ASSERT(inStream.IsSeekable());
+    wxMemoryOutputStream outStream(buf, sizeof(buf));
+    CPPUNIT_ASSERT(outStream.IsSeekable());
+
+    wxBufferedInputStream seekableBufferedInput(inStream);
+    CPPUNIT_ASSERT(seekableBufferedInput.IsSeekable());
+    wxBufferedOutputStream seekableBufferedOutput(outStream);
+    CPPUNIT_ASSERT(seekableBufferedOutput.IsSeekable());
+}
+
+// Stdin will usually be a terminal, if so then test it
+// 
+void FileKindTestCase::Stdin()
+{
+    if (isatty(0))
+        CPPUNIT_ASSERT(wxGetFileKind(0) == wxFILE_KIND_TERMINAL);
+    if (isatty(fileno(stdin)))
+        CPPUNIT_ASSERT(wxGetFileKind(stdin) == wxFILE_KIND_TERMINAL);
+}
+
+// register in the unnamed registry so that these tests are run by default
+CPPUNIT_TEST_SUITE_REGISTRATION(FileKindTestCase);
+
+// also include in it's own registry so that these tests can be run alone
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(FileKindTestCase, "FileKindTestCase");
+
+#endif // wxUSE_STREAMS