server/src/json.test.c

136 lines
3.8 KiB
C
Raw Normal View History

#include <platform.h>
#include <CuTest.h>
#include <stream.h>
#include <memstream.h>
#include <kernel/region.h>
#include <kernel/terrain.h>
2014-03-16 22:34:05 +01:00
#include "json.h"
#include "tests.h"
2014-03-16 22:34:05 +01:00
#include <cJSON.h>
#include <stdlib.h>
2014-03-16 22:34:05 +01:00
#include <string.h>
#include <ctype.h>
static char *strip(char *str) {
char *s = str, *b = str, *e = str;
// b is where text begins, e where it ends, s where we insert it.
for (; *b && isspace(*b); ++b) {};
for (e = b; *e && !isspace(*e); ++e) {};
while (*b) {
if (s != b) {
memcpy(s, b, e - b);
}
s += e - b;
for (b = e; *b && isspace(*b); ++b) {};
for (e = b; *e && !isspace(*e); ++e) {};
}
*s = 0;
return str;
}
static void test_export_no_regions(CuTest * tc) {
char buf[1024];
stream out = { 0 };
int err;
2014-11-04 07:57:29 +01:00
size_t len;
mstream_init(&out);
err = json_export(&out, EXPORT_REGIONS);
CuAssertIntEquals(tc, 0, err);
out.api->rewind(out.handle);
2014-11-04 07:57:29 +01:00
len = out.api->read(out.handle, buf, sizeof(buf));
buf[len] = '\0';
CuAssertStrEquals(tc, "{}", strip(buf));
mstream_done(&out);
2014-12-30 23:49:50 +01:00
test_cleanup();
}
static cJSON *export_a_region(CuTest * tc, const struct terrain_type *terrain, region **_r) {
char buf[1024];
stream out = { 0 };
int err;
region *r;
cJSON *json, *attr;
r = test_create_region(0, 0, terrain);
mstream_init(&out);
err = json_export(&out, EXPORT_REGIONS);
CuAssertIntEquals(tc, 0, err);
out.api->rewind(out.handle);
out.api->read(out.handle, buf, sizeof(buf));
mstream_done(&out);
json = cJSON_Parse(buf);
CuAssertPtrNotNull(tc, json);
CuAssertIntEquals(tc, cJSON_Object, json->type);
CuAssertPtrEquals(tc, 0, cJSON_GetObjectItem(json, "factions"));
CuAssertPtrEquals(tc, 0, cJSON_GetObjectItem(json, "units"));
CuAssertPtrNotNull(tc, json = cJSON_GetObjectItem(json, "regions"));
CuAssertIntEquals(tc, cJSON_Object, json->type);
json = json->child;
CuAssertIntEquals(tc, r->uid, atoi(json->string));
CuAssertPtrNotNull(tc, attr = cJSON_GetObjectItem(json, "x"));
CuAssertIntEquals(tc, r->x, attr->valueint);
CuAssertPtrNotNull(tc, attr = cJSON_GetObjectItem(json, "y"));
CuAssertIntEquals(tc, r->y, attr->valueint);
CuAssertPtrNotNull(tc, attr = cJSON_GetObjectItem(json, "type"));
CuAssertStrEquals(tc, terrain->_name, attr->valuestring);
if (_r) *_r = r;
return json;
}
static void test_export_land_region(CuTest * tc) {
region *r;
struct terrain_type *terrain;
cJSON *json, *attr;
test_cleanup();
terrain = test_create_terrain("plain", LAND_REGION);
json = export_a_region(tc, terrain, &r);
CuAssertPtrNotNull(tc, attr = cJSON_GetObjectItem(json, "name"));
CuAssertStrEquals(tc, r->land->name, attr->valuestring);
cJSON_Delete(json);
2014-12-30 23:49:50 +01:00
test_cleanup();
}
static void test_export_ocean_region(CuTest * tc) {
struct terrain_type *terrain;
cJSON *json;
test_cleanup();
terrain = test_create_terrain("ocean", SEA_REGION);
json = export_a_region(tc, terrain, 0);
CuAssertPtrEquals(tc, 0, cJSON_GetObjectItem(json, "name"));
cJSON_Delete(json);
2014-12-30 23:49:50 +01:00
test_cleanup();
}
static void test_export_no_factions(CuTest * tc) {
char buf[1024];
stream out = { 0 };
int err;
size_t len;
mstream_init(&out);
err = json_export(&out, EXPORT_FACTIONS);
CuAssertIntEquals(tc, 0, err);
out.api->rewind(out.handle);
len = out.api->read(out.handle, buf, sizeof(buf));
buf[len] = 0;
CuAssertStrEquals(tc, "{}", strip(buf));
mstream_done(&out);
2014-12-30 23:49:50 +01:00
test_cleanup();
}
CuSuite *get_json_suite(void) {
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_export_no_regions);
SUITE_ADD_TEST(suite, test_export_ocean_region);
SUITE_ADD_TEST(suite, test_export_land_region);
SUITE_ADD_TEST(suite, test_export_no_factions);
return suite;
}