Commit | Line | Data |
---|---|---|
a09e091a JB |
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 | #ifdef HAVE_DIX_CONFIG_H | |
25 | #include <dix-config.h> | |
26 | #endif | |
27 | ||
28 | #include <stdint.h> | |
29 | #include "inpututils.h" | |
30 | #include "inputstr.h" | |
31 | #include "assert.h" | |
32 | ||
33 | static void | |
34 | xi2mask_test(void) | |
35 | { | |
36 | XI2Mask *xi2mask = NULL, *mergemask = NULL; | |
37 | unsigned char *mask; | |
38 | DeviceIntRec dev; | |
39 | DeviceIntRec all_devices, all_master_devices; | |
40 | int i; | |
41 | ||
42 | all_devices.id = XIAllDevices; | |
43 | inputInfo.all_devices = &all_devices; | |
44 | all_master_devices.id = XIAllMasterDevices; | |
45 | inputInfo.all_master_devices = &all_master_devices; | |
46 | ||
47 | /* size >= nmasks * 2 for the test cases below */ | |
48 | xi2mask = xi2mask_new_with_size(MAXDEVICES + 2, (MAXDEVICES + 2) * 2); | |
49 | assert(xi2mask); | |
50 | assert(xi2mask->nmasks > 0); | |
51 | assert(xi2mask->mask_size > 0); | |
52 | ||
53 | assert(xi2mask_mask_size(xi2mask) == xi2mask->mask_size); | |
54 | assert(xi2mask_num_masks(xi2mask) == xi2mask->nmasks); | |
55 | ||
56 | mask = calloc(1, xi2mask_mask_size(xi2mask)); | |
57 | /* ensure zeros */ | |
58 | for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { | |
59 | const unsigned char *m = xi2mask_get_one_mask(xi2mask, i); | |
60 | ||
61 | assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); | |
62 | } | |
63 | ||
64 | /* set various bits */ | |
65 | for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { | |
66 | const unsigned char *m; | |
67 | ||
68 | xi2mask_set(xi2mask, i, i); | |
69 | ||
70 | dev.id = i; | |
71 | assert(xi2mask_isset(xi2mask, &dev, i)); | |
72 | ||
73 | m = xi2mask_get_one_mask(xi2mask, i); | |
74 | SetBit(mask, i); | |
75 | assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); | |
76 | ClearBit(mask, i); | |
77 | } | |
78 | ||
79 | /* ensure zeros one-by-one */ | |
80 | for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { | |
81 | const unsigned char *m = xi2mask_get_one_mask(xi2mask, i); | |
82 | ||
83 | assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) != 0); | |
84 | xi2mask_zero(xi2mask, i); | |
85 | assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); | |
86 | } | |
87 | ||
88 | /* re-set, zero all */ | |
89 | for (i = 0; i < xi2mask_num_masks(xi2mask); i++) | |
90 | xi2mask_set(xi2mask, i, i); | |
91 | xi2mask_zero(xi2mask, -1); | |
92 | ||
93 | for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { | |
94 | const unsigned char *m = xi2mask_get_one_mask(xi2mask, i); | |
95 | ||
96 | assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); | |
97 | } | |
98 | ||
99 | for (i = 0; i < xi2mask_num_masks(xi2mask); i++) { | |
100 | const unsigned char *m; | |
101 | ||
102 | SetBit(mask, i); | |
103 | xi2mask_set_one_mask(xi2mask, i, mask, xi2mask_mask_size(xi2mask)); | |
104 | m = xi2mask_get_one_mask(xi2mask, i); | |
105 | assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); | |
106 | ClearBit(mask, i); | |
107 | } | |
108 | ||
109 | mergemask = xi2mask_new_with_size(MAXDEVICES + 2, (MAXDEVICES + 2) * 2); | |
110 | for (i = 0; i < xi2mask_num_masks(mergemask); i++) { | |
111 | dev.id = i; | |
112 | xi2mask_set(mergemask, i, i * 2); | |
113 | } | |
114 | ||
115 | /* xi2mask still has all i bits set, should now also have all i * 2 bits */ | |
116 | xi2mask_merge(xi2mask, mergemask); | |
117 | for (i = 0; i < xi2mask_num_masks(mergemask); i++) { | |
118 | const unsigned char *m = xi2mask_get_one_mask(xi2mask, i); | |
119 | ||
120 | SetBit(mask, i); | |
121 | SetBit(mask, i * 2); | |
122 | assert(memcmp(mask, m, xi2mask_mask_size(xi2mask)) == 0); | |
123 | ClearBit(mask, i); | |
124 | ClearBit(mask, i * 2); | |
125 | } | |
126 | ||
127 | xi2mask_free(&xi2mask); | |
128 | assert(xi2mask == NULL); | |
129 | ||
130 | xi2mask_free(&mergemask); | |
131 | assert(mergemask == NULL); | |
132 | free(mask); | |
133 | } | |
134 | ||
135 | int | |
136 | main(int argc, char **argv) | |
137 | { | |
138 | xi2mask_test(); | |
139 | ||
140 | return 0; | |
141 | } |