test-json-parser.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "tests.h"
  2. void test_json_parser(testing &t) {
  3. // Test parsing a simple JSON object
  4. t.test("simple JSON object parsing", [](testing &t) {
  5. auto json = build_peg_parser([](common_peg_parser_builder & p) { return p.json(); });
  6. std::string input = R"({"name": "test", "value": 42, "flag": true})";
  7. common_peg_parse_context ctx(input);
  8. auto result = json.parse(ctx);
  9. t.assert_equal("result_is_success", true, result.success());
  10. t.assert_equal("result_end", input.size(), result.end);
  11. });
  12. // Test parsing a JSON array with mixed types
  13. t.test("JSON array with mixed types", [](testing &t) {
  14. auto json = build_peg_parser([](common_peg_parser_builder & p) { return p.json(); });
  15. std::string input = R"([1, "hello", true, null, 3.14])";
  16. common_peg_parse_context ctx(input);
  17. auto result = json.parse(ctx);
  18. t.assert_equal("result_is_success", true, result.success());
  19. t.assert_equal("result_end", input.size(), result.end);
  20. });
  21. // Test parsing nested JSON with objects and arrays
  22. t.test("nested JSON with objects and arrays", [](testing &t) {
  23. auto json = build_peg_parser([](common_peg_parser_builder & p) { return p.json(); });
  24. std::string input =
  25. R"({"users": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}], "count": 2, "metadata": {"version": "1.0", "tags": ["admin", "user"]}})";
  26. common_peg_parse_context ctx(input);
  27. auto result = json.parse(ctx);
  28. t.assert_equal("result_is_success", true, result.success());
  29. t.assert_equal("result_end", input.size(), result.end);
  30. });
  31. // Test need_more_input() parsing - incomplete object
  32. t.test("need_more_input() parsing - incomplete object", [](testing &t) {
  33. auto json = build_peg_parser([](common_peg_parser_builder & p) { return p.json(); });
  34. std::string input = R"({"name": "test", "value": )";
  35. common_peg_parse_context ctx(input, true);
  36. auto result = json.parse(ctx);
  37. t.assert_equal("result_is_need_more_input", true, result.need_more_input());
  38. });
  39. // Test need_more_input() parsing - incomplete array
  40. t.test("need_more_input() parsing - incomplete array", [](testing &t) {
  41. auto json = build_peg_parser([](common_peg_parser_builder & p) { return p.json(); });
  42. std::string input = R"([1, 2, 3, )";
  43. common_peg_parse_context ctx(input, true);
  44. auto result = json.parse(ctx);
  45. t.assert_equal("result_is_need_more_input", true, result.need_more_input());
  46. });
  47. // Test need_more_input() parsing - incomplete nested structure
  48. t.test("need_more_input() parsing - incomplete nested structure", [](testing &t) {
  49. auto json = build_peg_parser([](common_peg_parser_builder & p) { return p.json(); });
  50. std::string input = R"({"data": {"nested": )";
  51. common_peg_parse_context ctx(input, true);
  52. auto result = json.parse(ctx);
  53. t.assert_equal("result_is_need_more_input", true, result.need_more_input());
  54. });
  55. t.test("object member", [](testing &t) {
  56. auto parser = build_peg_parser([](common_peg_parser_builder & p) {
  57. return p.json_member("name", "\"" + p.chars("[a-z]") + "\"");
  58. });
  59. t.test("success", [&](testing &t) {
  60. std::string input = R"("name": "bob")";
  61. common_peg_parse_context ctx(input, false);
  62. auto result = parser.parse(ctx);
  63. t.assert_true("success", result.success());
  64. });
  65. t.test("partial", [&](testing &t) {
  66. std::string input = R"("name": "bo)";
  67. common_peg_parse_context ctx(input, true);
  68. auto result = parser.parse(ctx);
  69. t.assert_true("need more input", result.need_more_input());
  70. });
  71. t.test("failed", [&](testing &t) {
  72. std::string input = R"([])";
  73. common_peg_parse_context ctx(input, false);
  74. auto result = parser.parse(ctx);
  75. t.assert_true("fail", result.fail());
  76. });
  77. });
  78. }