Radium Engine  1.5.28
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bijectiveassociation.cpp
1#include <Core/Utils/BijectiveAssociation.hpp>
2#include <catch2/catch_test_macros.hpp>
3
4#include <stdexcept>
5#include <string>
6#include <utility>
7
8using namespace Ra::Core::Utils;
9
10TEST_CASE( "Core/Utils/BijectiveAssociation",
11 "[unittests][Core][Core/Utils][BijectiveAssociation]" ) {
12
13 SECTION( "Bijection between different types" ) {
14 BijectiveAssociation<std::string, int> myTranslator { { "One", 1 }, { "Two", 2 } };
15 myTranslator.insert( "Three", 3 );
16 myTranslator.insert( { "Four", 4 } );
17
18 REQUIRE( myTranslator( "Four" ) == 4 );
19 REQUIRE( myTranslator.key( 3 ) == "Three" );
20 REQUIRE( myTranslator.value( "One" ) == 1 );
21 REQUIRE( myTranslator.key( 2 ) == "Two" );
22
23 auto res = myTranslator.insert( "Four", 2 );
24 REQUIRE( !res );
25
26 auto n = myTranslator.size();
27 REQUIRE( n == 4 );
28 }
29
30 SECTION( "Bijection between same types" ) {
31 BijectiveAssociation<std::string, std::string> myTranslator { { "One", "Un" },
32 { "Two", "Deux" } };
33 myTranslator.insert( "Three", "Trois" );
34 REQUIRE( myTranslator.insert( { "Four", "Quatre" } ) ); // first insert pass
35 REQUIRE( !myTranslator.insert(
36 { "Four", "Quatre" } ) ); // second insert failed since already present
37
38 REQUIRE( myTranslator( "Four" ) == "Quatre" );
39 REQUIRE( myTranslator.value( "Three" ) == "Trois" );
40 REQUIRE( myTranslator.key( "Deux" ) == "Two" );
41 }
42
43 SECTION( "Iterators on Bijective association" ) {
45 { "One", "Un" }, { "Two", "Deux" }, { "Three", "Trois" } };
46 for ( const auto& e : myTranslator ) {
47 REQUIRE( myTranslator.value( e.first ) == e.second );
48 REQUIRE( myTranslator.key( e.second ) == e.first );
49 }
50 }
51
52 SECTION( "Erase, replace, get undef." ) {
54 { "Foo", 1 }, { "Bar", 2 }, { "Baz", 3 } };
55
56 REQUIRE_THROWS_AS( myTranslator.value( "Faz" ), std::out_of_range );
57 REQUIRE_THROWS_AS( myTranslator.key( 4 ), std::out_of_range );
58
59 REQUIRE( !myTranslator.valueIfExists( "Faz" ) );
60 REQUIRE( !myTranslator.keyIfExists( 4 ) );
61
62 REQUIRE( myTranslator.value( "Foo" ) == 1 );
63 REQUIRE( myTranslator.key( 1 ) == "Foo" );
64 myTranslator.replace( "Foo", 4 );
65 REQUIRE( myTranslator.value( "Foo" ) == 4 );
66 REQUIRE( myTranslator.key( 4 ) == "Foo" );
67
68 REQUIRE( myTranslator.remove( "Bar", 2 ) );
69 REQUIRE( !myTranslator.remove( "Unknown", 6 ) );
70 REQUIRE( myTranslator.insert( "Bar", 6 ) );
71 REQUIRE( myTranslator.value( "Bar" ) == 6 );
72 REQUIRE( myTranslator.key( 6 ) == "Bar" );
73
74 REQUIRE( myTranslator.value( "Foo" ) == 4 );
75 REQUIRE( myTranslator.key( 4 ) == "Foo" );
76 myTranslator.replace( "Faz", 4 );
77 REQUIRE( myTranslator.value( "Faz" ) == 4 );
78 REQUIRE( myTranslator.key( 4 ) == "Faz" );
79 }
80}
Bijective association between two sets {keys} and {values} having the same cardinality....
bool insert(std::pair< key_type, value_type > p)
Insert a pair into the association.