| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/ledger/bin/app/delaying_facade.h" |
| |
| #include "gmock/gmock.h" |
| #include "gtest/gtest.h" |
| |
| namespace ledger { |
| namespace { |
| |
| using ::testing::ElementsAre; |
| using ::testing::IsEmpty; |
| using ::testing::SizeIs; |
| |
| class Foo { |
| public: |
| void AddNumber(int i) { numbers.push_back(i); } |
| |
| void AddUniqueNumber(std::unique_ptr<int> i) { |
| unique_numbers.push_back(std::move(i)); |
| } |
| |
| std::vector<int> numbers; |
| std::vector<std::unique_ptr<int>> unique_numbers; |
| }; |
| |
| TEST(DelayingFacadeTest, CallOrder) { |
| Foo foo; |
| DelayingFacade<Foo> delayed_foo; |
| |
| // None of the operations should be executed before the object is set. |
| delayed_foo.EnqueueCall(&Foo::AddNumber, 0); |
| EXPECT_THAT(foo.numbers, IsEmpty()); |
| foo.AddNumber(1); |
| EXPECT_THAT(foo.numbers, ElementsAre(1)); |
| |
| delayed_foo.EnqueueCall(&Foo::AddNumber, 2); |
| EXPECT_THAT(foo.numbers, ElementsAre(1)); |
| foo.AddNumber(3); |
| EXPECT_THAT(foo.numbers, ElementsAre(1, 3)); |
| |
| // Set foo as the object, and expect that the previous delayed operations are |
| // executed. |
| delayed_foo.SetTargetObject(&foo); |
| EXPECT_THAT(foo.numbers, ElementsAre(1, 3, 0, 2)); |
| |
| // All following operations on delayed_foo should be executed immediately. |
| delayed_foo.EnqueueCall(&Foo::AddNumber, 4); |
| EXPECT_THAT(foo.numbers, ElementsAre(1, 3, 0, 2, 4)); |
| foo.AddNumber(5); |
| EXPECT_THAT(foo.numbers, ElementsAre(1, 3, 0, 2, 4, 5)); |
| delayed_foo.EnqueueCall(&Foo::AddNumber, 6); |
| EXPECT_THAT(foo.numbers, ElementsAre(1, 3, 0, 2, 4, 5, 6)); |
| } |
| |
| TEST(DelayingFacadeTest, CallWithNotCopyableObjects) { |
| Foo foo; |
| DelayingFacade<Foo> delayed_foo; |
| |
| delayed_foo.EnqueueCall(&Foo::AddUniqueNumber, std::make_unique<int>(0)); |
| EXPECT_THAT(foo.unique_numbers, IsEmpty()); |
| |
| delayed_foo.SetTargetObject(&foo); |
| |
| EXPECT_THAT(foo.unique_numbers, SizeIs(1)); |
| EXPECT_EQ(*foo.unique_numbers[0], 0); |
| } |
| |
| } // namespace |
| } // namespace ledger |