| // Copyright 2020 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/camera/lib/hanging_get_helper/hanging_get_helper.h" |
| |
| #include <gtest/gtest.h> |
| |
| TEST(HangingGetHelperTest, SetReturnValues) { |
| camera::HangingGetHelper<int> helper; |
| EXPECT_FALSE(helper.Set(42)); |
| EXPECT_FALSE(helper.Set(42)); |
| EXPECT_TRUE(helper.Set(17)); |
| } |
| |
| TEST(HangingGetHelperTest, GetReturnValues) { |
| camera::HangingGetHelper<int> helper; |
| EXPECT_FALSE(helper.Get([](int) { ADD_FAILURE(); })); |
| EXPECT_TRUE(helper.Get([](int) { ADD_FAILURE(); })); |
| } |
| |
| TEST(HangingGetHelperTest, SimpleFlow) { |
| camera::HangingGetHelper<int> helper; |
| int returned = -1; |
| EXPECT_FALSE(helper.Get([&](int x) { returned = x; })); |
| EXPECT_FALSE(helper.Set(42)); |
| EXPECT_EQ(returned, 42); |
| EXPECT_FALSE(helper.Set(17)); |
| EXPECT_FALSE(helper.Get([&](int x) { returned = x + 1; })); |
| EXPECT_EQ(returned, 18); |
| EXPECT_FALSE(helper.Get([&](int x) { returned = x + 2; })); |
| EXPECT_TRUE(helper.Get([&](int x) { returned = x + 3; })); |
| EXPECT_FALSE(helper.Set(37)); |
| EXPECT_EQ(returned, 40); |
| EXPECT_FALSE(helper.Set(9)); |
| EXPECT_TRUE(helper.Set(70)); |
| EXPECT_FALSE(helper.Get([&](int x) { returned = x + 4; })); |
| EXPECT_EQ(returned, 74); |
| } |
| |
| TEST(HangingGetHelperTest, CustomTypeExplicitCompare) { |
| struct Thing { |
| int x; |
| }; |
| auto eq = [](const Thing& a, const Thing& b) { return (a.x % 10) == (b.x % 10); }; |
| camera::HangingGetHelper<Thing, decltype(eq)> helper(eq); |
| EXPECT_FALSE(helper.Set({42})); |
| EXPECT_FALSE(helper.Set({52})); |
| EXPECT_FALSE(helper.Set({82})); |
| EXPECT_TRUE(helper.Set({17})); |
| int returned = -1; |
| EXPECT_FALSE(helper.Get([&](Thing t) { returned = t.x; })); |
| EXPECT_EQ(returned, 17); |
| EXPECT_FALSE(helper.Get([&](Thing t) { returned = t.x + 1; })); |
| EXPECT_FALSE(helper.Set({27})); |
| EXPECT_EQ(returned, 17); |
| } |
| |
| TEST(HangingGetHelperTest, CustomTypeWithEqualityOperator) { |
| struct Thing { |
| int x; |
| bool operator==(const Thing& other) const { return (other.x % 10) == (x % 10); } |
| }; |
| camera::HangingGetHelper<Thing> helper; |
| EXPECT_FALSE(helper.Set({42})); |
| EXPECT_FALSE(helper.Set({52})); |
| EXPECT_FALSE(helper.Set({82})); |
| EXPECT_TRUE(helper.Set({17})); |
| int returned = -1; |
| EXPECT_FALSE(helper.Get([&](Thing t) { returned = t.x; })); |
| EXPECT_EQ(returned, 17); |
| EXPECT_FALSE(helper.Get([&](Thing t) { returned = t.x + 1; })); |
| EXPECT_FALSE(helper.Set({27})); |
| EXPECT_EQ(returned, 17); |
| } |
| |
| struct GlobalThing { |
| int x; |
| }; |
| |
| bool operator==(const GlobalThing& a, const GlobalThing& b) { return (a.x % 10) == (b.x % 10); } |
| |
| TEST(HangingGetHelperTest, CustomTypeWithNonMemberEqualityOperator) { |
| camera::HangingGetHelper<GlobalThing> helper; |
| EXPECT_FALSE(helper.Set({42})); |
| EXPECT_FALSE(helper.Set({52})); |
| EXPECT_FALSE(helper.Set({82})); |
| EXPECT_TRUE(helper.Set({17})); |
| int returned = -1; |
| EXPECT_FALSE(helper.Get([&](GlobalThing t) { returned = t.x; })); |
| EXPECT_EQ(returned, 17); |
| EXPECT_FALSE(helper.Get([&](GlobalThing t) { returned = t.x + 1; })); |
| EXPECT_FALSE(helper.Set({27})); |
| EXPECT_EQ(returned, 17); |
| } |
| |
| TEST(HangingGetHelperTest, NonCopyableType) { |
| struct Thing { |
| int x; |
| Thing(const Thing&) = delete; |
| Thing(Thing&&) = default; |
| Thing& operator=(const Thing&) = delete; |
| Thing& operator=(Thing&&) = default; |
| explicit Thing(int i) : x(i) {} |
| }; |
| camera::HangingGetHelper<Thing> helper; |
| EXPECT_FALSE(helper.Set(Thing(42))); |
| EXPECT_TRUE(helper.Set(Thing(42))); |
| int returned = -1; |
| EXPECT_FALSE(helper.Get([&](Thing t) { returned = t.x; })); |
| EXPECT_EQ(returned, 42); |
| } |