automerge-rb 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +175 -0
  4. data/ext/automerge_ext/automerge_ext.c +1805 -0
  5. data/ext/automerge_ext/extconf.rb +132 -0
  6. data/lib/automerge/version.rb +6 -0
  7. data/lib/automerge.rb +110 -0
  8. data/rust-toolchain.toml +4 -0
  9. data/vendor/automerge-rust/Cargo.lock +1909 -0
  10. data/vendor/automerge-rust/Cargo.toml +15 -0
  11. data/vendor/automerge-rust/automerge/Cargo.toml +78 -0
  12. data/vendor/automerge-rust/automerge/README.md +5 -0
  13. data/vendor/automerge-rust/automerge/benches/load_save.rs +102 -0
  14. data/vendor/automerge-rust/automerge/benches/map.rs +260 -0
  15. data/vendor/automerge-rust/automerge/benches/range.rs +37 -0
  16. data/vendor/automerge-rust/automerge/benches/sync.rs +95 -0
  17. data/vendor/automerge-rust/automerge/examples/README.md +7 -0
  18. data/vendor/automerge-rust/automerge/examples/quickstart.rs +57 -0
  19. data/vendor/automerge-rust/automerge/examples/watch.rs +94 -0
  20. data/vendor/automerge-rust/automerge/fuzz/Cargo.toml +29 -0
  21. data/vendor/automerge-rust/automerge/fuzz/fuzz_targets/load.rs +37 -0
  22. data/vendor/automerge-rust/automerge/src/autocommit.rs +1286 -0
  23. data/vendor/automerge-rust/automerge/src/automerge/current_state.rs +546 -0
  24. data/vendor/automerge-rust/automerge/src/automerge/tests.rs +2023 -0
  25. data/vendor/automerge-rust/automerge/src/automerge.rs +2071 -0
  26. data/vendor/automerge-rust/automerge/src/autoserde.rs +128 -0
  27. data/vendor/automerge-rust/automerge/src/change.rs +357 -0
  28. data/vendor/automerge-rust/automerge/src/change_graph.rs +1215 -0
  29. data/vendor/automerge-rust/automerge/src/change_queue.rs +46 -0
  30. data/vendor/automerge-rust/automerge/src/clock.rs +206 -0
  31. data/vendor/automerge-rust/automerge/src/columnar/column_range/boolean.rs +83 -0
  32. data/vendor/automerge-rust/automerge/src/columnar/column_range/delta.rs +148 -0
  33. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/group.rs +138 -0
  34. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/simple.rs +76 -0
  35. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic.rs +93 -0
  36. data/vendor/automerge-rust/automerge/src/columnar/column_range/key.rs +272 -0
  37. data/vendor/automerge-rust/automerge/src/columnar/column_range/obj_id.rs +202 -0
  38. data/vendor/automerge-rust/automerge/src/columnar/column_range/opid_list.rs +329 -0
  39. data/vendor/automerge-rust/automerge/src/columnar/column_range/raw.rs +38 -0
  40. data/vendor/automerge-rust/automerge/src/columnar/column_range/rle.rs +216 -0
  41. data/vendor/automerge-rust/automerge/src/columnar/column_range/value.rs +547 -0
  42. data/vendor/automerge-rust/automerge/src/columnar/column_range.rs +17 -0
  43. data/vendor/automerge-rust/automerge/src/columnar/encoding/boolean.rs +197 -0
  44. data/vendor/automerge-rust/automerge/src/columnar/encoding/col_error.rs +88 -0
  45. data/vendor/automerge-rust/automerge/src/columnar/encoding/column_decoder.rs +133 -0
  46. data/vendor/automerge-rust/automerge/src/columnar/encoding/decodable_impls.rs +175 -0
  47. data/vendor/automerge-rust/automerge/src/columnar/encoding/delta.rs +96 -0
  48. data/vendor/automerge-rust/automerge/src/columnar/encoding/encodable_impls.rs +200 -0
  49. data/vendor/automerge-rust/automerge/src/columnar/encoding/leb128.rs +82 -0
  50. data/vendor/automerge-rust/automerge/src/columnar/encoding/properties.rs +178 -0
  51. data/vendor/automerge-rust/automerge/src/columnar/encoding/raw.rs +101 -0
  52. data/vendor/automerge-rust/automerge/src/columnar/encoding/rle.rs +239 -0
  53. data/vendor/automerge-rust/automerge/src/columnar/encoding.rs +67 -0
  54. data/vendor/automerge-rust/automerge/src/columnar/splice_error.rs +47 -0
  55. data/vendor/automerge-rust/automerge/src/columnar.rs +14 -0
  56. data/vendor/automerge-rust/automerge/src/convert.rs +112 -0
  57. data/vendor/automerge-rust/automerge/src/cursor.rs +296 -0
  58. data/vendor/automerge-rust/automerge/src/decoding.rs +475 -0
  59. data/vendor/automerge-rust/automerge/src/error.rs +159 -0
  60. data/vendor/automerge-rust/automerge/src/exid.rs +238 -0
  61. data/vendor/automerge-rust/automerge/src/hydrate/list.rs +140 -0
  62. data/vendor/automerge-rust/automerge/src/hydrate/map.rs +132 -0
  63. data/vendor/automerge-rust/automerge/src/hydrate/tests.rs +40 -0
  64. data/vendor/automerge-rust/automerge/src/hydrate/text.rs +89 -0
  65. data/vendor/automerge-rust/automerge/src/hydrate.rs +368 -0
  66. data/vendor/automerge-rust/automerge/src/indexed_cache.rs +113 -0
  67. data/vendor/automerge-rust/automerge/src/iter/doc.rs +603 -0
  68. data/vendor/automerge-rust/automerge/src/iter/keys.rs +93 -0
  69. data/vendor/automerge-rust/automerge/src/iter/list_range.rs +433 -0
  70. data/vendor/automerge-rust/automerge/src/iter/map_range.rs +316 -0
  71. data/vendor/automerge-rust/automerge/src/iter/spans.rs +601 -0
  72. data/vendor/automerge-rust/automerge/src/iter/tools.rs +427 -0
  73. data/vendor/automerge-rust/automerge/src/iter/values.rs +36 -0
  74. data/vendor/automerge-rust/automerge/src/iter.rs +25 -0
  75. data/vendor/automerge-rust/automerge/src/legacy/mod.rs +364 -0
  76. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/actor_id.rs +25 -0
  77. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/change_hash.rs +29 -0
  78. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/element_id.rs +27 -0
  79. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/mod.rs +31 -0
  80. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/object_id.rs +36 -0
  81. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op.rs +668 -0
  82. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op_type.rs +26 -0
  83. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/opid.rs +25 -0
  84. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/scalar_value.rs +63 -0
  85. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/element_id.rs +66 -0
  86. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/key.rs +49 -0
  87. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/mod.rs +4 -0
  88. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/object_id.rs +74 -0
  89. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/opid.rs +68 -0
  90. data/vendor/automerge-rust/automerge/src/lib.rs +315 -0
  91. data/vendor/automerge-rust/automerge/src/marks.rs +478 -0
  92. data/vendor/automerge-rust/automerge/src/op_set2/change/batch.rs +2002 -0
  93. data/vendor/automerge-rust/automerge/src/op_set2/change/collector.rs +974 -0
  94. data/vendor/automerge-rust/automerge/src/op_set2/change.rs +332 -0
  95. data/vendor/automerge-rust/automerge/src/op_set2/columns.rs +714 -0
  96. data/vendor/automerge-rust/automerge/src/op_set2/meta.rs +174 -0
  97. data/vendor/automerge-rust/automerge/src/op_set2/op.rs +1363 -0
  98. data/vendor/automerge-rust/automerge/src/op_set2/op_set/elems.rs +43 -0
  99. data/vendor/automerge-rust/automerge/src/op_set2/op_set/found_op.rs +60 -0
  100. data/vendor/automerge-rust/automerge/src/op_set2/op_set/index.rs +197 -0
  101. data/vendor/automerge-rust/automerge/src/op_set2/op_set/insert.rs +179 -0
  102. data/vendor/automerge-rust/automerge/src/op_set2/op_set/mark_index.rs +292 -0
  103. data/vendor/automerge-rust/automerge/src/op_set2/op_set/marks.rs +86 -0
  104. data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_iter.rs +1295 -0
  105. data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_query.rs +82 -0
  106. data/vendor/automerge-rust/automerge/src/op_set2/op_set/top_op.rs +50 -0
  107. data/vendor/automerge-rust/automerge/src/op_set2/op_set/visible.rs +290 -0
  108. data/vendor/automerge-rust/automerge/src/op_set2/op_set.rs +1793 -0
  109. data/vendor/automerge-rust/automerge/src/op_set2/parents.rs +133 -0
  110. data/vendor/automerge-rust/automerge/src/op_set2/skip_list.rs +714 -0
  111. data/vendor/automerge-rust/automerge/src/op_set2/types.rs +769 -0
  112. data/vendor/automerge-rust/automerge/src/op_set2.rs +18 -0
  113. data/vendor/automerge-rust/automerge/src/patches/patch.rs +95 -0
  114. data/vendor/automerge-rust/automerge/src/patches/patch_builder.rs +382 -0
  115. data/vendor/automerge-rust/automerge/src/patches/patch_log.rs +584 -0
  116. data/vendor/automerge-rust/automerge/src/patches.rs +7 -0
  117. data/vendor/automerge-rust/automerge/src/query/list_state.rs +230 -0
  118. data/vendor/automerge-rust/automerge/src/query/seek_mark.rs +142 -0
  119. data/vendor/automerge-rust/automerge/src/read.rs +326 -0
  120. data/vendor/automerge-rust/automerge/src/sequence_tree.rs +662 -0
  121. data/vendor/automerge-rust/automerge/src/storage/bundle/builder.rs +942 -0
  122. data/vendor/automerge-rust/automerge/src/storage/bundle/error.rs +42 -0
  123. data/vendor/automerge-rust/automerge/src/storage/bundle/meta.rs +23 -0
  124. data/vendor/automerge-rust/automerge/src/storage/bundle/storage.rs +146 -0
  125. data/vendor/automerge-rust/automerge/src/storage/bundle.rs +210 -0
  126. data/vendor/automerge-rust/automerge/src/storage/change/change_actors.rs +311 -0
  127. data/vendor/automerge-rust/automerge/src/storage/change/change_op_columns.rs +621 -0
  128. data/vendor/automerge-rust/automerge/src/storage/change/compressed.rs +51 -0
  129. data/vendor/automerge-rust/automerge/src/storage/change/op_with_change_actors.rs +1 -0
  130. data/vendor/automerge-rust/automerge/src/storage/change.rs +523 -0
  131. data/vendor/automerge-rust/automerge/src/storage/chunk.rs +312 -0
  132. data/vendor/automerge-rust/automerge/src/storage/columns/column.rs +42 -0
  133. data/vendor/automerge-rust/automerge/src/storage/columns/column_builder.rs +199 -0
  134. data/vendor/automerge-rust/automerge/src/storage/columns/column_specification.rs +340 -0
  135. data/vendor/automerge-rust/automerge/src/storage/columns/raw_column.rs +286 -0
  136. data/vendor/automerge-rust/automerge/src/storage/columns.rs +355 -0
  137. data/vendor/automerge-rust/automerge/src/storage/document/compression.rs +362 -0
  138. data/vendor/automerge-rust/automerge/src/storage/document.rs +411 -0
  139. data/vendor/automerge-rust/automerge/src/storage/load/change_collector.rs +15 -0
  140. data/vendor/automerge-rust/automerge/src/storage/load.rs +136 -0
  141. data/vendor/automerge-rust/automerge/src/storage/parse/leb128.rs +302 -0
  142. data/vendor/automerge-rust/automerge/src/storage/parse.rs +619 -0
  143. data/vendor/automerge-rust/automerge/src/storage/save/document.rs +27 -0
  144. data/vendor/automerge-rust/automerge/src/storage.rs +26 -0
  145. data/vendor/automerge-rust/automerge/src/sync/bloom.rs +161 -0
  146. data/vendor/automerge-rust/automerge/src/sync/message_builder.rs +118 -0
  147. data/vendor/automerge-rust/automerge/src/sync/state.rs +214 -0
  148. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/bloom.rs +162 -0
  149. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/mod.rs +625 -0
  150. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/state.rs +120 -0
  151. data/vendor/automerge-rust/automerge/src/sync.rs +2482 -0
  152. data/vendor/automerge-rust/automerge/src/text_diff/LICENSE +201 -0
  153. data/vendor/automerge-rust/automerge/src/text_diff/myers.rs +332 -0
  154. data/vendor/automerge-rust/automerge/src/text_diff/replace.rs +139 -0
  155. data/vendor/automerge-rust/automerge/src/text_diff/utils.rs +119 -0
  156. data/vendor/automerge-rust/automerge/src/text_diff.rs +515 -0
  157. data/vendor/automerge-rust/automerge/src/text_value.rs +276 -0
  158. data/vendor/automerge-rust/automerge/src/transaction/commit.rs +34 -0
  159. data/vendor/automerge-rust/automerge/src/transaction/inner.rs +1403 -0
  160. data/vendor/automerge-rust/automerge/src/transaction/manual_transaction.rs +147 -0
  161. data/vendor/automerge-rust/automerge/src/transaction/owned_transaction.rs +266 -0
  162. data/vendor/automerge-rust/automerge/src/transaction/result.rs +21 -0
  163. data/vendor/automerge-rust/automerge/src/transaction/transactable.rs +203 -0
  164. data/vendor/automerge-rust/automerge/src/transaction.rs +513 -0
  165. data/vendor/automerge-rust/automerge/src/types.rs +749 -0
  166. data/vendor/automerge-rust/automerge/src/validation.rs +29 -0
  167. data/vendor/automerge-rust/automerge/src/value.rs +763 -0
  168. data/vendor/automerge-rust/automerge/tests/batch_insert.rs +1034 -0
  169. data/vendor/automerge-rust/automerge/tests/block_tests.rs +887 -0
  170. data/vendor/automerge-rust/automerge/tests/convert_string_to_text.rs +72 -0
  171. data/vendor/automerge-rust/automerge/tests/diff_marks.rs +1508 -0
  172. data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_change.automerge +0 -0
  173. data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge +0 -0
  174. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge +0 -0
  175. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_ok.automerge +0 -0
  176. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_overlong.automerge +0 -0
  177. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks.automerge +0 -0
  178. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge +0 -0
  179. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge +0 -0
  180. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/action-is-48.automerge +0 -0
  181. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 +0 -0
  182. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge +0 -0
  183. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge +0 -0
  184. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/missing_actor.automerge +0 -0
  185. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge +0 -0
  186. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_deps.automerge +0 -0
  187. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_ops.automerge +0 -0
  188. data/vendor/automerge-rust/automerge/tests/test.rs +2668 -0
  189. data/vendor/automerge-rust/automerge/tests/test_mark_patches.rs +41 -0
  190. data/vendor/automerge-rust/automerge/tests/test_save_load_orphans.rs +84 -0
  191. data/vendor/automerge-rust/automerge/tests/text.rs +1098 -0
  192. data/vendor/automerge-rust/automerge/tests/text_encoding.rs +640 -0
  193. data/vendor/automerge-rust/automerge-c/CMakeLists.txt +439 -0
  194. data/vendor/automerge-rust/automerge-c/Cargo.toml +22 -0
  195. data/vendor/automerge-rust/automerge-c/README.md +233 -0
  196. data/vendor/automerge-rust/automerge-c/build.rs +21 -0
  197. data/vendor/automerge-rust/automerge-c/cbindgen.toml +48 -0
  198. data/vendor/automerge-rust/automerge-c/cmake/Cargo.toml.in +22 -0
  199. data/vendor/automerge-rust/automerge-c/cmake/automerge-c-config.cmake.in +99 -0
  200. data/vendor/automerge-rust/automerge-c/cmake/cbindgen.toml.in +48 -0
  201. data/vendor/automerge-rust/automerge-c/cmake/config.h.in +58 -0
  202. data/vendor/automerge-rust/automerge-c/cmake/enum-string-functions-gen.cmake +183 -0
  203. data/vendor/automerge-rust/automerge-c/cmake/file-regex-replace.cmake +33 -0
  204. data/vendor/automerge-rust/automerge-c/cmake/file-touch.cmake +35 -0
  205. data/vendor/automerge-rust/automerge-c/docs/CMakeLists.txt +39 -0
  206. data/vendor/automerge-rust/automerge-c/docs/img/brandmark.png +0 -0
  207. data/vendor/automerge-rust/automerge-c/examples/CMakeLists.txt +42 -0
  208. data/vendor/automerge-rust/automerge-c/examples/README.md +9 -0
  209. data/vendor/automerge-rust/automerge-c/examples/quickstart.c +131 -0
  210. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/result.h +30 -0
  211. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack.h +130 -0
  212. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack_callback_data.h +53 -0
  213. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/string.h +29 -0
  214. data/vendor/automerge-rust/automerge-c/src/actor_id.rs +193 -0
  215. data/vendor/automerge-rust/automerge-c/src/byte_span.rs +227 -0
  216. data/vendor/automerge-rust/automerge-c/src/change.rs +356 -0
  217. data/vendor/automerge-rust/automerge-c/src/cursor.rs +168 -0
  218. data/vendor/automerge-rust/automerge-c/src/doc/list.rs +636 -0
  219. data/vendor/automerge-rust/automerge-c/src/doc/map.rs +556 -0
  220. data/vendor/automerge-rust/automerge-c/src/doc/mark.rs +296 -0
  221. data/vendor/automerge-rust/automerge-c/src/doc/utils.rs +46 -0
  222. data/vendor/automerge-rust/automerge-c/src/doc.rs +1009 -0
  223. data/vendor/automerge-rust/automerge-c/src/index.rs +84 -0
  224. data/vendor/automerge-rust/automerge-c/src/item.rs +2177 -0
  225. data/vendor/automerge-rust/automerge-c/src/items.rs +401 -0
  226. data/vendor/automerge-rust/automerge-c/src/lib.rs +11 -0
  227. data/vendor/automerge-rust/automerge-c/src/obj.rs +216 -0
  228. data/vendor/automerge-rust/automerge-c/src/result.rs +653 -0
  229. data/vendor/automerge-rust/automerge-c/src/sync/have.rs +42 -0
  230. data/vendor/automerge-rust/automerge-c/src/sync/message.rs +146 -0
  231. data/vendor/automerge-rust/automerge-c/src/sync/state.rs +262 -0
  232. data/vendor/automerge-rust/automerge-c/src/sync.rs +7 -0
  233. data/vendor/automerge-rust/automerge-c/src/utils/result.c +33 -0
  234. data/vendor/automerge-rust/automerge-c/src/utils/stack.c +106 -0
  235. data/vendor/automerge-rust/automerge-c/src/utils/stack_callback_data.c +9 -0
  236. data/vendor/automerge-rust/automerge-c/src/utils/string.c +46 -0
  237. data/vendor/automerge-rust/automerge-c/test/CMakeLists.txt +67 -0
  238. data/vendor/automerge-rust/automerge-c/test/actor_id_tests.c +140 -0
  239. data/vendor/automerge-rust/automerge-c/test/base_state.c +17 -0
  240. data/vendor/automerge-rust/automerge-c/test/base_state.h +39 -0
  241. data/vendor/automerge-rust/automerge-c/test/byte_span_tests.c +119 -0
  242. data/vendor/automerge-rust/automerge-c/test/cmocka_utils.c +91 -0
  243. data/vendor/automerge-rust/automerge-c/test/cmocka_utils.h +42 -0
  244. data/vendor/automerge-rust/automerge-c/test/cursor_tests.c +263 -0
  245. data/vendor/automerge-rust/automerge-c/test/doc_state.c +27 -0
  246. data/vendor/automerge-rust/automerge-c/test/doc_state.h +17 -0
  247. data/vendor/automerge-rust/automerge-c/test/doc_tests.c +335 -0
  248. data/vendor/automerge-rust/automerge-c/test/enum_string_tests.c +148 -0
  249. data/vendor/automerge-rust/automerge-c/test/files/brave-ape-49.automerge +0 -0
  250. data/vendor/automerge-rust/automerge-c/test/item_tests.c +313 -0
  251. data/vendor/automerge-rust/automerge-c/test/list_tests.c +544 -0
  252. data/vendor/automerge-rust/automerge-c/test/macro_utils.c +38 -0
  253. data/vendor/automerge-rust/automerge-c/test/macro_utils.h +23 -0
  254. data/vendor/automerge-rust/automerge-c/test/main.c +33 -0
  255. data/vendor/automerge-rust/automerge-c/test/map_tests.c +1610 -0
  256. data/vendor/automerge-rust/automerge-c/test/mark_tests.c +124 -0
  257. data/vendor/automerge-rust/automerge-c/test/ported_wasm/basic_tests.c +1642 -0
  258. data/vendor/automerge-rust/automerge-c/test/ported_wasm/cursor_tests.c +108 -0
  259. data/vendor/automerge-rust/automerge-c/test/ported_wasm/suite.c +17 -0
  260. data/vendor/automerge-rust/automerge-c/test/ported_wasm/sync_tests.c +1280 -0
  261. data/vendor/automerge-rust/automerge-c/test/str_utils.c +15 -0
  262. data/vendor/automerge-rust/automerge-c/test/str_utils.h +17 -0
  263. data/vendor/automerge-rust/automerge-test/Cargo.toml +17 -0
  264. data/vendor/automerge-rust/automerge-test/README.md +3 -0
  265. data/vendor/automerge-rust/automerge-test/src/lib.rs +487 -0
  266. data/vendor/automerge-rust/hexane/CHANGELOG.md +34 -0
  267. data/vendor/automerge-rust/hexane/Cargo.toml +47 -0
  268. data/vendor/automerge-rust/hexane/README.md +292 -0
  269. data/vendor/automerge-rust/hexane/RESULTS.txt +20 -0
  270. data/vendor/automerge-rust/hexane/TODO +18 -0
  271. data/vendor/automerge-rust/hexane/benches/insert.rs +82 -0
  272. data/vendor/automerge-rust/hexane/benches/seek.rs +77 -0
  273. data/vendor/automerge-rust/hexane/benches/splice.rs +82 -0
  274. data/vendor/automerge-rust/hexane/src/aggregate.rs +288 -0
  275. data/vendor/automerge-rust/hexane/src/boolean.rs +478 -0
  276. data/vendor/automerge-rust/hexane/src/columndata.rs +2540 -0
  277. data/vendor/automerge-rust/hexane/src/cursor.rs +756 -0
  278. data/vendor/automerge-rust/hexane/src/delta.rs +793 -0
  279. data/vendor/automerge-rust/hexane/src/encoder.rs +639 -0
  280. data/vendor/automerge-rust/hexane/src/leb128.rs +82 -0
  281. data/vendor/automerge-rust/hexane/src/lib.rs +95 -0
  282. data/vendor/automerge-rust/hexane/src/pack.rs +325 -0
  283. data/vendor/automerge-rust/hexane/src/raw.rs +314 -0
  284. data/vendor/automerge-rust/hexane/src/rle.rs +928 -0
  285. data/vendor/automerge-rust/hexane/src/slab/tree.rs +1373 -0
  286. data/vendor/automerge-rust/hexane/src/slab/writer.rs +535 -0
  287. data/vendor/automerge-rust/hexane/src/slab.rs +224 -0
  288. data/vendor/automerge-rust/hexane/src/test.rs +108 -0
  289. data/vendor/bundle/ruby/3.3.0/bin/rake +29 -0
  290. data/vendor/bundle/ruby/3.3.0/bin/rake-compiler +29 -0
  291. data/vendor/bundle/ruby/3.3.0/bin/rake-compiler-dock +29 -0
  292. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/History.rdoc +1732 -0
  293. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Manifest.txt +32 -0
  294. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/README.rdoc +845 -0
  295. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Rakefile +97 -0
  296. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/design_rationale.rb +54 -0
  297. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/hoe/minitest.rb +30 -0
  298. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/assertions.rb +850 -0
  299. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/autorun.rb +6 -0
  300. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/benchmark.rb +452 -0
  301. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/compress.rb +94 -0
  302. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/error_on_warning.rb +11 -0
  303. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/expectations.rb +321 -0
  304. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/hell.rb +11 -0
  305. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/manual_plugins.rb +16 -0
  306. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/mock.rb +327 -0
  307. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/parallel.rb +72 -0
  308. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride.rb +4 -0
  309. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride_plugin.rb +135 -0
  310. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/spec.rb +353 -0
  311. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test.rb +238 -0
  312. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test_task.rb +324 -0
  313. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/unit.rb +42 -0
  314. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest.rb +1250 -0
  315. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/metametameta.rb +150 -0
  316. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_assertions.rb +1677 -0
  317. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_benchmark.rb +137 -0
  318. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_mock.rb +1213 -0
  319. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_reporter.rb +437 -0
  320. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_spec.rb +1159 -0
  321. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test.rb +1374 -0
  322. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test_task.rb +57 -0
  323. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/History.rdoc +2454 -0
  324. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
  325. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/README.rdoc +155 -0
  326. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
  327. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
  328. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
  329. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/a.c +6 -0
  330. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/b.c +6 -0
  331. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/main.c +11 -0
  332. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
  333. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
  334. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
  335. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rake.1 +156 -0
  336. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
  337. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
  338. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/exe/rake +27 -0
  339. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
  340. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
  341. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
  342. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
  343. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
  344. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
  345. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
  346. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
  347. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
  348. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
  349. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
  350. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
  351. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
  352. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
  353. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
  354. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
  355. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
  356. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
  357. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
  358. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
  359. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
  360. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
  361. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
  362. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
  363. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
  364. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
  365. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
  366. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
  367. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
  368. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
  369. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
  370. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
  371. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
  372. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
  373. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
  374. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
  375. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
  376. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
  377. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
  378. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
  379. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
  380. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
  381. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
  382. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake.rb +69 -0
  383. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/rake.gemspec +102 -0
  384. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Gemfile +8 -0
  385. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/History.md +695 -0
  386. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/LICENSE.txt +20 -0
  387. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/README.md +476 -0
  388. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Rakefile +15 -0
  389. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/appveyor.yml +22 -0
  390. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/bin/rake-compiler +24 -0
  391. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/cucumber.yml +4 -0
  392. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/compile.feature +79 -0
  393. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-compile.feature +23 -0
  394. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package-multi.feature +15 -0
  395. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package.feature +14 -0
  396. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-compile.feature +22 -0
  397. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-no-native-compile.feature +33 -0
  398. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-package.feature +24 -0
  399. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/package.feature +40 -0
  400. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/compilation.rb +70 -0
  401. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/cross_compilation.rb +27 -0
  402. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/execution.rb +52 -0
  403. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/folders.rb +32 -0
  404. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/gem.rb +46 -0
  405. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/java_compilation.rb +7 -0
  406. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/env.rb +10 -0
  407. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/file_template_helpers.rb +137 -0
  408. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/generator_helpers.rb +123 -0
  409. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/platform_extension_helpers.rb +27 -0
  410. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/baseextensiontask.rb +90 -0
  411. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/compiler_config.rb +38 -0
  412. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensioncompiler.rb +51 -0
  413. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensiontask.rb +589 -0
  414. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/javaextensiontask.rb +321 -0
  415. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bin/cross-ruby.rake +189 -0
  416. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bootstrap.rake +11 -0
  417. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/common.rake +10 -0
  418. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/cucumber.rake +23 -0
  419. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/gem.rake +15 -0
  420. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/rspec.rake +9 -0
  421. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
  422. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
  423. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
  424. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
  425. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
  426. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
  427. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
  428. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
  429. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
  430. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
  431. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
  432. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
  433. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
  434. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
  435. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
  436. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
  437. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0004-Enable-build-of-static-libruby.patch +38 -0
  438. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0005-build-miniruby-first.patch +16 -0
  439. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0006-ruby-4-rubyspec-capiext.patch +16 -0
  440. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
  441. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
  442. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
  443. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
  444. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
  445. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
  446. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
  447. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
  448. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
  449. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
  450. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
  451. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
  452. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
  453. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
  454. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
  455. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
  456. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
  457. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
  458. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
  459. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
  460. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
  461. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
  462. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
  463. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
  464. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
  465. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
  466. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.c +65 -0
  467. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.h +11 -0
  468. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
  469. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
  470. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
  471. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
  472. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
  473. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
  474. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
  475. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
  476. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
  477. data/vendor/bundle/ruby/3.3.0/specifications/minitest-5.27.0.gemspec +32 -0
  478. data/vendor/bundle/ruby/3.3.0/specifications/rake-13.4.2.gemspec +26 -0
  479. data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-1.3.1.gemspec +33 -0
  480. data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
  481. metadata +584 -0
