1 // 2 // Copyright © 2017 Arm Ltd. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #include <boost/test/unit_test.hpp> 6 7 #include <armnn/Optional.hpp> 8 #include <string> 9 10 #include <armnn/utility/IgnoreUnused.hpp> 11 12 namespace 13 { 14 PassStringRef(armnn::Optional<std::string &> value)15void PassStringRef(armnn::Optional<std::string&> value) 16 { 17 armnn::IgnoreUnused(value); 18 } 19 PassStringRefWithDefault(armnn::Optional<std::string &> value=armnn::EmptyOptional ())20void PassStringRefWithDefault(armnn::Optional<std::string&> value = armnn::EmptyOptional()) 21 { 22 armnn::IgnoreUnused(value); 23 } 24 25 } // namespace <anonymous> 26 27 BOOST_AUTO_TEST_SUITE(OptionalTests) 28 BOOST_AUTO_TEST_CASE(SimpleStringTests)29BOOST_AUTO_TEST_CASE(SimpleStringTests) 30 { 31 armnn::Optional<std::string> optionalString; 32 BOOST_TEST(static_cast<bool>(optionalString) == false); 33 BOOST_TEST(optionalString.has_value() == false); 34 BOOST_TEST((optionalString == armnn::Optional<std::string>())); 35 36 optionalString = std::string("Hello World"); 37 BOOST_TEST(static_cast<bool>(optionalString) == true); 38 BOOST_TEST(optionalString.has_value() == true); 39 BOOST_TEST(optionalString.value() == "Hello World"); 40 BOOST_TEST((optionalString == armnn::Optional<std::string>("Hello World"))); 41 42 armnn::Optional<std::string> otherString; 43 otherString = optionalString; 44 BOOST_TEST(static_cast<bool>(otherString) == true); 45 BOOST_TEST(otherString.value() == "Hello World"); 46 47 optionalString.reset(); 48 BOOST_TEST(static_cast<bool>(optionalString) == false); 49 BOOST_TEST(optionalString.has_value() == false); 50 51 const std::string stringValue("Hello World"); 52 armnn::Optional<std::string> optionalString2(stringValue); 53 BOOST_TEST(static_cast<bool>(optionalString2) == true); 54 BOOST_TEST(optionalString2.has_value() == true); 55 BOOST_TEST(optionalString2.value() == "Hello World"); 56 57 armnn::Optional<std::string> optionalString3(std::move(optionalString2)); 58 BOOST_TEST(static_cast<bool>(optionalString3) == true); 59 BOOST_TEST(optionalString3.has_value() == true); 60 BOOST_TEST(optionalString3.value() == "Hello World"); 61 } 62 BOOST_AUTO_TEST_CASE(StringRefTests)63BOOST_AUTO_TEST_CASE(StringRefTests) 64 { 65 armnn::Optional<std::string&> optionalStringRef{armnn::EmptyOptional()}; 66 BOOST_TEST(optionalStringRef.has_value() == false); 67 68 PassStringRef(optionalStringRef); 69 PassStringRefWithDefault(); 70 71 armnn::Optional<std::string&> optionalStringRef2 = optionalStringRef; 72 73 std::string helloWorld("Hello World"); 74 75 std::string& helloWorldRef = helloWorld; 76 armnn::Optional<std::string&> optionalHelloRef = helloWorldRef; 77 BOOST_TEST(optionalHelloRef.has_value() == true); 78 BOOST_TEST(optionalHelloRef.value() == "Hello World"); 79 80 armnn::Optional<std::string&> optionalHelloRef2 = helloWorld; 81 BOOST_TEST(optionalHelloRef2.has_value() == true); 82 BOOST_TEST(optionalHelloRef2.value() == "Hello World"); 83 84 armnn::Optional<std::string&> optionalHelloRef3{helloWorldRef}; 85 BOOST_TEST(optionalHelloRef3.has_value() == true); 86 BOOST_TEST(optionalHelloRef3.value() == "Hello World"); 87 88 armnn::Optional<std::string&> optionalHelloRef4{helloWorld}; 89 BOOST_TEST(optionalHelloRef4.has_value() == true); 90 BOOST_TEST(optionalHelloRef4.value() == "Hello World"); 91 92 // modify through the optional reference 93 optionalHelloRef4.value().assign("Long Other String"); 94 BOOST_TEST(helloWorld == "Long Other String"); 95 BOOST_TEST(optionalHelloRef.value() == "Long Other String"); 96 BOOST_TEST(optionalHelloRef2.value() == "Long Other String"); 97 BOOST_TEST(optionalHelloRef3.value() == "Long Other String"); 98 } 99 BOOST_AUTO_TEST_CASE(SimpleIntTests)100BOOST_AUTO_TEST_CASE(SimpleIntTests) 101 { 102 const int intValue = 123; 103 104 armnn::Optional<int> optionalInt; 105 BOOST_TEST(static_cast<bool>(optionalInt) == false); 106 BOOST_TEST(optionalInt.has_value() == false); 107 BOOST_TEST((optionalInt == armnn::Optional<int>())); 108 109 optionalInt = intValue; 110 BOOST_TEST(static_cast<bool>(optionalInt) == true); 111 BOOST_TEST(optionalInt.has_value() == true); 112 BOOST_TEST(optionalInt.value() == intValue); 113 BOOST_TEST((optionalInt == armnn::Optional<int>(intValue))); 114 115 armnn::Optional<int> otherOptionalInt; 116 otherOptionalInt = optionalInt; 117 BOOST_TEST(static_cast<bool>(otherOptionalInt) == true); 118 BOOST_TEST(otherOptionalInt.value() == intValue); 119 } 120 BOOST_AUTO_TEST_CASE(ObjectConstructedInPlaceTests)121BOOST_AUTO_TEST_CASE(ObjectConstructedInPlaceTests) 122 { 123 struct SimpleObject 124 { 125 public: 126 SimpleObject(const std::string& name, int value) 127 : m_Name(name) 128 , m_Value(value) 129 {} 130 131 bool operator ==(const SimpleObject& other) 132 { 133 return m_Name == other.m_Name && 134 m_Value == other.m_Value; 135 } 136 137 private: 138 std::string m_Name; 139 int m_Value; 140 }; 141 142 std::string objectName("SimpleObject"); 143 int objectValue = 1; 144 SimpleObject referenceObject(objectName, objectValue); 145 146 // Use MakeOptional 147 armnn::Optional<SimpleObject> optionalObject1 = armnn::MakeOptional<SimpleObject>(objectName, objectValue); 148 BOOST_CHECK(static_cast<bool>(optionalObject1) == true); 149 BOOST_CHECK(optionalObject1.has_value() == true); 150 BOOST_CHECK(optionalObject1.value() == referenceObject); 151 152 // Call in-place constructor directly 153 armnn::Optional<SimpleObject> optionalObject2(CONSTRUCT_IN_PLACE, objectName, objectValue); 154 BOOST_CHECK(static_cast<bool>(optionalObject1) == true); 155 BOOST_CHECK(optionalObject1.has_value() == true); 156 BOOST_CHECK(optionalObject1.value() == referenceObject); 157 } 158 159 BOOST_AUTO_TEST_SUITE_END() 160