errors.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. #[allow(unused)]
  64. let (write, location) = write_at_location(value);
  65. let write_result = value.try_write();
  66. assert!(write_result.is_err());
  67. #[cfg(debug_assertions)]
  68. assert_eq!(
  69. write_result.err(),
  70. Some(BorrowMutError::AlreadyBorrowedMut(
  71. AlreadyBorrowedMutError::new(location)
  72. ))
  73. );
  74. drop(write);
  75. }
  76. #[test]
  77. fn write_while_reading_error() {
  78. let owner = UnsyncStorage::owner();
  79. let value = owner.insert(1);
  80. let (read, location) = read_at_location(value);
  81. assert_eq!(
  82. value.try_write().err(),
  83. Some(BorrowMutError::AlreadyBorrowed(AlreadyBorrowedError::new(
  84. vec![location]
  85. )))
  86. );
  87. drop(read);
  88. }