aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/exess/test/num_test_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/exess/test/num_test_utils.h')
-rw-r--r--subprojects/exess/test/num_test_utils.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/subprojects/exess/test/num_test_utils.h b/subprojects/exess/test/num_test_utils.h
new file mode 100644
index 00000000..ca29a479
--- /dev/null
+++ b/subprojects/exess/test/num_test_utils.h
@@ -0,0 +1,85 @@
+/*
+ Copyright 2011-2021 David Robillard <d@drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#ifdef _WIN32
+# include <process.h>
+#else
+# include <unistd.h>
+#endif
+
+typedef struct {
+ size_t n_tests;
+ uint32_t seed;
+ bool exhaustive;
+ bool error;
+} ExessNumTestOptions;
+
+static bool
+print_num_test_usage(const char* const name)
+{
+ fprintf(stderr, "Usage: %s [OPTION]...\n", name);
+ fprintf(stderr, " -n NUM_TESTS Number of random tests to run.\n");
+ fprintf(stderr, " -s SEED Use random seed.\n");
+ fprintf(stderr, " -x Exhaustively test numbers.\n");
+ return true;
+}
+
+static ExessNumTestOptions
+parse_num_test_options(const int argc, char* const* const argv)
+{
+ ExessNumTestOptions opts = {
+ 16384u, (uint32_t)time(NULL) + (uint32_t)getpid(), false, false};
+
+ int a = 1;
+ for (; a < argc && argv[a][0] == '-'; ++a) {
+ if (argv[a][1] == 'x') {
+ opts.exhaustive = true;
+ } else if (argv[a][1] == 's') {
+ if (++a == argc) {
+ opts.error = print_num_test_usage(argv[0]);
+ break;
+ }
+
+ opts.seed = (uint32_t)strtol(argv[a], NULL, 10);
+ } else if (argv[a][1] == 'n') {
+ if (++a == argc) {
+ opts.error = print_num_test_usage(argv[0]);
+ break;
+ }
+
+ opts.n_tests = (uint32_t)strtol(argv[a], NULL, 10);
+ } else {
+ opts.error = print_num_test_usage(argv[0]);
+ break;
+ }
+ }
+
+ return opts;
+}
+
+static void
+print_num_test_progress(const uint64_t i, const uint64_t n_tests)
+{
+ if (i % (n_tests / 20) == 1) {
+ fprintf(stderr, "%f%%\n", (double)i / (double)n_tests * 100.0);
+ }
+}