Home | History | Annotate | Download | only in tests
      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