* Bug #14397 fixed - mgeti did not read u-int64 > 2^52
[scilab.git] / scilab / modules / fileio / tests / unit_tests / mgeti.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
4 // Copyright (C) 2016 - Samuel GOUGEON
5 //
6 //  This file is distributed under the same license as the Scilab package.
7 // =============================================================================
8
9 // <-- CLI SHELL MODE -->
10 // <-- NO CHECK REF -->
11
12 // Read/Write int64 & uint64 with relative accuracy better than %eps = 1/2^52
13 // --------------------------------------------------------------------------
14 n = 10;
15 b = grand(64,n,"uin",0,1);
16 p = uint64(2).^ndgrid(0:63,1:n);
17 x0 = sum(b.*p, "r");
18
19 for endian = ["l" "b"]
20     for usign = ["u" ""]
21         // usign+"l"+endian
22         binfile = TMPDIR+"/mgetiTestInt64.dat";
23         idF = mopen(binfile, "w+b");
24         x = x0;
25         if usign==""
26             x = int64(x);
27         end
28         mput(x,usign+"l"+endian)
29
30         mseek(0);
31         xr = mgeti(n, usign+"l"+endian);
32         mclose(idF);
33         assert_checkequal(xr, x);
34     end
35 end
36
37
38 // Other tests
39 // -----------
40 function writedata(name, str)
41     f = mopen(TMPDIR + "/" + name + ".dat", "wb");
42     data = hex2dec(str);
43     mput(data, "uc", f);
44     mclose(f);
45 endfunction
46
47 function res = readdata(name)
48     f = mopen(TMPDIR + "/" + name + ".dat", "rb");
49     res = mgeti(3, name, f);
50     mclose(f);
51 endfunction
52 //
53 //prepare data
54 //
55
56 ul1     = uint64(123); //0x7B
57 ul2     = uint64(45678);//0xB26E
58 ul3     = uint64(123456);//0x0001E240
59 l1      = int64(-123); //0x7B
60 l2      = int64(-23456);//0xB26E
61 l3      = int64(-123456);//0x0001E240
62
63 ui1     = uint32(123); //0x7B
64 ui2     = uint32(45678);//0xB26E
65 ui3     = uint32(123456);//0x0001E240
66 i1      = int32(-123); //0x85
67 i2      = int32(-23456);//0xA460
68 i3      = int32(-123456);//0xFFFE1DC0
69 i3t     = int32(7616);//0x1DC0
70
71 us1     = uint16(123); //0x7B
72 us2     = uint16(45678);//0xB26E
73 us3     = uint16(123456);//0x0001E240
74 s1      = int16(-123); //0x85
75 s2      = int16(-23456);//0xA460
76 s3      = int16(-123456);//0xFFFE1DC0
77 s3t     = int16(7616);//0x1DC0
78
79 //unsigned long big endian
80 writedata("ulb", ["00" "00" "00" "00" "00" "00" "00" "7B" "00" "00" "00" "00" "00" "00" "B2" "6E" "00" "00" "00" "00" "00" "01" "E2" "40"]);
81 //unsigned long little endian
82 writedata("ull", ["7B" "00" "00" "00" "00" "00" "00" "00" "6E" "B2" "00" "00" "00" "00" "00" "00" "40" "E2" "01" "00" "00" "00" "00" "00"]);
83
84 //unsigned int big endian
85 writedata("uib", ["00" "00" "00" "7B" "00" "00" "B2" "6E" "00" "01" "E2" "40"]);
86 //unsigned int little endian
87 writedata("uil", ["7B" "00" "00" "00" "6E" "B2" "00" "00" "40" "E2" "01" "00"]);
88
89 //unsigned short big endian
90 writedata("usb", ["00" "7B" "B2" "6E" "E2" "40"]);
91 //unsigned short little endian
92 writedata("usl", ["7B" "00" "6E" "B2" "40" "E2"]);
93
94 //long big endian
95 writedata("lb", ["FF" "FF" "FF" "FF" "FF" "FF" "FF" "85" "FF" "FF" "FF" "FF" "FF" "FF" "A4" "60" "FF" "FF" "FF" "FF" "FF" "FE" "1D" "C0"]);
96 //long little endian
97 writedata("ll", ["85" "FF" "FF" "FF" "FF" "FF" "FF" "FF" "60" "A4" "FF" "FF" "FF" "FF" "FF" "FF" "C0" "1D" "FE" "FF" "FF" "FF" "FF" "FF"]);
98
99 //int big endian
100 writedata("ib", ["FF" "FF" "FF" "85" "FF" "FF" "A4" "60" "FF" "FE" "1D" "C0"]);
101 //int little endian
102 writedata("il", ["85" "FF" "FF" "FF" "60" "A4" "FF" "FF" "C0" "1D" "FE" "FF"]);
103
104 //short big endian
105 writedata("sb", ["FF" "85" "A4" "60" "1D" "C0"]);
106 //short little endian
107 writedata("sl", ["85" "FF" "60" "A4" "C0" "1D"]);
108
109 res = readdata("ulb");
110 assert_checkequal(res, [ul1, ul2, ul3]);
111 res = readdata("ull");
112 assert_checkequal(res, [ul1, ul2, ul3]);
113 res = readdata("lb");
114 assert_checkequal(res, [l1, l2, l3]);
115 res = readdata("ll");
116 assert_checkequal(res, [l1, l2, l3]);
117
118 res = readdata("uib");
119 assert_checkequal(res, [ui1, ui2, ui3]);
120 res = readdata("uil");
121 assert_checkequal(res, [ui1, ui2, ui3]);
122 res = readdata("usb");
123 assert_checkequal(res, [us1, us2, us3]);
124 res = readdata("usl");
125 assert_checkequal(res, [us1, us2, us3]);
126
127 res = readdata("ib");
128 assert_checkequal(res, [i1, i2, i3]);
129 res = readdata("il");
130 assert_checkequal(res, [i1, i2, i3]);
131 res = readdata("sb");
132 assert_checkequal(res, [s1, s2, s3]);
133 res = readdata("sl");
134 assert_checkequal(res, [s1, s2, s3]);
135
136 // check default output type of mgeti
137 file1 = fullfile(TMPDIR,'test1.bin');
138 fd1=mopen(file1,'wb');
139 mput(1996,'ull',fd1);
140 mclose(fd1);
141
142 fd1=mopen(file1,'rb');
143 a=mgeti(1);
144 assert_checkequal(typeof(a), "int32");
145 assert_checkequal(a, int32(1996));
146 mclose(fd1);