test: sink::before

This commit is contained in:
Michele Caini
2019-09-20 14:54:30 +02:00
parent bfc2eca041
commit 5c7c682d41
2 changed files with 117 additions and 13 deletions

1
TODO
View File

@@ -33,5 +33,4 @@ TODO
* multi component registry::remove and some others?
* range based registry::remove and some others?
* nested groups: AB/ABC/ABCD/... (hints: sort, check functions)
- sink::before and ordered calls
* ::size_type - c'mon

View File

@@ -16,6 +16,22 @@ struct sigh_listener {
bool k{false};
};
struct before_after {
void add(int v) { value += v; }
void mul(int v) { value *= v; }
static void static_add(int v) { before_after::value += v; }
static void static_mul(before_after &instance, int v) { instance.value *= v; }
static inline int value{};
};
struct SigH: public ::testing::Test {
void SetUp() override {
before_after::value = 0;
}
};
struct const_nonconst_noexcept {
void f() { ++cnt; }
void g() noexcept { ++cnt; }
@@ -24,7 +40,7 @@ struct const_nonconst_noexcept {
mutable int cnt{0};
};
TEST(SigH, Lifetime) {
TEST_F(SigH, Lifetime) {
using signal = entt::sigh<void(void)>;
ASSERT_NO_THROW(signal{});
@@ -39,7 +55,7 @@ TEST(SigH, Lifetime) {
ASSERT_NO_THROW(delete new signal{});
}
TEST(SigH, Clear) {
TEST_F(SigH, Clear) {
entt::sigh<void(int &)> sigh;
entt::sink sink{sigh};
@@ -54,7 +70,7 @@ TEST(SigH, Clear) {
ASSERT_TRUE(sigh.empty());
}
TEST(SigH, Swap) {
TEST_F(SigH, Swap) {
entt::sigh<void(int &)> sigh1;
entt::sigh<void(int &)> sigh2;
entt::sink sink1{sigh1};
@@ -77,7 +93,7 @@ TEST(SigH, Swap) {
ASSERT_FALSE(sigh2.empty());
}
TEST(SigH, Functions) {
TEST_F(SigH, Functions) {
entt::sigh<void(int &)> sigh;
entt::sink sink{sigh};
int v = 0;
@@ -98,7 +114,7 @@ TEST(SigH, Functions) {
ASSERT_EQ(v, 0);
}
TEST(SigH, FunctionsWithPayload) {
TEST_F(SigH, FunctionsWithPayload) {
entt::sigh<void()> sigh;
entt::sink sink{sigh};
int v = 0;
@@ -125,7 +141,7 @@ TEST(SigH, FunctionsWithPayload) {
ASSERT_EQ(v, 0);
}
TEST(SigH, Members) {
TEST_F(SigH, Members) {
sigh_listener l1, l2;
entt::sigh<bool(int)> sigh;
entt::sink sink{sigh};
@@ -156,7 +172,7 @@ TEST(SigH, Members) {
ASSERT_EQ(1u, sigh.size());
}
TEST(SigH, Collector) {
TEST_F(SigH, Collector) {
sigh_listener listener;
entt::sigh<bool(int)> sigh;
entt::sink sink{sigh};
@@ -186,7 +202,7 @@ TEST(SigH, Collector) {
ASSERT_EQ(cnt, 1);
}
TEST(SigH, CollectorVoid) {
TEST_F(SigH, CollectorVoid) {
sigh_listener listener;
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
@@ -208,7 +224,7 @@ TEST(SigH, CollectorVoid) {
ASSERT_EQ(cnt, 1);
}
TEST(SigH, Connection) {
TEST_F(SigH, Connection) {
entt::sigh<void(int &)> sigh;
entt::sink sink{sigh};
int v = 0;
@@ -229,7 +245,7 @@ TEST(SigH, Connection) {
ASSERT_EQ(0, v);
}
TEST(SigH, ScopedConnection) {
TEST_F(SigH, ScopedConnection) {
sigh_listener listener;
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
@@ -251,7 +267,7 @@ TEST(SigH, ScopedConnection) {
ASSERT_TRUE(listener.k);
}
TEST(SigH, ScopedConnectionConstructorsAndOperators) {
TEST_F(SigH, ScopedConnectionConstructorsAndOperators) {
sigh_listener listener;
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
@@ -297,7 +313,7 @@ TEST(SigH, ScopedConnectionConstructorsAndOperators) {
ASSERT_FALSE(listener.k);
}
TEST(SigH, ConstNonConstNoExcept) {
TEST_F(SigH, ConstNonConstNoExcept) {
entt::sigh<void()> sigh;
entt::sink sink{sigh};
const_nonconst_noexcept functor;
@@ -321,3 +337,92 @@ TEST(SigH, ConstNonConstNoExcept) {
ASSERT_EQ(functor.cnt, 2);
ASSERT_EQ(cfunctor.cnt, 2);
}
TEST_F(SigH, BeforeFunction) {
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
before_after functor;
sink.connect<&before_after::add>(functor);
sink.connect<&before_after::static_add>();
sink.before<&before_after::static_add>().connect<&before_after::mul>(functor);
sigh.publish(2);
ASSERT_EQ(functor.value, 6);
}
TEST_F(SigH, BeforeMemberFunction) {
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
before_after functor;
sink.connect<&before_after::static_add>();
sink.connect<&before_after::add>(functor);
sink.before<&before_after::add>(functor).connect<&before_after::mul>(functor);
sigh.publish(2);
ASSERT_EQ(functor.value, 6);
}
TEST_F(SigH, BeforeFunctionWithPayload) {
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
before_after functor;
sink.connect<&before_after::static_add>();
sink.connect<&before_after::static_mul>(functor);
sink.before<&before_after::static_mul>(functor).connect<&before_after::add>(functor);
sigh.publish(2);
ASSERT_EQ(functor.value, 8);
}
TEST_F(SigH, BeforeInstanceOrPayload) {
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
before_after functor;
sink.connect<&before_after::static_mul>(functor);
sink.connect<&before_after::add>(functor);
sink.before(functor).connect<&before_after::static_add>();
sigh.publish(2);
ASSERT_EQ(functor.value, 6);
}
TEST_F(SigH, BeforeOpaqueInstanceOrPayload) {
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
before_after functor;
sink.connect<&before_after::static_mul>(functor);
sink.connect<&before_after::add>(functor);
sink.before(&functor).connect<&before_after::static_add>();
sigh.publish(2);
ASSERT_EQ(functor.value, 6);
}
TEST_F(SigH, BeforeAnythingElse) {
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
before_after functor;
sink.connect<&before_after::add>(functor);
sink.before().connect<&before_after::mul>(functor);
sigh.publish(2);
ASSERT_EQ(functor.value, 2);
}
TEST_F(SigH, BeforeListenerNotPresent) {
entt::sigh<void(int)> sigh;
entt::sink sink{sigh};
before_after functor;
sink.connect<&before_after::mul>(functor);
sink.before<&before_after::add>(functor).connect<&before_after::add>(functor);
sigh.publish(2);
ASSERT_EQ(functor.value, 2);
}