| 907 | } |
| 908 | |
| 909 | void testArrayCollapsedNoChildren() { |
| 910 | // Collapsed array: header only, no children or footer |
| 911 | NodeTree tree; |
| 912 | tree.baseAddress = 0; |
| 913 | |
| 914 | Node root; |
| 915 | root.kind = NodeKind::Struct; |
| 916 | root.name = "Root"; |
| 917 | root.parentId = 0; |
| 918 | int ri = tree.addNode(root); |
| 919 | uint64_t rootId = tree.nodes[ri].id; |
| 920 | |
| 921 | Node arr; |
| 922 | arr.kind = NodeKind::Array; |
| 923 | arr.name = "data"; |
| 924 | arr.parentId = rootId; |
| 925 | arr.offset = 0; |
| 926 | arr.elementKind = NodeKind::Float; |
| 927 | arr.arrayLen = 100; |
| 928 | arr.collapsed = true; |
| 929 | int ai = tree.addNode(arr); |
| 930 | uint64_t arrId = tree.nodes[ai].id; |
| 931 | |
| 932 | // Child that should NOT appear when collapsed |
| 933 | Node child; |
| 934 | child.kind = NodeKind::Float; |
| 935 | child.name = "elem"; |
| 936 | child.parentId = arrId; |
| 937 | child.offset = 0; |
| 938 | tree.addNode(child); |
| 939 | |
| 940 | NullProvider prov; |
| 941 | ComposeResult result = compose(tree, prov); |
| 942 | |
| 943 | // CommandRow + Array header(collapsed) + root footer = 3 |
| 944 | QCOMPARE(result.meta.size(), 3); |
| 945 | |
| 946 | // Array header is collapsed (at index 1) |
| 947 | int arrLine = -1; |
| 948 | for (int i = 0; i < result.meta.size(); i++) { |
| 949 | if (result.meta[i].isArrayHeader) { arrLine = i; break; } |
| 950 | } |
| 951 | QVERIFY(arrLine >= 0); |
| 952 | QCOMPARE(arrLine, 1); |
| 953 | QVERIFY(result.meta[arrLine].foldCollapsed); |
| 954 | |
| 955 | // Header text should NOT contain "{" |
| 956 | QStringList lines = result.text.split('\n'); |
| 957 | QVERIFY2(!lines[arrLine].contains("{"), |
| 958 | qPrintable("Collapsed header should not have '{': " + lines[arrLine])); |
| 959 | } |
| 960 | |
| 961 | void testArrayCountRecompose() { |
| 962 | // After changing arrayLen and recomposing, the text shows the new count |