import platform import sys import pytest from anyio import create_memory_object_stream from anyio.streams.stapled import StapledObjectStream from anyio.streams.text import TextReceiveStream, TextSendStream, TextStream pytestmark = pytest.mark.anyio async def test_receive() -> None: send_stream, receive_stream = create_memory_object_stream(1) text_stream = TextReceiveStream(receive_stream) await send_stream.send(b'\xc3\xa5\xc3\xa4\xc3') # ends with half of the "ö" letter assert await text_stream.receive() == 'åä' # Send the missing byte for "ö" await send_stream.send(b'\xb6') assert await text_stream.receive() == 'ö' async def test_send() -> None: send_stream, receive_stream = create_memory_object_stream(1) text_stream = TextSendStream(send_stream) await text_stream.send('åäö') assert await receive_stream.receive() == b'\xc3\xa5\xc3\xa4\xc3\xb6' @pytest.mark.xfail(platform.python_implementation() == 'PyPy' and sys.pypy_version_info < (7, 3, 2), # type: ignore[attr-defined] reason='PyPy has a bug in its incremental UTF-8 decoder (#3274)') async def test_receive_encoding_error() -> None: send_stream, receive_stream = create_memory_object_stream(1) text_stream = TextReceiveStream(receive_stream, errors='replace') await send_stream.send(b'\xe5\xe4\xf6') # "åäö" in latin-1 assert await text_stream.receive() == '���' async def test_send_encoding_error() -> None: send_stream, receive_stream = create_memory_object_stream(1) text_stream = TextSendStream(send_stream, encoding='iso-8859-1', errors='replace') await text_stream.send('€') assert await receive_stream.receive() == b'?' async def test_bidirectional_stream() -> None: send_stream, receive_stream = create_memory_object_stream(1) stapled_stream = StapledObjectStream(send_stream, receive_stream) text_stream = TextStream(stapled_stream) await text_stream.send('åäö') assert await receive_stream.receive() == b'\xc3\xa5\xc3\xa4\xc3\xb6' await send_stream.send(b'\xc3\xa6\xc3\xb8') assert await text_stream.receive() == 'æø' assert text_stream.extra_attributes == {}