blob: 7dfd35436ae32c25cc50fff95e8c157286669138 [file] [log] [blame]
// Copyright 2016 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 <fbl/auto_call.h>
#include <unittest/unittest.h>
#include <utility>
static volatile int test_func_count;
__NO_INLINE static void test_func()
{
test_func_count++;
}
static bool auto_call_test()
{
// extern int foo();
// int a;
//
// auto ac = MakeAutoCall([&](){ a = 1; });
// auto ac2 = MakeAutoCall(foo);
//
// auto func = [&](){ a = 2; };
// AutoCall<decltype(bleh)> ac3(func);
// AutoCall<decltype(&foo)> ac4(&foo);
//
// // abort the call
// ac2.cancel();
BEGIN_TEST;
// mark as volatile to make sure it generates code
volatile int a;
// call a lambda
{
a = 0;
auto ac = fbl::MakeAutoCall([&](){ a++; });
EXPECT_EQ(a, 0, "autocall hasn't run");
}
EXPECT_EQ(a, 1, "autocall has run");
{
a = 0;
auto ac = fbl::MakeAutoCall([&](){ a++; });
EXPECT_EQ(a, 0, "autocall hasn't run");
ac.cancel();
EXPECT_EQ(a, 0, "autocall still hasn't run");
ac.call();
EXPECT_EQ(a, 0, "autocall still hasn't run");
}
EXPECT_EQ(a, 0, "autocall still hasn't run");
{
a = 0;
auto ac = fbl::MakeAutoCall([&](){ a++; });
EXPECT_EQ(a, 0, "autocall hasn't run");
ac.call();
EXPECT_EQ(a, 1, "autocall should have run\n");
ac.cancel();
EXPECT_EQ(a, 1, "autocall ran only once\n");
}
EXPECT_EQ(a, 1, "autocall ran only once\n");
// call a regular function
{
test_func_count = 0;
auto ac = fbl::MakeAutoCall(&test_func);
EXPECT_EQ(test_func_count, 0, "autocall hasn't run");
}
EXPECT_EQ(test_func_count, 1, "autocall has run");
// move constructor
{
a = 0;
auto ac = fbl::MakeAutoCall([&](){ a++; });
auto ac2 = std::move(ac);
EXPECT_EQ(a, 0, "autocall hasn't run");
}
EXPECT_EQ(a, 1, "autocall has run once");
// move assignment
{
test_func_count = 0;
auto ac = fbl::MakeAutoCall(&test_func);
auto ac2 = fbl::MakeAutoCall(&test_func);
EXPECT_EQ(test_func_count, 0, "autocall hasn't run");
ac2 = std::move(ac);
EXPECT_EQ(test_func_count, 1, "autocall has run once");
}
EXPECT_EQ(test_func_count, 2, "autocall has run twice");
END_TEST;
}
BEGIN_TEST_CASE(auto_call_tests)
RUN_NAMED_TEST("Auto call test", auto_call_test)
END_TEST_CASE(auto_call_tests)