meta.cpp 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635
  1. #include <type_traits>
  2. #include <gtest/gtest.h>
  3. #include <entt/core/hashed_string.hpp>
  4. #include <entt/core/utility.hpp>
  5. #include <entt/meta/factory.hpp>
  6. #include <entt/meta/meta.hpp>
  7. enum class properties {
  8. prop_int,
  9. prop_bool
  10. };
  11. struct empty_type {
  12. virtual ~empty_type() = default;
  13. static void destroy(empty_type *) {
  14. ++counter;
  15. }
  16. inline static int counter = 0;
  17. };
  18. struct fat_type: empty_type {
  19. fat_type() = default;
  20. fat_type(int *value)
  21. : foo{value}, bar{value}
  22. {}
  23. int *foo{nullptr};
  24. int *bar{nullptr};
  25. bool operator==(const fat_type &other) const {
  26. return foo == other.foo && bar == other.bar;
  27. }
  28. };
  29. union union_type {
  30. int i;
  31. double d;
  32. };
  33. bool operator!=(const fat_type &lhs, const fat_type &rhs) {
  34. return !(lhs == rhs);
  35. }
  36. struct base_type {
  37. virtual ~base_type() = default;
  38. };
  39. struct derived_type: base_type {
  40. derived_type() = default;
  41. derived_type(const base_type &, int value, char character)
  42. : i{value}, c{character}
  43. {}
  44. const int i{};
  45. const char c{};
  46. };
  47. derived_type derived_factory(const base_type &, int value) {
  48. return {derived_type{}, value, 'c'};
  49. }
  50. struct data_type {
  51. int i{0};
  52. const int j{1};
  53. inline static int h{2};
  54. inline static const int k{3};
  55. empty_type empty{};
  56. };
  57. struct array_type {
  58. static inline int global[3];
  59. int local[3];
  60. };
  61. struct func_type {
  62. int f(const base_type &, int a, int b) { return f(a, b); }
  63. int f(int a, int b) { value = a; return b*b; }
  64. int f(int v) const { return v*v; }
  65. void g(int v) { value = v*v; }
  66. static int h(int v) { return v; }
  67. static void k(int v) { value = v; }
  68. inline static int value = 0;
  69. };
  70. struct setter_getter_type {
  71. int value{};
  72. int setter(int val) { return value = val; }
  73. int getter() { return value; }
  74. int setter_with_ref(const int &val) { return value = val; }
  75. const int & getter_with_ref() { return value; }
  76. static int static_setter(setter_getter_type *type, int value) { return type->value = value; }
  77. static int static_getter(const setter_getter_type *type) { return type->value; }
  78. };
  79. struct not_comparable_type {
  80. bool operator==(const not_comparable_type &) const = delete;
  81. };
  82. bool operator!=(const not_comparable_type &, const not_comparable_type &) = delete;
  83. struct an_abstract_type {
  84. virtual ~an_abstract_type() = default;
  85. void f(int v) { i = v; }
  86. virtual void g(int) = 0;
  87. int i{};
  88. };
  89. struct another_abstract_type {
  90. virtual ~another_abstract_type() = default;
  91. virtual void h(char) = 0;
  92. char j{};
  93. };
  94. struct concrete_type: an_abstract_type, another_abstract_type {
  95. void f(int v) { i = v*v; } // hide, it's ok :-)
  96. void g(int v) override { i = -v; }
  97. void h(char c) override { j = c; }
  98. };
  99. struct Meta: public ::testing::Test {
  100. static void SetUpTestCase() {
  101. entt::reflect<double>().conv<int>();
  102. entt::reflect<char>("char"_hs, std::make_pair(properties::prop_int, 42));
  103. entt::reflect<properties>()
  104. .data<properties::prop_bool>("prop_bool"_hs)
  105. .data<properties::prop_int>("prop_int"_hs);
  106. entt::reflect<unsigned int>().data<0u>("min"_hs).data<100u>("max"_hs);
  107. entt::reflect<base_type>("base"_hs);
  108. entt::reflect<derived_type>("derived"_hs, std::make_pair(properties::prop_int, 99))
  109. .base<base_type>()
  110. .ctor<const base_type &, int, char>(std::make_pair(properties::prop_bool, false))
  111. .ctor<&derived_factory>(std::make_pair(properties::prop_int, 42));
  112. entt::reflect<empty_type>("empty"_hs)
  113. .dtor<&empty_type::destroy>();
  114. entt::reflect<fat_type>("fat"_hs)
  115. .base<empty_type>()
  116. .dtor<&fat_type::destroy>();
  117. entt::reflect<data_type>("data"_hs)
  118. .data<&data_type::i>("i"_hs, std::make_pair(properties::prop_int, 0))
  119. .data<&data_type::j>("j"_hs, std::make_pair(properties::prop_int, 1))
  120. .data<&data_type::h>("h"_hs, std::make_pair(properties::prop_int, 2))
  121. .data<&data_type::k>("k"_hs, std::make_pair(properties::prop_int, 3))
  122. .data<&data_type::empty>("empty"_hs);
  123. entt::reflect<array_type>("array"_hs)
  124. .data<&array_type::global>("global"_hs)
  125. .data<&array_type::local>("local"_hs);
  126. entt::reflect<func_type>("func"_hs)
  127. .func<entt::overload<int(const base_type &, int, int)>(&func_type::f)>("f3"_hs)
  128. .func<entt::overload<int(int, int)>(&func_type::f)>("f2"_hs, std::make_pair(properties::prop_bool, false))
  129. .func<entt::overload<int(int) const>(&func_type::f)>("f1"_hs, std::make_pair(properties::prop_bool, false))
  130. .func<&func_type::g>("g"_hs, std::make_pair(properties::prop_bool, false))
  131. .func<&func_type::h>("h"_hs, std::make_pair(properties::prop_bool, false))
  132. .func<&func_type::k>("k"_hs, std::make_pair(properties::prop_bool, false));
  133. entt::reflect<setter_getter_type>("setter_getter"_hs)
  134. .data<&setter_getter_type::static_setter, &setter_getter_type::static_getter>("x"_hs)
  135. .data<&setter_getter_type::setter, &setter_getter_type::getter>("y"_hs)
  136. .data<&setter_getter_type::static_setter, &setter_getter_type::getter>("z"_hs)
  137. .data<&setter_getter_type::setter_with_ref, &setter_getter_type::getter_with_ref>("w"_hs);
  138. entt::reflect<an_abstract_type>("an_abstract_type"_hs, std::make_pair(properties::prop_bool, false))
  139. .data<&an_abstract_type::i>("i"_hs)
  140. .func<&an_abstract_type::f>("f"_hs)
  141. .func<&an_abstract_type::g>("g"_hs);
  142. entt::reflect<another_abstract_type>("another_abstract_type"_hs, std::make_pair(properties::prop_int, 42))
  143. .data<&another_abstract_type::j>("j"_hs)
  144. .func<&another_abstract_type::h>("h"_hs);
  145. entt::reflect<concrete_type>("concrete"_hs)
  146. .base<an_abstract_type>()
  147. .base<another_abstract_type>()
  148. .func<&concrete_type::f>("f"_hs);
  149. }
  150. static void SetUpAfterUnregistration() {
  151. entt::reflect<double>().conv<float>();
  152. entt::reflect<derived_type>("my_type"_hs, std::make_pair(properties::prop_bool, false))
  153. .ctor<>();
  154. entt::reflect<another_abstract_type>("your_type"_hs)
  155. .data<&another_abstract_type::j>("a_data_member"_hs)
  156. .func<&another_abstract_type::h>("a_member_function"_hs);
  157. }
  158. void SetUp() override {
  159. empty_type::counter = 0;
  160. func_type::value = 0;
  161. }
  162. };
  163. TEST_F(Meta, Resolve) {
  164. ASSERT_EQ(entt::resolve<derived_type>(), entt::resolve("derived"_hs));
  165. bool found = false;
  166. entt::resolve([&found](auto type) {
  167. found = found || type == entt::resolve<derived_type>();
  168. });
  169. ASSERT_TRUE(found);
  170. }
  171. TEST_F(Meta, MetaAnySBO) {
  172. entt::meta_any any{'c'};
  173. ASSERT_TRUE(any);
  174. ASSERT_FALSE(any.can_cast<void>());
  175. ASSERT_TRUE(any.can_cast<char>());
  176. ASSERT_EQ(any.cast<char>(), 'c');
  177. ASSERT_EQ(std::as_const(any).cast<char>(), 'c');
  178. ASSERT_NE(any.data(), nullptr);
  179. ASSERT_NE(std::as_const(any).data(), nullptr);
  180. ASSERT_EQ(any, entt::meta_any{'c'});
  181. ASSERT_NE(any, entt::meta_any{'h'});
  182. }
  183. TEST_F(Meta, MetaAnyNoSBO) {
  184. int value = 42;
  185. fat_type instance{&value};
  186. entt::meta_any any{instance};
  187. ASSERT_TRUE(any);
  188. ASSERT_FALSE(any.can_cast<void>());
  189. ASSERT_TRUE(any.can_cast<fat_type>());
  190. ASSERT_EQ(any.cast<fat_type>(), instance);
  191. ASSERT_EQ(std::as_const(any).cast<fat_type>(), instance);
  192. ASSERT_NE(any.data(), nullptr);
  193. ASSERT_NE(std::as_const(any).data(), nullptr);
  194. ASSERT_EQ(any, entt::meta_any{instance});
  195. ASSERT_NE(any, fat_type{});
  196. }
  197. TEST_F(Meta, MetaAnyEmpty) {
  198. entt::meta_any any{};
  199. ASSERT_FALSE(any);
  200. ASSERT_FALSE(any.type());
  201. ASSERT_FALSE(any.can_cast<void>());
  202. ASSERT_FALSE(any.can_cast<empty_type>());
  203. ASSERT_EQ(any.data(), nullptr);
  204. ASSERT_EQ(std::as_const(any).data(), nullptr);
  205. ASSERT_EQ(any, entt::meta_any{});
  206. ASSERT_NE(any, entt::meta_any{'c'});
  207. }
  208. TEST_F(Meta, MetaAnySBOCopyConstruction) {
  209. entt::meta_any any{42};
  210. entt::meta_any other{any};
  211. ASSERT_TRUE(any);
  212. ASSERT_TRUE(other);
  213. ASSERT_FALSE(other.can_cast<void>());
  214. ASSERT_TRUE(other.can_cast<int>());
  215. ASSERT_EQ(other.cast<int>(), 42);
  216. ASSERT_EQ(std::as_const(other).cast<int>(), 42);
  217. ASSERT_EQ(other, entt::meta_any{42});
  218. ASSERT_NE(other, entt::meta_any{0});
  219. }
  220. TEST_F(Meta, MetaAnySBOCopyAssignment) {
  221. entt::meta_any any{42};
  222. entt::meta_any other{3};
  223. other = any;
  224. ASSERT_TRUE(any);
  225. ASSERT_TRUE(other);
  226. ASSERT_FALSE(other.can_cast<void>());
  227. ASSERT_TRUE(other.can_cast<int>());
  228. ASSERT_EQ(other.cast<int>(), 42);
  229. ASSERT_EQ(std::as_const(other).cast<int>(), 42);
  230. ASSERT_EQ(other, entt::meta_any{42});
  231. ASSERT_NE(other, entt::meta_any{0});
  232. }
  233. TEST_F(Meta, MetaAnySBOMoveConstruction) {
  234. entt::meta_any any{42};
  235. entt::meta_any other{std::move(any)};
  236. ASSERT_FALSE(any);
  237. ASSERT_TRUE(other);
  238. ASSERT_FALSE(other.can_cast<void>());
  239. ASSERT_TRUE(other.can_cast<int>());
  240. ASSERT_EQ(other.cast<int>(), 42);
  241. ASSERT_EQ(std::as_const(other).cast<int>(), 42);
  242. ASSERT_EQ(other, entt::meta_any{42});
  243. ASSERT_NE(other, entt::meta_any{0});
  244. }
  245. TEST_F(Meta, MetaAnySBOMoveAssignment) {
  246. entt::meta_any any{42};
  247. entt::meta_any other{3};
  248. other = std::move(any);
  249. ASSERT_FALSE(any);
  250. ASSERT_TRUE(other);
  251. ASSERT_FALSE(other.can_cast<void>());
  252. ASSERT_TRUE(other.can_cast<int>());
  253. ASSERT_EQ(other.cast<int>(), 42);
  254. ASSERT_EQ(std::as_const(other).cast<int>(), 42);
  255. ASSERT_EQ(other, entt::meta_any{42});
  256. ASSERT_NE(other, entt::meta_any{0});
  257. }
  258. TEST_F(Meta, MetaAnyNoSBOCopyConstruction) {
  259. int value = 42;
  260. fat_type instance{&value};
  261. entt::meta_any any{instance};
  262. entt::meta_any other{any};
  263. ASSERT_TRUE(any);
  264. ASSERT_TRUE(other);
  265. ASSERT_FALSE(other.can_cast<void>());
  266. ASSERT_TRUE(other.can_cast<fat_type>());
  267. ASSERT_EQ(other.cast<fat_type>(), instance);
  268. ASSERT_EQ(std::as_const(other).cast<fat_type>(), instance);
  269. ASSERT_EQ(other, entt::meta_any{instance});
  270. ASSERT_NE(other, fat_type{});
  271. }
  272. TEST_F(Meta, MetaAnyNoSBOCopyAssignment) {
  273. int value = 42;
  274. fat_type instance{&value};
  275. entt::meta_any any{instance};
  276. entt::meta_any other{3};
  277. other = any;
  278. ASSERT_TRUE(any);
  279. ASSERT_TRUE(other);
  280. ASSERT_FALSE(other.can_cast<void>());
  281. ASSERT_TRUE(other.can_cast<fat_type>());
  282. ASSERT_EQ(other.cast<fat_type>(), instance);
  283. ASSERT_EQ(std::as_const(other).cast<fat_type>(), instance);
  284. ASSERT_EQ(other, entt::meta_any{instance});
  285. ASSERT_NE(other, fat_type{});
  286. }
  287. TEST_F(Meta, MetaAnyNoSBOMoveConstruction) {
  288. int value = 42;
  289. fat_type instance{&value};
  290. entt::meta_any any{instance};
  291. entt::meta_any other{std::move(any)};
  292. ASSERT_FALSE(any);
  293. ASSERT_TRUE(other);
  294. ASSERT_FALSE(other.can_cast<void>());
  295. ASSERT_TRUE(other.can_cast<fat_type>());
  296. ASSERT_EQ(other.cast<fat_type>(), instance);
  297. ASSERT_EQ(std::as_const(other).cast<fat_type>(), instance);
  298. ASSERT_EQ(other, entt::meta_any{instance});
  299. ASSERT_NE(other, fat_type{});
  300. }
  301. TEST_F(Meta, MetaAnyNoSBOMoveAssignment) {
  302. int value = 42;
  303. fat_type instance{&value};
  304. entt::meta_any any{instance};
  305. entt::meta_any other{3};
  306. other = std::move(any);
  307. ASSERT_FALSE(any);
  308. ASSERT_TRUE(other);
  309. ASSERT_FALSE(other.can_cast<void>());
  310. ASSERT_TRUE(other.can_cast<fat_type>());
  311. ASSERT_EQ(other.cast<fat_type>(), instance);
  312. ASSERT_EQ(std::as_const(other).cast<fat_type>(), instance);
  313. ASSERT_EQ(other, entt::meta_any{instance});
  314. ASSERT_NE(other, fat_type{});
  315. }
  316. TEST_F(Meta, MetaAnySBODestruction) {
  317. ASSERT_EQ(empty_type::counter, 0);
  318. { entt::meta_any any{empty_type{}}; }
  319. ASSERT_EQ(empty_type::counter, 1);
  320. }
  321. TEST_F(Meta, MetaAnyNoSBODestruction) {
  322. ASSERT_EQ(fat_type::counter, 0);
  323. { entt::meta_any any{fat_type{}}; }
  324. ASSERT_EQ(fat_type::counter, 1);
  325. }
  326. TEST_F(Meta, MetaAnySBOSwap) {
  327. entt::meta_any lhs{'c'};
  328. entt::meta_any rhs{42};
  329. std::swap(lhs, rhs);
  330. ASSERT_TRUE(lhs.can_cast<int>());
  331. ASSERT_EQ(lhs.cast<int>(), 42);
  332. ASSERT_TRUE(rhs.can_cast<char>());
  333. ASSERT_EQ(rhs.cast<char>(), 'c');
  334. }
  335. TEST_F(Meta, MetaAnyNoSBOSwap) {
  336. int i, j;
  337. entt::meta_any lhs{fat_type{&i}};
  338. entt::meta_any rhs{fat_type{&j}};
  339. std::swap(lhs, rhs);
  340. ASSERT_EQ(lhs.cast<fat_type>().foo, &j);
  341. ASSERT_EQ(rhs.cast<fat_type>().bar, &i);
  342. }
  343. TEST_F(Meta, MetaAnySBOWithNoSBOSwap) {
  344. int value = 42;
  345. entt::meta_any lhs{fat_type{&value}};
  346. entt::meta_any rhs{'c'};
  347. std::swap(lhs, rhs);
  348. ASSERT_TRUE(lhs.can_cast<char>());
  349. ASSERT_EQ(lhs.cast<char>(), 'c');
  350. ASSERT_TRUE(rhs.can_cast<fat_type>());
  351. ASSERT_EQ(rhs.cast<fat_type>().foo, &value);
  352. ASSERT_EQ(rhs.cast<fat_type>().bar, &value);
  353. }
  354. TEST_F(Meta, MetaAnySBOWithEmptySwap) {
  355. entt::meta_any lhs{'c'};
  356. entt::meta_any rhs{};
  357. std::swap(lhs, rhs);
  358. ASSERT_FALSE(lhs);
  359. ASSERT_TRUE(rhs.can_cast<char>());
  360. ASSERT_EQ(rhs.cast<char>(), 'c');
  361. std::swap(lhs, rhs);
  362. ASSERT_FALSE(rhs);
  363. ASSERT_TRUE(lhs.can_cast<char>());
  364. ASSERT_EQ(lhs.cast<char>(), 'c');
  365. }
  366. TEST_F(Meta, MetaAnyNoSBOWithEmptySwap) {
  367. int i;
  368. entt::meta_any lhs{fat_type{&i}};
  369. entt::meta_any rhs{};
  370. std::swap(lhs, rhs);
  371. ASSERT_EQ(rhs.cast<fat_type>().bar, &i);
  372. std::swap(lhs, rhs);
  373. ASSERT_EQ(lhs.cast<fat_type>().bar, &i);
  374. }
  375. TEST_F(Meta, MetaAnyComparable) {
  376. entt::meta_any any{'c'};
  377. ASSERT_EQ(any, any);
  378. ASSERT_EQ(any, entt::meta_any{'c'});
  379. ASSERT_NE(any, entt::meta_any{'a'});
  380. ASSERT_NE(any, entt::meta_any{});
  381. ASSERT_TRUE(any == any);
  382. ASSERT_TRUE(any == entt::meta_any{'c'});
  383. ASSERT_FALSE(any == entt::meta_any{'a'});
  384. ASSERT_TRUE(any != entt::meta_any{'a'});
  385. ASSERT_TRUE(any != entt::meta_any{});
  386. }
  387. TEST_F(Meta, MetaAnyNotComparable) {
  388. entt::meta_any any{not_comparable_type{}};
  389. ASSERT_EQ(any, any);
  390. ASSERT_NE(any, entt::meta_any{not_comparable_type{}});
  391. ASSERT_NE(any, entt::meta_any{});
  392. ASSERT_TRUE(any == any);
  393. ASSERT_FALSE(any == entt::meta_any{not_comparable_type{}});
  394. ASSERT_TRUE(any != entt::meta_any{});
  395. }
  396. TEST_F(Meta, MetaAnyCast) {
  397. entt::meta_any any{derived_type{}};
  398. entt::meta_handle handle{any};
  399. ASSERT_TRUE(any);
  400. ASSERT_EQ(any.type(), entt::resolve<derived_type>());
  401. ASSERT_FALSE(any.can_cast<void>());
  402. ASSERT_TRUE(any.can_cast<base_type>());
  403. ASSERT_TRUE(any.can_cast<derived_type>());
  404. ASSERT_EQ(&any.cast<base_type>(), handle.try_cast<base_type>());
  405. ASSERT_EQ(&any.cast<derived_type>(), handle.try_cast<derived_type>());
  406. ASSERT_EQ(&std::as_const(any).cast<base_type>(), handle.try_cast<base_type>());
  407. ASSERT_EQ(&std::as_const(any).cast<derived_type>(), handle.try_cast<derived_type>());
  408. }
  409. TEST_F(Meta, MetaAnyConvert) {
  410. entt::meta_any any{42.};
  411. ASSERT_TRUE(any);
  412. ASSERT_EQ(any.type(), entt::resolve<double>());
  413. ASSERT_FALSE(any.can_convert<char>());
  414. ASSERT_TRUE(any.can_convert<double>());
  415. ASSERT_TRUE(any.can_convert<int>());
  416. ASSERT_TRUE(any.convert<double>());
  417. ASSERT_FALSE(any.convert<char>());
  418. ASSERT_EQ(any.type(), entt::resolve<double>());
  419. ASSERT_EQ(any.cast<double>(), 42.);
  420. ASSERT_TRUE(any.convert<int>());
  421. ASSERT_EQ(any.type(), entt::resolve<int>());
  422. ASSERT_EQ(any.cast<int>(), 42);
  423. }
  424. TEST_F(Meta, MetaAnyConstConvert) {
  425. const entt::meta_any any{42.};
  426. ASSERT_TRUE(any);
  427. ASSERT_EQ(any.type(), entt::resolve<double>());
  428. ASSERT_FALSE(any.can_convert<char>());
  429. ASSERT_TRUE(any.can_convert<double>());
  430. ASSERT_TRUE(any.can_convert<int>());
  431. ASSERT_TRUE(any.convert<double>());
  432. ASSERT_FALSE(any.convert<char>());
  433. ASSERT_EQ(any.type(), entt::resolve<double>());
  434. ASSERT_EQ(any.cast<double>(), 42.);
  435. auto other = any.convert<int>();
  436. ASSERT_EQ(any.type(), entt::resolve<double>());
  437. ASSERT_EQ(any.cast<double>(), 42.);
  438. ASSERT_EQ(other.type(), entt::resolve<int>());
  439. ASSERT_EQ(other.cast<int>(), 42);
  440. }
  441. TEST_F(Meta, MetaHandleFromObject) {
  442. empty_type empty{};
  443. entt::meta_handle handle{empty};
  444. ASSERT_TRUE(handle);
  445. ASSERT_EQ(handle.type(), entt::resolve<empty_type>());
  446. ASSERT_EQ(handle.try_cast<void>(), nullptr);
  447. ASSERT_EQ(handle.try_cast<empty_type>(), &empty);
  448. ASSERT_EQ(std::as_const(handle).try_cast<empty_type>(), &empty);
  449. ASSERT_EQ(handle.data(), &empty);
  450. ASSERT_EQ(std::as_const(handle).data(), &empty);
  451. }
  452. TEST_F(Meta, MetaHandleFromMetaAny) {
  453. entt::meta_any any{42};
  454. entt::meta_handle handle{any};
  455. ASSERT_TRUE(handle);
  456. ASSERT_EQ(handle.type(), entt::resolve<int>());
  457. ASSERT_EQ(handle.try_cast<void>(), nullptr);
  458. ASSERT_EQ(handle.try_cast<int>(), any.data());
  459. ASSERT_EQ(std::as_const(handle).try_cast<int>(), any.data());
  460. ASSERT_EQ(handle.data(), any.data());
  461. ASSERT_EQ(std::as_const(handle).data(), any.data());
  462. }
  463. TEST_F(Meta, MetaHandleEmpty) {
  464. entt::meta_handle handle{};
  465. ASSERT_FALSE(handle);
  466. ASSERT_FALSE(handle.type());
  467. ASSERT_EQ(handle.try_cast<void>(), nullptr);
  468. ASSERT_EQ(handle.try_cast<empty_type>(), nullptr);
  469. ASSERT_EQ(handle.data(), nullptr);
  470. ASSERT_EQ(std::as_const(handle).data(), nullptr);
  471. }
  472. TEST_F(Meta, MetaHandleTryCast) {
  473. derived_type derived{};
  474. base_type *base = &derived;
  475. entt::meta_handle handle{derived};
  476. ASSERT_TRUE(handle);
  477. ASSERT_EQ(handle.type(), entt::resolve<derived_type>());
  478. ASSERT_EQ(handle.try_cast<void>(), nullptr);
  479. ASSERT_EQ(handle.try_cast<base_type>(), base);
  480. ASSERT_EQ(handle.try_cast<derived_type>(), &derived);
  481. ASSERT_EQ(std::as_const(handle).try_cast<base_type>(), base);
  482. ASSERT_EQ(std::as_const(handle).try_cast<derived_type>(), &derived);
  483. ASSERT_EQ(handle.data(), &derived);
  484. ASSERT_EQ(std::as_const(handle).data(), &derived);
  485. }
  486. TEST_F(Meta, MetaProp) {
  487. auto prop = entt::resolve<char>().prop(properties::prop_int);
  488. ASSERT_TRUE(prop);
  489. ASSERT_NE(prop, entt::meta_prop{});
  490. ASSERT_EQ(prop.key(), properties::prop_int);
  491. ASSERT_EQ(prop.value(), 42);
  492. }
  493. TEST_F(Meta, MetaBase) {
  494. auto base = entt::resolve<derived_type>().base("base"_hs);
  495. derived_type derived{};
  496. ASSERT_TRUE(base);
  497. ASSERT_NE(base, entt::meta_base{});
  498. ASSERT_EQ(base.parent(), entt::resolve("derived"_hs));
  499. ASSERT_EQ(base.type(), entt::resolve<base_type>());
  500. ASSERT_EQ(base.cast(&derived), static_cast<base_type *>(&derived));
  501. }
  502. TEST_F(Meta, MetaConv) {
  503. auto conv = entt::resolve<double>().conv<int>();
  504. double value = 3.;
  505. ASSERT_TRUE(conv);
  506. ASSERT_NE(conv, entt::meta_conv{});
  507. ASSERT_EQ(conv.parent(), entt::resolve<double>());
  508. ASSERT_EQ(conv.type(), entt::resolve<int>());
  509. auto any = conv.convert(&value);
  510. ASSERT_TRUE(any);
  511. ASSERT_EQ(any.type(), entt::resolve<int>());
  512. ASSERT_EQ(any.cast<int>(), 3);
  513. }
  514. TEST_F(Meta, MetaCtor) {
  515. auto ctor = entt::resolve<derived_type>().ctor<const base_type &, int, char>();
  516. ASSERT_TRUE(ctor);
  517. ASSERT_NE(ctor, entt::meta_ctor{});
  518. ASSERT_EQ(ctor.parent(), entt::resolve("derived"_hs));
  519. ASSERT_EQ(ctor.size(), entt::meta_ctor::size_type{3});
  520. ASSERT_EQ(ctor.arg(entt::meta_ctor::size_type{0}), entt::resolve<base_type>());
  521. ASSERT_EQ(ctor.arg(entt::meta_ctor::size_type{1}), entt::resolve<int>());
  522. ASSERT_EQ(ctor.arg(entt::meta_ctor::size_type{2}), entt::resolve<char>());
  523. ASSERT_FALSE(ctor.arg(entt::meta_ctor::size_type{3}));
  524. auto any = ctor.invoke(base_type{}, 42, 'c');
  525. auto empty = ctor.invoke();
  526. ASSERT_FALSE(empty);
  527. ASSERT_TRUE(any);
  528. ASSERT_TRUE(any.can_cast<derived_type>());
  529. ASSERT_EQ(any.cast<derived_type>().i, 42);
  530. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  531. ctor.prop([](auto prop) {
  532. ASSERT_TRUE(prop);
  533. ASSERT_EQ(prop.key(), properties::prop_bool);
  534. ASSERT_FALSE(prop.value().template cast<bool>());
  535. });
  536. ASSERT_FALSE(ctor.prop(properties::prop_int));
  537. auto prop = ctor.prop(properties::prop_bool);
  538. ASSERT_TRUE(prop);
  539. ASSERT_EQ(prop.key(), properties::prop_bool);
  540. ASSERT_FALSE(prop.value().template cast<bool>());
  541. }
  542. TEST_F(Meta, MetaCtorFunc) {
  543. auto ctor = entt::resolve<derived_type>().ctor<const base_type &, int>();
  544. ASSERT_TRUE(ctor);
  545. ASSERT_EQ(ctor.parent(), entt::resolve("derived"_hs));
  546. ASSERT_EQ(ctor.size(), entt::meta_ctor::size_type{2});
  547. ASSERT_EQ(ctor.arg(entt::meta_ctor::size_type{0}), entt::resolve<base_type>());
  548. ASSERT_EQ(ctor.arg(entt::meta_ctor::size_type{1}), entt::resolve<int>());
  549. ASSERT_FALSE(ctor.arg(entt::meta_ctor::size_type{2}));
  550. auto any = ctor.invoke(derived_type{}, 42);
  551. auto empty = ctor.invoke(3, 'c');
  552. ASSERT_FALSE(empty);
  553. ASSERT_TRUE(any);
  554. ASSERT_TRUE(any.can_cast<derived_type>());
  555. ASSERT_EQ(any.cast<derived_type>().i, 42);
  556. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  557. ctor.prop([](auto prop) {
  558. ASSERT_TRUE(prop);
  559. ASSERT_EQ(prop.key(), properties::prop_int);
  560. ASSERT_EQ(prop.value(), 42);
  561. });
  562. ASSERT_FALSE(ctor.prop(properties::prop_bool));
  563. auto prop = ctor.prop(properties::prop_int);
  564. ASSERT_TRUE(prop);
  565. ASSERT_EQ(prop.key(), properties::prop_int);
  566. ASSERT_EQ(prop.value(), 42);
  567. }
  568. TEST_F(Meta, MetaCtorMetaAnyArgs) {
  569. auto ctor = entt::resolve<derived_type>().ctor<const base_type &, int, char>();
  570. auto any = ctor.invoke(base_type{}, entt::meta_any{42}, entt::meta_any{'c'});
  571. ASSERT_TRUE(any);
  572. ASSERT_TRUE(any.can_cast<derived_type>());
  573. ASSERT_EQ(any.cast<derived_type>().i, 42);
  574. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  575. }
  576. TEST_F(Meta, MetaCtorInvalidArgs) {
  577. auto ctor = entt::resolve<derived_type>().ctor<const base_type &, int, char>();
  578. ASSERT_FALSE(ctor.invoke(base_type{}, entt::meta_any{'c'}, entt::meta_any{42}));
  579. }
  580. TEST_F(Meta, MetaCtorCastAndConvert) {
  581. auto ctor = entt::resolve<derived_type>().ctor<const base_type &, int, char>();
  582. auto any = ctor.invoke(entt::meta_any{derived_type{}}, entt::meta_any{42.}, entt::meta_any{'c'});
  583. ASSERT_TRUE(any);
  584. ASSERT_TRUE(any.can_cast<derived_type>());
  585. ASSERT_EQ(any.cast<derived_type>().i, 42);
  586. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  587. }
  588. TEST_F(Meta, MetaCtorFuncMetaAnyArgs) {
  589. auto ctor = entt::resolve<derived_type>().ctor<const base_type &, int>();
  590. auto any = ctor.invoke(base_type{}, entt::meta_any{42});
  591. ASSERT_TRUE(any);
  592. ASSERT_TRUE(any.can_cast<derived_type>());
  593. ASSERT_EQ(any.cast<derived_type>().i, 42);
  594. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  595. }
  596. TEST_F(Meta, MetaCtorFuncInvalidArgs) {
  597. auto ctor = entt::resolve<derived_type>().ctor<const base_type &, int>();
  598. ASSERT_FALSE(ctor.invoke(base_type{}, entt::meta_any{'c'}));
  599. }
  600. TEST_F(Meta, MetaCtorFuncCastAndConvert) {
  601. auto ctor = entt::resolve<derived_type>().ctor<const base_type &, int>();
  602. auto any = ctor.invoke(entt::meta_any{derived_type{}}, entt::meta_any{42.});
  603. ASSERT_TRUE(any);
  604. ASSERT_TRUE(any.can_cast<derived_type>());
  605. ASSERT_EQ(any.cast<derived_type>().i, 42);
  606. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  607. }
  608. TEST_F(Meta, MetaDtor) {
  609. auto dtor = entt::resolve<empty_type>().dtor();
  610. empty_type empty{};
  611. ASSERT_TRUE(dtor);
  612. ASSERT_NE(dtor, entt::meta_dtor{});
  613. ASSERT_EQ(dtor.parent(), entt::resolve("empty"_hs));
  614. ASSERT_EQ(empty_type::counter, 0);
  615. ASSERT_TRUE(dtor.invoke(empty));
  616. ASSERT_EQ(empty_type::counter, 1);
  617. }
  618. TEST_F(Meta, MetaDtorMetaAnyArg) {
  619. auto dtor = entt::resolve<empty_type>().dtor();
  620. entt::meta_any any{empty_type{}};
  621. ASSERT_EQ(empty_type::counter, 0);
  622. ASSERT_TRUE(dtor.invoke(any));
  623. ASSERT_EQ(empty_type::counter, 1);
  624. }
  625. TEST_F(Meta, MetaDtorMetaAnyInvalidArg) {
  626. ASSERT_FALSE(entt::resolve<empty_type>().dtor().invoke(int{}));
  627. }
  628. TEST_F(Meta, MetaData) {
  629. auto data = entt::resolve<data_type>().data("i"_hs);
  630. data_type instance{};
  631. ASSERT_TRUE(data);
  632. ASSERT_NE(data, entt::meta_data{});
  633. ASSERT_EQ(data.parent(), entt::resolve("data"_hs));
  634. ASSERT_EQ(data.type(), entt::resolve<int>());
  635. ASSERT_EQ(data.identifier(), "i"_hs);
  636. ASSERT_FALSE(data.is_const());
  637. ASSERT_FALSE(data.is_static());
  638. ASSERT_EQ(data.get(instance).cast<int>(), 0);
  639. ASSERT_TRUE(data.set(instance, 42));
  640. ASSERT_EQ(data.get(instance).cast<int>(), 42);
  641. data.prop([](auto prop) {
  642. ASSERT_TRUE(prop);
  643. ASSERT_EQ(prop.key(), properties::prop_int);
  644. ASSERT_EQ(prop.value(), 0);
  645. });
  646. ASSERT_FALSE(data.prop(properties::prop_bool));
  647. auto prop = data.prop(properties::prop_int);
  648. ASSERT_TRUE(prop);
  649. ASSERT_EQ(prop.key(), properties::prop_int);
  650. ASSERT_EQ(prop.value(), 0);
  651. }
  652. TEST_F(Meta, MetaDataConst) {
  653. auto data = entt::resolve<data_type>().data("j"_hs);
  654. data_type instance{};
  655. ASSERT_TRUE(data);
  656. ASSERT_EQ(data.parent(), entt::resolve("data"_hs));
  657. ASSERT_EQ(data.type(), entt::resolve<int>());
  658. ASSERT_EQ(data.identifier(), "j"_hs);
  659. ASSERT_TRUE(data.is_const());
  660. ASSERT_FALSE(data.is_static());
  661. ASSERT_EQ(data.get(instance).cast<int>(), 1);
  662. ASSERT_FALSE(data.set(instance, 42));
  663. ASSERT_EQ(data.get(instance).cast<int>(), 1);
  664. data.prop([](auto prop) {
  665. ASSERT_TRUE(prop);
  666. ASSERT_EQ(prop.key(), properties::prop_int);
  667. ASSERT_EQ(prop.value(), 1);
  668. });
  669. ASSERT_FALSE(data.prop(properties::prop_bool));
  670. auto prop = data.prop(properties::prop_int);
  671. ASSERT_TRUE(prop);
  672. ASSERT_EQ(prop.key(), properties::prop_int);
  673. ASSERT_EQ(prop.value(), 1);
  674. }
  675. TEST_F(Meta, MetaDataStatic) {
  676. auto data = entt::resolve<data_type>().data("h"_hs);
  677. ASSERT_TRUE(data);
  678. ASSERT_EQ(data.parent(), entt::resolve("data"_hs));
  679. ASSERT_EQ(data.type(), entt::resolve<int>());
  680. ASSERT_EQ(data.identifier(), "h"_hs);
  681. ASSERT_FALSE(data.is_const());
  682. ASSERT_TRUE(data.is_static());
  683. ASSERT_EQ(data.get({}).cast<int>(), 2);
  684. ASSERT_TRUE(data.set({}, 42));
  685. ASSERT_EQ(data.get({}).cast<int>(), 42);
  686. data.prop([](auto prop) {
  687. ASSERT_TRUE(prop);
  688. ASSERT_EQ(prop.key(), properties::prop_int);
  689. ASSERT_EQ(prop.value(), 2);
  690. });
  691. ASSERT_FALSE(data.prop(properties::prop_bool));
  692. auto prop = data.prop(properties::prop_int);
  693. ASSERT_TRUE(prop);
  694. ASSERT_EQ(prop.key(), properties::prop_int);
  695. ASSERT_EQ(prop.value(), 2);
  696. }
  697. TEST_F(Meta, MetaDataConstStatic) {
  698. auto data = entt::resolve<data_type>().data("k"_hs);
  699. ASSERT_TRUE(data);
  700. ASSERT_EQ(data.parent(), entt::resolve("data"_hs));
  701. ASSERT_EQ(data.type(), entt::resolve<int>());
  702. ASSERT_EQ(data.identifier(), "k"_hs);
  703. ASSERT_TRUE(data.is_const());
  704. ASSERT_TRUE(data.is_static());
  705. ASSERT_EQ(data.get({}).cast<int>(), 3);
  706. ASSERT_FALSE(data.set({}, 42));
  707. ASSERT_EQ(data.get({}).cast<int>(), 3);
  708. data.prop([](auto prop) {
  709. ASSERT_TRUE(prop);
  710. ASSERT_EQ(prop.key(), properties::prop_int);
  711. ASSERT_EQ(prop.value(), 3);
  712. });
  713. ASSERT_FALSE(data.prop(properties::prop_bool));
  714. auto prop = data.prop(properties::prop_int);
  715. ASSERT_TRUE(prop);
  716. ASSERT_EQ(prop.key(), properties::prop_int);
  717. ASSERT_EQ(prop.value(), 3);
  718. }
  719. TEST_F(Meta, MetaDataGetMetaAnyArg) {
  720. auto data = entt::resolve<data_type>().data("i"_hs);
  721. entt::meta_any any{data_type{}};
  722. any.cast<data_type>().i = 99;
  723. const auto value = data.get(any);
  724. ASSERT_TRUE(value);
  725. ASSERT_TRUE(value.can_cast<int>());
  726. ASSERT_EQ(value.cast<int>(), 99);
  727. }
  728. TEST_F(Meta, MetaDataGetInvalidArg) {
  729. ASSERT_FALSE(entt::resolve<data_type>().data("i"_hs).get(0));
  730. }
  731. TEST_F(Meta, MetaDataSetMetaAnyArg) {
  732. auto data = entt::resolve<data_type>().data("i"_hs);
  733. entt::meta_any any{data_type{}};
  734. entt::meta_any value{42};
  735. ASSERT_EQ(any.cast<data_type>().i, 0);
  736. ASSERT_TRUE(data.set(any, value));
  737. ASSERT_EQ(any.cast<data_type>().i, 42);
  738. }
  739. TEST_F(Meta, MetaDataSetInvalidArg) {
  740. ASSERT_FALSE(entt::resolve<data_type>().data("i"_hs).set({}, 'c'));
  741. }
  742. TEST_F(Meta, MetaDataSetCast) {
  743. auto data = entt::resolve<data_type>().data("empty"_hs);
  744. data_type instance{};
  745. ASSERT_EQ(empty_type::counter, 0);
  746. ASSERT_TRUE(data.set(instance, fat_type{}));
  747. ASSERT_EQ(empty_type::counter, 1);
  748. }
  749. TEST_F(Meta, MetaDataSetConvert) {
  750. auto data = entt::resolve<data_type>().data("i"_hs);
  751. data_type instance{};
  752. ASSERT_EQ(instance.i, 0);
  753. ASSERT_TRUE(data.set(instance, 3.));
  754. ASSERT_EQ(instance.i, 3);
  755. }
  756. TEST_F(Meta, MetaDataSetterGetterAsFreeFunctions) {
  757. auto data = entt::resolve<setter_getter_type>().data("x"_hs);
  758. setter_getter_type instance{};
  759. ASSERT_TRUE(data);
  760. ASSERT_NE(data, entt::meta_data{});
  761. ASSERT_EQ(data.parent(), entt::resolve("setter_getter"_hs));
  762. ASSERT_EQ(data.type(), entt::resolve<int>());
  763. ASSERT_EQ(data.identifier(), "x"_hs);
  764. ASSERT_FALSE(data.is_const());
  765. ASSERT_FALSE(data.is_static());
  766. ASSERT_EQ(data.get(instance).cast<int>(), 0);
  767. ASSERT_TRUE(data.set(instance, 42));
  768. ASSERT_EQ(data.get(instance).cast<int>(), 42);
  769. }
  770. TEST_F(Meta, MetaDataSetterGetterAsMemberFunctions) {
  771. auto data = entt::resolve<setter_getter_type>().data("y"_hs);
  772. setter_getter_type instance{};
  773. ASSERT_TRUE(data);
  774. ASSERT_NE(data, entt::meta_data{});
  775. ASSERT_EQ(data.parent(), entt::resolve("setter_getter"_hs));
  776. ASSERT_EQ(data.type(), entt::resolve<int>());
  777. ASSERT_EQ(data.identifier(), "y"_hs);
  778. ASSERT_FALSE(data.is_const());
  779. ASSERT_FALSE(data.is_static());
  780. ASSERT_EQ(data.get(instance).cast<int>(), 0);
  781. ASSERT_TRUE(data.set(instance, 42));
  782. ASSERT_EQ(data.get(instance).cast<int>(), 42);
  783. }
  784. TEST_F(Meta, MetaDataSetterGetterWithRefAsMemberFunctions) {
  785. auto data = entt::resolve<setter_getter_type>().data("w"_hs);
  786. setter_getter_type instance{};
  787. ASSERT_TRUE(data);
  788. ASSERT_NE(data, entt::meta_data{});
  789. ASSERT_EQ(data.parent(), entt::resolve("setter_getter"_hs));
  790. ASSERT_EQ(data.type(), entt::resolve<int>());
  791. ASSERT_EQ(data.identifier(), "w"_hs);
  792. ASSERT_FALSE(data.is_const());
  793. ASSERT_FALSE(data.is_static());
  794. ASSERT_EQ(data.get(instance).cast<int>(), 0);
  795. ASSERT_TRUE(data.set(instance, 42));
  796. ASSERT_EQ(data.get(instance).cast<int>(), 42);
  797. }
  798. TEST_F(Meta, MetaDataSetterGetterMixed) {
  799. auto data = entt::resolve<setter_getter_type>().data("z"_hs);
  800. setter_getter_type instance{};
  801. ASSERT_TRUE(data);
  802. ASSERT_NE(data, entt::meta_data{});
  803. ASSERT_EQ(data.parent(), entt::resolve("setter_getter"_hs));
  804. ASSERT_EQ(data.type(), entt::resolve<int>());
  805. ASSERT_EQ(data.identifier(), "z"_hs);
  806. ASSERT_FALSE(data.is_const());
  807. ASSERT_FALSE(data.is_static());
  808. ASSERT_EQ(data.get(instance).cast<int>(), 0);
  809. ASSERT_TRUE(data.set(instance, 42));
  810. ASSERT_EQ(data.get(instance).cast<int>(), 42);
  811. }
  812. TEST_F(Meta, MetaDataArrayStatic) {
  813. auto data = entt::resolve<array_type>().data("global"_hs);
  814. array_type::global[0] = 3;
  815. array_type::global[1] = 5;
  816. array_type::global[2] = 7;
  817. ASSERT_TRUE(data);
  818. ASSERT_NE(data, entt::meta_data{});
  819. ASSERT_EQ(data.parent(), entt::resolve("array"_hs));
  820. ASSERT_EQ(data.type(), entt::resolve<int[3]>());
  821. ASSERT_EQ(data.identifier(), "global"_hs);
  822. ASSERT_FALSE(data.is_const());
  823. ASSERT_TRUE(data.is_static());
  824. ASSERT_TRUE(data.type().is_array());
  825. ASSERT_EQ(data.type().extent(), 3);
  826. ASSERT_EQ(data.get(nullptr, 0).cast<int>(), 3);
  827. ASSERT_EQ(data.get(nullptr, 1).cast<int>(), 5);
  828. ASSERT_EQ(data.get(nullptr, 2).cast<int>(), 7);
  829. ASSERT_FALSE(data.set(nullptr, 0, 'c'));
  830. ASSERT_EQ(data.get(nullptr, 0).cast<int>(), 3);
  831. ASSERT_TRUE(data.set(nullptr, 0, data.get(nullptr, 0).cast<int>()+2));
  832. ASSERT_TRUE(data.set(nullptr, 1, data.get(nullptr, 1).cast<int>()+2));
  833. ASSERT_TRUE(data.set(nullptr, 2, data.get(nullptr, 2).cast<int>()+2));
  834. ASSERT_EQ(data.get(nullptr, 0).cast<int>(), 5);
  835. ASSERT_EQ(data.get(nullptr, 1).cast<int>(), 7);
  836. ASSERT_EQ(data.get(nullptr, 2).cast<int>(), 9);
  837. }
  838. TEST_F(Meta, MetaDataArray) {
  839. auto data = entt::resolve<array_type>().data("local"_hs);
  840. array_type instance;
  841. instance.local[0] = 3;
  842. instance.local[1] = 5;
  843. instance.local[2] = 7;
  844. ASSERT_TRUE(data);
  845. ASSERT_NE(data, entt::meta_data{});
  846. ASSERT_EQ(data.parent(), entt::resolve("array"_hs));
  847. ASSERT_EQ(data.type(), entt::resolve<int[3]>());
  848. ASSERT_EQ(data.identifier(), "local"_hs);
  849. ASSERT_FALSE(data.is_const());
  850. ASSERT_FALSE(data.is_static());
  851. ASSERT_TRUE(data.type().is_array());
  852. ASSERT_EQ(data.type().extent(), 3);
  853. ASSERT_EQ(data.get(instance, 0).cast<int>(), 3);
  854. ASSERT_EQ(data.get(instance, 1).cast<int>(), 5);
  855. ASSERT_EQ(data.get(instance, 2).cast<int>(), 7);
  856. ASSERT_FALSE(data.set(instance, 0, 'c'));
  857. ASSERT_EQ(data.get(instance, 0).cast<int>(), 3);
  858. ASSERT_TRUE(data.set(instance, 0, data.get(instance, 0).cast<int>()+2));
  859. ASSERT_TRUE(data.set(instance, 1, data.get(instance, 1).cast<int>()+2));
  860. ASSERT_TRUE(data.set(instance, 2, data.get(instance, 2).cast<int>()+2));
  861. ASSERT_EQ(data.get(instance, 0).cast<int>(), 5);
  862. ASSERT_EQ(data.get(instance, 1).cast<int>(), 7);
  863. ASSERT_EQ(data.get(instance, 2).cast<int>(), 9);
  864. }
  865. TEST_F(Meta, MetaFunc) {
  866. auto func = entt::resolve<func_type>().func("f2"_hs);
  867. func_type instance{};
  868. ASSERT_TRUE(func);
  869. ASSERT_NE(func, entt::meta_func{});
  870. ASSERT_EQ(func.parent(), entt::resolve("func"_hs));
  871. ASSERT_EQ(func.identifier(), "f2"_hs);
  872. ASSERT_EQ(func.size(), entt::meta_func::size_type{2});
  873. ASSERT_FALSE(func.is_const());
  874. ASSERT_FALSE(func.is_static());
  875. ASSERT_EQ(func.ret(), entt::resolve<int>());
  876. ASSERT_EQ(func.arg(entt::meta_func::size_type{0}), entt::resolve<int>());
  877. ASSERT_EQ(func.arg(entt::meta_func::size_type{1}), entt::resolve<int>());
  878. ASSERT_FALSE(func.arg(entt::meta_func::size_type{2}));
  879. auto any = func.invoke(instance, 3, 2);
  880. auto empty = func.invoke(instance);
  881. ASSERT_FALSE(empty);
  882. ASSERT_TRUE(any);
  883. ASSERT_EQ(any.type(), entt::resolve<int>());
  884. ASSERT_EQ(any.cast<int>(), 4);
  885. ASSERT_EQ(func_type::value, 3);
  886. func.prop([](auto prop) {
  887. ASSERT_TRUE(prop);
  888. ASSERT_EQ(prop.key(), properties::prop_bool);
  889. ASSERT_FALSE(prop.value().template cast<bool>());
  890. });
  891. ASSERT_FALSE(func.prop(properties::prop_int));
  892. auto prop = func.prop(properties::prop_bool);
  893. ASSERT_TRUE(prop);
  894. ASSERT_EQ(prop.key(), properties::prop_bool);
  895. ASSERT_FALSE(prop.value().cast<bool>());
  896. }
  897. TEST_F(Meta, MetaFuncConst) {
  898. auto func = entt::resolve<func_type>().func("f1"_hs);
  899. func_type instance{};
  900. ASSERT_TRUE(func);
  901. ASSERT_EQ(func.parent(), entt::resolve("func"_hs));
  902. ASSERT_EQ(func.identifier(), "f1"_hs);
  903. ASSERT_EQ(func.size(), entt::meta_func::size_type{1});
  904. ASSERT_TRUE(func.is_const());
  905. ASSERT_FALSE(func.is_static());
  906. ASSERT_EQ(func.ret(), entt::resolve<int>());
  907. ASSERT_EQ(func.arg(entt::meta_func::size_type{0}), entt::resolve<int>());
  908. ASSERT_FALSE(func.arg(entt::meta_func::size_type{1}));
  909. auto any = func.invoke(instance, 4);
  910. auto empty = func.invoke(instance, 'c');
  911. ASSERT_FALSE(empty);
  912. ASSERT_TRUE(any);
  913. ASSERT_EQ(any.type(), entt::resolve<int>());
  914. ASSERT_EQ(any.cast<int>(), 16);
  915. func.prop([](auto prop) {
  916. ASSERT_TRUE(prop);
  917. ASSERT_EQ(prop.key(), properties::prop_bool);
  918. ASSERT_FALSE(prop.value().template cast<bool>());
  919. });
  920. ASSERT_FALSE(func.prop(properties::prop_int));
  921. auto prop = func.prop(properties::prop_bool);
  922. ASSERT_TRUE(prop);
  923. ASSERT_EQ(prop.key(), properties::prop_bool);
  924. ASSERT_FALSE(prop.value().cast<bool>());
  925. }
  926. TEST_F(Meta, MetaFuncRetVoid) {
  927. auto func = entt::resolve<func_type>().func("g"_hs);
  928. func_type instance{};
  929. ASSERT_TRUE(func);
  930. ASSERT_EQ(func.parent(), entt::resolve("func"_hs));
  931. ASSERT_EQ(func.identifier(), "g"_hs);
  932. ASSERT_EQ(func.size(), entt::meta_func::size_type{1});
  933. ASSERT_FALSE(func.is_const());
  934. ASSERT_FALSE(func.is_static());
  935. ASSERT_EQ(func.ret(), entt::resolve<void>());
  936. ASSERT_EQ(func.arg(entt::meta_func::size_type{0}), entt::resolve<int>());
  937. ASSERT_FALSE(func.arg(entt::meta_func::size_type{1}));
  938. auto any = func.invoke(instance, 5);
  939. ASSERT_FALSE(any);
  940. ASSERT_EQ(func_type::value, 25);
  941. func.prop([](auto prop) {
  942. ASSERT_TRUE(prop);
  943. ASSERT_EQ(prop.key(), properties::prop_bool);
  944. ASSERT_FALSE(prop.value().template cast<bool>());
  945. });
  946. ASSERT_FALSE(func.prop(properties::prop_int));
  947. auto prop = func.prop(properties::prop_bool);
  948. ASSERT_TRUE(prop);
  949. ASSERT_EQ(prop.key(), properties::prop_bool);
  950. ASSERT_FALSE(prop.value().cast<bool>());
  951. }
  952. TEST_F(Meta, MetaFuncStatic) {
  953. auto func = entt::resolve<func_type>().func("h"_hs);
  954. ASSERT_TRUE(func);
  955. ASSERT_EQ(func.parent(), entt::resolve("func"_hs));
  956. ASSERT_EQ(func.identifier(), "h"_hs);
  957. ASSERT_EQ(func.size(), entt::meta_func::size_type{1});
  958. ASSERT_FALSE(func.is_const());
  959. ASSERT_TRUE(func.is_static());
  960. ASSERT_EQ(func.ret(), entt::resolve<int>());
  961. ASSERT_EQ(func.arg(entt::meta_func::size_type{0}), entt::resolve<int>());
  962. ASSERT_FALSE(func.arg(entt::meta_func::size_type{1}));
  963. auto any = func.invoke({}, 42);
  964. auto empty = func.invoke({}, 'c');
  965. ASSERT_FALSE(empty);
  966. ASSERT_TRUE(any);
  967. ASSERT_EQ(any.type(), entt::resolve<int>());
  968. ASSERT_EQ(any.cast<int>(), 42);
  969. func.prop([](auto prop) {
  970. ASSERT_TRUE(prop);
  971. ASSERT_EQ(prop.key(), properties::prop_bool);
  972. ASSERT_FALSE(prop.value().template cast<bool>());
  973. });
  974. ASSERT_FALSE(func.prop(properties::prop_int));
  975. auto prop = func.prop(properties::prop_bool);
  976. ASSERT_TRUE(prop);
  977. ASSERT_EQ(prop.key(), properties::prop_bool);
  978. ASSERT_FALSE(prop.value().cast<bool>());
  979. }
  980. TEST_F(Meta, MetaFuncStaticRetVoid) {
  981. auto func = entt::resolve<func_type>().func("k"_hs);
  982. ASSERT_TRUE(func);
  983. ASSERT_EQ(func.parent(), entt::resolve("func"_hs));
  984. ASSERT_EQ(func.identifier(), "k"_hs);
  985. ASSERT_EQ(func.size(), entt::meta_func::size_type{1});
  986. ASSERT_FALSE(func.is_const());
  987. ASSERT_TRUE(func.is_static());
  988. ASSERT_EQ(func.ret(), entt::resolve<void>());
  989. ASSERT_EQ(func.arg(entt::meta_func::size_type{0}), entt::resolve<int>());
  990. ASSERT_FALSE(func.arg(entt::meta_func::size_type{1}));
  991. auto any = func.invoke({}, 42);
  992. ASSERT_FALSE(any);
  993. ASSERT_EQ(func_type::value, 42);
  994. func.prop([](auto *prop) {
  995. ASSERT_TRUE(prop);
  996. ASSERT_EQ(prop->key(), properties::prop_bool);
  997. ASSERT_FALSE(prop->value().template cast<bool>());
  998. });
  999. ASSERT_FALSE(func.prop(properties::prop_int));
  1000. auto prop = func.prop(properties::prop_bool);
  1001. ASSERT_TRUE(prop);
  1002. ASSERT_EQ(prop.key(), properties::prop_bool);
  1003. ASSERT_FALSE(prop.value().cast<bool>());
  1004. }
  1005. TEST_F(Meta, MetaFuncMetaAnyArgs) {
  1006. auto func = entt::resolve<func_type>().func("f1"_hs);
  1007. auto any = func.invoke(func_type{}, entt::meta_any{3});
  1008. ASSERT_TRUE(any);
  1009. ASSERT_EQ(any.type(), entt::resolve<int>());
  1010. ASSERT_EQ(any.cast<int>(), 9);
  1011. }
  1012. TEST_F(Meta, MetaFuncInvalidArgs) {
  1013. auto func = entt::resolve<func_type>().func("f1"_hs);
  1014. ASSERT_FALSE(func.invoke(empty_type{}, entt::meta_any{'c'}));
  1015. }
  1016. TEST_F(Meta, MetaFuncCastAndConvert) {
  1017. auto func = entt::resolve<func_type>().func("f3"_hs);
  1018. auto any = func.invoke(func_type{}, derived_type{}, 0, 3.);
  1019. ASSERT_TRUE(any);
  1020. ASSERT_EQ(any.type(), entt::resolve<int>());
  1021. ASSERT_EQ(any.cast<int>(), 9);
  1022. }
  1023. TEST_F(Meta, MetaType) {
  1024. auto type = entt::resolve<derived_type>();
  1025. ASSERT_TRUE(type);
  1026. ASSERT_NE(type, entt::meta_type{});
  1027. ASSERT_EQ(type.identifier(), "derived"_hs);
  1028. type.prop([](auto prop) {
  1029. ASSERT_TRUE(prop);
  1030. ASSERT_EQ(prop.key(), properties::prop_int);
  1031. ASSERT_EQ(prop.value(), 99);
  1032. });
  1033. ASSERT_FALSE(type.prop(properties::prop_bool));
  1034. auto prop = type.prop(properties::prop_int);
  1035. ASSERT_TRUE(prop);
  1036. ASSERT_EQ(prop.key(), properties::prop_int);
  1037. ASSERT_EQ(prop.value(), 99);
  1038. }
  1039. TEST_F(Meta, MetaTypeTraits) {
  1040. ASSERT_TRUE(entt::resolve<void>().is_void());
  1041. ASSERT_TRUE(entt::resolve<bool>().is_integral());
  1042. ASSERT_TRUE(entt::resolve<double>().is_floating_point());
  1043. ASSERT_TRUE(entt::resolve<properties>().is_enum());
  1044. ASSERT_TRUE(entt::resolve<union_type>().is_union());
  1045. ASSERT_TRUE(entt::resolve<derived_type>().is_class());
  1046. ASSERT_TRUE(entt::resolve<int *>().is_pointer());
  1047. ASSERT_TRUE(entt::resolve<decltype(empty_type::destroy)>().is_function());
  1048. ASSERT_TRUE(entt::resolve<decltype(&data_type::i)>().is_member_object_pointer());
  1049. ASSERT_TRUE(entt::resolve<decltype(&func_type::g)>().is_member_function_pointer());
  1050. }
  1051. TEST_F(Meta, MetaTypeRemovePointer) {
  1052. ASSERT_EQ(entt::resolve<void *>().remove_pointer(), entt::resolve<void>());
  1053. ASSERT_EQ(entt::resolve<int(*)(char, double)>().remove_pointer(), entt::resolve<int(char, double)>());
  1054. ASSERT_EQ(entt::resolve<derived_type>().remove_pointer(), entt::resolve<derived_type>());
  1055. }
  1056. TEST_F(Meta, MetaTypeBase) {
  1057. auto type = entt::resolve<derived_type>();
  1058. bool iterate = false;
  1059. type.base([&iterate](auto base) {
  1060. ASSERT_EQ(base.type(), entt::resolve<base_type>());
  1061. iterate = true;
  1062. });
  1063. ASSERT_TRUE(iterate);
  1064. ASSERT_EQ(type.base("base"_hs).type(), entt::resolve<base_type>());
  1065. }
  1066. TEST_F(Meta, MetaTypeConv) {
  1067. auto type = entt::resolve<double>();
  1068. bool iterate = false;
  1069. type.conv([&iterate](auto conv) {
  1070. ASSERT_EQ(conv.type(), entt::resolve<int>());
  1071. iterate = true;
  1072. });
  1073. ASSERT_TRUE(iterate);
  1074. auto conv = type.conv<int>();
  1075. ASSERT_EQ(conv.type(), entt::resolve<int>());
  1076. ASSERT_FALSE(type.conv<char>());
  1077. }
  1078. TEST_F(Meta, MetaTypeCtor) {
  1079. auto type = entt::resolve<derived_type>();
  1080. int counter{};
  1081. type.ctor([&counter](auto) {
  1082. ++counter;
  1083. });
  1084. ASSERT_EQ(counter, 2);
  1085. ASSERT_TRUE((type.ctor<const base_type &, int>()));
  1086. ASSERT_TRUE((type.ctor<const derived_type &, double>()));
  1087. }
  1088. TEST_F(Meta, MetaTypeDtor) {
  1089. ASSERT_TRUE(entt::resolve<fat_type>().dtor());
  1090. ASSERT_FALSE(entt::resolve<int>().dtor());
  1091. }
  1092. TEST_F(Meta, MetaTypeData) {
  1093. auto type = entt::resolve<data_type>();
  1094. int counter{};
  1095. type.data([&counter](auto) {
  1096. ++counter;
  1097. });
  1098. ASSERT_EQ(counter, 5);
  1099. ASSERT_TRUE(type.data("i"_hs));
  1100. }
  1101. TEST_F(Meta, MetaTypeFunc) {
  1102. auto type = entt::resolve<func_type>();
  1103. int counter{};
  1104. type.func([&counter](auto) {
  1105. ++counter;
  1106. });
  1107. ASSERT_EQ(counter, 6);
  1108. ASSERT_TRUE(type.func("f1"_hs));
  1109. }
  1110. TEST_F(Meta, MetaTypeConstruct) {
  1111. auto type = entt::resolve<derived_type>();
  1112. auto any = type.construct(base_type{}, 42, 'c');
  1113. ASSERT_TRUE(any);
  1114. ASSERT_TRUE(any.can_cast<derived_type>());
  1115. ASSERT_EQ(any.cast<derived_type>().i, 42);
  1116. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  1117. }
  1118. TEST_F(Meta, MetaTypeConstructMetaAnyArgs) {
  1119. auto type = entt::resolve<derived_type>();
  1120. auto any = type.construct(entt::meta_any{base_type{}}, entt::meta_any{42}, entt::meta_any{'c'});
  1121. ASSERT_TRUE(any);
  1122. ASSERT_TRUE(any.can_cast<derived_type>());
  1123. ASSERT_EQ(any.cast<derived_type>().i, 42);
  1124. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  1125. }
  1126. TEST_F(Meta, MetaTypeConstructInvalidArgs) {
  1127. auto type = entt::resolve<derived_type>();
  1128. auto any = type.construct(entt::meta_any{base_type{}}, entt::meta_any{'c'}, entt::meta_any{42});
  1129. ASSERT_FALSE(any);
  1130. }
  1131. TEST_F(Meta, MetaTypeLessArgs) {
  1132. auto type = entt::resolve<derived_type>();
  1133. auto any = type.construct(base_type{});
  1134. ASSERT_FALSE(any);
  1135. }
  1136. TEST_F(Meta, MetaTypeConstructCastAndConvert) {
  1137. auto type = entt::resolve<derived_type>();
  1138. auto any = type.construct(entt::meta_any{derived_type{}}, entt::meta_any{42.}, entt::meta_any{'c'});
  1139. ASSERT_TRUE(any);
  1140. ASSERT_TRUE(any.can_cast<derived_type>());
  1141. ASSERT_EQ(any.cast<derived_type>().i, 42);
  1142. ASSERT_EQ(any.cast<derived_type>().c, 'c');
  1143. }
  1144. TEST_F(Meta, MetaTypeDestroyDtor) {
  1145. auto type = entt::resolve<empty_type>();
  1146. ASSERT_EQ(empty_type::counter, 0);
  1147. ASSERT_TRUE(type.destroy(empty_type{}));
  1148. ASSERT_EQ(empty_type::counter, 1);
  1149. }
  1150. TEST_F(Meta, MetaTypeDestroyDtorInvalidArg) {
  1151. auto type = entt::resolve<empty_type>();
  1152. ASSERT_EQ(empty_type::counter, 0);
  1153. ASSERT_FALSE(type.destroy('c'));
  1154. ASSERT_EQ(empty_type::counter, 0);
  1155. }
  1156. TEST_F(Meta, MetaTypeDestroyDtorCastAndConvert) {
  1157. auto type = entt::resolve<empty_type>();
  1158. ASSERT_EQ(empty_type::counter, 0);
  1159. ASSERT_FALSE(type.destroy(fat_type{}));
  1160. ASSERT_EQ(empty_type::counter, 0);
  1161. ASSERT_FALSE(entt::resolve<int>().destroy(42.));
  1162. }
  1163. TEST_F(Meta, MetaTypeDestroyNoDtor) {
  1164. ASSERT_TRUE(entt::resolve<char>().destroy('c'));
  1165. }
  1166. TEST_F(Meta, MetaTypeDestroyNoDtorInvalidArg) {
  1167. ASSERT_FALSE(entt::resolve<char>().destroy(42));
  1168. }
  1169. TEST_F(Meta, MetaTypeDestroyNoDtorVoid) {
  1170. ASSERT_FALSE(entt::resolve<void>().destroy({}));
  1171. }
  1172. TEST_F(Meta, MetaTypeDestroyNoDtorCastAndConvert) {
  1173. ASSERT_FALSE(entt::resolve<int>().destroy(42.));
  1174. }
  1175. TEST_F(Meta, MetaDataFromBase) {
  1176. auto type = entt::resolve<concrete_type>();
  1177. concrete_type instance;
  1178. ASSERT_TRUE(type.data("i"_hs));
  1179. ASSERT_TRUE(type.data("j"_hs));
  1180. ASSERT_EQ(instance.i, 0);
  1181. ASSERT_EQ(instance.j, char{});
  1182. ASSERT_TRUE(type.data("i"_hs).set(instance, 3));
  1183. ASSERT_TRUE(type.data("j"_hs).set(instance, 'c'));
  1184. ASSERT_EQ(instance.i, 3);
  1185. ASSERT_EQ(instance.j, 'c');
  1186. }
  1187. TEST_F(Meta, MetaFuncFromBase) {
  1188. auto type = entt::resolve<concrete_type>();
  1189. auto base = entt::resolve<an_abstract_type>();
  1190. concrete_type instance;
  1191. ASSERT_TRUE(type.func("f"_hs));
  1192. ASSERT_TRUE(type.func("g"_hs));
  1193. ASSERT_TRUE(type.func("h"_hs));
  1194. ASSERT_EQ(type.func("f"_hs).parent(), entt::resolve<concrete_type>());
  1195. ASSERT_EQ(type.func("g"_hs).parent(), entt::resolve<an_abstract_type>());
  1196. ASSERT_EQ(type.func("h"_hs).parent(), entt::resolve<another_abstract_type>());
  1197. ASSERT_EQ(instance.i, 0);
  1198. ASSERT_EQ(instance.j, char{});
  1199. type.func("f"_hs).invoke(instance, 3);
  1200. type.func("h"_hs).invoke(instance, 'c');
  1201. ASSERT_EQ(instance.i, 9);
  1202. ASSERT_EQ(instance.j, 'c');
  1203. base.func("g"_hs).invoke(instance, 3);
  1204. ASSERT_EQ(instance.i, -3);
  1205. }
  1206. TEST_F(Meta, MetaPropFromBase) {
  1207. auto type = entt::resolve<concrete_type>();
  1208. auto prop_bool = type.prop(properties::prop_bool);
  1209. auto prop_int = type.prop(properties::prop_int);
  1210. ASSERT_TRUE(prop_bool);
  1211. ASSERT_TRUE(prop_int);
  1212. ASSERT_FALSE(prop_bool.value().cast<bool>());
  1213. ASSERT_EQ(prop_int.value().cast<int>(), 42);
  1214. }
  1215. TEST_F(Meta, AbstractClass) {
  1216. auto type = entt::resolve<an_abstract_type>();
  1217. concrete_type instance;
  1218. ASSERT_EQ(instance.i, 0);
  1219. type.func("f"_hs).invoke(instance, 3);
  1220. ASSERT_EQ(instance.i, 3);
  1221. type.func("g"_hs).invoke(instance, 3);
  1222. ASSERT_EQ(instance.i, -3);
  1223. }
  1224. TEST_F(Meta, EnumAndNamedConstants) {
  1225. auto type = entt::resolve<properties>();
  1226. ASSERT_TRUE(type.data("prop_bool"_hs));
  1227. ASSERT_TRUE(type.data("prop_int"_hs));
  1228. ASSERT_EQ(type.data("prop_bool"_hs).type(), type);
  1229. ASSERT_EQ(type.data("prop_int"_hs).type(), type);
  1230. ASSERT_FALSE(type.data("prop_bool"_hs).set({}, properties::prop_int));
  1231. ASSERT_FALSE(type.data("prop_int"_hs).set({}, properties::prop_bool));
  1232. ASSERT_EQ(type.data("prop_bool"_hs).get({}).cast<properties>(), properties::prop_bool);
  1233. ASSERT_EQ(type.data("prop_int"_hs).get({}).cast<properties>(), properties::prop_int);
  1234. }
  1235. TEST_F(Meta, ArithmeticTypeAndNamedConstants) {
  1236. auto type = entt::resolve<unsigned int>();
  1237. ASSERT_TRUE(type.data("min"_hs));
  1238. ASSERT_TRUE(type.data("max"_hs));
  1239. ASSERT_EQ(type.data("min"_hs).type(), type);
  1240. ASSERT_EQ(type.data("max"_hs).type(), type);
  1241. ASSERT_FALSE(type.data("min"_hs).set({}, 100u));
  1242. ASSERT_FALSE(type.data("max"_hs).set({}, 0u));
  1243. ASSERT_EQ(type.data("min"_hs).get({}).cast<unsigned int>(), 0u);
  1244. ASSERT_EQ(type.data("max"_hs).get({}).cast<unsigned int>(), 100u);
  1245. }
  1246. TEST_F(Meta, Unregister) {
  1247. ASSERT_FALSE(entt::unregister<float>());
  1248. ASSERT_TRUE(entt::unregister<double>());
  1249. ASSERT_TRUE(entt::unregister<char>());
  1250. ASSERT_TRUE(entt::unregister<properties>());
  1251. ASSERT_TRUE(entt::unregister<unsigned int>());
  1252. ASSERT_TRUE(entt::unregister<base_type>());
  1253. ASSERT_TRUE(entt::unregister<derived_type>());
  1254. ASSERT_TRUE(entt::unregister<empty_type>());
  1255. ASSERT_TRUE(entt::unregister<fat_type>());
  1256. ASSERT_TRUE(entt::unregister<data_type>());
  1257. ASSERT_TRUE(entt::unregister<func_type>());
  1258. ASSERT_TRUE(entt::unregister<setter_getter_type>());
  1259. ASSERT_TRUE(entt::unregister<an_abstract_type>());
  1260. ASSERT_TRUE(entt::unregister<another_abstract_type>());
  1261. ASSERT_TRUE(entt::unregister<concrete_type>());
  1262. ASSERT_FALSE(entt::unregister<double>());
  1263. ASSERT_FALSE(entt::resolve("char"_hs));
  1264. ASSERT_FALSE(entt::resolve("base"_hs));
  1265. ASSERT_FALSE(entt::resolve("derived"_hs));
  1266. ASSERT_FALSE(entt::resolve("empty"_hs));
  1267. ASSERT_FALSE(entt::resolve("fat"_hs));
  1268. ASSERT_FALSE(entt::resolve("data"_hs));
  1269. ASSERT_FALSE(entt::resolve("func"_hs));
  1270. ASSERT_FALSE(entt::resolve("setter_getter"_hs));
  1271. ASSERT_FALSE(entt::resolve("an_abstract_type"_hs));
  1272. ASSERT_FALSE(entt::resolve("another_abstract_type"_hs));
  1273. ASSERT_FALSE(entt::resolve("concrete"_hs));
  1274. Meta::SetUpAfterUnregistration();
  1275. entt::meta_any any{42.};
  1276. ASSERT_TRUE(any);
  1277. ASSERT_FALSE(any.can_convert<int>());
  1278. ASSERT_TRUE(any.can_convert<float>());
  1279. ASSERT_FALSE(entt::resolve("derived"_hs));
  1280. ASSERT_TRUE(entt::resolve("my_type"_hs));
  1281. entt::resolve<derived_type>().prop([](auto prop) {
  1282. ASSERT_TRUE(prop);
  1283. ASSERT_EQ(prop.key(), properties::prop_bool);
  1284. ASSERT_FALSE(prop.value().template cast<bool>());
  1285. });
  1286. ASSERT_FALSE((entt::resolve<derived_type>().ctor<const base_type &, int, char>()));
  1287. ASSERT_TRUE((entt::resolve<derived_type>().ctor<>()));
  1288. ASSERT_TRUE(entt::resolve("your_type"_hs).data("a_data_member"_hs));
  1289. ASSERT_FALSE(entt::resolve("your_type"_hs).data("another_data_member"_hs));
  1290. ASSERT_TRUE(entt::resolve("your_type"_hs).func("a_member_function"_hs));
  1291. ASSERT_FALSE(entt::resolve("your_type"_hs).func("another_member_function"_hs));
  1292. }