async def main(): lines = Path('test.lean').read_text().split('\n') async with trio.open_nursery() as nursery: server = TrioLeanServer(nursery, debug=False) await server.start() await server.full_sync('test.lean') for i, line in enumerate(lines): before = await server.state('test.lean', i + 1, 0) after = await server.state('test.lean', i + 1, len(line)) if before or after: print(f'Line {i+1}: {line}') print(f'State before:\n{before}\n') print(f'State after:\n{after}\n') server.kill() nursery.cancel_scope.cancel()
async def check_waiting_behavior(): async with trio.open_nursery() as nursery: server = TrioLeanServer(nursery) await start_with_mock_lean(server, mock_lean_script) await server.full_sync('test.lean', content='--') await server.state(filename="test.lean", line=1, col=0) nursery.cancel_scope.cancel()
async def check_behavior(): async with trio.open_nursery() as nursery: server = TrioLeanServer(nursery) await start_with_mock_lean(server, mock_lean_script) await server.full_sync("test.lean") await server.full_sync("test.lean") # sync same file twice await server.state(filename="test.lean", line=1, col=0) nursery.cancel_scope.cancel()
async def check_behavior(): async with trio.open_nursery() as nursery: server = TrioLeanServer(nursery, debug_bytes=True) await start_with_mock_lean(server, mock_lean_script) await server.full_sync('test.lean', content='example : true := \nbegin end') state = await server.state(filename="test.lean", line=2, col=0) assert state == "⊢ true" nursery.cancel_scope.cancel()
async def check_behavior(): async with trio.open_nursery() as nursery: server = TrioLeanServer(nursery) await start_with_mock_lean(server, mock_lean_script) # for this test to pass it has to (1) not block forever and (2) throw an error try: await server.full_sync("bad_file_name") assert False, "An error should have been thrown here" except ChildProcessError: pass await server.full_sync("test.lean") # sync a different file nursery.cancel_scope.cancel()
async def check_behavior(): async with trio.open_nursery() as nursery: server = TrioLeanServer(nursery, debug_bytes=True) await start_with_mock_lean(server, mock_lean_script) await server.full_sync('test.lean') # for this test to pass it has to throw an error try: await server.send(InfoRequest(file_name="wrongfile.lean", line=1, column=0)) assert False, "An error should have been thrown here" except ChildProcessError: pass nursery.cancel_scope.cancel()
async def start_with_mock_lean(lean_server: TrioLeanServer, script: List[LeanScriptStep]): """ Call this in place of TrioLeanServer.start(). It will run a mock Lean server following the script, in place of the real Lean server. """ # start up the mock lean process mock_lean_process = MockLeanServerProcess(script) lean_server.nursery.start_soon(mock_lean_process.follow_script) # attach to the lean interface lean_server.process = mock_lean_process # perform the remainder of the start up processes as normal lean_server.nursery.start_soon(lean_server.receiver)
async def check_behavior(): async with trio.open_nursery() as nursery: server = TrioLeanServer(nursery, debug_bytes=True) await start_with_mock_lean(server, mock_lean_script) await server.full_sync('test.lean') # check response object is parsed and of the correct type # (more parsing tests can be found in unit tests for the commands.py file) response1 = await server.send(InfoRequest(file_name="test.lean", line=1, column=25)) assert isinstance(response1, InfoResponse) assert response1.record.source.column == 11 response2 = await server.send(InfoRequest(file_name="test.lean", line=100, column=0)) assert isinstance(response2, InfoResponse) assert response2.record is None nursery.cancel_scope.cancel()
async def check_behavior(): async with trio.open_nursery() as nursery: server = TrioLeanServer(nursery, debug_bytes=True) await start_with_mock_lean(server, mock_lean_script) await server.full_sync('test.lean') response1 = await server.send(SleepRequest()) assert response1 is None response2 = await server.send(InfoRequest(file_name="test.lean", line=1, column=0)) assert isinstance(response2, InfoResponse) response3 = await server.send(LongSleepRequest()) assert response3 is None response4 = await server.send(InfoRequest(file_name="test.lean", line=1, column=0)) assert isinstance(response4, InfoResponse) nursery.cancel_scope.cancel()