mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-27 19:53:36 +08:00
Add a simple ASCII conversion test and benchmark
Run `fish_tests perf_convert_ascii` to run the benchmark.
This commit is contained in:
parent
a3e20a4d38
commit
4d5d90d828
|
@ -94,11 +94,12 @@ static int s_test_run_count = 0;
|
||||||
|
|
||||||
// Indicate if we should test the given function. Either we test everything (all arguments) or we
|
// Indicate if we should test the given function. Either we test everything (all arguments) or we
|
||||||
// run only tests that have a prefix in s_arguments.
|
// run only tests that have a prefix in s_arguments.
|
||||||
static bool should_test_function(const char *func_name) {
|
// If \p default_on is set, then allow no args to run this test by default.
|
||||||
// No args, test everything.
|
static bool should_test_function(const char *func_name, bool default_on = true) {
|
||||||
bool result = false;
|
bool result = false;
|
||||||
if (!s_arguments || !s_arguments[0]) {
|
if (!s_arguments || !s_arguments[0]) {
|
||||||
result = true;
|
// No args, test if defaulted on.
|
||||||
|
result = default_on;
|
||||||
} else {
|
} else {
|
||||||
for (size_t i = 0; s_arguments[i] != NULL; i++) {
|
for (size_t i = 0; s_arguments[i] != NULL; i++) {
|
||||||
if (!std::strncmp(func_name, s_arguments[i], std::strlen(s_arguments[i]))) {
|
if (!std::strncmp(func_name, s_arguments[i], std::strlen(s_arguments[i]))) {
|
||||||
|
@ -518,6 +519,50 @@ static void test_convert() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Verify that ASCII narrow->wide conversions are correct.
|
||||||
|
static void test_convert_ascii() {
|
||||||
|
std::string s(4096, '\0');
|
||||||
|
for (size_t i = 0; i < s.size(); i++) {
|
||||||
|
s[i] = (i % 10) + '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test a variety of alignments.
|
||||||
|
for (size_t left = 0; left < 16; left++) {
|
||||||
|
for (size_t right = 0; right < 16; right++) {
|
||||||
|
const char *start = s.data() + left;
|
||||||
|
size_t len = s.size() - left - right;
|
||||||
|
wcstring wide = str2wcstring(start, len);
|
||||||
|
std::string narrow = wcs2string(wide);
|
||||||
|
do_test(narrow == std::string(start, len));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put some non-ASCII bytes in and ensure it all still works.
|
||||||
|
for (char &c : s) {
|
||||||
|
char saved = c;
|
||||||
|
c = 0xF7;
|
||||||
|
do_test(wcs2string(str2wcstring(s)) == s);
|
||||||
|
c = saved;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void perf_convert_ascii() {
|
||||||
|
std::string s(128 * 1024, '\0');
|
||||||
|
for (size_t i = 0; i < s.size(); i++) {
|
||||||
|
s[i] = (i % 10) + '0';
|
||||||
|
}
|
||||||
|
(void)str2wcstring(s);
|
||||||
|
|
||||||
|
double start = timef();
|
||||||
|
const int iters = 1024;
|
||||||
|
for (int i=0; i < iters; i++) {
|
||||||
|
(void)str2wcstring(s);
|
||||||
|
}
|
||||||
|
double end = timef();
|
||||||
|
auto usec = static_cast<unsigned long long>(((end - start) * 1E6) / iters);
|
||||||
|
say(L"ASCII string conversion perf: %lu bytes in %llu usec", s.size(), usec);
|
||||||
|
}
|
||||||
|
|
||||||
/// Verify correct behavior with embedded nulls.
|
/// Verify correct behavior with embedded nulls.
|
||||||
static void test_convert_nulls() {
|
static void test_convert_nulls() {
|
||||||
say(L"Testing convert_nulls");
|
say(L"Testing convert_nulls");
|
||||||
|
@ -6021,6 +6066,8 @@ int main(int argc, char **argv) {
|
||||||
if (should_test_function("escape")) test_escape_quotes();
|
if (should_test_function("escape")) test_escape_quotes();
|
||||||
if (should_test_function("format")) test_format();
|
if (should_test_function("format")) test_format();
|
||||||
if (should_test_function("convert")) test_convert();
|
if (should_test_function("convert")) test_convert();
|
||||||
|
if (should_test_function("convert_ascii")) test_convert_ascii();
|
||||||
|
if (should_test_function("perf_convert_ascii", false)) perf_convert_ascii();
|
||||||
if (should_test_function("convert_nulls")) test_convert_nulls();
|
if (should_test_function("convert_nulls")) test_convert_nulls();
|
||||||
if (should_test_function("tokenizer")) test_tokenizer();
|
if (should_test_function("tokenizer")) test_tokenizer();
|
||||||
if (should_test_function("fd_monitor")) test_fd_monitor();
|
if (should_test_function("fd_monitor")) test_fd_monitor();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user