Skip to content

Commit 7dbe772

Browse files
committed
Implemented all tests so far
1 parent d7cb138 commit 7dbe772

File tree

2 files changed

+129
-21
lines changed

2 files changed

+129
-21
lines changed

README.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,13 @@ variant: Allows to get pointer to element or NULL by type
5656
variant: Allows to get pointer to element or NULL by index
5757
variant: Allows to compare variants
5858
variant: Allows to swap variants (non-member)
59-
variant: (monostate)
60-
variant: (bad_variant_access)
61-
variant: Allows to obtain number of element types (non-standard: max 7)
62-
variant: (variant_alternative)
63-
variant: Allows to obtain hash (C++11)
59+
monostate: Allows to make variant default-constructible
60+
bad_variant_access: Indicates invalid variant access
61+
variant_size<>: Allows to obtain number of element types (non-standard: max 7)
62+
variant_size_v<>: Allows to obtain number of element types (C++14, non-standard: max 7)
63+
variant_size_V(): Allows to obtain number of element types (non-standard: max 7, macro)
64+
variant_alternative<>: Allows to select type by index
65+
variant_alternative_t<>: Allows to select type by index (C++11)
66+
variant_alternative_T(): Allows to select type by index (non-standard: macro)
67+
std::hash<>: Allows to obtain hash (C++11)
6468
```

test/variant.t.cpp

Lines changed: 120 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -357,13 +357,16 @@ CASE( "variant: Allows to obtain the index of the current type" )
357357

358358
CASE( "variant: Allows to inspect if variant is \"valueless by exception\"" )
359359
{
360-
// struct S { operator int() { throw 42; } };
361-
//
362-
// variant<float, int> v{12.f}; // OK
363-
// v.emplace<1>(S()); // v may be valueless
364-
//
365-
// EXPECT( v.valueless_by_exception() );
366-
EXPECT( (false && "implement") );
360+
#if variant_CPP11_OR_GREATER
361+
struct S { operator int() { throw 42; } };
362+
363+
variant< float, int > v{12.f};
364+
365+
EXPECT_THROWS( v.emplace<1>( S() ) );
366+
EXPECT( v.valueless_by_exception() );
367+
#else
368+
EXPECT( !!"variant: emplace is not available (no C++11)" );
369+
#endif
367370
}
368371

369372
CASE( "variant: Allows to swap variants (member)" )
@@ -495,14 +498,19 @@ CASE( "variant: Allows to swap variants (non-member)" )
495498
// variant helper classes:
496499
//
497500

498-
CASE( "variant: (monostate)" )
501+
CASE( "monostate: Allows to make variant default-constructible" )
499502
{
500-
EXPECT( (false && "implement") );
503+
variant<monostate, NoDefaultConstruct> var;
504+
505+
EXPECT( true );
501506
}
502507

503-
CASE( "variant: (bad_variant_access)" )
508+
CASE( "bad_variant_access: Indicates invalid variant access" )
504509
{
505-
EXPECT( (false && "implement") );
510+
variant< char, int > v = 7;
511+
512+
EXPECT_THROWS_AS( get< 0 >( v ), bad_variant_access );
513+
EXPECT_THROWS_AS( get<char>( v ), bad_variant_access );
506514
}
507515

508516
namespace {
@@ -516,7 +524,7 @@ namespace {
516524
struct t8{};
517525
}
518526

519-
CASE( "variant: Allows to obtain number of element types (non-standard: max 7)" )
527+
CASE( "variant_size<>: Allows to obtain number of element types (non-standard: max 7)" )
520528
{
521529
typedef variant<t1> var1;
522530
typedef variant<t1, t2> var2;
@@ -537,19 +545,115 @@ CASE( "variant: Allows to obtain number of element types (non-standard: max 7)"
537545
// EXPECT( 8 == variant_size<var8>::value );
538546
}
539547

540-
CASE( "variant: (variant_alternative)" )
548+
CASE( "variant_size_v<>: Allows to obtain number of element types (C++14, non-standard: max 7)" )
549+
{
550+
#if variant_CPP14_OR_GREATER
551+
typedef variant<t1> var1;
552+
typedef variant<t1, t2> var2;
553+
typedef variant<t1, t2, t3> var3;
554+
typedef variant<t1, t2, t3, t4> var4;
555+
typedef variant<t1, t2, t3, t4, t5> var5;
556+
typedef variant<t1, t2, t3, t4, t5, t6> var6;
557+
typedef variant<t1, t2, t3, t4, t5, t6, t7> var7;
558+
// typedef variant<t1, t2, t3, t4, t5, t6, t7, t8> var8;
559+
560+
EXPECT( 1u == variant_size_v<var1> );
561+
EXPECT( 2u == variant_size_v<var2> );
562+
EXPECT( 3u == variant_size_v<var3> );
563+
EXPECT( 4u == variant_size_v<var4> );
564+
EXPECT( 5u == variant_size_v<var5> );
565+
EXPECT( 6u == variant_size_v<var6> );
566+
EXPECT( 7u == variant_size_v<var7> );
567+
// EXPECT( 8u == variant_size_v<var8>::value );
568+
#else
569+
EXPECT( !!"variant_size_v<>: variable templates is not available (no C++14)" );
570+
#endif
571+
}
572+
573+
CASE( "variant_size_V(): Allows to obtain number of element types (non-standard: max 7, macro)" )
574+
{
575+
typedef variant<t1> var1;
576+
typedef variant<t1, t2> var2;
577+
typedef variant<t1, t2, t3> var3;
578+
typedef variant<t1, t2, t3, t4> var4;
579+
typedef variant<t1, t2, t3, t4, t5> var5;
580+
typedef variant<t1, t2, t3, t4, t5, t6> var6;
581+
typedef variant<t1, t2, t3, t4, t5, t6, t7> var7;
582+
// typedef variant<t1, t2, t3, t4, t5, t6, t7, t8> var8;
583+
584+
EXPECT( 1 == variant_size_V( var1 ) );
585+
EXPECT( 2 == variant_size_V( var2 ) );
586+
EXPECT( 3 == variant_size_V( var3 ) );
587+
EXPECT( 4 == variant_size_V( var4 ) );
588+
EXPECT( 5 == variant_size_V( var5 ) );
589+
EXPECT( 6 == variant_size_V( var6 ) );
590+
EXPECT( 7 == variant_size_V( var7 ) );
591+
// EXPECT( 8 == variant_size_V( var8 ) );
592+
}
593+
594+
CASE( "variant_alternative<>: Allows to select type by index" )
595+
{
596+
#if variant_HAVE_STATIC_ASSERT
597+
static_assert( std::is_same<char, typename variant_alternative< 0, variant<char> >::type >::value, "variant_alternative<0,...>" );
598+
static_assert( std::is_same<char, typename variant_alternative< 1, variant<int, char> >::type >::value, "variant_alternative<1,...>" );
599+
static_assert( std::is_same<char, typename variant_alternative< 2, variant<int, int, char> >::type >::value, "variant_alternative<2,...>" );
600+
static_assert( std::is_same<char, typename variant_alternative< 3, variant<int, int, int, char> >::type >::value, "variant_alternative<3,...>" );
601+
static_assert( std::is_same<char, typename variant_alternative< 4, variant<int, int, int, int, char> >::type >::value, "variant_alternative<4,...>" );
602+
static_assert( std::is_same<char, typename variant_alternative< 5, variant<int, int, int, int, int, char> >::type >::value, "variant_alternative<5,...>" );
603+
static_assert( std::is_same<char, typename variant_alternative< 6, variant<int, int, int, int, int, int, char> >::type >::value, "variant_alternative<6,...>" );
604+
#else
605+
EXPECT( !!"variant_alternative<>: static_assert is not available (no C++11)" );
606+
#endif
607+
}
608+
609+
CASE( "variant_alternative_t<>: Allows to select type by index (C++11)" )
541610
{
542-
EXPECT( (false && "implement") );
611+
#if variant_CPP11_OR_GREATER
612+
static_assert( std::is_same<char, variant_alternative_t< 0, variant<char> > >::value, "variant_alternative_t<0,...>" );
613+
static_assert( std::is_same<char, variant_alternative_t< 1, variant<int, char> > >::value, "variant_alternative_t<1,...>" );
614+
static_assert( std::is_same<char, variant_alternative_t< 2, variant<int, int, char> > >::value, "variant_alternative_t<2,...>" );
615+
static_assert( std::is_same<char, variant_alternative_t< 3, variant<int, int, int, char> > >::value, "variant_alternative_t<3,...>" );
616+
static_assert( std::is_same<char, variant_alternative_t< 4, variant<int, int, int, int, char> > >::value, "variant_alternative_t<4,...>" );
617+
static_assert( std::is_same<char, variant_alternative_t< 5, variant<int, int, int, int, int, char> > >::value, "variant_alternative_t<5,...>" );
618+
static_assert( std::is_same<char, variant_alternative_t< 6, variant<int, int, int, int, int, int, char> > >::value, "variant_alternative_t<6,...>" );
619+
#else
620+
EXPECT( !!"variant_alternative_t<>: alias template is not available (no C++11)" );
621+
#endif
622+
}
623+
624+
CASE( "variant_alternative_T(): Allows to select type by index (non-standard: macro)" )
625+
{
626+
#if variant_HAVE_STATIC_ASSERT
627+
// cannot use variant<int, char> in macro due to comma:
628+
629+
typedef variant<char> var0;
630+
typedef variant<int, char> var1;
631+
typedef variant<int, int, char> var2;
632+
typedef variant<int, int, int, char> var3;
633+
typedef variant<int, int, int, int, char> var4;
634+
typedef variant<int, int, int, int, int, char> var5;
635+
typedef variant<int, int, int, int, int, int, char> var6;
636+
637+
static_assert( std::is_same<char, variant_alternative_T( 0, var0 ) >::value, "variant_alternative_T(0, var0)" );
638+
static_assert( std::is_same<char, variant_alternative_T( 1, var1 ) >::value, "variant_alternative_T(1, var1)" );
639+
static_assert( std::is_same<char, variant_alternative_T( 2, var2 ) >::value, "variant_alternative_T(2, var2)" );
640+
static_assert( std::is_same<char, variant_alternative_T( 3, var3 ) >::value, "variant_alternative_T(3, var3)" );
641+
static_assert( std::is_same<char, variant_alternative_T( 4, var4 ) >::value, "variant_alternative_T(4, var4)" );
642+
static_assert( std::is_same<char, variant_alternative_T( 5, var5 ) >::value, "variant_alternative_T(5, var5)" );
643+
static_assert( std::is_same<char, variant_alternative_T( 6, var6 ) >::value, "variant_alternative_T(6, var6)" );
644+
#else
645+
EXPECT( !!"variant_alternative_T(): static_assert is not available (no C++11)" );
646+
#endif
543647
}
544648

545-
CASE( "variant: Allows to obtain hash (C++11)" )
649+
CASE( "std::hash<>: Allows to obtain hash (C++11)" )
546650
{
547651
#if variant_CPP11_OR_GREATER
548652
variant<int> var( 7 );
549653

550654
EXPECT( std::hash<variant<int> >()( var ) == std::hash<variant<int> >()( var ) );
551655
#else
552-
EXPECT( !!"variant: std::hash<> is not available (no C++11)" );
656+
EXPECT( !!"std::hash<>: std::hash<> is not available (no C++11)" );
553657
#endif
554658
}
555659

0 commit comments

Comments
 (0)