tesseroids/test/test_parsers.c
2021-05-05 10:58:03 +08:00

230 lines
8.5 KiB
C
Executable File

/*
Unit tests for I/O parser functions.
*/
#include <stdio.h>
#include <math.h>
#include "minunit.h"
#include "../lib/parsers.h"
#include "../lib/constants.h"
/* To store fail messages */
char msg[1000];
/* UNIT TESTS */
static char * test_gets_tess()
{
int i;
char str[1000];
TESSEROID res;
TESSEROID tesses[4] = {
{1,0,1,0,1,6000000,6001000},
{1,180,190,80,85,6300000,6301000},
{1,160,200,-90,-70,5500000,6000000},
{1,-10,5,-7,15,6500000,6505000}};
for(i = 0; i < 4; i++)
{
sprintf(str, "%15.5f %15.5f %15.5f %15.5f %15.5f %15.5f %15.5f",
tesses[i].w, tesses[i].e, tesses[i].s, tesses[i].n,
tesses[i].r2 - MEAN_EARTH_RADIUS,
tesses[i].r1 - MEAN_EARTH_RADIUS,
tesses[i].density);
gets_tess(str, &res);
sprintf(msg, "(tess %d) failed to read w. read=%g true=%g diff=%g", i,
res.w, tesses[i].w, res.w - tesses[i].w);
mu_assert_almost_equals(res.w, tesses[i].w, 10E-10, msg);
sprintf(msg, "(tess %d) failed to read e. read=%g true=%g diff=%g", i,
res.e, tesses[i].e, res.e - tesses[i].e);
mu_assert_almost_equals(res.e, tesses[i].e, 10E-10, msg);
sprintf(msg, "(tess %d) failed to read s. read=%g true=%g diff=%g", i,
res.s, tesses[i].s, res.s - tesses[i].s);
mu_assert_almost_equals(res.s, tesses[i].s, 10E-10, msg);
sprintf(msg, "(tess %d) failed to read n. read=%g true=%g diff=%g", i,
res.n, tesses[i].n, res.n - tesses[i].n);
mu_assert_almost_equals(res.n, tesses[i].n, 10E-10, msg);
sprintf(msg, "(tess %d) failed to read r2. read=%g true=%g diff=%g",
i, res.r2, tesses[i].r2, res.r2 - tesses[i].r2);
mu_assert_almost_equals(res.r2, tesses[i].r2, 10E-10, msg);
sprintf(msg, "(tess %d) failed to read r1. read=%g true=%g diff=%g",
i, res.r1, tesses[i].r1, res.r1 - tesses[i].r1);
mu_assert_almost_equals(res.r1, tesses[i].r1, 10E-10, msg);
sprintf(msg, "(tess %d) failed to read dens. read=%g true=%g diff=%g",
i, res.density, tesses[i].density,
res.density - tesses[i].density);
mu_assert_almost_equals(res.density, tesses[i].density, 10E-10, msg);
}
return 0;
}
static char * test_gets_prism()
{
int i;
char str[1000];
PRISM res;
PRISM prisms[4] = {
{1,0,1000,0,2000,100,2000,0,0,0},
{1,-500,200,300,500,-1000,4000,0,0,0},
{1,-10000000,5000000,5000000,8000000,0,3000000,0,0,0},
{1,-1000000,50000,500000,800000,0,300000,0,0,0}};
for(i = 0; i < 4; i++)
{
sprintf(str, "%g %g %g %g %g %g %g", prisms[i].x1, prisms[i].x2,
prisms[i].y1, prisms[i].y2, prisms[i].z1, prisms[i].z2,
prisms[i].density);
if(gets_prism(str, &res))
{
sprintf(msg, "(prism %d) gets_prism returned 1", i);
mu_assert(0, msg);
}
sprintf(msg, "(prism %d) failed to read x1. read=%g true=%g", i, res.x1,
prisms[i].x1);
mu_assert(res.x1 == prisms[i].x1, msg);
sprintf(msg, "(prism %d) failed to read x2. read=%g true=%g", i, res.x2,
prisms[i].x2);
mu_assert(res.x2 == prisms[i].x2, msg);
sprintf(msg, "(prism %d) failed to read y1. read=%g true=%g", i, res.y1,
prisms[i].y1);
mu_assert(res.y1 == prisms[i].y1, msg);
sprintf(msg, "(prism %d) failed to read y2. read=%g true=%g", i, res.y2,
prisms[i].y2);
mu_assert(res.y2 == prisms[i].y2, msg);
sprintf(msg, "(prism %d) failed to read z1. read=%g true=%g", i, res.z1,
prisms[i].z1);
mu_assert(res.z1 == prisms[i].z1, msg);
sprintf(msg, "(prism %d) failed to read z2. read=%g true=%g", i, res.z2,
prisms[i].z2);
mu_assert(res.z2 == prisms[i].z2, msg);
sprintf(msg, "(prism %d) failed to read density. read=%g true=%g", i,
res.density, prisms[i].density);
mu_assert(res.density == prisms[i].density, msg);
}
return 0;
}
static char * test_gets_prism_sph()
{
int i;
char str[1000];
PRISM res;
PRISM prisms[4] = {
{1,-1000,1000,-2000,2000,0,2000,2,3,1},
{1,-500,500,-500,500,0,4000,-3,1.2344,18.048},
{1,-10000000,10000000,-8000000,8000000,0,3000000,2123.2,2,45.33},
{1,-50000,50000,-800000,800000,0,300000,783.245,3.57,345}};
for(i = 0; i < 4; i++)
{
sprintf(str, "%g %g %g %g %g %g %g",
prisms[i].x2 - prisms[i].x1,
prisms[i].y2 - prisms[i].y1,
prisms[i].z2 - prisms[i].z1,
prisms[i].density,
prisms[i].lon, prisms[i].lat, prisms[i].r);
if(gets_prism_sph(str, &res))
{
sprintf(msg, "(prism %d) gets_prism_sph returned 1", i);
mu_assert(0, msg);
}
sprintf(msg, "(prism %d) failed to read x1. read=%g true=%g", i, res.x1,
prisms[i].x1);
mu_assert(res.x1 == prisms[i].x1, msg);
sprintf(msg, "(prism %d) failed to read x2. read=%g true=%g", i, res.x2,
prisms[i].x2);
mu_assert(res.x2 == prisms[i].x2, msg);
sprintf(msg, "(prism %d) failed to read y1. read=%g true=%g", i, res.y1,
prisms[i].y1);
mu_assert(res.y1 == prisms[i].y1, msg);
sprintf(msg, "(prism %d) failed to read y2. read=%g true=%g", i, res.y2,
prisms[i].y2);
mu_assert(res.y2 == prisms[i].y2, msg);
sprintf(msg, "(prism %d) failed to read z1. read=%g true=%g", i, res.z1,
prisms[i].z1);
mu_assert(res.z1 == prisms[i].z1, msg);
sprintf(msg, "(prism %d) failed to read z2. read=%g true=%g", i, res.z2,
prisms[i].z2);
mu_assert(res.z2 == prisms[i].z2, msg);
sprintf(msg, "(prism %d) failed to read density. read=%g true=%g", i,
res.density, prisms[i].density);
mu_assert(res.density == prisms[i].density, msg);
sprintf(msg, "(prism %d) failed to read lon. read=%g true=%g", i,
res.lon, prisms[i].lon);
mu_assert(res.lon == prisms[i].lon, msg);
sprintf(msg, "(prism %d) failed to read lat. read=%g true=%g", i,
res.lat, prisms[i].lat);
mu_assert(res.lat == prisms[i].lat, msg);
sprintf(msg, "(prism %d) failed to read r. read=%g true=%g", i,
res.r, prisms[i].r);
mu_assert(res.r == prisms[i].r, msg);
}
return 0;
}
static char * test_gets_prism_fail()
{
int i = 0, j;
char str[1000];
PRISM res;
PRISM prisms[4] = {
{1,0,1000,0,2000,100,2000,0,0,0},
{1,-500,200,300,500,-1000,4000,0,0,0},
{1,-10000000,5000000,5000000,8000000,0,3000000,0,0,0},
{1,-1000000,50000,500000,800000,0,300000,0,0,0}};
j = 1;
sprintf(str, "%g %g %g %g %g %g %g 1", prisms[i].x1, prisms[i].x2,
prisms[i].y1, prisms[i].y2, prisms[i].z1, prisms[i].z2,
prisms[i].density);
sprintf(msg, "(test %d) gets_prism did not fail for bad input", j);
mu_assert(gets_prism(str, &res), msg);
j = 2;
sprintf(str, "%g %g %g %g %g %g %g 1.3", prisms[i].x1, prisms[i].x2,
prisms[i].y1, prisms[i].y2, prisms[i].z1, prisms[i].z2,
prisms[i].density);
sprintf(msg, "(test %d) gets_prism did not fail for bad input", j);
mu_assert(gets_prism(str, &res), msg);
j = 3;
sprintf(str, "%g %g %g %g %g %g %g meh", prisms[i].x1, prisms[i].x2,
prisms[i].y1, prisms[i].y2, prisms[i].z1, prisms[i].z2,
prisms[i].density);
sprintf(msg, "(test %d) gets_prism did not fail for bad input", j);
mu_assert(gets_prism(str, &res), msg);
j = 4;
sprintf(str, "%g %g %g %g %g %g %g 1 4.5 234556 blablabla",
prisms[i].x1, prisms[i].x2,
prisms[i].y1, prisms[i].y2, prisms[i].z1, prisms[i].z2,
prisms[i].density);
sprintf(msg, "(test %d) gets_prism did not fail for bad input", j);
mu_assert(gets_prism(str, &res), msg);
return 0;
}
int parsers_run_all()
{
int failed = 0;
failed += mu_run_test(test_gets_tess, "gets_tess reads correctly from string");
failed += mu_run_test(test_gets_prism, "gets_prism reads correctly from string");
failed += mu_run_test(test_gets_prism_sph,
"gets_prism_sph reads correctly from string");
failed += mu_run_test(test_gets_prism_fail, "gets_prism fails for bad input");
return failed;
}