|
|
@ -0,0 +1,218 @@ |
|
|
|
#include <unity.h>
|
|
|
|
#include <Arduino.h>
|
|
|
|
|
|
|
|
#include <espurna/types.h>
|
|
|
|
|
|
|
|
namespace espurna { |
|
|
|
namespace test { |
|
|
|
namespace { |
|
|
|
|
|
|
|
void test_view() { |
|
|
|
StringView view{"123456789"}; |
|
|
|
TEST_ASSERT_EQUAL(9, view.length()); |
|
|
|
TEST_ASSERT(view.c_str() != nullptr); |
|
|
|
|
|
|
|
const char expected[] = "123456789"; |
|
|
|
TEST_ASSERT_EQUAL(__builtin_strlen(expected), view.length()); |
|
|
|
TEST_ASSERT_EQUAL_CHAR_ARRAY( |
|
|
|
expected, view.begin(), view.length()); |
|
|
|
} |
|
|
|
|
|
|
|
void test_view_convert() { |
|
|
|
const String origin("12345"); |
|
|
|
StringView view(origin); |
|
|
|
|
|
|
|
TEST_ASSERT(origin.begin() == view.begin()); |
|
|
|
TEST_ASSERT(origin.end() == view.end()); |
|
|
|
TEST_ASSERT_EQUAL(origin.length(), view.length()); |
|
|
|
|
|
|
|
auto copy = view.toString(); |
|
|
|
TEST_ASSERT(view.equals(copy)); |
|
|
|
|
|
|
|
TEST_ASSERT(origin.begin() != copy.begin()); |
|
|
|
TEST_ASSERT_EQUAL(origin.length(), copy.length()); |
|
|
|
TEST_ASSERT_EQUAL_CHAR_ARRAY( |
|
|
|
origin.begin(), copy.begin(), copy.length()); |
|
|
|
|
|
|
|
|
|
|
|
StringView copy_view(copy); |
|
|
|
TEST_ASSERT_EQUAL(view.length(), copy_view.length()); |
|
|
|
TEST_ASSERT(view.equals(copy_view)); |
|
|
|
} |
|
|
|
|
|
|
|
void test_callback_empty() { |
|
|
|
Callback callback; |
|
|
|
TEST_ASSERT(callback.isEmpty()); |
|
|
|
} |
|
|
|
|
|
|
|
void test_callback_lambda() { |
|
|
|
static int once = 0; |
|
|
|
Callback callback([]() { |
|
|
|
++once; |
|
|
|
}); |
|
|
|
|
|
|
|
TEST_ASSERT(callback.isSimple()); |
|
|
|
|
|
|
|
callback(); |
|
|
|
TEST_ASSERT_EQUAL(1, once); |
|
|
|
} |
|
|
|
|
|
|
|
int external { 0 }; |
|
|
|
|
|
|
|
void increment_external() { |
|
|
|
++external; |
|
|
|
++external; |
|
|
|
} |
|
|
|
|
|
|
|
void test_callback_simple() { |
|
|
|
TEST_ASSERT_EQUAL(0, external); |
|
|
|
|
|
|
|
Callback callback(increment_external); |
|
|
|
TEST_ASSERT(callback.isSimple()); |
|
|
|
|
|
|
|
callback(); |
|
|
|
TEST_ASSERT_EQUAL(2, external); |
|
|
|
} |
|
|
|
|
|
|
|
void test_callback_capture() { |
|
|
|
int value = 0; |
|
|
|
|
|
|
|
std::vector<Callback> callbacks; |
|
|
|
callbacks.resize(3, [&]() { |
|
|
|
++value; |
|
|
|
}); |
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL(3, callbacks.size()); |
|
|
|
TEST_ASSERT(callbacks[0].isWrapped()); |
|
|
|
TEST_ASSERT(callbacks[1].isWrapped()); |
|
|
|
TEST_ASSERT(callbacks[2].isWrapped()); |
|
|
|
|
|
|
|
for (const auto& callback : callbacks) { |
|
|
|
callback(); |
|
|
|
} |
|
|
|
TEST_ASSERT_EQUAL(3, value); |
|
|
|
} |
|
|
|
|
|
|
|
void test_callback_capture_copy() { |
|
|
|
int value = 0; |
|
|
|
Callback original([&]() { |
|
|
|
++value; |
|
|
|
++value; |
|
|
|
++value; |
|
|
|
++value; |
|
|
|
}); |
|
|
|
|
|
|
|
TEST_ASSERT(original.isWrapped()); |
|
|
|
|
|
|
|
auto copy = original; |
|
|
|
TEST_ASSERT(original.isWrapped()); |
|
|
|
TEST_ASSERT(copy.isWrapped()); |
|
|
|
|
|
|
|
original(); |
|
|
|
TEST_ASSERT_EQUAL(4, value); |
|
|
|
|
|
|
|
copy(); |
|
|
|
TEST_ASSERT_EQUAL(8, value); |
|
|
|
} |
|
|
|
|
|
|
|
void test_callback_capture_move() { |
|
|
|
int value = 0; |
|
|
|
Callback original([&]() { |
|
|
|
++value; |
|
|
|
++value; |
|
|
|
++value; |
|
|
|
++value; |
|
|
|
}); |
|
|
|
|
|
|
|
TEST_ASSERT(original.isWrapped()); |
|
|
|
|
|
|
|
Callback moved(std::move(original)); |
|
|
|
TEST_ASSERT(original.isEmpty()); |
|
|
|
TEST_ASSERT(moved.isWrapped()); |
|
|
|
|
|
|
|
original(); |
|
|
|
TEST_ASSERT_EQUAL(0, value); |
|
|
|
|
|
|
|
moved(); |
|
|
|
TEST_ASSERT_EQUAL(4, value); |
|
|
|
} |
|
|
|
|
|
|
|
void test_callback_assign() { |
|
|
|
int value = 0; |
|
|
|
Callback original([&]() { |
|
|
|
value += 10; |
|
|
|
}); |
|
|
|
|
|
|
|
TEST_ASSERT(original.isWrapped()); |
|
|
|
|
|
|
|
Callback copy; |
|
|
|
TEST_ASSERT(copy.isEmpty()); |
|
|
|
|
|
|
|
copy = original; |
|
|
|
TEST_ASSERT(copy.isWrapped()); |
|
|
|
|
|
|
|
original(); |
|
|
|
TEST_ASSERT_EQUAL(10, value); |
|
|
|
|
|
|
|
copy(); |
|
|
|
TEST_ASSERT_EQUAL(20, value); |
|
|
|
|
|
|
|
Callback moved; |
|
|
|
TEST_ASSERT(moved.isEmpty()); |
|
|
|
|
|
|
|
moved = std::move(original); |
|
|
|
TEST_ASSERT(original.isEmpty()); |
|
|
|
TEST_ASSERT(moved.isWrapped()); |
|
|
|
|
|
|
|
original(); |
|
|
|
TEST_ASSERT_EQUAL(20, value); |
|
|
|
|
|
|
|
copy(); |
|
|
|
TEST_ASSERT_EQUAL(30, value); |
|
|
|
|
|
|
|
moved(); |
|
|
|
TEST_ASSERT_EQUAL(40, value); |
|
|
|
} |
|
|
|
|
|
|
|
void test_callback_swap() { |
|
|
|
int output = 0; |
|
|
|
|
|
|
|
Callback good([&]() { |
|
|
|
output = 5; |
|
|
|
}); |
|
|
|
|
|
|
|
Callback bad([&]() { |
|
|
|
output = 10; |
|
|
|
}); |
|
|
|
|
|
|
|
good.swap(bad); |
|
|
|
TEST_ASSERT_EQUAL(0, output); |
|
|
|
|
|
|
|
bad(); |
|
|
|
TEST_ASSERT_EQUAL(5, output); |
|
|
|
|
|
|
|
good(); |
|
|
|
TEST_ASSERT_EQUAL(10, output); |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace
|
|
|
|
} // namespace test
|
|
|
|
} // namespace espurna
|
|
|
|
|
|
|
|
int main(int, char**) { |
|
|
|
UNITY_BEGIN(); |
|
|
|
|
|
|
|
using namespace espurna::test; |
|
|
|
RUN_TEST(test_view); |
|
|
|
RUN_TEST(test_view_convert); |
|
|
|
RUN_TEST(test_callback_empty); |
|
|
|
RUN_TEST(test_callback_simple); |
|
|
|
RUN_TEST(test_callback_lambda); |
|
|
|
RUN_TEST(test_callback_capture); |
|
|
|
RUN_TEST(test_callback_capture_copy); |
|
|
|
RUN_TEST(test_callback_capture_move); |
|
|
|
RUN_TEST(test_callback_assign); |
|
|
|
RUN_TEST(test_callback_swap); |
|
|
|
|
|
|
|
return UNITY_END(); |
|
|
|
} |