1 /* 2 * Copyright © 2013 Marek Chalupa 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining 5 * a copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sublicense, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the 13 * next paragraph) shall be included in all copies or substantial 14 * portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 */ 25 26 #include <assert.h> 27 28 #include "wayland-server.h" 29 #include "test-runner.h" 30 31 static void 32 signal_notify(struct wl_listener *listener, void *data) 33 { 34 /* only increase counter*/ 35 ++(*((int *) data)); 36 } 37 38 TEST(signal_init) 39 { 40 struct wl_signal signal; 41 42 wl_signal_init(&signal); 43 44 /* Test if listeners' list is initialized */ 45 assert(&signal.listener_list == signal.listener_list.next 46 && "Maybe wl_signal implementation changed?"); 47 assert(signal.listener_list.next == signal.listener_list.prev 48 && "Maybe wl_signal implementation changed?"); 49 } 50 51 TEST(signal_add_get) 52 { 53 struct wl_signal signal; 54 55 /* we just need different values of notify */ 56 struct wl_listener l1 = {.notify = (wl_notify_func_t) 0x1}; 57 struct wl_listener l2 = {.notify = (wl_notify_func_t) 0x2}; 58 struct wl_listener l3 = {.notify = (wl_notify_func_t) 0x3}; 59 /* one real, why not */ 60 struct wl_listener l4 = {.notify = signal_notify}; 61 62 wl_signal_init(&signal); 63 64 wl_signal_add(&signal, &l1); 65 wl_signal_add(&signal, &l2); 66 wl_signal_add(&signal, &l3); 67 wl_signal_add(&signal, &l4); 68 69 assert(wl_signal_get(&signal, signal_notify) == &l4); 70 assert(wl_signal_get(&signal, (wl_notify_func_t) 0x3) == &l3); 71 assert(wl_signal_get(&signal, (wl_notify_func_t) 0x2) == &l2); 72 assert(wl_signal_get(&signal, (wl_notify_func_t) 0x1) == &l1); 73 74 /* get should not be destructive */ 75 assert(wl_signal_get(&signal, signal_notify) == &l4); 76 assert(wl_signal_get(&signal, (wl_notify_func_t) 0x3) == &l3); 77 assert(wl_signal_get(&signal, (wl_notify_func_t) 0x2) == &l2); 78 assert(wl_signal_get(&signal, (wl_notify_func_t) 0x1) == &l1); 79 } 80 81 TEST(signal_emit_to_one_listener) 82 { 83 int count = 0; 84 int counter; 85 86 struct wl_signal signal; 87 struct wl_listener l1 = {.notify = signal_notify}; 88 89 wl_signal_init(&signal); 90 wl_signal_add(&signal, &l1); 91 92 for (counter = 0; counter < 100; counter++) 93 wl_signal_emit(&signal, &count); 94 95 assert(counter == count); 96 } 97 98 TEST(signal_emit_to_more_listeners) 99 { 100 int count = 0; 101 int counter; 102 103 struct wl_signal signal; 104 struct wl_listener l1 = {.notify = signal_notify}; 105 struct wl_listener l2 = {.notify = signal_notify}; 106 struct wl_listener l3 = {.notify = signal_notify}; 107 108 wl_signal_init(&signal); 109 wl_signal_add(&signal, &l1); 110 wl_signal_add(&signal, &l2); 111 wl_signal_add(&signal, &l3); 112 113 for (counter = 0; counter < 100; counter++) 114 wl_signal_emit(&signal, &count); 115 116 assert(3 * counter == count); 117 } 118