Austin Eng | cc2516a | 2023-10-17 20:57:54 +0000 | [diff] [blame] | 1 | // Copyright 2020 The Dawn & Tint Authors |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 2 | // |
Austin Eng | cc2516a | 2023-10-17 20:57:54 +0000 | [diff] [blame] | 3 | // Redistribution and use in source and binary forms, with or without |
| 4 | // modification, are permitted provided that the following conditions are met: |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 5 | // |
Austin Eng | cc2516a | 2023-10-17 20:57:54 +0000 | [diff] [blame] | 6 | // 1. Redistributions of source code must retain the above copyright notice, this |
| 7 | // list of conditions and the following disclaimer. |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 8 | // |
Austin Eng | cc2516a | 2023-10-17 20:57:54 +0000 | [diff] [blame] | 9 | // 2. Redistributions in binary form must reproduce the above copyright notice, |
| 10 | // this list of conditions and the following disclaimer in the documentation |
| 11 | // and/or other materials provided with the distribution. |
| 12 | // |
| 13 | // 3. Neither the name of the copyright holder nor the names of its |
| 14 | // contributors may be used to endorse or promote products derived from |
| 15 | // this software without specific prior written permission. |
| 16 | // |
| 17 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 18 | // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 19 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 20 | // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| 21 | // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 22 | // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| 23 | // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| 24 | // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| 25 | // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 27 | |
dan sinclair | 22b4dd2 | 2023-07-21 00:40:07 +0000 | [diff] [blame] | 28 | #include "src/tint/utils/rtti/castable.h" |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 29 | |
| 30 | #include <memory> |
| 31 | #include <string> |
| 32 | |
| 33 | #include "gtest/gtest.h" |
| 34 | |
dan sinclair | bae54e7 | 2023-07-28 15:01:54 +0000 | [diff] [blame] | 35 | namespace tint { |
Ben Clayton | 23946b3 | 2023-03-09 16:50:19 +0000 | [diff] [blame] | 36 | namespace { |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 37 | |
dan sinclair | bae54e7 | 2023-07-28 15:01:54 +0000 | [diff] [blame] | 38 | struct Animal : public Castable<Animal> {}; |
| 39 | struct Amphibian : public Castable<Amphibian, Animal> {}; |
| 40 | struct Mammal : public Castable<Mammal, Animal> {}; |
| 41 | struct Reptile : public Castable<Reptile, Animal> {}; |
| 42 | struct Frog : public Castable<Frog, Amphibian> {}; |
| 43 | struct Bear : public Castable<Bear, Mammal> {}; |
| 44 | struct Lizard : public Castable<Lizard, Reptile> {}; |
| 45 | struct Gecko : public Castable<Gecko, Lizard> {}; |
| 46 | struct Iguana : public Castable<Iguana, Lizard> {}; |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 47 | |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 48 | TEST(CastableBase, Is) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 49 | std::unique_ptr<CastableBase> frog = std::make_unique<Frog>(); |
| 50 | std::unique_ptr<CastableBase> bear = std::make_unique<Bear>(); |
| 51 | std::unique_ptr<CastableBase> gecko = std::make_unique<Gecko>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 52 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 53 | ASSERT_TRUE(frog->Is<Animal>()); |
| 54 | ASSERT_TRUE(bear->Is<Animal>()); |
| 55 | ASSERT_TRUE(gecko->Is<Animal>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 56 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 57 | ASSERT_TRUE(frog->Is<Amphibian>()); |
| 58 | ASSERT_FALSE(bear->Is<Amphibian>()); |
| 59 | ASSERT_FALSE(gecko->Is<Amphibian>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 60 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 61 | ASSERT_FALSE(frog->Is<Mammal>()); |
| 62 | ASSERT_TRUE(bear->Is<Mammal>()); |
| 63 | ASSERT_FALSE(gecko->Is<Mammal>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 64 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 65 | ASSERT_FALSE(frog->Is<Reptile>()); |
| 66 | ASSERT_FALSE(bear->Is<Reptile>()); |
| 67 | ASSERT_TRUE(gecko->Is<Reptile>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 68 | } |
| 69 | |
| 70 | TEST(CastableBase, Is_kDontErrorOnImpossibleCast) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 71 | // Unlike TEST(CastableBase, Is), we're dynamically querying [A -> B] without |
| 72 | // going via CastableBase. |
| 73 | auto frog = std::make_unique<Frog>(); |
| 74 | auto bear = std::make_unique<Bear>(); |
| 75 | auto gecko = std::make_unique<Gecko>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 76 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 77 | ASSERT_TRUE((frog->Is<Animal, kDontErrorOnImpossibleCast>())); |
| 78 | ASSERT_TRUE((bear->Is<Animal, kDontErrorOnImpossibleCast>())); |
| 79 | ASSERT_TRUE((gecko->Is<Animal, kDontErrorOnImpossibleCast>())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 80 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 81 | ASSERT_TRUE((frog->Is<Amphibian, kDontErrorOnImpossibleCast>())); |
| 82 | ASSERT_FALSE((bear->Is<Amphibian, kDontErrorOnImpossibleCast>())); |
| 83 | ASSERT_FALSE((gecko->Is<Amphibian, kDontErrorOnImpossibleCast>())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 84 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 85 | ASSERT_FALSE((frog->Is<Mammal, kDontErrorOnImpossibleCast>())); |
| 86 | ASSERT_TRUE((bear->Is<Mammal, kDontErrorOnImpossibleCast>())); |
| 87 | ASSERT_FALSE((gecko->Is<Mammal, kDontErrorOnImpossibleCast>())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 88 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 89 | ASSERT_FALSE((frog->Is<Reptile, kDontErrorOnImpossibleCast>())); |
| 90 | ASSERT_FALSE((bear->Is<Reptile, kDontErrorOnImpossibleCast>())); |
| 91 | ASSERT_TRUE((gecko->Is<Reptile, kDontErrorOnImpossibleCast>())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 92 | } |
| 93 | |
| 94 | TEST(CastableBase, IsWithPredicate) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 95 | std::unique_ptr<CastableBase> frog = std::make_unique<Frog>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 96 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 97 | frog->Is<Animal>([&frog](const Animal* a) { |
| 98 | EXPECT_EQ(a, frog.get()); |
| 99 | return true; |
| 100 | }); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 101 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 102 | ASSERT_TRUE((frog->Is<Animal>([](const Animal*) { return true; }))); |
| 103 | ASSERT_FALSE((frog->Is<Animal>([](const Animal*) { return false; }))); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 104 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 105 | // Predicate not called if cast is invalid |
| 106 | auto expect_not_called = [] { FAIL() << "Should not be called"; }; |
| 107 | ASSERT_FALSE((frog->Is<Bear>([&](const Animal*) { |
| 108 | expect_not_called(); |
| 109 | return true; |
| 110 | }))); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 111 | } |
| 112 | |
| 113 | TEST(CastableBase, IsAnyOf) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 114 | std::unique_ptr<CastableBase> frog = std::make_unique<Frog>(); |
| 115 | std::unique_ptr<CastableBase> bear = std::make_unique<Bear>(); |
| 116 | std::unique_ptr<CastableBase> gecko = std::make_unique<Gecko>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 117 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 118 | ASSERT_TRUE((frog->IsAnyOf<Animal, Mammal, Amphibian, Reptile>())); |
| 119 | ASSERT_TRUE((frog->IsAnyOf<Mammal, Amphibian>())); |
| 120 | ASSERT_TRUE((frog->IsAnyOf<Amphibian, Reptile>())); |
| 121 | ASSERT_FALSE((frog->IsAnyOf<Mammal, Reptile>())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 122 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 123 | ASSERT_TRUE((bear->IsAnyOf<Animal, Mammal, Amphibian, Reptile>())); |
| 124 | ASSERT_TRUE((bear->IsAnyOf<Mammal, Amphibian>())); |
| 125 | ASSERT_TRUE((bear->IsAnyOf<Mammal, Reptile>())); |
| 126 | ASSERT_FALSE((bear->IsAnyOf<Amphibian, Reptile>())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 127 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 128 | ASSERT_TRUE((gecko->IsAnyOf<Animal, Mammal, Amphibian, Reptile>())); |
| 129 | ASSERT_TRUE((gecko->IsAnyOf<Mammal, Reptile>())); |
| 130 | ASSERT_TRUE((gecko->IsAnyOf<Amphibian, Reptile>())); |
| 131 | ASSERT_FALSE((gecko->IsAnyOf<Mammal, Amphibian>())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 132 | } |
| 133 | |
| 134 | TEST(CastableBase, As) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 135 | std::unique_ptr<CastableBase> frog = std::make_unique<Frog>(); |
| 136 | std::unique_ptr<CastableBase> bear = std::make_unique<Bear>(); |
| 137 | std::unique_ptr<CastableBase> gecko = std::make_unique<Gecko>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 138 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 139 | ASSERT_EQ(frog->As<Animal>(), static_cast<Animal*>(frog.get())); |
| 140 | ASSERT_EQ(bear->As<Animal>(), static_cast<Animal*>(bear.get())); |
| 141 | ASSERT_EQ(gecko->As<Animal>(), static_cast<Animal*>(gecko.get())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 142 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 143 | ASSERT_EQ(frog->As<Amphibian>(), static_cast<Amphibian*>(frog.get())); |
| 144 | ASSERT_EQ(bear->As<Amphibian>(), nullptr); |
| 145 | ASSERT_EQ(gecko->As<Amphibian>(), nullptr); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 146 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 147 | ASSERT_EQ(frog->As<Mammal>(), nullptr); |
| 148 | ASSERT_EQ(bear->As<Mammal>(), static_cast<Mammal*>(bear.get())); |
| 149 | ASSERT_EQ(gecko->As<Mammal>(), nullptr); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 150 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 151 | ASSERT_EQ(frog->As<Reptile>(), nullptr); |
| 152 | ASSERT_EQ(bear->As<Reptile>(), nullptr); |
| 153 | ASSERT_EQ(gecko->As<Reptile>(), static_cast<Reptile*>(gecko.get())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 154 | } |
| 155 | |
| 156 | TEST(CastableBase, As_kDontErrorOnImpossibleCast) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 157 | // Unlike TEST(CastableBase, As), we're dynamically casting [A -> B] without |
| 158 | // going via CastableBase. |
| 159 | auto frog = std::make_unique<Frog>(); |
| 160 | auto bear = std::make_unique<Bear>(); |
| 161 | auto gecko = std::make_unique<Gecko>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 162 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 163 | ASSERT_EQ((frog->As<Animal, kDontErrorOnImpossibleCast>()), static_cast<Animal*>(frog.get())); |
| 164 | ASSERT_EQ((bear->As<Animal, kDontErrorOnImpossibleCast>()), static_cast<Animal*>(bear.get())); |
| 165 | ASSERT_EQ((gecko->As<Animal, kDontErrorOnImpossibleCast>()), static_cast<Animal*>(gecko.get())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 166 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 167 | ASSERT_EQ((frog->As<Amphibian, kDontErrorOnImpossibleCast>()), |
| 168 | static_cast<Amphibian*>(frog.get())); |
| 169 | ASSERT_EQ((bear->As<Amphibian, kDontErrorOnImpossibleCast>()), nullptr); |
| 170 | ASSERT_EQ((gecko->As<Amphibian, kDontErrorOnImpossibleCast>()), nullptr); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 171 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 172 | ASSERT_EQ((frog->As<Mammal, kDontErrorOnImpossibleCast>()), nullptr); |
| 173 | ASSERT_EQ((bear->As<Mammal, kDontErrorOnImpossibleCast>()), static_cast<Mammal*>(bear.get())); |
| 174 | ASSERT_EQ((gecko->As<Mammal, kDontErrorOnImpossibleCast>()), nullptr); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 175 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 176 | ASSERT_EQ((frog->As<Reptile, kDontErrorOnImpossibleCast>()), nullptr); |
| 177 | ASSERT_EQ((bear->As<Reptile, kDontErrorOnImpossibleCast>()), nullptr); |
| 178 | ASSERT_EQ((gecko->As<Reptile, kDontErrorOnImpossibleCast>()), |
| 179 | static_cast<Reptile*>(gecko.get())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 180 | } |
| 181 | |
| 182 | TEST(Castable, Is) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 183 | std::unique_ptr<Animal> frog = std::make_unique<Frog>(); |
| 184 | std::unique_ptr<Animal> bear = std::make_unique<Bear>(); |
| 185 | std::unique_ptr<Animal> gecko = std::make_unique<Gecko>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 186 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 187 | ASSERT_TRUE(frog->Is<Animal>()); |
| 188 | ASSERT_TRUE(bear->Is<Animal>()); |
| 189 | ASSERT_TRUE(gecko->Is<Animal>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 190 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 191 | ASSERT_TRUE(frog->Is<Amphibian>()); |
| 192 | ASSERT_FALSE(bear->Is<Amphibian>()); |
| 193 | ASSERT_FALSE(gecko->Is<Amphibian>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 194 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 195 | ASSERT_FALSE(frog->Is<Mammal>()); |
| 196 | ASSERT_TRUE(bear->Is<Mammal>()); |
| 197 | ASSERT_FALSE(gecko->Is<Mammal>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 198 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 199 | ASSERT_FALSE(frog->Is<Reptile>()); |
| 200 | ASSERT_FALSE(bear->Is<Reptile>()); |
| 201 | ASSERT_TRUE(gecko->Is<Reptile>()); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 202 | } |
| 203 | |
| 204 | TEST(Castable, IsWithPredicate) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 205 | std::unique_ptr<Animal> frog = std::make_unique<Frog>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 206 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 207 | frog->Is([&frog](const Animal* a) { |
| 208 | EXPECT_EQ(a, frog.get()); |
| 209 | return true; |
| 210 | }); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 211 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 212 | ASSERT_TRUE((frog->Is([](const Animal*) { return true; }))); |
| 213 | ASSERT_FALSE((frog->Is([](const Animal*) { return false; }))); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 214 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 215 | // Predicate not called if cast is invalid |
| 216 | auto expect_not_called = [] { FAIL() << "Should not be called"; }; |
| 217 | ASSERT_FALSE((frog->Is([&](const Bear*) { |
| 218 | expect_not_called(); |
| 219 | return true; |
| 220 | }))); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 221 | } |
| 222 | |
| 223 | TEST(Castable, As) { |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 224 | std::unique_ptr<Animal> frog = std::make_unique<Frog>(); |
| 225 | std::unique_ptr<Animal> bear = std::make_unique<Bear>(); |
| 226 | std::unique_ptr<Animal> gecko = std::make_unique<Gecko>(); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 227 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 228 | ASSERT_EQ(frog->As<Animal>(), static_cast<Animal*>(frog.get())); |
| 229 | ASSERT_EQ(bear->As<Animal>(), static_cast<Animal*>(bear.get())); |
| 230 | ASSERT_EQ(gecko->As<Animal>(), static_cast<Animal*>(gecko.get())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 231 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 232 | ASSERT_EQ(frog->As<Amphibian>(), static_cast<Amphibian*>(frog.get())); |
| 233 | ASSERT_EQ(bear->As<Amphibian>(), nullptr); |
| 234 | ASSERT_EQ(gecko->As<Amphibian>(), nullptr); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 235 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 236 | ASSERT_EQ(frog->As<Mammal>(), nullptr); |
| 237 | ASSERT_EQ(bear->As<Mammal>(), static_cast<Mammal*>(bear.get())); |
| 238 | ASSERT_EQ(gecko->As<Mammal>(), nullptr); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 239 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 240 | ASSERT_EQ(frog->As<Reptile>(), nullptr); |
| 241 | ASSERT_EQ(bear->As<Reptile>(), nullptr); |
| 242 | ASSERT_EQ(gecko->As<Reptile>(), static_cast<Reptile*>(gecko.get())); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 243 | } |
| 244 | |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 245 | // IsCastable static tests |
| 246 | static_assert(IsCastable<CastableBase>); |
| 247 | static_assert(IsCastable<Animal>); |
| 248 | static_assert(IsCastable<Ignore, Frog, Bear>); |
| 249 | static_assert(IsCastable<Mammal, Ignore, Amphibian, Gecko>); |
| 250 | static_assert(!IsCastable<Mammal, int, Amphibian, Ignore, Gecko>); |
| 251 | static_assert(!IsCastable<bool>); |
| 252 | static_assert(!IsCastable<int, float>); |
| 253 | static_assert(!IsCastable<Ignore>); |
| 254 | |
| 255 | // CastableCommonBase static tests |
| 256 | static_assert(std::is_same_v<Animal, CastableCommonBase<Animal>>); |
| 257 | static_assert(std::is_same_v<Amphibian, CastableCommonBase<Amphibian>>); |
| 258 | static_assert(std::is_same_v<Mammal, CastableCommonBase<Mammal>>); |
| 259 | static_assert(std::is_same_v<Reptile, CastableCommonBase<Reptile>>); |
| 260 | static_assert(std::is_same_v<Frog, CastableCommonBase<Frog>>); |
| 261 | static_assert(std::is_same_v<Bear, CastableCommonBase<Bear>>); |
| 262 | static_assert(std::is_same_v<Lizard, CastableCommonBase<Lizard>>); |
| 263 | static_assert(std::is_same_v<Gecko, CastableCommonBase<Gecko>>); |
| 264 | static_assert(std::is_same_v<Iguana, CastableCommonBase<Iguana>>); |
| 265 | |
| 266 | static_assert(std::is_same_v<Animal, CastableCommonBase<Animal, Animal>>); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 267 | static_assert(std::is_same_v<Amphibian, CastableCommonBase<Amphibian, Amphibian>>); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 268 | static_assert(std::is_same_v<Mammal, CastableCommonBase<Mammal, Mammal>>); |
| 269 | static_assert(std::is_same_v<Reptile, CastableCommonBase<Reptile, Reptile>>); |
| 270 | static_assert(std::is_same_v<Frog, CastableCommonBase<Frog, Frog>>); |
| 271 | static_assert(std::is_same_v<Bear, CastableCommonBase<Bear, Bear>>); |
| 272 | static_assert(std::is_same_v<Lizard, CastableCommonBase<Lizard, Lizard>>); |
| 273 | static_assert(std::is_same_v<Gecko, CastableCommonBase<Gecko, Gecko>>); |
| 274 | static_assert(std::is_same_v<Iguana, CastableCommonBase<Iguana, Iguana>>); |
| 275 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 276 | static_assert(std::is_same_v<CastableBase, CastableCommonBase<CastableBase, Animal>>); |
| 277 | static_assert(std::is_same_v<CastableBase, CastableCommonBase<Animal, CastableBase>>); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 278 | static_assert(std::is_same_v<Amphibian, CastableCommonBase<Amphibian, Frog>>); |
| 279 | static_assert(std::is_same_v<Amphibian, CastableCommonBase<Frog, Amphibian>>); |
| 280 | static_assert(std::is_same_v<Animal, CastableCommonBase<Reptile, Frog>>); |
| 281 | static_assert(std::is_same_v<Animal, CastableCommonBase<Frog, Reptile>>); |
| 282 | static_assert(std::is_same_v<Animal, CastableCommonBase<Bear, Frog>>); |
| 283 | static_assert(std::is_same_v<Animal, CastableCommonBase<Frog, Bear>>); |
| 284 | static_assert(std::is_same_v<Lizard, CastableCommonBase<Gecko, Iguana>>); |
| 285 | |
| 286 | static_assert(std::is_same_v<Animal, CastableCommonBase<Bear, Frog, Iguana>>); |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 287 | static_assert(std::is_same_v<Lizard, CastableCommonBase<Lizard, Gecko, Iguana>>); |
| 288 | static_assert(std::is_same_v<Lizard, CastableCommonBase<Gecko, Iguana, Lizard>>); |
| 289 | static_assert(std::is_same_v<Lizard, CastableCommonBase<Gecko, Lizard, Iguana>>); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 290 | static_assert(std::is_same_v<Animal, CastableCommonBase<Frog, Gecko, Iguana>>); |
| 291 | static_assert(std::is_same_v<Animal, CastableCommonBase<Gecko, Iguana, Frog>>); |
| 292 | static_assert(std::is_same_v<Animal, CastableCommonBase<Gecko, Frog, Iguana>>); |
| 293 | |
dan sinclair | 41e4d9a | 2022-05-01 14:40:55 +0000 | [diff] [blame] | 294 | static_assert(std::is_same_v<CastableBase, CastableCommonBase<Bear, Frog, Iguana, CastableBase>>); |
Ryan Harrison | dbc13af | 2022-02-21 15:19:07 +0000 | [diff] [blame] | 295 | |
| 296 | } // namespace |
| 297 | |
| 298 | TINT_INSTANTIATE_TYPEINFO(Animal); |
| 299 | TINT_INSTANTIATE_TYPEINFO(Amphibian); |
| 300 | TINT_INSTANTIATE_TYPEINFO(Mammal); |
| 301 | TINT_INSTANTIATE_TYPEINFO(Reptile); |
| 302 | TINT_INSTANTIATE_TYPEINFO(Frog); |
| 303 | TINT_INSTANTIATE_TYPEINFO(Bear); |
| 304 | TINT_INSTANTIATE_TYPEINFO(Lizard); |
| 305 | TINT_INSTANTIATE_TYPEINFO(Gecko); |
| 306 | |
dan sinclair | bae54e7 | 2023-07-28 15:01:54 +0000 | [diff] [blame] | 307 | } // namespace tint |