8 #include <ccan/array_size/array_size.h>
9 #include <ccan/permutation/permutation.h>
10 #include <ccan/tap/tap.h>
14 #define PERMUTE(pi, arr) \
16 ok1(PERMUTATION_CHANGE_ARRAY((pi), (arr))); \
19 #define CHECK_ORDER(a, t, ...) \
21 t cmp[] = { __VA_ARGS__ }; \
22 ok1(memcmp((a), cmp, sizeof(cmp)) == 0); \
26 typedef char word[WORDLEN];
30 struct permutation *pi;
32 char pair[] = { 'P', 'Q' };
33 uint16_t triple[] = {7, 9, 1000};
34 word four[] = {"ZERO", "ONE", "TWO", "THREE"};
37 plan_tests(2 * permutation_count(1) + 1
38 + 2 * permutation_count(2) + 1
39 + 2 * permutation_count(3) + 1
40 + 2 * permutation_count(4) + 1
44 pi = permutation_new(1);
45 CHECK_ORDER(&single, int, 12345);
46 ok1(!permutation_change_array(pi, &single, sizeof(single)));
47 CHECK_ORDER(&single, int, 12345);
51 pi = PERMUTATION_NEW(pair);
52 CHECK_ORDER(pair, char, 'P', 'Q');
54 CHECK_ORDER(pair, char, 'Q', 'P');
55 ok1(!PERMUTATION_CHANGE_ARRAY(pi, pair));
56 CHECK_ORDER(pair, char, 'Q', 'P');
60 pi = PERMUTATION_NEW(triple);
61 CHECK_ORDER(triple, uint16_t, 7, 9, 1000);
63 CHECK_ORDER(triple, uint16_t, 7, 1000, 9);
65 CHECK_ORDER(triple, uint16_t, 1000, 7, 9);
67 CHECK_ORDER(triple, uint16_t, 1000, 9, 7);
69 CHECK_ORDER(triple, uint16_t, 9, 1000, 7);
71 CHECK_ORDER(triple, uint16_t, 9, 7, 1000);
72 ok1(!PERMUTATION_CHANGE_ARRAY(pi, triple));
73 CHECK_ORDER(triple, uint16_t, 9, 7, 1000);
77 pi = PERMUTATION_NEW(four);
78 CHECK_ORDER(four, word, "ZERO", "ONE", "TWO", "THREE");
80 CHECK_ORDER(four, word, "ZERO", "ONE", "THREE", "TWO");
82 CHECK_ORDER(four, word, "ZERO", "THREE", "ONE", "TWO");
84 CHECK_ORDER(four, word, "THREE", "ZERO", "ONE", "TWO");
86 CHECK_ORDER(four, word, "THREE", "ZERO", "TWO", "ONE");
88 CHECK_ORDER(four, word, "ZERO", "THREE", "TWO", "ONE");
90 CHECK_ORDER(four, word, "ZERO", "TWO", "THREE", "ONE");
92 CHECK_ORDER(four, word, "ZERO", "TWO", "ONE", "THREE");
94 CHECK_ORDER(four, word, "TWO", "ZERO", "ONE", "THREE");
96 CHECK_ORDER(four, word, "TWO", "ZERO", "THREE", "ONE");
98 CHECK_ORDER(four, word, "TWO", "THREE", "ZERO", "ONE");
100 CHECK_ORDER(four, word, "THREE", "TWO", "ZERO", "ONE");
102 CHECK_ORDER(four, word, "THREE", "TWO", "ONE", "ZERO");
104 CHECK_ORDER(four, word, "TWO", "THREE", "ONE", "ZERO");
106 CHECK_ORDER(four, word, "TWO", "ONE", "THREE", "ZERO");
108 CHECK_ORDER(four, word, "TWO", "ONE", "ZERO", "THREE");
110 CHECK_ORDER(four, word, "ONE", "TWO", "ZERO", "THREE");
112 CHECK_ORDER(four, word, "ONE", "TWO", "THREE", "ZERO");
114 CHECK_ORDER(four, word, "ONE", "THREE", "TWO", "ZERO");
116 CHECK_ORDER(four, word, "THREE", "ONE", "TWO", "ZERO");
118 CHECK_ORDER(four, word, "THREE", "ONE", "ZERO", "TWO");
120 CHECK_ORDER(four, word, "ONE", "THREE", "ZERO", "TWO");
122 CHECK_ORDER(four, word, "ONE", "ZERO", "THREE", "TWO");
124 CHECK_ORDER(four, word, "ONE", "ZERO", "TWO", "THREE");
125 ok1(!PERMUTATION_CHANGE_ARRAY(pi, four));
126 CHECK_ORDER(four, word, "ONE", "ZERO", "TWO", "THREE");
129 for (i = 0; i <= MAX_ITEMS; i++) {
132 diag("Counting permutations of %d\n", i);
134 pi = permutation_new(i);
135 while (permutation_change(pi))
138 ok(nperms == permutation_count(i),
139 "%"PRId64" permutations of %d (%d! == %lld)",
140 nperms, i, i, permutation_count(i));
144 /* This exits depending on whether all tests passed */
146 return exit_status();