# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from collections import Counter
from textwrap import dedent

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


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

        class CountVisitor(cst.CSTVisitor):
            def __init__(self) -> None:
                self.count = Counter()
                self.nodes = {}

            def on_visit(self, node: cst.CSTNode) -> bool:
                self.count[id(node)] += 1
                test_case.assertTrue(
                    self.count[id(node)] == 1,
                    f"Node duplication detected between {node} and {self.nodes.get(id(node))}",
                )
                self.nodes[id(node)] = node
                return True

        module = cst.parse_module(dedent(code))
        module.visit(CountVisitor())
