def test_single_mode() -> None:
    expressions = (
        "1",
        "i and (j or k)",
        "i and j or k",
        "j % 4",
        "i = 1",
        "i += 1",
        "i = j % 4",
        "i = {}",
        "i = []",
        "for i in range(10):\n    i\n",
        "for i in range(10):\n    for j in range(10):\n        i + j\n",
        "(i for i in f if 0 < i < 4)",
        "[i for pair in p if pair for i in f]",
        # Inconsequential differences in spaces.
        # "try:\n    i\nexcept Exception:\n    j\nelse:\n    k",
    )

    for expr in expressions:
        try:
            deparsed = run_deparse(expr, compile_mode="single", debug=False)
        except:
            assert False, expr
            continue

        if deparsed.text != (expr + "\n"):
            from decompyle3.show import maybe_show_tree
            deparsed.showast = {"Full": True}
            maybe_show_tree(deparsed, deparsed.ast)
        assert deparsed.text == expr + "\n"
def test_lambda_mode():
    expressions = (
        "lambda d=b'': 5",
        "lambda *, d=0: d",
        "lambda x: 1 if x < 2 else 3",
        "lambda y: x * y",
        "lambda n: True if n >= 95 and n & 1 else False",
        "lambda: (yield from f())",
    )

    for expr in expressions:
        try:
            deparsed = run_deparse(expr, compile_mode="lambda", debug=False)
        except:
            assert False, expr
            continue
        if deparsed.text != expr:
            from decompyle3.show import maybe_show_tree
            deparsed.showast = {"Full": True}
            maybe_show_tree(deparsed, deparsed.ast)
        assert deparsed.text == expr
def test_eval_mode():
    expressions = (
        "1",
        "j % 4",
        "k == 1 or k == 2",
        "i and (j or k)",
        "i and j or k",
    )

    for expr in expressions:
        try:
            deparsed = run_deparse(expr, compile_mode="eval", debug=False)
        except:
            assert False, expr
            continue

        if deparsed.text != expr:
            from decompyle3.show import maybe_show_tree
            deparsed.showast = {"Full": True}
            maybe_show_tree(deparsed, deparsed.ast)
        assert deparsed.text == expr
 def maybe_show_tree(self, ast):
     if isinstance(self.showast, dict) and self.showast:
         maybe_show_tree(self, ast)