def test_threaded_same_priority_Tasks():
    executor = ThreadedExecutor(worker_count=1)

    def callable():
        pass

    # Test that we can correctly submit multiple tasks
    executor.submit(callable)
    executor.submit(callable)
def test_threaded_executor():
    executor = ThreadedExecutor(worker_count=1, maxsize=3)

    def waiter(ready, waiting, result):
        ready.set()
        waiting.wait()
        return result

    initial_ready = Event()
    initial_waiting = Event()
    initial_future = executor.submit(
        lambda: waiter(initial_ready, initial_waiting, 1),
        block=True,
        timeout=1)

    # wait until the worker has removed this item from the queue
    assert initial_ready.wait(timeout=1), "waiter not ready"
    assert initial_future.running(), "waiter did not get marked as started"

    low_priority_ready = Event()
    low_priority_waiting = Event()
    low_priority_future = executor.submit(
        lambda: waiter(low_priority_ready, low_priority_waiting, 2),
        block=True,
        timeout=1,
        priority=10,
    )
    assert not low_priority_future.done(
    ), "future should not be done (indicative of a full queue)"

    cancelled_future = executor.submit(lambda: None,
                                       block=True,
                                       timeout=1,
                                       priority=5)
    assert not cancelled_future.done(
    ), "future should not be done (indicative of a full queue)"
    assert cancelled_future.cancel(), "future should be able to be cancelled"
    assert cancelled_future.done(), "future should be completed"
    with pytest.raises(CancelledError):
        cancelled_future.result()

    high_priority_ready = Event()
    high_priority_waiting = Event()
    high_priority_future = executor.submit(
        lambda: waiter(high_priority_ready, high_priority_waiting, 3),
        block=True,
        timeout=1,
        priority=0,
    )
    assert not high_priority_future.done(
    ), "future should not be done (indicative of a full queue)"

    queue_full_future = executor.submit(lambda: None, block=False)
    assert queue_full_future.done()
    with pytest.raises(Full):
        queue_full_future.result()  # will not block if completed

    initial_waiting.set()  # let the task finish
    assert initial_future.result(timeout=1) == 1
    assert initial_future.done()

    assert high_priority_ready.wait(
        timeout=1)  # this should be the next task to execute
    assert high_priority_future.running()
    assert not low_priority_future.running()

    high_priority_waiting.set()  # let the task finish
    assert high_priority_future.result(timeout=1) == 3
    assert high_priority_future.done()

    assert low_priority_ready.wait(
        timeout=1)  # this should be the next task to execute
    assert low_priority_future.running()

    low_priority_waiting.set()  # let the task finish
    assert low_priority_future.result(timeout=1) == 2
    assert low_priority_future.done()