xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/unittests/observable-selftests.c (revision 7d62b00eb9ad855ffcd7da46b41e23feb5476fac)
1 /* Self tests for gdb::observers, GDB notifications to observers.
2 
3    Copyright (C) 2003-2020 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include "defs.h"
21 #include "gdbsupport/selftest.h"
22 #include "gdbsupport/observable.h"
23 
24 namespace selftests {
25 namespace observers {
26 
27 gdb::observers::observable<int> test_notification ("test_notification");
28 
29 static int test_first_observer = 0;
30 static int test_second_observer = 0;
31 static int test_third_observer = 0;
32 
33 static void
34 test_first_notification_function (int arg)
35 {
36   test_first_observer++;
37 }
38 
39 static void
40 test_second_notification_function (int arg)
41 {
42   test_second_observer++;
43 }
44 
45 static void
46 test_third_notification_function (int arg)
47 {
48   test_third_observer++;
49 }
50 
51 static void
52 notify_check_counters (int one, int two, int three)
53 {
54   /* Reset.  */
55   test_first_observer = 0;
56   test_second_observer = 0;
57   test_third_observer = 0;
58   /* Notify.  */
59   test_notification.notify (0);
60   /* Check.  */
61   SELF_CHECK (one == test_first_observer);
62   SELF_CHECK (two == test_second_observer);
63   SELF_CHECK (three == test_third_observer);
64 }
65 
66 static void
67 run_tests ()
68 {
69   /* First, try sending a notification without any observer
70      attached.  */
71   notify_check_counters (0, 0, 0);
72 
73   const gdb::observers::token token1 {}, token2 {} , token3 {};
74 
75   /* Now, attach one observer, and send a notification.  */
76   test_notification.attach (&test_second_notification_function, token2);
77   notify_check_counters (0, 1, 0);
78 
79   /* Remove the observer, and send a notification.  */
80   test_notification.detach (token2);
81   notify_check_counters (0, 0, 0);
82 
83   /* With a new observer.  */
84   test_notification.attach (&test_first_notification_function, token1);
85   notify_check_counters (1, 0, 0);
86 
87   /* With 2 observers.  */
88   test_notification.attach (&test_second_notification_function, token2);
89   notify_check_counters (1, 1, 0);
90 
91   /* With 3 observers.  */
92   test_notification.attach (&test_third_notification_function, token3);
93   notify_check_counters (1, 1, 1);
94 
95   /* Remove middle observer.  */
96   test_notification.detach (token2);
97   notify_check_counters (1, 0, 1);
98 
99   /* Remove first observer.  */
100   test_notification.detach (token1);
101   notify_check_counters (0, 0, 1);
102 
103   /* Remove last observer.  */
104   test_notification.detach (token3);
105   notify_check_counters (0, 0, 0);
106 
107   /* Go back to 3 observers, and remove them in a different
108      order...  */
109   test_notification.attach (&test_first_notification_function, token1);
110   test_notification.attach (&test_second_notification_function, token2);
111   test_notification.attach (&test_third_notification_function, token3);
112   notify_check_counters (1, 1, 1);
113 
114   /* Remove the third observer.  */
115   test_notification.detach (token3);
116   notify_check_counters (1, 1, 0);
117 
118   /* Remove the second observer.  */
119   test_notification.detach (token2);
120   notify_check_counters (1, 0, 0);
121 
122   /* Remove first observer, no more observers.  */
123   test_notification.detach (token1);
124   notify_check_counters (0, 0, 0);
125 }
126 
127 } /* namespace observers */
128 } /* namespace selftests */
129 
130 void _initialize_observer_selftest ();
131 void
132 _initialize_observer_selftest ()
133 {
134   selftests::register_test ("gdb::observers",
135 			    selftests::observers::run_tests);
136 }
137