yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie HermaszewskaCorrect include dir for libslang (#5539)7b570feed

master
4.1 KiB162 linesraw
1// unit-test-json-native.cpp
2
3#include "../../source/compiler-core/slang-json-native.h"
4#include "../../source/compiler-core/slang-json-parser.h"
5#include "../../source/core/slang-rtti-info.h"
6#include "unit-test/slang-unit-test.h"
7
8using namespace Slang;
9
10namespace
11{ // anonymous
12
13struct OtherStruct
14{
15    typedef OtherStruct ThisType;
16
17    bool operator==(const ThisType& rhs) const { return f == rhs.f && value == rhs.value; }
18    bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
19
20    float f = 1.0f;
21    String value;
22
23    static const StructRttiInfo g_rttiInfo;
24};
25
26static const StructRttiInfo _makeOtherStructRtti()
27{
28    OtherStruct obj;
29    StructRttiBuilder builder(&obj, "OtherStruct", nullptr);
30    builder.addField("f", &obj.f);
31    builder.addField("value", &obj.value);
32    return builder.make();
33}
34/* static */ const StructRttiInfo OtherStruct::g_rttiInfo = _makeOtherStructRtti();
35
36struct SomeStruct
37{
38    typedef SomeStruct ThisType;
39
40    bool operator==(const ThisType& rhs) const
41    {
42        return a == rhs.a && b == rhs.b && s == rhs.s && list == rhs.list &&
43               boolValue == rhs.boolValue && structList == rhs.structList &&
44               makeConstArrayView(fixedArray) == makeConstArrayView(rhs.fixedArray);
45    }
46    bool operator!=(const ThisType& rhs) const { return !(*this == rhs); }
47
48    int a = 0;
49    float b = 2.0f;
50    String s;
51    List<String> list;
52    bool boolValue = false;
53
54    List<OtherStruct> structList;
55
56    int fixedArray[2] = {0, 0};
57
58    static const StructRttiInfo g_rttiInfo;
59};
60
61static const StructRttiInfo _makeSomeStructRtti()
62{
63    SomeStruct obj;
64    StructRttiBuilder builder(&obj, "SomeStruct", nullptr);
65
66    builder.addField("a", &obj.a);
67    builder.addField("b", &obj.b);
68    builder.addField("s", &obj.s);
69    builder.addField("list", &obj.list);
70    builder.addField("boolValue", &obj.boolValue);
71    builder.addField("structList", &obj.structList);
72    builder.addField("fixedArray", &obj.fixedArray);
73
74    return builder.make();
75}
76/* static */ const StructRttiInfo SomeStruct::g_rttiInfo = _makeSomeStructRtti();
77
78} // namespace
79
80
81static SlangResult _check()
82{
83    // Convert into a JSON string
84
85    SomeStruct s;
86    s.list.add("Hello!");
87    s.s = "There";
88    s.boolValue = true;
89
90    OtherStruct o;
91    o.f = 27.5f;
92    o.value = "This works!";
93
94    s.structList.add(o);
95    s.fixedArray[1] = 8;
96    s.fixedArray[0] = -1;
97
98    // Try serializing it out
99
100    SourceManager sourceManager;
101    sourceManager.initialize(nullptr, nullptr);
102
103    DiagnosticSink sink(&sourceManager, &JSONLexer::calcLexemeLocation);
104
105    auto typeMap = JSONNativeUtil::getTypeFuncsMap();
106
107    RefPtr<JSONContainer> container(new JSONContainer(&sourceManager));
108
109    String json;
110    {
111        NativeToJSONConverter converter(container, &typeMap, &sink);
112
113        JSONValue value;
114        SLANG_RETURN_ON_FAIL(converter.convert(GetRttiInfo<SomeStruct>::get(), &s, value));
115
116        // Convert into a string
117        JSONWriter writer(JSONWriter::IndentationStyle::Allman);
118        container->traverseRecursively(value, &writer);
119
120        json = writer.getBuilder();
121    }
122
123    JSONValue readValue;
124    {
125        // Now need to parse as JSON
126        String contents(json);
127        SourceFile* sourceFile =
128            sourceManager.createSourceFileWithString(PathInfo::makeUnknown(), contents);
129        SourceView* sourceView = sourceManager.createSourceView(sourceFile, nullptr, SourceLoc());
130
131        JSONLexer lexer;
132        lexer.init(sourceView, &sink);
133
134        JSONBuilder builder(container);
135
136        JSONParser parser;
137        SLANG_RETURN_ON_FAIL(parser.parse(&lexer, sourceView, &builder, &sink));
138
139        readValue = builder.getRootValue();
140    }
141
142    // Convert back to native
143    {
144        JSONToNativeConverter converter(container, &typeMap, &sink);
145
146        {
147            SomeStruct readS;
148            SLANG_RETURN_ON_FAIL(
149                converter.convert(readValue, GetRttiInfo<SomeStruct>::get(), &readS));
150
151            // Should be equal
152            SLANG_CHECK(readS == s);
153        }
154    }
155
156    return SLANG_OK;
157}
158
159SLANG_UNIT_TEST(JSONNative)
160{
161    SLANG_CHECK(SLANG_SUCCEEDED(_check()));
162}