test: add and update a few tests
This commit is contained in:
@@ -32,7 +32,7 @@ int main(void)
|
||||
b_dict_iterator it;
|
||||
b_dict_foreach(&it, dict)
|
||||
{
|
||||
printf("item %zu: %s=%d\n", it.i, it.key,
|
||||
printf("item %zu: %s=%d\n", it.i, b_string_ptr(it.key),
|
||||
b_number_get_int(B_NUMBER(it.value)));
|
||||
}
|
||||
|
||||
|
||||
26
object-test/unicode-strings.c
Normal file
26
object-test/unicode-strings.c
Normal file
@@ -0,0 +1,26 @@
|
||||
#include <blue/core/stringstream.h>
|
||||
#include <blue/object/string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
printf("здравс\u26A0твуите\n");
|
||||
b_string *str = b_string_create_from_cstr("здравствуите");
|
||||
const char *s = b_string_ptr(str);
|
||||
printf("%s\n", s);
|
||||
printf("len: %zu\n", b_string_get_size(str, B_STRLEN_NORMAL));
|
||||
printf("codepoints: %zu\n", b_string_get_size(str, B_STRLEN_CODEPOINTS));
|
||||
|
||||
b_string_iterator it;
|
||||
const char *delims[] = {"в"};
|
||||
size_t nr_delims = sizeof delims / sizeof delims[0];
|
||||
|
||||
b_string_tokenise(str, delims, nr_delims, 0, &it);
|
||||
while (b_string_iterator_is_valid(&it)) {
|
||||
printf("%s\n", it.string_value);
|
||||
b_string_iterator_next(&it);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
233
serial-test/toml-decode.c
Normal file
233
serial-test/toml-decode.c
Normal file
@@ -0,0 +1,233 @@
|
||||
#include "blue/object/datetime.h"
|
||||
|
||||
#include <blue/object/array.h>
|
||||
#include <blue/object/dict.h>
|
||||
#include <blue/object/number.h>
|
||||
#include <blue/object/object.h>
|
||||
#include <blue/object/string.h>
|
||||
#include <blue/object/type.h>
|
||||
#include <blue/serial.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
void write_tagged_value(b_object *data);
|
||||
|
||||
void write_raw_string(const b_string *data)
|
||||
{
|
||||
b_stream_write_string(b_stdout, "\"", NULL);
|
||||
|
||||
b_string_iterator it;
|
||||
b_string_foreach(&it, data)
|
||||
{
|
||||
b_wchar c = it.char_value;
|
||||
|
||||
if (c >= 0x10000) {
|
||||
c -= 0x10000;
|
||||
long hi = 0xD800 | ((c >> 10) & 0x3FF);
|
||||
long lo = 0xDC00 | (c & 0x3FF);
|
||||
b_stream_write_fmt(b_stdout, NULL, "\\u%04x\\u%04x", hi, lo);
|
||||
} else if (c <= 0x1F || c >= 0x7F) {
|
||||
b_stream_write_fmt(b_stdout, NULL, "\\u%04x", c);
|
||||
} else if (c == '\\' || c == '"') {
|
||||
b_stream_write_fmt(b_stdout, NULL, "\\%c", c);
|
||||
} else {
|
||||
b_stream_write_char(b_stdout, c);
|
||||
}
|
||||
}
|
||||
|
||||
b_stream_write_string(b_stdout, "\"", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_string(b_string *data)
|
||||
{
|
||||
b_stream_write_string(b_stdout, "{ \"type\": \"string\", \"value\": ", NULL);
|
||||
|
||||
write_raw_string(data);
|
||||
|
||||
b_stream_write_string(b_stdout, " }", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_integer(b_number *data)
|
||||
{
|
||||
b_stream_write_string(
|
||||
b_stdout, "{ \"type\": \"integer\", \"value\": \"", NULL);
|
||||
|
||||
if (b_number_is_inf_positive(data)) {
|
||||
b_stream_write_string(b_stdout, "inf", NULL);
|
||||
} else if (b_number_is_inf_negative(data)) {
|
||||
b_stream_write_string(b_stdout, "-inf", NULL);
|
||||
} else if (b_number_is_nan_positive(data)) {
|
||||
b_stream_write_string(b_stdout, "nan", NULL);
|
||||
} else if (b_number_is_nan_negative(data)) {
|
||||
b_stream_write_string(b_stdout, "-nan", NULL);
|
||||
} else {
|
||||
b_stream_write_fmt(
|
||||
b_stdout, NULL, "%lld", b_number_get_longlong(data), NULL);
|
||||
}
|
||||
|
||||
b_stream_write_string(b_stdout, "\" }", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_float(b_number *data)
|
||||
{
|
||||
b_stream_write_string(
|
||||
b_stdout, "{ \"type\": \"float\", \"value\": \"", NULL);
|
||||
|
||||
if (b_number_is_inf_positive(data)) {
|
||||
b_stream_write_string(b_stdout, "inf", NULL);
|
||||
} else if (b_number_is_inf_negative(data)) {
|
||||
b_stream_write_string(b_stdout, "-inf", NULL);
|
||||
} else if (b_number_is_nan_positive(data)) {
|
||||
b_stream_write_string(b_stdout, "nan", NULL);
|
||||
} else if (b_number_is_nan_negative(data)) {
|
||||
b_stream_write_string(b_stdout, "-nan", NULL);
|
||||
} else {
|
||||
double v = b_number_get_double(data);
|
||||
if ((v <= 0.00000001 && v > 0) || (v >= -0.00000001 && v < 0)
|
||||
|| (v >= 1000000000) || (v <= -1000000000)) {
|
||||
b_stream_write_fmt(b_stdout, NULL, "%.15e", v, NULL);
|
||||
} else {
|
||||
b_stream_write_fmt(b_stdout, NULL, "%.15f", v, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
b_stream_write_string(b_stdout, "\" }", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_bool(b_number *data)
|
||||
{
|
||||
int v = b_number_get_int8(data);
|
||||
b_stream_write_fmt(
|
||||
b_stdout, NULL, "{ \"type\": \"bool\", \"value\": \"%s\" }",
|
||||
(v > 0) ? "true" : "false", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_datetime(b_datetime *data)
|
||||
{
|
||||
bool has_date = b_datetime_has_date(data);
|
||||
bool has_time = b_datetime_has_time(data);
|
||||
bool localtime = b_datetime_is_localtime(data);
|
||||
|
||||
b_stream_write_string(b_stdout, "{ \"type\": \"", NULL);
|
||||
|
||||
if (has_date && has_time) {
|
||||
b_stream_write_string(
|
||||
b_stdout, localtime ? "datetime-local" : "datetime", NULL);
|
||||
} else if (has_date) {
|
||||
b_stream_write_string(
|
||||
b_stdout, localtime ? "date-local" : "date", NULL);
|
||||
} else if (has_time) {
|
||||
b_stream_write_string(
|
||||
b_stdout, localtime ? "time-local" : "time", NULL);
|
||||
}
|
||||
|
||||
b_stream_write_string(b_stdout, "\", \"value\": \"", NULL);
|
||||
|
||||
b_string *new_data = b_string_create();
|
||||
b_datetime_to_string(data, B_DATETIME_FORMAT_RFC3339, new_data);
|
||||
b_stream_write_string(b_stdout, b_string_ptr(new_data), NULL);
|
||||
|
||||
b_stream_write_string(b_stdout, "\" }", NULL);
|
||||
|
||||
b_string_release(new_data);
|
||||
}
|
||||
|
||||
void write_tagged_dict(b_dict *data)
|
||||
{
|
||||
b_stream_write_string(b_stdout, "{ ", NULL);
|
||||
|
||||
int i = 0;
|
||||
|
||||
b_dict_iterator it;
|
||||
b_dict_foreach(&it, data)
|
||||
{
|
||||
if (i++ > 0) {
|
||||
b_stream_write_string(b_stdout, ", ", NULL);
|
||||
}
|
||||
|
||||
write_raw_string(it.key);
|
||||
b_stream_write_string(b_stdout, ": ", NULL);
|
||||
write_tagged_value(it.value);
|
||||
}
|
||||
|
||||
b_stream_write_string(b_stdout, " }", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_array(b_array *data)
|
||||
{
|
||||
b_stream_write_string(b_stdout, "[ ", NULL);
|
||||
|
||||
int i = 0;
|
||||
b_array_iterator it;
|
||||
b_array_foreach(&it, data)
|
||||
{
|
||||
if (i++ > 0) {
|
||||
b_stream_write_string(b_stdout, ", ", NULL);
|
||||
}
|
||||
|
||||
write_tagged_value(it.value);
|
||||
}
|
||||
|
||||
b_stream_write_string(b_stdout, " ]", NULL);
|
||||
}
|
||||
|
||||
void write_tagged_value(b_object *data)
|
||||
{
|
||||
b_object_type_id typeid = B_TYPEID(data);
|
||||
|
||||
switch (typeid) {
|
||||
case B_OBJECT_TYPE_DICT:
|
||||
write_tagged_dict(B_DICT(data));
|
||||
break;
|
||||
case B_OBJECT_TYPE_ARRAY:
|
||||
write_tagged_array(B_ARRAY(data));
|
||||
break;
|
||||
case B_OBJECT_TYPE_STRING:
|
||||
write_tagged_string(B_STRING(data));
|
||||
break;
|
||||
case B_OBJECT_TYPE_DATETIME:
|
||||
write_tagged_datetime(B_DATETIME(data));
|
||||
break;
|
||||
case B_OBJECT_TYPE_NUMBER:
|
||||
switch (b_number_get_type(B_NUMBER(data))) {
|
||||
case B_NUMBER_LONGLONG:
|
||||
write_tagged_integer(B_NUMBER(data));
|
||||
break;
|
||||
case B_NUMBER_INT8:
|
||||
write_tagged_bool(B_NUMBER(data));
|
||||
break;
|
||||
case B_NUMBER_DOUBLE:
|
||||
write_tagged_float(B_NUMBER(data));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
b_stream *src = b_stdin;
|
||||
b_stream *dest = b_stdout;
|
||||
|
||||
b_serial_ctx *ctx;
|
||||
b_serial_ctx_create(&ctx);
|
||||
|
||||
b_object *data;
|
||||
b_status status = b_serial_ctx_deserialise(
|
||||
ctx, B_SERIAL_FORMAT_TOML, src, &data, 0);
|
||||
if (!B_OK(status)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
write_tagged_value(data);
|
||||
|
||||
b_stream_write_char(b_stdout, '\n');
|
||||
|
||||
b_serial_ctx_destroy(ctx);
|
||||
b_release(data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
28
serial-test/toml-encode.c
Normal file
28
serial-test/toml-encode.c
Normal file
@@ -0,0 +1,28 @@
|
||||
#include <blue/object/object.h>
|
||||
#include <blue/serial.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
b_stream *src = b_stdin;
|
||||
b_stream *dest = b_stdout;
|
||||
|
||||
#if 0
|
||||
b_serial_ctx *ctx;
|
||||
b_serial_ctx_create(&ctx);
|
||||
|
||||
b_object *data;
|
||||
b_status status = b_serial_ctx_deserialise(
|
||||
ctx, B_SERIAL_FORMAT_JSON, src, &data, 0);
|
||||
if (!B_OK(status)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
b_to_string(B_OBJECT(data), dest);
|
||||
b_stream_write_char(b_stdout, '\n');
|
||||
|
||||
b_release(data);
|
||||
b_serial_ctx_destroy(ctx);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
1
test/test.toml
Normal file
1
test/test.toml
Normal file
@@ -0,0 +1 @@
|
||||
tab = 32
|
||||
48
test/toml-read.c
Normal file
48
test/toml-read.c
Normal file
@@ -0,0 +1,48 @@
|
||||
#include <blue/io/file.h>
|
||||
#include <blue/io/path.h>
|
||||
#include <blue/serial.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
if (argc < 2) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char *path_cstr = argv[1];
|
||||
b_path *path = b_path_create_from_cstr(path_cstr);
|
||||
|
||||
b_file *file = NULL;
|
||||
b_result result = b_file_open(NULL, path, B_FILE_READ_ONLY, &file);
|
||||
if (b_result_is_error(result)) {
|
||||
b_throw(result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
b_stream *src_stream;
|
||||
|
||||
b_file_open_stream(file, &src_stream);
|
||||
|
||||
b_serial_ctx *ctx;
|
||||
b_serial_ctx_create(&ctx);
|
||||
|
||||
b_object *data = NULL;
|
||||
b_status status = b_serial_ctx_deserialise(
|
||||
ctx, B_SERIAL_FORMAT_TOML, src_stream, &data, 0);
|
||||
if (!B_OK(status)) {
|
||||
fprintf(stderr, "cannot read data\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
b_to_string(B_OBJECT(data), b_stdout);
|
||||
b_stream_write_char(b_stdout, '\n');
|
||||
|
||||
b_release(data);
|
||||
b_serial_ctx_destroy(ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user