return normalizer.normalize(input.c_str(), input.size());
}
-TEST_CASE("benchmarking - ::normalize() - literals", "[JSNormalizer]")
+TEST_CASE("JS Normalizer, literals by 8 K", "[JSNormalizer]")
{
JSIdentifierCtxTest ident_ctx;
JSNormalizer normalizer(ident_ctx, UNLIM_DEPTH, MAX_TEMPLATE_NESTING, MAX_SCOPE_DEPTH);
char dst[DEPTH];
- auto whitespace = make_input("", " ", "", DEPTH);
- auto block_comment = make_input("/*", " ", "*/", DEPTH);
- auto double_quote = make_input("\"", " ", "\"", DEPTH);
- BENCHMARK("memcpy - whitespaces - 65535 bytes")
+ constexpr size_t size = 1 << 13;
+
+ auto data_pl = make_input("", ".", "", size);
+ auto data_ws = make_input("", " ", "", size);
+ auto data_bc = make_input("/*", " ", "*/", size);
+ auto data_dq = make_input("\"", " ", "\"", size);
+
+ BENCHMARK("memcpy()")
{
- return memcpy(dst, whitespace.c_str(), whitespace.size());
+ return memcpy(dst, data_pl.c_str(), data_pl.size());
};
- REQUIRE(norm_ret(normalizer, whitespace) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("whitespaces - 65535 bytes")
+ REQUIRE(norm_ret(normalizer, data_ws) == JSTokenizer::SCRIPT_ENDED);
+ BENCHMARK("whitespaces")
{
normalizer.rewind_output();
- return normalizer.normalize(whitespace.c_str(), whitespace.size());
+ return normalizer.normalize(data_ws.c_str(), data_ws.size());
};
- REQUIRE(norm_ret(normalizer, block_comment) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("block comment - 65535 bytes")
+ REQUIRE(norm_ret(normalizer, data_bc) == JSTokenizer::SCRIPT_ENDED);
+ BENCHMARK("block comment")
{
normalizer.rewind_output();
- return normalizer.normalize(block_comment.c_str(), block_comment.size());
+ return normalizer.normalize(data_bc.c_str(), data_bc.size());
};
- REQUIRE(norm_ret(normalizer, double_quote) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("double quotes string - 65535 bytes")
+ REQUIRE(norm_ret(normalizer, data_dq) == JSTokenizer::SCRIPT_ENDED);
+ BENCHMARK("double quotes string")
{
normalizer.rewind_output();
- return normalizer.normalize(double_quote.c_str(), double_quote.size());
+ return normalizer.normalize(data_dq.c_str(), data_dq.size());
};
+}
- constexpr size_t depth_8k = 8192;
+TEST_CASE("JS Normalizer, literals by 64 K", "[JSNormalizer]")
+{
+ JSIdentifierCtxTest ident_ctx;
+ JSNormalizer normalizer(ident_ctx, UNLIM_DEPTH, MAX_TEMPLATE_NESTING, MAX_SCOPE_DEPTH);
+ char dst[DEPTH];
+
+ constexpr size_t size = 1 << 16;
- auto whitespace_8k = make_input("", " ", "", depth_8k);
- auto block_comment_8k = make_input("/*", " ", "*/", depth_8k);
- auto double_quote_8k = make_input("\"", " ", "\"", depth_8k);
+ auto data_pl = make_input("", ".", "", size);
+ auto data_ws = make_input("", " ", "", size);
+ auto data_bc = make_input("/*", " ", "*/", size);
+ auto data_dq = make_input("\"", " ", "\"", size);
- BENCHMARK("memcpy - whitespaces - 8192 bytes")
+ BENCHMARK("memcpy()")
{
- return memcpy(dst, whitespace_8k.c_str(), whitespace_8k.size());
+ return memcpy(dst, data_pl.c_str(), data_pl.size());
};
- REQUIRE(norm_ret(normalizer, whitespace_8k) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("whitespaces - 8192 bytes")
+ REQUIRE(norm_ret(normalizer, data_ws) == JSTokenizer::SCRIPT_ENDED);
+ BENCHMARK("whitespaces")
{
normalizer.rewind_output();
- return normalizer.normalize(whitespace_8k.c_str(), whitespace_8k.size());
+ return normalizer.normalize(data_ws.c_str(), data_ws.size());
};
- REQUIRE(norm_ret(normalizer, block_comment_8k) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("block comment - 8192 bytes")
+ REQUIRE(norm_ret(normalizer, data_bc) == JSTokenizer::SCRIPT_ENDED);
+ BENCHMARK("block comment")
{
normalizer.rewind_output();
- return normalizer.normalize(block_comment_8k.c_str(), block_comment_8k.size());
+ return normalizer.normalize(data_bc.c_str(), data_bc.size());
};
- REQUIRE(norm_ret(normalizer, double_quote_8k) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("double quotes string - 8192 bytes")
+ REQUIRE(norm_ret(normalizer, data_dq) == JSTokenizer::SCRIPT_ENDED);
+ BENCHMARK("double quotes string")
{
normalizer.rewind_output();
- return normalizer.normalize(double_quote_8k.c_str(), double_quote_8k.size());
+ return normalizer.normalize(data_dq.c_str(), data_dq.size());
};
}
-TEST_CASE("benchmarking - ::normalize() - identifiers", "[JSNormalizer]")
+TEST_CASE("JS Normalizer, id normalization", "[JSNormalizer]")
{
// around 11 000 identifiers
std::string input;
};
}
-TEST_CASE("benchmarking - ::normalize() - scope", "[JSNormalizer]")
+TEST_CASE("JS Normalizer, scope tracking", "[JSNormalizer]")
{
constexpr uint32_t depth = 65535;
JSIdentifierCtxTest ident_ctx;
JSNormalizer normalizer(ident_ctx, UNLIM_DEPTH, MAX_TEMPLATE_NESTING, depth);
- char dst[depth];
auto src_ws = make_input("", " ", "", depth);
auto src_brace_rep = make_input_repeat("{}", depth);
auto src_paren_rep = make_input_repeat("()", depth);
auto src_bracket_rep = make_input_repeat("[]", depth);
- BENCHMARK("memcpy - ...{}{}{}... - 65535 bytes")
- {
- return memcpy(dst, src_brace_rep.c_str(), src_brace_rep.size());
- };
-
REQUIRE(norm_ret(normalizer, src_ws) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("whitespaces - 65535 bytes")
+ BENCHMARK("whitespaces")
{
normalizer.rewind_output();
return normalizer.normalize(src_ws.c_str(), src_ws.size());
};
REQUIRE(norm_ret(normalizer, src_brace_rep) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("...{}{}{}... - 65535 bytes")
+ BENCHMARK("...{}{}{}...")
{
normalizer.rewind_output();
return normalizer.normalize(src_brace_rep.c_str(), src_brace_rep.size());
};
REQUIRE(norm_ret(normalizer, src_paren_rep) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("...()()()... - 65535 bytes")
+ BENCHMARK("...()()()...")
{
normalizer.rewind_output();
return normalizer.normalize(src_paren_rep.c_str(), src_paren_rep.size());
};
REQUIRE(norm_ret(normalizer, src_bracket_rep) == JSTokenizer::SCRIPT_ENDED);
- BENCHMARK("...[][][]... - 65535 bytes")
+ BENCHMARK("...[][][]...")
{
normalizer.rewind_output();
return normalizer.normalize(src_bracket_rep.c_str(), src_bracket_rep.size());
};
}
-TEST_CASE("benchmarking - ::normalize() - automatic semicolon insertion")
+TEST_CASE("JS Normalizer, automatic semicolon", "[JSNormalizer]")
{
auto w_semicolons = make_input("", "a;\n", "", DEPTH);
auto wo_semicolons = make_input("", "a \n", "", DEPTH);
CHECK(!memcmp((exp), act, (exp_len))); \
}
+#define BYTES_READ(s, b) \
+ ((s).clear(), \
+ std::max((std::streamsize)(s).tellg(), \
+ (std::streamsize)(b).last_chunk_offset()) \
+ - (b).last_chunk_offset())
+
TEST_CASE("input buffer - basic one source", "[Stream buffers]")
{
const char* exp = "Early bird gets a corn.";
CHECK(0 == b.last_chunk_offset());
s.read(act, 1);
- CHECK(1 == b.last_chunk_offset());
+ CHECK(0 == b.last_chunk_offset());
+ CHECK(1 == BYTES_READ(s, b));
s.read(act, 2);
- CHECK(3 == b.last_chunk_offset());
+ CHECK(0 == b.last_chunk_offset());
+ CHECK(3 == BYTES_READ(s, b));
s.read(act, 5);
- CHECK(8 == b.last_chunk_offset());
+ CHECK(0 == b.last_chunk_offset());
+ CHECK(8 == BYTES_READ(s, b));
s.read(act, 1);
- CHECK(8 == b.last_chunk_offset());
+ CHECK(0 == b.last_chunk_offset());
+ CHECK(8 == BYTES_READ(s, b));
}
SECTION("two buffers")
CHECK(0 == b.last_chunk_offset());
b.pubsetbuf(dat1, strlen(dat1))->pubsetbuf(dat2, strlen(dat2));
- CHECK(0 == b.last_chunk_offset());
+ CHECK(4 == b.last_chunk_offset());
+ CHECK(0 == BYTES_READ(s, b));
s.read(act, 1);
- CHECK(0 == b.last_chunk_offset());
+ CHECK(4 == b.last_chunk_offset());
+ CHECK(0 == BYTES_READ(s, b));
s.read(act, 1);
- CHECK(0 == b.last_chunk_offset());
+ CHECK(4 == b.last_chunk_offset());
+ CHECK(0 == BYTES_READ(s, b));
s.read(act, 4);
- CHECK(2 == b.last_chunk_offset());
+ CHECK(4 == b.last_chunk_offset());
+ CHECK(2 == BYTES_READ(s, b));
s.read(act, 2);
CHECK(4 == b.last_chunk_offset());
+ CHECK(4 == BYTES_READ(s, b));
s.read(act, 1);
CHECK(4 == b.last_chunk_offset());
+ CHECK(4 == BYTES_READ(s, b));
}
SECTION("three buffers")
CHECK(0 == b.last_chunk_offset());
b.pubsetbuf(dat1, strlen(dat1))->pubsetbuf(dat2, strlen(dat2))->pubsetbuf(dat3, strlen(dat3));
- CHECK(0 == b.last_chunk_offset());
+ CHECK(8 == b.last_chunk_offset());
+ CHECK(0 == BYTES_READ(s, b));
s.read(act, 3);
- CHECK(0 == b.last_chunk_offset());
+ CHECK(8 == b.last_chunk_offset());
+ CHECK(0 == BYTES_READ(s, b));
s.read(act, 3);
- CHECK(0 == b.last_chunk_offset());
+ CHECK(8 == b.last_chunk_offset());
+ CHECK(0 == BYTES_READ(s, b));
s.read(act, 3);
- CHECK(1 == b.last_chunk_offset());
+ CHECK(8 == b.last_chunk_offset());
+ CHECK(1 == BYTES_READ(s, b));
s.read(act, 3);
- CHECK(4 == b.last_chunk_offset());
+ CHECK(8 == b.last_chunk_offset());
+ CHECK(4 == BYTES_READ(s, b));
s.read(act, 1);
- CHECK(4 == b.last_chunk_offset());
+ CHECK(8 == b.last_chunk_offset());
+ CHECK(4 == BYTES_READ(s, b));
}
}