test.rs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. extern crate std;
  2. use crate::*;
  3. use std::sync::Arc;
  4. extern crate test;
  5. use test::Bencher;
  6. fn init_continuous_with_arc<M: Into<XMark>>(xarray: &mut XArray<Arc<i32>, M>, item_num: i32) {
  7. for i in 0..item_num {
  8. let value = Arc::new(i);
  9. xarray.store(i as u64, value);
  10. }
  11. }
  12. fn init_sparse_with_arc<M: Into<XMark>>(xarray: &mut XArray<Arc<i32>, M>, item_num: i32) {
  13. for i in 0..2 * item_num {
  14. if i % 2 == 0 {
  15. let value = Arc::new(i);
  16. xarray.store(i as u64, value);
  17. }
  18. }
  19. }
  20. #[test]
  21. fn test_store_continuous() {
  22. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  23. init_continuous_with_arc(&mut xarray_arc, 10000);
  24. for i in 0..10000 {
  25. let value = xarray_arc.load(i as u64).unwrap();
  26. assert_eq!(*value.as_ref(), i);
  27. }
  28. }
  29. #[test]
  30. fn test_store_sparse() {
  31. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  32. init_sparse_with_arc(&mut xarray_arc, 10000);
  33. for i in 0..10000 {
  34. if i % 2 == 0 {
  35. let value = xarray_arc.load(i as u64).unwrap();
  36. assert_eq!(*value.as_ref(), i);
  37. }
  38. }
  39. }
  40. #[test]
  41. fn test_store_overwrite() {
  42. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  43. init_continuous_with_arc(&mut xarray_arc, 10000);
  44. // Overwrite 20 at index 10.
  45. let value = Arc::new(20);
  46. xarray_arc.store(10, value);
  47. let v = xarray_arc.load(10).unwrap();
  48. assert_eq!(*v.as_ref(), 20);
  49. // Overwrite 40 at index 10.
  50. let value = Arc::new(40);
  51. xarray_arc.store(10, value);
  52. let v = xarray_arc.load(10).unwrap();
  53. assert_eq!(*v.as_ref(), 40);
  54. }
  55. #[test]
  56. fn test_remove() {
  57. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  58. assert!(xarray_arc.remove(100).is_none());
  59. init_continuous_with_arc(&mut xarray_arc, 10000);
  60. for i in 0..10000 {
  61. assert_eq!(*xarray_arc.remove(i as u64).unwrap().as_ref(), i);
  62. let value = xarray_arc.load(i as u64);
  63. assert_eq!(value, None);
  64. assert!(xarray_arc.remove(i as u64).is_none());
  65. }
  66. }
  67. #[test]
  68. fn test_cursor_load() {
  69. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  70. init_continuous_with_arc(&mut xarray_arc, 10000);
  71. let mut cursor = xarray_arc.cursor(0);
  72. for i in 0..10000 {
  73. let value = cursor.load().unwrap();
  74. assert_eq!(*value.as_ref(), i);
  75. cursor.next();
  76. }
  77. cursor.reset_to(20000);
  78. assert!(cursor.load().is_none());
  79. }
  80. #[test]
  81. fn test_cursor_load_very_sparse() {
  82. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  83. xarray_arc.store(0, Arc::new(1));
  84. xarray_arc.store(10000, Arc::new(2));
  85. let mut cursor = xarray_arc.cursor(0);
  86. assert_eq!(*cursor.load().unwrap().as_ref(), 1);
  87. for _ in 0..10000 {
  88. cursor.next();
  89. }
  90. assert_eq!(*cursor.load().unwrap().as_ref(), 2);
  91. }
  92. #[test]
  93. fn test_cursor_store_continuous() {
  94. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  95. let mut cursor = xarray_arc.cursor_mut(0);
  96. for i in 0..10000 {
  97. let value = Arc::new(i);
  98. cursor.store(value);
  99. cursor.next();
  100. }
  101. drop(cursor);
  102. for i in 0..10000 {
  103. let value = xarray_arc.load(i as u64).unwrap();
  104. assert_eq!(*value.as_ref(), i);
  105. }
  106. }
  107. #[test]
  108. fn test_cursor_store_sparse() {
  109. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  110. let mut cursor = xarray_arc.cursor_mut(0);
  111. for i in 0..10000 {
  112. if i % 2 == 0 {
  113. let value = Arc::new(i);
  114. cursor.store(value);
  115. }
  116. cursor.next();
  117. }
  118. drop(cursor);
  119. for i in 0..10000 {
  120. if i % 2 == 0 {
  121. let value = xarray_arc.load(i as u64).unwrap();
  122. assert_eq!(*value.as_ref(), i);
  123. }
  124. }
  125. }
  126. #[test]
  127. fn test_set_mark() {
  128. let mut xarray_arc: XArray<Arc<i32>, XMark> = XArray::new();
  129. init_continuous_with_arc(&mut xarray_arc, 10000);
  130. let mut cursor = xarray_arc.cursor_mut(1000);
  131. cursor.set_mark(XMark::Mark0).unwrap();
  132. cursor.set_mark(XMark::Mark1).unwrap();
  133. cursor.reset_to(2000);
  134. cursor.set_mark(XMark::Mark1).unwrap();
  135. cursor.reset_to(1000);
  136. let value1_mark0 = cursor.is_marked(XMark::Mark0);
  137. let value1_mark1 = cursor.is_marked(XMark::Mark1);
  138. cursor.reset_to(2000);
  139. let value2_mark0 = cursor.is_marked(XMark::Mark0);
  140. let value2_mark1 = cursor.is_marked(XMark::Mark1);
  141. cursor.reset_to(3000);
  142. let value3_mark1 = cursor.is_marked(XMark::Mark1);
  143. assert_eq!(value1_mark0, true);
  144. assert_eq!(value1_mark1, true);
  145. assert_eq!(value2_mark0, false);
  146. assert_eq!(value2_mark1, true);
  147. assert_eq!(value3_mark1, false);
  148. }
  149. #[test]
  150. fn test_unset_mark() {
  151. let mut xarray_arc: XArray<Arc<i32>, XMark> = XArray::new();
  152. init_continuous_with_arc(&mut xarray_arc, 10000);
  153. let mut cursor = xarray_arc.cursor_mut(1000);
  154. cursor.set_mark(XMark::Mark0).unwrap();
  155. cursor.set_mark(XMark::Mark1).unwrap();
  156. cursor.unset_mark(XMark::Mark0).unwrap();
  157. cursor.unset_mark(XMark::Mark2).unwrap();
  158. let value1_mark0 = cursor.is_marked(XMark::Mark0);
  159. let value1_mark2 = cursor.is_marked(XMark::Mark2);
  160. assert_eq!(value1_mark0, false);
  161. assert_eq!(value1_mark2, false);
  162. }
  163. #[test]
  164. fn test_mark_overflow() {
  165. let mut xarray_arc: XArray<Arc<i32>, XMark> = XArray::new();
  166. init_continuous_with_arc(&mut xarray_arc, 10000);
  167. let mut cursor = xarray_arc.cursor_mut(20000);
  168. assert_eq!(Err(()), cursor.set_mark(XMark::Mark1));
  169. assert_eq!(false, cursor.is_marked(XMark::Mark1));
  170. }
  171. #[test]
  172. fn test_unset_mark_all() {
  173. let mut xarray_arc: XArray<Arc<i32>, XMark> = XArray::new();
  174. init_continuous_with_arc(&mut xarray_arc, 10000);
  175. xarray_arc.cursor_mut(2000).set_mark(XMark::Mark1).unwrap();
  176. xarray_arc.cursor_mut(2000).set_mark(XMark::Mark2).unwrap();
  177. xarray_arc.cursor_mut(200).set_mark(XMark::Mark1).unwrap();
  178. xarray_arc.unset_mark_all(XMark::Mark1);
  179. assert_eq!(xarray_arc.cursor(2000).is_marked(XMark::Mark1), false);
  180. assert_eq!(xarray_arc.cursor(2000).is_marked(XMark::Mark2), true);
  181. assert_eq!(xarray_arc.cursor(200).is_marked(XMark::Mark1), false);
  182. }
  183. #[test]
  184. fn test_cow() {
  185. use std::sync::atomic::AtomicU64;
  186. use std::sync::atomic::Ordering;
  187. static INIT_TIMES: AtomicU64 = AtomicU64::new(0);
  188. static DROP_TIMES: AtomicU64 = AtomicU64::new(0);
  189. struct Wrapper {
  190. raw: usize,
  191. }
  192. impl Drop for Wrapper {
  193. fn drop(&mut self) {
  194. DROP_TIMES.fetch_add(1, Ordering::Relaxed);
  195. }
  196. }
  197. impl Wrapper {
  198. fn new(raw: usize) -> Self {
  199. INIT_TIMES.fetch_add(1, Ordering::Relaxed);
  200. Self { raw }
  201. }
  202. }
  203. // Init xarray_arc.
  204. let mut xarray_arc: XArray<Arc<Wrapper>> = XArray::new();
  205. for i in 1..10000 {
  206. let value = Arc::new(Wrapper::new(i * 2));
  207. xarray_arc.store(i as u64, value);
  208. }
  209. // Clone the xarray_arc.
  210. let mut xarray_clone = xarray_arc.clone();
  211. // Store different items in xarray_arc and xarray_clone respectively.
  212. for i in 1..10000 {
  213. if i % 2 == 0 {
  214. let value = Arc::new(Wrapper::new(i * 6));
  215. xarray_arc.store(i as u64, value);
  216. } else {
  217. let value = Arc::new(Wrapper::new(i * 8));
  218. xarray_clone.store(i as u64, value);
  219. }
  220. }
  221. // Determine whether they do not affect each other
  222. for i in 1..10000 {
  223. let value_origin = xarray_arc.load(i).unwrap();
  224. let value_clone = xarray_clone.load(i).unwrap();
  225. if i % 2 == 0 {
  226. assert_eq!(value_origin.raw as u64, i * 6);
  227. assert_eq!(value_clone.raw as u64, i * 2);
  228. } else {
  229. assert_eq!(value_origin.raw as u64, i * 2);
  230. assert_eq!(value_clone.raw as u64, i * 8);
  231. }
  232. }
  233. drop(xarray_arc);
  234. drop(xarray_clone);
  235. // Check drop times.
  236. assert_eq!(
  237. INIT_TIMES.load(Ordering::Relaxed),
  238. DROP_TIMES.load(Ordering::Relaxed)
  239. );
  240. }
  241. #[test]
  242. fn test_cow_after_cow() {
  243. let mut xarray_arc: XArray<Arc<u64>> = XArray::new();
  244. for i in 1..10000 {
  245. let value = Arc::new(i * 2);
  246. xarray_arc.store(i as u64, value);
  247. }
  248. // First COW.
  249. let mut xarray_cow1 = xarray_arc.clone();
  250. for i in 5000..7000 {
  251. let value = Arc::new(i * 3);
  252. xarray_cow1.store(i as u64, value);
  253. }
  254. // Second COW.
  255. let mut xarray_cow2 = xarray_arc.clone();
  256. for i in 6000..8000 {
  257. let value = Arc::new(i * 4);
  258. xarray_cow2.store(i as u64, value);
  259. }
  260. // COW after COW.
  261. let xarray_cow1_cow = xarray_cow1.clone();
  262. let xarray_cow2_cow = xarray_cow2.clone();
  263. assert_eq!(*xarray_cow1_cow.load(2000).unwrap().as_ref(), 2000 * 2);
  264. assert_eq!(*xarray_cow1_cow.load(5100).unwrap().as_ref(), 5100 * 3);
  265. assert_eq!(*xarray_cow1_cow.load(6100).unwrap().as_ref(), 6100 * 3);
  266. assert_eq!(*xarray_cow1_cow.load(7100).unwrap().as_ref(), 7100 * 2);
  267. assert_eq!(*xarray_cow2_cow.load(2000).unwrap().as_ref(), 2000 * 2);
  268. assert_eq!(*xarray_cow2_cow.load(5100).unwrap().as_ref(), 5100 * 2);
  269. assert_eq!(*xarray_cow2_cow.load(6100).unwrap().as_ref(), 6100 * 4);
  270. assert_eq!(*xarray_cow2_cow.load(7100).unwrap().as_ref(), 7100 * 4);
  271. }
  272. #[test]
  273. fn test_cow_mark() {
  274. let mut xarray_arc: XArray<Arc<i32>, XMark> = XArray::new();
  275. for i in 1..10000 {
  276. let value = Arc::new(i * 2);
  277. xarray_arc.store(i as u64, value);
  278. }
  279. let mut xarray_clone = xarray_arc.clone();
  280. let mut cursor_arc = xarray_arc.cursor_mut(1000);
  281. let mut cursor_clone = xarray_clone.cursor_mut(1000);
  282. cursor_arc.set_mark(XMark::Mark0).unwrap();
  283. cursor_arc.reset_to(2000);
  284. cursor_arc.set_mark(XMark::Mark0).unwrap();
  285. cursor_arc.reset_to(3000);
  286. cursor_arc.set_mark(XMark::Mark0).unwrap();
  287. cursor_clone.set_mark(XMark::Mark1).unwrap();
  288. drop(cursor_arc);
  289. drop(cursor_clone);
  290. let mark0_1000_arc = xarray_arc.cursor(1000).is_marked(XMark::Mark0);
  291. let mark0_2000_arc = xarray_arc.cursor(2000).is_marked(XMark::Mark0);
  292. let mark1_1000_arc = xarray_arc.cursor(1000).is_marked(XMark::Mark1);
  293. let mark0_3000_arc = xarray_arc.cursor(3000).is_marked(XMark::Mark0);
  294. let mark0_1000_clone = xarray_clone.cursor(1000).is_marked(XMark::Mark0);
  295. let mark0_2000_clone = xarray_clone.cursor(2000).is_marked(XMark::Mark0);
  296. let mark1_1000_clone = xarray_clone.cursor(1000).is_marked(XMark::Mark1);
  297. let mark0_3000_clone = xarray_clone.cursor(3000).is_marked(XMark::Mark0);
  298. assert_eq!(mark0_1000_arc, true);
  299. assert_eq!(mark0_2000_arc, true);
  300. assert_eq!(mark1_1000_arc, false);
  301. assert_eq!(mark0_1000_clone, false);
  302. assert_eq!(mark0_2000_clone, false);
  303. assert_eq!(mark1_1000_clone, true);
  304. assert_eq!(mark0_3000_arc, true);
  305. assert_eq!(mark0_3000_clone, false);
  306. }
  307. #[test]
  308. fn test_cow_cursor() {
  309. let mut xarray_arc: XArray<Arc<u64>> = XArray::new();
  310. for i in 1..10000 {
  311. let value = Arc::new(i * 2);
  312. xarray_arc.store(i as u64, value);
  313. }
  314. let mut xarray_clone = xarray_arc.clone();
  315. let mut cursor_clone = xarray_clone.cursor_mut(1);
  316. let mut cursor_arc = xarray_arc.cursor_mut(1);
  317. // Use cursor to read xarray_clone;
  318. while cursor_clone.index() < 10000 {
  319. let index = cursor_clone.index();
  320. let item = cursor_clone.load().unwrap();
  321. assert_eq!(*item.as_ref(), index * 2);
  322. cursor_clone.next();
  323. }
  324. // Use cursor to write xarray_clone;
  325. cursor_clone.reset_to(1);
  326. while cursor_clone.index() < 10000 {
  327. let value = Arc::new(cursor_clone.index());
  328. let item = cursor_clone.store(value).unwrap();
  329. assert_eq!(*item.as_ref(), cursor_clone.index() * 2);
  330. cursor_clone.next();
  331. }
  332. // Use cursor to read xarray_arc;
  333. while cursor_arc.index() < 10000 {
  334. let index = cursor_arc.index();
  335. let item = cursor_arc.load().unwrap();
  336. assert_eq!(*item.as_ref(), index * 2);
  337. cursor_arc.next();
  338. }
  339. // Use cursor to write xarray_arc;
  340. cursor_arc.reset_to(1);
  341. while cursor_arc.index() < 10000 {
  342. let value = Arc::new(cursor_arc.index() * 3);
  343. let item = cursor_arc.store(value).unwrap();
  344. assert_eq!(*item.as_ref(), cursor_arc.index() * 2);
  345. cursor_arc.next();
  346. }
  347. // Use cursor to read xarray_arc and xarray_clone;
  348. cursor_arc.reset_to(1);
  349. cursor_clone.reset_to(1);
  350. while cursor_arc.index() < 10000 {
  351. let index_arc = cursor_arc.index();
  352. let index_clone = cursor_clone.index();
  353. let item_arc = cursor_arc.load().unwrap();
  354. let item_clone = cursor_clone.load().unwrap();
  355. assert_eq!(*item_arc.as_ref(), index_arc * 3);
  356. assert_eq!(*item_clone.as_ref(), index_clone);
  357. cursor_arc.next();
  358. cursor_clone.next();
  359. }
  360. }
  361. #[test]
  362. fn test_range() {
  363. let mut xarray_arc: XArray<Arc<i32>> = XArray::new();
  364. for i in 0..10000 {
  365. let value = Arc::new(i * 2);
  366. xarray_arc.store((i * 2) as u64, value);
  367. }
  368. let mut count = 0;
  369. for (index, item) in xarray_arc.range(1000..2000) {
  370. assert_eq!(*item.as_ref() as u64, index);
  371. count += 1;
  372. }
  373. assert_eq!(count, 500);
  374. }
  375. #[bench]
  376. fn benchmark_cursor_load(b: &mut Bencher) {
  377. b.iter(|| test_cursor_load());
  378. }
  379. #[bench]
  380. fn benchmark_cursor_store_continuous(b: &mut Bencher) {
  381. b.iter(|| test_cursor_store_continuous());
  382. }
  383. #[bench]
  384. fn benchmark_cursor_store_sparse(b: &mut Bencher) {
  385. b.iter(|| test_cursor_store_sparse());
  386. }