Skip to content

Commit

Permalink
Add exmple test for Variant Visitor
Browse files Browse the repository at this point in the history
  • Loading branch information
SergeyRyabinin committed Feb 29, 2024
1 parent 18ab0d0 commit 59a4874
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 1 deletion.
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ add_test_case(VariantCompiles)
add_test_case(VariantConstructor)
add_test_case(VariantOperatorEquals)
add_test_case(VariantEmplace)
add_test_case(VariantVisitor)
add_test_case(StreamTestCreateDestroyWrapper)
add_test_case(StreamTestLength)
add_test_case(StreamTestRead)
Expand Down
92 changes: 91 additions & 1 deletion tests/VariantTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -274,4 +274,94 @@ static int s_VariantEmplace(struct aws_allocator *allocator, void *ctx)
return AWS_OP_SUCCESS;
}

AWS_TEST_CASE(VariantEmplace, s_VariantEmplace)
AWS_TEST_CASE(VariantEmplace, s_VariantEmplace)

/* This is an example of a template visitor that accepts an alternative template and handles as a template */
struct TestVisitor
{
Aws::Crt::String m_visitorResult;

template <typename AlternativeT> void operator()(AlternativeT &val)
{
Aws::Crt::StringStream stringStream;
stringStream << "Alternative value: " << val;
m_visitorResult = stringStream.str();
}
};

/* This is an example of a visitor that accepts an alternative template and has a specialization for types for custom
* logic per type */
struct TestVisitorCustomizedPerType
{
Aws::Crt::String m_visitorResult;
/* can't specialize member function templates, so using such syntax of dummy structs */
template <typename... Args> struct MyVisitUtil
{
};

template <typename AlternativeT> void operator()(AlternativeT &val)
{
using TypedRealVisitor = MyVisitUtil<typename std::remove_reference<AlternativeT>::type>;
m_visitorResult = TypedRealVisitor::Visit(val);
}
};

template <> struct TestVisitorCustomizedPerType::MyVisitUtil<Aws::Crt::String>
{
static Aws::Crt::String Visit(Aws::Crt::String &val) { return Aws::Crt::String("String has: " + val); }
};
template <> struct TestVisitorCustomizedPerType::MyVisitUtil<int>
{
static Aws::Crt::String Visit(int &val)
{
Aws::Crt::StringStream stringStream;
stringStream << "Int has: " << val;
return stringStream.str();
}
};
template <> struct TestVisitorCustomizedPerType::MyVisitUtil<char>
{
static Aws::Crt::String Visit(char &val)
{
Aws::Crt::StringStream stringStream;
stringStream << "Char has: " << val;
return stringStream.str();
}
};

static int s_VariantVisitor(struct aws_allocator *allocator, void *ctx)
{
(void)ctx;
{
Aws::Crt::ApiHandle apiHandle(allocator);

{
using VariantStringIntChar = Aws::Crt::Variant<int, char, Aws::Crt::String>;
TestVisitor visitor;
TestVisitorCustomizedPerType specializedVisitor;

VariantStringIntChar var1(char('a'));

var1.Visit(visitor);
ASSERT_STR_EQUALS("Alternative value: a", visitor.m_visitorResult.c_str());
var1.Visit(specializedVisitor);
ASSERT_STR_EQUALS("Char has: a", specializedVisitor.m_visitorResult.c_str());

var1.emplace<int>(5061992);
var1.Visit(visitor);
ASSERT_STR_EQUALS("Alternative value: 5061992", visitor.m_visitorResult.c_str());
var1.Visit(specializedVisitor);
ASSERT_STR_EQUALS("Int has: 5061992", specializedVisitor.m_visitorResult.c_str());

var1.emplace<Aws::Crt::String>("Meow");
var1.Visit(visitor);
ASSERT_STR_EQUALS("Alternative value: Meow", visitor.m_visitorResult.c_str());
var1.Visit(specializedVisitor);
ASSERT_STR_EQUALS("String has: Meow", specializedVisitor.m_visitorResult.c_str());
}
}

return AWS_OP_SUCCESS;
}

AWS_TEST_CASE(VariantVisitor, s_VariantVisitor)

0 comments on commit 59a4874

Please sign in to comment.