Add streaming test

This commit is contained in:
2025-05-18 13:13:36 -04:00
parent 5dd627f072
commit 9543aba2ad

View File

@@ -173,17 +173,18 @@ struct MinifyState {
int64_t index; int64_t index;
bool isObject; bool isObject;
}; };
std::string result;
void on_begin_value() { void on_begin_value() {
if (!stack.empty()) { if (!stack.empty()) {
auto &back = stack.back(); auto &back = stack.back();
if (back.isObject && back.index % 2 == 0 && back.index > 0) { if (back.isObject && back.index % 2 == 0 && back.index > 0) {
printf(","); result.append(",");
} }
if (back.isObject && back.index % 2 == 1 && back.index > 0) { if (back.isObject && back.index % 2 == 1 && back.index > 0) {
printf(":"); result.append(":");
} }
if (!back.isObject && back.index > 0) { if (!back.isObject && back.index > 0) {
printf(","); result.append(",");
} }
++back.index; ++back.index;
} }
@@ -197,57 +198,85 @@ Callbacks minifyCallbacks() {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->on_begin_value(); state->on_begin_value();
state->stack.push_back({0, true}); state->stack.push_back({0, true});
printf("{"); state->result.append("{");
}; };
result.on_end_object = +[](void *p) { result.on_end_object = +[](void *p) {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->stack.pop_back(); state->stack.pop_back();
printf("}"); state->result.append("}");
}; };
result.on_begin_string = +[](void *p) { result.on_begin_string = +[](void *p) {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->on_begin_value(); state->on_begin_value();
printf("\""); state->result.append("\"");
};
result.on_string_data = +[](void *p, const char *buf, int len) {
auto *state = (MinifyState *)p;
state->result.append(std::string(buf, len));
};
result.on_end_string = +[](void *p) {
auto *state = (MinifyState *)p;
state->result.append("\"");
}; };
result.on_string_data =
+[](void *, const char *buf, int len) { printf("%.*s", len, buf); };
result.on_end_string = +[](void *p) { printf("\""); };
result.on_begin_array = +[](void *p) { result.on_begin_array = +[](void *p) {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->on_begin_value(); state->on_begin_value();
state->stack.push_back({0, false}); state->stack.push_back({0, false});
printf("["); state->result.append("[");
}; };
result.on_end_array = +[](void *p) { result.on_end_array = +[](void *p) {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->stack.pop_back(); state->stack.pop_back();
printf("]"); state->result.append("]");
}; };
result.on_begin_number = +[](void *p) { result.on_begin_number = +[](void *p) {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->on_begin_value(); state->on_begin_value();
}; };
result.on_number_data = result.on_number_data = +[](void *p, const char *buf, int len) {
+[](void *, const char *buf, int len) { printf("%.*s", len, buf); }; auto *state = (MinifyState *)p;
state->result.append(std::string(buf, len));
};
result.on_end_number = +[](void *) {}; result.on_end_number = +[](void *) {};
result.on_true_literal = +[](void *p) { result.on_true_literal = +[](void *p) {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->on_begin_value(); state->on_begin_value();
printf("true"); state->result.append("true");
}; };
result.on_false_literal = +[](void *p) { result.on_false_literal = +[](void *p) {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->on_begin_value(); state->on_begin_value();
printf("false"); state->result.append("false");
}; };
result.on_null_literal = +[](void *p) { result.on_null_literal = +[](void *p) {
auto *state = (MinifyState *)p; auto *state = (MinifyState *)p;
state->on_begin_value(); state->on_begin_value();
printf("null"); state->result.append("null");
}; };
return result; return result;
} }
void testStreaming(std::string const &json) {
MinifyState streaming;
MinifyState batch;
auto c = minifyCallbacks();
{
auto copy = json;
parser3::Parser3 parser(&c, &streaming);
for (int i = 0; i < copy.size(); ++i) {
REQUIRE(parser.parse(copy.data() + i, 1) == parser3::S_AGAIN);
}
CHECK(parser.parse(nullptr, 0) == parser3::S_OK);
}
{
auto copy = json;
parser3::Parser3 parser(&c, &batch);
REQUIRE(parser.parse(copy.data(), copy.size()) == parser3::S_AGAIN);
CHECK(parser.parse(nullptr, 0) == parser3::S_OK);
}
CHECK(streaming.result == batch.result);
}
Callbacks noopCallbacks() { Callbacks noopCallbacks() {
Callbacks result; Callbacks result;
result.on_begin_object = +[](void *) {}; result.on_begin_object = +[](void *) {};
@@ -305,6 +334,8 @@ TEST_CASE("parser3") {
} }
} }
TEST_CASE("streaming") { testStreaming(json); }
TEST_CASE("bench3") { TEST_CASE("bench3") {
auto c = noopCallbacks(); auto c = noopCallbacks();
ankerl::nanobench::Bench bench; ankerl::nanobench::Bench bench;