with (open("bla.txt")):
    pass

with (open("bla.txt")), (open("bla.txt")):
    pass

with (open("bla.txt") as f):
    pass

# Remove brackets within alias expression
with (open("bla.txt")) as f:
    pass

# Remove brackets around one-line context managers
with (open("bla.txt") as f, (open("x"))):
    pass

with ((open("bla.txt")) as f, open("x")):
    pass

with (CtxManager1() as example1, CtxManager2() as example2):
    ...

# Brackets remain when using magic comma
with (CtxManager1() as example1, CtxManager2() as example2,):
    ...

# Brackets remain for multi-line context managers
with (CtxManager1() as example1, CtxManager2() as example2, CtxManager2() as example2, CtxManager2() as example2, CtxManager2() as example2):
    ...

# Don't touch assignment expressions
with (y := open("./test.py")) as f:
    pass

# Deeply nested examples
# N.B. Multiple brackets are only possible
# around the context manager itself.
# Only one brackets is allowed around the
# alias expression or comma-delimited context managers.
with (((open("bla.txt")))):
    pass

with (((open("bla.txt")))), (((open("bla.txt")))):
    pass

with (((open("bla.txt")))) as f:
    pass

with ((((open("bla.txt")))) as f):
    pass

with ((((CtxManager1()))) as example1, (((CtxManager2()))) as example2):
    ...

# output
with open("bla.txt"):
    pass

with open("bla.txt"), open("bla.txt"):
    pass

with open("bla.txt") as f:
    pass

# Remove brackets within alias expression
with open("bla.txt") as f:
    pass

# Remove brackets around one-line context managers
with open("bla.txt") as f, open("x"):
    pass

with open("bla.txt") as f, open("x"):
    pass

with CtxManager1() as example1, CtxManager2() as example2:
    ...

# Brackets remain when using magic comma
with (
    CtxManager1() as example1,
    CtxManager2() as example2,
):
    ...

# Brackets remain for multi-line context managers
with (
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager2() as example2,
    CtxManager2() as example2,
    CtxManager2() as example2,
):
    ...

# Don't touch assignment expressions
with (y := open("./test.py")) as f:
    pass

# Deeply nested examples
# N.B. Multiple brackets are only possible
# around the context manager itself.
# Only one brackets is allowed around the
# alias expression or comma-delimited context managers.
with open("bla.txt"):
    pass

with open("bla.txt"), open("bla.txt"):
    pass

with open("bla.txt") as f:
    pass

with open("bla.txt") as f:
    pass

with CtxManager1() as example1, CtxManager2() as example2:
    ...
