Bug 1338389 - Tests for Variant's detail::Nth and detail::SelectVariantType - r=froydnj

MozReview-Commit-ID: 4QXdctmhNze

--HG--
extra : rebase_source : ddbdf8c79f49ebb02c9e68dca0be4a6ee9ad11f4
This commit is contained in:
Gerald Squelart 2017-06-06 16:59:00 +12:00
Родитель a7c6eed190
Коммит f5f8abf86a
1 изменённых файлов: 217 добавлений и 4 удалений

Просмотреть файл

@ -7,6 +7,7 @@
#include "mozilla/UniquePtr.h"
#include "mozilla/Variant.h"
using mozilla::IsSame;
using mozilla::MakeUnique;
using mozilla::UniquePtr;
using mozilla::Variant;
@ -20,6 +21,217 @@ struct Destroyer {
int Destroyer::destroyedCount = 0;
static void
testDetails()
{
printf("testDetails\n");
using mozilla::detail::Nth;
// Test Nth with a list of 1 item.
static_assert(IsSame<typename Nth<0, int>::Type, int>::value,
"Nth<0, int>::Type should be int");
// Test Nth with a list of more than 1 item.
static_assert(IsSame<typename Nth<0, int, char>::Type, int>::value,
"Nth<0, int, char>::Type should be int");
static_assert(IsSame<typename Nth<1, int, char>::Type, char>::value,
"Nth<1, int, char>::Type should be char");
using mozilla::detail::SelectVariantType;
// SelectVariantType for zero items (shouldn't happen, but `count` should
// still work ok.)
static_assert(SelectVariantType<int, char>::count == 0,
"SelectVariantType<int, char>::count should be 0");
// SelectVariantType for 1 type, for all combinations from/to T, const T,
// const T&, T&&
// - type to type
static_assert(IsSame<typename SelectVariantType<int, int>::Type, int>::value,
"SelectVariantType<int, int>::Type should be int");
static_assert(SelectVariantType<int, int>::count == 1,
"SelectVariantType<int, int>::count should be 1");
// - type to const type
static_assert(
IsSame<typename SelectVariantType<int, const int>::Type, const int>::value,
"SelectVariantType<int, const int>::Type should be const int");
static_assert(SelectVariantType<int, const int>::count == 1,
"SelectVariantType<int, const int>::count should be 1");
// - type to const type&
static_assert(
IsSame<typename SelectVariantType<int, const int&>::Type,
const int&>::value,
"SelectVariantType<int, const int&>::Type should be const int&");
static_assert(SelectVariantType<int, const int&>::count == 1,
"SelectVariantType<int, const int&>::count should be 1");
// - type to type&&
static_assert(
IsSame<typename SelectVariantType<int, int&&>::Type, int&&>::value,
"SelectVariantType<int, int&&>::Type should be int&&");
static_assert(SelectVariantType<int, int&&>::count == 1,
"SelectVariantType<int, int&&>::count should be 1");
// - const type to type
static_assert(
IsSame<typename SelectVariantType<const int, int>::Type, int>::value,
"SelectVariantType<const int, int>::Type should be int");
static_assert(SelectVariantType<const int, int>::count == 1,
"SelectVariantType<const int, int>::count should be 1");
// - const type to const type
static_assert(
IsSame<typename SelectVariantType<const int, const int>::Type,
const int>::value,
"SelectVariantType<const int, const int>::Type should be const int");
static_assert(SelectVariantType<const int, const int>::count == 1,
"SelectVariantType<const int, const int>::count should be 1");
// - const type to const type&
static_assert(
IsSame<typename SelectVariantType<const int, const int&>::Type,
const int&>::value,
"SelectVariantType<const int, const int&>::Type should be const int&");
static_assert(SelectVariantType<const int, const int&>::count == 1,
"SelectVariantType<const int, const int&>::count should be 1");
// - const type to type&&
static_assert(
IsSame<typename SelectVariantType<const int, int&&>::Type, int&&>::value,
"SelectVariantType<const int, int&&>::Type should be int&&");
static_assert(SelectVariantType<const int, int&&>::count == 1,
"SelectVariantType<const int, int&&>::count should be 1");
// - const type& to type
static_assert(
IsSame<typename SelectVariantType<const int&, int>::Type, int>::value,
"SelectVariantType<const int&, int>::Type should be int");
static_assert(SelectVariantType<const int&, int>::count == 1,
"SelectVariantType<const int&, int>::count should be 1");
// - const type& to const type
static_assert(
IsSame<typename SelectVariantType<const int&, const int>::Type,
const int>::value,
"SelectVariantType<const int&, const int>::Type should be const int");
static_assert(SelectVariantType<const int&, const int>::count == 1,
"SelectVariantType<const int&, const int>::count should be 1");
// - const type& to const type&
static_assert(
IsSame<typename SelectVariantType<const int&, const int&>::Type,
const int&>::value,
"SelectVariantType<const int&, const int&>::Type should be const int&");
static_assert(SelectVariantType<const int&, const int&>::count == 1,
"SelectVariantType<const int&, const int&>::count should be 1");
// - const type& to type&&
static_assert(
IsSame<typename SelectVariantType<const int&, int&&>::Type, int&&>::value,
"SelectVariantType<const int&, int&&>::Type should be int&&");
static_assert(SelectVariantType<const int&, int&&>::count == 1,
"SelectVariantType<const int&, int&&>::count should be 1");
// - type&& to type
static_assert(
IsSame<typename SelectVariantType<int&&, int>::Type, int>::value,
"SelectVariantType<int&&, int>::Type should be int");
static_assert(SelectVariantType<int&&, int>::count == 1,
"SelectVariantType<int&&, int>::count should be 1");
// - type&& to const type
static_assert(
IsSame<typename SelectVariantType<int&&, const int>::Type,
const int>::value,
"SelectVariantType<int&&, const int>::Type should be const int");
static_assert(SelectVariantType<int&&, const int>::count == 1,
"SelectVariantType<int&&, const int>::count should be 1");
// - type&& to const type&
static_assert(
IsSame<typename SelectVariantType<int&&, const int&>::Type,
const int&>::value,
"SelectVariantType<int&&, const int&>::Type should be const int&");
static_assert(SelectVariantType<int&&, const int&>::count == 1,
"SelectVariantType<int&&, const int&>::count should be 1");
// - type&& to type&&
static_assert(
IsSame<typename SelectVariantType<int&&, int&&>::Type, int&&>::value,
"SelectVariantType<int&&, int&&>::Type should be int&&");
static_assert(SelectVariantType<int&&, int&&>::count == 1,
"SelectVariantType<int&&, int&&>::count should be 1");
// SelectVariantType for two different types.
// (Don't test all combinations, trust that the above tests are sufficient.)
static_assert(
IsSame<typename SelectVariantType<int, int, char>::Type, int>::value,
"SelectVariantType<int, int, char>::Type should be int");
static_assert(SelectVariantType<int, int, char>::count == 1,
"SelectVariantType<int, int, char>::count should be 1");
static_assert(
IsSame<typename SelectVariantType<char, int, char>::Type, char>::value,
"SelectVariantType<char, int, char>::Type should be char");
static_assert(SelectVariantType<char, int, char>::count == 1,
"SelectVariantType<char, int, char>::count should be 1");
// SelectVariantType for two identical types.
static_assert(
IsSame<typename SelectVariantType<int, int, int>::Type, int>::value,
"SelectVariantType<int, int, int>::Type should be int");
static_assert(SelectVariantType<int, int, int>::count == 2,
"SelectVariantType<int, int, int>::count should be 2");
// SelectVariantType for two identical types, with others around.
static_assert(
IsSame<typename SelectVariantType<int, char, int, int>::Type, int>::value,
"SelectVariantType<int, char, int, int>::Type should be int");
static_assert(SelectVariantType<int, char, int, int>::count == 2,
"SelectVariantType<int, char, int, int>::count should be 2");
static_assert(
IsSame<typename SelectVariantType<int, int, char, int>::Type, int>::value,
"SelectVariantType<int, int, char, int>::Type should be int");
static_assert(SelectVariantType<int, int, char, int>::count == 2,
"SelectVariantType<int, int, char, int>::count should be 2");
static_assert(
IsSame<typename SelectVariantType<int, int, int, char>::Type, int>::value,
"SelectVariantType<int, int, int, char>::Type should be int");
static_assert(SelectVariantType<int, int, int, char>::count == 2,
"SelectVariantType<int, int, int, char>::count should be 2");
static_assert(
IsSame<typename SelectVariantType<int, char, int, char, int, char>::Type,
int>::value,
"SelectVariantType<int, char, int, char, int, char>::Type should be int");
static_assert(
SelectVariantType<int, char, int, char, int, char>::count == 2,
"SelectVariantType<int, char, int, char, int, char>::count should be 2");
// SelectVariantType for two identically-selectable types (first one wins!).
static_assert(
IsSame<typename SelectVariantType<int, int, const int>::Type, int>::value,
"SelectVariantType<int, int, const int>::Type should be int");
static_assert(SelectVariantType<int, int, const int>::count == 2,
"SelectVariantType<int, int, const int>::count should be 2");
static_assert(
IsSame<typename SelectVariantType<int, const int, int>::Type,
const int>::value,
"SelectVariantType<int, const int, int>::Type should be const int");
static_assert(SelectVariantType<int, const int, int>::count == 2,
"SelectVariantType<int, const int, int>::count should be 2");
static_assert(
IsSame<typename SelectVariantType<int, const int, int&&>::Type,
const int>::value,
"SelectVariantType<int, const int, int&&>::Type should be const int");
static_assert(SelectVariantType<int, const int, int&&>::count == 2,
"SelectVariantType<int, const int, int&&>::count should be 2");
}
static void
testSimple()
{
@ -31,7 +243,7 @@ testSimple()
MOZ_RELEASE_ASSERT(v.is<1>());
MOZ_RELEASE_ASSERT(!v.is<0>());
static_assert(mozilla::IsSame<decltype(v.as<1>()), uint64_t&>::value,
static_assert(IsSame<decltype(v.as<1>()), uint64_t&>::value,
"as<1>() should return a uint64_t");
MOZ_RELEASE_ASSERT(v.as<1>() == 1);
}
@ -48,11 +260,11 @@ testDuplicate()
MOZ_RELEASE_ASSERT(v.is<1>());
MOZ_RELEASE_ASSERT(!v.is<0>());
MOZ_RELEASE_ASSERT(!v.is<2>());
static_assert(mozilla::IsSame<decltype(v.as<0>()), uint32_t&>::value,
static_assert(IsSame<decltype(v.as<0>()), uint32_t&>::value,
"as<0>() should return a uint64_t");
static_assert(mozilla::IsSame<decltype(v.as<1>()), uint64_t&>::value,
static_assert(IsSame<decltype(v.as<1>()), uint64_t&>::value,
"as<1>() should return a uint64_t");
static_assert(mozilla::IsSame<decltype(v.as<2>()), uint32_t&>::value,
static_assert(IsSame<decltype(v.as<2>()), uint32_t&>::value,
"as<2>() should return a uint64_t");
MOZ_RELEASE_ASSERT(v.as<1>() == 1);
MOZ_RELEASE_ASSERT(v.extract<1>() == 1);
@ -226,6 +438,7 @@ testRvalueMatcher()
int
main()
{
testDetails();
testSimple();
testDuplicate();
testConstructionWithVariantType();