@@ -0,0 +1,2023 @@
1
+ use itertools::Itertools;
2
+ use pretty_assertions::assert_eq;
3
+
4
+ use super::*;
5
+ use crate::iter::*;
6
+ use crate::op_tree::B;
7
+ use crate::transaction::Transactable;
8
+ use crate::*;
9
+ use std::convert::TryInto;
10
+
11
+ use test_log::test;
12
+
13
+ #[test]
14
+ fn insert_op() -> Result<(), AutomergeError> {
15
+ let mut doc = Automerge::new();
16
+ doc.set_actor(ActorId::random());
17
+ let mut tx = doc.transaction();
18
+ tx.put(ROOT, "hello", "world")?;
19
+ tx.get(ROOT, "hello")?;
20
+ tx.commit();
21
+ Ok(())
22
+ }
23
+
24
+ #[test]
25
+ fn test_set() -> Result<(), AutomergeError> {
26
+ let mut doc = Automerge::new();
27
+ let mut tx = doc.transaction();
28
+ // setting a scalar value shouldn't return an opid as no object was created.
29
+ tx.put(ROOT, "a", 1)?;
30
+
31
+ // setting the same value shouldn't return an opid as there is no change.
32
+ tx.put(ROOT, "a", 1)?;
33
+
34
+ assert_eq!(tx.pending_ops(), 1);
35
+
36
+ let map = tx.put_object(ROOT, "b", ObjType::Map)?;
37
+ // object already exists at b but setting a map again overwrites it so we get an opid.
38
+ tx.put(map, "a", 2)?;
39
+
40
+ tx.put_object(ROOT, "b", ObjType::Map)?;
41
+
42
+ assert_eq!(tx.pending_ops(), 4);
43
+ let map = tx.get(ROOT, "b").unwrap().unwrap().1;
44
+ assert_eq!(tx.get(&map, "a")?, None);
45
+
46
+ tx.commit();
47
+ Ok(())
48
+ }
49
+
50
+ #[test]
51
+ fn test_list() -> Result<(), AutomergeError> {
52
+ let mut doc = Automerge::new();
53
+ doc.set_actor(ActorId::random());
54
+ let mut tx = doc.transaction();
55
+ let list_id = tx.put_object(ROOT, "items", ObjType::List)?;
56
+ tx.put(ROOT, "zzz", "zzzval")?;
57
+ assert!(tx.get(ROOT, "items")?.unwrap().1 == list_id);
58
+ tx.insert(&list_id, 0, "a")?;
59
+ tx.insert(&list_id, 0, "b")?;
60
+ tx.insert(&list_id, 2, "c")?;
61
+ tx.insert(&list_id, 1, "d")?;
62
+ assert!(tx.get(&list_id, 0)?.unwrap().0 == "b".into());
63
+ assert!(tx.get(&list_id, 1)?.unwrap().0 == "d".into());
64
+ assert!(tx.get(&list_id, 2)?.unwrap().0 == "a".into());
65
+ assert!(tx.get(&list_id, 3)?.unwrap().0 == "c".into());
66
+ assert!(tx.length(&list_id) == 4);
67
+ tx.commit();
68
+ doc.save();
69
+ Ok(())
70
+ }
71
+
72
+ #[test]
73
+ fn test_del() -> Result<(), AutomergeError> {
74
+ let mut doc = Automerge::new();
75
+ doc.set_actor(ActorId::random());
76
+ let mut tx = doc.transaction();
77
+ tx.put(ROOT, "xxx", "xxx")?;
78
+ assert!(tx.get(ROOT, "xxx")?.is_some());
79
+ tx.delete(ROOT, "xxx")?;
80
+ assert!(tx.get(ROOT, "xxx")?.is_none());
81
+ tx.commit();
82
+ Ok(())
83
+ }
84
+
85
+ #[test]
86
+ fn test_inc() -> Result<(), AutomergeError> {
87
+ let mut doc = Automerge::new();
88
+ let mut tx = doc.transaction();
89
+ tx.put(ROOT, "counter", ScalarValue::counter(10)).unwrap();
90
+ //assert!(tx.get(ROOT, "counter")?.unwrap().0 == Value::counter(10));
91
+ //tx.increment(ROOT, "counter", 10)?;
92
+ //assert!(tx.get(ROOT, "counter")?.unwrap().0 == Value::counter(20));
93
+ //tx.increment(ROOT, "counter", -5)?;
94
+ //assert!(tx.get(ROOT, "counter")?.unwrap().0 == Value::counter(15));
95
+ //tx.commit();
96
+ Ok(())
97
+ }
98
+
99
+ #[test]
100
+ fn test_save_incremental() -> Result<(), AutomergeError> {
101
+ let mut doc = Automerge::new();
102
+
103
+ let mut tx = doc.transaction();
104
+ tx.put(ROOT, "foo", 1)?;
105
+ tx.commit();
106
+
107
+ let save1 = doc.save();
108
+ let save1_heads = doc.get_heads();
109
+
110
+ let mut tx = doc.transaction();
111
+ tx.put(ROOT, "bar", 2)?;
112
+ tx.commit();
113
+
114
+ let save2 = doc.save_after(&save1_heads);
115
+ let save2_heads = doc.get_heads();
116
+
117
+ let mut tx = doc.transaction();
118
+ tx.put(ROOT, "baz", 3)?;
119
+ tx.commit();
120
+
121
+ let save3 = doc.save_after(&save2_heads);
122
+ let save3_heads = doc.get_heads();
123
+
124
+ let mut save_a: Vec<u8> = vec![];
125
+ save_a.extend(&save1);
126
+ save_a.extend(&save2);
127
+ save_a.extend(&save3);
128
+
129
+ assert!(doc.save_after(&save3_heads).is_empty());
130
+
131
+ let save_b = doc.save();
132
+
133
+ assert!(save_b.len() < save_a.len());
134
+
135
+ let doc_a = Automerge::load(&save_a)?;
136
+ let doc_b = Automerge::load(&save_b)?;
137
+
138
+ assert!(doc_a.get_all(ROOT, "baz")? == doc_b.get_all(ROOT, "baz")?);
139
+
140
+ assert!(doc_a.save() == doc_b.save());
141
+
142
+ Ok(())
143
+ }
144
+
145
+ #[test]
146
+ fn test_save_text() -> Result<(), AutomergeError> {
147
+ let mut doc = Automerge::new();
148
+ let mut tx = doc.transaction();
149
+ let text = tx.put_object(ROOT, "text", ObjType::Text)?;
150
+ tx.commit();
151
+ let heads1 = doc.get_heads();
152
+ let mut tx = doc.transaction();
153
+ tx.splice_text(&text, 0, 0, "hello world")?;
154
+ tx.commit();
155
+ let heads2 = doc.get_heads();
156
+ let mut tx = doc.transaction();
157
+ tx.splice_text(&text, 6, 0, "big bad ")?;
158
+ tx.commit();
159
+ let heads3 = doc.get_heads();
160
+
161
+ assert!(&doc.text(&text)? == "hello big bad world");
162
+ assert!(&doc.text_at(&text, &heads1)?.is_empty());
163
+ assert!(&doc.text_at(&text, &heads2)? == "hello world");
164
+ assert!(&doc.text_at(&text, &heads3)? == "hello big bad world");
165
+
166
+ Ok(())
167
+ }
168
+
169
+ #[test]
170
+ fn test_cursors() -> Result<(), AutomergeError> {
171
+ let mut doc = Automerge::new();
172
+ let mut tx = doc.transaction();
173
+ let text = tx.put_object(ROOT, "text", ObjType::Text)?;
174
+ tx.commit();
175
+ let mut tx = doc.transaction();
176
+ tx.splice_text(&text, 0, 0, "hello world")?;
177
+ tx.commit();
178
+ let mut tx = doc.transaction();
179
+ tx.splice_text(&text, 6, 0, "big bad ")?;
180
+ tx.commit();
181
+
182
+ // simple cursor test + serialization
183
+ let cursor0 = doc.get_cursor(&text, 0, None).unwrap();
184
+ let cursor0_str = cursor0.to_string();
185
+ let cursor0_bytes = cursor0.to_bytes();
186
+ let pos0 = doc.get_cursor_position(&text, &cursor0, None).unwrap();
187
+ assert_eq!(pos0, 0);
188
+ assert_eq!(Cursor::try_from(cursor0_str).unwrap(), cursor0);
189
+ assert_eq!(Cursor::try_from(cursor0_bytes).unwrap(), cursor0);
190
+
191
+ // simple cursor test + serialization
192
+ let cursor1 = doc.get_cursor(&text, 6, None).unwrap();
193
+ let cursor1_str = cursor1.to_string();
194
+ let cursor1_bytes = cursor1.to_bytes();
195
+ let pos1 = doc.get_cursor_position(&text, &cursor1, None).unwrap();
196
+ assert_eq!(pos1, 6);
197
+ assert_eq!(Cursor::try_from(cursor1_str).unwrap(), cursor1);
198
+ assert_eq!(Cursor::try_from(cursor1_bytes).unwrap(), cursor1);
199
+
200
+ let heads0 = doc.get_heads();
201
+
202
+ let mut tx = doc.transaction();
203
+ tx.splice_text(&text, 3, 6, " new text ")?;
204
+ tx.commit();
205
+
206
+ // confirm the cursor changed position after an edit
207
+ let pos2 = doc.get_cursor_position(&text, &cursor1, None).unwrap();
208
+ assert_eq!(pos2, 13); // -3 deleted & +10 inserted before cursor
209
+
210
+ // confirm the cursor can still be read at the old position
211
+ let pos3 = doc
212
+ .get_cursor_position(&text, &cursor1, Some(&heads0))
213
+ .unwrap();
214
+ assert_eq!(pos3, 6); // back to the old heads
215
+
216
+ // confirm cursor load errors
217
+ assert_eq!(
218
+ Cursor::try_from(vec![0u8, 3u8, 10u8].as_slice()),
219
+ Err(AutomergeError::InvalidCursorFormat)
220
+ );
221
+ assert_eq!(
222
+ Cursor::try_from("notacursor"),
223
+ Err(AutomergeError::InvalidCursorFormat)
224
+ );
225
+
226
+ // confirm behavior of a invalid cursor
227
+ let bad_cursor = Cursor::try_from("10@aabbcc00").unwrap();
228
+ assert_eq!(
229
+ doc.get_cursor_position(&text, &bad_cursor, None),
230
+ Err(AutomergeError::InvalidCursor(bad_cursor))
231
+ );
232
+
233
+ // cursors created after heads are invalid
234
+ let cursor3 = doc.get_cursor(&text, 6, None).unwrap();
235
+ let pos4 = doc.get_cursor_position(&text, &cursor3, None).unwrap();
236
+ assert_eq!(pos4, 6);
237
+ assert_eq!(
238
+ doc.get_cursor_position(&text, &cursor3, Some(&heads0)),
239
+ Err(AutomergeError::InvalidCursor(cursor3))
240
+ );
241
+
242
+ // test start/before/after/end cursors
243
+ // -----------------------------------------------------------------------------------------
244
+ let mut tx = doc.transaction();
245
+ let text2 = tx.put_object(ROOT, "hi", ObjType::Text).unwrap();
246
+ tx.splice_text(&text2, 0, 0, "aaa@bbb").unwrap();
247
+ tx.commit();
248
+
249
+ let before_cursor = doc
250
+ .get_cursor_moving(&text2, 3, None, MoveCursor::Before)
251
+ .unwrap();
252
+ let after_cursor = doc
253
+ .get_cursor_moving(&text2, 3, None, MoveCursor::After)
254
+ .unwrap();
255
+ let start_cursor = doc.get_cursor(&text2, CursorPosition::Start, None).unwrap();
256
+ let end_cursor = doc.get_cursor(&text2, CursorPosition::End, None).unwrap();
257
+
258
+ // s, b, a, e denote the positions of the start/before/after/end cursors
259
+ // aaa@bbb
260
+ // ^ ^ ^
261
+ // s ba e
262
+
263
+ let pos_before = doc
264
+ .get_cursor_position(&text2, &before_cursor, None)
265
+ .unwrap();
266
+ let pos_after = doc
267
+ .get_cursor_position(&text2, &after_cursor, None)
268
+ .unwrap();
269
+ let pos_start = doc
270
+ .get_cursor_position_for(&text2, &start_cursor, None)
271
+ .unwrap();
272
+ let pos_end = doc
273
+ .get_cursor_position_for(&text2, &end_cursor, None)
274
+ .unwrap();
275
+
276
+ assert_eq!(pos_before, 3);
277
+ assert_eq!(pos_after, 3);
278
+ assert_eq!(pos_start, 0);
279
+ assert_eq!(pos_end, 7);
280
+
281
+ // -----------------------------------------------------------------------------------------
282
+ let mut tx = doc.transaction();
283
+ tx.splice_text(&text2, 3, 1, "~~~").unwrap();
284
+ tx.commit();
285
+
286
+ // aaa~~~bbb
287
+ // ^ ^ ^ ^
288
+ // s b a e
289
+
290
+ let pos_before = doc
291
+ .get_cursor_position(&text2, &before_cursor, None)
292
+ .unwrap();
293
+ let pos_after = doc
294
+ .get_cursor_position(&text2, &after_cursor, None)
295
+ .unwrap();
296
+ let pos_start = doc
297
+ .get_cursor_position_for(&text2, &start_cursor, None)
298
+ .unwrap();
299
+ let pos_end = doc
300
+ .get_cursor_position_for(&text2, &end_cursor, None)
301
+ .unwrap();
302
+
303
+ assert_eq!(pos_before, 2);
304
+ assert_eq!(pos_after, 6);
305
+ assert_eq!(pos_start, 0);
306
+ assert_eq!(pos_end, 9);
307
+
308
+ // -----------------------------------------------------------------------------------------
309
+ let mut tx = doc.transaction();
310
+ tx.splice_text(&text2, 0, 6, "").unwrap();
311
+ tx.commit();
312
+
313
+ // bbb
314
+ // ^ ^
315
+ // sba e
316
+
317
+ let pos_before = doc
318
+ .get_cursor_position(&text2, &before_cursor, None)
319
+ .unwrap();
320
+ let pos_after = doc
321
+ .get_cursor_position(&text2, &after_cursor, None)
322
+ .unwrap();
323
+ let pos_start = doc
324
+ .get_cursor_position_for(&text2, &start_cursor, None)
325
+ .unwrap();
326
+ let pos_end = doc
327
+ .get_cursor_position_for(&text2, &end_cursor, None)
328
+ .unwrap();
329
+
330
+ assert_eq!(pos_before, 0);
331
+ assert_eq!(pos_after, 0);
332
+ assert_eq!(pos_start, 0);
333
+ assert_eq!(pos_end, 3);
334
+
335
+ // -----------------------------------------------------------------------------------------
336
+ let mut tx = doc.transaction();
337
+ tx.splice_text(&text2, 0, 0, "hello").unwrap();
338
+ tx.commit();
339
+
340
+ // hellobbb
341
+ // ^ ^ ^
342
+ // sb a e
343
+
344
+ let pos_before = doc
345
+ .get_cursor_position(&text2, &before_cursor, None)
346
+ .unwrap();
347
+ let pos_after = doc
348
+ .get_cursor_position(&text2, &after_cursor, None)
349
+ .unwrap();
350
+ let pos_start = doc
351
+ .get_cursor_position_for(&text2, &start_cursor, None)
352
+ .unwrap();
353
+ let pos_end = doc
354
+ .get_cursor_position_for(&text2, &end_cursor, None)
355
+ .unwrap();
356
+
357
+ assert_eq!(pos_before, 0);
358
+ assert_eq!(pos_after, 5);
359
+ assert_eq!(pos_start, 0);
360
+ assert_eq!(pos_end, 8);
361
+
362
+ // -----------------------------------------------------------------------------------------
363
+ let mut tx = doc.transaction();
364
+ tx.splice_text(&text2, 0, 0, "hello").unwrap();
365
+ tx.commit();
366
+
367
+ // hellohellobbb
368
+ // ^ ^ ^
369
+ // sb a e
370
+
371
+ let pos_before = doc
372
+ .get_cursor_position(&text2, &before_cursor, None)
373
+ .unwrap();
374
+ let pos_after = doc
375
+ .get_cursor_position(&text2, &after_cursor, None)
376
+ .unwrap();
377
+ let pos_start = doc
378
+ .get_cursor_position_for(&text2, &start_cursor, None)
379
+ .unwrap();
380
+ let pos_end = doc
381
+ .get_cursor_position_for(&text2, &end_cursor, None)
382
+ .unwrap();
383
+
384
+ assert_eq!(pos_before, 0);
385
+ assert_eq!(pos_after, 10);
386
+ assert_eq!(pos_start, 0);
387
+ assert_eq!(pos_end, 13);
388
+
389
+ // -----------------------------------------------------------------------------------------
390
+ let mut tx = doc.transaction();
391
+ tx.splice_text(&text2, 5, 8, "").unwrap();
392
+ tx.commit();
393
+
394
+ // hello
395
+ // ^ ^
396
+ // sb ae
397
+
398
+ let pos_before = doc
399
+ .get_cursor_position(&text2, &before_cursor, None)
400
+ .unwrap();
401
+ let pos_after = doc
402
+ .get_cursor_position(&text2, &after_cursor, None)
403
+ .unwrap();
404
+ let pos_start = doc
405
+ .get_cursor_position_for(&text2, &start_cursor, None)
406
+ .unwrap();
407
+ let pos_end = doc
408
+ .get_cursor_position_for(&text2, &end_cursor, None)
409
+ .unwrap();
410
+
411
+ assert_eq!(pos_before, 0);
412
+ assert_eq!(pos_after, 5);
413
+ assert_eq!(pos_start, 0);
414
+ assert_eq!(pos_end, 5);
415
+
416
+ // test for semantics of `MoveCursor::After`
417
+ // -----------------------------------------------------------------------------------------
418
+ let mut tx = doc.transaction();
419
+ let text2 = tx.put_object(ROOT, "hi", ObjType::Text).unwrap();
420
+ tx.splice_text(&text2, 0, 0, "aaa@bbb").unwrap();
421
+ tx.commit();
422
+
423
+ let before_cursor = doc
424
+ .get_cursor_moving(&text2, 3, None, MoveCursor::Before)
425
+ .unwrap();
426
+ let after_cursor = doc
427
+ .get_cursor_moving(&text2, 3, None, MoveCursor::After)
428
+ .unwrap();
429
+ let start_cursor = doc.get_cursor(&text2, CursorPosition::Start, None).unwrap();
430
+ let end_cursor = doc.get_cursor(&text2, CursorPosition::End, None).unwrap();
431
+
432
+ // setup:
433
+ // aaa@bbb
434
+ // ^ ^ ^
435
+ // s ba e
436
+
437
+ // beginning of test: ----------------------------------------------
438
+
439
+ // remove "@bb"
440
+
441
+ let mut tx = doc.transaction();
442
+ tx.splice_text(&text2, 3, 3, "!!!").unwrap();
443
+ tx.commit();
444
+
445
+ println!(
446
+ "{}",
447
+ serde_json::to_string_pretty(&AutoSerde::from(&doc)).unwrap()
448
+ );
449
+
450
+ // aaa!!!b
451
+ // ^ ^ ^ ^
452
+ // s b a e
453
+
454
+ let pos_before = doc
455
+ .get_cursor_position(&text2, &before_cursor, None)
456
+ .unwrap();
457
+ let pos_after = doc
458
+ .get_cursor_position(&text2, &after_cursor, None)
459
+ .unwrap();
460
+ let pos_start = doc
461
+ .get_cursor_position_for(&text2, &start_cursor, None)
462
+ .unwrap();
463
+ let pos_end = doc
464
+ .get_cursor_position_for(&text2, &end_cursor, None)
465
+ .unwrap();
466
+
467
+ assert_eq!(pos_before, 2);
468
+ assert_eq!(pos_after, 6);
469
+ assert_eq!(pos_start, 0);
470
+ assert_eq!(pos_end, 7);
471
+
472
+ Ok(())
473
+ }
474
+
475
+ #[test]
476
+ fn test_props_vals_at() -> Result<(), AutomergeError> {
477
+ let mut doc = Automerge::new();
478
+ doc.set_actor("aaaa".try_into().unwrap());
479
+ let mut tx = doc.transaction();
480
+ tx.put(ROOT, "prop1", "val1")?;
481
+ tx.commit();
482
+ doc.get_heads();
483
+ let heads1 = doc.get_heads();
484
+ let mut tx = doc.transaction();
485
+ tx.put(ROOT, "prop1", "val2")?;
486
+ tx.commit();
487
+ doc.get_heads();
488
+ let heads2 = doc.get_heads();
489
+ let mut tx = doc.transaction();
490
+ tx.put(ROOT, "prop2", "val3")?;
491
+ tx.commit();
492
+ doc.get_heads();
493
+ let heads3 = doc.get_heads();
494
+ let mut tx = doc.transaction();
495
+ tx.delete(ROOT, "prop1")?;
496
+ tx.commit();
497
+ doc.get_heads();
498
+ let heads4 = doc.get_heads();
499
+ let mut tx = doc.transaction();
500
+ tx.put(ROOT, "prop3", "val4")?;
501
+ tx.commit();
502
+ doc.get_heads();
503
+ let heads5 = doc.get_heads();
504
+ assert_eq!(
505
+ doc.keys_at(ROOT, &heads1).collect_vec(),
506
+ vec!["prop1".to_owned()]
507
+ );
508
+ assert_eq!(doc.length_at(ROOT, &heads1), 1);
509
+ assert!(doc.get_at(ROOT, "prop1", &heads1)?.unwrap().0 == Value::str("val1"));
510
+ assert!(doc.get_at(ROOT, "prop2", &heads1)?.is_none());
511
+ assert!(doc.get_at(ROOT, "prop3", &heads1)?.is_none());
512
+
513
+ assert!(doc.keys_at(ROOT, &heads2).collect_vec() == vec!["prop1".to_owned()]);
514
+ assert_eq!(doc.length_at(ROOT, &heads2), 1);
515
+ assert!(doc.get_at(ROOT, "prop1", &heads2)?.unwrap().0 == Value::str("val2"));
516
+ assert!(doc.get_at(ROOT, "prop2", &heads2)?.is_none());
517
+ assert!(doc.get_at(ROOT, "prop3", &heads2)?.is_none());
518
+
519
+ assert!(
520
+ doc.keys_at(ROOT, &heads3).collect_vec() == vec!["prop1".to_owned(), "prop2".to_owned()]
521
+ );
522
+ assert_eq!(doc.length_at(ROOT, &heads3), 2);
523
+ assert!(doc.get_at(ROOT, "prop1", &heads3)?.unwrap().0 == Value::str("val2"));
524
+ assert!(doc.get_at(ROOT, "prop2", &heads3)?.unwrap().0 == Value::str("val3"));
525
+ assert!(doc.get_at(ROOT, "prop3", &heads3)?.is_none());
526
+
527
+ assert!(doc.keys_at(ROOT, &heads4).collect_vec() == vec!["prop2".to_owned()]);
528
+ assert_eq!(doc.length_at(ROOT, &heads4), 1);
529
+ assert!(doc.get_at(ROOT, "prop1", &heads4)?.is_none());
530
+ assert!(doc.get_at(ROOT, "prop2", &heads4)?.unwrap().0 == Value::str("val3"));
531
+ assert!(doc.get_at(ROOT, "prop3", &heads4)?.is_none());
532
+
533
+ assert!(
534
+ doc.keys_at(ROOT, &heads5).collect_vec() == vec!["prop2".to_owned(), "prop3".to_owned()]
535
+ );
536
+ assert_eq!(doc.length_at(ROOT, &heads5), 2);
537
+ assert_eq!(doc.length(ROOT), 2);
538
+ assert!(doc.get_at(ROOT, "prop1", &heads5)?.is_none());
539
+ assert!(doc.get_at(ROOT, "prop2", &heads5)?.unwrap().0 == Value::str("val3"));
540
+ assert!(doc.get_at(ROOT, "prop3", &heads5)?.unwrap().0 == Value::str("val4"));
541
+
542
+ assert_eq!(doc.keys_at(ROOT, &[]).count(), 0);
543
+ assert_eq!(doc.length_at(ROOT, &[]), 0);
544
+ assert!(doc.get_at(ROOT, "prop1", &[])?.is_none());
545
+ assert!(doc.get_at(ROOT, "prop2", &[])?.is_none());
546
+ assert!(doc.get_at(ROOT, "prop3", &[])?.is_none());
547
+ Ok(())
548
+ }
549
+
550
+ #[test]
551
+ fn test_len_at() -> Result<(), AutomergeError> {
552
+ let mut doc = Automerge::new();
553
+ doc.set_actor("aaaa".try_into().unwrap());
554
+
555
+ let mut tx = doc.transaction();
556
+ let list = tx.put_object(ROOT, "list", ObjType::List)?;
557
+ tx.commit();
558
+ let heads1 = doc.get_heads();
559
+
560
+ let mut tx = doc.transaction();
561
+ tx.insert(&list, 0, 10)?;
562
+ tx.commit();
563
+ let heads2 = doc.get_heads();
564
+
565
+ let mut tx = doc.transaction();
566
+ tx.put(&list, 0, 20)?;
567
+ tx.insert(&list, 0, 30)?;
568
+ tx.commit();
569
+ let heads3 = doc.get_heads();
570
+
571
+ let mut tx = doc.transaction();
572
+ tx.put(&list, 1, 40)?;
573
+ tx.insert(&list, 1, 50)?;
574
+ tx.commit();
575
+ let heads4 = doc.get_heads();
576
+
577
+ let mut tx = doc.transaction();
578
+ tx.delete(&list, 2)?;
579
+ tx.commit();
580
+ let heads5 = doc.get_heads();
581
+
582
+ let mut tx = doc.transaction();
583
+ tx.delete(&list, 0)?;
584
+ tx.commit();
585
+ let heads6 = doc.get_heads();
586
+
587
+ assert!(doc.length_at(&list, &heads1) == 0);
588
+ assert!(doc.get_at(&list, 0, &heads1)?.is_none());
589
+
590
+ assert!(doc.length_at(&list, &heads2) == 1);
591
+ assert!(doc.get_at(&list, 0, &heads2)?.unwrap().0 == Value::int(10));
592
+
593
+ assert!(doc.length_at(&list, &heads3) == 2);
594
+ assert!(doc.get_at(&list, 0, &heads3)?.unwrap().0 == Value::int(30));
595
+ assert!(doc.get_at(&list, 1, &heads3)?.unwrap().0 == Value::int(20));
596
+
597
+ assert!(doc.length_at(&list, &heads4) == 3);
598
+ assert!(doc.get_at(&list, 0, &heads4)?.unwrap().0 == Value::int(30));
599
+ assert!(doc.get_at(&list, 1, &heads4)?.unwrap().0 == Value::int(50));
600
+ assert!(doc.get_at(&list, 2, &heads4)?.unwrap().0 == Value::int(40));
601
+
602
+ assert!(doc.length_at(&list, &heads5) == 2);
603
+ assert!(doc.get_at(&list, 0, &heads5)?.unwrap().0 == Value::int(30));
604
+ assert!(doc.get_at(&list, 1, &heads5)?.unwrap().0 == Value::int(50));
605
+
606
+ assert!(doc.length_at(&list, &heads6) == 1);
607
+ assert!(doc.length(&list) == 1);
608
+ assert!(doc.get_at(&list, 0, &heads6)?.unwrap().0 == Value::int(50));
609
+
610
+ Ok(())
611
+ }
612
+
613
+ #[test]
614
+ fn keys_iter_map() {
615
+ let mut doc = Automerge::new();
616
+ let mut tx = doc.transaction();
617
+ tx.put(ROOT, "a", 3).unwrap();
618
+ tx.put(ROOT, "b", 4).unwrap();
619
+ tx.put(ROOT, "c", 5).unwrap();
620
+ tx.put(ROOT, "d", 6).unwrap();
621
+ tx.commit();
622
+ let mut tx = doc.transaction();
623
+ tx.put(ROOT, "a", 7).unwrap();
624
+ tx.commit();
625
+ let mut tx = doc.transaction();
626
+ tx.put(ROOT, "a", 8).unwrap();
627
+ tx.put(ROOT, "d", 9).unwrap();
628
+ tx.commit();
629
+ assert_eq!(doc.keys(ROOT).count(), 4);
630
+
631
+ let mut keys = doc.keys(ROOT);
632
+
633
+ assert_eq!(keys.next(), Some("a".into()));
634
+ assert_eq!(keys.next(), Some("b".into()));
635
+ assert_eq!(keys.next(), Some("c".into()));
636
+ assert_eq!(keys.next(), Some("d".into()));
637
+ assert_eq!(keys.next(), None);
638
+
639
+ // we no longer support double ended iterator
640
+ // but wanted to keep these tests
641
+ let mut keys = doc.keys(ROOT).collect::<Vec<_>>().into_iter();
642
+ assert_eq!(keys.next_back(), Some("d".into()));
643
+ assert_eq!(keys.next_back(), Some("c".into()));
644
+ assert_eq!(keys.next_back(), Some("b".into()));
645
+ assert_eq!(keys.next_back(), Some("a".into()));
646
+ assert_eq!(keys.next_back(), None);
647
+
648
+ let mut keys = doc.keys(ROOT).collect::<Vec<_>>().into_iter();
649
+ assert_eq!(keys.next(), Some("a".into()));
650
+ assert_eq!(keys.next_back(), Some("d".into()));
651
+ assert_eq!(keys.next_back(), Some("c".into()));
652
+ assert_eq!(keys.next_back(), Some("b".into()));
653
+ assert_eq!(keys.next_back(), None);
654
+
655
+ let mut keys = doc.keys(ROOT).collect::<Vec<_>>().into_iter();
656
+ assert_eq!(keys.next_back(), Some("d".into()));
657
+ assert_eq!(keys.next(), Some("a".into()));
658
+ assert_eq!(keys.next(), Some("b".into()));
659
+ assert_eq!(keys.next(), Some("c".into()));
660
+ assert_eq!(keys.next(), None);
661
+ let keys = doc.keys(ROOT).collect::<Vec<_>>().into_iter();
662
+ assert_eq!(keys.collect::<Vec<_>>(), vec!["a", "b", "c", "d"]);
663
+ }
664
+
665
+ #[test]
666
+ fn keys_iter_seq() {
667
+ let mut doc = Automerge::new();
668
+ let mut tx = doc.transaction();
669
+ let list = tx.put_object(ROOT, "list", ObjType::List).unwrap();
670
+ tx.insert(&list, 0, 3).unwrap();
671
+ tx.insert(&list, 1, 4).unwrap();
672
+ tx.insert(&list, 2, 5).unwrap();
673
+ tx.insert(&list, 3, 6).unwrap();
674
+ tx.commit();
675
+ let mut tx = doc.transaction();
676
+ tx.put(&list, 0, 7).unwrap();
677
+ tx.commit();
678
+ let mut tx = doc.transaction();
679
+ tx.put(&list, 0, 8).unwrap();
680
+ tx.put(&list, 3, 9).unwrap();
681
+ tx.commit();
682
+ let actor = doc.get_actor();
683
+ assert_eq!(doc.keys(&list).count(), 4);
684
+
685
+ let mut keys = doc.keys(&list);
686
+ assert_eq!(keys.next(), Some(format!("2@{}", actor)));
687
+ assert_eq!(keys.next(), Some(format!("3@{}", actor)));
688
+ assert_eq!(keys.next(), Some(format!("4@{}", actor)));
689
+ assert_eq!(keys.next(), Some(format!("5@{}", actor)));
690
+ assert_eq!(keys.next(), None);
691
+
692
+ // we no longer support double ended iterator
693
+ // but wanted to keep these tests
694
+ let mut keys = doc.keys(&list).collect::<Vec<_>>().into_iter();
695
+ assert_eq!(keys.next_back(), Some(format!("5@{}", actor)));
696
+ assert_eq!(keys.next_back(), Some(format!("4@{}", actor)));
697
+ assert_eq!(keys.next_back(), Some(format!("3@{}", actor)));
698
+ assert_eq!(keys.next_back(), Some(format!("2@{}", actor)));
699
+ assert_eq!(keys.next_back(), None);
700
+
701
+ let mut keys = doc.keys(&list).collect::<Vec<_>>().into_iter();
702
+ assert_eq!(keys.next(), Some(format!("2@{}", actor)));
703
+ assert_eq!(keys.next_back(), Some(format!("5@{}", actor)));
704
+ assert_eq!(keys.next_back(), Some(format!("4@{}", actor)));
705
+ assert_eq!(keys.next_back(), Some(format!("3@{}", actor)));
706
+ assert_eq!(keys.next_back(), None);
707
+
708
+ let mut keys = doc.keys(&list).collect::<Vec<_>>().into_iter();
709
+ assert_eq!(keys.next_back(), Some(format!("5@{}", actor)));
710
+ assert_eq!(keys.next(), Some(format!("2@{}", actor)));
711
+ assert_eq!(keys.next(), Some(format!("3@{}", actor)));
712
+ assert_eq!(keys.next(), Some(format!("4@{}", actor)));
713
+ assert_eq!(keys.next(), None);
714
+
715
+ let keys = doc.keys(&list);
716
+ assert_eq!(
717
+ keys.collect::<Vec<_>>(),
718
+ vec![
719
+ format!("2@{}", actor),
720
+ format!("3@{}", actor),
721
+ format!("4@{}", actor),
722
+ format!("5@{}", actor)
723
+ ]
724
+ );
725
+ }
726
+
727
+ #[test]
728
+ fn range_iter_map() {
729
+ let mut doc = Automerge::new();
730
+ let mut tx = doc.transaction();
731
+ tx.put(ROOT, "a", 3).unwrap();
732
+ tx.put(ROOT, "b", 4).unwrap();
733
+ tx.put(ROOT, "c", 5).unwrap();
734
+ tx.put(ROOT, "d", 6).unwrap();
735
+ tx.commit();
736
+ let mut tx = doc.transaction();
737
+ tx.put(ROOT, "a", 7).unwrap();
738
+ tx.commit();
739
+ let mut tx = doc.transaction();
740
+ tx.put(ROOT, "a", 8).unwrap();
741
+ tx.put(ROOT, "d", 9).unwrap();
742
+ tx.commit();
743
+ let actor = doc.get_actor();
744
+ assert_eq!(doc.map_range(ROOT, ..).count(), 4);
745
+
746
+ let mut range = doc.map_range(ROOT, "b".to_owned().."d".into());
747
+ assert_eq!(
748
+ range.next(),
749
+ Some(MapRangeItem::new(
750
+ "b",
751
+ 4.into(),
752
+ ExId::Id(2, actor.clone(), 0),
753
+ false
754
+ ))
755
+ );
756
+ assert_eq!(
757
+ range.next(),
758
+ Some(MapRangeItem::new(
759
+ "c",
760
+ 5.into(),
761
+ ExId::Id(3, actor.clone(), 0),
762
+ false
763
+ ))
764
+ );
765
+ assert_eq!(range.next(), None);
766
+
767
+ let mut range = doc.map_range(ROOT, "b".to_owned()..="d".into());
768
+ assert_eq!(
769
+ range.next(),
770
+ Some(MapRangeItem::new(
771
+ "b",
772
+ 4.into(),
773
+ ExId::Id(2, actor.clone(), 0),
774
+ false
775
+ ))
776
+ );
777
+ assert_eq!(
778
+ range.next(),
779
+ Some(MapRangeItem::new(
780
+ "c",
781
+ 5.into(),
782
+ ExId::Id(3, actor.clone(), 0),
783
+ false
784
+ ))
785
+ );
786
+ assert_eq!(
787
+ range.next(),
788
+ Some(MapRangeItem::new(
789
+ "d",
790
+ 9.into(),
791
+ ExId::Id(7, actor.clone(), 0),
792
+ false
793
+ ))
794
+ );
795
+ assert_eq!(range.next(), None);
796
+
797
+ let mut range = doc.map_range(ROOT, ..="c".to_owned());
798
+ assert_eq!(
799
+ range.next(),
800
+ Some(MapRangeItem::new(
801
+ "a",
802
+ 8.into(),
803
+ ExId::Id(6, actor.clone(), 0),
804
+ false
805
+ ))
806
+ );
807
+ assert_eq!(
808
+ range.next(),
809
+ Some(MapRangeItem::new(
810
+ "b",
811
+ 4.into(),
812
+ ExId::Id(2, actor.clone(), 0),
813
+ false
814
+ ))
815
+ );
816
+ assert_eq!(
817
+ range.next(),
818
+ Some(MapRangeItem::new(
819
+ "c",
820
+ 5.into(),
821
+ ExId::Id(3, actor.clone(), 0),
822
+ false
823
+ ))
824
+ );
825
+ assert_eq!(range.next(), None);
826
+
827
+ let range = doc.map_range(ROOT, "a".to_owned()..);
828
+ assert_eq!(
829
+ range.collect::<Vec<_>>(),
830
+ vec![
831
+ MapRangeItem::new("a", 8.into(), ExId::Id(6, actor.clone(), 0), false),
832
+ MapRangeItem::new("b", 4.into(), ExId::Id(2, actor.clone(), 0), false),
833
+ MapRangeItem::new("c", 5.into(), ExId::Id(3, actor.clone(), 0), false),
834
+ MapRangeItem::new("d", 9.into(), ExId::Id(7, actor.clone(), 0), false),
835
+ ]
836
+ );
837
+ }
838
+
839
+ /*
840
+ #[test]
841
+ fn map_range_back_and_forth_single() {
842
+ let mut doc = AutoCommit::new();
843
+ let actor = doc.get_actor().clone();
844
+
845
+ doc.put(ROOT, "1", "a").unwrap();
846
+ doc.put(ROOT, "2", "b").unwrap();
847
+ doc.put(ROOT, "3", "c").unwrap();
848
+
849
+ let mut range_all = doc.map_range(ROOT, ..);
850
+ assert_eq!(
851
+ range_all.next(),
852
+ Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0)))
853
+ );
854
+ assert_eq!(
855
+ range_all.next_back(),
856
+ Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0)))
857
+ );
858
+ assert_eq!(
859
+ range_all.next_back(),
860
+ Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0)))
861
+ );
862
+ assert_eq!(range_all.next_back(), None);
863
+ assert_eq!(range_all.next(), None);
864
+
865
+ let mut range_all = doc.map_range(ROOT, ..);
866
+ assert_eq!(
867
+ range_all.next(),
868
+ Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0)))
869
+ );
870
+ assert_eq!(
871
+ range_all.next_back(),
872
+ Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0)))
873
+ );
874
+ assert_eq!(
875
+ range_all.next(),
876
+ Some(("2", Value::str("b"), ExId::Id(2, actor.clone(), 0)))
877
+ );
878
+ assert_eq!(range_all.next_back(), None);
879
+ assert_eq!(range_all.next(), None);
880
+
881
+ let mut range_all = doc.map_range(ROOT, ..);
882
+ assert_eq!(
883
+ range_all.next(),
884
+ Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0)))
885
+ );
886
+ assert_eq!(
887
+ range_all.next(),
888
+ Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0)))
889
+ );
890
+ assert_eq!(
891
+ range_all.next(),
892
+ Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0)))
893
+ );
894
+ assert_eq!(range_all.next_back(), None);
895
+ assert_eq!(range_all.next(), None);
896
+
897
+ let mut range_all = doc.map_range(ROOT, ..);
898
+ assert_eq!(
899
+ range_all.next_back(),
900
+ Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0)))
901
+ );
902
+ assert_eq!(
903
+ range_all.next_back(),
904
+ Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0)))
905
+ );
906
+ assert_eq!(
907
+ range_all.next_back(),
908
+ Some(("1", "a".into(), ExId::Id(1, actor, 0)))
909
+ );
910
+ assert_eq!(range_all.next_back(), None);
911
+ assert_eq!(range_all.next(), None);
912
+ }
913
+ */
914
+
915
+ /*
916
+ #[test]
917
+ fn map_range_back_and_forth_double() {
918
+ let mut doc1 = AutoCommit::new();
919
+ doc1.set_actor(ActorId::from([0]));
920
+
921
+ doc1.put(ROOT, "1", "a").unwrap();
922
+ doc1.put(ROOT, "2", "b").unwrap();
923
+ doc1.put(ROOT, "3", "c").unwrap();
924
+
925
+ // actor 2 should win in all conflicts here
926
+ let mut doc2 = AutoCommit::new();
927
+ doc1.set_actor(ActorId::from([1]));
928
+ let actor2 = doc2.get_actor().clone();
929
+ doc2.put(ROOT, "1", "aa").unwrap();
930
+ doc2.put(ROOT, "2", "bb").unwrap();
931
+ doc2.put(ROOT, "3", "cc").unwrap();
932
+
933
+ doc1.merge(&mut doc2).unwrap();
934
+
935
+ let mut range_all = doc1.map_range(ROOT, ..);
936
+ assert_eq!(
937
+ range_all.next(),
938
+ Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1)))
939
+ );
940
+ assert_eq!(
941
+ range_all.next_back(),
942
+ Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1)))
943
+ );
944
+ assert_eq!(
945
+ range_all.next_back(),
946
+ Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1)))
947
+ );
948
+ assert_eq!(range_all.next_back(), None);
949
+ assert_eq!(range_all.next(), None);
950
+
951
+ let mut range_all = doc1.map_range(ROOT, ..);
952
+ assert_eq!(
953
+ range_all.next(),
954
+ Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1)))
955
+ );
956
+ assert_eq!(
957
+ range_all.next_back(),
958
+ Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1)))
959
+ );
960
+ assert_eq!(
961
+ range_all.next(),
962
+ Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1)))
963
+ );
964
+ assert_eq!(range_all.next_back(), None);
965
+ assert_eq!(range_all.next(), None);
966
+
967
+ let mut range_all = doc1.map_range(ROOT, ..);
968
+ assert_eq!(
969
+ range_all.next(),
970
+ Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1)))
971
+ );
972
+ assert_eq!(
973
+ range_all.next(),
974
+ Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1)))
975
+ );
976
+ assert_eq!(
977
+ range_all.next(),
978
+ Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1)))
979
+ );
980
+ assert_eq!(range_all.next_back(), None);
981
+ assert_eq!(range_all.next(), None);
982
+
983
+ let mut range_all = doc1.map_range(ROOT, ..);
984
+ assert_eq!(
985
+ range_all.next_back(),
986
+ Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1)))
987
+ );
988
+ assert_eq!(
989
+ range_all.next_back(),
990
+ Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1)))
991
+ );
992
+ assert_eq!(
993
+ range_all.next_back(),
994
+ Some(("1", "aa".into(), ExId::Id(1, actor2, 1)))
995
+ );
996
+ assert_eq!(range_all.next_back(), None);
997
+ assert_eq!(range_all.next(), None);
998
+ }
999
+ */
1000
+
1001
+ /*
1002
+ #[test]
1003
+ fn map_range_at_back_and_forth_single() {
1004
+ let mut doc = AutoCommit::new();
1005
+ let actor = doc.get_actor().clone();
1006
+
1007
+ doc.put(ROOT, "1", "a").unwrap();
1008
+ doc.put(ROOT, "2", "b").unwrap();
1009
+ doc.put(ROOT, "3", "c").unwrap();
1010
+
1011
+ let heads = doc.get_heads();
1012
+
1013
+ let mut range_all = doc.map_range_at(ROOT, .., &heads);
1014
+ assert_eq!(
1015
+ range_all.next(),
1016
+ Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0)))
1017
+ );
1018
+ assert_eq!(
1019
+ range_all.next_back(),
1020
+ Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0)))
1021
+ );
1022
+ assert_eq!(
1023
+ range_all.next_back(),
1024
+ Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0)))
1025
+ );
1026
+ assert_eq!(range_all.next_back(), None);
1027
+ assert_eq!(range_all.next(), None);
1028
+
1029
+ let mut range_all = doc.map_range_at(ROOT, .., &heads);
1030
+ assert_eq!(
1031
+ range_all.next(),
1032
+ Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0)))
1033
+ );
1034
+ assert_eq!(
1035
+ range_all.next_back(),
1036
+ Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0)))
1037
+ );
1038
+ assert_eq!(
1039
+ range_all.next(),
1040
+ Some(("2", Value::str("b"), ExId::Id(2, actor.clone(), 0)))
1041
+ );
1042
+ assert_eq!(range_all.next_back(), None);
1043
+ assert_eq!(range_all.next(), None);
1044
+
1045
+ let mut range_all = doc.map_range_at(ROOT, .., &heads);
1046
+ assert_eq!(
1047
+ range_all.next(),
1048
+ Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0)))
1049
+ );
1050
+ assert_eq!(
1051
+ range_all.next(),
1052
+ Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0)))
1053
+ );
1054
+ assert_eq!(
1055
+ range_all.next(),
1056
+ Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0)))
1057
+ );
1058
+ assert_eq!(range_all.next_back(), None);
1059
+ assert_eq!(range_all.next(), None);
1060
+
1061
+ let mut range_all = doc.map_range_at(ROOT, .., &heads);
1062
+ assert_eq!(
1063
+ range_all.next_back(),
1064
+ Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0)))
1065
+ );
1066
+ assert_eq!(
1067
+ range_all.next_back(),
1068
+ Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0)))
1069
+ );
1070
+ assert_eq!(
1071
+ range_all.next_back(),
1072
+ Some(("1", "a".into(), ExId::Id(1, actor, 0)))
1073
+ );
1074
+ assert_eq!(range_all.next_back(), None);
1075
+ assert_eq!(range_all.next(), None);
1076
+ }
1077
+ */
1078
+
1079
+ /*
1080
+ #[test]
1081
+ fn map_range_at_back_and_forth_double() {
1082
+ let mut doc1 = AutoCommit::new();
1083
+ doc1.set_actor(ActorId::from([0]));
1084
+
1085
+ doc1.put(ROOT, "1", "a").unwrap();
1086
+ doc1.put(ROOT, "2", "b").unwrap();
1087
+ doc1.put(ROOT, "3", "c").unwrap();
1088
+
1089
+ // actor 2 should win in all conflicts here
1090
+ let mut doc2 = AutoCommit::new();
1091
+ doc1.set_actor(ActorId::from([1]));
1092
+ let actor2 = doc2.get_actor().clone();
1093
+ doc2.put(ROOT, "1", "aa").unwrap();
1094
+ doc2.put(ROOT, "2", "bb").unwrap();
1095
+ doc2.put(ROOT, "3", "cc").unwrap();
1096
+
1097
+ doc1.merge(&mut doc2).unwrap();
1098
+ let heads = doc1.get_heads();
1099
+
1100
+ let mut range_all = doc1.map_range_at(ROOT, .., &heads);
1101
+ assert_eq!(
1102
+ range_all.next(),
1103
+ Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1)))
1104
+ );
1105
+ assert_eq!(
1106
+ range_all.next_back(),
1107
+ Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1)))
1108
+ );
1109
+ assert_eq!(
1110
+ range_all.next_back(),
1111
+ Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1)))
1112
+ );
1113
+ assert_eq!(range_all.next_back(), None);
1114
+ assert_eq!(range_all.next(), None);
1115
+
1116
+ let mut range_all = doc1.map_range_at(ROOT, .., &heads);
1117
+ assert_eq!(
1118
+ range_all.next(),
1119
+ Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1)))
1120
+ );
1121
+ assert_eq!(
1122
+ range_all.next_back(),
1123
+ Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1)))
1124
+ );
1125
+ assert_eq!(
1126
+ range_all.next(),
1127
+ Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1)))
1128
+ );
1129
+ assert_eq!(range_all.next_back(), None);
1130
+ assert_eq!(range_all.next(), None);
1131
+
1132
+ let mut range_all = doc1.map_range_at(ROOT, .., &heads);
1133
+ assert_eq!(
1134
+ range_all.next(),
1135
+ Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1)))
1136
+ );
1137
+ assert_eq!(
1138
+ range_all.next(),
1139
+ Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1)))
1140
+ );
1141
+ assert_eq!(
1142
+ range_all.next(),
1143
+ Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1)))
1144
+ );
1145
+ assert_eq!(range_all.next_back(), None);
1146
+ assert_eq!(range_all.next(), None);
1147
+
1148
+ let mut range_all = doc1.map_range_at(ROOT, .., &heads);
1149
+ assert_eq!(
1150
+ range_all.next_back(),
1151
+ Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1)))
1152
+ );
1153
+ assert_eq!(
1154
+ range_all.next_back(),
1155
+ Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1)))
1156
+ );
1157
+ assert_eq!(
1158
+ range_all.next_back(),
1159
+ Some(("1", "aa".into(), ExId::Id(1, actor2, 1)))
1160
+ );
1161
+ assert_eq!(range_all.next_back(), None);
1162
+ assert_eq!(range_all.next(), None);
1163
+ }
1164
+ */
1165
+
1166
+ #[test]
1167
+ fn insert_at_index() {
1168
+ let mut doc = AutoCommit::new();
1169
+
1170
+ let list = &doc.put_object(ROOT, "list", ObjType::List).unwrap();
1171
+ doc.insert(list, 0, 0).unwrap();
1172
+ doc.insert(list, 0, 1).unwrap(); // both inserts at the same index
1173
+
1174
+ assert_eq!(doc.length(list), 2);
1175
+ assert_eq!(doc.keys(list).count(), 2);
1176
+ assert_eq!(doc.list_range(list, ..).count(), 2);
1177
+ }
1178
+
1179
+ #[test]
1180
+ fn get_list_values() -> Result<(), AutomergeError> {
1181
+ let mut doc1 = Automerge::new();
1182
+ let mut tx = doc1.transaction();
1183
+ let list = tx.put_object(ROOT, "list", ObjType::List)?;
1184
+
1185
+ // insert elements
1186
+ tx.insert(&list, 0, "First")?;
1187
+ tx.insert(&list, 1, "Second")?;
1188
+ tx.insert(&list, 2, "Third")?;
1189
+ tx.insert(&list, 3, "Forth")?;
1190
+ tx.insert(&list, 4, "Fith")?;
1191
+ tx.insert(&list, 5, "Sixth")?;
1192
+ tx.insert(&list, 6, "Seventh")?;
1193
+ tx.insert(&list, 7, "Eights")?;
1194
+ tx.commit();
1195
+
1196
+ let v1 = doc1.get_heads();
1197
+ let mut doc2 = doc1.fork();
1198
+
1199
+ let mut tx = doc1.transaction();
1200
+ tx.put(&list, 2, "Third V2")?;
1201
+ tx.commit();
1202
+
1203
+ let mut tx = doc2.transaction();
1204
+ tx.put(&list, 2, "Third V3")?;
1205
+ tx.commit();
1206
+
1207
+ doc1.merge(&mut doc2)?;
1208
+
1209
+ assert_eq!(doc1.list_range(&list, ..).count(), 8);
1210
+
1211
+ for item in doc1.list_range(&list, ..) {
1212
+ let val2 = doc1.get(&list, item.index)?;
1213
+ assert_eq!(Some((item.value, item.id)), val2);
1214
+ }
1215
+
1216
+ assert_eq!(doc1.list_range(&list, 3..6).count(), 3);
1217
+ assert_eq!(doc1.list_range(&list, 3..6).next().unwrap().index, 3);
1218
+ assert_eq!(doc1.list_range(&list, 3..6).last().unwrap().index, 5);
1219
+
1220
+ for item in doc1.list_range(&list, 3..6) {
1221
+ let val2 = doc1.get(&list, item.index)?;
1222
+ assert_eq!(Some((item.value, item.id)), val2);
1223
+ }
1224
+
1225
+ assert_eq!(doc1.list_range_at(&list, .., &v1).count(), 8);
1226
+ for item in doc1.list_range_at(&list, .., &v1) {
1227
+ let val2 = doc1.get_at(&list, item.index, &v1)?;
1228
+ assert_eq!(Some((item.value, item.id)), val2);
1229
+ }
1230
+
1231
+ assert_eq!(doc1.list_range_at(&list, 3..6, &v1).count(), 3);
1232
+ assert_eq!(
1233
+ doc1.list_range_at(&list, 3..6, &v1).next().unwrap().index,
1234
+ 3
1235
+ );
1236
+ assert_eq!(
1237
+ doc1.list_range_at(&list, 3..6, &v1).last().unwrap().index,
1238
+ 5
1239
+ );
1240
+
1241
+ for item in doc1.list_range_at(&list, 3..6, &v1) {
1242
+ let val2 = doc1.get_at(&list, item.index, &v1)?;
1243
+ assert_eq!(Some((item.value, item.id)), val2);
1244
+ }
1245
+
1246
+ let range: Vec<_> = doc1
1247
+ .list_range(&list, ..)
1248
+ .map(|item| (item.value, item.id))
1249
+ .collect();
1250
+ let values = doc1.values(&list);
1251
+ let values: Vec<_> = values.collect();
1252
+ assert_eq!(range, values);
1253
+
1254
+ let range: Vec<_> = doc1
1255
+ .list_range_at(&list, .., &v1)
1256
+ .map(|item| (item.value, item.id))
1257
+ .collect();
1258
+ let values: Vec<_> = doc1.values_at(&list, &v1).collect();
1259
+ assert_eq!(range, values);
1260
+
1261
+ Ok(())
1262
+ }
1263
+
1264
+ #[test]
1265
+ fn get_range_values() -> Result<(), AutomergeError> {
1266
+ let mut doc1 = Automerge::new();
1267
+ let mut tx = doc1.transaction();
1268
+ tx.put(ROOT, "aa", "aaa")?;
1269
+ tx.put(ROOT, "bb", "bbb")?;
1270
+ tx.put(ROOT, "cc", "ccc")?;
1271
+ tx.put(ROOT, "dd", "ddd")?;
1272
+ tx.commit();
1273
+
1274
+ let v1 = doc1.get_heads();
1275
+ let mut doc2 = doc1.fork();
1276
+
1277
+ let mut tx = doc1.transaction();
1278
+ tx.put(ROOT, "cc", "ccc V2")?;
1279
+ tx.commit();
1280
+
1281
+ let mut tx = doc2.transaction();
1282
+ tx.put(ROOT, "cc", "ccc V3")?;
1283
+ tx.commit();
1284
+
1285
+ doc1.merge(&mut doc2)?;
1286
+
1287
+ let range = "b".to_string().."d".to_string();
1288
+
1289
+ assert_eq!(doc1.map_range(ROOT, range.clone()).count(), 2);
1290
+
1291
+ for item in doc1.map_range(ROOT, range.clone()) {
1292
+ let val2 = doc1.get(ROOT, item.key)?;
1293
+ assert_eq!(Some((item.value, item.id)), val2);
1294
+ }
1295
+
1296
+ assert_eq!(doc1.map_range_at(ROOT, range.clone(), &v1).count(), 2);
1297
+
1298
+ for item in doc1.map_range_at(ROOT, range, &v1) {
1299
+ let val2 = doc1.get_at(ROOT, item.key, &v1)?;
1300
+ assert_eq!(Some((item.value, item.id)), val2);
1301
+ }
1302
+
1303
+ let range: Vec<_> = doc1
1304
+ .map_range(ROOT, ..)
1305
+ .map(|item| (item.value, item.id))
1306
+ .collect();
1307
+ let values: Vec<_> = doc1.values(ROOT).collect();
1308
+ assert_eq!(range, values);
1309
+
1310
+ let range: Vec<_> = doc1
1311
+ .map_range_at(ROOT, .., &v1)
1312
+ .map(|item| (item.value, item.id))
1313
+ .collect();
1314
+ let values: Vec<_> = doc1.values_at(ROOT, &v1).collect();
1315
+ assert_eq!(range, values);
1316
+
1317
+ Ok(())
1318
+ }
1319
+
1320
+ #[test]
1321
+ fn range_iter_map_rev() {
1322
+ let mut doc = Automerge::new();
1323
+ let mut tx = doc.transaction();
1324
+ tx.put(ROOT, "a", 3).unwrap();
1325
+ tx.put(ROOT, "b", 4).unwrap();
1326
+ tx.put(ROOT, "c", 5).unwrap();
1327
+ tx.put(ROOT, "d", 6).unwrap();
1328
+ tx.commit();
1329
+ let mut tx = doc.transaction();
1330
+ tx.put(ROOT, "a", 7).unwrap();
1331
+ tx.commit();
1332
+ let mut tx = doc.transaction();
1333
+ tx.put(ROOT, "a", 8).unwrap();
1334
+ tx.put(ROOT, "d", 9).unwrap();
1335
+ tx.commit();
1336
+ doc.dump();
1337
+ let actor = doc.get_actor();
1338
+ assert_eq!(doc.map_range(ROOT, ..).count(), 4);
1339
+
1340
+ let mut range = doc.map_range(ROOT, "b".to_owned().."d".into());
1341
+ assert_eq!(
1342
+ range.next(),
1343
+ Some(MapRangeItem::new(
1344
+ "b",
1345
+ 4.into(),
1346
+ ExId::Id(2, actor.clone(), 0),
1347
+ false
1348
+ ))
1349
+ );
1350
+ assert_eq!(
1351
+ range.next(),
1352
+ Some(MapRangeItem::new(
1353
+ "c",
1354
+ 5.into(),
1355
+ ExId::Id(3, actor.clone(), 0),
1356
+ false
1357
+ ))
1358
+ );
1359
+ assert_eq!(range.next(), None);
1360
+
1361
+ let mut range = doc.map_range(ROOT, "b".to_owned()..="d".into());
1362
+ assert_eq!(
1363
+ range.next(),
1364
+ Some(MapRangeItem::new(
1365
+ "b",
1366
+ 4.into(),
1367
+ ExId::Id(2, actor.clone(), 0),
1368
+ false
1369
+ ))
1370
+ );
1371
+ assert_eq!(
1372
+ range.next(),
1373
+ Some(MapRangeItem::new(
1374
+ "c",
1375
+ 5.into(),
1376
+ ExId::Id(3, actor.clone(), 0),
1377
+ false
1378
+ ))
1379
+ );
1380
+ assert_eq!(
1381
+ range.next(),
1382
+ Some(MapRangeItem::new(
1383
+ "d",
1384
+ 9.into(),
1385
+ ExId::Id(7, actor.clone(), 0),
1386
+ false
1387
+ ))
1388
+ );
1389
+ assert_eq!(range.next(), None);
1390
+
1391
+ let mut range = doc.map_range(ROOT, ..="c".to_owned());
1392
+ assert_eq!(
1393
+ range.next(),
1394
+ Some(MapRangeItem::new(
1395
+ "a",
1396
+ 8.into(),
1397
+ ExId::Id(6, actor.clone(), 0),
1398
+ false
1399
+ ))
1400
+ );
1401
+ assert_eq!(
1402
+ range.next(),
1403
+ Some(MapRangeItem::new(
1404
+ "b",
1405
+ 4.into(),
1406
+ ExId::Id(2, actor.clone(), 0),
1407
+ false
1408
+ ))
1409
+ );
1410
+ assert_eq!(
1411
+ range.next(),
1412
+ Some(MapRangeItem::new(
1413
+ "c",
1414
+ 5.into(),
1415
+ ExId::Id(3, actor.clone(), 0),
1416
+ false
1417
+ ))
1418
+ );
1419
+ assert_eq!(range.next(), None);
1420
+
1421
+ let range = doc.map_range(ROOT, "a".to_owned()..);
1422
+ assert_eq!(
1423
+ range.collect::<Vec<_>>(),
1424
+ vec![
1425
+ MapRangeItem::new("a", 8.into(), ExId::Id(6, actor.clone(), 0), false),
1426
+ MapRangeItem::new("b", 4.into(), ExId::Id(2, actor.clone(), 0), false),
1427
+ MapRangeItem::new("c", 5.into(), ExId::Id(3, actor.clone(), 0), false),
1428
+ MapRangeItem::new("d", 9.into(), ExId::Id(7, actor.clone(), 0), false),
1429
+ ]
1430
+ );
1431
+ }
1432
+
1433
+ #[test]
1434
+ fn rolling_back_transaction_has_no_effect() {
1435
+ let mut doc = Automerge::new();
1436
+ let old_states = doc.states.clone();
1437
+ let bytes = doc.save();
1438
+ let tx = doc.transaction();
1439
+ tx.rollback();
1440
+ let new_states = doc.states.clone();
1441
+ assert_eq!(old_states, new_states);
1442
+ let new_bytes = doc.save();
1443
+ assert_eq!(bytes, new_bytes);
1444
+ }
1445
+
1446
+ #[test]
1447
+ fn mutate_old_objects() {
1448
+ let mut doc = Automerge::new();
1449
+ let mut tx = doc.transaction();
1450
+ // create a map
1451
+ let map1 = tx.put_object(ROOT, "a", ObjType::Map).unwrap();
1452
+ tx.put(&map1, "b", 1).unwrap();
1453
+ // overwrite the first map with a new one
1454
+ let map2 = tx.put_object(ROOT, "a", ObjType::Map).unwrap();
1455
+ tx.put(&map2, "c", 2).unwrap();
1456
+ tx.commit();
1457
+
1458
+ // we can get the new map by traversing the tree
1459
+ let map = doc.get(&ROOT, "a").unwrap().unwrap().1;
1460
+ assert_eq!(doc.get(&map, "b").unwrap(), None);
1461
+ // and get values from it
1462
+ assert_eq!(
1463
+ doc.get(&map, "c").unwrap().map(|s| s.0),
1464
+ Some(ScalarValue::Int(2).into())
1465
+ );
1466
+
1467
+ // but we can still access the old one if we know the ID!
1468
+ assert_eq!(doc.get(&map1, "b").unwrap().unwrap().0, Value::int(1));
1469
+ // and even set new things in it!
1470
+ let mut tx = doc.transaction();
1471
+ tx.put(&map1, "c", 3).unwrap();
1472
+ tx.commit();
1473
+
1474
+ assert_eq!(doc.get(&map1, "c").unwrap().unwrap().0, Value::int(3));
1475
+ }
1476
+
1477
+ #[test]
1478
+ fn delete_nothing_in_map_is_noop() {
1479
+ let mut doc = Automerge::new();
1480
+ let mut tx = doc.transaction();
1481
+ // deleting a missing key in a map should just be a noop
1482
+ assert!(tx.delete(ROOT, "a",).is_ok());
1483
+ tx.commit();
1484
+ let last_change = doc.get_last_local_change();
1485
+ assert!(last_change.is_none());
1486
+
1487
+ let bytes = doc.save();
1488
+ assert!(Automerge::load(&bytes,).is_ok());
1489
+
1490
+ let mut tx = doc.transaction();
1491
+ tx.put(ROOT, "a", 1).unwrap();
1492
+ tx.commit();
1493
+ let last_change = doc.get_last_local_change().unwrap();
1494
+ assert_eq!(last_change.len(), 1);
1495
+
1496
+ let mut tx = doc.transaction();
1497
+ // a real op
1498
+ tx.delete(ROOT, "a").unwrap();
1499
+ // a no-op
1500
+ tx.delete(ROOT, "a").unwrap();
1501
+ tx.commit();
1502
+ let last_change = doc.get_last_local_change().unwrap();
1503
+ assert_eq!(last_change.len(), 1);
1504
+ }
1505
+
1506
+ #[test]
1507
+ fn delete_nothing_in_list_returns_error() {
1508
+ let mut doc = Automerge::new();
1509
+ let mut tx = doc.transaction();
1510
+ // deleting an element in a list that does not exist is an error
1511
+ assert!(tx.delete(ROOT, 0,).is_err());
1512
+ }
1513
+
1514
+ #[test]
1515
+ fn loaded_doc_changes_have_hash() {
1516
+ let mut doc = Automerge::new();
1517
+ let mut tx = doc.transaction();
1518
+ tx.put(ROOT, "a", 1_u64).unwrap();
1519
+ tx.commit();
1520
+ let hash = doc.get_last_local_change().unwrap().hash();
1521
+ let bytes = doc.save();
1522
+ let doc = Automerge::load(&bytes).unwrap();
1523
+ assert_eq!(doc.get_change_by_hash(&hash).unwrap().hash(), hash);
1524
+ }
1525
+
1526
+ #[test]
1527
+ fn load_change_with_zero_start_op() {
1528
+ let bytes = &[
1529
+ 133, 111, 74, 131, 202, 50, 52, 158, 2, 96, 163, 163, 83, 255, 255, 255, 50, 50, 50, 50,
1530
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 255, 255, 245, 53, 1, 0, 0, 0, 0, 0, 0, 4, 233,
1531
+ 245, 239, 255, 1, 0, 0, 0, 133, 111, 74, 131, 163, 96, 0, 0, 2, 10, 202, 144, 125, 19, 48,
1532
+ 89, 133, 49, 10, 10, 67, 91, 111, 10, 74, 131, 96, 0, 163, 131, 255, 255, 255, 255, 255,
1533
+ 255, 255, 255, 255, 1, 153, 0, 0, 246, 255, 255, 255, 157, 157, 157, 157, 157, 157, 157,
1534
+ 157, 157, 157, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
1535
+ 255, 255, 255, 48, 254, 208,
1536
+ ];
1537
+ let _ = Automerge::load(bytes);
1538
+ }
1539
+
1540
+ #[test]
1541
+ fn load_broken_list() {
1542
+ enum Action {
1543
+ InsertText(usize, char),
1544
+ DelText(usize),
1545
+ }
1546
+ use Action::*;
1547
+ let actions = [
1548
+ InsertText(0, 'a'),
1549
+ InsertText(0, 'b'),
1550
+ DelText(1),
1551
+ InsertText(0, 'c'),
1552
+ DelText(1),
1553
+ DelText(0),
1554
+ InsertText(0, 'd'),
1555
+ InsertText(0, 'e'),
1556
+ InsertText(1, 'f'),
1557
+ DelText(2),
1558
+ DelText(1),
1559
+ InsertText(0, 'g'),
1560
+ DelText(1),
1561
+ DelText(0),
1562
+ InsertText(0, 'h'),
1563
+ InsertText(1, 'i'),
1564
+ DelText(1),
1565
+ DelText(0),
1566
+ InsertText(0, 'j'),
1567
+ InsertText(0, 'k'),
1568
+ DelText(1),
1569
+ DelText(0),
1570
+ InsertText(0, 'l'),
1571
+ DelText(0),
1572
+ InsertText(0, 'm'),
1573
+ InsertText(0, 'n'),
1574
+ DelText(1),
1575
+ DelText(0),
1576
+ InsertText(0, 'o'),
1577
+ DelText(0),
1578
+ InsertText(0, 'p'),
1579
+ InsertText(1, 'q'),
1580
+ InsertText(1, 'r'),
1581
+ InsertText(1, 's'),
1582
+ InsertText(3, 't'),
1583
+ InsertText(5, 'u'),
1584
+ InsertText(0, 'v'),
1585
+ InsertText(3, 'w'),
1586
+ InsertText(4, 'x'),
1587
+ InsertText(0, 'y'),
1588
+ InsertText(6, 'z'),
1589
+ InsertText(11, '1'),
1590
+ InsertText(0, '2'),
1591
+ InsertText(0, '3'),
1592
+ InsertText(0, '4'),
1593
+ InsertText(13, '5'),
1594
+ InsertText(11, '6'),
1595
+ InsertText(17, '7'),
1596
+ ];
1597
+ let mut doc = Automerge::new();
1598
+ let mut tx = doc.transaction();
1599
+ let list = tx.put_object(ROOT, "list", ObjType::List).unwrap();
1600
+ for action in actions {
1601
+ match action {
1602
+ Action::InsertText(index, c) => {
1603
+ tx.insert(&list, index, c).unwrap();
1604
+ }
1605
+ Action::DelText(index) => {
1606
+ tx.delete(&list, index).unwrap();
1607
+ }
1608
+ }
1609
+ }
1610
+ tx.commit();
1611
+ let bytes = doc.save();
1612
+ let doc2 = Automerge::load(&bytes).unwrap();
1613
+ let bytes2 = doc2.save();
1614
+ assert_eq!(doc.text(&list).unwrap(), doc2.text(&list).unwrap());
1615
+
1616
+ assert_eq!(doc.queue, doc2.queue);
1617
+ assert_eq!(doc.history, doc2.history);
1618
+ assert_eq!(doc.history_index, doc2.history_index);
1619
+ assert_eq!(doc.states, doc2.states);
1620
+ assert_eq!(doc.deps, doc2.deps);
1621
+ // dont to support PartialEq b/c it would have to use the iterator underdneath
1622
+ let doc1_ops: Vec<_> = doc.ops.iter().collect();
1623
+ let doc2_ops: Vec<_> = doc2.ops.iter().collect();
1624
+ assert_eq!(doc1_ops, doc2_ops);
1625
+ assert_eq!(doc.max_op, doc2.max_op);
1626
+
1627
+ assert_eq!(bytes, bytes2);
1628
+ }
1629
+
1630
+ #[test]
1631
+ fn load_broken_list_short() {
1632
+ // breaks when the B constant in OpSet is 3
1633
+ enum Action {
1634
+ InsertText(usize, char),
1635
+ DelText(usize),
1636
+ }
1637
+ use Action::*;
1638
+ let actions = [
1639
+ InsertText(0, 'a'),
1640
+ InsertText(1, 'b'),
1641
+ DelText(1),
1642
+ InsertText(1, 'c'),
1643
+ InsertText(2, 'd'),
1644
+ InsertText(2, 'e'),
1645
+ InsertText(0, 'f'),
1646
+ DelText(4),
1647
+ InsertText(4, 'g'),
1648
+ ];
1649
+ let mut doc = Automerge::new();
1650
+ let mut tx = doc.transaction();
1651
+ let list = tx.put_object(ROOT, "list", ObjType::List).unwrap();
1652
+ for action in actions {
1653
+ match action {
1654
+ Action::InsertText(index, c) => {
1655
+ tx.insert(&list, index, c).unwrap();
1656
+ }
1657
+ Action::DelText(index) => {
1658
+ tx.delete(&list, index).unwrap();
1659
+ }
1660
+ }
1661
+ }
1662
+ tx.commit();
1663
+ let bytes = doc.save();
1664
+ let doc2 = Automerge::load(&bytes).unwrap();
1665
+ let bytes2 = doc2.save();
1666
+ assert_eq!(doc.text(&list).unwrap(), doc2.text(&list).unwrap());
1667
+
1668
+ assert_eq!(doc.queue, doc2.queue);
1669
+ assert_eq!(doc.history, doc2.history);
1670
+ assert_eq!(doc.history_index, doc2.history_index);
1671
+ assert_eq!(doc.states, doc2.states);
1672
+ assert_eq!(doc.deps, doc2.deps);
1673
+ assert_eq!(doc.max_op, doc2.max_op);
1674
+ assert_eq!(bytes, bytes2);
1675
+ assert_eq!(doc.ops.len(), doc2.ops.len());
1676
+ let doc1_ops: Vec<_> = doc.ops.iter().collect();
1677
+ let doc2_ops: Vec<_> = doc2.ops.iter().collect();
1678
+ assert_eq!(doc1_ops, doc2_ops);
1679
+ }
1680
+
1681
+ #[test]
1682
+ fn compute_list_indexes_correctly_when_list_element_is_split_across_tree_nodes() {
1683
+ let max = B as u64 * 2;
1684
+ let actor1 = ActorId::from(b"aaaa");
1685
+ let mut doc1 = AutoCommit::new().with_actor(actor1.clone());
1686
+ let actor2 = ActorId::from(b"bbbb");
1687
+ let mut doc2 = AutoCommit::new().with_actor(actor2.clone());
1688
+ let list = doc1.put_object(ROOT, "list", ObjType::List).unwrap();
1689
+ doc1.insert(&list, 0, 0).unwrap();
1690
+ doc2.load_incremental(&doc1.save_incremental()).unwrap();
1691
+ for i in 1..=max {
1692
+ doc1.put(&list, 0, i).unwrap()
1693
+ }
1694
+ for i in 1..=max {
1695
+ doc2.put(&list, 0, i).unwrap()
1696
+ }
1697
+ let change1 = doc1.save_incremental();
1698
+ let change2 = doc2.save_incremental();
1699
+ doc2.load_incremental(&change1).unwrap();
1700
+ doc1.load_incremental(&change2).unwrap();
1701
+ assert_eq!(doc1.length(&list), 1);
1702
+ assert_eq!(doc2.length(&list), 1);
1703
+ assert_eq!(
1704
+ doc1.get_all(&list, 0).unwrap(),
1705
+ vec![
1706
+ (max.into(), ExId::Id(max + 2, actor1.clone(), 0)),
1707
+ (max.into(), ExId::Id(max + 2, actor2.clone(), 1))
1708
+ ]
1709
+ );
1710
+ assert_eq!(
1711
+ doc2.get_all(&list, 0).unwrap(),
1712
+ vec![
1713
+ (max.into(), ExId::Id(max + 2, actor1, 0)),
1714
+ (max.into(), ExId::Id(max + 2, actor2, 1))
1715
+ ]
1716
+ );
1717
+ assert!(doc1.get(&list, 1).unwrap().is_none());
1718
+ assert!(doc2.get(&list, 1).unwrap().is_none());
1719
+ }
1720
+
1721
+ #[test]
1722
+ fn get_parent_objects() {
1723
+ let mut doc = AutoCommit::new();
1724
+ let map = doc.put_object(ROOT, "a", ObjType::Map).unwrap();
1725
+ let list = doc.put_object(&map, "b", ObjType::List).unwrap();
1726
+ doc.insert(&list, 0, 2).unwrap();
1727
+ let text = doc.put_object(&list, 0, ObjType::Text).unwrap();
1728
+
1729
+ assert_eq!(
1730
+ doc.parents(&map).unwrap().next(),
1731
+ Some(Parent {
1732
+ obj: ROOT,
1733
+ typ: ObjType::Map,
1734
+ prop: Prop::Map("a".into()),
1735
+ visible: true
1736
+ })
1737
+ );
1738
+ assert_eq!(
1739
+ doc.parents(&list).unwrap().next(),
1740
+ Some(Parent {
1741
+ obj: map,
1742
+ typ: ObjType::Map,
1743
+ prop: Prop::Map("b".into()),
1744
+ visible: true
1745
+ })
1746
+ );
1747
+ assert_eq!(
1748
+ doc.parents(&text).unwrap().next(),
1749
+ Some(Parent {
1750
+ obj: list,
1751
+ typ: ObjType::List,
1752
+ prop: Prop::Seq(0),
1753
+ visible: true
1754
+ })
1755
+ );
1756
+ }
1757
+
1758
+ #[test]
1759
+ fn get_path_to_object() {
1760
+ let mut doc = AutoCommit::new();
1761
+ let map = doc.put_object(ROOT, "a", ObjType::Map).unwrap();
1762
+ let list = doc.put_object(&map, "b", ObjType::List).unwrap();
1763
+ doc.insert(&list, 0, 2).unwrap();
1764
+ let text = doc.put_object(&list, 0, ObjType::Text).unwrap();
1765
+
1766
+ assert_eq!(
1767
+ doc.parents(&map).unwrap().path(),
1768
+ vec![(ROOT, Prop::Map("a".into()))]
1769
+ );
1770
+ assert_eq!(
1771
+ doc.parents(&list).unwrap().path(),
1772
+ vec![
1773
+ (ROOT, Prop::Map("a".into())),
1774
+ (map.clone(), Prop::Map("b".into())),
1775
+ ]
1776
+ );
1777
+ assert_eq!(
1778
+ doc.parents(text).unwrap().path(),
1779
+ vec![
1780
+ (ROOT, Prop::Map("a".into())),
1781
+ (map, Prop::Map("b".into())),
1782
+ (list, Prop::Seq(0)),
1783
+ ]
1784
+ );
1785
+ }
1786
+
1787
+ #[test]
1788
+ fn parents_iterator() {
1789
+ let mut doc = AutoCommit::new();
1790
+ let map = doc.put_object(ROOT, "a", ObjType::Map).unwrap();
1791
+ let list = doc.put_object(&map, "b", ObjType::List).unwrap();
1792
+ doc.insert(&list, 0, 2).unwrap();
1793
+ let text = doc.put_object(&list, 0, ObjType::Text).unwrap();
1794
+
1795
+ let mut parents = doc.parents(text).unwrap();
1796
+ assert_eq!(
1797
+ parents.next(),
1798
+ Some(Parent {
1799
+ obj: list,
1800
+ typ: ObjType::List,
1801
+ prop: Prop::Seq(0),
1802
+ visible: true
1803
+ })
1804
+ );
1805
+ assert_eq!(
1806
+ parents.next(),
1807
+ Some(Parent {
1808
+ obj: map,
1809
+ typ: ObjType::Map,
1810
+ prop: Prop::Map("b".into()),
1811
+ visible: true
1812
+ })
1813
+ );
1814
+ assert_eq!(
1815
+ parents.next(),
1816
+ Some(Parent {
1817
+ obj: ROOT,
1818
+ typ: ObjType::Map,
1819
+ prop: Prop::Map("a".into()),
1820
+ visible: true
1821
+ })
1822
+ );
1823
+ assert_eq!(parents.next(), None);
1824
+ }
1825
+
1826
+ #[test]
1827
+ fn can_insert_a_grapheme_into_text() {
1828
+ let mut doc = Automerge::new();
1829
+ let mut tx = doc.transaction();
1830
+ let text = tx.put_object(ROOT, "text", ObjType::Text).unwrap();
1831
+ let polar_bear = "🐻‍❄️";
1832
+ tx.splice_text(&text, 0, 0, polar_bear).unwrap();
1833
+ tx.commit();
1834
+ let s = doc.text(&text).unwrap();
1835
+ assert_eq!(s, polar_bear);
1836
+ let len = doc.length(&text);
1837
+ assert_eq!(len, 4); // 4 utf8 chars
1838
+ }
1839
+
1840
+ #[test]
1841
+ fn long_strings_spliced_into_text_get_segmented_by_utf8_chars() {
1842
+ let mut doc = Automerge::new();
1843
+ let mut tx = doc.transaction();
1844
+ let text = tx.put_object(ROOT, "text", ObjType::Text).unwrap();
1845
+ let polar_bear = "🐻‍❄️";
1846
+ let polar_bear_army = polar_bear.repeat(100);
1847
+ tx.splice_text(&text, 0, 0, &polar_bear_army).unwrap();
1848
+ tx.commit();
1849
+ let s = doc.text(&text).unwrap();
1850
+ assert_eq!(s, polar_bear_army);
1851
+ let len = doc.length(&text);
1852
+ assert_eq!(len, polar_bear.chars().count() * 100);
1853
+ assert_eq!(len, 400);
1854
+ }
1855
+
1856
+ #[test]
1857
+ fn splice_text_uses_unicode_scalars() {
1858
+ let mut doc = Automerge::new();
1859
+ let mut tx = doc.transaction();
1860
+ let text = tx.put_object(ROOT, "text", ObjType::Text).unwrap();
1861
+ let polar_bear = "🐻‍❄️";
1862
+ tx.splice_text(&text, 0, 0, polar_bear).unwrap();
1863
+ tx.commit();
1864
+ let s = doc.text(&text).unwrap();
1865
+ assert_eq!(s, polar_bear);
1866
+ let len = doc.length(&text);
1867
+ assert_eq!(len, 4); // 4 chars
1868
+ }
1869
+
1870
+ #[test]
1871
+ fn observe_counter_change_application_overwrite() {
1872
+ let mut doc1 = AutoCommit::new();
1873
+ doc1.set_actor(ActorId::from([1]));
1874
+ doc1.put(ROOT, "counter", ScalarValue::counter(1)).unwrap();
1875
+ doc1.commit();
1876
+
1877
+ let mut doc2 = doc1.fork();
1878
+ doc2.set_actor(ActorId::from([2]));
1879
+ doc2.put(ROOT, "counter", "mystring").unwrap();
1880
+ doc2.commit();
1881
+
1882
+ doc1.increment(ROOT, "counter", 2).unwrap();
1883
+ doc1.commit();
1884
+ doc1.increment(ROOT, "counter", 5).unwrap();
1885
+ doc1.commit();
1886
+
1887
+ let mut doc3 = doc1.fork();
1888
+ doc3.merge(&mut doc2).unwrap();
1889
+
1890
+ assert_eq!(
1891
+ doc3.diff_incremental(),
1892
+ vec![Patch {
1893
+ obj: ExId::Root,
1894
+ path: vec![],
1895
+ action: PatchAction::PutMap {
1896
+ key: "counter".into(),
1897
+ value: (
1898
+ ScalarValue::Str("mystring".into()).into(),
1899
+ ExId::Id(2, doc2.get_actor().clone(), 1)
1900
+ ),
1901
+ conflict: false,
1902
+ }
1903
+ }]
1904
+ );
1905
+
1906
+ let mut doc4 = doc2.clone();
1907
+ doc4.update_diff_cursor();
1908
+ doc4.merge(&mut doc1).unwrap();
1909
+
1910
+ // no patches as the increments operate on an invisible counter
1911
+ assert_eq!(doc4.diff_incremental(), vec![]);
1912
+ }
1913
+
1914
+ #[test]
1915
+ fn observe_counter_change_application() {
1916
+ let mut doc = AutoCommit::new();
1917
+ doc.put(ROOT, "counter", ScalarValue::counter(1)).unwrap();
1918
+ doc.increment(ROOT, "counter", 2).unwrap();
1919
+ doc.increment(ROOT, "counter", 5).unwrap();
1920
+ let changes = doc.get_changes(&[]).into_iter().cloned();
1921
+
1922
+ let mut new_doc = AutoCommit::new();
1923
+ // make a new change to the doc to stop the empty doc logic from skipping the intermediate
1924
+ // patches. The is probably not really necessary, we could update this test to just test that
1925
+ // the correct final state is emitted. For now though, we leave it as is.
1926
+ new_doc.put(ROOT, "foo", "bar").unwrap();
1927
+ new_doc.update_diff_cursor();
1928
+ new_doc.apply_changes(changes).unwrap();
1929
+ assert_eq!(
1930
+ new_doc
1931
+ .diff_incremental()
1932
+ .into_iter()
1933
+ .map(|p| p.action)
1934
+ .collect::<Vec<_>>(),
1935
+ vec![
1936
+ PatchAction::PutMap {
1937
+ key: "counter".into(),
1938
+ value: (
1939
+ ScalarValue::counter(1).into(),
1940
+ ExId::Id(1, doc.get_actor().clone(), 0)
1941
+ ),
1942
+ conflict: false,
1943
+ },
1944
+ PatchAction::Increment {
1945
+ prop: Prop::Map("counter".into()),
1946
+ value: 2,
1947
+ },
1948
+ PatchAction::Increment {
1949
+ prop: Prop::Map("counter".into()),
1950
+ value: 5,
1951
+ }
1952
+ ]
1953
+ );
1954
+ }
1955
+
1956
+ #[test]
1957
+ fn get_changes_heads_empty() {
1958
+ let mut doc = AutoCommit::new();
1959
+ doc.put(ROOT, "key1", 1).unwrap();
1960
+ doc.commit();
1961
+ doc.put(ROOT, "key2", 1).unwrap();
1962
+ doc.commit();
1963
+ let heads = doc.get_heads();
1964
+ assert_eq!(doc.get_changes(&heads), Vec::<&Change>::new());
1965
+ }
1966
+
1967
+ #[test]
1968
+ fn hash_for_opid() {
1969
+ let mut doc = AutoCommit::new();
1970
+
1971
+ doc.put(ROOT, "key1", 1).unwrap();
1972
+ let (_, id1) = doc.get(ROOT, "key1").unwrap().unwrap();
1973
+ // it isn't available yet
1974
+ assert_eq!(doc.hash_for_opid(&id1), None);
1975
+ let hash1 = doc.commit();
1976
+ // we can get the hash for the change that made this id
1977
+ assert_eq!(doc.hash_for_opid(&id1), hash1);
1978
+
1979
+ // this should still work with historical opids too
1980
+ doc.put(ROOT, "key1", 2).unwrap();
1981
+ let (_, id2) = doc.get(ROOT, "key1").unwrap().unwrap();
1982
+ // the newest one still isn't available yet
1983
+ assert_eq!(doc.hash_for_opid(&id2), None);
1984
+ let hash2 = doc.commit();
1985
+ assert_eq!(doc.hash_for_opid(&id1), hash1);
1986
+ assert_eq!(doc.hash_for_opid(&id2), hash2);
1987
+
1988
+ let mut doc = Automerge::new();
1989
+ let result = doc
1990
+ .transact(|txn| {
1991
+ txn.put(ROOT, "key1", 1).unwrap();
1992
+ let (_, id) = txn.get(ROOT, "key1").unwrap().unwrap();
1993
+ assert_eq!(txn.hash_for_opid(&id), None);
1994
+ Ok::<_, ()>(id)
1995
+ })
1996
+ .unwrap();
1997
+
1998
+ let id1 = result.result;
1999
+ let hash = result.hash;
2000
+ let result2 = doc
2001
+ .transact(|txn| {
2002
+ txn.put(ROOT, "key1", 2).unwrap();
2003
+ let (_, id2) = txn.get(ROOT, "key1").unwrap().unwrap();
2004
+ assert_eq!(txn.hash_for_opid(&id1), hash);
2005
+ assert_eq!(txn.hash_for_opid(&id2), None);
2006
+ Ok::<_, ()>(id2)
2007
+ })
2008
+ .unwrap();
2009
+ assert_eq!(doc.hash_for_opid(&result2.result), result2.hash);
2010
+
2011
+ // different actors
2012
+ let mut doc = AutoCommit::new();
2013
+ doc.put(ROOT, "key1", 1).unwrap();
2014
+ let mut doc = doc.fork();
2015
+ doc.put(ROOT, "key1", 2).unwrap();
2016
+ let (_, id1) = doc.get(ROOT, "key1").unwrap().unwrap();
2017
+ let hash1 = doc.commit();
2018
+ doc.put(ROOT, "key1", 3).unwrap();
2019
+ let (_, id2) = doc.get(ROOT, "key1").unwrap().unwrap();
2020
+ let hash2 = doc.commit();
2021
+ assert_eq!(doc.hash_for_opid(&id1), hash1);
2022
+ assert_eq!(doc.hash_for_opid(&id2), hash2);
2023
+ }