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,1034 @@
1
+ use automerge::transaction::Transactable;
2
+ use automerge::{AutoCommit, ObjType, PatchAction, ReadDoc, ScalarValue, Value, ROOT};
3
+ use std::borrow::Cow;
4
+
5
+ use automerge::{hydrate, hydrate_list, hydrate_map, hydrate_text, TextEncoding};
6
+
7
+ fn vbool(v: bool) -> Value<'static> {
8
+ Value::Scalar(Cow::Owned(ScalarValue::Boolean(v)))
9
+ }
10
+
11
+ fn vnull() -> Value<'static> {
12
+ Value::Scalar(Cow::Owned(ScalarValue::Null))
13
+ }
14
+
15
+ #[test]
16
+ fn batch_insert_flat_map() {
17
+ let mut doc = AutoCommit::new();
18
+ let value = hydrate::Value::Map(hydrate_map! {
19
+ "a" => "hello",
20
+ "b" => 42_i64,
21
+ "c" => ScalarValue::Boolean(true),
22
+ });
23
+ let obj_id = doc
24
+ .batch_create_object(ROOT, "data", &value, false)
25
+ .unwrap();
26
+
27
+ assert_eq!(
28
+ doc.get(ROOT, "data").unwrap().unwrap().0,
29
+ Value::Object(ObjType::Map)
30
+ );
31
+ assert_eq!(
32
+ doc.get(&obj_id, "a").unwrap().unwrap().0,
33
+ Value::str("hello")
34
+ );
35
+ assert_eq!(doc.get(&obj_id, "b").unwrap().unwrap().0, Value::int(42));
36
+ assert_eq!(doc.get(&obj_id, "c").unwrap().unwrap().0, vbool(true));
37
+ }
38
+
39
+ #[test]
40
+ fn batch_insert_nested_maps() {
41
+ let mut doc = AutoCommit::new();
42
+ let value = hydrate::Value::Map(hydrate_map! {
43
+ "outer" => hydrate_map! {
44
+ "inner_a" => "deep",
45
+ "inner_b" => 99_i64,
46
+ },
47
+ "top_level" => "flat",
48
+ });
49
+ let root_obj = doc
50
+ .batch_create_object(ROOT, "nested", &value, false)
51
+ .unwrap();
52
+
53
+ let (outer_val, outer_id) = doc.get(&root_obj, "outer").unwrap().unwrap();
54
+ assert_eq!(outer_val, Value::Object(ObjType::Map));
55
+ assert_eq!(
56
+ doc.get(&outer_id, "inner_a").unwrap().unwrap().0,
57
+ Value::str("deep")
58
+ );
59
+ assert_eq!(
60
+ doc.get(&outer_id, "inner_b").unwrap().unwrap().0,
61
+ Value::int(99)
62
+ );
63
+ assert_eq!(
64
+ doc.get(&root_obj, "top_level").unwrap().unwrap().0,
65
+ Value::str("flat")
66
+ );
67
+ }
68
+
69
+ #[test]
70
+ fn batch_insert_map_overwrites_existing_key() {
71
+ let mut doc = AutoCommit::new();
72
+ doc.put(ROOT, "key", "old_value").unwrap();
73
+ assert_eq!(
74
+ doc.get(ROOT, "key").unwrap().unwrap().0,
75
+ Value::str("old_value")
76
+ );
77
+
78
+ let value = hydrate::Value::Map(hydrate_map! { "child" => "new" });
79
+ doc.batch_create_object(ROOT, "key", &value, false).unwrap();
80
+
81
+ assert_eq!(
82
+ doc.get(ROOT, "key").unwrap().unwrap().0,
83
+ Value::Object(ObjType::Map)
84
+ );
85
+ }
86
+
87
+ #[test]
88
+ fn batch_insert_flat_list() {
89
+ let mut doc = AutoCommit::new();
90
+ let value = hydrate::Value::List(hydrate_list![1_i64, 2_i64, 3_i64]);
91
+ let obj_id = doc
92
+ .batch_create_object(ROOT, "nums", &value, false)
93
+ .unwrap();
94
+
95
+ assert_eq!(doc.length(&obj_id), 3);
96
+ assert_eq!(doc.get(&obj_id, 0).unwrap().unwrap().0, Value::int(1));
97
+ assert_eq!(doc.get(&obj_id, 1).unwrap().unwrap().0, Value::int(2));
98
+ assert_eq!(doc.get(&obj_id, 2).unwrap().unwrap().0, Value::int(3));
99
+ }
100
+
101
+ #[test]
102
+ fn batch_insert_list_with_nested_objects() {
103
+ let mut doc = AutoCommit::new();
104
+ let value = hydrate::Value::List(hydrate_list![
105
+ hydrate_map! { "name" => "alice" },
106
+ hydrate_map! { "name" => "bob" },
107
+ ]);
108
+ let list_id = doc
109
+ .batch_create_object(ROOT, "users", &value, false)
110
+ .unwrap();
111
+
112
+ assert_eq!(doc.length(&list_id), 2);
113
+ let (alice_val, alice_id) = doc.get(&list_id, 0).unwrap().unwrap();
114
+ assert_eq!(alice_val, Value::Object(ObjType::Map));
115
+ assert_eq!(
116
+ doc.get(&alice_id, "name").unwrap().unwrap().0,
117
+ Value::str("alice")
118
+ );
119
+
120
+ let (bob_val, bob_id) = doc.get(&list_id, 1).unwrap().unwrap();
121
+ assert_eq!(bob_val, Value::Object(ObjType::Map));
122
+ assert_eq!(
123
+ doc.get(&bob_id, "name").unwrap().unwrap().0,
124
+ Value::str("bob")
125
+ );
126
+ }
127
+
128
+ #[test]
129
+ fn batch_insert_scalar_fails() {
130
+ let mut doc = AutoCommit::new();
131
+ let Err(_) = doc.batch_create_object(ROOT, "foo", &hydrate::Value::Scalar(1.into()), false)
132
+ else {
133
+ panic!("batch creating a scalar should throw an error");
134
+ };
135
+ }
136
+
137
+ #[test]
138
+ fn batch_insert_into_list_at_end() {
139
+ let mut doc = AutoCommit::new();
140
+ let list_id = doc.put_object(ROOT, "items", ObjType::List).unwrap();
141
+ doc.insert(&list_id, 0, "first").unwrap();
142
+ doc.insert(&list_id, 1, "second").unwrap();
143
+
144
+ let value = hydrate::Value::Map(hydrate_map! { "key" => "third" });
145
+ doc.batch_create_object(&list_id, 2_usize, &value, true)
146
+ .unwrap();
147
+
148
+ assert_eq!(doc.length(&list_id), 3);
149
+ assert_eq!(
150
+ doc.get(&list_id, 0).unwrap().unwrap().0,
151
+ Value::str("first")
152
+ );
153
+ assert_eq!(
154
+ doc.get(&list_id, 1).unwrap().unwrap().0,
155
+ Value::str("second")
156
+ );
157
+ let (third_val, third_id) = doc.get(&list_id, 2).unwrap().unwrap();
158
+ assert_eq!(third_val, Value::Object(ObjType::Map));
159
+ assert_eq!(
160
+ doc.get(&third_id, "key").unwrap().unwrap().0,
161
+ Value::str("third")
162
+ );
163
+ }
164
+
165
+ #[test]
166
+ fn batch_insert_into_list_at_middle() {
167
+ let mut doc = AutoCommit::new();
168
+ let list_id = doc.put_object(ROOT, "items", ObjType::List).unwrap();
169
+ doc.insert(&list_id, 0, "a").unwrap();
170
+ doc.insert(&list_id, 1, "c").unwrap();
171
+
172
+ // Insert at index 1 with insert=true, shifting "c" to index 2
173
+ let value = hydrate::Value::Map(hydrate_map! { "val" => "b" });
174
+ doc.batch_create_object(&list_id, 1_usize, &value, true)
175
+ .unwrap();
176
+
177
+ assert_eq!(doc.length(&list_id), 3);
178
+ assert_eq!(doc.get(&list_id, 0).unwrap().unwrap().0, Value::str("a"));
179
+ assert_eq!(
180
+ doc.get(&list_id, 1).unwrap().unwrap().0,
181
+ Value::Object(ObjType::Map)
182
+ );
183
+ assert_eq!(doc.get(&list_id, 2).unwrap().unwrap().0, Value::str("c"));
184
+ }
185
+
186
+ #[test]
187
+ fn batch_put_overwrites_existing_list_element() {
188
+ let mut doc = AutoCommit::new();
189
+ let list_id = doc.put_object(ROOT, "items", ObjType::List).unwrap();
190
+ doc.insert(&list_id, 0, "old_a").unwrap();
191
+ doc.insert(&list_id, 1, "old_b").unwrap();
192
+ doc.insert(&list_id, 2, "old_c").unwrap();
193
+
194
+ // Overwrite element at index 1 with a map using insert=false
195
+ let value = hydrate::Value::Map(hydrate_map! { "replaced" => ScalarValue::Boolean(true) });
196
+ doc.batch_create_object(&list_id, 1_usize, &value, false)
197
+ .unwrap();
198
+
199
+ // Length should stay the same (overwrite, not insert)
200
+ assert_eq!(doc.length(&list_id), 3);
201
+ assert_eq!(
202
+ doc.get(&list_id, 0).unwrap().unwrap().0,
203
+ Value::str("old_a")
204
+ );
205
+ let (replaced_val, replaced_id) = doc.get(&list_id, 1).unwrap().unwrap();
206
+ assert_eq!(replaced_val, Value::Object(ObjType::Map));
207
+ assert_eq!(
208
+ doc.get(&replaced_id, "replaced").unwrap().unwrap().0,
209
+ vbool(true)
210
+ );
211
+ assert_eq!(
212
+ doc.get(&list_id, 2).unwrap().unwrap().0,
213
+ Value::str("old_c")
214
+ );
215
+ }
216
+
217
+ #[test]
218
+ fn batch_insert_with_text() {
219
+ let mut doc = AutoCommit::new();
220
+ let value = hydrate::Value::Map(hydrate_map! {
221
+ "greeting" => hydrate_text!{"hello world"},
222
+ });
223
+ let obj_id = doc
224
+ .batch_create_object(ROOT, "data", &value, false)
225
+ .unwrap();
226
+
227
+ let (text_val, text_id) = doc.get(&obj_id, "greeting").unwrap().unwrap();
228
+ assert_eq!(text_val, Value::Object(ObjType::Text));
229
+ assert_eq!(doc.text(&text_id).unwrap(), "hello world");
230
+ }
231
+
232
+ #[test]
233
+ fn batch_insert_text_in_list() {
234
+ let mut doc = AutoCommit::new();
235
+ let value = hydrate::Value::List(hydrate_list![hydrate_text! {"one"}, hydrate_text! {"two"},]);
236
+ let list_id = doc
237
+ .batch_create_object(ROOT, "texts", &value, false)
238
+ .unwrap();
239
+
240
+ assert_eq!(doc.length(&list_id), 2);
241
+ let (_, text0) = doc.get(&list_id, 0).unwrap().unwrap();
242
+ assert_eq!(doc.text(&text0).unwrap(), "one");
243
+ let (_, text1) = doc.get(&list_id, 1).unwrap().unwrap();
244
+ assert_eq!(doc.text(&text1).unwrap(), "two");
245
+ }
246
+
247
+ #[test]
248
+ fn batch_insert_deeply_nested() {
249
+ let mut doc = AutoCommit::new();
250
+ let value = hydrate::Value::Map(hydrate_map! {
251
+ "level1" => hydrate_map! {
252
+ "level2" => hydrate_map! {
253
+ "level3" => hydrate_map! {
254
+ "level4" => "deep_value",
255
+ },
256
+ },
257
+ },
258
+ });
259
+ let obj_id = doc
260
+ .batch_create_object(ROOT, "deep", &value, false)
261
+ .unwrap();
262
+
263
+ let (_, l1) = doc.get(&obj_id, "level1").unwrap().unwrap();
264
+ let (_, l2) = doc.get(&l1, "level2").unwrap().unwrap();
265
+ let (_, l3) = doc.get(&l2, "level3").unwrap().unwrap();
266
+ assert_eq!(
267
+ doc.get(&l3, "level4").unwrap().unwrap().0,
268
+ Value::str("deep_value")
269
+ );
270
+ }
271
+
272
+ #[test]
273
+ fn batch_insert_mixed_nesting() {
274
+ let mut doc = AutoCommit::new();
275
+ let value = hydrate::Value::Map(hydrate_map! {
276
+ "users" => hydrate_list![
277
+ hydrate_map! {
278
+ "name" => "alice",
279
+ "scores" => hydrate_list![10_i64, 20_i64, 30_i64],
280
+ },
281
+ hydrate_map! {
282
+ "name" => "bob",
283
+ "scores" => hydrate_list![40_i64, 50_i64],
284
+ },
285
+ ],
286
+ "count" => 2_i64,
287
+ });
288
+ let obj_id = doc
289
+ .batch_create_object(ROOT, "data", &value, false)
290
+ .unwrap();
291
+
292
+ assert_eq!(doc.get(&obj_id, "count").unwrap().unwrap().0, Value::int(2));
293
+
294
+ let (_, users_id) = doc.get(&obj_id, "users").unwrap().unwrap();
295
+ assert_eq!(doc.length(&users_id), 2);
296
+
297
+ let (_, alice_id) = doc.get(&users_id, 0).unwrap().unwrap();
298
+ assert_eq!(
299
+ doc.get(&alice_id, "name").unwrap().unwrap().0,
300
+ Value::str("alice")
301
+ );
302
+ let (_, alice_scores) = doc.get(&alice_id, "scores").unwrap().unwrap();
303
+ assert_eq!(doc.length(&alice_scores), 3);
304
+ assert_eq!(
305
+ doc.get(&alice_scores, 0).unwrap().unwrap().0,
306
+ Value::int(10)
307
+ );
308
+ assert_eq!(
309
+ doc.get(&alice_scores, 2).unwrap().unwrap().0,
310
+ Value::int(30)
311
+ );
312
+
313
+ let (_, bob_id) = doc.get(&users_id, 1).unwrap().unwrap();
314
+ assert_eq!(
315
+ doc.get(&bob_id, "name").unwrap().unwrap().0,
316
+ Value::str("bob")
317
+ );
318
+ let (_, bob_scores) = doc.get(&bob_id, "scores").unwrap().unwrap();
319
+ assert_eq!(doc.length(&bob_scores), 2);
320
+ }
321
+
322
+ #[test]
323
+ fn batch_insert_survives_save_load() {
324
+ let mut doc = AutoCommit::new();
325
+ let value = hydrate::Value::Map(hydrate_map! {
326
+ "name" => "test",
327
+ "items" => hydrate_list![1_i64, 2_i64, 3_i64],
328
+ "nested" => hydrate_map! { "deep" => ScalarValue::Boolean(true) },
329
+ });
330
+ doc.batch_create_object(ROOT, "data", &value, false)
331
+ .unwrap();
332
+
333
+ let saved = doc.save();
334
+ let doc2 = AutoCommit::load(&saved).unwrap();
335
+
336
+ let (_, data_id) = doc2.get(ROOT, "data").unwrap().unwrap();
337
+ assert_eq!(
338
+ doc2.get(&data_id, "name").unwrap().unwrap().0,
339
+ Value::str("test")
340
+ );
341
+
342
+ let (_, items_id) = doc2.get(&data_id, "items").unwrap().unwrap();
343
+ assert_eq!(doc2.length(&items_id), 3);
344
+
345
+ let (_, nested_id) = doc2.get(&data_id, "nested").unwrap().unwrap();
346
+ assert_eq!(
347
+ doc2.get(&nested_id, "deep").unwrap().unwrap().0,
348
+ vbool(true)
349
+ );
350
+ }
351
+
352
+ #[test]
353
+ fn batch_insert_merges_correctly() {
354
+ let mut doc1 = AutoCommit::new();
355
+ let mut doc2 = doc1.fork();
356
+
357
+ let v1 = hydrate::Value::Map(hydrate_map! { "from" => "doc1" });
358
+ doc1.batch_create_object(ROOT, "obj1", &v1, false).unwrap();
359
+
360
+ let v2 = hydrate::Value::Map(hydrate_map! { "from" => "doc2" });
361
+ doc2.batch_create_object(ROOT, "obj2", &v2, false).unwrap();
362
+
363
+ doc1.merge(&mut doc2).unwrap();
364
+
365
+ let (_, obj1_id) = doc1.get(ROOT, "obj1").unwrap().unwrap();
366
+ assert_eq!(
367
+ doc1.get(&obj1_id, "from").unwrap().unwrap().0,
368
+ Value::str("doc1")
369
+ );
370
+ let (_, obj2_id) = doc1.get(ROOT, "obj2").unwrap().unwrap();
371
+ assert_eq!(
372
+ doc1.get(&obj2_id, "from").unwrap().unwrap().0,
373
+ Value::str("doc2")
374
+ );
375
+ }
376
+
377
+ #[test]
378
+ fn multiple_batch_inserts() {
379
+ let mut doc = AutoCommit::new();
380
+
381
+ let v1 = hydrate::Value::Map(hydrate_map! { "a" => 1_i64 });
382
+ doc.batch_create_object(ROOT, "first", &v1, false).unwrap();
383
+
384
+ let v2 = hydrate::Value::Map(hydrate_map! { "b" => 2_i64 });
385
+ doc.batch_create_object(ROOT, "second", &v2, false).unwrap();
386
+
387
+ let v3 = hydrate::Value::Map(hydrate_map! { "c" => 3_i64 });
388
+ doc.batch_create_object(ROOT, "third", &v3, false).unwrap();
389
+
390
+ let (_, first_id) = doc.get(ROOT, "first").unwrap().unwrap();
391
+ assert_eq!(doc.get(&first_id, "a").unwrap().unwrap().0, Value::int(1));
392
+ let (_, second_id) = doc.get(ROOT, "second").unwrap().unwrap();
393
+ assert_eq!(doc.get(&second_id, "b").unwrap().unwrap().0, Value::int(2));
394
+ let (_, third_id) = doc.get(ROOT, "third").unwrap().unwrap();
395
+ assert_eq!(doc.get(&third_id, "c").unwrap().unwrap().0, Value::int(3));
396
+ }
397
+
398
+ #[test]
399
+ fn batch_insert_into_existing_map() {
400
+ let mut doc = AutoCommit::new();
401
+ let parent = doc.put_object(ROOT, "parent", ObjType::Map).unwrap();
402
+ doc.put(&parent, "existing", "value").unwrap();
403
+
404
+ let value = hydrate::Value::Map(hydrate_map! { "x" => 1_i64, "y" => 2_i64 });
405
+ doc.batch_create_object(&parent, "child", &value, false)
406
+ .unwrap();
407
+
408
+ assert_eq!(
409
+ doc.get(&parent, "existing").unwrap().unwrap().0,
410
+ Value::str("value")
411
+ );
412
+ let (_, child_id) = doc.get(&parent, "child").unwrap().unwrap();
413
+ assert_eq!(doc.get(&child_id, "x").unwrap().unwrap().0, Value::int(1));
414
+ }
415
+
416
+ #[test]
417
+ fn batch_insert_into_existing_list() {
418
+ let mut doc = AutoCommit::new();
419
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
420
+ doc.insert(&list_id, 0, "existing").unwrap();
421
+
422
+ let value = hydrate::Value::Map(hydrate_map! { "appended" => ScalarValue::Boolean(true) });
423
+ doc.batch_create_object(&list_id, 1_usize, &value, true)
424
+ .unwrap();
425
+
426
+ assert_eq!(doc.length(&list_id), 2);
427
+ assert_eq!(
428
+ doc.get(&list_id, 0).unwrap().unwrap().0,
429
+ Value::str("existing")
430
+ );
431
+ let (_, appended_id) = doc.get(&list_id, 1).unwrap().unwrap();
432
+ assert_eq!(
433
+ doc.get(&appended_id, "appended").unwrap().unwrap().0,
434
+ vbool(true)
435
+ );
436
+ }
437
+
438
+ #[test]
439
+ fn batch_insert_matches_hydrate_output() {
440
+ let mut doc = AutoCommit::new();
441
+ let input = hydrate::Value::Map(hydrate_map! {
442
+ "name" => "test",
443
+ "count" => 42_i64,
444
+ "tags" => hydrate_list!["alpha", "beta"],
445
+ });
446
+ let obj_id = doc
447
+ .batch_create_object(ROOT, "data", &input, false)
448
+ .unwrap();
449
+
450
+ let hydrated = doc.hydrate(&obj_id, None).unwrap();
451
+
452
+ match &hydrated {
453
+ hydrate::Value::Map(map) => {
454
+ assert_eq!(map.get("name"), Some(&hydrate::Value::from("test")));
455
+ assert_eq!(map.get("count"), Some(&hydrate::Value::from(42_i64)));
456
+ match map.get("tags") {
457
+ Some(hydrate::Value::List(list)) => assert_eq!(list.len(), 2),
458
+ other => panic!("expected list for tags, got {:?}", other),
459
+ }
460
+ }
461
+ other => panic!("expected map, got {:?}", other),
462
+ }
463
+ }
464
+
465
+ #[test]
466
+ fn batch_insert_with_transaction() {
467
+ let mut doc = automerge::Automerge::new();
468
+ let mut tx = doc.transaction();
469
+
470
+ let value = hydrate::Value::Map(hydrate_map! { "key" => "from_tx" });
471
+ let obj_id = tx.batch_create_object(ROOT, "data", &value, false).unwrap();
472
+ assert_eq!(
473
+ tx.get(&obj_id, "key").unwrap().unwrap().0,
474
+ Value::str("from_tx")
475
+ );
476
+
477
+ tx.commit();
478
+
479
+ assert_eq!(
480
+ doc.get(ROOT, "data").unwrap().unwrap().0,
481
+ Value::Object(ObjType::Map)
482
+ );
483
+ }
484
+
485
+ #[test]
486
+ fn batch_insert_transaction_rollback() {
487
+ let mut doc = automerge::Automerge::new();
488
+ {
489
+ let mut tx = doc.transaction();
490
+ let value = hydrate::Value::Map(hydrate_map! { "key" => "should_be_gone" });
491
+ tx.batch_create_object(ROOT, "data", &value, false).unwrap();
492
+ tx.rollback();
493
+ }
494
+
495
+ assert!(doc.get(ROOT, "data").unwrap().is_none());
496
+ }
497
+
498
+ #[test]
499
+ fn batch_insert_empty_map() {
500
+ let mut doc = AutoCommit::new();
501
+ let value = hydrate::Value::Map(hydrate_map! {});
502
+ let obj_id = doc
503
+ .batch_create_object(ROOT, "empty", &value, false)
504
+ .unwrap();
505
+
506
+ assert_eq!(
507
+ doc.get(ROOT, "empty").unwrap().unwrap().0,
508
+ Value::Object(ObjType::Map)
509
+ );
510
+ assert_eq!(doc.keys(&obj_id).count(), 0);
511
+ }
512
+
513
+ #[test]
514
+ fn batch_insert_empty_list() {
515
+ let mut doc = AutoCommit::new();
516
+ let value = hydrate::Value::List(hydrate_list![]);
517
+ let obj_id = doc
518
+ .batch_create_object(ROOT, "empty", &value, false)
519
+ .unwrap();
520
+
521
+ assert_eq!(
522
+ doc.get(ROOT, "empty").unwrap().unwrap().0,
523
+ Value::Object(ObjType::List)
524
+ );
525
+ assert_eq!(doc.length(&obj_id), 0);
526
+ }
527
+
528
+ #[test]
529
+ fn batch_insert_empty_text() {
530
+ let mut doc = AutoCommit::new();
531
+ let value = hydrate::Value::Text(hydrate::Text::new(TextEncoding::UnicodeCodePoint, ""));
532
+ let obj_id = doc
533
+ .batch_create_object(ROOT, "empty", &value, false)
534
+ .unwrap();
535
+
536
+ assert_eq!(
537
+ doc.get(ROOT, "empty").unwrap().unwrap().0,
538
+ Value::Object(ObjType::Text)
539
+ );
540
+ assert_eq!(doc.text(&obj_id).unwrap(), "");
541
+ }
542
+
543
+ #[test]
544
+ fn batch_insert_various_scalar_types() {
545
+ let mut doc = AutoCommit::new();
546
+ let value = hydrate::Value::Map(hydrate_map! {
547
+ "str_val" => "hello",
548
+ "int_val" => 42_i64,
549
+ "uint_val" => 100_u64,
550
+ "float_val" => 5.14_f64,
551
+ "bool_true" => ScalarValue::Boolean(true),
552
+ "bool_false" => ScalarValue::Boolean(false),
553
+ "null_val" => ScalarValue::Null,
554
+ });
555
+ let obj_id = doc
556
+ .batch_create_object(ROOT, "scalars", &value, false)
557
+ .unwrap();
558
+
559
+ assert_eq!(
560
+ doc.get(&obj_id, "str_val").unwrap().unwrap().0,
561
+ Value::str("hello")
562
+ );
563
+ assert_eq!(
564
+ doc.get(&obj_id, "int_val").unwrap().unwrap().0,
565
+ Value::int(42)
566
+ );
567
+ assert_eq!(
568
+ doc.get(&obj_id, "uint_val").unwrap().unwrap().0,
569
+ Value::uint(100)
570
+ );
571
+ assert_eq!(
572
+ doc.get(&obj_id, "float_val").unwrap().unwrap().0,
573
+ Value::f64(5.14)
574
+ );
575
+ assert_eq!(
576
+ doc.get(&obj_id, "bool_true").unwrap().unwrap().0,
577
+ vbool(true)
578
+ );
579
+ assert_eq!(
580
+ doc.get(&obj_id, "bool_false").unwrap().unwrap().0,
581
+ vbool(false)
582
+ );
583
+ assert_eq!(doc.get(&obj_id, "null_val").unwrap().unwrap().0, vnull());
584
+ }
585
+
586
+ #[test]
587
+ fn batch_insert_equivalent_to_individual_ops() {
588
+ let mut doc_batch = AutoCommit::new();
589
+ let value = hydrate::Value::Map(hydrate_map! {
590
+ "name" => "test",
591
+ "count" => 5_i64,
592
+ "items" => hydrate_list!["a", "b", "c"],
593
+ });
594
+ doc_batch
595
+ .batch_create_object(ROOT, "data", &value, false)
596
+ .unwrap();
597
+
598
+ let mut doc_individual = AutoCommit::new();
599
+ let data = doc_individual
600
+ .put_object(ROOT, "data", ObjType::Map)
601
+ .unwrap();
602
+ doc_individual.put(&data, "name", "test").unwrap();
603
+ doc_individual.put(&data, "count", 5_i64).unwrap();
604
+ let items = doc_individual
605
+ .put_object(&data, "items", ObjType::List)
606
+ .unwrap();
607
+ doc_individual.insert(&items, 0, "a").unwrap();
608
+ doc_individual.insert(&items, 1, "b").unwrap();
609
+ doc_individual.insert(&items, 2, "c").unwrap();
610
+
611
+ let hydrated_batch = doc_batch.hydrate(ROOT, None).unwrap();
612
+ let hydrated_individual = doc_individual.hydrate(ROOT, None).unwrap();
613
+ assert_eq!(hydrated_batch, hydrated_individual);
614
+ }
615
+
616
+ #[test]
617
+ fn batch_insert_generates_patches() {
618
+ let mut doc = AutoCommit::new();
619
+ doc.update_diff_cursor();
620
+
621
+ let value = hydrate::Value::Map(hydrate_map! {
622
+ "name" => "test",
623
+ "items" => hydrate_list![1_i64, 2_i64],
624
+ });
625
+ doc.batch_create_object(ROOT, "data", &value, false)
626
+ .unwrap();
627
+
628
+ let patches = doc.diff_incremental();
629
+ assert!(!patches.is_empty(), "expected patches from batch insert");
630
+
631
+ let has_data_patch = patches
632
+ .iter()
633
+ .any(|p| matches!(&p.action, PatchAction::PutMap { key, .. } if key == "data"));
634
+ assert!(has_data_patch, "should have a PutMap patch for 'data'");
635
+ }
636
+
637
+ #[test]
638
+ fn batch_insert_text_generates_splice_patch() {
639
+ let mut doc = AutoCommit::new();
640
+ doc.update_diff_cursor();
641
+
642
+ let value = hydrate::Value::Map(hydrate_map! {
643
+ "greeting" => hydrate_text!{"hi"},
644
+ });
645
+ doc.batch_create_object(ROOT, "data", &value, false)
646
+ .unwrap();
647
+
648
+ let patches = doc.diff_incremental();
649
+ let has_splice = patches
650
+ .iter()
651
+ .any(|p| matches!(&p.action, PatchAction::SpliceText { .. }));
652
+ assert!(
653
+ has_splice,
654
+ "should have a SpliceText patch, got: {:?}",
655
+ patches.iter().map(|p| &p.action).collect::<Vec<_>>()
656
+ );
657
+ }
658
+
659
+ #[test]
660
+ fn batch_insert_list_of_lists() {
661
+ let mut doc = AutoCommit::new();
662
+ let value = hydrate::Value::List(hydrate_list![
663
+ hydrate_list![1_i64, 2_i64],
664
+ hydrate_list![3_i64, 4_i64],
665
+ ]);
666
+ let outer = doc
667
+ .batch_create_object(ROOT, "matrix", &value, false)
668
+ .unwrap();
669
+
670
+ assert_eq!(doc.length(&outer), 2);
671
+ let (_, inner0) = doc.get(&outer, 0).unwrap().unwrap();
672
+ assert_eq!(doc.length(&inner0), 2);
673
+ assert_eq!(doc.get(&inner0, 0).unwrap().unwrap().0, Value::int(1));
674
+ assert_eq!(doc.get(&inner0, 1).unwrap().unwrap().0, Value::int(2));
675
+ let (_, inner1) = doc.get(&outer, 1).unwrap().unwrap();
676
+ assert_eq!(doc.length(&inner1), 2);
677
+ assert_eq!(doc.get(&inner1, 0).unwrap().unwrap().0, Value::int(3));
678
+ assert_eq!(doc.get(&inner1, 1).unwrap().unwrap().0, Value::int(4));
679
+ }
680
+
681
+ #[test]
682
+ fn batch_put_overwrite_with_nested_structure() {
683
+ let mut doc = AutoCommit::new();
684
+ let list_id = doc.put_object(ROOT, "items", ObjType::List).unwrap();
685
+ doc.insert(&list_id, 0, "placeholder").unwrap();
686
+ doc.insert(&list_id, 1, "keep").unwrap();
687
+
688
+ // Overwrite index 0 with a complex nested structure
689
+ let value = hydrate::Value::Map(hydrate_map! {
690
+ "name" => "complex",
691
+ "children" => hydrate_list![
692
+ hydrate_map! { "id" => 1_i64 },
693
+ hydrate_map! { "id" => 2_i64 },
694
+ ],
695
+ });
696
+ doc.batch_create_object(&list_id, 0_usize, &value, false)
697
+ .unwrap();
698
+
699
+ assert_eq!(doc.length(&list_id), 2);
700
+ let (_, obj_id) = doc.get(&list_id, 0).unwrap().unwrap();
701
+ assert_eq!(
702
+ doc.get(&obj_id, "name").unwrap().unwrap().0,
703
+ Value::str("complex")
704
+ );
705
+ let (_, children_id) = doc.get(&obj_id, "children").unwrap().unwrap();
706
+ assert_eq!(doc.length(&children_id), 2);
707
+ let (_, child0) = doc.get(&children_id, 0).unwrap().unwrap();
708
+ assert_eq!(doc.get(&child0, "id").unwrap().unwrap().0, Value::int(1));
709
+ assert_eq!(doc.get(&list_id, 1).unwrap().unwrap().0, Value::str("keep"));
710
+ }
711
+
712
+ #[test]
713
+ fn batch_init_map_flat() {
714
+ let map = hydrate_map! {
715
+ "name" => "test",
716
+ "count" => 42_i64,
717
+ };
718
+ let mut doc = AutoCommit::new();
719
+ doc.init_root_from_hydrate(&map).unwrap();
720
+
721
+ assert_eq!(
722
+ doc.get(ROOT, "name").unwrap().unwrap().0,
723
+ Value::str("test")
724
+ );
725
+ assert_eq!(doc.get(ROOT, "count").unwrap().unwrap().0, Value::int(42));
726
+ }
727
+
728
+ #[test]
729
+ fn batch_init_map_nested() {
730
+ let map = hydrate_map! {
731
+ "users" => hydrate_list![
732
+ hydrate_map! { "name" => "alice" },
733
+ hydrate_map! { "name" => "bob" },
734
+ ],
735
+ "meta" => hydrate_map! {
736
+ "version" => 1_i64,
737
+ },
738
+ };
739
+ let mut doc = AutoCommit::new();
740
+ doc.init_root_from_hydrate(&map).unwrap();
741
+
742
+ let (_, users_id) = doc.get(ROOT, "users").unwrap().unwrap();
743
+ assert_eq!(doc.length(&users_id), 2);
744
+
745
+ let (_, alice_id) = doc.get(&users_id, 0).unwrap().unwrap();
746
+ assert_eq!(
747
+ doc.get(&alice_id, "name").unwrap().unwrap().0,
748
+ Value::str("alice")
749
+ );
750
+
751
+ let (_, meta_id) = doc.get(ROOT, "meta").unwrap().unwrap();
752
+ assert_eq!(
753
+ doc.get(&meta_id, "version").unwrap().unwrap().0,
754
+ Value::int(1)
755
+ );
756
+ }
757
+
758
+ #[test]
759
+ fn batch_init_map_with_text() {
760
+ let map = hydrate_map! {
761
+ "greeting" => hydrate_text!{"hello world"},
762
+ };
763
+ let mut doc = AutoCommit::new();
764
+ doc.init_root_from_hydrate(&map).unwrap();
765
+
766
+ let (val, text_id) = doc.get(ROOT, "greeting").unwrap().unwrap();
767
+ assert_eq!(val, Value::Object(ObjType::Text));
768
+ assert_eq!(doc.text(&text_id).unwrap(), "hello world");
769
+ }
770
+
771
+ #[test]
772
+ fn batch_init_map_survives_save_load() {
773
+ let map = hydrate_map! {
774
+ "name" => "test",
775
+ "items" => hydrate_list![1_i64, 2_i64, 3_i64],
776
+ };
777
+ let mut doc = AutoCommit::new();
778
+ doc.init_root_from_hydrate(&map).unwrap();
779
+
780
+ let saved = doc.save();
781
+ let doc2 = AutoCommit::load(&saved).unwrap();
782
+
783
+ assert_eq!(
784
+ doc2.get(ROOT, "name").unwrap().unwrap().0,
785
+ Value::str("test")
786
+ );
787
+ let (_, items_id) = doc2.get(ROOT, "items").unwrap().unwrap();
788
+ assert_eq!(doc2.length(&items_id), 3);
789
+ }
790
+
791
+ #[test]
792
+ fn batch_init_map_equivalent_to_individual_ops() {
793
+ let map = hydrate_map! {
794
+ "name" => "test",
795
+ "count" => 5_i64,
796
+ "items" => hydrate_list!["a", "b", "c"],
797
+ };
798
+ let mut doc_batch = AutoCommit::new();
799
+ doc_batch.init_root_from_hydrate(&map).unwrap();
800
+
801
+ let mut doc_individual = AutoCommit::new();
802
+ doc_individual.put(ROOT, "name", "test").unwrap();
803
+ doc_individual.put(ROOT, "count", 5_i64).unwrap();
804
+ let items = doc_individual
805
+ .put_object(ROOT, "items", ObjType::List)
806
+ .unwrap();
807
+ doc_individual.insert(&items, 0, "a").unwrap();
808
+ doc_individual.insert(&items, 1, "b").unwrap();
809
+ doc_individual.insert(&items, 2, "c").unwrap();
810
+
811
+ let hydrated_batch = doc_batch.hydrate(ROOT, None).unwrap();
812
+ let hydrated_individual = doc_individual.hydrate(ROOT, None).unwrap();
813
+ assert_eq!(hydrated_batch, hydrated_individual);
814
+ }
815
+
816
+ #[test]
817
+ fn batch_init_map_generates_patches() {
818
+ let map = hydrate_map! {
819
+ "name" => "test",
820
+ "items" => hydrate_list![1_i64, 2_i64],
821
+ };
822
+ let mut doc = AutoCommit::new();
823
+ doc.init_root_from_hydrate(&map).unwrap();
824
+
825
+ let heads = doc.get_heads();
826
+ let patches = doc.diff(&[], &heads);
827
+ assert!(
828
+ !patches.is_empty(),
829
+ "expected patches from new_from_hydrate"
830
+ );
831
+
832
+ let has_name_patch = patches
833
+ .iter()
834
+ .any(|p| matches!(&p.action, PatchAction::PutMap { key, .. } if key == "name"));
835
+ assert!(has_name_patch, "should have a PutMap patch for 'name'");
836
+ }
837
+
838
+ #[test]
839
+ fn splice_insert_scalars() {
840
+ let mut doc = AutoCommit::new();
841
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
842
+ doc.insert(&list_id, 0, "a").unwrap();
843
+ doc.insert(&list_id, 1, "d").unwrap();
844
+
845
+ let values = vec![
846
+ hydrate::Value::Scalar(ScalarValue::from("b")),
847
+ hydrate::Value::Scalar(ScalarValue::from("c")),
848
+ ];
849
+ doc.splice(&list_id, 1, 0, values).unwrap();
850
+
851
+ assert_eq!(doc.length(&list_id), 4);
852
+ assert_eq!(doc.get(&list_id, 0).unwrap().unwrap().0, Value::str("a"));
853
+ assert_eq!(doc.get(&list_id, 1).unwrap().unwrap().0, Value::str("b"));
854
+ assert_eq!(doc.get(&list_id, 2).unwrap().unwrap().0, Value::str("c"));
855
+ assert_eq!(doc.get(&list_id, 3).unwrap().unwrap().0, Value::str("d"));
856
+ }
857
+
858
+ #[test]
859
+ fn splice_insert_objects() {
860
+ let mut doc = AutoCommit::new();
861
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
862
+
863
+ let values = vec![
864
+ hydrate::Value::Map(hydrate_map! { "name" => "alice" }),
865
+ hydrate::Value::Map(hydrate_map! { "name" => "bob" }),
866
+ ];
867
+ doc.splice(&list_id, 0, 0, values).unwrap();
868
+
869
+ assert_eq!(doc.length(&list_id), 2);
870
+ let (_, alice_id) = doc.get(&list_id, 0).unwrap().unwrap();
871
+ assert_eq!(
872
+ doc.get(&alice_id, "name").unwrap().unwrap().0,
873
+ Value::str("alice")
874
+ );
875
+ let (_, bob_id) = doc.get(&list_id, 1).unwrap().unwrap();
876
+ assert_eq!(
877
+ doc.get(&bob_id, "name").unwrap().unwrap().0,
878
+ Value::str("bob")
879
+ );
880
+ }
881
+
882
+ #[test]
883
+ fn splice_insert_mixed() {
884
+ let mut doc = AutoCommit::new();
885
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
886
+
887
+ let values = vec![
888
+ hydrate::Value::Scalar(ScalarValue::from("hello")),
889
+ hydrate::Value::Map(hydrate_map! { "nested" => ScalarValue::Boolean(true) }),
890
+ hydrate::Value::List(hydrate_list![1_i64, 2_i64]),
891
+ ];
892
+ doc.splice(&list_id, 0, 0, values).unwrap();
893
+
894
+ assert_eq!(doc.length(&list_id), 3);
895
+ assert_eq!(
896
+ doc.get(&list_id, 0).unwrap().unwrap().0,
897
+ Value::str("hello")
898
+ );
899
+ let (_, map_id) = doc.get(&list_id, 1).unwrap().unwrap();
900
+ assert_eq!(doc.get(&map_id, "nested").unwrap().unwrap().0, vbool(true));
901
+ let (_, inner_list) = doc.get(&list_id, 2).unwrap().unwrap();
902
+ assert_eq!(doc.length(&inner_list), 2);
903
+ }
904
+
905
+ #[test]
906
+ fn splice_delete_and_insert() {
907
+ let mut doc = AutoCommit::new();
908
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
909
+ doc.insert(&list_id, 0, "a").unwrap();
910
+ doc.insert(&list_id, 1, "b").unwrap();
911
+ doc.insert(&list_id, 2, "c").unwrap();
912
+
913
+ // Delete "b", insert "x" and "y" in its place
914
+ let values = vec![
915
+ hydrate::Value::Scalar(ScalarValue::from("x")),
916
+ hydrate::Value::Scalar(ScalarValue::from("y")),
917
+ ];
918
+ doc.splice(&list_id, 1, 1, values).unwrap();
919
+
920
+ assert_eq!(doc.length(&list_id), 4);
921
+ assert_eq!(doc.get(&list_id, 0).unwrap().unwrap().0, Value::str("a"));
922
+ assert_eq!(doc.get(&list_id, 1).unwrap().unwrap().0, Value::str("x"));
923
+ assert_eq!(doc.get(&list_id, 2).unwrap().unwrap().0, Value::str("y"));
924
+ assert_eq!(doc.get(&list_id, 3).unwrap().unwrap().0, Value::str("c"));
925
+ }
926
+
927
+ #[test]
928
+ fn splice_delete_only() {
929
+ let mut doc = AutoCommit::new();
930
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
931
+ doc.insert(&list_id, 0, "a").unwrap();
932
+ doc.insert(&list_id, 1, "b").unwrap();
933
+ doc.insert(&list_id, 2, "c").unwrap();
934
+
935
+ doc.splice(&list_id, 1, 1, Vec::<hydrate::Value>::new())
936
+ .unwrap();
937
+
938
+ assert_eq!(doc.length(&list_id), 2);
939
+ assert_eq!(doc.get(&list_id, 0).unwrap().unwrap().0, Value::str("a"));
940
+ assert_eq!(doc.get(&list_id, 1).unwrap().unwrap().0, Value::str("c"));
941
+ }
942
+
943
+ #[test]
944
+ fn splice_with_text() {
945
+ let mut doc = AutoCommit::new();
946
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
947
+
948
+ let values = vec![
949
+ hydrate::Value::Text(hydrate::Text::new(TextEncoding::UnicodeCodePoint, "hello")),
950
+ hydrate::Value::Text(hydrate::Text::new(TextEncoding::UnicodeCodePoint, "world")),
951
+ ];
952
+ doc.splice(&list_id, 0, 0, values).unwrap();
953
+
954
+ assert_eq!(doc.length(&list_id), 2);
955
+ let (_, text0) = doc.get(&list_id, 0).unwrap().unwrap();
956
+ assert_eq!(doc.text(&text0).unwrap(), "hello");
957
+ let (_, text1) = doc.get(&list_id, 1).unwrap().unwrap();
958
+ assert_eq!(doc.text(&text1).unwrap(), "world");
959
+ }
960
+
961
+ #[test]
962
+ fn splice_deeply_nested() {
963
+ let mut doc = AutoCommit::new();
964
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
965
+
966
+ let values = vec![hydrate::Value::Map(hydrate_map! {
967
+ "users" => hydrate_list![
968
+ hydrate_map! {
969
+ "name" => "alice",
970
+ "scores" => hydrate_list![10_i64, 20_i64],
971
+ },
972
+ ],
973
+ })];
974
+ doc.splice(&list_id, 0, 0, values).unwrap();
975
+
976
+ let (_, map_id) = doc.get(&list_id, 0).unwrap().unwrap();
977
+ let (_, users_id) = doc.get(&map_id, "users").unwrap().unwrap();
978
+ let (_, alice_id) = doc.get(&users_id, 0).unwrap().unwrap();
979
+ assert_eq!(
980
+ doc.get(&alice_id, "name").unwrap().unwrap().0,
981
+ Value::str("alice")
982
+ );
983
+ let (_, scores_id) = doc.get(&alice_id, "scores").unwrap().unwrap();
984
+ assert_eq!(doc.length(&scores_id), 2);
985
+ assert_eq!(doc.get(&scores_id, 0).unwrap().unwrap().0, Value::int(10));
986
+ }
987
+
988
+ #[test]
989
+ fn splice_survives_save_load() {
990
+ let mut doc = AutoCommit::new();
991
+ let list_id = doc.put_object(ROOT, "list", ObjType::List).unwrap();
992
+
993
+ let values = vec![
994
+ hydrate::Value::Map(hydrate_map! { "key" => "val" }),
995
+ hydrate::Value::Scalar(ScalarValue::from(42_i64)),
996
+ ];
997
+ doc.splice(&list_id, 0, 0, values).unwrap();
998
+
999
+ let saved = doc.save();
1000
+ let doc2 = AutoCommit::load(&saved).unwrap();
1001
+
1002
+ let (_, list_id2) = doc2.get(ROOT, "list").unwrap().unwrap();
1003
+ assert_eq!(doc2.length(&list_id2), 2);
1004
+ let (_, map_id) = doc2.get(&list_id2, 0).unwrap().unwrap();
1005
+ assert_eq!(
1006
+ doc2.get(&map_id, "key").unwrap().unwrap().0,
1007
+ Value::str("val")
1008
+ );
1009
+ assert_eq!(doc2.get(&list_id2, 1).unwrap().unwrap().0, Value::int(42));
1010
+ }
1011
+
1012
+ #[test]
1013
+ fn splice_merges_correctly() {
1014
+ let mut doc1 = AutoCommit::new();
1015
+ let list_id = doc1.put_object(ROOT, "list", ObjType::List).unwrap();
1016
+ doc1.insert(&list_id, 0, "shared").unwrap();
1017
+
1018
+ let mut doc2 = doc1.fork();
1019
+
1020
+ let values1 = vec![hydrate::Value::Map(hydrate_map! { "from" => "doc1" })];
1021
+ doc1.splice(&list_id, 1, 0, values1).unwrap();
1022
+
1023
+ let list_id2 = doc2.get(ROOT, "list").unwrap().unwrap().1;
1024
+ let values2 = vec![hydrate::Value::Map(hydrate_map! { "from" => "doc2" })];
1025
+ doc2.splice(&list_id2, 1, 0, values2).unwrap();
1026
+
1027
+ doc1.merge(&mut doc2).unwrap();
1028
+
1029
+ assert_eq!(doc1.length(&list_id), 3);
1030
+ assert_eq!(
1031
+ doc1.get(&list_id, 0).unwrap().unwrap().0,
1032
+ Value::str("shared")
1033
+ );
1034
+ }