1 module dsurf.tests.io.savers;
2 
3 import std.file;
4 import std.math;
5 import std.algorithm;
6 
7 import dsurf.cartesian;
8 
9 import dsurf.io.loader;
10 import dsurf.io.cpsloader;
11 import dsurf.io.zmaploader;
12 import dsurf.io.iraploader;
13 
14 import dsurf.io.saver;
15 import dsurf.io.cpssaver;
16 import dsurf.io.zmapsaver;
17 import dsurf.io.irapsaver;
18 
19 unittest {
20     CartesianSurfaceLoader [string] loaders;
21     loaders["cps"]= new Cps3Loader;
22     loaders["zmap"] = new ZmapLoader;
23     loaders["irap"] = new IrapLoader;
24 
25     CartesianSurfaceSaver [string] savers;
26     savers["cps"] = new Cps3Saver;
27     savers["zmap"] = new ZmapSaver;
28     savers["irap"] = new IrapSaver;
29 
30     auto surface = new CartesianSurface;
31     surface.setHeader(10, 5, 500, 1000, 100, 200);
32 
33     import std.random: uniform;
34     import std.random: Random;
35     import std.random: unpredictableSeed;
36 
37     auto rnd = Random(unpredictableSeed);
38     foreach(i; 0..surface.nx) {
39         foreach(j; 0..surface.ny) {
40             surface.z[i][j] = uniform(-50.0f, 50.0f, rnd);
41         }
42     }
43 
44     auto path = "./test/tmp/";
45     if (!exists(path))
46         mkdir(path);
47 
48     assert(exists(path));
49 
50     foreach (format, saver; savers)
51     {
52         auto loader = loaders[format];
53         auto fileName = path ~ "surface." ~ format;
54         saver.save(surface, fileName);
55 
56         assert(loader.canLoad(fileName));
57         auto loadedSurface = loader.load(fileName);
58 
59         assert(surface.nx == loadedSurface.nx);
60         assert(surface.ny == loadedSurface.ny);
61 
62         assert(isClose(surface.xOrigin, loadedSurface.xOrigin));
63         assert(isClose(surface.yOrigin, loadedSurface.yOrigin));
64 
65         assert(isClose(surface.dx, loadedSurface.dx));
66         assert(isClose(surface.dy, loadedSurface.dy));
67 
68         foreach(i; 0..surface.nx) {
69             foreach(j; 0..surface.ny) {
70                 assert(isClose(surface.z[i][j], loadedSurface.z[i][j], 1e-5)); 
71                 // TODO we're comparing with the relative diff of a 1e-5
72                 // Check how it can be improved
73             }
74         }
75     }
76 
77     rmdirRecurse(path);    
78 }