1#include <wx/arrstr.h>
2
3#include <muleunit/test.h>
4#include <common/TextFile.h>
5#include <common/Path.h>
6
7using namespace muleunit;
8
9DECLARE_SIMPLE(TextFile)
10
11const wxChar* g_filesDefault[] = {
12	wxT("TextFileTest_dos.txt"),
13	wxT("TextFileTest_unix.txt")
14};
15
16
17wxString ArrToStr(const wxArrayString& arr)
18{
19	wxString str = wxT("[");
20
21	for (size_t i = 0; i < arr.Count(); ++i) {
22		if (str != wxT("[")) {
23			str << wxT(", \"") << arr[i] << wxT('"');
24		} else {
25			str << wxT('"') << arr[i] << wxT('"');
26		}
27	}
28
29	str << wxT("]");
30
31	return str;
32}
33
34
35wxString ArrToStr(size_t count, const wxChar* arr[])
36{
37	return ArrToStr(wxArrayString(count, arr));
38}
39
40
41
42void CompareReadLines(size_t count, const wxChar* expected[], EReadTextFile criteria)
43{
44	CTextFile file;
45	ASSERT_FALSE(file.IsOpened());
46	ASSERT_TRUE(file.Eof());
47	for (size_t j = 0; j < ArraySize(g_filesDefault); ++j) {
48		CONTEXT(wxString(wxT("Checking file: ")) + g_filesDefault[j]);
49
50		ASSERT_TRUE(file.Open(CPath(wxSTRINGIZE_T(SRCDIR)).JoinPaths(CPath(g_filesDefault[j])).GetRaw(), CTextFile::read));
51
52		wxArrayString lines = file.ReadLines(criteria);
53
54		ASSERT_EQUALS(ArrToStr(count, expected), ArrToStr(lines));
55		ASSERT_EQUALS(count, lines.GetCount());
56	}
57	ASSERT_TRUE(file.IsOpened());
58	ASSERT_TRUE(file.Eof());
59};
60
61
62
63TEST(TextFile, ReadLines)
64{
65	{
66		CONTEXT(wxT("Checking default parameters"));
67
68		const wxChar* lines[] = {
69			wxT("abc"),
70			wxT("def ghi"),
71			wxT("xyz"),
72		};
73
74		CompareReadLines(ArraySize(lines), lines, txtReadDefault);
75	}
76
77	{
78		CONTEXT(wxT("Checking without criteria"));
79
80		const wxChar* lines[] = {
81			wxT(" # comment"),
82			wxT("abc"),
83			wxT("# foo bar"),
84			wxT(" "),
85			wxT("def ghi "),
86			wxT(""),
87			wxT("# xyz"),
88			wxT(" xyz"),
89			wxT(" "),
90			wxT("")
91		};
92
93		CompareReadLines(ArraySize(lines), lines, (EReadTextFile)0);
94	}
95
96	{
97		CONTEXT(wxT("Checking txtIgnoreEmptyLines"));
98
99		const wxChar* lines[] = {
100			wxT(" # comment"),
101			wxT("abc"),
102			wxT("# foo bar"),
103			wxT(" "),
104			wxT("def ghi "),
105			wxT("# xyz"),
106			wxT(" xyz"),
107			wxT(" "),
108		};
109
110		CompareReadLines(ArraySize(lines), lines, txtIgnoreEmptyLines);
111	}
112
113	{
114		CONTEXT(wxT("Checking txtIgnoreComments"));
115
116		const wxChar* lines[] = {
117			wxT("abc"),
118			wxT(" "),
119			wxT("def ghi "),
120			wxT(""),
121			wxT(" xyz"),
122			wxT(" "),
123			wxT("")
124		};
125
126		CompareReadLines(ArraySize(lines), lines, txtIgnoreComments);
127	}
128
129	{
130		CONTEXT(wxT("Checking txtStripWhitespace"));
131
132		const wxChar* lines[] = {
133			wxT("# comment"),
134			wxT("abc"),
135			wxT("# foo bar"),
136			wxT(""),
137			wxT("def ghi"),
138			wxT(""),
139			wxT("# xyz"),
140			wxT("xyz"),
141			wxT(""),
142			wxT("")
143		};
144
145		CompareReadLines(ArraySize(lines), lines, txtStripWhitespace);
146	}
147}
148
149
150class TextFileTest : public Test
151{
152public:
153	TextFileTest()
154		: Test(wxT("TextFile"), wxT("WriteLines"))
155	{
156	}
157
158	virtual void setUp()
159	{
160		const CPath path = CPath(wxT("testfile.txt"));
161		if (path.FileExists()) {
162			ASSERT_TRUE(CPath::RemoveFile(path));
163		}
164
165	}
166
167	virtual void tearDown()
168	{
169		setUp();
170	}
171
172	virtual void run()
173	{
174		const wxChar* lines[] = {
175			wxT(" # comment"),
176			wxT("abc"),
177			wxT("# foo bar"),
178			wxT(" "),
179			wxT("def ghi "),
180			wxT(""),
181			wxT("# xyz"),
182			wxT(" xyz"),
183			wxT(" "),
184			wxT("")
185		};
186
187		{
188			CONTEXT(wxT("Writing lines manually"));
189
190			CTextFile file;
191			ASSERT_TRUE(file.Open(wxT("testfile.txt"), CTextFile::write));
192
193			for (size_t i = 0; i < ArraySize(lines); ++i) {
194				CONTEXT(wxString::Format(wxT("Writing the %i'th line."), i));
195
196				ASSERT_TRUE(file.WriteLine(lines[i]));
197			}
198		}
199
200		{
201			CONTEXT(wxT("Reading manually written lines"));
202
203			CTextFile file;
204			ASSERT_TRUE(file.Open(wxT("testfile.txt"), CTextFile::read));
205			ASSERT_FALSE(file.Eof());
206
207			for (size_t i = 0; i < ArraySize(lines); ++i) {
208				CONTEXT(wxString::Format(wxT("Reading the %i'th line."), i));
209
210				ASSERT_EQUALS(lines[i], file.GetNextLine());
211			}
212			ASSERT_TRUE(file.Eof());
213		}
214
215		{
216			CONTEXT(wxT("Writing lines automatically"));
217
218			CTextFile file;
219			ASSERT_FALSE(file.IsOpened());
220			ASSERT_TRUE(file.Open(wxT("testfile.txt"), CTextFile::write));
221			ASSERT_TRUE(file.WriteLines(wxArrayString(ArraySize(lines), lines)));
222			ASSERT_TRUE(file.IsOpened());
223		}
224
225		{
226			CONTEXT(wxT("Reading automatically written lines"));
227
228			CTextFile file;
229			ASSERT_FALSE(file.IsOpened());
230			ASSERT_TRUE(file.Open(wxT("testfile.txt"), CTextFile::read));
231			ASSERT_TRUE(file.IsOpened());
232			ASSERT_FALSE(file.Eof());
233
234			for (size_t i = 0; i < ArraySize(lines); ++i) {
235				CONTEXT(wxString::Format(wxT("Reading the %i'th line."), i));
236
237				ASSERT_EQUALS(lines[i], file.GetNextLine());
238			}
239
240			ASSERT_TRUE(file.Eof());
241		}
242	}
243} testInstance;
244
245