blob: e86e389d69ae2aed5d379580e916cdd88efd44c0 [file] [log] [blame]
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001// Copyright 2020 The Tint 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 "src/tint/traits.h"
16
17#include "gtest/gtest.h"
18
dan sinclair8155b9d2022-04-07 19:10:25 +000019namespace tint::traits {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000020
21namespace {
Ben Clayton2cdf1342023-02-03 13:24:18 +000022
23static_assert(std::is_same_v<PtrElTy<int*>, int>);
24static_assert(std::is_same_v<PtrElTy<int const*>, int>);
25static_assert(std::is_same_v<PtrElTy<int const* const>, int>);
26static_assert(std::is_same_v<PtrElTy<int const* const volatile>, int>);
27static_assert(std::is_same_v<PtrElTy<int>, int>);
28static_assert(std::is_same_v<PtrElTy<int const>, int>);
29static_assert(std::is_same_v<PtrElTy<int const volatile>, int>);
30
31static_assert(IsStringLike<std::string>);
32static_assert(IsStringLike<std::string_view>);
33static_assert(IsStringLike<const char*>);
34static_assert(IsStringLike<const std::string&>);
35static_assert(IsStringLike<const std::string_view&>);
36static_assert(IsStringLike<const char*>);
37static_assert(!IsStringLike<bool>);
38static_assert(!IsStringLike<int>);
39static_assert(!IsStringLike<const char**>);
40
Ryan Harrisondbc13af2022-02-21 15:19:07 +000041struct S {};
42void F1(S) {}
43void F3(int, S, float) {}
44} // namespace
45
46TEST(ParamType, Function) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000047 F1({}); // Avoid unused method warning
48 F3(0, {}, 0); // Avoid unused method warning
49 static_assert(std::is_same_v<ParameterType<decltype(&F1), 0>, S>);
50 static_assert(std::is_same_v<ParameterType<decltype(&F3), 0>, int>);
51 static_assert(std::is_same_v<ParameterType<decltype(&F3), 1>, S>);
52 static_assert(std::is_same_v<ParameterType<decltype(&F3), 2>, float>);
53 static_assert(std::is_same_v<ReturnType<decltype(&F1)>, void>);
54 static_assert(std::is_same_v<ReturnType<decltype(&F3)>, void>);
55 static_assert(SignatureOfT<decltype(&F1)>::parameter_count == 1);
56 static_assert(SignatureOfT<decltype(&F3)>::parameter_count == 3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000057}
58
59TEST(ParamType, Method) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000060 class C {
61 public:
62 void F1(S) {}
63 void F3(int, S, float) {}
64 };
65 C().F1({}); // Avoid unused method warning
66 C().F3(0, {}, 0); // Avoid unused method warning
67 static_assert(std::is_same_v<ParameterType<decltype(&C::F1), 0>, S>);
68 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 0>, int>);
69 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 1>, S>);
70 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 2>, float>);
71 static_assert(std::is_same_v<ReturnType<decltype(&C::F1)>, void>);
72 static_assert(std::is_same_v<ReturnType<decltype(&C::F3)>, void>);
73 static_assert(SignatureOfT<decltype(&C::F1)>::parameter_count == 1);
74 static_assert(SignatureOfT<decltype(&C::F3)>::parameter_count == 3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000075}
76
77TEST(ParamType, ConstMethod) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000078 class C {
79 public:
80 void F1(S) const {}
81 void F3(int, S, float) const {}
82 };
83 C().F1({}); // Avoid unused method warning
84 C().F3(0, {}, 0); // Avoid unused method warning
85 static_assert(std::is_same_v<ParameterType<decltype(&C::F1), 0>, S>);
86 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 0>, int>);
87 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 1>, S>);
88 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 2>, float>);
89 static_assert(std::is_same_v<ReturnType<decltype(&C::F1)>, void>);
90 static_assert(std::is_same_v<ReturnType<decltype(&C::F3)>, void>);
91 static_assert(SignatureOfT<decltype(&C::F1)>::parameter_count == 1);
92 static_assert(SignatureOfT<decltype(&C::F3)>::parameter_count == 3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000093}
94
95TEST(ParamType, StaticMethod) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000096 class C {
97 public:
98 static void F1(S) {}
99 static void F3(int, S, float) {}
100 };
101 C::F1({}); // Avoid unused method warning
102 C::F3(0, {}, 0); // Avoid unused method warning
103 static_assert(std::is_same_v<ParameterType<decltype(&C::F1), 0>, S>);
104 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 0>, int>);
105 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 1>, S>);
106 static_assert(std::is_same_v<ParameterType<decltype(&C::F3), 2>, float>);
107 static_assert(std::is_same_v<ReturnType<decltype(&C::F1)>, void>);
108 static_assert(std::is_same_v<ReturnType<decltype(&C::F3)>, void>);
109 static_assert(SignatureOfT<decltype(&C::F1)>::parameter_count == 1);
110 static_assert(SignatureOfT<decltype(&C::F3)>::parameter_count == 3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000111}
112
113TEST(ParamType, FunctionLike) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000114 using F1 = std::function<void(S)>;
115 using F3 = std::function<void(int, S, float)>;
116 static_assert(std::is_same_v<ParameterType<F1, 0>, S>);
117 static_assert(std::is_same_v<ParameterType<F3, 0>, int>);
118 static_assert(std::is_same_v<ParameterType<F3, 1>, S>);
119 static_assert(std::is_same_v<ParameterType<F3, 2>, float>);
120 static_assert(std::is_same_v<ReturnType<F1>, void>);
121 static_assert(std::is_same_v<ReturnType<F3>, void>);
122 static_assert(SignatureOfT<F1>::parameter_count == 1);
123 static_assert(SignatureOfT<F3>::parameter_count == 3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000124}
125
126TEST(ParamType, Lambda) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000127 auto l1 = [](S) {};
128 auto l3 = [](int, S, float) {};
129 static_assert(std::is_same_v<ParameterType<decltype(l1), 0>, S>);
130 static_assert(std::is_same_v<ParameterType<decltype(l3), 0>, int>);
131 static_assert(std::is_same_v<ParameterType<decltype(l3), 1>, S>);
132 static_assert(std::is_same_v<ParameterType<decltype(l3), 2>, float>);
133 static_assert(std::is_same_v<ReturnType<decltype(l1)>, void>);
134 static_assert(std::is_same_v<ReturnType<decltype(l3)>, void>);
135 static_assert(SignatureOfT<decltype(l1)>::parameter_count == 1);
136 static_assert(SignatureOfT<decltype(l3)>::parameter_count == 3);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000137}
138
139TEST(Slice, Empty) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000140 auto sliced = Slice<0, 0>(std::make_tuple<>());
141 static_assert(std::tuple_size_v<decltype(sliced)> == 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000142}
143
144TEST(Slice, SingleElementSliceEmpty) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000145 auto sliced = Slice<0, 0>(std::make_tuple<int>(1));
146 static_assert(std::tuple_size_v<decltype(sliced)> == 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000147}
148
149TEST(Slice, SingleElementSliceFull) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000150 auto sliced = Slice<0, 1>(std::make_tuple<int>(1));
151 static_assert(std::tuple_size_v<decltype(sliced)> == 1);
152 static_assert(std::is_same_v<std::tuple_element_t<0, decltype(sliced)>, int>, "");
153 EXPECT_EQ(std::get<0>(sliced), 1);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000154}
155
156TEST(Slice, MixedTupleSliceEmpty) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000157 auto sliced = Slice<1, 0>(std::make_tuple<int, bool, float>(1, true, 2.0f));
158 static_assert(std::tuple_size_v<decltype(sliced)> == 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000159}
160
161TEST(Slice, MixedTupleSliceFull) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000162 auto sliced = Slice<0, 3>(std::make_tuple<int, bool, float>(1, true, 2.0f));
163 static_assert(std::tuple_size_v<decltype(sliced)> == 3);
164 static_assert(std::is_same_v<std::tuple_element_t<0, decltype(sliced)>, int>, "");
165 static_assert(std::is_same_v<std::tuple_element_t<1, decltype(sliced)>, bool>, "");
166 static_assert(std::is_same_v<std::tuple_element_t<2, decltype(sliced)>, float>);
167 EXPECT_EQ(std::get<0>(sliced), 1);
168 EXPECT_EQ(std::get<1>(sliced), true);
169 EXPECT_EQ(std::get<2>(sliced), 2.0f);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000170}
171
172TEST(Slice, MixedTupleSliceLowPart) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000173 auto sliced = Slice<0, 2>(std::make_tuple<int, bool, float>(1, true, 2.0f));
174 static_assert(std::tuple_size_v<decltype(sliced)> == 2);
175 static_assert(std::is_same_v<std::tuple_element_t<0, decltype(sliced)>, int>, "");
176 static_assert(std::is_same_v<std::tuple_element_t<1, decltype(sliced)>, bool>, "");
177 EXPECT_EQ(std::get<0>(sliced), 1);
178 EXPECT_EQ(std::get<1>(sliced), true);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000179}
180
181TEST(Slice, MixedTupleSliceHighPart) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000182 auto sliced = Slice<1, 2>(std::make_tuple<int, bool, float>(1, true, 2.0f));
183 static_assert(std::tuple_size_v<decltype(sliced)> == 2);
184 static_assert(std::is_same_v<std::tuple_element_t<0, decltype(sliced)>, bool>, "");
185 static_assert(std::is_same_v<std::tuple_element_t<1, decltype(sliced)>, float>);
186 EXPECT_EQ(std::get<0>(sliced), true);
187 EXPECT_EQ(std::get<1>(sliced), 2.0f);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000188}
189
190TEST(Slice, PreservesRValueRef) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000191 int i;
192 int& int_ref = i;
193 auto tuple = std::forward_as_tuple(std::move(int_ref));
194 static_assert(std::is_same_v<int&&, //
195 std::tuple_element_t<0, decltype(tuple)>>);
196 auto sliced = Slice<0, 1>(std::move(tuple));
197 static_assert(std::is_same_v<int&&, //
198 std::tuple_element_t<0, decltype(sliced)>>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000199}
200
201TEST(SliceTuple, Empty) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000202 using sliced = SliceTuple<0, 0, std::tuple<>>;
203 static_assert(std::tuple_size_v<sliced> == 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000204}
205
206TEST(SliceTuple, SingleElementSliceEmpty) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000207 using sliced = SliceTuple<0, 0, std::tuple<int>>;
208 static_assert(std::tuple_size_v<sliced> == 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000209}
210
211TEST(SliceTuple, SingleElementSliceFull) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000212 using sliced = SliceTuple<0, 1, std::tuple<int>>;
213 static_assert(std::tuple_size_v<sliced> == 1);
214 static_assert(std::is_same_v<std::tuple_element_t<0, sliced>, int>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000215}
216
217TEST(SliceTuple, MixedTupleSliceEmpty) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000218 using sliced = SliceTuple<1, 0, std::tuple<int, bool, float>>;
219 static_assert(std::tuple_size_v<sliced> == 0);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000220}
221
222TEST(SliceTuple, MixedTupleSliceFull) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000223 using sliced = SliceTuple<0, 3, std::tuple<int, bool, float>>;
224 static_assert(std::tuple_size_v<sliced> == 3);
225 static_assert(std::is_same_v<std::tuple_element_t<0, sliced>, int>);
226 static_assert(std::is_same_v<std::tuple_element_t<1, sliced>, bool>);
227 static_assert(std::is_same_v<std::tuple_element_t<2, sliced>, float>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000228}
229
230TEST(SliceTuple, MixedTupleSliceLowPart) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000231 using sliced = SliceTuple<0, 2, std::tuple<int, bool, float>>;
232 static_assert(std::tuple_size_v<sliced> == 2);
233 static_assert(std::is_same_v<std::tuple_element_t<0, sliced>, int>);
234 static_assert(std::is_same_v<std::tuple_element_t<1, sliced>, bool>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000235}
236
237TEST(SliceTuple, MixedTupleSliceHighPart) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000238 using sliced = SliceTuple<1, 2, std::tuple<int, bool, float>>;
239 static_assert(std::tuple_size_v<sliced> == 2);
240 static_assert(std::is_same_v<std::tuple_element_t<0, sliced>, bool>);
241 static_assert(std::is_same_v<std::tuple_element_t<1, sliced>, float>);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000242}
243
dan sinclair8155b9d2022-04-07 19:10:25 +0000244} // namespace tint::traits