aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/exess/test/test_canonical.c
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/exess/test/test_canonical.c')
-rw-r--r--subprojects/exess/test/test_canonical.c412
1 files changed, 412 insertions, 0 deletions
diff --git a/subprojects/exess/test/test_canonical.c b/subprojects/exess/test/test_canonical.c
new file mode 100644
index 00000000..77167fcf
--- /dev/null
+++ b/subprojects/exess/test/test_canonical.c
@@ -0,0 +1,412 @@
+/*
+ Copyright 2011-2021 David Robillard <d@drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#undef NDEBUG
+
+#include "exess/exess.h"
+
+#include <assert.h>
+#include <stddef.h>
+#include <string.h>
+
+static void
+check_write(const ExessDatatype datatype,
+ const char* const value,
+ const ExessStatus expected_status,
+ const size_t buf_size,
+ const char* const expected_string)
+{
+ char buf[328] = {42};
+
+ assert(buf_size <= sizeof(buf));
+
+ const ExessResult r = exess_write_canonical(value, datatype, buf_size, buf);
+ assert(r.status == expected_status);
+ assert(r.count == strlen(buf));
+ assert(!strcmp(buf, expected_string));
+ assert((r.status && r.status != EXESS_EXPECTED_END) ||
+ exess_write_canonical(value, datatype, 0, NULL).count == r.count);
+}
+
+static void
+test_decimal(void)
+{
+ check_write(EXESS_DECIMAL, "", EXESS_EXPECTED_DIGIT, 1, "");
+ check_write(EXESS_DECIMAL, " \f\n\r\t\v", EXESS_EXPECTED_DIGIT, 1, "");
+
+ check_write(EXESS_DECIMAL, " -001 ", EXESS_SUCCESS, 5, "-1.0");
+ check_write(EXESS_DECIMAL, " -000 ", EXESS_SUCCESS, 5, "-0.0");
+ check_write(EXESS_DECIMAL, " 000 ", EXESS_SUCCESS, 4, "0.0");
+ check_write(EXESS_DECIMAL, " 001 ", EXESS_SUCCESS, 4, "1.0");
+ check_write(EXESS_DECIMAL, " +001 ", EXESS_SUCCESS, 4, "1.0");
+
+ check_write(EXESS_DECIMAL, " -.123", EXESS_SUCCESS, 7, "-0.123");
+ check_write(EXESS_DECIMAL, " +.123", EXESS_SUCCESS, 6, "0.123");
+ check_write(EXESS_DECIMAL, " -0 ", EXESS_SUCCESS, 5, "-0.0");
+ check_write(EXESS_DECIMAL, " +0 ", EXESS_SUCCESS, 4, "0.0");
+
+ check_write(EXESS_DECIMAL, " +00.10 ", EXESS_SUCCESS, 4, "0.1");
+ check_write(EXESS_DECIMAL, " +01 ", EXESS_SUCCESS, 4, "1.0");
+
+ check_write(EXESS_DECIMAL,
+ " 36893488147419103232 ",
+ EXESS_SUCCESS,
+ 23,
+ "36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " 0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 23,
+ "36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " +36893488147419103232 ",
+ EXESS_SUCCESS,
+ 23,
+ "36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " -36893488147419103232 ",
+ EXESS_SUCCESS,
+ 24,
+ "-36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " +0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 23,
+ "36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " +0036893488147419103232. ",
+ EXESS_SUCCESS,
+ 23,
+ "36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " +0036893488147419103232.00 ",
+ EXESS_SUCCESS,
+ 23,
+ "36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " +0036893488147419103232.12300 ",
+ EXESS_SUCCESS,
+ 25,
+ "36893488147419103232.123");
+
+ check_write(EXESS_DECIMAL,
+ " -0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 24,
+ "-36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " -0036893488147419103232. ",
+ EXESS_SUCCESS,
+ 24,
+ "-36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " -0036893488147419103232.00 ",
+ EXESS_SUCCESS,
+ 24,
+ "-36893488147419103232.0");
+
+ check_write(EXESS_DECIMAL,
+ " -0036893488147419103232.12300 ",
+ EXESS_SUCCESS,
+ 26,
+ "-36893488147419103232.123");
+
+ check_write(EXESS_DECIMAL, " -1234extra", EXESS_EXPECTED_END, 8, "-1234.0");
+ check_write(EXESS_DECIMAL, " 1234extra", EXESS_EXPECTED_END, 7, "1234.0");
+
+ check_write(EXESS_DECIMAL, " f", EXESS_EXPECTED_DIGIT, 2, "");
+ check_write(EXESS_DECIMAL, "", EXESS_EXPECTED_DIGIT, 1, "");
+}
+
+static void
+test_integer(void)
+{
+ check_write(EXESS_INTEGER, "", EXESS_EXPECTED_DIGIT, 1, "");
+ check_write(EXESS_INTEGER, " \f\n\r\t\v", EXESS_EXPECTED_DIGIT, 1, "");
+
+ // Integer
+
+ check_write(EXESS_INTEGER, " -001 ", EXESS_SUCCESS, 3, "-1");
+ check_write(EXESS_INTEGER, " 000 ", EXESS_SUCCESS, 2, "0");
+ check_write(EXESS_INTEGER, " 001 ", EXESS_SUCCESS, 2, "1");
+ check_write(EXESS_INTEGER, " +001 ", EXESS_SUCCESS, 2, "1");
+
+ check_write(EXESS_INTEGER, " junk 987654321 ", EXESS_EXPECTED_DIGIT, 2, "");
+ check_write(
+ EXESS_INTEGER, " 987654321 junk ", EXESS_EXPECTED_END, 10, "987654321");
+
+ check_write(EXESS_INTEGER,
+ " 36893488147419103232 ",
+ EXESS_SUCCESS,
+ 21,
+ "36893488147419103232");
+
+ check_write(EXESS_INTEGER,
+ " 0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 21,
+ "36893488147419103232");
+
+ check_write(EXESS_INTEGER,
+ " +36893488147419103232 ",
+ EXESS_SUCCESS,
+ 21,
+ "36893488147419103232");
+
+ check_write(EXESS_INTEGER,
+ " +0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 21,
+ "36893488147419103232");
+
+ check_write(EXESS_INTEGER,
+ " -36893488147419103232 ",
+ EXESS_SUCCESS,
+ 22,
+ "-36893488147419103232");
+
+ check_write(EXESS_INTEGER,
+ " -0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 22,
+ "-36893488147419103232");
+
+ // NonPositiveInteger
+
+ check_write(EXESS_NON_POSITIVE_INTEGER, " -001 ", EXESS_SUCCESS, 3, "-1");
+ check_write(EXESS_NON_POSITIVE_INTEGER, " 000 ", EXESS_SUCCESS, 2, "0");
+ check_write(EXESS_NON_POSITIVE_INTEGER, " 001 ", EXESS_BAD_VALUE, 3, "");
+ check_write(EXESS_NON_POSITIVE_INTEGER, " +001 ", EXESS_BAD_VALUE, 3, "");
+
+ check_write(EXESS_NON_POSITIVE_INTEGER,
+ " -36893488147419103232 ",
+ EXESS_SUCCESS,
+ 22,
+ "-36893488147419103232");
+
+ check_write(EXESS_NON_POSITIVE_INTEGER,
+ " -0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 22,
+ "-36893488147419103232");
+
+ // NegativeInteger
+
+ check_write(EXESS_NEGATIVE_INTEGER, " -001 ", EXESS_SUCCESS, 3, "-1");
+ check_write(EXESS_NEGATIVE_INTEGER, " 000 ", EXESS_BAD_VALUE, 3, "");
+ check_write(EXESS_NEGATIVE_INTEGER, " 001 ", EXESS_BAD_VALUE, 3, "");
+ check_write(EXESS_NEGATIVE_INTEGER, " +001 ", EXESS_BAD_VALUE, 3, "");
+
+ check_write(EXESS_NEGATIVE_INTEGER,
+ " -36893488147419103232 ",
+ EXESS_SUCCESS,
+ 22,
+ "-36893488147419103232");
+
+ check_write(EXESS_NEGATIVE_INTEGER,
+ " -0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 22,
+ "-36893488147419103232");
+
+ // NonNegativeInteger
+
+ check_write(EXESS_NON_NEGATIVE_INTEGER, " -001 ", EXESS_BAD_VALUE, 3, "");
+ check_write(EXESS_NON_NEGATIVE_INTEGER, " 000 ", EXESS_SUCCESS, 2, "0");
+ check_write(EXESS_NON_NEGATIVE_INTEGER, " 001 ", EXESS_SUCCESS, 2, "1");
+ check_write(EXESS_NON_NEGATIVE_INTEGER, " +001 ", EXESS_SUCCESS, 2, "1");
+
+ check_write(EXESS_NON_NEGATIVE_INTEGER,
+ " 36893488147419103232 ",
+ EXESS_SUCCESS,
+ 21,
+ "36893488147419103232");
+
+ check_write(EXESS_NON_NEGATIVE_INTEGER,
+ " 0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 21,
+ "36893488147419103232");
+
+ // PositiveInteger
+
+ check_write(EXESS_POSITIVE_INTEGER, " -001 ", EXESS_BAD_VALUE, 3, "");
+ check_write(EXESS_POSITIVE_INTEGER, " 000 ", EXESS_BAD_VALUE, 3, "");
+ check_write(EXESS_POSITIVE_INTEGER, " 001 ", EXESS_SUCCESS, 2, "1");
+ check_write(EXESS_POSITIVE_INTEGER, " +001 ", EXESS_SUCCESS, 2, "1");
+
+ check_write(EXESS_POSITIVE_INTEGER,
+ " 36893488147419103232 ",
+ EXESS_SUCCESS,
+ 21,
+ "36893488147419103232");
+
+ check_write(EXESS_POSITIVE_INTEGER,
+ " 0036893488147419103232 ",
+ EXESS_SUCCESS,
+ 21,
+ "36893488147419103232");
+}
+
+static void
+test_fixed_numbers(void)
+{
+ check_write(EXESS_DOUBLE, " +00.10 ", EXESS_SUCCESS, 7, "1.0E-1");
+ check_write(EXESS_FLOAT, " +00.10 ", EXESS_SUCCESS, 14, "1.00000001E-1");
+ check_write(EXESS_BOOLEAN, " 0 ", EXESS_SUCCESS, 6, "false");
+ check_write(EXESS_BOOLEAN, " 1 ", EXESS_SUCCESS, 5, "true");
+ check_write(EXESS_LONG, " +012 ", EXESS_SUCCESS, 3, "12");
+ check_write(EXESS_INT, " +012 ", EXESS_SUCCESS, 3, "12");
+ check_write(EXESS_SHORT, " +012 ", EXESS_SUCCESS, 3, "12");
+ check_write(EXESS_BYTE, " +012 ", EXESS_SUCCESS, 3, "12");
+ check_write(EXESS_ULONG, " 012 ", EXESS_SUCCESS, 3, "12");
+ check_write(EXESS_UINT, " 012 ", EXESS_SUCCESS, 3, "12");
+ check_write(EXESS_USHORT, " 012 ", EXESS_SUCCESS, 3, "12");
+ check_write(EXESS_UBYTE, " 012 ", EXESS_SUCCESS, 3, "12");
+}
+
+static void
+test_time(void)
+{
+ check_write(EXESS_DURATION, " P0Y6M ", EXESS_SUCCESS, 4, "P6M");
+ check_write(EXESS_DURATION, " P1Y6M0D ", EXESS_SUCCESS, 6, "P1Y6M");
+ check_write(EXESS_TIME, " 12:15:01+00:00 ", EXESS_SUCCESS, 14, "12:15:01Z");
+ check_write(
+ EXESS_DATE, " 02004-04-12+00:00 ", EXESS_SUCCESS, 12, "2004-04-12Z");
+}
+
+static void
+test_datetime(void)
+{
+ // Local
+ check_write(EXESS_DATETIME,
+ " 02001-02-03T04:05:06.007 ",
+ EXESS_SUCCESS,
+ 26,
+ "2001-02-03T04:05:06.007");
+
+ // Positive carry: minute => hour
+ check_write(EXESS_DATETIME,
+ " 02001-02-03T04:46:59-00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2001-02-03T05:01:59Z");
+
+ // Positive carry: minute => hour => day
+ check_write(EXESS_DATETIME,
+ " 02001-02-03T23:46:59-00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2001-02-04T00:01:59Z");
+
+ // Positive carry: minute => hour => day => month (common year)
+ check_write(EXESS_DATETIME,
+ " 02001-02-28T23:46:59-00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2001-03-01T00:01:59Z");
+
+ // Positive carry: minute => hour => day => month (leap year)
+ check_write(EXESS_DATETIME,
+ " 02000-02-29T23:46:59-00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2000-03-01T00:01:59Z");
+
+ // Positive carry: minute => hour => day => month => year
+ check_write(EXESS_DATETIME,
+ " 02001-12-31T23:46:59-00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2002-01-01T00:01:59Z");
+
+ // Negative carry: minute => hour
+ check_write(EXESS_DATETIME,
+ " 02001-02-03T04:14:59+00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2001-02-03T03:59:59Z");
+
+ // Negative carry: minute => hour => day
+ check_write(EXESS_DATETIME,
+ " 02001-02-02T00:14:59+00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2001-02-01T23:59:59Z");
+
+ // Negative carry: minute => hour => day => month (common year)
+ check_write(EXESS_DATETIME,
+ " 02001-03-01T00:14:59+00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2001-02-28T23:59:59Z");
+
+ // Negative carry: minute => hour => day => month (leap year)
+ check_write(EXESS_DATETIME,
+ " 02000-03-01T00:14:59+00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2000-02-29T23:59:59Z");
+
+ // Negative carry: minute => hour => day => month => year
+ check_write(EXESS_DATETIME,
+ " 02001-01-01T00:14:59+00:15 ",
+ EXESS_SUCCESS,
+ 21,
+ "2000-12-31T23:59:59Z");
+}
+
+static void
+test_binary(void)
+{
+ check_write(EXESS_HEX, " D EA D B3 3F", EXESS_SUCCESS, 9, "DEADB33F");
+ check_write(EXESS_HEX, "invalid", EXESS_EXPECTED_HEX, 1, "");
+ check_write(EXESS_HEX, "1A2B3", EXESS_EXPECTED_HEX, 5, "");
+ check_write(EXESS_HEX, "1", EXESS_EXPECTED_HEX, 1, "");
+ check_write(EXESS_HEX, "", EXESS_EXPECTED_HEX, 5, "");
+
+ check_write(
+ EXESS_BASE64, " Z\fm\n9\rv\tY\vmFy", EXESS_SUCCESS, 9, "Zm9vYmFy");
+ check_write(EXESS_BASE64, "!nvalid", EXESS_EXPECTED_BASE64, 1, "");
+ check_write(EXESS_BASE64, "Z", EXESS_EXPECTED_BASE64, 1, "");
+ check_write(EXESS_BASE64, "Zm", EXESS_EXPECTED_BASE64, 2, "");
+ check_write(EXESS_BASE64, "Zm9", EXESS_EXPECTED_BASE64, 3, "");
+ check_write(EXESS_BASE64, "", EXESS_EXPECTED_BASE64, 5, "");
+}
+
+int
+main(void)
+{
+ check_write(EXESS_NOTHING, "?", EXESS_UNSUPPORTED, 1, "");
+
+ test_decimal();
+ test_integer();
+ test_fixed_numbers();
+ test_time();
+ test_datetime();
+ test_binary();
+
+ return 0;
+}