TYPE3
[iec.git] / src / type3_AndroidCloud / anbox-master / tests / anbox / common / scope_ptr_tests.cpp
diff --git a/src/type3_AndroidCloud/anbox-master/tests/anbox/common/scope_ptr_tests.cpp b/src/type3_AndroidCloud/anbox-master/tests/anbox/common/scope_ptr_tests.cpp
new file mode 100644 (file)
index 0000000..25e300c
--- /dev/null
@@ -0,0 +1,65 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "anbox/common/scope_ptr.h"
+
+#include <gtest/gtest.h>
+
+#include <type_traits>
+#include <utility>
+
+namespace anbox {
+namespace common {
+
+TEST(ScopedPtr, FuncDelete_conversions) {
+    // This test makes sure the code compiles, it doesn't do any runtime checks.
+    auto lambda = [](int i) { return i; };
+    FuncDelete<decltype(lambda)> lambdaFd(lambda);
+    // unary + converts a captureless lambda into a raw function pointer
+    FuncDelete<decltype(+lambda)> funcFd1(+lambda);
+
+    // copy ctor
+    FuncDelete<decltype(+lambda)> funcFd2(funcFd1);
+    // assignment operator
+    funcFd2 = funcFd1;
+    // move operator
+    funcFd2 = std::move(funcFd1);
+
+    // conversion ctor
+    FuncDelete<decltype(+lambda)> funcFd3(lambdaFd);
+    // conversion move ctor
+    FuncDelete<decltype(+lambda)> funcFd4(std::move(lambdaFd));
+    // conversion assignment
+    funcFd3 = lambdaFd;
+    // conversion move
+    funcFd3 = std::move(lambdaFd);
+}
+
+TEST(ScopedPtr, makeCustomScopedPtr_fromLambda) {
+    auto freeAsLambda = [](void* ptr) { free(ptr); };
+
+    auto ptr1 = makeCustomScopedPtr(malloc(1), freeAsLambda);
+
+    ScopedPtr<void, FuncDelete<void(*)(void*)>> ptr2 =
+            makeCustomScopedPtr(malloc(1), freeAsLambda);
+
+    ScopedPtr<void, FuncDelete<void(*)(void*)>> ptr3 =
+            makeCustomScopedPtr(malloc(1), +freeAsLambda);
+
+    static_assert(!std::is_same<decltype(ptr1), decltype(ptr2)>::value,
+                  "Custom ScopedPtr<> from a lambda expression type may not "
+                  "be the same as with a function pointer");
+}
+}  // namespace common
+}  // namespace anbox