1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <gtest/gtest.h> 18#include <string> 19 20#include "Maybe.h" 21 22namespace aapt { 23 24struct Dummy { 25 Dummy() { 26 data = new int; 27 *data = 1; 28 std::cerr << "Construct Dummy{0x" << (void *) this 29 << "} with data=0x" << (void*) data 30 << std::endl; 31 } 32 33 Dummy(const Dummy& rhs) { 34 data = nullptr; 35 if (rhs.data) { 36 data = new int; 37 *data = *rhs.data; 38 } 39 std::cerr << "CopyConstruct Dummy{0x" << (void *) this 40 << "} from Dummy{0x" << (const void*) &rhs 41 << "}" << std::endl; 42 } 43 44 Dummy(Dummy&& rhs) { 45 data = rhs.data; 46 rhs.data = nullptr; 47 std::cerr << "MoveConstruct Dummy{0x" << (void *) this 48 << "} from Dummy{0x" << (const void*) &rhs 49 << "}" << std::endl; 50 } 51 52 Dummy& operator=(const Dummy& rhs) { 53 delete data; 54 data = nullptr; 55 56 if (rhs.data) { 57 data = new int; 58 *data = *rhs.data; 59 } 60 std::cerr << "CopyAssign Dummy{0x" << (void *) this 61 << "} from Dummy{0x" << (const void*) &rhs 62 << "}" << std::endl; 63 return *this; 64 } 65 66 Dummy& operator=(Dummy&& rhs) { 67 delete data; 68 data = rhs.data; 69 rhs.data = nullptr; 70 std::cerr << "MoveAssign Dummy{0x" << (void *) this 71 << "} from Dummy{0x" << (const void*) &rhs 72 << "}" << std::endl; 73 return *this; 74 } 75 76 ~Dummy() { 77 std::cerr << "Destruct Dummy{0x" << (void *) this 78 << "} with data=0x" << (void*) data 79 << std::endl; 80 delete data; 81 } 82 83 int* data; 84}; 85 86TEST(MaybeTest, MakeNothing) { 87 Maybe<int> val = make_nothing<int>(); 88 EXPECT_FALSE(val); 89 90 Maybe<std::string> val2 = make_nothing<std::string>(); 91 EXPECT_FALSE(val2); 92 93 val2 = make_nothing<std::string>(); 94 EXPECT_FALSE(val2); 95} 96 97TEST(MaybeTest, MakeSomething) { 98 Maybe<int> val = make_value(23); 99 ASSERT_TRUE(val); 100 EXPECT_EQ(23, val.value()); 101 102 Maybe<std::string> val2 = make_value(std::string("hey")); 103 ASSERT_TRUE(val2); 104 EXPECT_EQ(std::string("hey"), val2.value()); 105} 106 107TEST(MaybeTest, Lifecycle) { 108 Maybe<Dummy> val = make_nothing<Dummy>(); 109 110 Maybe<Dummy> val2 = make_value(Dummy()); 111} 112 113TEST(MaybeTest, MoveAssign) { 114 Maybe<Dummy> val; 115 { 116 Maybe<Dummy> val2 = Dummy(); 117 val = std::move(val2); 118 } 119} 120 121} // namespace aapt 122