Rename common to gdbsupport
[deliverable/binutils-gdb.git] / gdb / unittests / observable-selftests.c
CommitLineData
76727919
TT
1/* Self tests for gdb::observers, GDB notifications to observers.
2
42a4f53d 3 Copyright (C) 2003-2019 Free Software Foundation, Inc.
76727919
TT
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"
268a13a5
TT
21#include "gdbsupport/selftest.h"
22#include "gdbsupport/observable.h"
76727919
TT
23
24namespace selftests {
25namespace observers {
26
27gdb::observers::observable<int> test_notification ("test_notification");
28
29static int test_first_observer = 0;
30static int test_second_observer = 0;
31static int test_third_observer = 0;
32
33static void
34test_first_notification_function (int arg)
35{
36 test_first_observer++;
37}
38
39static void
40test_second_notification_function (int arg)
41{
42 test_second_observer++;
43}
44
45static void
46test_third_notification_function (int arg)
47{
48 test_third_observer++;
49}
50
51static void
52notify_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
66static void
67run_tests ()
68{
69 /* First, try sending a notification without any observer
70 attached. */
71 notify_check_counters (0, 0, 0);
72
3dcfdc58 73 const gdb::observers::token token1 {}, token2 {} , token3 {};
76727919
TT
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
130void
131_initialize_observer_selftest ()
132{
133 selftests::register_test ("gdb::observers",
134 selftests::observers::run_tests);
135}
This page took 0.183629 seconds and 4 git commands to generate.