| 257 | } |
| 258 | |
| 259 | void testNestedStruct() { |
| 260 | NodeTree tree; |
| 261 | tree.baseAddress = 0; |
| 262 | |
| 263 | Node root; |
| 264 | root.kind = NodeKind::Struct; |
| 265 | root.name = "Outer"; |
| 266 | root.parentId = 0; |
| 267 | root.offset = 0; |
| 268 | int ri = tree.addNode(root); |
| 269 | uint64_t rootId = tree.nodes[ri].id; |
| 270 | |
| 271 | Node f1; |
| 272 | f1.kind = NodeKind::UInt32; |
| 273 | f1.name = "flags"; |
| 274 | f1.parentId = rootId; |
| 275 | f1.offset = 0; |
| 276 | tree.addNode(f1); |
| 277 | |
| 278 | Node inner; |
| 279 | inner.kind = NodeKind::Struct; |
| 280 | inner.name = "Inner"; |
| 281 | inner.parentId = rootId; |
| 282 | inner.offset = 4; |
| 283 | int ii = tree.addNode(inner); |
| 284 | uint64_t innerId = tree.nodes[ii].id; |
| 285 | |
| 286 | Node f2; |
| 287 | f2.kind = NodeKind::UInt16; |
| 288 | f2.name = "x"; |
| 289 | f2.parentId = innerId; |
| 290 | f2.offset = 0; |
| 291 | tree.addNode(f2); |
| 292 | |
| 293 | Node f3; |
| 294 | f3.kind = NodeKind::UInt16; |
| 295 | f3.name = "y"; |
| 296 | f3.parentId = innerId; |
| 297 | f3.offset = 2; |
| 298 | tree.addNode(f3); |
| 299 | |
| 300 | NullProvider prov; |
| 301 | ComposeResult result = compose(tree, prov); |
| 302 | |
| 303 | // CommandRow + flags + Inner header + x + y + Inner footer + root footer = 7 |
| 304 | QCOMPARE(result.meta.size(), 7); |
| 305 | |
| 306 | // flags field (depth 1) |
| 307 | QCOMPARE(result.meta[1].lineKind, LineKind::Field); |
| 308 | QCOMPARE(result.meta[1].depth, 1); |
| 309 | |
| 310 | // Inner header (depth 1, fold head) |
| 311 | QCOMPARE(result.meta[2].lineKind, LineKind::Header); |
| 312 | QCOMPARE(result.meta[2].depth, 1); |
| 313 | QVERIFY(result.meta[2].foldHead); |
| 314 | QCOMPARE(result.meta[2].foldLevel, 0x401 | 0x2000); |
| 315 | |
| 316 | // Inner fields at depth 2 |