* Bug 15600 fixed: savematfile(File) was unstable and stiff
[scilab.git] / scilab / modules / matio / tests / nonreg_tests / bug_15600.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2018 - Samuel GOUGEON
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7 //
8 // <-- CLI SHELL MODE -->
9 // <-- ENGLISH IMPOSED -->
10 // <-- NO CHECK REF -->
11
12 //
13 // <-- Non-regression test for bug 15600 -->
14 //
15 // <-- Bugzilla URL -->
16 // http://bugzilla.scilab.org/15600
17 //
18 // <-- Short Description -->
19 // savematfile(filename) included many environment variables and variables
20 //  of unsupported types.
21
22 // Preparing data of various types
23 // -------------------------------
24 clear
25 b = %t;                         // Skipped : http://bugzilla.scilab.org/15568
26 i = int8((rand(2,3)-0.5)*200);
27 k = uint16(rand(1,4)*100);
28 d = %pi;
29 c = 1-%i;
30 h = rand(1,3,2);
31 t = "text";
32 L = list(%t, "abc");            // Ignored : http://bugzilla.scilab.org/15729
33 p = %z;                         // Ignored
34 rational = %z/(1-%z);           // Ignored
35 Sparse = sprand(10,10,0.05);
36 SparseB = Sparse<0.5;           // Ignored
37 Struct = struct("age",30, "type","software");
38 Cell = {1-%i, int8(-5); rand(2,3), "Abc"};
39
40 // Saving the environment
41 // ----------------------
42 savematfile(TMPDIR+"/tmp.mat");
43 savematfile(TMPDIR+"/tmp_73.mat","-v7.3");
44
45 // Testing the actually saved set of variables
46 // -------------------------------------------
47 // version 7
48 File = TMPDIR+"/tmp.mat";
49 fd = matfile_open(File, "r");
50 [names, classes, types] = matfile_listvar(fd);
51 matfile_close(fd);
52 ref = ["Cell" "Sparse" "Struct" "c" "d" "h" "i" "k" "t"]';
53 assert_checkequal(names, ref);
54 mdelete(File);
55
56 // version 7.3
57 File = TMPDIR+"/tmp_73.mat";
58 fd = matfile_open(File, "r");
59 [names, classes, types] = matfile_listvar(fd);
60 matfile_close(fd);
61 ref = ["Cell" "Sparse" "Struct" "c" "d" "h" "i" "k" "t"]';
62 assert_checkequal(names, ref);
63 mdelete(File);
64
65 // ==========================================
66 File = TMPDIR+"/tmp.mat";
67
68 // When the output file is actually empty, it is now not created
69 // -------------------------------------------------------------
70 savematfile(File, "%z", "-v7")
71 assert_checkfalse(isfile(File));
72
73 // Some input variables were corrupted by savematfile() internal values before being saved
74 // ---------------------------------------------------------------------------------------
75 // -v4: Saving the variables flag, head, it, it1, mn, v, x, x1, M, O, P, T, MOPT
76 V = rand(1);
77 [flag, head, it, x, x1, M, O, P, T, MOPT] = (V,V,V,V,V,V,V,V,V,V);
78 // Uncomment after fixing http://bugzilla.scilab.org/15731
79 //it1 = sparse(V);
80 //[mn, v, it10, mn0, v0] = (it1, it1, it1, it1, it1);
81 [it1, mn, v] = (V,V,V);
82
83 vnames = list("flag","head","it","it1","mn","v","x","x1","M","O","P","T","MOPT");
84 savematfile(File,"-v4", vnames(:));
85 clear(vnames(:))
86 loadmatfile(File);
87 for n = vnames
88     assert_checktrue(isdef(n,"l"));
89     y = evstr(n);
90     yref = V;
91     if issparse(y), yref = sparse(V), end
92     assert_checkequal(y, yref);
93 end
94 mdelete(File);
95
96 // -v6 | 7|7.3: Saving the "vars" variable
97 vars = rand(2,3);
98 varsRef = vars;
99 for v = ["-v6" "-v7" "-v7.3"]
100     vars = varsRef;
101     savematfile(File,"vars", v);
102     sleep(1000)
103     clear vars
104     loadmatfile(File);
105     assert_checktrue(isdef("vars","l"));
106     assert_checkequal(vars, varsRef);
107     mdelete(File);
108 end
109
110 // Encoded integers were not saved in v4 format
111 // --------------------------------------------
112 T = ["int8" "uint8" "int16" "uint16" "int32" "uint32" "int64" "uint64"];
113 bm = list(int8(-%inf), 0, int16(-%inf), 0, -1e9, 0, -1e9, 0);
114 bp = list(int8(%inf), uint8(%inf), int16(%inf), uint16(%inf), -1e9, 1e9, -1e9, 1e9);
115 S.s = "1,1";
116 S.v = "1,3";
117 S.m = "2,3";
118 for i = 1:8
119     for f = ["s" "v" "m"]
120         tmp = T(i)+f+" = "+T(i)+"(grand("+S(f)+",""uin"",double(bm(i)),double(bp(i)))); "+..
121               T(i)+f+"0 = "+T(i)+f+";"; // Reference copy
122         execstr(tmp);
123     end
124 end
125 vnames = ["int8s" "uint8s" "int8v" "uint8v" "int8m" "uint8m" ..
126           "int16s" "uint16s" "int16v" "uint16v" "int16m" "uint16m" ..
127           "int32s" "uint32s" "int32v" "uint32v" "int32m" "uint32m" ..
128           "int64s" "uint64s" "int64v" "uint64v" "int64m" "uint64m"
129           ];
130 savematfile(File,"-v4", vnames);
131 clear(vnames)
132 loadmatfile(File);  // variables are well stored as the given inttype,
133                     // but are reloaded as doubles!
134 for v = vnames
135     assert_checktrue(isdef(v,"l"));
136     assert_checkequal(evstr(v), double(evstr(v+"0")));
137 end