16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License. 66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at 76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and 146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License. 156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "test/Common.h" 181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/Maybe.h" 191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <gtest/gtest.h> 216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string> 226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Dummy { 266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Dummy() { 2724aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski data = new int; 2824aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski *data = 1; 2924aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski std::cerr << "Construct Dummy{0x" << (void *) this 3024aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "} with data=0x" << (void*) data 3124aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << std::endl; 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Dummy(const Dummy& rhs) { 3524aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski data = nullptr; 3624aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski if (rhs.data) { 3724aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski data = new int; 3824aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski *data = *rhs.data; 3924aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski } 4024aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski std::cerr << "CopyConstruct Dummy{0x" << (void *) this 4124aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "} from Dummy{0x" << (const void*) &rhs 4224aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "}" << std::endl; 436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Dummy(Dummy&& rhs) { 4624aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski data = rhs.data; 4724aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski rhs.data = nullptr; 4824aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski std::cerr << "MoveConstruct Dummy{0x" << (void *) this 4924aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "} from Dummy{0x" << (const void*) &rhs 5024aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "}" << std::endl; 5124aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski } 5224aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski 5324aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski Dummy& operator=(const Dummy& rhs) { 5424aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski delete data; 5524aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski data = nullptr; 5624aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski 5724aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski if (rhs.data) { 5824aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski data = new int; 5924aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski *data = *rhs.data; 6024aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski } 6124aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski std::cerr << "CopyAssign Dummy{0x" << (void *) this 6224aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "} from Dummy{0x" << (const void*) &rhs 6324aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "}" << std::endl; 6424aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski return *this; 6524aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski } 6624aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski 6724aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski Dummy& operator=(Dummy&& rhs) { 6824aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski delete data; 6924aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski data = rhs.data; 7024aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski rhs.data = nullptr; 7124aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski std::cerr << "MoveAssign Dummy{0x" << (void *) this 7224aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "} from Dummy{0x" << (const void*) &rhs 7324aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "}" << std::endl; 7424aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski return *this; 756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ~Dummy() { 7824aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski std::cerr << "Destruct Dummy{0x" << (void *) this 7924aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << "} with data=0x" << (void*) data 8024aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski << std::endl; 8124aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski delete data; 826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski } 8324aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski 8424aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski int* data; 856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}; 866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(MaybeTest, MakeNothing) { 886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Maybe<int> val = make_nothing<int>(); 891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_EXPECT_FALSE(val); 906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Maybe<std::string> val2 = make_nothing<std::string>(); 921ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_EXPECT_FALSE(val2); 936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski val2 = make_nothing<std::string>(); 951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_EXPECT_FALSE(val2); 966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(MaybeTest, MakeSomething) { 996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Maybe<int> val = make_value(23); 1001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_ASSERT_TRUE(val); 1016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(23, val.value()); 1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Maybe<std::string> val2 = make_value(std::string("hey")); 1041ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_ASSERT_TRUE(val2); 1056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(std::string("hey"), val2.value()); 1066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(MaybeTest, Lifecycle) { 1096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Maybe<Dummy> val = make_nothing<Dummy>(); 1106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 1116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski Maybe<Dummy> val2 = make_value(Dummy()); 1126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 11424aad163bc88cb10d2275385e9afc3de7f342d65Adam LesinskiTEST(MaybeTest, MoveAssign) { 11524aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski Maybe<Dummy> val; 11624aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski { 11724aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski Maybe<Dummy> val2 = Dummy(); 11824aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski val = std::move(val2); 11924aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski } 12024aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski} 12124aad163bc88cb10d2275385e9afc3de7f342d65Adam Lesinski 122a587065721053ad54e34f484868142407d59512dAdam LesinskiTEST(MaybeTest, Equality) { 123a587065721053ad54e34f484868142407d59512dAdam Lesinski Maybe<int> a = 1; 124a587065721053ad54e34f484868142407d59512dAdam Lesinski Maybe<int> b = 1; 125a587065721053ad54e34f484868142407d59512dAdam Lesinski Maybe<int> c; 126a587065721053ad54e34f484868142407d59512dAdam Lesinski 127a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski Maybe<int> emptyA, emptyB; 128a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski 129a587065721053ad54e34f484868142407d59512dAdam Lesinski EXPECT_EQ(a, b); 130a587065721053ad54e34f484868142407d59512dAdam Lesinski EXPECT_EQ(b, a); 131a587065721053ad54e34f484868142407d59512dAdam Lesinski EXPECT_NE(a, c); 132a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski EXPECT_EQ(emptyA, emptyB); 133a587065721053ad54e34f484868142407d59512dAdam Lesinski} 134a587065721053ad54e34f484868142407d59512dAdam Lesinski 1356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 136