if a and False:  # SIM223
    pass

if (a or b) and False:  # SIM223
    pass

if a or (b and False):  # SIM223
    pass

if a or False:
    pass

if False:
    pass

if a and f() and b and g() and False:  # OK
    pass

if a and f() and False and g() and b:  # SIM223
    pass

if False and f() and a and g() and b:  # SIM223
    pass

if a and False and f() and b and g():  # SIM223
    pass


if a or f() or b or g() or True:  # OK
    pass

if a or f() or True or g() or b:  # OK
    pass

if True or f() or a or g() or b:  # OK
    pass

if a or True or f() or b or g():  # OK
    pass


a and "" and False  # SIM223

a and "foo" and False and "bar"  # SIM223

a and 0 and False  # SIM223

a and 1 and False and 2  # SIM223

a and 0.0 and False  # SIM223

a and 0.1 and False and 0.2  # SIM223

a and [] and False  # SIM223

a and list([]) and False  # SIM223

a and [1] and False and [2]  # SIM223

a and list([1]) and False and list([2])  # SIM223

a and {} and False  # SIM223

a and dict() and False  # SIM223

a and {1: 1} and False and {2: 2}  # SIM223

a and dict({1: 1}) and False and dict({2: 2})  # SIM223

a and set() and False  # SIM223

a and set(set()) and False  # SIM223

a and {1} and False and {2}  # SIM223

a and set({1}) and False and set({2})  # SIM223

a and () and False  # SIM222

a and tuple(()) and False  # SIM222

a and (1,) and False and (2,)  # SIM222

a and tuple((1,)) and False and tuple((2,))  # SIM222

a and frozenset() and False  # SIM222

a and frozenset(frozenset()) and False  # SIM222

a and frozenset({1}) and False and frozenset({2})  # SIM222

a and frozenset(frozenset({1})) and False and frozenset(frozenset({2}))  # SIM222


# Inside test `a` is simplified.

bool(a and [] and False and [])  # SIM223

assert a and [] and False and []  # SIM223

if (a and [] and False and []) or (a and [] and False and []):  # SIM223
    pass

0 if a and [] and False and [] else 1  # SIM222

while a and [] and False and []:  # SIM223
    pass

[
    0
    for a in range(10)
    for b in range(10)
    if a and [] and False and []  # SIM223
    if b and [] and False and []  # SIM223
]

{
    0
    for a in range(10)
    for b in range(10)
    if a and [] and False and []  # SIM223
    if b and [] and False and []  # SIM223
}

{
    0: 0
    for a in range(10)
    for b in range(10)
    if a and [] and False and []  # SIM223
    if b and [] and False and []  # SIM223
}

(
    0
    for a in range(10)
    for b in range(10)
    if a and [] and False and []  # SIM223
    if b and [] and False and []  # SIM223
)

# Outside test `a` is not simplified.

a and [] and False and []  # SIM223

if (a and [] and False and []) == (a and []):  # SIM223
    pass

if f(a and [] and False and []):  # SIM223
    pass

# Regression test for: https://github.com/astral-sh/ruff/issues/9479
print(f"{a}{b}" and "bar")
print(f"{a}{''}" and "bar")
print(f"{''}{''}" and "bar")
print(f"{1}{''}" and "bar")


# https://github.com/astral-sh/ruff/issues/7127
def f(a: "'' and 'b'"): ...


# https://github.com/astral-sh/ruff/issues/21473
tuple("") and False  # SIM223
tuple(t"") and False  # OK
tuple(0) and False  # OK
tuple(1) and False  # OK
tuple(False) and False  # OK
tuple(None) and False  # OK
tuple(...) and False  # OK
tuple(lambda x: x) and False  # OK
tuple(x for x in range(0)) and False  # OK
