errors.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. use std::cell::{Ref, RefMut};
  2. use generational_box::{
  3. AlreadyBorrowedError, AlreadyBorrowedMutError, AnyStorage, BorrowError, BorrowMutError,
  4. GenerationalBox, GenerationalRef, GenerationalRefMut, Owner, UnsyncStorage, ValueDroppedError,
  5. };
  6. #[track_caller]
  7. fn read_at_location(
  8. value: GenerationalBox<i32>,
  9. ) -> (
  10. GenerationalRef<Ref<'static, i32>>,
  11. &'static std::panic::Location<'static>,
  12. ) {
  13. let location = std::panic::Location::caller();
  14. let read = value.read();
  15. (read, location)
  16. }
  17. #[track_caller]
  18. fn write_at_location(
  19. value: GenerationalBox<i32>,
  20. ) -> (
  21. GenerationalRefMut<RefMut<'static, i32>>,
  22. &'static std::panic::Location<'static>,
  23. ) {
  24. let location = std::panic::Location::caller();
  25. let write = value.write();
  26. (write, location)
  27. }
  28. #[track_caller]
  29. fn create_at_location(
  30. owner: &Owner,
  31. ) -> (GenerationalBox<i32>, &'static std::panic::Location<'static>) {
  32. let location = std::panic::Location::caller();
  33. let value = owner.insert(1);
  34. (value, location)
  35. }
  36. #[test]
  37. fn read_while_writing_error() {
  38. let owner = UnsyncStorage::owner();
  39. let value = owner.insert(1);
  40. let (write, location) = write_at_location(value);
  41. assert_eq!(
  42. value.try_read().err(),
  43. Some(BorrowError::AlreadyBorrowedMut(
  44. AlreadyBorrowedMutError::new(location)
  45. ))
  46. );
  47. drop(write);
  48. }
  49. #[test]
  50. fn read_after_dropped_error() {
  51. let owner = UnsyncStorage::owner();
  52. let (value, location) = create_at_location(&owner);
  53. drop(owner);
  54. assert_eq!(
  55. value.try_read().err(),
  56. Some(BorrowError::Dropped(ValueDroppedError::new(location)))
  57. );
  58. }
  59. #[test]
  60. fn write_while_writing_error() {
  61. let owner = UnsyncStorage::owner();
  62. let value = owner.insert(1);
  63. let (write, location) = write_at_location(value);
  64. assert_eq!(
  65. value.try_write().err(),
  66. Some(BorrowMutError::AlreadyBorrowedMut(
  67. AlreadyBorrowedMutError::new(location)
  68. ))
  69. );
  70. drop(write);
  71. }
  72. #[test]
  73. fn write_while_reading_error() {
  74. let owner = UnsyncStorage::owner();
  75. let value = owner.insert(1);
  76. let (read, location) = read_at_location(value);
  77. assert_eq!(
  78. value.try_write().err(),
  79. Some(BorrowMutError::AlreadyBorrowed(AlreadyBorrowedError::new(
  80. vec![location]
  81. )))
  82. );
  83. drop(read);
  84. }