from io import BytesIO


def test_01():
    bytes_string = b"Test String 1"

    f = BytesIO()
    f.write(bytes_string)

    assert f.tell() == len(bytes_string)
    assert f.getvalue() == bytes_string


def test_02():
    bytes_string = b"Test String 2"
    f = BytesIO(bytes_string)

    assert f.read() == bytes_string
    assert f.read() == b""


def test_03():
    """
    Tests that the read method (integer arg)
    returns the expected value
    """
    string = b"Test String 3"
    f = BytesIO(string)

    assert f.read(1) == b"T"
    assert f.read(1) == b"e"
    assert f.read(1) == b"s"
    assert f.read(1) == b"t"


def test_04():
    """
    Tests that the read method increments the
    cursor position and the seek method moves
    the cursor to the appropriate position
    """
    string = b"Test String 4"
    f = BytesIO(string)

    assert f.read(4) == b"Test"
    assert f.tell() == 4
    assert f.seek(0) == 0
    assert f.read(4) == b"Test"


def test_05():
    """
    Tests that the write method accepts bytearray
    """
    bytes_string = b"Test String 5"

    f = BytesIO()
    f.write(bytearray(bytes_string))

    assert f.getvalue() == bytes_string


def test_06():
    """
    Tests readline
    """
    bytes_string = b"Test String 6\nnew line is here\nfinished"

    f = BytesIO(bytes_string)

    assert f.readline() == b"Test String 6\n"
    assert f.readline() == b"new line is here\n"
    assert f.readline() == b"finished"
    assert f.readline() == b""


def test_07():
    """
    Tests that flush() returns None when the file is open,
    and raises ValueError when the file is closed.
    CPython reference: Modules/_io/bytesio.c:325-335
    """
    f = BytesIO(b"Test String 7")

    # flush() on an open BytesIO returns None
    assert f.flush() is None

    # flush() is defined directly on BytesIO (not just inherited)
    assert "flush" in BytesIO.__dict__

    f.close()

    # flush() on a closed BytesIO raises ValueError
    try:
        f.flush()
        assert False, "Expected ValueError not raised"
    except ValueError:
        pass


if __name__ == "__main__":
    test_01()
    test_02()
    test_03()
    test_04()
    test_05()
    test_06()
    test_07()
