aboutsummaryrefslogtreecommitdiff
path: root/test/optional_scalars_test
diff options
context:
space:
mode:
Diffstat (limited to 'test/optional_scalars_test')
-rw-r--r--test/optional_scalars_test/CMakeLists.txt19
-rw-r--r--test/optional_scalars_test/optional_scalars_test.c280
-rw-r--r--test/optional_scalars_test/optional_scalars_test.fbs71
3 files changed, 370 insertions, 0 deletions
diff --git a/test/optional_scalars_test/CMakeLists.txt b/test/optional_scalars_test/CMakeLists.txt
new file mode 100644
index 0000000..b13c1b9
--- /dev/null
+++ b/test/optional_scalars_test/CMakeLists.txt
@@ -0,0 +1,19 @@
+include(CTest)
+
+set(INC_DIR "${PROJECT_SOURCE_DIR}/include")
+set(GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
+set(FBS_DIR "${PROJECT_SOURCE_DIR}/test/optional_scalars_test")
+
+include_directories("${GEN_DIR}" "${INC_DIR}")
+
+add_custom_target(gen_optional_scalars_test ALL)
+add_custom_command (
+ TARGET gen_optional_scalars_test
+ COMMAND ${CMAKE_COMMAND} -E make_directory "${GEN_DIR}"
+ COMMAND flatcc_cli -a --json -o "${GEN_DIR}" "${FBS_DIR}/optional_scalars_test.fbs"
+)
+add_executable(optional_scalars_test optional_scalars_test.c)
+add_dependencies(optional_scalars_test gen_optional_scalars_test)
+target_link_libraries(optional_scalars_test flatccrt)
+
+add_test(optional_scalars_test optional_scalars_test${CMAKE_EXECUTABLE_SUFFIX})
diff --git a/test/optional_scalars_test/optional_scalars_test.c b/test/optional_scalars_test/optional_scalars_test.c
new file mode 100644
index 0000000..7566c05
--- /dev/null
+++ b/test/optional_scalars_test/optional_scalars_test.c
@@ -0,0 +1,280 @@
+#include <assert.h>
+#include <stdio.h>
+
+#include "optional_scalars_test_builder.h"
+#include "optional_scalars_test_json_printer.h"
+#include "optional_scalars_test_json_parser.h"
+
+
+#undef ns
+#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(optional_scalars, x)
+
+// #define TEST_ASSERT
+
+#ifdef TEST_ASSERT
+#define test_assert(x) do { if (!(x)) { assert(0); return -1; }} while(0)
+#else
+#define test_assert(x) do { if (!(x)) { return -1; }} while(0)
+#endif
+
+int create_scalar_stuff(flatcc_builder_t *builder)
+{
+ ns(ScalarStuff_start_as_root(builder));
+
+ ns(ScalarStuff_just_i8_add(builder, 10));
+ ns(ScalarStuff_maybe_i8_add(builder, 11));
+ ns(ScalarStuff_default_i8_add(builder, 12));
+
+ ns(ScalarStuff_just_i16_add(builder, 42));
+ ns(ScalarStuff_maybe_i16_add(builder, 42));
+ ns(ScalarStuff_default_i16_add(builder, 42));
+
+ ns(ScalarStuff_just_u32_add(builder, 0));
+ ns(ScalarStuff_maybe_u32_add(builder, 0));
+ ns(ScalarStuff_default_u32_add(builder, 0));
+
+ ns(ScalarStuff_just_f32_add(builder, 42));
+ ns(ScalarStuff_maybe_f32_add(builder, 42));
+ ns(ScalarStuff_default_f32_add(builder, 42));
+
+ ns(ScalarStuff_just_bool_add(builder, 1));
+ ns(ScalarStuff_maybe_bool_add(builder, 1));
+ ns(ScalarStuff_default_bool_add(builder, 1));
+
+ ns(ScalarStuff_just_enum_add)(builder, ns(OptionalByte_One));
+ ns(ScalarStuff_maybe_enum_add)(builder, ns(OptionalByte_One));
+ ns(ScalarStuff_default_enum_add)(builder, ns(OptionalByte_One));
+
+ ns(ScalarStuff_just_xfactor_add)(builder, ns(OptionalFactor_Twice));
+ ns(ScalarStuff_maybe_xfactor_add)(builder, ns(OptionalFactor_Twice));
+ ns(ScalarStuff_default_xfactor_add)(builder, ns(OptionalFactor_Twice));
+
+ ns(ScalarStuff_end_as_root(builder));
+
+ return 0;
+}
+
+int access_scalar_stuff(const void *buf)
+{
+ ns(ScalarStuff_table_t) t = ns(ScalarStuff_as_root(buf));
+ flatbuffers_int8_option_t maybe_i8;
+ flatbuffers_int16_option_t maybe_i16;
+ flatbuffers_uint32_option_t maybe_u32;
+ flatbuffers_uint8_option_t maybe_u8;
+ flatbuffers_float_option_t maybe_f32;
+ flatbuffers_bool_option_t maybe_bool;
+ ns(OptionalByte_option_t) maybe_enum;
+ ns(OptionalFactor_option_t) maybe_xfactor;
+ ns(OptionalFactor_option_t) maybe_yfactor;
+
+ test_assert(10 == ns(ScalarStuff_just_i8_get(t)));
+ test_assert(11 == ns(ScalarStuff_maybe_i8_get(t)));
+ test_assert(12 == ns(ScalarStuff_default_i8_get(t)));
+ maybe_i8 = ns(ScalarStuff_maybe_i8_option(t));
+ test_assert(!maybe_i8.is_null);
+ test_assert(11 == maybe_i8.value);
+ test_assert(ns(ScalarStuff_just_i8_is_present(t)));
+ test_assert(ns(ScalarStuff_maybe_i8_is_present(t)));
+ test_assert(ns(ScalarStuff_default_i8_is_present(t)));
+
+ test_assert(0 == ns(ScalarStuff_just_u8_get(t)));
+ test_assert(0 == ns(ScalarStuff_maybe_u8_get(t)));
+ test_assert(42 == ns(ScalarStuff_default_u8_get(t)));
+ maybe_u8 = ns(ScalarStuff_maybe_u8_option(t));
+ test_assert(maybe_u8.is_null);
+ test_assert(0 == maybe_u8.value);
+ test_assert(!ns(ScalarStuff_just_u8_is_present(t)));
+ test_assert(!ns(ScalarStuff_maybe_u8_is_present(t)));
+ test_assert(!ns(ScalarStuff_default_u8_is_present(t)));
+
+ test_assert(42 == ns(ScalarStuff_just_i16_get(t)));
+ test_assert(42 == ns(ScalarStuff_maybe_i16_get(t)));
+ test_assert(42 == ns(ScalarStuff_default_i16_get(t)));
+ maybe_i16 = ns(ScalarStuff_maybe_i16_option(t));
+ test_assert(!maybe_i16.is_null);
+ test_assert(42 == maybe_i16.value);
+ test_assert(ns(ScalarStuff_just_i16_is_present(t)));
+ test_assert(ns(ScalarStuff_maybe_i16_is_present(t)));
+ test_assert(!ns(ScalarStuff_default_i16_is_present(t)));
+
+ test_assert(0 == ns(ScalarStuff_just_u32_get(t)));
+ test_assert(0 == ns(ScalarStuff_maybe_u32_get(t)));
+ test_assert(0 == ns(ScalarStuff_default_u32_get(t)));
+ maybe_u32 = ns(ScalarStuff_maybe_u32_option(t));
+ test_assert(!maybe_u32.is_null);
+ test_assert(0 == maybe_u32.value);
+ test_assert(!ns(ScalarStuff_just_u32_is_present(t)));
+ test_assert(ns(ScalarStuff_maybe_u32_is_present(t)));
+ test_assert(ns(ScalarStuff_default_u32_is_present(t)));
+
+ test_assert(42 == ns(ScalarStuff_just_f32_get(t)));
+ test_assert(42 == ns(ScalarStuff_maybe_f32_get(t)));
+ test_assert(42 == ns(ScalarStuff_default_f32_get(t)));
+ maybe_f32 = ns(ScalarStuff_maybe_f32_option(t));
+ test_assert(!maybe_f32.is_null);
+ test_assert(42 == maybe_f32.value);
+ test_assert(ns(ScalarStuff_just_f32_is_present(t)));
+ test_assert(ns(ScalarStuff_maybe_f32_is_present(t)));
+ test_assert(!ns(ScalarStuff_default_f32_is_present(t)));
+
+ test_assert(1 == ns(ScalarStuff_just_bool_get(t)));
+ test_assert(1 == ns(ScalarStuff_maybe_bool_get(t)));
+ test_assert(1 == ns(ScalarStuff_default_bool_get(t)));
+ maybe_bool = ns(ScalarStuff_maybe_bool_option(t));
+ test_assert(!maybe_bool.is_null);
+ test_assert(1 == maybe_bool.value);
+ test_assert(ns(ScalarStuff_just_bool_is_present(t)));
+ test_assert(ns(ScalarStuff_maybe_bool_is_present(t)));
+ test_assert(!ns(ScalarStuff_default_bool_is_present(t)));
+
+ test_assert(1 == ns(ScalarStuff_just_enum_get(t)));
+ test_assert(1 == ns(ScalarStuff_maybe_enum_get(t)));
+ test_assert(1 == ns(ScalarStuff_default_enum_get(t)));
+ maybe_enum = ns(ScalarStuff_maybe_enum_option(t));
+ test_assert(!maybe_enum.is_null);
+ test_assert(maybe_enum.value == 1);
+ test_assert(ns(ScalarStuff_just_enum_is_present(t)));
+ test_assert(ns(ScalarStuff_maybe_enum_is_present(t)));
+ test_assert(!ns(ScalarStuff_default_enum_is_present(t)));
+
+ test_assert(2 == ns(ScalarStuff_just_xfactor_get(t)));
+ test_assert(2 == ns(ScalarStuff_maybe_xfactor_get(t)));
+ test_assert(2 == ns(ScalarStuff_default_xfactor_get(t)));
+ maybe_xfactor = ns(ScalarStuff_maybe_xfactor_option(t));
+ test_assert(!maybe_xfactor.is_null);
+ test_assert(maybe_xfactor.value == 2);
+ test_assert(ns(ScalarStuff_just_xfactor_is_present(t)));
+ test_assert(ns(ScalarStuff_maybe_xfactor_is_present(t)));
+ test_assert(!ns(ScalarStuff_default_xfactor_is_present(t)));
+
+ test_assert(1 == ns(ScalarStuff_just_yfactor_get(t)));
+ test_assert(0 == ns(ScalarStuff_maybe_yfactor_get(t)));
+ test_assert(2 == ns(ScalarStuff_default_yfactor_get(t)));
+ maybe_yfactor = ns(ScalarStuff_maybe_yfactor_option(t));
+ test_assert(maybe_yfactor.is_null);
+ test_assert(maybe_yfactor.value == 0);
+ test_assert(!ns(ScalarStuff_just_yfactor_is_present(t)));
+ test_assert(!ns(ScalarStuff_maybe_yfactor_is_present(t)));
+ test_assert(!ns(ScalarStuff_default_yfactor_is_present(t)));
+ return 0;
+}
+
+int test(void)
+{
+ flatcc_builder_t builder;
+ void *buf;
+ size_t size;
+
+ flatcc_builder_init(&builder);
+ test_assert(0 == create_scalar_stuff(&builder));
+ buf = flatcc_builder_finalize_aligned_buffer(&builder, &size);
+ test_assert(0 == access_scalar_stuff(buf));
+ flatcc_builder_aligned_free(buf);
+ flatcc_builder_clear(&builder);
+
+ return 0;
+}
+
+const char *expected_json =
+"{\"just_i8\":10,\"maybe_i8\":11,\"default_i8\":12,\"just_i16\":42,\"maybe_i16\":42,\"maybe_u32\":0,\"default_u32\":0,\"just_f32\":42,\"maybe_f32\":42,\"just_bool\":true,\"maybe_bool\":true,\"just_enum\":\"One\",\"maybe_enum\":\"One\",\"just_xfactor\":\"Twice\",\"maybe_xfactor\":\"Twice\"}";
+
+#if 0
+int print_buffer(const void *buf, size_t size)
+{
+ flatcc_json_printer_t printer;
+ flatcc_json_printer_init(&printer, 0);
+ ns(ScalarStuff_print_json_as_root)(&printer, buf, size, NULL);
+ if (flatcc_json_printer_get_error(&printer)) {
+ printf("could not print buffer\n");
+ return -1;
+ }
+ return 0;
+}
+#endif
+
+int test_json_printer(void)
+{
+ flatcc_builder_t builder;
+ void *buf;
+ size_t size;
+ flatcc_json_printer_t printer;
+ char *json_buf;
+ size_t json_size;
+
+ flatcc_builder_init(&builder);
+ test_assert(0 == create_scalar_stuff(&builder));
+ buf = flatcc_builder_finalize_aligned_buffer(&builder, &size);
+ test_assert(0 == access_scalar_stuff(buf));
+ flatcc_builder_clear(&builder);
+ flatcc_json_printer_init_dynamic_buffer(&printer, 0);
+ test_assert(ns(ScalarStuff_print_json_as_root)(&printer, buf, size, NULL));
+ flatcc_builder_aligned_free(buf);
+ json_buf = flatcc_json_printer_get_buffer(&printer, &json_size);
+ printf("%.*s\n", (int)json_size, json_buf);
+ test_assert(strlen(expected_json) == json_size);
+ test_assert(0 == memcmp(expected_json, json_buf, json_size));
+
+
+ flatcc_json_printer_clear(&printer);
+ return 0;
+}
+
+int test_json_parser(void)
+{
+ flatcc_builder_t builder;
+ void *buf;
+ size_t size;
+ flatcc_json_parser_t parser;
+ flatcc_json_printer_t printer;
+ char *json_buf;
+ size_t json_size;
+ int ret;
+
+ flatcc_builder_init(&builder);
+ ret = optional_scalars_ScalarStuff_parse_json_as_root(&builder,
+ &parser, expected_json, strlen(expected_json), 0, 0);
+ test_assert(ret == 0);
+
+ buf = flatcc_builder_finalize_aligned_buffer(&builder, &size);
+
+ flatcc_json_printer_init_dynamic_buffer(&printer, 0);
+ ns(ScalarStuff_print_json_as_root)(&printer, buf, size, NULL);
+ if (flatcc_json_printer_get_error(&printer)) {
+ printf("could not print buffer\n");
+ return -1;
+ }
+ test_assert(0 == access_scalar_stuff(buf));
+
+ json_buf = flatcc_json_printer_get_buffer(&printer, &json_size);
+ printf("%.*s\n", (int)json_size, json_buf);
+ test_assert(strlen(expected_json) == json_size);
+ test_assert(0 == memcmp(expected_json, json_buf, json_size));
+ flatcc_json_printer_clear(&printer);
+
+ flatcc_builder_aligned_free(buf);
+ flatcc_builder_clear(&builder);
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ /* Silence warnings. */
+ (void)argc;
+ (void)argv;
+
+ if (test()) {
+ printf("optional scalars test failed");
+ return 1;
+ }
+ if (test_json_printer()) {
+ printf("optional scalars json printer test failed");
+ return 1;
+ }
+ if (test_json_parser()) {
+ printf("optional scalars json parser test failed");
+ return 1;
+ }
+ printf("optional scalars test passed");
+ return 0;
+}
+
diff --git a/test/optional_scalars_test/optional_scalars_test.fbs b/test/optional_scalars_test/optional_scalars_test.fbs
new file mode 100644
index 0000000..ba4c9d4
--- /dev/null
+++ b/test/optional_scalars_test/optional_scalars_test.fbs
@@ -0,0 +1,71 @@
+namespace optional_scalars;
+
+enum OptionalByte: byte {
+ None = 0,
+ One = 1,
+}
+
+// Enums without a 0 element normally requires an initializer
+// which is a problem when = null is the default. In this case
+// the default value is forced to 0 when a reader insists on
+// getting a numerical value instead of null.
+enum OptionalFactor: byte {
+ Once = 1,
+ Twice = 2,
+}
+
+// This table tests optional scalars in tables. It should be integrated with
+// the main monster test once most languages support optional scalars.
+table ScalarStuff {
+ just_i8: int8;
+ maybe_i8: int8 = null;
+ default_i8: int8 = 42;
+ just_u8: uint8;
+ maybe_u8: uint8 = null;
+ default_u8: uint8 = 42;
+
+ just_i16: int16;
+ maybe_i16: int16 = null;
+ default_i16: int16 = 42;
+ just_u16: uint16;
+ maybe_u16: uint16 = null;
+ default_u16: uint16 = 42;
+
+ just_i32: int32;
+ maybe_i32: int32 = null;
+ default_i32: int32 = 42;
+ just_u32: uint32;
+ maybe_u32: uint32 = null;
+ default_u32: uint32 = 42;
+
+ just_i64: int64;
+ maybe_i64: int64 = null;
+ default_i64: int64 = 42;
+ just_u64: uint64;
+ maybe_u64: uint64 = null;
+ default_u64: uint64 = 42;
+
+ just_f32: float32;
+ maybe_f32: float32 = null;
+ default_f32: float32 = 42;
+ just_f64: float64;
+ maybe_f64: float64 = null;
+ default_f64: float64 = 42;
+
+ just_bool: bool;
+ maybe_bool: bool = null;
+ default_bool: bool = true;
+
+ just_enum: OptionalByte;
+ maybe_enum: OptionalByte = null;
+ default_enum: OptionalByte = One;
+
+ just_xfactor: OptionalFactor = Once;
+ maybe_xfactor: OptionalFactor = null;
+ default_xfactor: OptionalFactor = Twice;
+
+ just_yfactor: OptionalFactor = Once;
+ maybe_yfactor: OptionalFactor = null;
+ default_yfactor: OptionalFactor = Twice;
+
+}