static void test_string_parser_without_parameter_parses_a_word(void) { assert_parser_success(r_parser_string, "foo", NULL, NULL, "foo"); assert_parser_success(r_parser_string, "foo bar", NULL, NULL, "foo"); assert_parser_success(r_parser_string, "foo123 bar", NULL, NULL, "foo123"); assert_parser_success(r_parser_string, "foo{}", NULL, NULL, "foo"); assert_parser_success(r_parser_string, "foo[]", NULL, NULL, "foo"); assert_parser_failure(r_parser_string, "", NULL, NULL); }
END_TEST START_TEST (absolute_multi_step) { char *expression = "$.foo.baz..yobble.thingum"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 5); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_single_name_step(path, 2, "baz"); assert_recursive_name_step(path, 3, "yobble"); assert_single_name_step(path, 4, "thingum"); assert_no_predicate(path, 1); assert_no_predicate(path, 2); assert_no_predicate(path, 3); assert_no_predicate(path, 4); path_free(path); parser_free(context); }
END_TEST START_TEST (dollar_only) { char *expression = "$"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, 1); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 1); assert_root_step(path); path_free(path); parser_free(context); }
END_TEST START_TEST (absolute_recursive_step) { char *expression = "$..foo"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, 6); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 2); assert_root_step(path); assert_recursive_name_step(path, 1, "foo"); assert_no_predicate(path, 0); path_free(path); parser_free(context); }
END_TEST START_TEST (iteration) { char *expression = "$.foo.bar"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 3); unsigned long counter = 0; assert_true(path_iterate(path, count, &counter)); assert_uint_eq(3, counter); path_free(path); parser_free(context); }
END_TEST START_TEST (recursive_wildcard) { char *expression = "$.foo..*"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 3); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_recursive_wildcard_step(path, 2); assert_no_predicate(path, 1); assert_no_predicate(path, 2); path_free(path); parser_free(context); }
END_TEST START_TEST (type_test_with_subscript_predicate) { char *expression = "$.foo.array()[0]"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 3); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_no_predicate(path, 1); assert_single_type_step(path, 2, ARRAY_TEST); assert_subscript_predicate(path, 2, 0); path_free(path); parser_free(context); }
END_TEST START_TEST (slice_predicate_form2_with_step) { char *expression = "$.foo[-1::2].bar"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 3); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_slice_predicate(path, 1, -1, INT_FAST32_MAX, 2); assert_single_name_step(path, 2, "bar"); assert_no_predicate(path, 2); path_free(path); parser_free(context); }
END_TEST START_TEST (boolean_type_test) { char *expression = "$.foo.boolean()"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 3); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_single_type_step(path, 2, BOOLEAN_TEST); assert_no_predicate(path, 1); assert_no_predicate(path, 2); path_free(path); parser_free(context); }
END_TEST START_TEST (subscript_predicate_with_whitespace) { char *expression = "$.foo [\t42\r]\n.bar"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 3); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_subscript_predicate(path, 1, 42); assert_single_name_step(path, 2, "bar"); assert_no_predicate(path, 2); path_free(path); parser_free(context); }
END_TEST START_TEST (negative_step_slice_predicate) { char *expression = "$.foo[1:3:-3].bar"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 3); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_slice_predicate(path, 1, 1, 3, -3); assert_single_name_step(path, 2, "bar"); assert_no_predicate(path, 2); path_free(path); parser_free(context); }
END_TEST START_TEST (relative_multi_step) { char *expression = "foo.bar..baz"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, RELATIVE_PATH, 3); assert_single_name_step(path, 0, "foo"); assert_single_name_step(path, 1, "bar"); assert_recursive_name_step(path, 2, "baz"); assert_no_predicate(path, 0); assert_no_predicate(path, 1); assert_no_predicate(path, 2); path_free(path); parser_free(context); }
END_TEST START_TEST (wildcard_predicate) { char *expression = "$.store.book[*].author"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 4); assert_root_step(path); assert_single_name_step(path, 1, "store"); assert_no_predicate(path, 1); assert_single_name_step(path, 2, "book"); assert_wildcard_predicate(path, 2); assert_single_name_step(path, 3, "author"); assert_no_predicate(path, 3); path_free(path); parser_free(context); }
END_TEST START_TEST (whitespace) { char *expression = " $ \r\n. foo \n.\n. \t'happy fun ball' . \t string()"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 4); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_recursive_name_step(path, 2, "happy fun ball"); assert_single_type_step(path, 3, STRING_TEST); assert_no_predicate(path, 1); assert_no_predicate(path, 2); assert_no_predicate(path, 3); path_free(path); parser_free(context); }
END_TEST START_TEST (quoted_multi_step) { char *expression = "$.foo.'happy fun ball'.bar"; reset_errno(); parser_context *context = make_parser((uint8_t *)expression, strlen(expression)); assert_not_null(context); assert_noerr(); jsonpath *path = parse(context); assert_parser_success(expression, context, path, ABSOLUTE_PATH, 4); assert_root_step(path); assert_single_name_step(path, 1, "foo"); assert_single_name_step(path, 2, "happy fun ball"); assert_single_name_step(path, 3, "bar"); assert_no_predicate(path, 1); assert_no_predicate(path, 2); assert_no_predicate(path, 3); path_free(path); parser_free(context); }
static void assert_qstring_parser_success(const gchar *str, gchar *quotes, const gchar *expected_string) { assert_parser_success(r_parser_qstring, str, quotes, compile_qstring_state(quotes), expected_string); }
static void test_string_parser_with_additional_end_characters(void) { assert_parser_success(r_parser_string, "foo", "X", NULL, "foo"); assert_parser_success(r_parser_string, "foo=bar", "=", NULL, "foo=bar"); }