xref: /llvm-project/clang-tools-extra/clangd/unittests/support/FunctionTests.cpp (revision ad97ccf6b26a29262c9cbf5b3e7f6e84c6dcf55f)
1*ad97ccf6SSam McCall //===-- FunctionTests.cpp -------------------------------------------------===//
2*ad97ccf6SSam McCall //
3*ad97ccf6SSam McCall // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*ad97ccf6SSam McCall // See https://llvm.org/LICENSE.txt for license information.
5*ad97ccf6SSam McCall // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*ad97ccf6SSam McCall //
7*ad97ccf6SSam McCall //===----------------------------------------------------------------------===//
8*ad97ccf6SSam McCall 
9*ad97ccf6SSam McCall #include "support/Function.h"
10*ad97ccf6SSam McCall #include "gmock/gmock.h"
11*ad97ccf6SSam McCall #include "gtest/gtest.h"
12*ad97ccf6SSam McCall 
13*ad97ccf6SSam McCall namespace clang {
14*ad97ccf6SSam McCall namespace clangd {
15*ad97ccf6SSam McCall namespace {
16*ad97ccf6SSam McCall 
TEST(EventTest,Subscriptions)17*ad97ccf6SSam McCall TEST(EventTest, Subscriptions) {
18*ad97ccf6SSam McCall   Event<int> E;
19*ad97ccf6SSam McCall   int N = 0;
20*ad97ccf6SSam McCall   {
21*ad97ccf6SSam McCall     Event<int>::Subscription SubA;
22*ad97ccf6SSam McCall     // No subscriptions are active.
23*ad97ccf6SSam McCall     E.broadcast(42);
24*ad97ccf6SSam McCall     EXPECT_EQ(0, N);
25*ad97ccf6SSam McCall 
26*ad97ccf6SSam McCall     Event<int>::Subscription SubB = E.observe([&](int) { ++N; });
27*ad97ccf6SSam McCall     // Now one is active.
28*ad97ccf6SSam McCall     E.broadcast(42);
29*ad97ccf6SSam McCall     EXPECT_EQ(1, N);
30*ad97ccf6SSam McCall 
31*ad97ccf6SSam McCall     SubA = E.observe([&](int) { ++N; });
32*ad97ccf6SSam McCall     // Both are active.
33*ad97ccf6SSam McCall     EXPECT_EQ(1, N);
34*ad97ccf6SSam McCall     E.broadcast(42);
35*ad97ccf6SSam McCall     EXPECT_EQ(3, N);
36*ad97ccf6SSam McCall 
37*ad97ccf6SSam McCall     SubA = std::move(SubB);
38*ad97ccf6SSam McCall     // One is active.
39*ad97ccf6SSam McCall     EXPECT_EQ(3, N);
40*ad97ccf6SSam McCall     E.broadcast(42);
41*ad97ccf6SSam McCall     EXPECT_EQ(4, N);
42*ad97ccf6SSam McCall   }
43*ad97ccf6SSam McCall   // None are active.
44*ad97ccf6SSam McCall   EXPECT_EQ(4, N);
45*ad97ccf6SSam McCall   E.broadcast(42);
46*ad97ccf6SSam McCall   EXPECT_EQ(4, N);
47*ad97ccf6SSam McCall }
48*ad97ccf6SSam McCall 
49*ad97ccf6SSam McCall } // namespace
50*ad97ccf6SSam McCall } // namespace clangd
51*ad97ccf6SSam McCall } // namespace clang
52