|
17 | 17 | ) |
18 | 18 |
|
19 | 19 |
|
| 20 | +def sq(i: int) -> Result[int, int]: |
| 21 | + return Ok(i * i) |
| 22 | + |
| 23 | + |
| 24 | +async def sq_async(i: int) -> Result[int, int]: |
| 25 | + return Ok(i * i) |
| 26 | + |
| 27 | + |
| 28 | +def to_err(i: int) -> Result[int, int]: |
| 29 | + return Err(i) |
| 30 | + |
| 31 | + |
| 32 | +async def to_err_async(i: int) -> Result[int, int]: |
| 33 | + return Err(i) |
| 34 | + |
| 35 | + |
| 36 | +# Lambda versions of the same functions, just for test/type coverage |
| 37 | +def sq_lambda(i: int) -> Result[int, int]: |
| 38 | + return Ok(i * i) |
| 39 | + |
| 40 | + |
| 41 | +def to_err_lambda(i: int) -> Result[int, int]: |
| 42 | + return Err(i) |
| 43 | + |
| 44 | + |
20 | 45 | def test_ok_factories() -> None: |
21 | 46 | instance = Ok(1) |
22 | 47 | assert instance._value == 1 |
@@ -367,6 +392,24 @@ def f() -> int: |
367 | 392 | f() |
368 | 393 |
|
369 | 394 |
|
| 395 | +def test_as_result_unwraps() -> None: |
| 396 | + @as_result(ValueError) |
| 397 | + def raises_unwrapping_error(value: int) -> int: |
| 398 | + Err(IndexError("Test Error")).unwrap() |
| 399 | + return value |
| 400 | + |
| 401 | + @as_result(IndexError, ValueError) |
| 402 | + def does_not_raise_unwrapping_error(value: int) -> int: |
| 403 | + Err(IndexError("Test Error")).unwrap() |
| 404 | + return value |
| 405 | + |
| 406 | + with pytest.raises(UnwrapError): |
| 407 | + raises_unwrapping_error(123) |
| 408 | + |
| 409 | + err_response = does_not_raise_unwrapping_error(123) |
| 410 | + assert isinstance(err_response.unwrap_err(), IndexError) |
| 411 | + |
| 412 | + |
370 | 413 | def test_as_result_invalid_usage() -> None: |
371 | 414 | """ |
372 | 415 | Invalid use of ``as_result()`` raises reasonable errors. |
@@ -423,29 +466,23 @@ async def bad(value: int) -> int: |
423 | 466 | assert isinstance(bad_result.unwrap_err(), ValueError) |
424 | 467 |
|
425 | 468 |
|
426 | | -def sq(i: int) -> Result[int, int]: |
427 | | - return Ok(i * i) |
428 | | - |
429 | | - |
430 | | -async def sq_async(i: int) -> Result[int, int]: |
431 | | - return Ok(i * i) |
432 | | - |
433 | | - |
434 | | -def to_err(i: int) -> Result[int, int]: |
435 | | - return Err(i) |
436 | | - |
| 469 | +@pytest.mark.asyncio |
| 470 | +async def test_as_async_result_unwraps() -> None: |
| 471 | + @as_async_result(ValueError) |
| 472 | + async def raises_unwrapping_error(value: int) -> int: |
| 473 | + Err(IndexError("Test Error")).unwrap() |
| 474 | + return value |
437 | 475 |
|
438 | | -async def to_err_async(i: int) -> Result[int, int]: |
439 | | - return Err(i) |
| 476 | + @as_async_result(IndexError, ValueError) |
| 477 | + async def does_not_raise_unwrapping_error(value: int) -> int: |
| 478 | + Err(IndexError("Test Error")).unwrap() |
| 479 | + return value |
440 | 480 |
|
| 481 | + with pytest.raises(UnwrapError): |
| 482 | + await raises_unwrapping_error(123) |
441 | 483 |
|
442 | | -# Lambda versions of the same functions, just for test/type coverage |
443 | | -def sq_lambda(i: int) -> Result[int, int]: |
444 | | - return Ok(i * i) |
445 | | - |
446 | | - |
447 | | -def to_err_lambda(i: int) -> Result[int, int]: |
448 | | - return Err(i) |
| 484 | + err_response = await does_not_raise_unwrapping_error(123) |
| 485 | + assert isinstance(err_response.unwrap_err(), IndexError) |
449 | 486 |
|
450 | 487 |
|
451 | 488 | def test_as_generator_result_ok() -> None: |
@@ -478,6 +515,29 @@ def my_generator(val: int) -> Generator[int, None, None]: |
478 | 515 | next(result) |
479 | 516 |
|
480 | 517 |
|
| 518 | +def test_as_generator_result_unwraps() -> None: |
| 519 | + @as_generator_result(ValueError) |
| 520 | + def raises_unwrapping_error(value: int) -> Generator[int, None, None]: |
| 521 | + Err(IndexError("Test Error")).unwrap() |
| 522 | + yield 5 |
| 523 | + |
| 524 | + @as_generator_result(IndexError, ValueError) |
| 525 | + def does_not_raise_unwrapping_error(value: int) -> Generator[int, None, None]: |
| 526 | + yield 3 |
| 527 | + Err(IndexError("Test Error")).unwrap() |
| 528 | + yield 5 |
| 529 | + |
| 530 | + raising_generator = raises_unwrapping_error(123) |
| 531 | + with pytest.raises(UnwrapError): |
| 532 | + next(raising_generator) |
| 533 | + |
| 534 | + running_generator = does_not_raise_unwrapping_error(123) |
| 535 | + assert next(running_generator) == Ok(3) |
| 536 | + assert next(running_generator).unwrap_err().args[0] == "Test Error" |
| 537 | + with pytest.raises(StopIteration): |
| 538 | + next(running_generator) |
| 539 | + |
| 540 | + |
481 | 541 | def test_as_generator_result_with_send() -> None: |
482 | 542 | @as_generator_result(ValueError) |
483 | 543 | def my_generator() -> Generator[int, int, None]: |
@@ -551,6 +611,30 @@ async def my_generator(val: int) -> AsyncGenerator[int, None]: |
551 | 611 | await anext(result) |
552 | 612 |
|
553 | 613 |
|
| 614 | +@pytest.mark.asyncio |
| 615 | +async def test_as_async_generator_result_unwraps() -> None: |
| 616 | + @as_async_generator_result(ValueError) |
| 617 | + async def raises_unwrapping_error(value: int) -> AsyncGenerator[int, None]: |
| 618 | + Err(IndexError("Test Error")).unwrap() |
| 619 | + yield 5 |
| 620 | + |
| 621 | + @as_async_generator_result(IndexError, ValueError) |
| 622 | + async def does_not_raise_unwrapping_error(value: int) -> AsyncGenerator[int, None]: |
| 623 | + yield 3 |
| 624 | + Err(IndexError("Test Error")).unwrap() |
| 625 | + yield 5 |
| 626 | + |
| 627 | + raising_generator = raises_unwrapping_error(123) |
| 628 | + with pytest.raises(UnwrapError): |
| 629 | + await anext(raising_generator) |
| 630 | + |
| 631 | + running_generator = does_not_raise_unwrapping_error(123) |
| 632 | + assert await anext(running_generator) == Ok(3) |
| 633 | + assert (await anext(running_generator)).unwrap_err().args[0] == "Test Error" |
| 634 | + with pytest.raises(StopAsyncIteration): |
| 635 | + await anext(running_generator) |
| 636 | + |
| 637 | + |
554 | 638 | @pytest.mark.asyncio |
555 | 639 | async def test_as_async_generator_result_with_send() -> None: |
556 | 640 | @as_async_generator_result(ValueError) |
|
0 commit comments