1 /*
2  MDAL - Mesh Data Abstraction Library (MIT License)
3  Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com)
4 */
5 #include "gtest/gtest.h"
6 #include <string>
7 #include <vector>
8 
9 //mdal
10 #include "mdal.h"
11 #include "mdal_testutils.hpp"
12 
TEST(MeshSWWTest,Cairns)13 TEST( MeshSWWTest, Cairns )
14 {
15   std::string path = test_file( "/sww/anuga-viewer/cairns.sww" );
16   EXPECT_EQ( MDAL_MeshNames( path.c_str() ), "SWW:\"" + path + "\"" );
17   MDAL_MeshH m = MDAL_LoadMesh( path.c_str() );
18   ASSERT_NE( m, nullptr );
19   MDAL_Status s = MDAL_LastStatus();
20   EXPECT_EQ( MDAL_Status::None, s );
21 
22   const char *projection = MDAL_M_projection( m );
23   EXPECT_EQ( std::string( "" ), std::string( projection ) );
24 
25   std::string driverName = MDAL_M_driverName( m );
26   EXPECT_EQ( driverName, "SWW" );
27 
28   // ///////////
29   // Vertices
30   // ///////////
31   int v_count = MDAL_M_vertexCount( m );
32   EXPECT_EQ( v_count, 2579 );
33   double z = getVertexZCoordinatesAt( m, 0 );
34   EXPECT_DOUBLE_EQ( 3.1099998950958252, z );
35 
36   std::vector<double> expectedCoords =
37   {
38     368725.71875, 8129547, 3.109999895095825,
39     368745.71875, 8129547, 3.010999917984009,
40     368765.71875, 8129547, 2.920000076293945
41   };
42   EXPECT_EQ( expectedCoords.size(), 3 * 3 );
43 
44   std::vector<double> coordinates = getCoordinates( m, 3 );
45 
46   EXPECT_TRUE( compareVectors( expectedCoords, coordinates ) );
47 
48   // ///////////
49   // Faces
50   // ///////////
51   int f_count = MDAL_M_faceCount( m );
52   EXPECT_EQ( 4962, f_count );
53 
54   // test face 1
55   int f_v_count = getFaceVerticesCountAt( m, 1 );
56   EXPECT_EQ( 3, f_v_count ); //only triangles!
57   int f_v = getFaceVerticesIndexAt( m, 10, 0 );
58   EXPECT_EQ( 2531, f_v );
59   f_v = getFaceVerticesIndexAt( m, 10, 1 );
60   EXPECT_EQ( 2532, f_v );
61   f_v = getFaceVerticesIndexAt( m, 10, 2 );
62   EXPECT_EQ( 2481, f_v );
63 
64   // ///////////
65   // Bed elevation dataset
66   // ///////////
67   ASSERT_EQ( 2, MDAL_M_datasetGroupCount( m ) );
68 
69   MDAL_DatasetGroupH g = MDAL_M_datasetGroup( m, 0 );
70   ASSERT_NE( g, nullptr );
71 
72   int meta_count = MDAL_G_metadataCount( g );
73   ASSERT_EQ( 1, meta_count );
74 
75   const char *name = MDAL_G_name( g );
76   EXPECT_EQ( std::string( "Bed Elevation" ), std::string( name ) );
77 
78   bool scalar = MDAL_G_hasScalarData( g );
79   EXPECT_EQ( true, scalar );
80 
81   MDAL_DataLocation dataLocation = MDAL_G_dataLocation( g );
82   EXPECT_EQ( dataLocation, MDAL_DataLocation::DataOnVertices );
83 
84   ASSERT_EQ( 1, MDAL_G_datasetCount( g ) );
85   MDAL_DatasetH ds = MDAL_G_dataset( g, 0 );
86   ASSERT_NE( ds, nullptr );
87 
88   bool valid = MDAL_D_isValid( ds );
89   EXPECT_EQ( true, valid );
90 
91   EXPECT_FALSE( MDAL_D_hasActiveFlagCapability( ds ) );
92 
93   int count = MDAL_D_valueCount( ds );
94   ASSERT_EQ( 2579, count );
95 
96   double value = getValue( ds, 0 );
97   EXPECT_DOUBLE_EQ( 3.1099998950958252, value );
98   value = getValue( ds, 1 );
99   EXPECT_DOUBLE_EQ( 3.0109999179840088, value );
100   value = getValue( ds, 2 );
101   EXPECT_DOUBLE_EQ( 2.9200000762939453, value );
102   value = getValue( ds, 3 );
103   EXPECT_DOUBLE_EQ( 2.7599999904632568, value );
104 
105   // ///////////
106   // "Stage"
107   // ///////////
108   g = MDAL_M_datasetGroup( m, 1 );
109   ASSERT_NE( g, nullptr );
110 
111   meta_count = MDAL_G_metadataCount( g );
112   ASSERT_EQ( 1, meta_count );
113 
114   name = MDAL_G_name( g );
115   EXPECT_EQ( std::string( "stage" ), std::string( name ) );
116 
117   scalar = MDAL_G_hasScalarData( g );
118   EXPECT_EQ( true, scalar );
119 
120   dataLocation = MDAL_G_dataLocation( g );
121   EXPECT_EQ( dataLocation, MDAL_DataLocation::DataOnVertices );
122 
123   ASSERT_EQ( 51, MDAL_G_datasetCount( g ) );
124   ds = MDAL_G_dataset( g, 30 );
125   ASSERT_NE( ds, nullptr );
126 
127   valid = MDAL_D_isValid( ds );
128   EXPECT_EQ( true, valid );
129 
130   EXPECT_FALSE( MDAL_D_hasActiveFlagCapability( ds ) );
131 
132   count = MDAL_D_valueCount( ds );
133   ASSERT_EQ( 2579, count );
134 
135   value = getValue( ds, 0 );
136   EXPECT_DOUBLE_EQ( 3.9895098209381104, value );
137 
138   double min, max;
139   MDAL_D_minimumMaximum( ds, &min, &max );
140   EXPECT_DOUBLE_EQ( 0.57015693187713623, min );
141   EXPECT_DOUBLE_EQ( 6.7160892486572266, max );
142 
143   MDAL_G_minimumMaximum( g, &min, &max );
144   EXPECT_DOUBLE_EQ( 0, min );
145   EXPECT_DOUBLE_EQ( 6.7305092811584473, max );
146 
147   EXPECT_FALSE( hasReferenceTime( g ) );
148 
149   double time = MDAL_D_time( ds );
150   EXPECT_TRUE( compareDurationInHours( time, 0.083333333333 ) );
151 
152   MDAL_CloseMesh( m );
153 }
154 
TEST(MeshSWWTest,Flat)155 TEST( MeshSWWTest, Flat )
156 {
157   std::string path = test_file( "/sww/anuga-viewer/flat.sww" );
158   EXPECT_EQ( MDAL_MeshNames( path.c_str() ), "SWW:\"" + path + "\"" );
159   MDAL_MeshH m = MDAL_LoadMesh( path.c_str() );
160   ASSERT_NE( m, nullptr );
161   MDAL_Status s = MDAL_LastStatus();
162   EXPECT_EQ( MDAL_Status::None, s );
163 
164   const char *projection = MDAL_M_projection( m );
165   EXPECT_EQ( std::string( "" ), std::string( projection ) );
166 
167   std::string driverName = MDAL_M_driverName( m );
168   EXPECT_EQ( driverName, "SWW" );
169 
170   int v_count = MDAL_M_vertexCount( m );
171   EXPECT_EQ( 2579, v_count );
172   int f_count = MDAL_M_faceCount( m );
173   EXPECT_EQ( 4962, f_count );
174 
175   ASSERT_EQ( 2, MDAL_M_datasetGroupCount( m ) );
176 
177   MDAL_CloseMesh( m );
178 }
179 
180 
TEST(MeshSWWTest,Catchment)181 TEST( MeshSWWTest, Catchment )
182 {
183   std::string path = test_file( "/sww/anuga-viewer/Small_catchment_testcase.sww" );
184   EXPECT_EQ( MDAL_MeshNames( path.c_str() ), "SWW:\"" + path + "\"" );
185   MDAL_MeshH m = MDAL_LoadMesh( path.c_str() );
186   ASSERT_NE( m, nullptr );
187   MDAL_Status s = MDAL_LastStatus();
188   EXPECT_EQ( MDAL_Status::None, s );
189 
190   const char *projection = MDAL_M_projection( m );
191   EXPECT_EQ( std::string( "" ), std::string( projection ) );
192 
193   std::string driverName = MDAL_M_driverName( m );
194   EXPECT_EQ( driverName, "SWW" );
195 
196   int v_count = MDAL_M_vertexCount( m );
197   EXPECT_EQ( 19164, v_count );
198   int f_count = MDAL_M_faceCount( m );
199   EXPECT_EQ( 6388, f_count );
200 
201   ASSERT_EQ( 9, MDAL_M_datasetGroupCount( m ) );
202 
203   {
204     MDAL_DatasetGroupH g = MDAL_M_datasetGroup( m, 3 );
205     ASSERT_NE( g, nullptr );
206     EXPECT_EQ( std::string( "momentum" ), std::string( MDAL_G_name( g ) ) );
207     EXPECT_EQ( false, MDAL_G_hasScalarData( g ) );
208   }
209   {
210     MDAL_DatasetGroupH g = MDAL_M_datasetGroup( m, 4 );
211     ASSERT_NE( g, nullptr );
212     EXPECT_EQ( std::string( "momentum/Maximums" ), std::string( MDAL_G_name( g ) ) );
213     EXPECT_EQ( false, MDAL_G_hasScalarData( g ) );
214   }
215   {
216     MDAL_DatasetGroupH g = MDAL_M_datasetGroup( m, 5 );
217     ASSERT_NE( g, nullptr );
218     EXPECT_EQ( std::string( "elevation" ), std::string( MDAL_G_name( g ) ) );
219     EXPECT_EQ( true, MDAL_G_hasScalarData( g ) );
220   }
221   MDAL_CloseMesh( m );
222 }
223 
TEST(MeshSWWTest,Laminar)224 TEST( MeshSWWTest, Laminar )
225 {
226   std::string path = test_file( "/sww/anuga-viewer/laminar.sww" );
227   EXPECT_EQ( MDAL_MeshNames( path.c_str() ), "SWW:\"" + path + "\"" );
228   MDAL_MeshH m = MDAL_LoadMesh( path.c_str() );
229   ASSERT_NE( m, nullptr );
230   MDAL_Status s = MDAL_LastStatus();
231   EXPECT_EQ( MDAL_Status::None, s );
232 
233   const char *projection = MDAL_M_projection( m );
234   EXPECT_EQ( std::string( "" ), std::string( projection ) );
235 
236   std::string driverName = MDAL_M_driverName( m );
237   EXPECT_EQ( driverName, "SWW" );
238 
239   int v_count = MDAL_M_vertexCount( m );
240   EXPECT_EQ( 3721, v_count );
241   int f_count = MDAL_M_faceCount( m );
242   EXPECT_EQ( 7200, f_count );
243 
244   ASSERT_EQ( 2, MDAL_M_datasetGroupCount( m ) );
245 
246   MDAL_CloseMesh( m );
247 }
248 
TEST(MeshSWWTest,Wave)249 TEST( MeshSWWTest, Wave )
250 {
251   std::string path = test_file( "/sww/anuga-viewer/holl_bch_wave_mesh_elevation_smooth_ys10.0_ft500.0_size4802.sww" );
252   EXPECT_EQ( MDAL_MeshNames( path.c_str() ), "SWW:\"" + path + "\"" );
253   MDAL_MeshH m = MDAL_LoadMesh( path.c_str() );
254   ASSERT_NE( m, nullptr );
255   MDAL_Status s = MDAL_LastStatus();
256   EXPECT_EQ( MDAL_Status::None, s );
257 
258   const char *projection = MDAL_M_projection( m );
259   EXPECT_EQ( std::string( "" ), std::string( projection ) );
260 
261   std::string driverName = MDAL_M_driverName( m );
262   EXPECT_EQ( driverName, "SWW" );
263 
264   int v_count = MDAL_M_vertexCount( m );
265   EXPECT_EQ( 2500, v_count );
266   int f_count = MDAL_M_faceCount( m );
267   EXPECT_EQ( 4802, f_count );
268 
269   ASSERT_EQ( 2, MDAL_M_datasetGroupCount( m ) );
270 
271   MDAL_CloseMesh( m );
272 }
273 
main(int argc,char ** argv)274 int main( int argc, char **argv )
275 {
276   testing::InitGoogleTest( &argc, argv );
277   init_test();
278   int ret =  RUN_ALL_TESTS();
279   finalize_test();
280   return ret;
281 }
282 
283