@@ -165,3 +165,46 @@ fn test_append_flat_empty_source_is_noop() {
165165 assert dst.flat.edges.len == pre_edges
166166 assert dst.flat.files.len == pre_files
167167}
168+
169+ fn test_copy_subtree_from_preserves_stmt_shape_and_strings () {
170+ mut src := new_flat_builder ()
171+ imp_id := src.emit_stmt (Stmt (ImportStmt{
172+ name: 'os'
173+ alias: 'myos'
174+ is_aliased: true
175+ }))
176+ dir_id := src.emit_stmt (Stmt (Directive{
177+ name: 'flag'
178+ value: '-lm'
179+ }))
180+ for_id := src.emit_stmt (make_for_with_idents (['alpha' , 'beta' ]))
181+
182+ mut dst := seeded_dst ()
183+ copied_imp := dst.copy_subtree_from (& src.flat, imp_id)
184+ copied_dir := dst.copy_subtree_from (& src.flat, dir_id)
185+ copied_for := dst.copy_subtree_from (& src.flat, for_id)
186+
187+ assert dst.flat.subtree_signature (copied_for) == src.flat.subtree_signature (for_id)
188+
189+ merged_imp := Cursor{
190+ flat: & dst.flat
191+ id: copied_imp
192+ }.stmt () as ImportStmt
193+ assert merged_imp.name == 'os'
194+ assert merged_imp.alias == 'myos'
195+ assert merged_imp.is_aliased
196+
197+ merged_dir := Cursor{
198+ flat: & dst.flat
199+ id: copied_dir
200+ }.stmt () as Directive
201+ assert merged_dir.name == 'flag'
202+ assert merged_dir.value == '-lm'
203+ }
204+
205+ fn test_copy_subtree_from_invalid_root_returns_invalid () {
206+ mut src := new_flat_builder ()
207+ mut dst := new_flat_builder ()
208+ assert dst.copy_subtree_from (& src.flat, - 1 ) == invalid_flat_node_id
209+ assert dst.copy_subtree_from (& src.flat, 100 ) == invalid_flat_node_id
210+ }
0 commit comments