]> git.saurik.com Git - wxWidgets.git/blame - tests/filekind/filekind.cpp
Compile fixes for Linux
[wxWidgets.git] / tests / filekind / filekind.cpp
CommitLineData
3c70014d
MW
1///////////////////////////////////////////////////////////////////////////////
2// Name: tests/filetype/filetype.cpp
0912690b 3// Purpose: Test wxGetFileKind and wxStreamBase::IsSeekable
3c70014d
MW
4// Author: Mike Wetherell
5// RCS-ID: $Id$
6// Copyright: (c) 2005 Mike Wetherell
7// Licence: wxWidgets licence
8///////////////////////////////////////////////////////////////////////////////
9
10#include "testprec.h"
11
12#ifdef __BORLANDC__
13 #pragma hdrstop
14#endif
15
16// for all others, include the necessary headers
17#ifndef WX_PRECOMP
18 #include "wx/wx.h"
19#endif
20
21#ifdef __UNIX__
22 #include <sys/socket.h>
23#endif
24
25#include "wx/file.h"
26#include "wx/ffile.h"
27#include "wx/wfstream.h"
28#include "wx/filename.h"
29#include "wx/socket.h"
30#include "wx/sckstrm.h"
31#include "wx/mstream.h"
32
33#if wxUSE_STREAMS
34
35///////////////////////////////////////////////////////////////////////////////
36// The test case
37
0912690b 38class FileKindTestCase : public CppUnit::TestCase
3c70014d 39{
0912690b 40 CPPUNIT_TEST_SUITE(FileKindTestCase);
3c70014d
MW
41 CPPUNIT_TEST(File);
42#if defined __UNIX__ || defined _MSC_VER || defined __MINGW32__
43 CPPUNIT_TEST(Pipe);
44#endif
45#if defined __UNIX__
46 CPPUNIT_TEST(Socket);
47#endif
48 CPPUNIT_TEST(Stdin);
49 CPPUNIT_TEST(MemoryStream);
50 CPPUNIT_TEST(SocketStream);
51 CPPUNIT_TEST_SUITE_END();
52
53 void File();
54 void Pipe();
55 void Socket();
56 void Stdin();
57 void MemoryStream();
58 void SocketStream();
59
60 void TestFILE(wxFFile& file, bool expected);
61 void TestFd(wxFile& file, bool expected);
62};
63
64// test a wxFFile and wxFFileInput/OutputStreams of a known type
65//
0912690b 66void FileKindTestCase::TestFILE(wxFFile& file, bool expected)
3c70014d
MW
67{
68 CPPUNIT_ASSERT(file.IsOpened());
0912690b
MW
69 CPPUNIT_ASSERT((wxGetFileKind(file.fp()) == wxFILE_KIND_DISK) == expected);
70 CPPUNIT_ASSERT((file.GetKind() == wxFILE_KIND_DISK) == expected);
3c70014d
MW
71
72 wxFFileInputStream inStream(file);
73 CPPUNIT_ASSERT(inStream.IsSeekable() == expected);
74
75 wxFFileOutputStream outStream(file);
76 CPPUNIT_ASSERT(outStream.IsSeekable() == expected);
77}
78
79// test a wxFile and wxFileInput/OutputStreams of a known type
80//
0912690b 81void FileKindTestCase::TestFd(wxFile& file, bool expected)
3c70014d
MW
82{
83 CPPUNIT_ASSERT(file.IsOpened());
0912690b
MW
84 CPPUNIT_ASSERT((wxGetFileKind(file.fd()) == wxFILE_KIND_DISK) == expected);
85 CPPUNIT_ASSERT((file.GetKind() == wxFILE_KIND_DISK) == expected);
3c70014d
MW
86
87 wxFileInputStream inStream(file);
88 CPPUNIT_ASSERT(inStream.IsSeekable() == expected);
89
90 wxFileOutputStream outStream(file);
91 CPPUNIT_ASSERT(outStream.IsSeekable() == expected);
92}
93
94struct TempFile
95{
96 ~TempFile() { if (!m_name.IsEmpty()) wxRemoveFile(m_name); }
97 wxString m_name;
98};
99
100// test with an ordinary file
101//
0912690b 102void FileKindTestCase::File()
3c70014d
MW
103{
104 TempFile tmp; // put first
105 wxFile file;
106 tmp.m_name = wxFileName::CreateTempFileName(_T("wxft"), &file);
107 TestFd(file, true);
108 file.Close();
109
110 wxFFile ffile(tmp.m_name);
111 TestFILE(ffile, true);
112}
113
114// test with a pipe
115//
116#if defined __UNIX__ || defined _MSC_VER || defined __MINGW32__
0912690b 117void FileKindTestCase::Pipe()
3c70014d
MW
118{
119 int afd[2];
120#ifdef __UNIX__
121 pipe(afd);
122#else
123 _pipe(afd, 256, O_BINARY);
124#endif
125
126 wxFile file0(afd[0]);
127 wxFile file1(afd[1]);
128 TestFd(file0, false);
129 file0.Detach();
130
131 wxFFile ffile(fdopen(afd[0], "r"));
132 TestFILE(ffile, false);
133}
134#endif
135
136// test with a socket
137//
138#if defined __UNIX__
0912690b 139void FileKindTestCase::Socket()
3c70014d
MW
140{
141 int s = socket(PF_INET, SOCK_STREAM, 0);
142
143 wxFile file(s);
144 TestFd(file, false);
145 file.Detach();
146
147 wxFFile ffile(fdopen(s, "r"));
148 TestFILE(ffile, false);
149}
150#endif
151
152// Socket streams should be non-seekable
153//
154#if wxUSE_SOCKETS
0912690b 155void FileKindTestCase::SocketStream()
3c70014d
MW
156{
157 wxSocketClient client;
158 wxSocketInputStream inStream(client);
159 CPPUNIT_ASSERT(!inStream.IsSeekable());
160 wxSocketOutputStream outStream(client);
161 CPPUNIT_ASSERT(!outStream.IsSeekable());
162
163 wxBufferedInputStream nonSeekableBufferedInput(inStream);
164 CPPUNIT_ASSERT(!nonSeekableBufferedInput.IsSeekable());
165 wxBufferedOutputStream nonSeekableBufferedOutput(outStream);
166 CPPUNIT_ASSERT(!nonSeekableBufferedOutput.IsSeekable());
167}
168#endif
169
170// Memory streams should be seekable
171//
0912690b 172void FileKindTestCase::MemoryStream()
3c70014d
MW
173{
174 char buf[20];
175 wxMemoryInputStream inStream(buf, sizeof(buf));
176 CPPUNIT_ASSERT(inStream.IsSeekable());
177 wxMemoryOutputStream outStream(buf, sizeof(buf));
178 CPPUNIT_ASSERT(outStream.IsSeekable());
179
180 wxBufferedInputStream seekableBufferedInput(inStream);
181 CPPUNIT_ASSERT(seekableBufferedInput.IsSeekable());
182 wxBufferedOutputStream seekableBufferedOutput(outStream);
183 CPPUNIT_ASSERT(seekableBufferedOutput.IsSeekable());
184}
185
186// Stdin will usually be a terminal, if so then test it
187//
0912690b 188void FileKindTestCase::Stdin()
3c70014d
MW
189{
190 if (isatty(0))
0912690b 191 CPPUNIT_ASSERT(wxGetFileKind(0) == wxFILE_KIND_TERMINAL);
3c70014d 192 if (isatty(fileno(stdin)))
0912690b 193 CPPUNIT_ASSERT(wxGetFileKind(stdin) == wxFILE_KIND_TERMINAL);
3c70014d
MW
194}
195
196// register in the unnamed registry so that these tests are run by default
0912690b 197CPPUNIT_TEST_SUITE_REGISTRATION(FileKindTestCase);
3c70014d
MW
198
199// also include in it's own registry so that these tests can be run alone
0912690b 200CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(FileKindTestCase, "FileKindTestCase");
3c70014d
MW
201
202#endif // wxUSE_STREAMS