basic.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. use generational_box::{AnyStorage, GenerationalBox, UnsyncStorage};
  2. /// # Example
  3. ///
  4. /// ```compile_fail
  5. /// let data = String::from("hello world");
  6. /// let owner = UnsyncStorage::owner();
  7. /// let key = owner.insert(&data);
  8. /// drop(data);
  9. /// assert_eq!(*key.read(), "hello world");
  10. /// ```
  11. #[allow(unused)]
  12. fn compile_fail() {}
  13. #[test]
  14. fn reused() {
  15. let first_ptr;
  16. {
  17. let owner = UnsyncStorage::owner();
  18. first_ptr = owner.insert(1).raw_ptr();
  19. drop(owner);
  20. }
  21. {
  22. let owner = UnsyncStorage::owner();
  23. let second_ptr = owner.insert(1234).raw_ptr();
  24. assert_eq!(first_ptr, second_ptr);
  25. drop(owner);
  26. }
  27. }
  28. #[test]
  29. fn leaking_is_ok() {
  30. let data = String::from("hello world");
  31. let key;
  32. {
  33. // create an owner
  34. let owner = UnsyncStorage::owner();
  35. // insert data into the store
  36. key = owner.insert(data);
  37. // don't drop the owner
  38. std::mem::forget(owner);
  39. }
  40. assert_eq!(
  41. key.try_read().as_deref().unwrap(),
  42. &"hello world".to_string()
  43. );
  44. }
  45. #[test]
  46. fn drops() {
  47. let data = String::from("hello world");
  48. let key;
  49. {
  50. // create an owner
  51. let owner = UnsyncStorage::owner();
  52. // insert data into the store
  53. key = owner.insert(data);
  54. // drop the owner
  55. }
  56. assert!(key.try_read().is_err());
  57. }
  58. #[test]
  59. fn works() {
  60. let owner = UnsyncStorage::owner();
  61. let key = owner.insert(1);
  62. assert_eq!(*key.read(), 1);
  63. }
  64. #[test]
  65. fn insert_while_reading() {
  66. let owner = UnsyncStorage::owner();
  67. let key;
  68. {
  69. let data: String = "hello world".to_string();
  70. key = owner.insert(data);
  71. }
  72. let value = key.read();
  73. owner.insert(&1);
  74. assert_eq!(*value, "hello world");
  75. }
  76. #[test]
  77. #[should_panic]
  78. fn panics() {
  79. let owner = UnsyncStorage::owner();
  80. let key = owner.insert(1);
  81. drop(owner);
  82. assert_eq!(*key.read(), 1);
  83. }
  84. #[test]
  85. fn fuzz() {
  86. fn maybe_owner_scope(
  87. valid_keys: &mut Vec<GenerationalBox<String>>,
  88. invalid_keys: &mut Vec<GenerationalBox<String>>,
  89. path: &mut Vec<u8>,
  90. ) {
  91. let branch_cutoff = 5;
  92. let children = if path.len() < branch_cutoff {
  93. rand::random::<u8>() % 4
  94. } else {
  95. rand::random::<u8>() % 2
  96. };
  97. for i in 0..children {
  98. let owner = UnsyncStorage::owner();
  99. let key = owner.insert(format!("hello world {path:?}"));
  100. valid_keys.push(key);
  101. path.push(i);
  102. // read all keys
  103. println!("{:?}", path);
  104. for key in valid_keys.iter() {
  105. let value = key.read();
  106. println!("{:?}", &*value);
  107. assert!(value.starts_with("hello world"));
  108. }
  109. #[cfg(any(debug_assertions, feature = "check_generation"))]
  110. for key in invalid_keys.iter() {
  111. assert!(key.try_read().is_err());
  112. }
  113. maybe_owner_scope(valid_keys, invalid_keys, path);
  114. invalid_keys.push(valid_keys.pop().unwrap());
  115. path.pop();
  116. }
  117. }
  118. for _ in 0..10 {
  119. maybe_owner_scope(&mut Vec::new(), &mut Vec::new(), &mut Vec::new());
  120. }
  121. }