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