mgetl: fix trouble with 'continuous' read on Windows
[scilab.git] / scilab / modules / fileio / tests / unit_tests / mgetl.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2010 - DIGITEO - Allan CORNET
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7 // <-- CLI SHELL MODE -->
8 // <-- NO CHECK REF -->
9 //
10 // =============================================================================
11 // Unitary tests for mgetl function
12 //==============================================================================
13
14 function [filename, txt] = create_file(arg)
15     if isempty(arg) then
16         txt = [];
17         filename = tempname();
18     elseif typeof(arg) == "string" then
19         txt = arg;
20         filename = tempname();
21         if arg <> [] then
22             mputl(arg, filename);
23         end
24     elseif typeof(arg) == "constant" then
25         txt = "";
26         for i=1:size(arg, '*')
27             txt = [txt; strcat(repmat(ascii(96+i), 1, arg(i)))];
28         end
29         filename = tempname();
30         mputl(txt, filename);
31     end
32 end
33
34 function fd = open_create_file(txt)
35     fd = mopen(create_file(txt), "rt");
36 endfunction
37
38 function check_mgetl(f, expected, varargin)
39     txt = mgetl(f, varargin(:));
40     assert_checkequal(txt, expected);
41 endfunction
42
43
44 ref = ["1 Scilab"; ..
45         "2 Puffin"; ..
46         "3 "; ..
47         "4 Puffin"; ..
48         "5 Scilab"];
49
50 // test simple
51 check_mgetl(create_file("a"), "a");
52 check_mgetl(create_file(ref), ref);
53
54 // test file argument: file descriptor
55 fd = open_create_file(ref);
56 check_mgetl(fd, [], 0)
57 mclose(fd);
58
59 // test line count argument: read all lines
60 check_mgetl(create_file(ref), ref, -1);
61 check_mgetl(create_file(ref), ref, -10);
62
63 // test line count argument: read zero lines
64 check_mgetl(create_file(ref), [], 0);
65
66 // test line count argument: read some lines
67 check_mgetl(create_file(ref), ref(1), 1);
68 check_mgetl(create_file(ref), ref(1:2), 2);
69 check_mgetl(create_file(ref), ref, 100);
70
71 // read all lines in several calls
72 fd = open_create_file(ref);
73 check_mgetl(fd, ref(1), 1);
74 check_mgetl(fd, ref(2:3), 2);
75 check_mgetl(fd, ref(4:5), 3);
76 mclose(fd);
77
78 // test empty file
79 check_mgetl(create_file([]), []);
80
81 // test file empty lines
82 filename = tempname();
83 fd = mopen(filename, "wb");
84 mfprintf(fd, ascii(10));
85 mclose(fd);
86 check_mgetl(filename, "");
87 txt = mgetl("SCI/modules/fileio/tests/unit_tests/text.txt");
88 assert_checkequal(size(txt), [6 1]);
89 assert_checkequal(txt(6), "");
90
91 // test file with different EOL (end of line)
92 ref_EOL = ["line with CR LF"; ..
93     "line with LF"; ..
94     "line with no EOL"];
95 filename = tempname();
96 fd = mopen(filename, "wb");
97 mfprintf(fd, "%s" + ascii(13) + ascii(10), ref_EOL(1));
98 mfprintf(fd, "%s" + ascii(10), ref_EOL(2));
99 mfprintf(fd, "%s", ref_EOL(3));
100 mclose(fd);
101 check_mgetl(filename, ref_EOL);
102
103
104 // test file with BOM
105 txt = mgetl("SCI/modules/fileio/tests/unit_tests/text-UTF8BOM.txt");
106 assert_checkequal(size(txt), [13 1]);
107 r = "Scilab is a numerical computational package developed since 1990 by researchers from the INRIA and the Ecole nationale des ponts et chaussees (ENPC). It is, since the creation of the Scilab consortium in May 2003, developed and maintained by the INRIA.";
108 assert_checkequal(txt(1), r);
109
110 // test when line size exceeeds reading buffer size (currently 4096 characters per line)
111 [filename, ref2] = create_file([5000, 5000]);
112 check_mgetl(filename, ref2);
113 [filename, ref2] = create_file([100, 5000, 15000]);
114 check_mgetl(filename, ref2);
115 [filename, ref2] = create_file([4095, 8191, 16383]);
116 check_mgetl(filename, ref2);
117 [filename, ref2] = create_file([4096, 8192, 16384]);
118 check_mgetl(filename, ref2);
119
120 // test error management
121 ierr = execstr("mgetl(1000, 1)", "errcatch");
122 assert_checkequal(ierr, 999);
123 ierr = execstr("mgetl(TMPDIR + ""notfound.txt"",1)", "errcatch");
124 assert_checkequal(ierr, 999);
125
126 //test long file with CRLF
127 tmp = tempname();
128 fd = mopen(tmp, "wb");
129 txt = "a":"z";
130 for i = 1:10000
131     mfprintf(fd, "%s %s %s %s %s %s %s %s %s %s" + ascii(13) + ascii(10), txt, txt, txt, txt, txt, txt, txt, txt, txt, txt);
132 end
133 mclose(fd);
134 x = mgetl(tmp);
135 assert_checktrue(length(x) == 27 * 10 - 1);
136
137 //test long file with LF
138 tmp = tempname();
139 fd = mopen(tmp, "wb");
140 txt = "a":"z";
141 for i = 1:10000
142     mfprintf(fd, "%s %s %s %s %s %s %s %s %s %s" + ascii(10), txt, txt, txt, txt, txt, txt, txt, txt, txt, txt);
143 end
144 mclose(fd);
145 x = mgetl(tmp);
146 assert_checktrue(length(x) == 27 * 10 - 1);
147
148 fd = mopen(tmp, "rt");
149 x = mgetl(fd, 1);
150
151 for i = 1:(10000-1)
152     y = mgetl(fd, 1);
153     assert_checkequal(x, y);
154 end
155
156 mclose(fd);