1 #include "config.h"
2
3 #ifdef HAVE_UNISTD_H
4 #include <unistd.h>
5 #endif
6
7 #include <iostream>
8 #include <fstream>
9 #include <cassert>
10
11 #include "asserts.h"
12 #include "error.h"
13 #include "estring.h"
14 #include "table.h"
15
16 // #define ERR_OUT(s) std::cerr << s
17 #define ERR_OUT(s)
18
19 class check_output
20 {
21 public:
open(const std::string & a_filename)22 bool open(const std::string& a_filename)
23 {
24 if (m_in.is_open())
25 m_in.close();
26 m_in.clear();
27 m_in.open(a_filename.c_str());
28 if (!m_in.is_open() || !m_in) {
29 return(false);
30 }
31 return(true);
32 }
33
close(void)34 bool close(void)
35 {
36 m_in.close();
37 return(true);
38 }
39
is_open(void)40 bool is_open(void)
41 {
42 bool value;
43
44 value = m_in.is_open();
45 return(value);
46 }
47
get_line(void)48 bool get_line(void)
49 {
50 char buffer[1024] = { 0 };
51
52 if (!m_in.getline(buffer,1024)) {
53 return(false);
54 }
55 try {
56 m_str = buffer;
57 }
58 catch(...) {
59 std::cerr
60 << "*** ERROR: check_output::get_line() - Out of memory?"
61 << std::endl;
62 return(false);
63 }
64 return(true);
65 }
66
str(void) const67 const std::string& str(void) const
68 {
69 return(m_str);
70 }
71
remove(const std::string & a_filename)72 bool remove(const std::string& a_filename)
73 {
74 if (unlink(a_filename.c_str()) != 0) {
75 return(false);
76 }
77 return(true);
78 }
79
80 private:
81 std::string m_str;
82 std::ifstream m_in;
83 };
84
85 check_output check;
86
test1(void)87 void test1(void)
88 {
89 table_cell_base tcb;
90
91 assert(tcb.x == table_cell_base::npos);
92 assert(tcb.y == table_cell_base::npos);
93
94 table_cell_base tcb2;
95
96 assert(tcb == tcb);
97 assert(!(tcb == tcb2));
98
99 std::ofstream out;
100 out.open("./test-table.txt");
101 assert(out.is_open());
102 tcb.write(out,0,10);
103 out.close();
104
105 assert(check.open("./test-table.txt"));
106 assert(!check.get_line());
107 assert(check.close());
108 assert(check.remove("./test-table.txt"));
109 }
110
test2(void)111 void test2(void)
112 {
113 table_cell_estring tce;
114 estring estr;
115
116 estr = "Hello World";
117 tce.assign(estr);
118
119 assert(tce.height() == 1);
120 assert(tce.width() == estr.size());
121
122 table_cell_estring tce2(estr);
123
124 assert(tce2.height() == 1);
125 assert(tce2.width() == estr.size());
126
127 table_cell_estring tce3(tce);
128
129 assert(tce3.height() == 1);
130 assert(tce3.width() == estr.size());
131
132 std::ofstream out;
133 out.open("./test-table.txt");
134 assert(out.is_open());
135 tce.write(out,0,15);
136 out << std::endl;
137 tce.write(out,1,15);
138 out << std::endl;
139 out.close();
140
141 assert(check.open("./test-table.txt"));
142 assert(check.get_line() && check.str() == "Hello World ");
143 assert(check.get_line() && check.str() == " ");
144 assert(!check.get_line());
145 assert(check.close());
146 assert(check.remove("./test-table.txt"));
147 }
148
test3(void)149 void test3(void)
150 {
151 {
152 table t;
153
154 assert(t.ncols() == 0);
155 assert(t.nrows() == 0);
156 assert(t.width() == 0);
157 assert(t.height() == 0);
158
159 std::ofstream out;
160 out.open("./test-table.txt");
161 assert(out.is_open());
162 out << t;
163 out.close();
164
165 assert(check.open("./test-table.txt"));
166 assert(!check.get_line());
167 assert(check.close());
168 assert(check.remove("./test-table.txt"));
169 }
170
171 {
172 table t;
173
174 t.resize(1,1);
175
176 assert(t.ncols() == 1);
177 assert(t.nrows() == 1);
178 assert(t.col_width(0) == 0);
179 assert(t.row_width() == 0);
180 assert(t.col_height() == 0);
181 assert(t.row_height(0) == 0);
182 assert(t.width() == 0);
183 assert(t.height() == 0);
184
185 std::ofstream out;
186 out.open("./test-table.txt");
187 assert(out.is_open());
188 out << t;
189 out.close();
190
191 assert(check.open("./test-table.txt"));
192 assert(!check.get_line());
193 assert(check.close());
194 assert(check.remove("./test-table.txt"));
195
196 t.assign(0,0,"Hello World");
197
198 assert(t.ncols() == 1);
199 assert(t.nrows() == 1);
200 assert(t.col_width(0) == 11);
201 assert(t.row_width() == 11);
202 assert(t.col_height() == 1);
203 assert(t.row_height(0) == 1);
204 assert(t.width() == 11);
205 assert(t.height() == 1);
206
207 out.open("./test-table.txt");
208 assert(out.is_open());
209 out << t;
210 out.close();
211
212 assert(check.open("./test-table.txt"));
213 assert(check.get_line() && check.str() == "Hello World");
214 assert(!check.get_line());
215 assert(check.close());
216 assert(check.remove("./test-table.txt"));
217
218 t.resize(2,1);
219
220 assert(t.ncols() == 2);
221 assert(t.nrows() == 1);
222 assert(t.col_width(0) == 11);
223 assert(t.row_width() == 11);
224 assert(t.col_height() == 1);
225 assert(t.row_height(0) == 1);
226 assert(t.width() == 11);
227 assert(t.height() == 1);
228
229 out.open("./test-table.txt");
230 assert(out.is_open());
231 out << t;
232 out.close();
233
234 assert(check.open("./test-table.txt"));
235 assert(check.get_line() && check.str() == "Hello World");
236 assert(!check.get_line());
237 assert(check.close());
238 assert(check.remove("./test-table.txt"));
239
240 t.assign(0,0,"Hello ");
241 t.assign(1,0,"World");
242
243 assert(t.ncols() == 2);
244 assert(t.nrows() == 1);
245 assert(t.col_width(0) == 6);
246 assert(t.col_width(1) == 5);
247 assert(t.row_width() == 11);
248 assert(t.col_height() == 1);
249 assert(t.row_height(0) == 1);
250 assert(t.width() == 11);
251 assert(t.height() == 1);
252
253 out.open("./test-table.txt");
254 assert(out.is_open());
255 out << t;
256 out.close();
257
258 assert(check.open("./test-table.txt"));
259 assert(check.get_line() && check.str() == "Hello World");
260 assert(!check.get_line());
261 assert(check.close());
262 assert(check.remove("./test-table.txt"));
263
264 t.resize(2,2);
265
266 assert(t.ncols() == 2);
267 assert(t.nrows() == 2);
268 assert(t.col_width(0) == 6);
269 assert(t.col_width(1) == 5);
270 assert(t.col_height() == 1);
271 assert(t.row_height(0) == 1);
272 assert(t.row_height(1) == 0);
273 assert(t.width() == 11);
274 assert(t.height() == 1);
275
276 out.open("./test-table.txt");
277 assert(out.is_open());
278 out << t;
279 out.close();
280
281 assert(check.open("./test-table.txt"));
282 assert(check.get_line() && check.str() == "Hello World");
283 assert(!check.get_line());
284 assert(check.close());
285 assert(check.remove("./test-table.txt"));
286
287 t.assign(0,1,"Hi ");
288 t.assign(1,1,"There");
289
290 assert(t.ncols() == 2);
291 assert(t.nrows() == 2);
292 assert(t.col_width(0) == 6);
293 assert(t.col_width(1) == 5);
294 assert(t.row_width() == 11);
295 assert(t.col_height() == 2);
296 assert(t.row_height(0) == 1);
297 assert(t.row_height(1) == 1);
298 assert(t.width() == 11);
299 assert(t.height() == 2);
300
301 out.open("./test-table.txt");
302 assert(out.is_open());
303 out << t;
304 out.close();
305
306 assert(check.open("./test-table.txt"));
307 assert(check.get_line() && check.str() == "Hello World");
308 assert(check.get_line() && check.str() == "Hi There");
309 assert(!check.get_line());
310 assert(check.close());
311 assert(check.remove("./test-table.txt"));
312
313 }
314
315 {
316 table sub_t(2,2);
317
318 sub_t.assign(0,0," A ");
319 sub_t.assign(1,0," B ");
320 sub_t.assign(1,1," D ");
321
322 table t(2,2);
323
324 t.assign(0,0,"Hello ");
325 t.assign(1,0,"World");
326 t.assign(0,1,"Hi");
327 t.assign(1,1,sub_t);
328
329 assert(t.ncols() == 2);
330 assert(t.nrows() == 2);
331 assert(t.col_width(0) == 6);
332 assert(t.col_width(1) == 6);
333 assert(t.row_width() == 12);
334 assert(t.col_height() == 3);
335 assert(t.row_height(0) == 1);
336 assert(t.row_height(1) == 2);
337 assert(t.width() == 12);
338 assert(t.height() == 3);
339
340 std::ofstream out;
341 out.open("./test-table.txt");
342 assert(out.is_open());
343 out << t;
344 out.close();
345
346 assert(check.open("./test-table.txt"));
347 assert(check.get_line() && check.str() == "Hello World ");
348 assert(check.get_line() && check.str() == "Hi A B ");
349 assert(check.get_line() && check.str() == " D ");
350 assert(!check.get_line());
351 assert(check.close());
352 assert(check.remove("./test-table.txt"));
353 }
354
355 {
356 table t;
357
358 assert(t.ncols() == 0);
359 assert(t.nrows() == 0);
360
361 t.insert_row(0);
362
363 assert(t.ncols() == 0);
364 assert(t.nrows() == 1);
365
366 t.insert_col(0);
367
368 assert(t.ncols() == 1);
369 assert(t.nrows() == 1);
370
371 t.assign(0,0,"Hello");
372
373 t.insert_col(t.ncols());
374
375 assert(t.ncols() == 2);
376 assert(t.nrows() == 1);
377
378 t.assign(1,0," ");
379
380 t.insert_col(t.ncols());
381
382 assert(t.ncols() == 3);
383 assert(t.nrows() == 1);
384
385 t.assign(2,0,"World");
386
387 t.insert_row(t.nrows());
388
389 assert(t.ncols() == 3);
390 assert(t.nrows() == 2);
391
392 t.assign(0,1,"Hi");
393 t.assign(1,1," ");
394 t.assign(2,1,"There");
395
396 std::ofstream out;
397 out.open("./test-table.txt");
398 out << t;
399 out.close();
400
401 assert(check.open("./test-table.txt"));
402 assert(check.get_line() && check.str() == "Hello World");
403 assert(check.get_line() && check.str() == "Hi There");
404 assert(!check.get_line());
405 assert(check.close());
406 assert(check.remove("./test-table.txt"));
407 }
408 }
409
test4(void)410 void test4(void)
411 {
412 table t, subt1, subt2;
413 char const * array1[] = {
414 "alces:/",
415 "alces:/export/",
416 "alces:/export/home/a1/",
417 "alces:/export/home/a2/",
418 "alces:/export/home/a3/",
419 "alces:/export/home/a4/",
420 "alces:/export/home/a5/",
421 "alces:/export/home/b1/",
422 "alces:/export/home/b2/",
423 "alces:/export/home/b3/",
424 "alces:/export/home/b4/",
425 "alces:/export/home/b5/",
426 "alces:/export/home/c1/",
427 "alces:/export/home/c2/",
428 "alces:/export/home/c3/",
429 "alces:/export/home/c4/",
430 "alces:/export/home/c5/",
431 "alces:/export/home/d1/",
432 "alces:/export/home/d2/",
433 "alces:/export/home/d3/",
434 "alces:/export/home/d4/",
435 "alces:/export/home/d5/",
436 "alces:/var/spool/",
437 0
438 };
439 char const * array2[] = {
440 "alces/",
441 "alces/export/",
442 "alces/export/home/a1/",
443 "alces/export/home/a2/",
444 "alces/export/home/a3/",
445 "alces/export/home/a4/",
446 "alces/export/home/a5/",
447 "alces/export/home/b1/",
448 "alces/export/home/b2/",
449 "alces/export/home/b3/",
450 "alces/export/home/b4/",
451 "alces/export/home/b5/",
452 "alces/export/home/c1/",
453 "alces/export/home/c2/",
454 "alces/export/home/c3/",
455 "alces/export/home/c4/",
456 "alces/export/home/c5/",
457 "alces/export/home/d1/",
458 "alces/export/home/d2/",
459 "alces/export/home/d3/",
460 "alces/export/home/d4/",
461 "alces/export/home/d5/",
462 "alces/var/spool/",
463 0
464 };
465 int c;
466 estring estr;
467
468 for (c = 0; array1[c] != 0; ++c) {
469 subt1 << "From:" << " " << array1[c] << " " << "To:" << " " << array2[c]
470 << table_endl;
471 }
472
473 estr = "Start Time:";
474 estr.align(estring::right);
475 subt2 << estr;
476
477 subt2 << " ";
478
479 estr = "2004 Mar 31 21:32:10";
480 estr.align(estring::right);
481 subt2 << estr;
482
483 subt2 << " ";
484
485 estr = "Total Files:";
486 estr.align(estring::right);
487 subt2 << estr;
488
489 subt2 << " ";
490
491 estr = "119,743";
492 estr.align(estring::right);
493 subt2 << estr;
494
495 subt2 << " ";
496
497 estr = "Total Size:";
498 estr.align(estring::right);
499 subt2 << estr;
500
501 subt2 << " ";
502
503 estr = "9.5GB";
504 estr.align(estring::right);
505 subt2 << estr;
506
507 subt2 << table_endl;
508
509
510
511 estr = "Stop Time:";
512 estr.align(estring::right);
513 subt2 << estr;
514
515 subt2 << " ";
516
517 estr = "2004 Mar 31 23:16:31";
518 estr.align(estring::right);
519 subt2 << estr;
520
521 subt2 << " ";
522
523 estr = "Xferd Files:";
524 estr.align(estring::right);
525 subt2 << estr;
526
527 subt2 << " ";
528
529 estr = "1";
530 estr.align(estring::right);
531 subt2 << estr;
532
533 subt2 << " ";
534
535 estr = "Xferd Size:";
536 estr.align(estring::right);
537 subt2 << estr;
538
539 subt2 << " ";
540
541 estr = "6.0KB";
542 estr.align(estring::right);
543 subt2 << estr;
544
545 subt2 << table_endl;
546
547
548
549 estr = "Duration:";
550 estr.align(estring::right);
551 subt2 << estr;
552
553 subt2 << " ";
554
555 estr = "01:34:21";
556 estr.align(estring::right);
557 subt2 << estr;
558
559 subt2 << " ";
560
561 estr = "Percent:";
562 estr.align(estring::right);
563 subt2 << estr;
564
565 subt2 << " ";
566
567 estr = "0.0%";
568 estr.align(estring::right);
569 subt2 << estr;
570
571 subt2 << " ";
572
573 estr = "Percent:";
574 estr.align(estring::right);
575 subt2 << estr;
576
577 subt2 << " ";
578
579 estr = "0.0%";
580 estr.align(estring::right);
581 subt2 << estr;
582
583 subt2 << table_endl;
584
585 t << "Status" << " " << "Stats" << table_endl;
586
587 estr = "";
588 estr.fillchar('-');
589 t << estr << " " << estr << table_endl;
590
591 t << "Ok" << " " << subt1 << table_endl;
592 t << table_skip << " " << table_skip << table_endl;
593 t << table_skip << " " << subt2 << table_endl;
594
595 std::ofstream out;
596 out.open("./test-table.txt");
597 out << t;
598 out.close();
599
600 assert(check.open("./test-table.txt"));
601 assert(check.get_line() && check.str() == "Status Stats ");
602 assert(check.get_line() && check.str() == "------ -----------------------------------------------------------------------");
603 assert(check.get_line() && check.str() == "Ok From: alces:/ To: alces/ ");
604 assert(check.get_line() && check.str() == " From: alces:/export/ To: alces/export/ ");
605 assert(check.get_line() && check.str() == " From: alces:/export/home/a1/ To: alces/export/home/a1/ ");
606 assert(check.get_line() && check.str() == " From: alces:/export/home/a2/ To: alces/export/home/a2/ ");
607 assert(check.get_line() && check.str() == " From: alces:/export/home/a3/ To: alces/export/home/a3/ ");
608 assert(check.get_line() && check.str() == " From: alces:/export/home/a4/ To: alces/export/home/a4/ ");
609 assert(check.get_line() && check.str() == " From: alces:/export/home/a5/ To: alces/export/home/a5/ ");
610 assert(check.get_line() && check.str() == " From: alces:/export/home/b1/ To: alces/export/home/b1/ ");
611 assert(check.get_line() && check.str() == " From: alces:/export/home/b2/ To: alces/export/home/b2/ ");
612 assert(check.get_line() && check.str() == " From: alces:/export/home/b3/ To: alces/export/home/b3/ ");
613 assert(check.get_line() && check.str() == " From: alces:/export/home/b4/ To: alces/export/home/b4/ ");
614 assert(check.get_line() && check.str() == " From: alces:/export/home/b5/ To: alces/export/home/b5/ ");
615 assert(check.get_line() && check.str() == " From: alces:/export/home/c1/ To: alces/export/home/c1/ ");
616 assert(check.get_line() && check.str() == " From: alces:/export/home/c2/ To: alces/export/home/c2/ ");
617 assert(check.get_line() && check.str() == " From: alces:/export/home/c3/ To: alces/export/home/c3/ ");
618 assert(check.get_line() && check.str() == " From: alces:/export/home/c4/ To: alces/export/home/c4/ ");
619 assert(check.get_line() && check.str() == " From: alces:/export/home/c5/ To: alces/export/home/c5/ ");
620 assert(check.get_line() && check.str() == " From: alces:/export/home/d1/ To: alces/export/home/d1/ ");
621 assert(check.get_line() && check.str() == " From: alces:/export/home/d2/ To: alces/export/home/d2/ ");
622 assert(check.get_line() && check.str() == " From: alces:/export/home/d3/ To: alces/export/home/d3/ ");
623 assert(check.get_line() && check.str() == " From: alces:/export/home/d4/ To: alces/export/home/d4/ ");
624 assert(check.get_line() && check.str() == " From: alces:/export/home/d5/ To: alces/export/home/d5/ ");
625 assert(check.get_line() && check.str() == " From: alces:/var/spool/ To: alces/var/spool/ ");
626 assert(check.get_line() && check.str() == " ");
627 assert(check.get_line() && check.str() == " Start Time: 2004 Mar 31 21:32:10 Total Files: 119,743 Total Size: 9.5GB");
628 assert(check.get_line() && check.str() == " Stop Time: 2004 Mar 31 23:16:31 Xferd Files: 1 Xferd Size: 6.0KB");
629 assert(check.get_line() && check.str() == " Duration: 01:34:21 Percent: 0.0% Percent: 0.0%");
630 assert(!check.get_line());
631 assert(check.close());
632 assert(check.remove("./test-table.txt"));
633 }
634
main(int argc,char const * argv[])635 int main(int argc, char const * argv[])
636 {
637 try {
638 test1();
639 test2();
640 test3();
641 test4();
642 }
643 catch(error e) {
644 std::cerr << e;
645 assert(0);
646 }
647 catch(...) {
648 std::cerr << err_unknown;
649 assert(0);
650 }
651 return(0);
652 }
653
654