forked from MirrorHub/synapse
Use inline type hints in tests/
(#10350)
This PR is tantamount to running: python3.8 -m com2ann -v 6 tests/ (com2ann requires python 3.8 to run)
This commit is contained in:
parent
89cfc3dd98
commit
93729719b8
18 changed files with 62 additions and 63 deletions
1
changelog.d/10350.misc
Normal file
1
changelog.d/10350.misc
Normal file
|
@ -0,0 +1 @@
|
|||
Convert internal type variable syntax to reflect wider ecosystem use.
|
|
@ -152,7 +152,7 @@ class PresenceRouterTestCase(FederatingHomeserverTestCase):
|
|||
)
|
||||
self.assertEqual(len(presence_updates), 1)
|
||||
|
||||
presence_update = presence_updates[0] # type: UserPresenceState
|
||||
presence_update: UserPresenceState = presence_updates[0]
|
||||
self.assertEqual(presence_update.user_id, self.other_user_one_id)
|
||||
self.assertEqual(presence_update.state, "online")
|
||||
self.assertEqual(presence_update.status_msg, "boop")
|
||||
|
@ -274,7 +274,7 @@ class PresenceRouterTestCase(FederatingHomeserverTestCase):
|
|||
presence_updates, _ = sync_presence(self, self.other_user_id)
|
||||
self.assertEqual(len(presence_updates), 1)
|
||||
|
||||
presence_update = presence_updates[0] # type: UserPresenceState
|
||||
presence_update: UserPresenceState = presence_updates[0]
|
||||
self.assertEqual(presence_update.user_id, self.other_user_id)
|
||||
self.assertEqual(presence_update.state, "online")
|
||||
self.assertEqual(presence_update.status_msg, "I'm online!")
|
||||
|
@ -320,7 +320,7 @@ class PresenceRouterTestCase(FederatingHomeserverTestCase):
|
|||
)
|
||||
for call in calls:
|
||||
call_args = call[0]
|
||||
federation_transaction = call_args[0] # type: Transaction
|
||||
federation_transaction: Transaction = call_args[0]
|
||||
|
||||
# Get the sent EDUs in this transaction
|
||||
edus = federation_transaction.get_dict()["edus"]
|
||||
|
|
|
@ -100,9 +100,9 @@ class ModuleApiTestCase(HomeserverTestCase):
|
|||
"content": content,
|
||||
"sender": user_id,
|
||||
}
|
||||
event = self.get_success(
|
||||
event: EventBase = self.get_success(
|
||||
self.module_api.create_and_send_event_into_room(event_dict)
|
||||
) # type: EventBase
|
||||
)
|
||||
self.assertEqual(event.sender, user_id)
|
||||
self.assertEqual(event.type, "m.room.message")
|
||||
self.assertEqual(event.room_id, room_id)
|
||||
|
@ -136,9 +136,9 @@ class ModuleApiTestCase(HomeserverTestCase):
|
|||
"sender": user_id,
|
||||
"state_key": "",
|
||||
}
|
||||
event = self.get_success(
|
||||
event: EventBase = self.get_success(
|
||||
self.module_api.create_and_send_event_into_room(event_dict)
|
||||
) # type: EventBase
|
||||
)
|
||||
self.assertEqual(event.sender, user_id)
|
||||
self.assertEqual(event.type, "m.room.power_levels")
|
||||
self.assertEqual(event.room_id, room_id)
|
||||
|
@ -281,7 +281,7 @@ class ModuleApiTestCase(HomeserverTestCase):
|
|||
)
|
||||
for call in calls:
|
||||
call_args = call[0]
|
||||
federation_transaction = call_args[0] # type: Transaction
|
||||
federation_transaction: Transaction = call_args[0]
|
||||
|
||||
# Get the sent EDUs in this transaction
|
||||
edus = federation_transaction.get_dict()["edus"]
|
||||
|
@ -390,7 +390,7 @@ def _test_sending_local_online_presence_to_local_user(
|
|||
)
|
||||
test_case.assertEqual(len(presence_updates), 1)
|
||||
|
||||
presence_update = presence_updates[0] # type: UserPresenceState
|
||||
presence_update: UserPresenceState = presence_updates[0]
|
||||
test_case.assertEqual(presence_update.user_id, test_case.presence_sender_id)
|
||||
test_case.assertEqual(presence_update.state, "online")
|
||||
|
||||
|
@ -443,7 +443,7 @@ def _test_sending_local_online_presence_to_local_user(
|
|||
)
|
||||
test_case.assertEqual(len(presence_updates), 1)
|
||||
|
||||
presence_update = presence_updates[0] # type: UserPresenceState
|
||||
presence_update: UserPresenceState = presence_updates[0]
|
||||
test_case.assertEqual(presence_update.user_id, test_case.presence_sender_id)
|
||||
test_case.assertEqual(presence_update.state, "online")
|
||||
|
||||
|
@ -454,7 +454,7 @@ def _test_sending_local_online_presence_to_local_user(
|
|||
)
|
||||
test_case.assertEqual(len(presence_updates), 1)
|
||||
|
||||
presence_update = presence_updates[0] # type: UserPresenceState
|
||||
presence_update: UserPresenceState = presence_updates[0]
|
||||
test_case.assertEqual(presence_update.user_id, test_case.presence_sender_id)
|
||||
test_case.assertEqual(presence_update.state, "online")
|
||||
|
||||
|
|
|
@ -53,9 +53,9 @@ class BaseStreamTestCase(unittest.HomeserverTestCase):
|
|||
# build a replication server
|
||||
server_factory = ReplicationStreamProtocolFactory(hs)
|
||||
self.streamer = hs.get_replication_streamer()
|
||||
self.server = server_factory.buildProtocol(
|
||||
self.server: ServerReplicationStreamProtocol = server_factory.buildProtocol(
|
||||
None
|
||||
) # type: ServerReplicationStreamProtocol
|
||||
)
|
||||
|
||||
# Make a new HomeServer object for the worker
|
||||
self.reactor.lookups["testserv"] = "1.2.3.4"
|
||||
|
@ -195,7 +195,7 @@ class BaseStreamTestCase(unittest.HomeserverTestCase):
|
|||
fetching updates for given stream.
|
||||
"""
|
||||
|
||||
path = request.path # type: bytes # type: ignore
|
||||
path: bytes = request.path # type: ignore
|
||||
self.assertRegex(
|
||||
path,
|
||||
br"^/_synapse/replication/get_repl_stream_updates/%s/[^/]+$"
|
||||
|
@ -212,7 +212,7 @@ class BaseMultiWorkerStreamTestCase(unittest.HomeserverTestCase):
|
|||
unlike `BaseStreamTestCase`.
|
||||
"""
|
||||
|
||||
servlets = [] # type: List[Callable[[HomeServer, JsonResource], None]]
|
||||
servlets: List[Callable[[HomeServer, JsonResource], None]] = []
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
@ -448,7 +448,7 @@ class TestReplicationDataHandler(ReplicationDataHandler):
|
|||
super().__init__(hs)
|
||||
|
||||
# list of received (stream_name, token, row) tuples
|
||||
self.received_rdata_rows = [] # type: List[Tuple[str, int, Any]]
|
||||
self.received_rdata_rows: List[Tuple[str, int, Any]] = []
|
||||
|
||||
async def on_rdata(self, stream_name, instance_name, token, rows):
|
||||
await super().on_rdata(stream_name, instance_name, token, rows)
|
||||
|
@ -484,7 +484,7 @@ class FakeRedisPubSubServer:
|
|||
class FakeRedisPubSubProtocol(Protocol):
|
||||
"""A connection from a client talking to the fake Redis server."""
|
||||
|
||||
transport = None # type: Optional[FakeTransport]
|
||||
transport: Optional[FakeTransport] = None
|
||||
|
||||
def __init__(self, server: FakeRedisPubSubServer):
|
||||
self._server = server
|
||||
|
|
|
@ -135,9 +135,9 @@ class EventsStreamTestCase(BaseStreamTestCase):
|
|||
)
|
||||
|
||||
# this is the point in the DAG where we make a fork
|
||||
fork_point = self.get_success(
|
||||
fork_point: List[str] = self.get_success(
|
||||
self.hs.get_datastore().get_latest_event_ids_in_room(self.room_id)
|
||||
) # type: List[str]
|
||||
)
|
||||
|
||||
events = [
|
||||
self._inject_state_event(sender=OTHER_USER)
|
||||
|
@ -238,7 +238,7 @@ class EventsStreamTestCase(BaseStreamTestCase):
|
|||
self.assertEqual(row.data.event_id, pl_event.event_id)
|
||||
|
||||
# the state rows are unsorted
|
||||
state_rows = [] # type: List[EventsStreamCurrentStateRow]
|
||||
state_rows: List[EventsStreamCurrentStateRow] = []
|
||||
for stream_name, _, row in received_rows:
|
||||
self.assertEqual("events", stream_name)
|
||||
self.assertIsInstance(row, EventsStreamRow)
|
||||
|
@ -290,11 +290,11 @@ class EventsStreamTestCase(BaseStreamTestCase):
|
|||
)
|
||||
|
||||
# this is the point in the DAG where we make a fork
|
||||
fork_point = self.get_success(
|
||||
fork_point: List[str] = self.get_success(
|
||||
self.hs.get_datastore().get_latest_event_ids_in_room(self.room_id)
|
||||
) # type: List[str]
|
||||
)
|
||||
|
||||
events = [] # type: List[EventBase]
|
||||
events: List[EventBase] = []
|
||||
for user in user_ids:
|
||||
events.extend(
|
||||
self._inject_state_event(sender=user) for _ in range(STATES_PER_USER)
|
||||
|
@ -355,7 +355,7 @@ class EventsStreamTestCase(BaseStreamTestCase):
|
|||
self.assertEqual(row.data.event_id, pl_events[i].event_id)
|
||||
|
||||
# the state rows are unsorted
|
||||
state_rows = [] # type: List[EventsStreamCurrentStateRow]
|
||||
state_rows: List[EventsStreamCurrentStateRow] = []
|
||||
for _ in range(STATES_PER_USER + 1):
|
||||
stream_name, token, row = received_rows.pop(0)
|
||||
self.assertEqual("events", stream_name)
|
||||
|
|
|
@ -43,7 +43,7 @@ class ReceiptsStreamTestCase(BaseStreamTestCase):
|
|||
stream_name, _, token, rdata_rows = self.test_handler.on_rdata.call_args[0]
|
||||
self.assertEqual(stream_name, "receipts")
|
||||
self.assertEqual(1, len(rdata_rows))
|
||||
row = rdata_rows[0] # type: ReceiptsStream.ReceiptsStreamRow
|
||||
row: ReceiptsStream.ReceiptsStreamRow = rdata_rows[0]
|
||||
self.assertEqual("!room:blue", row.room_id)
|
||||
self.assertEqual("m.read", row.receipt_type)
|
||||
self.assertEqual(USER_ID, row.user_id)
|
||||
|
@ -75,7 +75,7 @@ class ReceiptsStreamTestCase(BaseStreamTestCase):
|
|||
self.assertEqual(token, 3)
|
||||
self.assertEqual(1, len(rdata_rows))
|
||||
|
||||
row = rdata_rows[0] # type: ReceiptsStream.ReceiptsStreamRow
|
||||
row: ReceiptsStream.ReceiptsStreamRow = rdata_rows[0]
|
||||
self.assertEqual("!room2:blue", row.room_id)
|
||||
self.assertEqual("m.read", row.receipt_type)
|
||||
self.assertEqual(USER_ID, row.user_id)
|
||||
|
|
|
@ -47,7 +47,7 @@ class TypingStreamTestCase(BaseStreamTestCase):
|
|||
stream_name, _, token, rdata_rows = self.test_handler.on_rdata.call_args[0]
|
||||
self.assertEqual(stream_name, "typing")
|
||||
self.assertEqual(1, len(rdata_rows))
|
||||
row = rdata_rows[0] # type: TypingStream.TypingStreamRow
|
||||
row: TypingStream.TypingStreamRow = rdata_rows[0]
|
||||
self.assertEqual(ROOM_ID, row.room_id)
|
||||
self.assertEqual([USER_ID], row.user_ids)
|
||||
|
||||
|
@ -102,7 +102,7 @@ class TypingStreamTestCase(BaseStreamTestCase):
|
|||
stream_name, _, token, rdata_rows = self.test_handler.on_rdata.call_args[0]
|
||||
self.assertEqual(stream_name, "typing")
|
||||
self.assertEqual(1, len(rdata_rows))
|
||||
row = rdata_rows[0] # type: TypingStream.TypingStreamRow
|
||||
row: TypingStream.TypingStreamRow = rdata_rows[0]
|
||||
self.assertEqual(ROOM_ID, row.room_id)
|
||||
self.assertEqual([USER_ID], row.user_ids)
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ from tests.server import FakeChannel, FakeSite, FakeTransport, make_request
|
|||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
test_server_connection_factory = None # type: Optional[TestServerTLSConnectionFactory]
|
||||
test_server_connection_factory: Optional[TestServerTLSConnectionFactory] = None
|
||||
|
||||
|
||||
class MediaRepoShardTestCase(BaseMultiWorkerStreamTestCase):
|
||||
|
|
|
@ -233,11 +233,11 @@ class ThirdPartyRulesTestCase(unittest.HomeserverTestCase):
|
|||
"content": content,
|
||||
"sender": self.user_id,
|
||||
}
|
||||
event = self.get_success(
|
||||
event: EventBase = self.get_success(
|
||||
current_rules_module().module_api.create_and_send_event_into_room(
|
||||
event_dict
|
||||
)
|
||||
) # type: EventBase
|
||||
)
|
||||
|
||||
self.assertEquals(event.sender, self.user_id)
|
||||
self.assertEquals(event.room_id, self.room_id)
|
||||
|
|
|
@ -453,7 +453,7 @@ class MultiSSOTestCase(unittest.HomeserverTestCase):
|
|||
self.assertEqual(channel.code, 200, channel.result)
|
||||
|
||||
# stick the flows results in a dict by type
|
||||
flow_results = {} # type: Dict[str, Any]
|
||||
flow_results: Dict[str, Any] = {}
|
||||
for f in channel.json_body["flows"]:
|
||||
flow_type = f["type"]
|
||||
self.assertNotIn(
|
||||
|
@ -501,7 +501,7 @@ class MultiSSOTestCase(unittest.HomeserverTestCase):
|
|||
p.close()
|
||||
|
||||
# there should be a link for each href
|
||||
returned_idps = [] # type: List[str]
|
||||
returned_idps: List[str] = []
|
||||
for link in p.links:
|
||||
path, query = link.split("?", 1)
|
||||
self.assertEqual(path, "pick_idp")
|
||||
|
@ -582,7 +582,7 @@ class MultiSSOTestCase(unittest.HomeserverTestCase):
|
|||
# ... and should have set a cookie including the redirect url
|
||||
cookie_headers = channel.headers.getRawHeaders("Set-Cookie")
|
||||
assert cookie_headers
|
||||
cookies = {} # type: Dict[str, str]
|
||||
cookies: Dict[str, str] = {}
|
||||
for h in cookie_headers:
|
||||
key, value = h.split(";")[0].split("=", maxsplit=1)
|
||||
cookies[key] = value
|
||||
|
@ -874,9 +874,7 @@ class JWTTestCase(unittest.HomeserverTestCase):
|
|||
|
||||
def jwt_encode(self, payload: Dict[str, Any], secret: str = jwt_secret) -> str:
|
||||
# PyJWT 2.0.0 changed the return type of jwt.encode from bytes to str.
|
||||
result = jwt.encode(
|
||||
payload, secret, self.jwt_algorithm
|
||||
) # type: Union[str, bytes]
|
||||
result: Union[str, bytes] = jwt.encode(payload, secret, self.jwt_algorithm)
|
||||
if isinstance(result, bytes):
|
||||
return result.decode("ascii")
|
||||
return result
|
||||
|
@ -1084,7 +1082,7 @@ class JWTPubKeyTestCase(unittest.HomeserverTestCase):
|
|||
|
||||
def jwt_encode(self, payload: Dict[str, Any], secret: str = jwt_privatekey) -> str:
|
||||
# PyJWT 2.0.0 changed the return type of jwt.encode from bytes to str.
|
||||
result = jwt.encode(payload, secret, "RS256") # type: Union[bytes,str]
|
||||
result: Union[bytes, str] = jwt.encode(payload, secret, "RS256")
|
||||
if isinstance(result, bytes):
|
||||
return result.decode("ascii")
|
||||
return result
|
||||
|
@ -1272,7 +1270,7 @@ class UsernamePickerTestCase(HomeserverTestCase):
|
|||
self.assertEqual(picker_url, "/_synapse/client/pick_username/account_details")
|
||||
|
||||
# ... with a username_mapping_session cookie
|
||||
cookies = {} # type: Dict[str,str]
|
||||
cookies: Dict[str, str] = {}
|
||||
channel.extract_cookies(cookies)
|
||||
self.assertIn("username_mapping_session", cookies)
|
||||
session_id = cookies["username_mapping_session"]
|
||||
|
|
|
@ -52,7 +52,7 @@ class FakeChannel:
|
|||
_reactor = attr.ib()
|
||||
result = attr.ib(type=dict, default=attr.Factory(dict))
|
||||
_ip = attr.ib(type=str, default="127.0.0.1")
|
||||
_producer = None # type: Optional[Union[IPullProducer, IPushProducer]]
|
||||
_producer: Optional[Union[IPullProducer, IPushProducer]] = None
|
||||
|
||||
@property
|
||||
def json_body(self):
|
||||
|
@ -316,8 +316,10 @@ class ThreadedMemoryReactorClock(MemoryReactorClock):
|
|||
|
||||
self._tcp_callbacks = {}
|
||||
self._udp = []
|
||||
lookups = self.lookups = {} # type: Dict[str, str]
|
||||
self._thread_callbacks = deque() # type: Deque[Callable[[], None]]
|
||||
self.lookups: Dict[str, str] = {}
|
||||
self._thread_callbacks: Deque[Callable[[], None]] = deque()
|
||||
|
||||
lookups = self.lookups
|
||||
|
||||
@implementer(IResolverSimple)
|
||||
class FakeResolver:
|
||||
|
|
|
@ -7,9 +7,7 @@ from tests import unittest
|
|||
|
||||
class BackgroundUpdateTestCase(unittest.HomeserverTestCase):
|
||||
def prepare(self, reactor, clock, homeserver):
|
||||
self.updates = (
|
||||
self.hs.get_datastore().db_pool.updates
|
||||
) # type: BackgroundUpdater
|
||||
self.updates: BackgroundUpdater = self.hs.get_datastore().db_pool.updates
|
||||
# the base test class should have run the real bg updates for us
|
||||
self.assertTrue(
|
||||
self.get_success(self.updates.has_completed_background_updates())
|
||||
|
|
|
@ -27,7 +27,7 @@ class MultiWriterIdGeneratorTestCase(HomeserverTestCase):
|
|||
|
||||
def prepare(self, reactor, clock, hs):
|
||||
self.store = hs.get_datastore()
|
||||
self.db_pool = self.store.db_pool # type: DatabasePool
|
||||
self.db_pool: DatabasePool = self.store.db_pool
|
||||
|
||||
self.get_success(self.db_pool.runInteraction("_setup_db", self._setup_db))
|
||||
|
||||
|
@ -460,7 +460,7 @@ class BackwardsMultiWriterIdGeneratorTestCase(HomeserverTestCase):
|
|||
|
||||
def prepare(self, reactor, clock, hs):
|
||||
self.store = hs.get_datastore()
|
||||
self.db_pool = self.store.db_pool # type: DatabasePool
|
||||
self.db_pool: DatabasePool = self.store.db_pool
|
||||
|
||||
self.get_success(self.db_pool.runInteraction("_setup_db", self._setup_db))
|
||||
|
||||
|
@ -586,7 +586,7 @@ class MultiTableMultiWriterIdGeneratorTestCase(HomeserverTestCase):
|
|||
|
||||
def prepare(self, reactor, clock, hs):
|
||||
self.store = hs.get_datastore()
|
||||
self.db_pool = self.store.db_pool # type: DatabasePool
|
||||
self.db_pool: DatabasePool = self.store.db_pool
|
||||
|
||||
self.get_success(self.db_pool.runInteraction("_setup_db", self._setup_db))
|
||||
|
||||
|
|
|
@ -199,7 +199,7 @@ class StateTestCase(unittest.TestCase):
|
|||
|
||||
self.store.register_events(graph.walk())
|
||||
|
||||
context_store = {} # type: dict[str, EventContext]
|
||||
context_store: dict[str, EventContext] = {}
|
||||
|
||||
for event in graph.walk():
|
||||
context = yield defer.ensureDeferred(
|
||||
|
|
|
@ -23,13 +23,13 @@ class TestHtmlParser(HTMLParser):
|
|||
super().__init__()
|
||||
|
||||
# a list of links found in the doc
|
||||
self.links = [] # type: List[str]
|
||||
self.links: List[str] = []
|
||||
|
||||
# the values of any hidden <input>s: map from name to value
|
||||
self.hiddens = {} # type: Dict[str, Optional[str]]
|
||||
self.hiddens: Dict[str, Optional[str]] = {}
|
||||
|
||||
# the values of any radio buttons: map from name to list of values
|
||||
self.radios = {} # type: Dict[str, List[Optional[str]]]
|
||||
self.radios: Dict[str, List[Optional[str]]] = {}
|
||||
|
||||
def handle_starttag(
|
||||
self, tag: str, attrs: Iterable[Tuple[str, Optional[str]]]
|
||||
|
|
|
@ -520,7 +520,7 @@ class HomeserverTestCase(TestCase):
|
|||
if not isinstance(deferred, Deferred):
|
||||
return d
|
||||
|
||||
results = [] # type: list
|
||||
results: list = []
|
||||
deferred.addBoth(results.append)
|
||||
|
||||
self.pump(by=by)
|
||||
|
|
|
@ -174,7 +174,7 @@ class DescriptorTestCase(unittest.TestCase):
|
|||
return self.result
|
||||
|
||||
obj = Cls()
|
||||
callbacks = set() # type: Set[str]
|
||||
callbacks: Set[str] = set()
|
||||
|
||||
# set off an asynchronous request
|
||||
obj.result = origin_d = defer.Deferred()
|
||||
|
|
|
@ -44,7 +44,7 @@ class ChunkSeqTests(TestCase):
|
|||
)
|
||||
|
||||
def test_empty_input(self):
|
||||
parts = chunk_seq([], 5) # type: Iterable[Sequence]
|
||||
parts: Iterable[Sequence] = chunk_seq([], 5)
|
||||
|
||||
self.assertEqual(
|
||||
list(parts),
|
||||
|
@ -56,13 +56,13 @@ class SortTopologically(TestCase):
|
|||
def test_empty(self):
|
||||
"Test that an empty graph works correctly"
|
||||
|
||||
graph = {} # type: Dict[int, List[int]]
|
||||
graph: Dict[int, List[int]] = {}
|
||||
self.assertEqual(list(sorted_topologically([], graph)), [])
|
||||
|
||||
def test_handle_empty_graph(self):
|
||||
"Test that a graph where a node doesn't have an entry is treated as empty"
|
||||
|
||||
graph = {} # type: Dict[int, List[int]]
|
||||
graph: Dict[int, List[int]] = {}
|
||||
|
||||
# For disconnected nodes the output is simply sorted.
|
||||
self.assertEqual(list(sorted_topologically([1, 2], graph)), [1, 2])
|
||||
|
@ -70,7 +70,7 @@ class SortTopologically(TestCase):
|
|||
def test_disconnected(self):
|
||||
"Test that a graph with no edges work"
|
||||
|
||||
graph = {1: [], 2: []} # type: Dict[int, List[int]]
|
||||
graph: Dict[int, List[int]] = {1: [], 2: []}
|
||||
|
||||
# For disconnected nodes the output is simply sorted.
|
||||
self.assertEqual(list(sorted_topologically([1, 2], graph)), [1, 2])
|
||||
|
@ -78,19 +78,19 @@ class SortTopologically(TestCase):
|
|||
def test_linear(self):
|
||||
"Test that a simple `4 -> 3 -> 2 -> 1` graph works"
|
||||
|
||||
graph = {1: [], 2: [1], 3: [2], 4: [3]} # type: Dict[int, List[int]]
|
||||
graph: Dict[int, List[int]] = {1: [], 2: [1], 3: [2], 4: [3]}
|
||||
|
||||
self.assertEqual(list(sorted_topologically([4, 3, 2, 1], graph)), [1, 2, 3, 4])
|
||||
|
||||
def test_subset(self):
|
||||
"Test that only sorting a subset of the graph works"
|
||||
graph = {1: [], 2: [1], 3: [2], 4: [3]} # type: Dict[int, List[int]]
|
||||
graph: Dict[int, List[int]] = {1: [], 2: [1], 3: [2], 4: [3]}
|
||||
|
||||
self.assertEqual(list(sorted_topologically([4, 3], graph)), [3, 4])
|
||||
|
||||
def test_fork(self):
|
||||
"Test that a forked graph works"
|
||||
graph = {1: [], 2: [1], 3: [1], 4: [2, 3]} # type: Dict[int, List[int]]
|
||||
graph: Dict[int, List[int]] = {1: [], 2: [1], 3: [1], 4: [2, 3]}
|
||||
|
||||
# Valid orderings are `[1, 3, 2, 4]` or `[1, 2, 3, 4]`, but we should
|
||||
# always get the same one.
|
||||
|
@ -98,12 +98,12 @@ class SortTopologically(TestCase):
|
|||
|
||||
def test_duplicates(self):
|
||||
"Test that a graph with duplicate edges work"
|
||||
graph = {1: [], 2: [1, 1], 3: [2, 2], 4: [3]} # type: Dict[int, List[int]]
|
||||
graph: Dict[int, List[int]] = {1: [], 2: [1, 1], 3: [2, 2], 4: [3]}
|
||||
|
||||
self.assertEqual(list(sorted_topologically([4, 3, 2, 1], graph)), [1, 2, 3, 4])
|
||||
|
||||
def test_multiple_paths(self):
|
||||
"Test that a graph with multiple paths between two nodes work"
|
||||
graph = {1: [], 2: [1], 3: [2], 4: [3, 2, 1]} # type: Dict[int, List[int]]
|
||||
graph: Dict[int, List[int]] = {1: [], 2: [1], 3: [2], 4: [3, 2, 1]}
|
||||
|
||||
self.assertEqual(list(sorted_topologically([4, 3, 2, 1], graph)), [1, 2, 3, 4])
|
||||
|
|
Loading…
Reference in a new issue