GCC Code Coverage Report


ernie/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
292 / 307
95.1%
Branches:
883 / 1804
48.9%
Functions:
31 / 31
100.0%

scene/reference.cpp
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 /// @file reference.cpp
3 /// @brief The reference families, the JSON Schema of scene files and the reference pages.
4 #include "ernie/scene/reference.h"
5
6 #include "ernie/scene/json_value.h"
7 #include "ernie/util/text.h"
8
9 #include <algorithm>
10 #include <array>
11 #include <optional>
12 #include <stdexcept>
13
14 namespace ernie {
15 namespace {
16
17 constexpr std::string_view kInstancePattern = "[A-Za-z_][A-Za-z0-9_]*";
18 constexpr std::string_view kExampleInstance = "example";
19
20 /// @return Text as a regular expression matching it literally.
21 72 std::string Literal(std::string_view text) {
22 72 std::string out;
23
2/2
✓ Branch 0 taken 736 times.
✓ Branch 1 taken 72 times.
808 for (const char c : text) {
24
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 735 times.
736 if (std::string_view("\\^$.|?*+()[]{}").find(c) != std::string_view::npos) {
25
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
1 out += '\\';
26 }
27
1/2
✓ Branch 1 taken 736 times.
✗ Branch 2 not taken.
1472 out += c;
28 }
29 72 return out;
30 ✗ }
31
32 1477 std::optional<Json> JsonValue(const Value& value) {
33
2/2
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 1279 times.
1477 if (value.Empty()) {
34 198 return std::nullopt;
35 }
36 1279 try {
37
1/2
✓ Branch 1 taken 1279 times.
✗ Branch 2 not taken.
2558 return ToJson(value);
38
0/2
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ } catch (const std::invalid_argument&) {
39 ✗ return std::nullopt;
40 ✗ }
41 }
42
43 /// @return A type's fallback for an attribute as scene files write it; none if it has none.
44 1466 std::optional<Json> JsonFallback(const SchemaDef& schema, const AttributeDef& def) {
45 2932 return JsonValue(schema.Fallback(def));
46 }
47
48 625 bool IsInstanced(std::string_view name) {
49 625 return name.find(kInstanceName) != std::string_view::npos;
50 }
51
52 65 std::vector<std::string_view> OpenNamespaces(const SchemaDef& schema) {
53 65 std::vector<std::string_view> namespaces;
54
2/2
✓ Branch 0 taken 210 times.
✓ Branch 1 taken 65 times.
275 for (const SchemaDef* type = &schema; type != nullptr; type = type->base) {
55
1/2
✓ Branch 1 taken 210 times.
✗ Branch 2 not taken.
210 namespaces.insert(namespaces.end(), type->openNamespaces.begin(),
56 type->openNamespaces.end());
57 }
58 65 return namespaces;
59 ✗ }
60
61 3 std::vector<std::string> Names(SchemaKind kind) {
62 3 std::vector<std::string> names;
63
3/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 195 times.
✓ Branch 4 taken 3 times.
198 for (const SchemaDef* schema : Schemas()) {
64
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 141 times.
195 if (schema->kind == kind) {
65
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
54 names.emplace_back(schema->name);
66 }
67 }
68 3 return names;
69 ✗ }
70
71 // The JSON Schema.
72
73 73 Json Ref(std::string_view name) {
74
4/8
✓ Branch 1 taken 73 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 73 times.
✓ Branch 7 taken 73 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
438 return {{"$ref", "#/$defs/" + std::string(name)}};
75
6/14
✓ Branch 1 taken 73 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 73 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 73 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 73 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 146 times.
✓ Branch 13 taken 73 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
438 }
76
77 284 Json Number(const AttributeMeta& meta, bool integer) {
78
3/6
✓ Branch 1 taken 284 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 284 times.
✓ Branch 4 taken 284 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
1420 Json number{{"type", integer ? "integer" : "number"}};
79 284 if (meta.lower) {
80
3/4
✓ Branch 1 taken 191 times.
✓ Branch 2 taken 24 times.
✓ Branch 4 taken 215 times.
✗ Branch 5 not taken.
406 number[meta.lower->exclusive ? "exclusiveMinimum" : "minimum"] = meta.lower->value;
81 }
82
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 250 times.
284 if (meta.upper) {
83
3/4
✓ Branch 1 taken 32 times.
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
66 number[meta.upper->exclusive ? "exclusiveMaximum" : "maximum"] = meta.upper->value;
84 }
85 284 return number;
86
9/16
✓ Branch 1 taken 284 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 212 times.
✓ Branch 4 taken 72 times.
✓ Branch 6 taken 284 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 284 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 568 times.
✓ Branch 12 taken 284 times.
✓ Branch 13 taken 215 times.
✓ Branch 14 taken 69 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
1420 }
87
88 126 Json Array(Json items, std::optional<std::size_t> count = std::nullopt) {
89
2/4
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 252 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
882 Json array{{"type", "array"}, {"items", std::move(items)}};
90 126 if (count) {
91
1/2
✓ Branch 2 taken 39 times.
✗ Branch 3 not taken.
39 array["minItems"] = *count;
92
1/2
✓ Branch 2 taken 39 times.
✗ Branch 3 not taken.
39 array["maxItems"] = *count;
93 }
94 126 return array;
95
12/26
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 126 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 126 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 126 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 126 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 126 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 252 times.
✓ Branch 20 taken 126 times.
✓ Branch 21 taken 252 times.
✓ Branch 22 taken 126 times.
✓ Branch 23 taken 39 times.
✓ Branch 24 taken 87 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
756 }
96
97 243 Json String() {
98
2/4
✓ Branch 0 taken 243 times.
✓ Branch 1 taken 243 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
972 return {{"type", "string"}};
99
6/14
✓ Branch 1 taken 243 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 243 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 243 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 243 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 486 times.
✓ Branch 13 taken 243 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
972 }
100
101 625 Json ValueSchema(const AttributeDef& def) {
102 625 const AttributeMeta& meta = def.meta;
103
12/14
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 136 times.
✓ Branch 3 taken 11 times.
✓ Branch 4 taken 23 times.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 178 times.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 8 times.
✓ Branch 11 taken 36 times.
✓ Branch 12 taken 42 times.
✓ Branch 13 taken 75 times.
625 switch (def.type) {
104 35 case ColumnType::Bool:
105
2/4
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 35 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
140 return {{"type", "boolean"}};
106 72 case ColumnType::Int:
107 72 return Number(meta, true);
108 136 case ColumnType::Double:
109 136 return Number(meta, false);
110 11 case ColumnType::Vec2:
111
1/2
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
11 return Array(Number(meta, false), 2);
112 23 case ColumnType::Vec3:
113
1/2
✓ Branch 2 taken 23 times.
✗ Branch 3 not taken.
23 return Array(Number(meta, false), 3);
114 3 case ColumnType::Vec4:
115
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 return Array(Number(meta, false), 4);
116 ✗ case ColumnType::Quat:
117
0/4
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ return Array(Number({}, false), 4);
118 ✗ case ColumnType::Matrix:
119
0/6
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ return Array(Array(Number({}, false), 4), 4);
120 178 case ColumnType::TokenValue: {
121 178 Json token = String();
122
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 29 times.
178 if (!meta.options.empty()) {
123
2/4
✓ Branch 1 taken 149 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 149 times.
✗ Branch 5 not taken.
149 token["enum"] = meta.options;
124 }
125 178 return token;
126 178 }
127 6 case ColumnType::Relationship:
128 6 return String();
129 8 case ColumnType::Relationships:
130
6/12
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 12 taken 16 times.
✓ Branch 13 taken 8 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
72 return {{"anyOf", Json::array({String(), Array(String())})}};
131 36 case ColumnType::FloatArray:
132
1/2
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
36 return Array(Number(meta, false));
133 42 case ColumnType::TokenArray:
134
1/2
✓ Branch 2 taken 42 times.
✗ Branch 3 not taken.
42 return Array(String());
135 case ColumnType::Tensor:
136 break;
137 }
138 75 const Json shared{{"type", "object"},
139
2/4
✓ Branch 2 taken 75 times.
✓ Branch 3 taken 75 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
225 {"required", Json::array({"$array"})},
140
2/4
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 75 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
1425 {"properties", {{"$array", {{"type", "integer"}, {"minimum", 0}}}}}};
141
4/8
✓ Branch 1 taken 75 times.
✓ Branch 2 taken 75 times.
✓ Branch 6 taken 150 times.
✓ Branch 7 taken 75 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
825 return {{"anyOf", Json::array({{{"type", "array"}}, shared})}};
142
63/154
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 35 times.
✓ Branch 12 taken 70 times.
✓ Branch 13 taken 35 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 21 taken 8 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 8 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 8 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 8 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 8 times.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 8 times.
✓ Branch 38 taken 16 times.
✓ Branch 39 taken 8 times.
✓ Branch 41 taken 75 times.
✗ Branch 42 not taken.
✓ Branch 44 taken 75 times.
✗ Branch 45 not taken.
✓ Branch 47 taken 75 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 75 times.
✗ Branch 51 not taken.
✓ Branch 53 taken 75 times.
✗ Branch 54 not taken.
✓ Branch 56 taken 75 times.
✗ Branch 57 not taken.
✓ Branch 59 taken 75 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 75 times.
✗ Branch 63 not taken.
✓ Branch 65 taken 75 times.
✗ Branch 66 not taken.
✓ Branch 68 taken 75 times.
✗ Branch 69 not taken.
✓ Branch 71 taken 75 times.
✗ Branch 72 not taken.
✓ Branch 74 taken 75 times.
✗ Branch 75 not taken.
✓ Branch 77 taken 75 times.
✗ Branch 78 not taken.
✓ Branch 81 taken 75 times.
✗ Branch 82 not taken.
✓ Branch 84 taken 75 times.
✗ Branch 85 not taken.
✓ Branch 87 taken 75 times.
✗ Branch 88 not taken.
✓ Branch 90 taken 75 times.
✗ Branch 91 not taken.
✓ Branch 93 taken 75 times.
✗ Branch 94 not taken.
✗ Branch 96 not taken.
✓ Branch 97 taken 75 times.
✓ Branch 98 taken 150 times.
✓ Branch 99 taken 75 times.
✓ Branch 100 taken 75 times.
✓ Branch 101 taken 75 times.
✓ Branch 102 taken 150 times.
✓ Branch 103 taken 75 times.
✓ Branch 104 taken 150 times.
✓ Branch 105 taken 75 times.
✓ Branch 106 taken 150 times.
✓ Branch 107 taken 75 times.
✓ Branch 108 taken 150 times.
✓ Branch 109 taken 75 times.
✓ Branch 110 taken 150 times.
✓ Branch 111 taken 75 times.
✓ Branch 112 taken 150 times.
✓ Branch 113 taken 75 times.
✓ Branch 115 taken 75 times.
✗ Branch 116 not taken.
✓ Branch 118 taken 75 times.
✗ Branch 119 not taken.
✓ Branch 121 taken 75 times.
✗ Branch 122 not taken.
✓ Branch 124 taken 75 times.
✗ Branch 125 not taken.
✓ Branch 127 taken 75 times.
✗ Branch 128 not taken.
✓ Branch 131 taken 75 times.
✗ Branch 132 not taken.
✓ Branch 134 taken 75 times.
✗ Branch 135 not taken.
✗ Branch 137 not taken.
✓ Branch 138 taken 75 times.
✓ Branch 139 taken 150 times.
✓ Branch 140 taken 75 times.
✓ Branch 141 taken 75 times.
✓ Branch 142 taken 75 times.
✓ Branch 143 taken 150 times.
✓ Branch 144 taken 75 times.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
✗ Branch 151 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
2229 }
143
144 65 Json SchemaDefinition(const SchemaDef& schema) {
145 65 Json properties = Json::object();
146
1/2
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
65 Json patterns = Json::object();
147
3/4
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 625 times.
✓ Branch 4 taken 65 times.
690 for (const AttributeDef* def : schema.AllAttributes()) {
148
1/2
✓ Branch 1 taken 625 times.
✗ Branch 2 not taken.
625 Json attribute = ValueSchema(*def);
149
2/4
✓ Branch 1 taken 625 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 625 times.
✗ Branch 5 not taken.
625 attribute["description"] = def->meta.doc;
150
3/4
✓ Branch 1 taken 625 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 550 times.
✓ Branch 4 taken 75 times.
625 if (const std::optional<Json> fallback = JsonFallback(schema, *def)) {
151
2/4
✓ Branch 1 taken 550 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 550 times.
✗ Branch 5 not taken.
550 attribute["default"] = *fallback;
152 ✗ }
153
2/2
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 621 times.
625 if (IsInstanced(def->name)) {
154
4/8
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
12 patterns["^" + Replace(Literal(def->name), kInstanceName, kInstancePattern) + "$"] =
155 12 std::move(attribute);
156 } else {
157
2/4
✓ Branch 2 taken 621 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 621 times.
✗ Branch 6 not taken.
621 properties[std::string(def->name)] = std::move(attribute);
158 }
159 625 }
160
3/4
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 67 times.
✓ Branch 4 taken 65 times.
132 for (const std::string_view space : OpenNamespaces(schema)) {
161
9/16
✓ Branch 1 taken 67 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 65 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 65 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 65 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 67 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 65 times.
✓ Branch 20 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
132 patterns[space == "*" ? std::string(".*") : "^" + Literal(space)] = Json::object();
162 65 }
163
2/4
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 65 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
260 Json definition{{"description", schema.doc}};
164 65 if (!properties.empty()) {
165
1/2
✓ Branch 2 taken 60 times.
✗ Branch 3 not taken.
60 definition["properties"] = std::move(properties);
166 }
167
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 20 times.
65 if (!patterns.empty()) {
168
1/2
✓ Branch 2 taken 45 times.
✗ Branch 3 not taken.
45 definition["patternProperties"] = std::move(patterns);
169 }
170
1/2
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
65 Json builtins = Json::array();
171
3/4
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 17 times.
✓ Branch 4 taken 65 times.
82 for (const std::string_view api : schema.AllBuiltinApis()) {
172
3/6
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 17 times.
✗ Branch 8 not taken.
17 builtins.push_back(Ref(ApiName::Parse(api).schema->name));
173 65 }
174
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 50 times.
65 if (!builtins.empty()) {
175
1/2
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
15 definition["allOf"] = std::move(builtins);
176 }
177 65 return definition;
178
8/16
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 65 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 65 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 65 times.
✓ Branch 12 taken 130 times.
✓ Branch 13 taken 65 times.
✓ Branch 14 taken 60 times.
✓ Branch 15 taken 5 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
325 }
179
180 1 Json XformOpsSchema() {
181
2/4
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
1 const Json vector = Array(Number({}, false), 3);
182 1 return {{"type", "object"},
183 {"description", "The prim's transform ops, as SetXform authors them."},
184 {"properties",
185 {{"translate", vector},
186 {"rotate", vector},
187 {"rotationOrder", {{"enum", {"XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"}}}},
188
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
2 {"orient", Array(Number({}, false), 4)},
189
2/4
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
4 {"scale", {{"anyOf", Json::array({Number({}, false), vector})}}}}},
190
2/4
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 4 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
41 {"additionalProperties", false}};
191
69/160
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 time.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
✓ Branch 32 taken 1 time.
✗ Branch 33 not taken.
✓ Branch 36 taken 1 time.
✗ Branch 37 not taken.
✓ Branch 39 taken 1 time.
✗ Branch 40 not taken.
✓ Branch 42 taken 1 time.
✗ Branch 43 not taken.
✓ Branch 45 taken 1 time.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 time.
✗ Branch 49 not taken.
✓ Branch 51 taken 1 time.
✗ Branch 52 not taken.
✓ Branch 54 taken 1 time.
✗ Branch 55 not taken.
✓ Branch 57 taken 1 time.
✗ Branch 58 not taken.
✓ Branch 60 taken 1 time.
✗ Branch 61 not taken.
✓ Branch 63 taken 1 time.
✗ Branch 64 not taken.
✓ Branch 66 taken 1 time.
✗ Branch 67 not taken.
✓ Branch 69 taken 1 time.
✗ Branch 70 not taken.
✓ Branch 72 taken 1 time.
✗ Branch 73 not taken.
✓ Branch 75 taken 1 time.
✗ Branch 76 not taken.
✓ Branch 78 taken 1 time.
✗ Branch 79 not taken.
✓ Branch 81 taken 1 time.
✗ Branch 82 not taken.
✓ Branch 84 taken 1 time.
✗ Branch 85 not taken.
✓ Branch 87 taken 1 time.
✗ Branch 88 not taken.
✓ Branch 90 taken 1 time.
✗ Branch 91 not taken.
✓ Branch 94 taken 1 time.
✗ Branch 95 not taken.
✓ Branch 97 taken 1 time.
✗ Branch 98 not taken.
✓ Branch 100 taken 1 time.
✗ Branch 101 not taken.
✓ Branch 103 taken 1 time.
✗ Branch 104 not taken.
✓ Branch 106 taken 1 time.
✗ Branch 107 not taken.
✓ Branch 109 taken 1 time.
✗ Branch 110 not taken.
✓ Branch 112 taken 1 time.
✗ Branch 113 not taken.
✓ Branch 116 taken 1 time.
✗ Branch 117 not taken.
✓ Branch 119 taken 1 time.
✗ Branch 120 not taken.
✓ Branch 121 taken 2 times.
✓ Branch 122 taken 1 time.
✓ Branch 123 taken 1 time.
✓ Branch 124 taken 2 times.
✓ Branch 125 taken 1 time.
✓ Branch 126 taken 5 times.
✓ Branch 127 taken 1 time.
✓ Branch 128 taken 2 times.
✓ Branch 129 taken 1 time.
✓ Branch 130 taken 1 time.
✓ Branch 131 taken 2 times.
✓ Branch 132 taken 1 time.
✓ Branch 133 taken 2 times.
✓ Branch 134 taken 1 time.
✓ Branch 135 taken 1 time.
✓ Branch 136 taken 2 times.
✓ Branch 137 taken 1 time.
✓ Branch 138 taken 1 time.
✓ Branch 139 taken 1 time.
✓ Branch 140 taken 2 times.
✓ Branch 141 taken 6 times.
✓ Branch 142 taken 1 time.
✓ Branch 143 taken 2 times.
✓ Branch 144 taken 1 time.
✓ Branch 145 taken 2 times.
✓ Branch 146 taken 1 time.
✓ Branch 147 taken 2 times.
✓ Branch 148 taken 1 time.
✓ Branch 149 taken 2 times.
✓ Branch 150 taken 1 time.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 164 not taken.
✗ Branch 165 not taken.
✗ Branch 167 not taken.
✗ Branch 168 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
50 }
192
193 /// @return When the prim's type is `name`, or it applies the API schema `name`, check it so.
194 54 Json Condition(const SchemaDef& schema) {
195 54 Json test;
196
2/2
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 15 times.
54 if (schema.kind == SchemaKind::Concrete) {
197
2/4
✓ Branch 2 taken 39 times.
✓ Branch 3 taken 39 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
117 test = {{"required", Json::array({kTypeName})},
198
2/4
✓ Branch 2 taken 39 times.
✓ Branch 3 taken 78 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
507 {"properties", {{kTypeName, {{"const", schema.name}}}}}};
199 } else {
200 15 const Json item = schema.kind == SchemaKind::SingleApply
201
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 1 time.
57 ? Json{{"const", schema.name}}
202
14/28
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 14 times.
✓ Branch 8 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 13 taken 14 times.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 14 times.
✓ Branch 16 taken 14 times.
✓ Branch 17 taken 1 time.
✓ Branch 18 taken 14 times.
✓ Branch 19 taken 14 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
65 : Json{{"pattern", "^" + Literal(schema.name) + ":"}};
203
2/4
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 15 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
45 test = {{"required", Json::array({kApis})},
204
2/4
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 30 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
195 {"properties", {{kApis, {{"contains", item}}}}}};
205 ✗ }
206
2/4
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 108 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
486 return {{"if", test}, {"then", Ref(schema.name)}};
207
81/194
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 39 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 39 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 39 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 39 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 39 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 39 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 39 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 39 times.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 39 times.
✓ Branch 42 taken 39 times.
✓ Branch 43 taken 78 times.
✓ Branch 44 taken 39 times.
✓ Branch 45 taken 39 times.
✓ Branch 46 taken 39 times.
✓ Branch 47 taken 78 times.
✓ Branch 48 taken 39 times.
✓ Branch 49 taken 39 times.
✓ Branch 50 taken 78 times.
✓ Branch 51 taken 39 times.
✓ Branch 52 taken 78 times.
✓ Branch 53 taken 39 times.
✓ Branch 55 taken 14 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 14 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 14 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 14 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 time.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 time.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 time.
✗ Branch 74 not taken.
✓ Branch 76 taken 1 time.
✗ Branch 77 not taken.
✓ Branch 79 taken 1 time.
✗ Branch 80 not taken.
✓ Branch 81 taken 1 time.
✓ Branch 82 taken 14 times.
✓ Branch 83 taken 2 times.
✓ Branch 84 taken 1 time.
✓ Branch 85 taken 1 time.
✓ Branch 86 taken 14 times.
✓ Branch 87 taken 14 times.
✓ Branch 88 taken 1 time.
✓ Branch 89 taken 28 times.
✓ Branch 90 taken 14 times.
✓ Branch 92 taken 15 times.
✗ Branch 93 not taken.
✓ Branch 95 taken 15 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 15 times.
✗ Branch 99 not taken.
✓ Branch 101 taken 15 times.
✗ Branch 102 not taken.
✓ Branch 104 taken 15 times.
✗ Branch 105 not taken.
✓ Branch 107 taken 15 times.
✗ Branch 108 not taken.
✓ Branch 110 taken 15 times.
✗ Branch 111 not taken.
✓ Branch 114 taken 15 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 15 times.
✗ Branch 118 not taken.
✓ Branch 120 taken 15 times.
✗ Branch 121 not taken.
✓ Branch 123 taken 15 times.
✗ Branch 124 not taken.
✓ Branch 126 taken 15 times.
✗ Branch 127 not taken.
✗ Branch 129 not taken.
✓ Branch 130 taken 15 times.
✓ Branch 131 taken 15 times.
✓ Branch 132 taken 30 times.
✓ Branch 133 taken 15 times.
✓ Branch 134 taken 15 times.
✓ Branch 135 taken 15 times.
✓ Branch 136 taken 30 times.
✓ Branch 137 taken 15 times.
✓ Branch 138 taken 15 times.
✓ Branch 139 taken 30 times.
✓ Branch 140 taken 15 times.
✓ Branch 141 taken 30 times.
✓ Branch 142 taken 15 times.
✓ Branch 145 taken 54 times.
✗ Branch 146 not taken.
✓ Branch 148 taken 54 times.
✗ Branch 149 not taken.
✓ Branch 151 taken 54 times.
✗ Branch 152 not taken.
✓ Branch 154 taken 54 times.
✗ Branch 155 not taken.
✓ Branch 157 taken 54 times.
✗ Branch 158 not taken.
✓ Branch 160 taken 54 times.
✗ Branch 161 not taken.
✓ Branch 163 taken 54 times.
✗ Branch 164 not taken.
✓ Branch 165 taken 108 times.
✓ Branch 166 taken 54 times.
✓ Branch 167 taken 108 times.
✓ Branch 168 taken 54 times.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 176 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 206 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 211 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 217 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 222 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 225 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 228 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 238 not taken.
✗ Branch 239 not taken.
✗ Branch 241 not taken.
✗ Branch 242 not taken.
✗ Branch 243 not taken.
✗ Branch 244 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 248 not taken.
✗ Branch 249 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
1441 }
208
209 1 Json PrimSchema() {
210
1/2
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
1 const std::string instanced = Join(Names(SchemaKind::MultipleApply), "|", Literal);
211 1 const Json api{
212
2/4
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
11 {"anyOf", Json::array({{{"enum", Names(SchemaKind::SingleApply)}},
213
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
2 {{"pattern", "^(" + instanced +
214
5/10
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
8 "):" + std::string(kInstancePattern) + "$"}}})}};
215 2 Json conditions = Json::array();
216 // A prim without a type takes attributes of any name.
217
4/8
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 2 times.
✓ Branch 15 taken 1 time.
✓ Branch 16 taken 1 time.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
22 conditions.push_back({{"if", {{"not", {{"required", Json::array({kTypeName})}}}}},
218 2 {"then", {{"patternProperties", {{".*", Json::object()}}}}}});
219
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 1 time.
66 for (const SchemaDef* schema : Schemas()) {
220
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 11 times.
65 if (schema->kind != SchemaKind::Abstract) {
221
2/4
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 54 times.
✗ Branch 5 not taken.
54 conditions.push_back(Condition(*schema));
222 }
223 }
224 1 return {{"type", "object"},
225 {"description", "A prim: its type, applied API schemas, transform and attributes."},
226 {"properties",
227 1 {{kTypeName, {{"enum", Names(SchemaKind::Concrete)}}},
228
2/4
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
2 {kApis, Array(api)},
229
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
2 {kXform, Ref("XformOps")}}},
230 {"patternProperties",
231
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
2 {{Literal(kTimeSamples) + "$",
232 {{"type", "object"},
233 {"description", "The attribute's values by time code."},
234 {"propertyNames", {{"pattern", "^-?[0-9]+(\\.[0-9]+)?([eE][-+]?[0-9]+)?$"}}}}}}},
235 {"allOf", std::move(conditions)},
236
2/4
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 6 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
46 {"unevaluatedProperties", false}};
237
148/350
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 time.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✓ Branch 37 taken 1 time.
✓ Branch 38 taken 1 time.
✓ Branch 39 taken 1 time.
✓ Branch 40 taken 2 times.
✓ Branch 41 taken 1 time.
✓ Branch 42 taken 1 time.
✓ Branch 43 taken 1 time.
✓ Branch 44 taken 2 times.
✓ Branch 45 taken 1 time.
✓ Branch 47 taken 1 time.
✗ Branch 48 not taken.
✓ Branch 50 taken 1 time.
✗ Branch 51 not taken.
✓ Branch 53 taken 1 time.
✗ Branch 54 not taken.
✓ Branch 56 taken 1 time.
✗ Branch 57 not taken.
✓ Branch 59 taken 1 time.
✗ Branch 60 not taken.
✓ Branch 62 taken 1 time.
✗ Branch 63 not taken.
✓ Branch 65 taken 1 time.
✗ Branch 66 not taken.
✓ Branch 68 taken 1 time.
✗ Branch 69 not taken.
✓ Branch 71 taken 1 time.
✗ Branch 72 not taken.
✓ Branch 74 taken 1 time.
✗ Branch 75 not taken.
✓ Branch 77 taken 1 time.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 time.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 time.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 time.
✗ Branch 87 not taken.
✓ Branch 89 taken 1 time.
✗ Branch 90 not taken.
✓ Branch 92 taken 1 time.
✗ Branch 93 not taken.
✓ Branch 95 taken 1 time.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 time.
✗ Branch 99 not taken.
✓ Branch 101 taken 1 time.
✗ Branch 102 not taken.
✓ Branch 104 taken 1 time.
✗ Branch 105 not taken.
✓ Branch 107 taken 1 time.
✗ Branch 108 not taken.
✓ Branch 109 taken 1 time.
✓ Branch 110 taken 2 times.
✓ Branch 111 taken 1 time.
✓ Branch 112 taken 1 time.
✓ Branch 113 taken 1 time.
✓ Branch 114 taken 2 times.
✓ Branch 115 taken 1 time.
✓ Branch 116 taken 1 time.
✓ Branch 117 taken 2 times.
✓ Branch 118 taken 1 time.
✓ Branch 119 taken 1 time.
✓ Branch 120 taken 2 times.
✓ Branch 121 taken 1 time.
✓ Branch 122 taken 1 time.
✓ Branch 123 taken 1 time.
✓ Branch 124 taken 2 times.
✓ Branch 125 taken 1 time.
✓ Branch 126 taken 1 time.
✓ Branch 127 taken 2 times.
✓ Branch 128 taken 1 time.
✓ Branch 130 taken 1 time.
✗ Branch 131 not taken.
✓ Branch 133 taken 1 time.
✗ Branch 134 not taken.
✓ Branch 136 taken 1 time.
✗ Branch 137 not taken.
✓ Branch 139 taken 1 time.
✗ Branch 140 not taken.
✓ Branch 142 taken 1 time.
✗ Branch 143 not taken.
✓ Branch 145 taken 1 time.
✗ Branch 146 not taken.
✓ Branch 148 taken 1 time.
✗ Branch 149 not taken.
✓ Branch 151 taken 1 time.
✗ Branch 152 not taken.
✓ Branch 154 taken 1 time.
✗ Branch 155 not taken.
✓ Branch 157 taken 1 time.
✗ Branch 158 not taken.
✓ Branch 160 taken 1 time.
✗ Branch 161 not taken.
✓ Branch 163 taken 1 time.
✗ Branch 164 not taken.
✓ Branch 166 taken 1 time.
✗ Branch 167 not taken.
✓ Branch 169 taken 1 time.
✗ Branch 170 not taken.
✓ Branch 172 taken 1 time.
✗ Branch 173 not taken.
✓ Branch 175 taken 1 time.
✗ Branch 176 not taken.
✓ Branch 178 taken 1 time.
✗ Branch 179 not taken.
✓ Branch 181 taken 1 time.
✗ Branch 182 not taken.
✓ Branch 184 taken 1 time.
✗ Branch 185 not taken.
✓ Branch 187 taken 1 time.
✗ Branch 188 not taken.
✓ Branch 190 taken 1 time.
✗ Branch 191 not taken.
✓ Branch 193 taken 1 time.
✗ Branch 194 not taken.
✓ Branch 196 taken 1 time.
✗ Branch 197 not taken.
✓ Branch 199 taken 1 time.
✗ Branch 200 not taken.
✓ Branch 202 taken 1 time.
✗ Branch 203 not taken.
✓ Branch 205 taken 1 time.
✗ Branch 206 not taken.
✓ Branch 208 taken 1 time.
✗ Branch 209 not taken.
✓ Branch 211 taken 1 time.
✗ Branch 212 not taken.
✓ Branch 214 taken 1 time.
✗ Branch 215 not taken.
✓ Branch 217 taken 1 time.
✗ Branch 218 not taken.
✓ Branch 220 taken 1 time.
✗ Branch 221 not taken.
✓ Branch 223 taken 1 time.
✗ Branch 224 not taken.
✓ Branch 226 taken 1 time.
✗ Branch 227 not taken.
✓ Branch 229 taken 1 time.
✗ Branch 230 not taken.
✓ Branch 232 taken 1 time.
✗ Branch 233 not taken.
✓ Branch 235 taken 1 time.
✗ Branch 236 not taken.
✓ Branch 238 taken 1 time.
✗ Branch 239 not taken.
✓ Branch 241 taken 1 time.
✗ Branch 242 not taken.
✓ Branch 244 taken 1 time.
✗ Branch 245 not taken.
✓ Branch 247 taken 1 time.
✗ Branch 248 not taken.
✓ Branch 250 taken 1 time.
✗ Branch 251 not taken.
✓ Branch 254 taken 1 time.
✗ Branch 255 not taken.
✓ Branch 257 taken 1 time.
✗ Branch 258 not taken.
✓ Branch 261 taken 1 time.
✗ Branch 262 not taken.
✓ Branch 264 taken 1 time.
✗ Branch 265 not taken.
✓ Branch 266 taken 2 times.
✓ Branch 267 taken 1 time.
✓ Branch 268 taken 2 times.
✓ Branch 269 taken 1 time.
✓ Branch 270 taken 1 time.
✓ Branch 271 taken 2 times.
✓ Branch 272 taken 1 time.
✓ Branch 273 taken 1 time.
✓ Branch 274 taken 1 time.
✓ Branch 275 taken 2 times.
✓ Branch 276 taken 1 time.
✓ Branch 277 taken 3 times.
✓ Branch 278 taken 1 time.
✓ Branch 279 taken 2 times.
✓ Branch 280 taken 1 time.
✓ Branch 281 taken 1 time.
✓ Branch 282 taken 2 times.
✓ Branch 283 taken 1 time.
✓ Branch 284 taken 2 times.
✓ Branch 285 taken 1 time.
✓ Branch 286 taken 2 times.
✓ Branch 287 taken 1 time.
✓ Branch 289 taken 1 time.
✓ Branch 290 taken 2 times.
✓ Branch 291 taken 1 time.
✓ Branch 292 taken 3 times.
✓ Branch 293 taken 2 times.
✓ Branch 294 taken 1 time.
✓ Branch 295 taken 2 times.
✓ Branch 296 taken 1 time.
✓ Branch 297 taken 1 time.
✓ Branch 298 taken 2 times.
✓ Branch 299 taken 1 time.
✓ Branch 300 taken 1 time.
✓ Branch 301 taken 2 times.
✓ Branch 302 taken 1 time.
✓ Branch 303 taken 2 times.
✓ Branch 304 taken 1 time.
✓ Branch 305 taken 2 times.
✓ Branch 306 taken 1 time.
✗ Branch 310 not taken.
✗ Branch 311 not taken.
✗ Branch 312 not taken.
✗ Branch 313 not taken.
✗ Branch 314 not taken.
✗ Branch 315 not taken.
✗ Branch 316 not taken.
✗ Branch 317 not taken.
✗ Branch 319 not taken.
✗ Branch 320 not taken.
✗ Branch 321 not taken.
✗ Branch 322 not taken.
✗ Branch 323 not taken.
✗ Branch 324 not taken.
✗ Branch 326 not taken.
✗ Branch 327 not taken.
✗ Branch 329 not taken.
✗ Branch 330 not taken.
✗ Branch 332 not taken.
✗ Branch 333 not taken.
✗ Branch 334 not taken.
✗ Branch 335 not taken.
✗ Branch 336 not taken.
✗ Branch 337 not taken.
✗ Branch 338 not taken.
✗ Branch 339 not taken.
✗ Branch 340 not taken.
✗ Branch 341 not taken.
✗ Branch 342 not taken.
✗ Branch 343 not taken.
✗ Branch 345 not taken.
✗ Branch 346 not taken.
✗ Branch 348 not taken.
✗ Branch 349 not taken.
✗ Branch 351 not taken.
✗ Branch 352 not taken.
✗ Branch 353 not taken.
✗ Branch 354 not taken.
✗ Branch 355 not taken.
✗ Branch 356 not taken.
✗ Branch 357 not taken.
✗ Branch 358 not taken.
✗ Branch 359 not taken.
✗ Branch 360 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✗ Branch 364 not taken.
✗ Branch 365 not taken.
✗ Branch 367 not taken.
✗ Branch 368 not taken.
✗ Branch 370 not taken.
✗ Branch 371 not taken.
✗ Branch 373 not taken.
✗ Branch 374 not taken.
✗ Branch 375 not taken.
✗ Branch 376 not taken.
✗ Branch 377 not taken.
✗ Branch 378 not taken.
✗ Branch 379 not taken.
✗ Branch 380 not taken.
✗ Branch 381 not taken.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 384 not taken.
✗ Branch 385 not taken.
✗ Branch 386 not taken.
✗ Branch 387 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 390 not taken.
✗ Branch 391 not taken.
✗ Branch 392 not taken.
✗ Branch 394 not taken.
✗ Branch 395 not taken.
✗ Branch 397 not taken.
✗ Branch 398 not taken.
✗ Branch 399 not taken.
✗ Branch 400 not taken.
✗ Branch 402 not taken.
✗ Branch 403 not taken.
✗ Branch 404 not taken.
✗ Branch 405 not taken.
✗ Branch 407 not taken.
✗ Branch 408 not taken.
✗ Branch 411 not taken.
✗ Branch 412 not taken.
✗ Branch 414 not taken.
✗ Branch 415 not taken.
✗ Branch 417 not taken.
✗ Branch 418 not taken.
✗ Branch 419 not taken.
✗ Branch 420 not taken.
✗ Branch 421 not taken.
✗ Branch 422 not taken.
✗ Branch 423 not taken.
✗ Branch 424 not taken.
✗ Branch 426 not taken.
✗ Branch 427 not taken.
✗ Branch 428 not taken.
✗ Branch 429 not taken.
✗ Branch 431 not taken.
✗ Branch 432 not taken.
✗ Branch 433 not taken.
✗ Branch 434 not taken.
✗ Branch 435 not taken.
✗ Branch 436 not taken.
✗ Branch 437 not taken.
✗ Branch 438 not taken.
✗ Branch 440 not taken.
✗ Branch 441 not taken.
✗ Branch 443 not taken.
✗ Branch 444 not taken.
✗ Branch 446 not taken.
✗ Branch 447 not taken.
✗ Branch 449 not taken.
✗ Branch 450 not taken.
✗ Branch 451 not taken.
✗ Branch 452 not taken.
✗ Branch 454 not taken.
✗ Branch 455 not taken.
✗ Branch 456 not taken.
✗ Branch 457 not taken.
✗ Branch 459 not taken.
✗ Branch 460 not taken.
106 }
238
239 // The reference pages.
240
241 53 std::string Anchor(std::string_view schema) {
242 53 return ToLower(schema);
243 }
244
245 53 std::string Link(std::string_view schema, const SchemaFamily& from) {
246 53 const SchemaFamily* family = FindFamily(schema);
247 53 const std::string page =
248
4/6
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 15 times.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 53 times.
✗ Branch 9 not taken.
68 family == nullptr || family == &from ? std::string() : std::string(family->name) + ".md";
249
5/10
✓ Branch 1 taken 53 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 53 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 53 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 53 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 53 times.
✗ Branch 14 not taken.
212 return "[" + std::string(schema) + "](" + page + "#" + Anchor(schema) + ")";
250 53 }
251
252 /// @return The type a reference page shows: USD's, with relationship lists and array shapes
253 /// spelt out.
254 305 std::string TypeText(const AttributeDef& def) {
255 305 const AttributeMeta& meta = def.meta;
256
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 297 times.
305 if (def.type == ColumnType::Relationships) {
257 8 return "rel[]";
258 }
259
6/6
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 252 times.
✓ Branch 2 taken 31 times.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 26 times.
✓ Branch 5 taken 5 times.
297 if (def.type != ColumnType::Tensor || (meta.components == 0 && meta.ranks.empty())) {
260 278 return UsdTypeName(def);
261 }
262
2/4
✓ Branch 0 taken 19 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
38 const std::string element = meta.bytes ? "uchar" : meta.integer ? "int" : "float";
263
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 5 times.
19 if (meta.components != 0) {
264
2/4
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
28 return element + "[n, " + std::to_string(meta.components) + "]";
265 }
266
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
10 return element + " tensor, rank " +
267
3/6
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
21 Join(meta.ranks, " or ", [](std::int64_t rank) { return std::to_string(rank); });
268 19 }
269
270 305 std::string ValuesText(const AttributeMeta& meta) {
271 305 std::vector<std::string> values;
272
2/2
✓ Branch 0 taken 158 times.
✓ Branch 1 taken 305 times.
463 for (const std::string_view option : meta.options) {
273
3/6
✓ Branch 1 taken 158 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 158 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 158 times.
✗ Branch 8 not taken.
316 values.push_back("`" + std::string(option) + "`");
274 }
275
2/2
✓ Branch 0 taken 122 times.
✓ Branch 1 taken 183 times.
305 if (meta.lower) {
276
4/6
✓ Branch 1 taken 122 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 102 times.
✓ Branch 4 taken 20 times.
✓ Branch 6 taken 122 times.
✗ Branch 7 not taken.
346 values.push_back((meta.lower->exclusive ? "> " : "≥ ") + ToText(meta.lower->value));
277 }
278
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 287 times.
305 if (meta.upper) {
279
4/6
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 18 times.
✗ Branch 7 not taken.
52 values.push_back((meta.upper->exclusive ? "< " : "≤ ") + ToText(meta.upper->value));
280 }
281
1/2
✓ Branch 1 taken 305 times.
✗ Branch 2 not taken.
610 return Join(values, ", ");
282 305 }
283
284 576 std::string Cell(std::string_view text) {
285
1/2
✓ Branch 2 taken 576 times.
✗ Branch 3 not taken.
1152 return Replace(Replace(text, "|", "\\|"), "\n", " ");
286 }
287
288 316 std::string Code(const std::optional<Json>& json) {
289
13/24
✓ Branch 0 taken 271 times.
✓ Branch 1 taken 45 times.
✓ Branch 3 taken 271 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 271 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 271 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 271 times.
✗ Branch 13 not taken.
✓ Branch 16 taken 45 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 271 times.
✓ Branch 19 taken 45 times.
✓ Branch 20 taken 271 times.
✓ Branch 21 taken 45 times.
✓ Branch 22 taken 271 times.
✓ Branch 23 taken 45 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
1129 return json ? "`" + Cell(json->dump()) + "`" : "";
290 }
291
292 65 std::string KindText(const SchemaDef& schema) {
293
4/4
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 39 times.
✓ Branch 2 taken 14 times.
✓ Branch 3 taken 1 time.
65 switch (schema.kind) {
294 11 case SchemaKind::Abstract:
295 11 return "Abstract base";
296 39 case SchemaKind::Concrete:
297 39 return "Prim type";
298 14 case SchemaKind::SingleApply:
299 14 return "API schema";
300 case SchemaKind::MultipleApply:
301 break;
302 }
303
1/2
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
2 return "Multiple-apply API schema, applied as `" + std::string(schema.name) + ":<name>`";
304 }
305
306 65 std::string SchemaSection(const SchemaDef& schema, const SchemaFamily& family) {
307
3/6
✓ Branch 2 taken 65 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 65 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 65 times.
✗ Branch 9 not taken.
195 std::string out = "## " + std::string(schema.name) + "\n\n" + std::string(schema.doc) + "\n\n";
308
1/2
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
65 std::string facts = KindText(schema);
309
2/2
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 22 times.
65 if (schema.base != nullptr) {
310
2/4
✓ Branch 1 taken 43 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 43 times.
✗ Branch 5 not taken.
86 facts += " · Inherits " + Link(schema.base->name, family);
311 }
312
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 65 times.
73 for (const std::string_view api : schema.builtinApis) {
313
3/6
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
16 facts += " · Built in: " + Link(ApiName::Parse(api).schema->name, family);
314 }
315
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 65 times.
67 for (const std::string_view type : schema.appliesTo) {
316
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 facts += " · Applies to " + Link(type, family);
317 }
318 65 out += facts + "\n\n";
319
2/2
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 9 times.
65 if (!schema.attributes.empty()) {
320
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
56 out += "| Attribute | Type | Description | Fallback | Values | Source |\n"
321 56 "|---|---|---|---|---|---|\n";
322
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
56 const std::string usd =
323
4/8
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 11 not taken.
168 "[" + std::string(family.usdModule) + "](" + std::string(family.usdUrl) + ")";
324
2/2
✓ Branch 0 taken 305 times.
✓ Branch 1 taken 56 times.
361 for (const AttributeDef& def : schema.attributes) {
325
5/6
✓ Branch 1 taken 305 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 198 times.
✓ Branch 4 taken 107 times.
✓ Branch 6 taken 30 times.
✓ Branch 7 taken 168 times.
305 const bool ernie = IsErnieSchema(schema.name) || def.name.starts_with("ernie:");
326
6/12
✓ Branch 1 taken 137 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 305 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 305 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 305 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 305 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 305 times.
✗ Branch 17 not taken.
1357 out += "| `" + std::string(def.name) + "` | " + TypeText(def) + " | " +
327
5/10
✓ Branch 1 taken 305 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 305 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 305 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 305 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 305 times.
✗ Branch 14 not taken.
1525 Cell(def.meta.doc) + " | " + Code(JsonFallback(schema, def)) + " | " +
328
5/10
✓ Branch 1 taken 137 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 168 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 305 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 305 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 305 times.
✗ Branch 14 not taken.
1525 ValuesText(def.meta) + " | " + (ernie ? std::string("Ernie") : usd) + " |\n";
329 }
330
1/2
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
56 out += "\n";
331 56 }
332
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 59 times.
65 if (!schema.fallbackOverrides.empty()) {
333
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 out +=
334
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 "Fallbacks it changes: " +
335
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 Join(schema.fallbackOverrides, "; ",
336 17 [](const auto& entry) {
337
4/8
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 11 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 11 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 11 times.
✗ Branch 12 not taken.
33 return "`" + std::string(entry.first) + "` " + Code(JsonValue(entry.second));
338
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
18 }) +
339 6 ".\n\n";
340 }
341
3/4
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 11 times.
65 if (const std::string example = ExampleScene(schema); !example.empty()) {
342
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
108 out += "```json\n" + example + "```\n\n";
343 ✗ }
344 65 return out;
345
2/4
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 54 times.
✗ Branch 5 not taken.
184 }
346
347 } // namespace
348
349 516 const SchemaFamily* FindFamily(std::string_view schema) {
350 3637 const auto in = [&](const std::vector<const SchemaDef*>& schemas) {
351 3121 return std::ranges::find(schemas, schema, &SchemaDef::name) != schemas.end();
352 516 };
353
1/2
✓ Branch 1 taken 1744 times.
✗ Branch 2 not taken.
1744 for (const SchemaFamily& family : SchemaFamilies()) {
354
4/4
✓ Branch 1 taken 1377 times.
✓ Branch 2 taken 367 times.
✓ Branch 4 taken 149 times.
✓ Branch 5 taken 1228 times.
1744 if (in(family.usd) || in(family.ernie)) {
355 516 return &family;
356 }
357 }
358 ✗ return nullptr;
359 }
360
361 456 bool IsErnieSchema(std::string_view schema) {
362 456 const SchemaFamily* family = FindFamily(schema);
363
3/4
✓ Branch 0 taken 456 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 307 times.
✓ Branch 3 taken 149 times.
912 return family != nullptr &&
364
2/2
✓ Branch 1 taken 307 times.
✓ Branch 2 taken 149 times.
456 std::ranges::find(family->ernie, schema, &SchemaDef::name) != family->ernie.end();
365 }
366
367 1 std::string SceneJsonSchema() {
368 1 Json defs = Json::object();
369
2/4
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
1 defs["Prim"] = PrimSchema();
370
2/4
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
1 defs["XformOps"] = XformOpsSchema();
371
3/4
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 3 taken 65 times.
✓ Branch 4 taken 1 time.
66 for (const SchemaDef* schema : Schemas()) {
372
3/6
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 65 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 65 times.
✗ Branch 8 not taken.
65 defs[std::string(schema->name)] = SchemaDefinition(*schema);
373 }
374 1 Json root{{"$schema", "https://json-schema.org/draft/2020-12/schema"},
375 {"$id", kSceneSchemaUrl},
376 {"title", "Ernie scene"},
377 {"description", "A scene file: prims by path, each with its type, API schemas and "
378 "attributes by USD name."},
379 {"type", "object"},
380
2/4
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
3 {"required", Json::array({"prims"})},
381 {"properties",
382 1 {{"$schema", String()},
383 {"prims",
384 {{"type", "object"},
385 {"propertyNames", {{"pattern", "^/"}}},
386
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
2 {"additionalProperties", Ref("Prim")}}}}},
387 {"additionalProperties", false},
388
2/4
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 9 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
46 {"$defs", std::move(defs)}};
389 1 return PrintJson(root);
390
82/196
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 time.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 time.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 time.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 time.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 time.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 time.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 time.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 time.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 time.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 time.
✗ Branch 62 not taken.
✓ Branch 64 taken 1 time.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 time.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 time.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 time.
✗ Branch 74 not taken.
✓ Branch 76 taken 1 time.
✗ Branch 77 not taken.
✓ Branch 79 taken 1 time.
✗ Branch 80 not taken.
✓ Branch 82 taken 1 time.
✗ Branch 83 not taken.
✓ Branch 85 taken 1 time.
✗ Branch 86 not taken.
✓ Branch 88 taken 1 time.
✗ Branch 89 not taken.
✓ Branch 91 taken 1 time.
✗ Branch 92 not taken.
✓ Branch 94 taken 1 time.
✗ Branch 95 not taken.
✓ Branch 97 taken 1 time.
✗ Branch 98 not taken.
✓ Branch 100 taken 1 time.
✗ Branch 101 not taken.
✓ Branch 103 taken 1 time.
✗ Branch 104 not taken.
✓ Branch 106 taken 1 time.
✗ Branch 107 not taken.
✓ Branch 109 taken 1 time.
✗ Branch 110 not taken.
✓ Branch 112 taken 1 time.
✗ Branch 113 not taken.
✓ Branch 115 taken 1 time.
✗ Branch 116 not taken.
✓ Branch 118 taken 1 time.
✗ Branch 119 not taken.
✓ Branch 121 taken 1 time.
✗ Branch 122 not taken.
✓ Branch 125 taken 1 time.
✗ Branch 126 not taken.
✓ Branch 128 taken 1 time.
✗ Branch 129 not taken.
✓ Branch 132 taken 1 time.
✗ Branch 133 not taken.
✓ Branch 135 taken 1 time.
✗ Branch 136 not taken.
✓ Branch 137 taken 2 times.
✓ Branch 138 taken 1 time.
✓ Branch 139 taken 2 times.
✓ Branch 140 taken 1 time.
✓ Branch 141 taken 1 time.
✓ Branch 142 taken 2 times.
✓ Branch 143 taken 1 time.
✓ Branch 144 taken 2 times.
✓ Branch 145 taken 1 time.
✓ Branch 146 taken 2 times.
✓ Branch 147 taken 1 time.
✓ Branch 148 taken 3 times.
✓ Branch 149 taken 2 times.
✓ Branch 150 taken 1 time.
✓ Branch 151 taken 1 time.
✓ Branch 152 taken 2 times.
✓ Branch 153 taken 1 time.
✓ Branch 154 taken 1 time.
✓ Branch 155 taken 2 times.
✓ Branch 156 taken 1 time.
✓ Branch 157 taken 2 times.
✓ Branch 158 taken 1 time.
✓ Branch 159 taken 2 times.
✓ Branch 160 taken 1 time.
✓ Branch 161 taken 2 times.
✓ Branch 162 taken 1 time.
✓ Branch 163 taken 2 times.
✓ Branch 164 taken 1 time.
✓ Branch 165 taken 2 times.
✓ Branch 166 taken 1 time.
✓ Branch 167 taken 2 times.
✓ Branch 168 taken 1 time.
✓ Branch 169 taken 2 times.
✓ Branch 170 taken 1 time.
✓ Branch 171 taken 2 times.
✓ Branch 172 taken 1 time.
✓ Branch 174 taken 1 time.
✗ Branch 175 not taken.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✗ Branch 180 not taken.
✗ Branch 181 not taken.
✗ Branch 182 not taken.
✗ Branch 183 not taken.
✗ Branch 184 not taken.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
✗ Branch 188 not taken.
✗ Branch 189 not taken.
✗ Branch 190 not taken.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✗ Branch 193 not taken.
✗ Branch 195 not taken.
✗ Branch 196 not taken.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 204 not taken.
✗ Branch 205 not taken.
✗ Branch 207 not taken.
✗ Branch 208 not taken.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✗ Branch 218 not taken.
✗ Branch 219 not taken.
✗ Branch 220 not taken.
✗ Branch 221 not taken.
✗ Branch 223 not taken.
✗ Branch 224 not taken.
✗ Branch 226 not taken.
✗ Branch 227 not taken.
✗ Branch 229 not taken.
✗ Branch 230 not taken.
✗ Branch 231 not taken.
✗ Branch 232 not taken.
✗ Branch 234 not taken.
✗ Branch 235 not taken.
✗ Branch 236 not taken.
✗ Branch 237 not taken.
✗ Branch 239 not taken.
✗ Branch 240 not taken.
✗ Branch 241 not taken.
✗ Branch 242 not taken.
✗ Branch 244 not taken.
✗ Branch 245 not taken.
✗ Branch 246 not taken.
✗ Branch 247 not taken.
✗ Branch 249 not taken.
✗ Branch 250 not taken.
✗ Branch 251 not taken.
✗ Branch 252 not taken.
✗ Branch 254 not taken.
✗ Branch 255 not taken.
✗ Branch 256 not taken.
✗ Branch 257 not taken.
✗ Branch 259 not taken.
✗ Branch 260 not taken.
50 }
391
392 8 std::string ReferencePage(const SchemaFamily& family) {
393
2/4
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
24 std::string out = "# " + std::string(family.title) + "\n\n" +
394 8 "Generated from the schema registry by `ernie schema --markdown`.\n\n";
395
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 for (const auto* schemas : {&family.usd, &family.ernie}) {
396
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 16 times.
81 for (const SchemaDef* schema : *schemas) {
397
1/2
✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
130 out += SchemaSection(*schema, family);
398 }
399 }
400 8 return out;
401 ✗ }
402
403 130 std::string ExampleScene(const SchemaDef& schema) {
404
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 108 times.
130 if (schema.kind == SchemaKind::Abstract) {
405 22 return {};
406 }
407 108 const bool api = schema.kind != SchemaKind::Concrete;
408
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 106 times.
108 const ApiName name{&schema, schema.kind == SchemaKind::MultipleApply ? kExampleInstance : ""};
409 108 Json prim = Json::object();
410
1/2
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
108 prim[kTypeName] =
411
5/6
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 78 times.
✓ Branch 2 taken 26 times.
✓ Branch 3 taken 4 times.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
216 api ? (schema.appliesTo.empty() ? "Xform" : schema.appliesTo.front()) : schema.name;
412
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 78 times.
108 if (api) {
413
4/8
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 30 times.
✓ Branch 9 taken 30 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
120 prim[kApis] = Json::array({name.ToString()});
414 }
415
2/2
✓ Branch 0 taken 536 times.
✓ Branch 1 taken 108 times.
644 for (const AttributeDef& def : schema.attributes) {
416
1/2
✓ Branch 1 taken 536 times.
✗ Branch 2 not taken.
536 const std::optional<Json> fallback = JsonFallback(schema, def);
417 // Arrays, targets and empty tokens have nothing to show.
418
2/2
✓ Branch 0 taken 436 times.
✓ Branch 1 taken 22 times.
458 const bool shown = fallback && def.type != ColumnType::Tensor &&
419 def.type != ColumnType::Relationship &&
420
5/6
✓ Branch 0 taken 458 times.
✓ Branch 1 taken 78 times.
✓ Branch 3 taken 436 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 388 times.
✓ Branch 7 taken 48 times.
1360 def.type != ColumnType::Relationships && *fallback != Json("");
421
2/2
✓ Branch 0 taken 388 times.
✓ Branch 1 taken 148 times.
536 if (shown) {
422
3/6
✓ Branch 1 taken 388 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 388 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 388 times.
✗ Branch 8 not taken.
388 prim[name.Attribute(def.name)] = *fallback;
423 }
424 536 }
425
1/2
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
108 Json prims = Json::object();
426
3/6
✓ Branch 2 taken 108 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 108 times.
✗ Branch 9 not taken.
108 prims["/World/" + std::string(schema.name)] = std::move(prim);
427
2/4
✓ Branch 2 taken 108 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
108 return PrintJson(SceneFile(std::move(prims)));
428
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
138 }
429
430 425 std::string UsdTypeName(const AttributeDef& def) {
431 425 static constexpr std::array<std::string_view, 14> kTypes{
432 "bool", "int", "double", "double2", "double3", "double4", "quatd",
433 "matrix4d", "token", "rel", "rel", "float[]", "token[]", ""};
434 425 const AttributeMeta& meta = def.meta;
435
4/4
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 97 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 280 times.
425 switch (def.type) {
436 11 case ColumnType::Vec3:
437
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
11 return meta.color ? "color3d" : "double3";
438 97 case ColumnType::TokenValue:
439
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 16 times.
178 return meta.asset ? "asset" : "token";
440 37 case ColumnType::Tensor: {
441
4/4
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 14 times.
58 const std::string element = meta.bytes ? "uchar" : meta.integer ? "int" : "float";
442
4/6
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 36 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 37 times.
✗ Branch 8 not taken.
74 return element + (meta.components > 1 ? std::to_string(meta.components) : "") + "[]";
443 37 }
444 280 default:
445 280 return std::string(kTypes[static_cast<std::size_t>(def.type)]);
446 }
447 }
448
449 } // namespace ernie
450