commit 6f76e531cbc5113f3228755db81528096dfffbd0
parent c19eb02ef78e13b4b5290a2ce4dd48c50fb318d0
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 18 Dec 2017 10:47:33 +0100
Test the interface API
Diffstat:
5 files changed, 147 insertions(+), 13 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -101,6 +101,7 @@ if(NOT NO_TEST)
new_test(test_sdis_data)
new_test(test_sdis_device)
+ new_test(test_sdis_interface)
new_test(test_sdis_medium)
endif()
diff --git a/src/sdis.h b/src/sdis.h
@@ -100,7 +100,7 @@ typedef void
/* Functor type to retrieve the interface properties. */
typedef void
(*sdis_interface_getter_T)
- (struct sdis_device dev,
+ (struct sdis_device* dev,
struct sdis_data* data,
const struct sdis_interface_fragment* frag,
double* val);
diff --git a/src/sdis_interface.c b/src/sdis_interface.c
@@ -37,12 +37,25 @@ check_interface_shader
const struct sdis_medium* front,
const struct sdis_medium* back)
{
+ enum sdis_medium_type type0;
+ enum sdis_medium_type type1;
ASSERT(shader && front && back);
- if(sdis_medium_get_type(front) != sdis_medium_get_type(back)
- && shader->convection_coef == NULL) { /* Fluid<->solid interface */
+ type0 = sdis_medium_get_type(front);
+ type1 = sdis_medium_get_type(back);
+
+ /* Fluid<->solid interface */
+ if(type0 != type1 && shader->convection_coef == NULL) {
return 0;
}
+
+ /* Solid<->solid interface */
+ if(type0 == SDIS_MEDIUM_SOLID
+ && type1 == SDIS_MEDIUM_SOLID
+ && shader->convection_coef) {
+ return 0;
+ }
+
return 1;
}
diff --git a/src/test_sdis_interface.c b/src/test_sdis_interface.c
@@ -0,0 +1,103 @@
+/* Copyright (C) |Meso|Star> 2016-2017 (contact@meso-star.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "sdis.h"
+#include "test_sdis_utils.h"
+
+int
+main(int argc, char** argv)
+{
+ struct mem_allocator allocator;
+ struct sdis_device* dev = NULL;
+ struct sdis_medium* fluid = NULL;
+ struct sdis_medium* solid = NULL;
+ struct sdis_interface* interface = NULL;
+ struct sdis_fluid_shader fluid_shader = DUMMY_FLUID_SHADER;
+ struct sdis_solid_shader solid_shader = DUMMY_SOLID_SHADER;
+ struct sdis_interface_shader shader = DUMMY_INTERFACE_SHADER;
+ (void)argc, (void)argv;
+
+ CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK);
+ CHK(sdis_device_create
+ (NULL, &allocator, SDIS_NTHREADS_DEFAULT, 0, &dev) == RES_OK);
+
+ CHK(sdis_fluid_create(dev, &fluid_shader, NULL, &fluid) == RES_OK);
+ CHK(sdis_solid_create(dev, &solid_shader, NULL, &solid) == RES_OK);
+
+ #define CREATE sdis_interface_create
+ CHK(CREATE(NULL, NULL, NULL, NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(dev, NULL, NULL, NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, solid, NULL, NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(dev, solid, NULL, NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, NULL, fluid, NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(dev, NULL, fluid, NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, solid, fluid, NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(dev, solid, fluid, NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, NULL, NULL, &shader, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(dev, NULL, NULL, &shader, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, solid, NULL, &shader, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(dev, solid, NULL, &shader, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, NULL, fluid, &shader, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(dev, NULL, fluid, &shader, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, solid, fluid, &shader, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(dev, solid, fluid, &shader, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, NULL, NULL, NULL, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(dev, NULL, NULL, NULL, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(NULL, solid, NULL, NULL, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(dev, solid, NULL, NULL, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(NULL, NULL, fluid, NULL, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(dev, NULL, fluid, NULL, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(NULL, solid, fluid, NULL, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(dev, solid, fluid, NULL, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(NULL, NULL, NULL, &shader, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(dev, NULL, NULL, &shader, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(NULL, solid, NULL, &shader, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(dev, solid, NULL, &shader, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(NULL, NULL, fluid, &shader, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(dev, NULL, fluid, &shader, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(NULL, solid, fluid, &shader, NULL, &interface) == RES_BAD_ARG);
+ CHK(CREATE(dev, solid, fluid, &shader, NULL, &interface) == RES_OK);
+
+ CHK(sdis_interface_ref_get(NULL) == RES_BAD_ARG);
+ CHK(sdis_interface_ref_get(interface) == RES_OK);
+ CHK(sdis_interface_ref_put(NULL) == RES_BAD_ARG);
+ CHK(sdis_interface_ref_put(interface) == RES_OK);
+ CHK(sdis_interface_ref_put(interface) == RES_OK);
+
+ CHK(CREATE(dev, solid, solid, &shader, NULL, &interface) == RES_BAD_ARG);
+ shader.convection_coef = NULL;
+ CHK(CREATE(dev, solid, solid, &shader, NULL, &interface) == RES_OK);
+ CHK(sdis_interface_ref_put(interface) == RES_OK);
+
+ shader.temperature = NULL;
+ CHK(CREATE(dev, solid, solid, &shader, NULL, &interface) == RES_OK);
+ CHK(sdis_interface_ref_put(interface) == RES_OK);
+
+ CHK(CREATE(dev, solid, fluid, &shader, NULL, &interface) == RES_BAD_ARG);
+ shader.convection_coef = DUMMY_INTERFACE_SHADER.convection_coef;
+ CHK(CREATE(dev, solid, fluid, &shader, NULL, &interface) == RES_OK);
+ CHK(sdis_interface_ref_put(interface) == RES_OK);
+ #undef CREATE
+
+ CHK(sdis_device_ref_put(dev) == RES_OK);
+ CHK(sdis_medium_ref_put(fluid) == RES_OK);
+ CHK(sdis_medium_ref_put(solid) == RES_OK);
+
+ check_memory_allocator(&allocator);
+ mem_shutdown_proxy_allocator(&allocator);
+ CHK(mem_allocated_size() == 0);
+ return 0;
+}
+
diff --git a/src/test_sdis_utils.h b/src/test_sdis_utils.h
@@ -20,7 +20,7 @@
#include <stdio.h>
static INLINE void
-dummy_getter
+dummy_medium_getter
(struct sdis_device* dev,
struct sdis_data* data,
const struct sdis_rwalk_vertex* vert,
@@ -31,19 +31,36 @@ dummy_getter
*val = 1;
}
+static INLINE void
+dummy_interface_getter
+ (struct sdis_device* dev,
+ struct sdis_data* data,
+ const struct sdis_interface_fragment* frag,
+ double* val)
+{
+ (void)dev, (void)data;
+ CHK(val != NULL && frag != NULL);
+ *val = 1;
+}
+
static const struct sdis_solid_shader DUMMY_SOLID_SHADER = {
- dummy_getter,
- dummy_getter,
- dummy_getter,
- dummy_getter,
- dummy_getter,
- dummy_getter
+ dummy_medium_getter,
+ dummy_medium_getter,
+ dummy_medium_getter,
+ dummy_medium_getter,
+ dummy_medium_getter,
+ dummy_medium_getter
};
static const struct sdis_fluid_shader DUMMY_FLUID_SHADER = {
- dummy_getter,
- dummy_getter,
- dummy_getter
+ dummy_medium_getter,
+ dummy_medium_getter,
+ dummy_medium_getter
+};
+
+static const struct sdis_interface_shader DUMMY_INTERFACE_SHADER = {
+ dummy_interface_getter,
+ dummy_interface_getter
};
static INLINE void