13typedef bool test_func();
18static int valid_count = 0;
19static int test_no = 0;
21#define SWAP_IDX(a, b) \
28static bool test_alloc() {
29 ctx = equix_alloc(EQUIX_CTX_SOLVE | EQUIX_CTX_TRY_COMPILE);
34static bool test_free() {
39static bool test_solve() {
41 for (nonce = 0; output.count == 0 && nonce < 20; ++nonce) {
42 equix_result result = equix_solve(ctx, &nonce,
sizeof(nonce), &output);
43 assert(result == EQUIX_OK);
46 assert(output.count > 0);
47 assert(output.flags == EQUIX_SOLVER_DID_USE_COMPILER || output.flags == 0);
48 printf(
"(using %s HashX) ",
49 (EQUIX_SOLVER_DID_USE_COMPILER & output.flags)
50 ?
"compiled" :
"interpreted");
54static bool test_verify1() {
55 equix_result result = equix_verify(ctx, &nonce,
sizeof(nonce), &output.sols[0]);
56 assert(result == EQUIX_OK);
60static bool test_verify2() {
61 SWAP_IDX(output.sols[0].idx[0], output.sols[0].idx[1]);
62 equix_result result = equix_verify(ctx, &nonce,
sizeof(nonce), &output.sols[0]);
63 assert(result == EQUIX_FAIL_ORDER);
67static bool test_verify3() {
68 SWAP_IDX(output.sols[0].idx[0], output.sols[0].idx[4]);
69 SWAP_IDX(output.sols[0].idx[1], output.sols[0].idx[5]);
70 SWAP_IDX(output.sols[0].idx[2], output.sols[0].idx[6]);
71 SWAP_IDX(output.sols[0].idx[3], output.sols[0].idx[7]);
72 equix_result result = equix_verify(ctx, &nonce,
sizeof(nonce), &output.sols[0]);
73 assert(result == EQUIX_FAIL_ORDER);
74 SWAP_IDX(output.sols[0].idx[0], output.sols[0].idx[4]);
75 SWAP_IDX(output.sols[0].idx[1], output.sols[0].idx[5]);
76 SWAP_IDX(output.sols[0].idx[2], output.sols[0].idx[6]);
77 SWAP_IDX(output.sols[0].idx[3], output.sols[0].idx[7]);
81static bool test_verify4() {
82 SWAP_IDX(output.sols[0].idx[1], output.sols[0].idx[2]);
83 equix_result result = equix_verify(ctx, &nonce,
sizeof(nonce), &output.sols[0]);
84 assert(result == EQUIX_FAIL_PARTIAL_SUM);
85 SWAP_IDX(output.sols[0].idx[1], output.sols[0].idx[2]);
89static void permute_idx(
int start) {
90 if (start == EQUIX_NUM_IDX - 1) {
91 equix_result result = equix_verify(ctx, &nonce,
sizeof(nonce), &output.sols[0]);
92 valid_count += result == EQUIX_OK;
95 for (
int i = start; i < EQUIX_NUM_IDX; ++i) {
96 SWAP_IDX(output.sols[0].idx[start], output.sols[0].idx[i]);
97 permute_idx(start + 1);
98 SWAP_IDX(output.sols[0].idx[start], output.sols[0].idx[i]);
103static bool test_permutations() {
105 assert(valid_count == 1);
110#define RUN_TEST(x) run_test(#x, &x)
112static void run_test(
const char*
name, test_func* func) {
113 printf(
"[%2i] %-40s ... ", ++test_no,
name);
114 printf(func() ?
"PASSED\n" :
"SKIPPED\n");
118 RUN_TEST(test_alloc);
119 RUN_TEST(test_solve);
120 RUN_TEST(test_verify1);
121 RUN_TEST(test_verify2);
122 RUN_TEST(test_verify3);
123 RUN_TEST(test_verify4);
124 RUN_TEST(test_permutations);
127 printf(
"\nAll tests were successful\n");
int main(int argc, char *argv[])