File: test_deep_clone.py

package info (click to toggle)
python-libcst 1.4.0-1.2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,928 kB
  • sloc: python: 76,235; makefile: 10; sh: 2
file content (54 lines) | stat: -rw-r--r-- 1,646 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from textwrap import dedent
from typing import Set

import libcst as cst
from libcst.testing.utils import data_provider, UnitTest


class DeepCloneTest(UnitTest):
    @data_provider(
        (
            # Simple program
            (
                """
                foo = 'toplevel'
                fn1(foo)
                fn2(foo)
                def fn_def():
                    foo = 'shadow'
                    fn3(foo)
            """,
            ),
        )
    )
    def test_deep_clone(self, code: str) -> None:
        test_case = self

        class NodeGatherVisitor(cst.CSTVisitor):
            def __init__(self) -> None:
                self.nodes: Set[int] = set()

            def on_visit(self, node: cst.CSTNode) -> bool:
                self.nodes.add(id(node))
                return True

        class NodeVerifyVisitor(cst.CSTVisitor):
            def __init__(self, nodes: Set[int]) -> None:
                self.nodes = nodes

            def on_visit(self, node: cst.CSTNode) -> bool:
                test_case.assertFalse(
                    id(node) in self.nodes, f"Node {node} was not cloned properly!"
                )
                return True

        module = cst.parse_module(dedent(code))
        gatherer = NodeGatherVisitor()
        module.visit(gatherer)
        new_module = module.deep_clone()
        self.assertTrue(module.deep_equals(new_module))
        new_module.visit(NodeVerifyVisitor(gatherer.nodes))