xi2.c revision ed6184df
1/** 2 * Copyright © 2011 Red Hat, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24/* Test relies on assert() */ 25#undef NDEBUG 26 27#ifdef HAVE_DIX_CONFIG_H 28#include <dix-config.h> 29#endif 30 31#include <stdint.h> 32#include "inpututils.h" 33#include "inputstr.h" 34#include "assert.h" 35 36#include "protocol-common.h" 37 38ClientRec client_window; 39 40static void 41xi2mask_test(void) 42{ 43 XI2Mask *xi2mask = NULL, *mergemask = NULL; 44 unsigned char *mask; 45 DeviceIntRec dev; 46 DeviceIntRec all_devices, all_master_devices; 47 int i; 48 49 all_devices.id = XIAllDevices; 50 inputInfo.all_devices = &all_devices; 51 all_master_devices.id = XIAllMasterDevices; 52 inputInfo.all_master_devices = &all_master_devices; 53 54 /* size >= nmasks * 2 for the test cases below */ 55 xi2mask = xi2mask_new_with_size(MAXDEVICES + 2, (MAXDEVICES + 2) * 2); 56 assert(xi2mask); 57 assert(xi2mask->nmasks > 0); 58 assert(xi2mask->mask_size > 0); 59 60 assert(xi2mask_mask_size(xi2mask) == xi2mask->mask_size); 61 assert(xi2mask_num_masks(xi2mask) == xi2mask->nmasks); 62 63 mask = calloc(1, xi2mask_mask_size(xi2mask)); 64 /* ensure zeros */ 65 for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { 66 const unsigned char *m = xi2mask_get_one_mask(xi2mask, i); 67 68 assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); 69 } 70 71 /* set various bits */ 72 for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { 73 const unsigned char *m; 74 75 xi2mask_set(xi2mask, i, i); 76 77 dev.id = i; 78 assert(xi2mask_isset(xi2mask, &dev, i)); 79 80 m = xi2mask_get_one_mask(xi2mask, i); 81 SetBit(mask, i); 82 assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); 83 ClearBit(mask, i); 84 } 85 86 /* ensure zeros one-by-one */ 87 for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { 88 const unsigned char *m = xi2mask_get_one_mask(xi2mask, i); 89 90 assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) != 0); 91 xi2mask_zero(xi2mask, i); 92 assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); 93 } 94 95 /* re-set, zero all */ 96 for (i = 0; i < xi2mask_num_masks(xi2mask); i++) 97 xi2mask_set(xi2mask, i, i); 98 xi2mask_zero(xi2mask, -1); 99 100 for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { 101 const unsigned char *m = xi2mask_get_one_mask(xi2mask, i); 102 103 assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); 104 } 105 106 for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { 107 const unsigned char *m; 108 109 SetBit(mask, i); 110 xi2mask_set_one_mask(xi2mask, i, mask, xi2mask_mask_size(xi2mask)); 111 m = xi2mask_get_one_mask(xi2mask, i); 112 assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); 113 ClearBit(mask, i); 114 } 115 116 mergemask = xi2mask_new_with_size(MAXDEVICES + 2, (MAXDEVICES + 2) * 2); 117 for (i = 0; i < xi2mask_num_masks(mergemask); i++) { 118 dev.id = i; 119 xi2mask_set(mergemask, i, i * 2); 120 } 121 122 /* xi2mask still has all i bits set, should now also have all i * 2 bits */ 123 xi2mask_merge(xi2mask, mergemask); 124 for (i = 0; i < xi2mask_num_masks(mergemask); i++) { 125 const unsigned char *m = xi2mask_get_one_mask(xi2mask, i); 126 127 SetBit(mask, i); 128 SetBit(mask, i * 2); 129 assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); 130 ClearBit(mask, i); 131 ClearBit(mask, i * 2); 132 } 133 134 xi2mask_free(&xi2mask); 135 assert(xi2mask == NULL); 136 137 xi2mask_free(&mergemask); 138 assert(mergemask == NULL); 139 free(mask); 140} 141 142int 143xi2_test(void) 144{ 145 xi2mask_test(); 146 147 return 0; 148} 149