blob: 1a66144b53f136f724a2e4d9a8772819b1eae70e [file] [log] [blame]
// 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);
}