1 // Copyright 2017 The Dawn Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include <gtest/gtest.h>
16 
17 #include "common/RefCounted.h"
18 #include "dawn_native/ToBackend.h"
19 
20 #include <type_traits>
21 
22 // Make our own Base - Backend object pair, reusing the AdapterBase name
23 namespace dawn_native {
24     class AdapterBase : public RefCounted {};
25 }  // namespace dawn_native
26 
27 using namespace dawn_native;
28 
29 class MyAdapter : public AdapterBase {};
30 
31 struct MyBackendTraits {
32     using AdapterType = MyAdapter;
33 };
34 
35 // Instanciate ToBackend for our "backend"
36 template <typename T>
ToBackend(T && common)37 auto ToBackend(T&& common) -> decltype(ToBackendBase<MyBackendTraits>(common)) {
38     return ToBackendBase<MyBackendTraits>(common);
39 }
40 
41 // Test that ToBackend correctly converts pointers to base classes.
TEST(ToBackend,Pointers)42 TEST(ToBackend, Pointers) {
43     {
44         MyAdapter* adapter = new MyAdapter;
45         const AdapterBase* base = adapter;
46 
47         auto backendAdapter = ToBackend(base);
48         static_assert(std::is_same<decltype(backendAdapter), const MyAdapter*>::value, "");
49         ASSERT_EQ(adapter, backendAdapter);
50 
51         adapter->Release();
52     }
53     {
54         MyAdapter* adapter = new MyAdapter;
55         AdapterBase* base = adapter;
56 
57         auto backendAdapter = ToBackend(base);
58         static_assert(std::is_same<decltype(backendAdapter), MyAdapter*>::value, "");
59         ASSERT_EQ(adapter, backendAdapter);
60 
61         adapter->Release();
62     }
63 }
64 
65 // Test that ToBackend correctly converts Refs to base classes.
TEST(ToBackend,Ref)66 TEST(ToBackend, Ref) {
67     {
68         MyAdapter* adapter = new MyAdapter;
69         const Ref<AdapterBase> base(adapter);
70 
71         const auto& backendAdapter = ToBackend(base);
72         static_assert(std::is_same<decltype(ToBackend(base)), const Ref<MyAdapter>&>::value, "");
73         ASSERT_EQ(adapter, backendAdapter.Get());
74 
75         adapter->Release();
76     }
77     {
78         MyAdapter* adapter = new MyAdapter;
79         Ref<AdapterBase> base(adapter);
80 
81         auto backendAdapter = ToBackend(base);
82         static_assert(std::is_same<decltype(ToBackend(base)), Ref<MyAdapter>&>::value, "");
83         ASSERT_EQ(adapter, backendAdapter.Get());
84 
85         adapter->Release();
86     }
87 }
88