meta: re-organise tests
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
#include <fx/core/stream.h>
|
||||
#include <fx/ds/array.h>
|
||||
#include <fx/ds/dict.h>
|
||||
#include <fx/ds/number.h>
|
||||
#include <fx/ds/string.h>
|
||||
#include <fx/serial.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
fx_serial_ctx *ctx = fx_toml_serial_ctx_create();
|
||||
|
||||
fx_dict *dict = fx_dict_create();
|
||||
|
||||
fx_array *array = fx_array_create();
|
||||
fx_array_append(array, FX_RV_INT(32));
|
||||
fx_array_append(array, FX_RV_INT(64));
|
||||
fx_array_append(array, FX_RV_INT(128));
|
||||
|
||||
fx_dict_put(dict, "numbers", FX_RV(array));
|
||||
|
||||
array = fx_array_create();
|
||||
fx_array_append(array, FX_RV_CSTR("hello"));
|
||||
fx_array_append(array, FX_RV_CSTR("world"));
|
||||
|
||||
fx_dict_put(dict, "strings", FX_RV(array));
|
||||
|
||||
fx_object_to_string(dict, fx_stdout);
|
||||
fx_stream_write_char(fx_stdout, '\n');
|
||||
|
||||
fx_serial_ctx_serialise(ctx, dict, fx_stdout, 0);
|
||||
|
||||
fx_dict_unref(dict);
|
||||
fx_serial_ctx_unref(ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,249 @@
|
||||
#include <fx/ds/array.h>
|
||||
#include <fx/ds/datetime.h>
|
||||
#include <fx/ds/dict.h>
|
||||
#include <fx/ds/number.h>
|
||||
#include <fx/ds/string.h>
|
||||
#include <fx/serial.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
void write_tagged_value(fx_object *data);
|
||||
|
||||
void write_raw_string(const fx_string *data)
|
||||
{
|
||||
fx_stream_write_cstr(fx_stdout, "\"", NULL);
|
||||
|
||||
const fx_iterator *it = fx_iterator_cbegin(data);
|
||||
fx_foreach_c(fx_wchar, c, it)
|
||||
{
|
||||
if (c >= 0x10000) {
|
||||
c -= 0x10000;
|
||||
long hi = 0xD800 | ((c >> 10) & 0x3FF);
|
||||
long lo = 0xDC00 | (c & 0x3FF);
|
||||
fx_stream_write_fmt(
|
||||
fx_stdout,
|
||||
NULL,
|
||||
"\\u%04x\\u%04x",
|
||||
hi,
|
||||
lo);
|
||||
} else if (c <= 0x1F || c >= 0x7F) {
|
||||
fx_stream_write_fmt(fx_stdout, NULL, "\\u%04x", c);
|
||||
} else if (c == '\\' || c == '"') {
|
||||
fx_stream_write_fmt(fx_stdout, NULL, "\\%c", c);
|
||||
} else {
|
||||
fx_stream_write_char(fx_stdout, c);
|
||||
}
|
||||
}
|
||||
fx_iterator_unref(it);
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, "\"", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_string(fx_string *data)
|
||||
{
|
||||
fx_stream_write_cstr(
|
||||
fx_stdout,
|
||||
"{ \"type\": \"string\", \"value\": ",
|
||||
NULL);
|
||||
|
||||
write_raw_string(data);
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, " }", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_integer(fx_number *data)
|
||||
{
|
||||
fx_stream_write_cstr(
|
||||
fx_stdout,
|
||||
"{ \"type\": \"integer\", \"value\": \"",
|
||||
NULL);
|
||||
|
||||
if (fx_number_is_inf_positive(data)) {
|
||||
fx_stream_write_cstr(fx_stdout, "inf", NULL);
|
||||
} else if (fx_number_is_inf_negative(data)) {
|
||||
fx_stream_write_cstr(fx_stdout, "-inf", NULL);
|
||||
} else if (fx_number_is_nan_positive(data)) {
|
||||
fx_stream_write_cstr(fx_stdout, "nan", NULL);
|
||||
} else if (fx_number_is_nan_negative(data)) {
|
||||
fx_stream_write_cstr(fx_stdout, "-nan", NULL);
|
||||
} else {
|
||||
fx_stream_write_fmt(
|
||||
fx_stdout,
|
||||
NULL,
|
||||
"%lld",
|
||||
fx_number_get_longlong(data),
|
||||
NULL);
|
||||
}
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, "\" }", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_float(fx_number *data)
|
||||
{
|
||||
fx_stream_write_cstr(
|
||||
fx_stdout,
|
||||
"{ \"type\": \"float\", \"value\": \"",
|
||||
NULL);
|
||||
|
||||
if (fx_number_is_inf_positive(data)) {
|
||||
fx_stream_write_cstr(fx_stdout, "inf", NULL);
|
||||
} else if (fx_number_is_inf_negative(data)) {
|
||||
fx_stream_write_cstr(fx_stdout, "-inf", NULL);
|
||||
} else if (fx_number_is_nan_positive(data)) {
|
||||
fx_stream_write_cstr(fx_stdout, "nan", NULL);
|
||||
} else if (fx_number_is_nan_negative(data)) {
|
||||
fx_stream_write_cstr(fx_stdout, "-nan", NULL);
|
||||
} else {
|
||||
double v = fx_number_get_double(data);
|
||||
if ((v <= 0.00000001 && v > 0) || (v >= -0.00000001 && v < 0)
|
||||
|| (v >= 1000000000) || (v <= -1000000000)) {
|
||||
fx_stream_write_fmt(fx_stdout, NULL, "%.15e", v, NULL);
|
||||
} else {
|
||||
fx_stream_write_fmt(fx_stdout, NULL, "%.15f", v, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, "\" }", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_bool(fx_number *data)
|
||||
{
|
||||
int v = fx_number_get_int8(data);
|
||||
fx_stream_write_fmt(
|
||||
fx_stdout,
|
||||
NULL,
|
||||
"{ \"type\": \"bool\", \"value\": \"%s\" }",
|
||||
(v > 0) ? "true" : "false",
|
||||
NULL);
|
||||
}
|
||||
|
||||
void write_tagged_datetime(fx_datetime *data)
|
||||
{
|
||||
bool has_date = fx_datetime_has_date(data);
|
||||
bool has_time = fx_datetime_has_time(data);
|
||||
bool localtime = fx_datetime_is_localtime(data);
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, "{ \"type\": \"", NULL);
|
||||
|
||||
if (has_date && has_time) {
|
||||
fx_stream_write_cstr(
|
||||
fx_stdout,
|
||||
localtime ? "datetime-local" : "datetime",
|
||||
NULL);
|
||||
} else if (has_date) {
|
||||
fx_stream_write_cstr(
|
||||
fx_stdout,
|
||||
localtime ? "date-local" : "date",
|
||||
NULL);
|
||||
} else if (has_time) {
|
||||
fx_stream_write_cstr(
|
||||
fx_stdout,
|
||||
localtime ? "time-local" : "time",
|
||||
NULL);
|
||||
}
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, "\", \"value\": \"", NULL);
|
||||
|
||||
fx_string *new_data = fx_string_create();
|
||||
fx_datetime_to_string(data, FX_DATETIME_FORMAT_RFC3339, new_data);
|
||||
fx_stream_write_cstr(fx_stdout, fx_string_get_cstr(new_data), NULL);
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, "\" }", NULL);
|
||||
|
||||
fx_string_unref(new_data);
|
||||
}
|
||||
|
||||
void write_tagged_dict(fx_dict *data)
|
||||
{
|
||||
fx_stream_write_cstr(fx_stdout, "{ ", NULL);
|
||||
|
||||
int i = 0;
|
||||
|
||||
fx_iterator *it = fx_iterator_begin(data);
|
||||
fx_foreach(fx_dict_item *, item, it)
|
||||
{
|
||||
if (i++ > 0) {
|
||||
fx_stream_write_cstr(fx_stdout, ", ", NULL);
|
||||
}
|
||||
|
||||
write_raw_string(item->key);
|
||||
fx_stream_write_cstr(fx_stdout, ": ", NULL);
|
||||
write_tagged_value(item->value);
|
||||
}
|
||||
fx_iterator_unref(it);
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, " }", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_array(fx_array *data)
|
||||
{
|
||||
fx_stream_write_cstr(fx_stdout, "[ ", NULL);
|
||||
|
||||
int i = 0;
|
||||
fx_iterator *it = fx_iterator_begin(data);
|
||||
fx_foreach(fx_object *, obj, it)
|
||||
{
|
||||
if (i++ > 0) {
|
||||
fx_stream_write_cstr(fx_stdout, ", ", NULL);
|
||||
}
|
||||
|
||||
write_tagged_value(obj);
|
||||
}
|
||||
fx_iterator_unref(it);
|
||||
|
||||
fx_stream_write_cstr(fx_stdout, " ]", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_value(fx_object *data)
|
||||
{
|
||||
if (fx_object_is_type(data, FX_TYPE_DICT)) {
|
||||
write_tagged_dict(data);
|
||||
|
||||
} else if (fx_object_is_type(data, FX_TYPE_ARRAY)) {
|
||||
write_tagged_array(data);
|
||||
|
||||
} else if (fx_object_is_type(data, FX_TYPE_STRING)) {
|
||||
write_tagged_string(data);
|
||||
|
||||
} else if (fx_object_is_type(data, FX_TYPE_DATETIME)) {
|
||||
write_tagged_datetime(data);
|
||||
|
||||
} else if (fx_object_is_type(data, FX_TYPE_NUMBER)) {
|
||||
switch (fx_number_get_number_type(data)) {
|
||||
case FX_NUMBER_LONGLONG:
|
||||
write_tagged_integer(data);
|
||||
break;
|
||||
case FX_NUMBER_INT8:
|
||||
write_tagged_bool(data);
|
||||
break;
|
||||
case FX_NUMBER_DOUBLE:
|
||||
write_tagged_float(data);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
fx_stream *src = fx_stdin;
|
||||
fx_stream *dest = fx_stdout;
|
||||
|
||||
fx_serial_ctx *ctx = fx_toml_serial_ctx_create();
|
||||
|
||||
fx_object *data;
|
||||
fx_result result = fx_serial_ctx_deserialise(ctx, src, &data, 0);
|
||||
if (fx_result_is_error(result)) {
|
||||
fx_throw(result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
write_tagged_value(data);
|
||||
|
||||
fx_stream_write_char(fx_stdout, '\n');
|
||||
|
||||
fx_serial_ctx_unref(ctx);
|
||||
fx_object_unref(data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
#include <fx/serial.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
fx_stream *src = fx_stdin;
|
||||
fx_stream *dest = fx_stdout;
|
||||
|
||||
#if 0
|
||||
fx_serial_ctx *ctx;
|
||||
fx_serial_ctx_create(&ctx);
|
||||
|
||||
fx_object *data;
|
||||
fx_status status = fx_serial_ctx_deserialise(
|
||||
ctx, FX_SERIAL_FORMAT_JSON, src, &data, 0);
|
||||
if (!FX_OK(status)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
fx_to_string(FX_OBJECT(data), dest);
|
||||
fx_stream_write_char(fx_stdout, '\n');
|
||||
|
||||
fx_release(data);
|
||||
fx_serial_ctx_destroy(ctx);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user