summaryrefslogtreecommitdiffstats
path: root/tools/slang-unit-test/unit-test-rtti.cpp
blob: d1a628ed3593e6080eefc1d81f8753322dad6e7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// unit-test-rtti.cpp

#include "../../source/core/slang-rtti-info.h"
#include "unit-test/slang-unit-test.h"

using namespace Slang;

namespace
{ // anonymous

struct SomeStruct
{
    int a = 0;
    float b = 2.0f;
    String s;
    List<String> list;

    static const StructRttiInfo g_rttiInfo;
};

} // namespace

static const StructRttiInfo _makeSomeStructRtti()
{
    SomeStruct obj;
    StructRttiBuilder builder(&obj, "SomeStruct", nullptr);

    builder.addField("a", &obj.a);
    builder.addField("b", &obj.b);
    builder.addField("s", &obj.s);
    builder.addField("list", &obj.list);

    return builder.make();
}
/* static */ const StructRttiInfo SomeStruct::g_rttiInfo = _makeSomeStructRtti();

SLANG_UNIT_TEST(Rtti)
{
    using namespace Slang;

    const RttiInfo* types[] = {
        GetRttiInfo<int32_t>::get(),
        GetRttiInfo<int32_t[10]>::get(),
        GetRttiInfo<String>::get(),
        GetRttiInfo<List<String>>::get(),
        GetRttiInfo<List<List<String>>>::get(),
        GetRttiInfo<int32_t[2][3]>::get(),
        GetRttiInfo<SomeStruct>::get(),
        GetRttiInfo<SomeStruct*>::get(),
        GetRttiInfo<const float* const>::get(),
    };

    StringBuilder buf;

    for (auto type : types)
    {
        RttiInfo::append(type, buf);
        buf << "\n";
    }

    const char expected[] = "int32_t\n"
                            "int32_t[10]\n"
                            "String\n"
                            "List<String>\n"
                            "List<List<String>>\n"
                            "int32_t[2][3]\n"
                            "SomeStruct\n"
                            "SomeStruct*\n"
                            "float*\n";

    SLANG_CHECK(buf == expected)
}