blob: f36ab34682fe338aa86444c893011571a6ac1e90 [file] [log] [blame]
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include <boost/test/unit_test.hpp>
#include <armnn/Optional.hpp>
#include <string>
namespace
{
void PassStringRef(armnn::Optional<std::string&> value)
{
}
void PassStringRefWithDefault(armnn::Optional<std::string&> value = armnn::EmptyOptional())
{
}
} // namespace <anonymous>
BOOST_AUTO_TEST_SUITE(OptionalTests)
BOOST_AUTO_TEST_CASE(SimpleStringTests)
{
armnn::Optional<std::string> optionalString;
BOOST_TEST(static_cast<bool>(optionalString) == false);
BOOST_TEST(optionalString.has_value() == false);
BOOST_TEST((optionalString == armnn::Optional<std::string>()));
optionalString = std::string("Hello World");
BOOST_TEST(static_cast<bool>(optionalString) == true);
BOOST_TEST(optionalString.has_value() == true);
BOOST_TEST(optionalString.value() == "Hello World");
BOOST_TEST((optionalString == armnn::Optional<std::string>("Hello World")));
armnn::Optional<std::string> otherString;
otherString = optionalString;
BOOST_TEST(static_cast<bool>(otherString) == true);
BOOST_TEST(otherString.value() == "Hello World");
optionalString.reset();
BOOST_TEST(static_cast<bool>(optionalString) == false);
BOOST_TEST(optionalString.has_value() == false);
const std::string stringValue("Hello World");
armnn::Optional<std::string> optionalString2(stringValue);
BOOST_TEST(static_cast<bool>(optionalString2) == true);
BOOST_TEST(optionalString2.has_value() == true);
BOOST_TEST(optionalString2.value() == "Hello World");
armnn::Optional<std::string> optionalString3(std::move(optionalString2));
BOOST_TEST(static_cast<bool>(optionalString3) == true);
BOOST_TEST(optionalString3.has_value() == true);
BOOST_TEST(optionalString3.value() == "Hello World");
}
BOOST_AUTO_TEST_CASE(StringRefTests)
{
armnn::Optional<std::string&> optionalStringRef{armnn::EmptyOptional()};
BOOST_TEST(optionalStringRef.has_value() == false);
PassStringRef(optionalStringRef);
PassStringRefWithDefault();
armnn::Optional<std::string&> optionalStringRef2 = optionalStringRef;
std::string helloWorld("Hello World");
std::string& helloWorldRef = helloWorld;
armnn::Optional<std::string&> optionalHelloRef = helloWorldRef;
BOOST_TEST(optionalHelloRef.has_value() == true);
BOOST_TEST(optionalHelloRef.value() == "Hello World");
armnn::Optional<std::string&> optionalHelloRef2 = helloWorld;
BOOST_TEST(optionalHelloRef2.has_value() == true);
BOOST_TEST(optionalHelloRef2.value() == "Hello World");
armnn::Optional<std::string&> optionalHelloRef3{helloWorldRef};
BOOST_TEST(optionalHelloRef3.has_value() == true);
BOOST_TEST(optionalHelloRef3.value() == "Hello World");
armnn::Optional<std::string&> optionalHelloRef4{helloWorld};
BOOST_TEST(optionalHelloRef4.has_value() == true);
BOOST_TEST(optionalHelloRef4.value() == "Hello World");
// modify through the optional reference
optionalHelloRef4.value().assign("Long Other String");
BOOST_TEST(helloWorld == "Long Other String");
BOOST_TEST(optionalHelloRef.value() == "Long Other String");
BOOST_TEST(optionalHelloRef2.value() == "Long Other String");
BOOST_TEST(optionalHelloRef3.value() == "Long Other String");
}
BOOST_AUTO_TEST_CASE(SimpleIntTests)
{
const int intValue = 123;
armnn::Optional<int> optionalInt;
BOOST_TEST(static_cast<bool>(optionalInt) == false);
BOOST_TEST(optionalInt.has_value() == false);
BOOST_TEST((optionalInt == armnn::Optional<int>()));
optionalInt = intValue;
BOOST_TEST(static_cast<bool>(optionalInt) == true);
BOOST_TEST(optionalInt.has_value() == true);
BOOST_TEST(optionalInt.value() == intValue);
BOOST_TEST((optionalInt == armnn::Optional<int>(intValue)));
armnn::Optional<int> otherOptionalInt;
otherOptionalInt = optionalInt;
BOOST_TEST(static_cast<bool>(otherOptionalInt) == true);
BOOST_TEST(otherOptionalInt.value() == intValue);
}
BOOST_AUTO_TEST_CASE(ObjectConstructedInPlaceTests)
{
struct SimpleObject
{
public:
SimpleObject(const std::string& name, int value)
: m_Name(name)
, m_Value(value)
{}
bool operator ==(const SimpleObject& other)
{
return m_Name == other.m_Name &&
m_Value == other.m_Value;
}
private:
std::string m_Name;
int m_Value;
};
std::string objectName("SimpleObject");
int objectValue = 1;
SimpleObject referenceObject(objectName, objectValue);
// Use MakeOptional
armnn::Optional<SimpleObject> optionalObject1 = armnn::MakeOptional<SimpleObject>(objectName, objectValue);
BOOST_CHECK(static_cast<bool>(optionalObject1) == true);
BOOST_CHECK(optionalObject1.has_value() == true);
BOOST_CHECK(optionalObject1.value() == referenceObject);
// Call in-place constructor directly
armnn::Optional<SimpleObject> optionalObject2(CONSTRUCT_IN_PLACE, objectName, objectValue);
BOOST_CHECK(static_cast<bool>(optionalObject1) == true);
BOOST_CHECK(optionalObject1.has_value() == true);
BOOST_CHECK(optionalObject1.value() == referenceObject);
}
BOOST_AUTO_TEST_SUITE_END()