1 1.4 joerg /* $NetBSD: t_bitstring.c,v 1.4 2012/03/25 06:54:04 joerg Exp $ */ 2 1.1 jmmv 3 1.1 jmmv /*- 4 1.1 jmmv * Copyright (c) 1993, 2008, 2010 The NetBSD Foundation, Inc. 5 1.1 jmmv * All rights reserved. 6 1.1 jmmv * 7 1.1 jmmv * Redistribution and use in source and binary forms, with or without 8 1.1 jmmv * modification, are permitted provided that the following conditions 9 1.1 jmmv * are met: 10 1.1 jmmv * 1. Redistributions of source code must retain the above copyright 11 1.1 jmmv * notice, this list of conditions and the following disclaimer. 12 1.1 jmmv * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jmmv * notice, this list of conditions and the following disclaimer in the 14 1.1 jmmv * documentation and/or other materials provided with the distribution. 15 1.1 jmmv * 16 1.1 jmmv * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 jmmv * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 jmmv * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 jmmv * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 jmmv * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 jmmv * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 jmmv * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 jmmv * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 jmmv * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 jmmv * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 jmmv * POSSIBILITY OF SUCH DAMAGE. 27 1.1 jmmv */ 28 1.1 jmmv 29 1.1 jmmv #include <assert.h> 30 1.1 jmmv #include <bitstring.h> 31 1.1 jmmv #include <stdio.h> 32 1.1 jmmv #include <stdlib.h> 33 1.1 jmmv 34 1.1 jmmv #include <atf-c.h> 35 1.1 jmmv 36 1.1 jmmv static void 37 1.1 jmmv clearbits(bitstr_t *b, int n) 38 1.1 jmmv { 39 1.1 jmmv int i = bitstr_size(n); 40 1.1 jmmv 41 1.1 jmmv while(i--) 42 1.1 jmmv *(b + i) = 0; 43 1.1 jmmv } 44 1.1 jmmv 45 1.1 jmmv static void 46 1.1 jmmv printbits(FILE *file, bitstr_t *b, int n) 47 1.1 jmmv { 48 1.1 jmmv int i; 49 1.1 jmmv int jc, js; 50 1.1 jmmv 51 1.1 jmmv bit_ffc(b, n, &jc); 52 1.1 jmmv bit_ffs(b, n, &js); 53 1.1 jmmv 54 1.1 jmmv (void) fprintf(file, "%3d %3d ", jc, js); 55 1.1 jmmv 56 1.1 jmmv for (i=0; i < n; i++) { 57 1.1 jmmv (void) fprintf(file, "%c", (bit_test(b, i) ? '1' : '0')); 58 1.1 jmmv } 59 1.1 jmmv 60 1.1 jmmv (void) fprintf(file, "%c", '\n'); 61 1.1 jmmv } 62 1.1 jmmv 63 1.1 jmmv static void 64 1.1 jmmv calculate_data(FILE *file, const int test_length) 65 1.1 jmmv { 66 1.2 christos int i; 67 1.1 jmmv bitstr_t *bs; 68 1.1 jmmv 69 1.1 jmmv assert(test_length >= 4); 70 1.1 jmmv 71 1.1 jmmv (void) fprintf(file, "Testing with TEST_LENGTH = %d\n\n", test_length); 72 1.1 jmmv 73 1.1 jmmv (void) fprintf(file, "test _bit_byte, _bit_mask, and bitstr_size\n"); 74 1.1 jmmv (void) fprintf(file, " i _bit_byte(i) _bit_mask(i) bitstr_size(i)\n"); 75 1.1 jmmv 76 1.1 jmmv for (i=0; i < test_length; i++) { 77 1.2 christos (void) fprintf(file, "%3d%15u%15u%15zu\n", 78 1.1 jmmv i, _bit_byte(i), _bit_mask(i), bitstr_size(i)); 79 1.1 jmmv } 80 1.1 jmmv 81 1.1 jmmv bs = bit_alloc(test_length); 82 1.1 jmmv clearbits(bs, test_length); 83 1.1 jmmv (void) fprintf(file, "\ntest bit_alloc, clearbits, bit_ffc, bit_ffs\n"); 84 1.1 jmmv (void) fprintf(file, "be: 0 -1 "); 85 1.1 jmmv for (i=0; i < test_length; i++) 86 1.1 jmmv (void) fprintf(file, "%c", '0'); 87 1.1 jmmv (void) fprintf(file, "\nis: "); 88 1.1 jmmv printbits(file, bs, test_length); 89 1.1 jmmv 90 1.1 jmmv (void) fprintf(file, "\ntest bit_set\n"); 91 1.1 jmmv for (i=0; i < test_length; i+=3) 92 1.1 jmmv bit_set(bs, i); 93 1.1 jmmv (void) fprintf(file, "be: 1 0 "); 94 1.1 jmmv for (i=0; i < test_length; i++) 95 1.4 joerg (void) fprintf(file, "%c", "100"[i % 3]); 96 1.1 jmmv (void) fprintf(file, "\nis: "); 97 1.1 jmmv printbits(file, bs, test_length); 98 1.1 jmmv 99 1.1 jmmv (void) fprintf(file, "\ntest bit_clear\n"); 100 1.1 jmmv for (i=0; i < test_length; i+=6) 101 1.1 jmmv bit_clear(bs, i); 102 1.1 jmmv (void) fprintf(file, "be: 0 3 "); 103 1.1 jmmv for (i=0; i < test_length; i++) 104 1.4 joerg (void) fprintf(file, "%c", "000100"[i % 6]); 105 1.1 jmmv (void) fprintf(file, "\nis: "); 106 1.1 jmmv printbits(file, bs, test_length); 107 1.1 jmmv 108 1.1 jmmv (void) fprintf(file, "\ntest bit_test using previous bitstring\n"); 109 1.1 jmmv (void) fprintf(file, " i bit_test(i)\n"); 110 1.1 jmmv for (i=0; i < test_length; i++) 111 1.1 jmmv (void) fprintf(file, "%3d%15d\n", i, bit_test(bs, i)); 112 1.1 jmmv 113 1.1 jmmv clearbits(bs, test_length); 114 1.1 jmmv (void) fprintf(file, "\ntest clearbits\n"); 115 1.1 jmmv (void) fprintf(file, "be: 0 -1 "); 116 1.1 jmmv for (i=0; i < test_length; i++) 117 1.1 jmmv (void) fprintf(file, "%c", '0'); 118 1.1 jmmv (void) fprintf(file, "\nis: "); 119 1.1 jmmv printbits(file, bs, test_length); 120 1.1 jmmv 121 1.1 jmmv (void) fprintf(file, "\ntest bit_nset and bit_nclear\n"); 122 1.1 jmmv bit_nset(bs, 1, test_length - 2); 123 1.1 jmmv (void) fprintf(file, "be: 0 1 0"); 124 1.1 jmmv for (i=0; i < test_length - 2; i++) 125 1.1 jmmv (void) fprintf(file, "%c", '1'); 126 1.1 jmmv (void) fprintf(file, "0\nis: "); 127 1.1 jmmv printbits(file, bs, test_length); 128 1.1 jmmv 129 1.1 jmmv bit_nclear(bs, 2, test_length - 3); 130 1.1 jmmv (void) fprintf(file, "be: 0 1 01"); 131 1.1 jmmv for (i=0; i < test_length - 4; i++) 132 1.1 jmmv (void) fprintf(file, "%c", '0'); 133 1.1 jmmv (void) fprintf(file, "10\nis: "); 134 1.1 jmmv printbits(file, bs, test_length); 135 1.1 jmmv 136 1.1 jmmv bit_nclear(bs, 0, test_length - 1); 137 1.1 jmmv (void) fprintf(file, "be: 0 -1 "); 138 1.1 jmmv for (i=0; i < test_length; i++) 139 1.1 jmmv (void) fprintf(file, "%c", '0'); 140 1.1 jmmv (void) fprintf(file, "\nis: "); 141 1.1 jmmv printbits(file, bs, test_length); 142 1.1 jmmv bit_nset(bs, 0, test_length - 2); 143 1.1 jmmv (void) fprintf(file, "be: %3d 0 ",test_length - 1); 144 1.1 jmmv for (i=0; i < test_length - 1; i++) 145 1.1 jmmv (void) fprintf(file, "%c", '1'); 146 1.1 jmmv fprintf(file, "%c", '0'); 147 1.1 jmmv (void) fprintf(file, "\nis: "); 148 1.1 jmmv printbits(file, bs, test_length); 149 1.1 jmmv bit_nclear(bs, 0, test_length - 1); 150 1.1 jmmv (void) fprintf(file, "be: 0 -1 "); 151 1.1 jmmv for (i=0; i < test_length; i++) 152 1.1 jmmv (void) fprintf(file, "%c", '0'); 153 1.1 jmmv (void) fprintf(file, "\nis: "); 154 1.1 jmmv printbits(file, bs, test_length); 155 1.1 jmmv 156 1.1 jmmv (void) fprintf(file, "\n"); 157 1.1 jmmv (void) fprintf(file, "first 1 bit should move right 1 position each line\n"); 158 1.1 jmmv for (i=0; i < test_length; i++) { 159 1.1 jmmv bit_nclear(bs, 0, test_length - 1); 160 1.1 jmmv bit_nset(bs, i, test_length - 1); 161 1.1 jmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length); 162 1.1 jmmv } 163 1.1 jmmv 164 1.1 jmmv (void) fprintf(file, "\n"); 165 1.1 jmmv (void) fprintf(file, "first 0 bit should move right 1 position each line\n"); 166 1.1 jmmv for (i=0; i < test_length; i++) { 167 1.1 jmmv bit_nset(bs, 0, test_length - 1); 168 1.1 jmmv bit_nclear(bs, i, test_length - 1); 169 1.1 jmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length); 170 1.1 jmmv } 171 1.1 jmmv 172 1.1 jmmv (void) fprintf(file, "\n"); 173 1.1 jmmv (void) fprintf(file, "first 0 bit should move left 1 position each line\n"); 174 1.1 jmmv for (i=0; i < test_length; i++) { 175 1.1 jmmv bit_nclear(bs, 0, test_length - 1); 176 1.1 jmmv bit_nset(bs, 0, test_length - 1 - i); 177 1.1 jmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length); 178 1.1 jmmv } 179 1.1 jmmv 180 1.1 jmmv (void) fprintf(file, "\n"); 181 1.1 jmmv (void) fprintf(file, "first 1 bit should move left 1 position each line\n"); 182 1.1 jmmv for (i=0; i < test_length; i++) { 183 1.1 jmmv bit_nset(bs, 0, test_length - 1); 184 1.1 jmmv bit_nclear(bs, 0, test_length - 1 - i); 185 1.1 jmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length); 186 1.1 jmmv } 187 1.1 jmmv 188 1.1 jmmv (void) fprintf(file, "\n"); 189 1.1 jmmv (void) fprintf(file, "0 bit should move right 1 position each line\n"); 190 1.1 jmmv for (i=0; i < test_length; i++) { 191 1.1 jmmv bit_nset(bs, 0, test_length - 1); 192 1.1 jmmv bit_nclear(bs, i, i); 193 1.1 jmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length); 194 1.1 jmmv } 195 1.1 jmmv 196 1.1 jmmv (void) fprintf(file, "\n"); 197 1.1 jmmv (void) fprintf(file, "1 bit should move right 1 position each line\n"); 198 1.1 jmmv for (i=0; i < test_length; i++) { 199 1.1 jmmv bit_nclear(bs, 0, test_length - 1); 200 1.1 jmmv bit_nset(bs, i, i); 201 1.1 jmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length); 202 1.1 jmmv } 203 1.1 jmmv 204 1.1 jmmv (void) free(bs); 205 1.1 jmmv } 206 1.1 jmmv 207 1.2 christos static void 208 1.1 jmmv one_check(const atf_tc_t *tc, const int test_length) 209 1.1 jmmv { 210 1.1 jmmv FILE *out; 211 1.1 jmmv char command[1024]; 212 1.1 jmmv 213 1.1 jmmv ATF_REQUIRE((out = fopen("out", "w")) != NULL); 214 1.1 jmmv calculate_data(out, test_length); 215 1.1 jmmv fclose(out); 216 1.1 jmmv 217 1.1 jmmv /* XXX The following is a huge hack that was added to simplify the 218 1.1 jmmv * conversion of these tests from src/regress/ to src/tests/. The 219 1.1 jmmv * tests in this file should be checking their own results, without 220 1.1 jmmv * having to resort to external data files. */ 221 1.1 jmmv snprintf(command, sizeof(command), "diff -u %s/d_bitstring_%d.out out", 222 1.1 jmmv atf_tc_get_config_var(tc, "srcdir"), test_length); 223 1.1 jmmv if (system(command) != EXIT_SUCCESS) 224 1.1 jmmv atf_tc_fail("Test failed; see output for details"); 225 1.1 jmmv } 226 1.1 jmmv 227 1.1 jmmv ATF_TC(bits_8); 228 1.1 jmmv ATF_TC_HEAD(bits_8, tc) 229 1.1 jmmv { 230 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks 8-bit long bitstrings"); 231 1.1 jmmv } 232 1.1 jmmv ATF_TC_BODY(bits_8, tc) 233 1.1 jmmv { 234 1.1 jmmv one_check(tc, 8); 235 1.1 jmmv } 236 1.1 jmmv 237 1.1 jmmv ATF_TC(bits_27); 238 1.1 jmmv ATF_TC_HEAD(bits_27, tc) 239 1.1 jmmv { 240 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks 27-bit long bitstrings"); 241 1.1 jmmv } 242 1.1 jmmv ATF_TC_BODY(bits_27, tc) 243 1.1 jmmv { 244 1.1 jmmv one_check(tc, 27); 245 1.1 jmmv } 246 1.1 jmmv 247 1.1 jmmv ATF_TC(bits_32); 248 1.1 jmmv ATF_TC_HEAD(bits_32, tc) 249 1.1 jmmv { 250 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks 32-bit long bitstrings"); 251 1.1 jmmv } 252 1.1 jmmv ATF_TC_BODY(bits_32, tc) 253 1.1 jmmv { 254 1.1 jmmv one_check(tc, 32); 255 1.1 jmmv } 256 1.1 jmmv 257 1.1 jmmv ATF_TC(bits_49); 258 1.1 jmmv ATF_TC_HEAD(bits_49, tc) 259 1.1 jmmv { 260 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks 49-bit long bitstrings"); 261 1.1 jmmv } 262 1.1 jmmv ATF_TC_BODY(bits_49, tc) 263 1.1 jmmv { 264 1.1 jmmv one_check(tc, 49); 265 1.1 jmmv } 266 1.1 jmmv 267 1.1 jmmv ATF_TC(bits_64); 268 1.1 jmmv ATF_TC_HEAD(bits_64, tc) 269 1.1 jmmv { 270 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks 64-bit long bitstrings"); 271 1.1 jmmv } 272 1.1 jmmv ATF_TC_BODY(bits_64, tc) 273 1.1 jmmv { 274 1.1 jmmv one_check(tc, 64); 275 1.1 jmmv } 276 1.1 jmmv 277 1.1 jmmv ATF_TC(bits_67); 278 1.1 jmmv ATF_TC_HEAD(bits_67, tc) 279 1.1 jmmv { 280 1.1 jmmv atf_tc_set_md_var(tc, "descr", "Checks 67-bit long bitstrings"); 281 1.1 jmmv } 282 1.1 jmmv ATF_TC_BODY(bits_67, tc) 283 1.1 jmmv { 284 1.1 jmmv one_check(tc, 67); 285 1.1 jmmv } 286 1.1 jmmv 287 1.1 jmmv ATF_TP_ADD_TCS(tp) 288 1.1 jmmv { 289 1.1 jmmv 290 1.1 jmmv ATF_TP_ADD_TC(tp, bits_8); 291 1.1 jmmv ATF_TP_ADD_TC(tp, bits_27); 292 1.1 jmmv ATF_TP_ADD_TC(tp, bits_32); 293 1.1 jmmv ATF_TP_ADD_TC(tp, bits_49); 294 1.1 jmmv ATF_TP_ADD_TC(tp, bits_64); 295 1.1 jmmv ATF_TP_ADD_TC(tp, bits_67); 296 1.1 jmmv 297 1.1 jmmv return atf_no_error(); 298 1.1 jmmv } 299