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