# SPDX-License-Identifier: MIT
class Basket:
    def __init__(self, count):
        self.count=count
    def __len__(self):
        print('length',self.count)
        return self.count
    def __repr__(self):
        return 'Basket('+str(self.count)+')'
class Child(Basket):
    pass
class Named(Basket):
    def __str__(self):
        return 'named'
class Always(Basket):
    def __bool__(self):
        print('boolean')
        return True
for count in [0,2,9223372036854775807,-1,-9223372036854775808,-9223372036854775809,9223372036854775808]:
    item=Basket(count)
    print(str(item),repr(item),f'{item!r}')
    try:
        print(len(item))
    except (ValueError, OverflowError) as error:
        print(repr(error))
    try:
        print(bool(item))
    except (ValueError, OverflowError) as error:
        print(repr(error))
print(len(Child(3)),str(Child(3)),repr(Named(2)),str(Named(2)))
print(bool(Always(-1)))
print([Basket(1),Basket(2)],(Basket(3),))
class BoolLength:
    def __len__(self):
        return True
print(len(BoolLength()),bool(BoolLength()))
class Bad:
    def __len__(self):
        return 'bad'
    def __repr__(self):
        return 1
    def __str__(self):
        return 1
    def __bool__(self):
        return 1
try:
    len(Bad())
except TypeError as error:
    print(repr(error))
try:
    repr(Bad())
except TypeError as error:
    print(repr(error))
try:
    str(Bad())
except TypeError as error:
    print(repr(error))
try:
    bool(Bad())
except TypeError as error:
    print(repr(error))
class Unsized:
    pass
try:
    len(Unsized())
except TypeError as error:
    print(repr(error))
class Failing:
    def __len__(self):
        try:
            raise ValueError('length failure')
        finally:
            print('cleaned length')
    def __repr__(self):
        raise ValueError('repr failure')
try:
    bool(Failing())
except ValueError as error:
    print(repr(error))
try:
    repr(Failing())
except ValueError as error:
    print(repr(error))
