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,1642 @@
1
+ #include <float.h>
2
+ #include <setjmp.h>
3
+ #include <stdarg.h>
4
+ #include <stddef.h>
5
+ #include <stdint.h>
6
+ #include <stdlib.h>
7
+ #include <string.h>
8
+
9
+ /* third-party */
10
+ #include <cmocka.h>
11
+
12
+ /* local */
13
+ #include <automerge-c/automerge.h>
14
+ #include <automerge-c/utils/result.h>
15
+ #include <automerge-c/utils/stack_callback_data.h>
16
+ #include "../base_state.h"
17
+ #include "../cmocka_utils.h"
18
+
19
+ /**
20
+ * \brief default import init() should return a promise
21
+ */
22
+ static void test_default_import_init_should_return_a_promise(void** state);
23
+
24
+ /**
25
+ * \brief should create, clone and free
26
+ */
27
+ static void test_create_clone_and_free(void** state) {
28
+ BaseState* base_state = *state;
29
+ AMstack** stack_ptr = &base_state->stack;
30
+ /* const doc1 = create() */
31
+ AMdoc* doc1;
32
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1));
33
+ /* const doc2 = doc1.clone() */
34
+ AMdoc* doc2;
35
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMclone(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2));
36
+ }
37
+
38
+ /**
39
+ * \brief should be able to start and commit
40
+ */
41
+ static void test_start_and_commit(void** state) {
42
+ BaseState* base_state = *state;
43
+ AMstack** stack_ptr = &base_state->stack;
44
+ /* const doc = create() */
45
+ AMdoc* doc;
46
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
47
+ /* doc.commit() */
48
+ AMstackItems(stack_ptr, AMemptyChange(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
49
+ }
50
+
51
+ /**
52
+ * \brief getting a nonexistent prop does not throw an error
53
+ */
54
+ static void test_getting_a_nonexistent_prop_does_not_throw_an_error(void** state) {
55
+ BaseState* base_state = *state;
56
+ AMstack** stack_ptr = &base_state->stack;
57
+ /* const doc = create() */
58
+ AMdoc* doc;
59
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
60
+ /* const root = "_root" */
61
+ /* const result = doc.getWithType(root, "hello") */
62
+ /* assert.deepEqual(result, undefined) */
63
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("hello"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
64
+ }
65
+
66
+ /**
67
+ * \brief should be able to set and get a simple value
68
+ */
69
+ static void test_should_be_able_to_set_and_get_a_simple_value(void** state) {
70
+ BaseState* base_state = *state;
71
+ AMstack** stack_ptr = &base_state->stack;
72
+ /* const doc: Automerge = create("aabbcc") */
73
+ AMactorId const* actor_id;
74
+ assert_true(AMitemToActorId(
75
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aabbcc")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)),
76
+ &actor_id));
77
+ AMdoc* doc;
78
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
79
+ /* const root = "_root" */
80
+ /* let result */
81
+ /* */
82
+ /* doc.put(root, "hello", "world") */
83
+ AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("hello"), AMstr("world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
84
+ /* doc.put(root, "number1", 5, "uint") */
85
+ AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("number1"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
86
+ /* doc.put(root, "number2", 5) */
87
+ AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("number2"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
88
+ /* doc.put(root, "number3", 5.5) */
89
+ AMstackItem(NULL, AMmapPutF64(doc, AM_ROOT, AMstr("number3"), 5.5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
90
+ /* doc.put(root, "number4", 5.5, "f64") */
91
+ AMstackItem(NULL, AMmapPutF64(doc, AM_ROOT, AMstr("number4"), 5.5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
92
+ /* doc.put(root, "number5", 5.5, "int") */
93
+ AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("number5"), 5.5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
94
+ /* doc.put(root, "bool", true) */
95
+ AMstackItem(NULL, AMmapPutBool(doc, AM_ROOT, AMstr("bool"), true), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
96
+ /* doc.put(root, "time1", 1000, "timestamp") */
97
+ AMstackItem(NULL, AMmapPutTimestamp(doc, AM_ROOT, AMstr("time1"), 1000), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
98
+ /* doc.put(root, "time2", new Date(1001)) */
99
+ AMstackItem(NULL, AMmapPutTimestamp(doc, AM_ROOT, AMstr("time2"), 1001), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
100
+ /* doc.putObject(root, "list", []); */
101
+ AMstackItem(NULL, AMmapPutObject(doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb,
102
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
103
+ /* doc.put(root, "null", null) */
104
+ AMstackItem(NULL, AMmapPutNull(doc, AM_ROOT, AMstr("null")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
105
+ /* */
106
+ /* result = doc.getWithType(root, "hello") */
107
+ /* assert.deepEqual(result, ["str", "world"]) */
108
+ /* assert.deepEqual(doc.get("/", "hello"), "world") */
109
+ AMbyteSpan str;
110
+ assert_true(AMitemToStr(
111
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("hello"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)),
112
+ &str));
113
+ assert_int_equal(str.count, strlen("world"));
114
+ assert_memory_equal(str.src, "world", str.count);
115
+ /* assert.deepEqual(doc.get("/", "hello"), "world") */
116
+ /* */
117
+ /* result = doc.getWithType(root, "number1") */
118
+ /* assert.deepEqual(result, ["uint", 5]) */
119
+ uint64_t uint;
120
+ assert_true(AMitemToUint(
121
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number1"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_UINT)),
122
+ &uint));
123
+ assert_int_equal(uint, 5);
124
+ /* assert.deepEqual(doc.get("/", "number1"), 5) */
125
+ /* */
126
+ /* result = doc.getWithType(root, "number2") */
127
+ /* assert.deepEqual(result, ["int", 5]) */
128
+ int64_t int_;
129
+ assert_true(AMitemToInt(
130
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number2"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_INT)),
131
+ &int_));
132
+ assert_int_equal(int_, 5);
133
+ /* */
134
+ /* result = doc.getWithType(root, "number3") */
135
+ /* assert.deepEqual(result, ["f64", 5.5]) */
136
+ double f64;
137
+ assert_true(AMitemToF64(
138
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number3"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_F64)),
139
+ &f64));
140
+ assert_float_equal(f64, 5.5, DBL_EPSILON);
141
+ /* */
142
+ /* result = doc.getWithType(root, "number4") */
143
+ /* assert.deepEqual(result, ["f64", 5.5]) */
144
+ assert_true(AMitemToF64(
145
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number4"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_F64)),
146
+ &f64));
147
+ assert_float_equal(f64, 5.5, DBL_EPSILON);
148
+ /* */
149
+ /* result = doc.getWithType(root, "number5") */
150
+ /* assert.deepEqual(result, ["int", 5]) */
151
+ assert_true(AMitemToInt(
152
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number5"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_INT)),
153
+ &int_));
154
+ assert_int_equal(int_, 5);
155
+ /* */
156
+ /* result = doc.getWithType(root, "bool") */
157
+ /* assert.deepEqual(result, ["boolean", true]) */
158
+ bool boolean;
159
+ assert_true(AMitemToBool(
160
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("bool"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BOOL)),
161
+ &boolean));
162
+ assert_true(boolean);
163
+ /* */
164
+ /* doc.put(root, "bool", false, "boolean") */
165
+ AMstackItem(NULL, AMmapPutBool(doc, AM_ROOT, AMstr("bool"), false), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
166
+ /* */
167
+ /* result = doc.getWithType(root, "bool") */
168
+ /* assert.deepEqual(result, ["boolean", false]) */
169
+ assert_true(AMitemToBool(
170
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("bool"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BOOL)),
171
+ &boolean));
172
+ assert_false(boolean);
173
+ /* */
174
+ /* result = doc.getWithType(root, "time1") */
175
+ /* assert.deepEqual(result, ["timestamp", new Date(1000)]) */
176
+ int64_t timestamp;
177
+ assert_true(AMitemToTimestamp(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("time1"), NULL), cmocka_cb,
178
+ AMexpect(AM_VAL_TYPE_TIMESTAMP)),
179
+ &timestamp));
180
+ assert_int_equal(timestamp, 1000);
181
+ /* */
182
+ /* result = doc.getWithType(root, "time2") */
183
+ /* assert.deepEqual(result, ["timestamp", new Date(1001)]) */
184
+ assert_true(AMitemToTimestamp(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("time2"), NULL), cmocka_cb,
185
+ AMexpect(AM_VAL_TYPE_TIMESTAMP)),
186
+ &timestamp));
187
+ assert_int_equal(timestamp, 1001);
188
+ /* */
189
+ /* result = doc.getWithType(root, "list") */
190
+ /* assert.deepEqual(result, ["list", "10@aabbcc"]); */
191
+ AMobjId const* const list = AMitemObjId(
192
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("list"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
193
+ assert_int_equal(AMobjIdCounter(list), 10);
194
+ str = AMactorIdStr(AMobjIdActorId(list));
195
+ assert_int_equal(str.count, strlen("aabbcc"));
196
+ assert_memory_equal(str.src, "aabbcc", str.count);
197
+ /* */
198
+ /* result = doc.getWithType(root, "null") */
199
+ /* assert.deepEqual(result, ["null", null]); */
200
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("null"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_NULL));
201
+ }
202
+
203
+ /**
204
+ * \brief should be able to use bytes
205
+ */
206
+ static void test_should_be_able_to_use_bytes(void** state) {
207
+ BaseState* base_state = *state;
208
+ AMstack** stack_ptr = &base_state->stack;
209
+ /* const doc = create() */
210
+ AMdoc* doc;
211
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
212
+ /* doc.put("_root", "data1", new Uint8Array([10, 11, 12])); */
213
+ static uint8_t const DATA1[] = {10, 11, 12};
214
+ AMstackItem(NULL, AMmapPutBytes(doc, AM_ROOT, AMstr("data1"), AMbytes(DATA1, sizeof(DATA1))), cmocka_cb,
215
+ AMexpect(AM_VAL_TYPE_VOID));
216
+ /* doc.put("_root", "data2", new Uint8Array([13, 14, 15]), "bytes"); */
217
+ static uint8_t const DATA2[] = {13, 14, 15};
218
+ AMstackItem(NULL, AMmapPutBytes(doc, AM_ROOT, AMstr("data2"), AMbytes(DATA2, sizeof(DATA2))), cmocka_cb,
219
+ AMexpect(AM_VAL_TYPE_VOID));
220
+ /* const value1 = doc.getWithType("_root", "data1") */
221
+ AMbyteSpan value1;
222
+ assert_true(AMitemToBytes(
223
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("data1"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)),
224
+ &value1));
225
+ /* assert.deepEqual(value1, ["bytes", new Uint8Array([10, 11, 12])]); */
226
+ assert_int_equal(value1.count, sizeof(DATA1));
227
+ assert_memory_equal(value1.src, DATA1, sizeof(DATA1));
228
+ /* const value2 = doc.getWithType("_root", "data2") */
229
+ AMbyteSpan value2;
230
+ assert_true(AMitemToBytes(
231
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("data2"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)),
232
+ &value2));
233
+ /* assert.deepEqual(value2, ["bytes", new Uint8Array([13, 14, 15])]); */
234
+ assert_int_equal(value2.count, sizeof(DATA2));
235
+ assert_memory_equal(value2.src, DATA2, sizeof(DATA2));
236
+ }
237
+
238
+ /**
239
+ * \brief should be able to make subobjects
240
+ */
241
+ static void test_should_be_able_to_make_subobjects(void** state) {
242
+ BaseState* base_state = *state;
243
+ AMstack** stack_ptr = &base_state->stack;
244
+ /* const doc = create() */
245
+ AMdoc* doc;
246
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
247
+ /* const root = "_root" */
248
+ /* let result */
249
+ /* */
250
+ /* const submap = doc.putObject(root, "submap", {}) */
251
+ AMobjId const* const submap =
252
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("submap"), AM_OBJ_TYPE_MAP), cmocka_cb,
253
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
254
+ /* doc.put(submap, "number", 6, "uint") */
255
+ AMstackItem(NULL, AMmapPutUint(doc, submap, AMstr("number"), 6), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
256
+ /* assert.strictEqual(doc.pendingOps(), 2) */
257
+ assert_int_equal(AMpendingOps(doc), 2);
258
+ /* */
259
+ /* result = doc.getWithType(root, "submap") */
260
+ /* assert.deepEqual(result, ["map", submap]) */
261
+ assert_true(AMobjIdEqual(AMitemObjId(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("submap"), NULL),
262
+ cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))),
263
+ submap));
264
+ /* */
265
+ /* result = doc.getWithType(submap, "number") */
266
+ /* assert.deepEqual(result, ["uint", 6]) */
267
+ uint64_t uint;
268
+ assert_true(AMitemToUint(
269
+ AMstackItem(stack_ptr, AMmapGet(doc, submap, AMstr("number"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_UINT)),
270
+ &uint));
271
+ assert_int_equal(uint, 6);
272
+ }
273
+
274
+ /**
275
+ * \brief should be able to make lists
276
+ */
277
+ static void test_should_be_able_to_make_lists(void** state) {
278
+ BaseState* base_state = *state;
279
+ AMstack** stack_ptr = &base_state->stack;
280
+ /* const doc = create() */
281
+ AMdoc* doc;
282
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
283
+ /* const root = "_root" */
284
+ /* */
285
+ /* const sublist = doc.putObject(root, "numbers", []) */
286
+ AMobjId const* const sublist =
287
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("numbers"), AM_OBJ_TYPE_LIST), cmocka_cb,
288
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
289
+ /* doc.insert(sublist, 0, "a"); */
290
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, true, AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
291
+ /* doc.insert(sublist, 1, "b"); */
292
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, 1, true, AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
293
+ /* doc.insert(sublist, 2, "c"); */
294
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, 2, true, AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
295
+ /* doc.insert(sublist, 0, "z"); */
296
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, true, AMstr("z")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
297
+ /* */
298
+ /* assert.deepEqual(doc.getWithType(sublist, 0), ["str", "z"]) */
299
+ AMbyteSpan str;
300
+ assert_true(AMitemToStr(
301
+ AMstackItem(stack_ptr, AMlistGet(doc, sublist, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
302
+ assert_int_equal(str.count, 1);
303
+ assert_memory_equal(str.src, "z", str.count);
304
+ /* assert.deepEqual(doc.getWithType(sublist, 1), ["str", "a"]) */
305
+ assert_true(AMitemToStr(
306
+ AMstackItem(stack_ptr, AMlistGet(doc, sublist, 1, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
307
+ assert_int_equal(str.count, 1);
308
+ assert_memory_equal(str.src, "a", str.count);
309
+ /* assert.deepEqual(doc.getWithType(sublist, 2), ["str", "b"]) */
310
+ assert_true(AMitemToStr(
311
+ AMstackItem(stack_ptr, AMlistGet(doc, sublist, 2, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
312
+ assert_int_equal(str.count, 1);
313
+ assert_memory_equal(str.src, "b", str.count);
314
+ /* assert.deepEqual(doc.getWithType(sublist, 3), ["str", "c"]) */
315
+ assert_true(AMitemToStr(
316
+ AMstackItem(stack_ptr, AMlistGet(doc, sublist, 3, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
317
+ assert_int_equal(str.count, 1);
318
+ assert_memory_equal(str.src, "c", str.count);
319
+ /* assert.deepEqual(doc.length(sublist), 4) */
320
+ assert_int_equal(AMobjSize(doc, sublist, NULL), 4);
321
+ /* */
322
+ /* doc.put(sublist, 2, "b v2"); */
323
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, 2, false, AMstr("b v2")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
324
+ /* */
325
+ /* assert.deepEqual(doc.getWithType(sublist, 2), ["str", "b v2"]) */
326
+ assert_true(AMitemToStr(
327
+ AMstackItem(stack_ptr, AMlistGet(doc, sublist, 2, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
328
+ assert_int_equal(str.count, 4);
329
+ assert_memory_equal(str.src, "b v2", str.count);
330
+ /* assert.deepEqual(doc.length(sublist), 4) */
331
+ assert_int_equal(AMobjSize(doc, sublist, NULL), 4);
332
+ }
333
+
334
+ /**
335
+ * \brief lists have insert, set, splice, and push ops
336
+ */
337
+ static void test_lists_have_insert_set_splice_and_push_ops(void** state) {
338
+ BaseState* base_state = *state;
339
+ AMstack** stack_ptr = &base_state->stack;
340
+ /* const doc = create() */
341
+ AMdoc* doc;
342
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
343
+ /* const root = "_root" */
344
+ /* */
345
+ /* const sublist = doc.putObject(root, "letters", []) */
346
+ AMobjId const* const sublist =
347
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("letters"), AM_OBJ_TYPE_LIST), cmocka_cb,
348
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
349
+ /* doc.insert(sublist, 0, "a"); */
350
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, true, AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
351
+ /* doc.insert(sublist, 0, "b"); */
352
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, true, AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
353
+ /* assert.deepEqual(doc.materialize(), { letters: ["b", "a"] }) */
354
+ AMitem* doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
355
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
356
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
357
+ AMbyteSpan key;
358
+ assert_true(AMitemKey(doc_item, &key));
359
+ assert_int_equal(key.count, strlen("letters"));
360
+ assert_memory_equal(key.src, "letters", key.count);
361
+ {
362
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL),
363
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
364
+ assert_int_equal(AMitemsSize(&list_items), 2);
365
+ AMbyteSpan str;
366
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
367
+ assert_int_equal(str.count, 1);
368
+ assert_memory_equal(str.src, "b", str.count);
369
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
370
+ assert_int_equal(str.count, 1);
371
+ assert_memory_equal(str.src, "a", str.count);
372
+ assert_null(AMitemsNext(&list_items, 1));
373
+ }
374
+ /* doc.push(sublist, "c"); */
375
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, SIZE_MAX, true, AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
376
+ /* const heads = doc.getHeads() */
377
+ AMitems const heads = AMstackItems(stack_ptr, AMgetHeads(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
378
+ /* assert.deepEqual(doc.materialize(), { letters: ["b", "a", "c"] }) */
379
+ doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
380
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
381
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
382
+ assert_true(AMitemKey(doc_item, &key));
383
+ assert_int_equal(key.count, strlen("letters"));
384
+ assert_memory_equal(key.src, "letters", key.count);
385
+ {
386
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL),
387
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
388
+ assert_int_equal(AMitemsSize(&list_items), 3);
389
+ AMbyteSpan str;
390
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
391
+ assert_int_equal(str.count, 1);
392
+ assert_memory_equal(str.src, "b", str.count);
393
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
394
+ assert_int_equal(str.count, 1);
395
+ assert_memory_equal(str.src, "a", str.count);
396
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
397
+ assert_int_equal(str.count, 1);
398
+ assert_memory_equal(str.src, "c", str.count);
399
+ assert_null(AMitemsNext(&list_items, 1));
400
+ }
401
+ /* doc.push(sublist, 3, "timestamp"); */
402
+ AMstackItem(NULL, AMlistPutTimestamp(doc, sublist, SIZE_MAX, true, 3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
403
+ /* assert.deepEqual(doc.materialize(), { letters: ["b", "a", "c", new
404
+ * Date(3)] } */
405
+ doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
406
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
407
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
408
+ assert_true(AMitemKey(doc_item, &key));
409
+ assert_int_equal(key.count, strlen("letters"));
410
+ assert_memory_equal(key.src, "letters", key.count);
411
+ {
412
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL),
413
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR | AM_VAL_TYPE_TIMESTAMP));
414
+ assert_int_equal(AMitemsSize(&list_items), 4);
415
+ AMbyteSpan str;
416
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
417
+ assert_int_equal(str.count, 1);
418
+ assert_memory_equal(str.src, "b", str.count);
419
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
420
+ assert_int_equal(str.count, 1);
421
+ assert_memory_equal(str.src, "a", str.count);
422
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
423
+ assert_int_equal(str.count, 1);
424
+ assert_memory_equal(str.src, "c", str.count);
425
+ int64_t timestamp;
426
+ assert_true(AMitemToTimestamp(AMitemsNext(&list_items, 1), &timestamp));
427
+ assert_int_equal(timestamp, 3);
428
+ assert_null(AMitemsNext(&list_items, 1));
429
+ }
430
+ /* doc.splice(sublist, 1, 1, ["d", "e", "f"]); */
431
+ AMresult* data = AMstackResult(
432
+ stack_ptr, AMresultFrom(3, AMitemFromStr(AMstr("d")), AMitemFromStr(AMstr("e")), AMitemFromStr(AMstr("f"))),
433
+ NULL, NULL);
434
+ AMstackItem(NULL, AMsplice(doc, sublist, 1, 1, AMresultItems(data)), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
435
+ /* assert.deepEqual(doc.materialize(), { letters: ["b", "d", "e", "f", "c",
436
+ * new Date(3)] } */
437
+ doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
438
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
439
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
440
+ assert_true(AMitemKey(doc_item, &key));
441
+ assert_int_equal(key.count, strlen("letters"));
442
+ assert_memory_equal(key.src, "letters", key.count);
443
+ {
444
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL),
445
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR | AM_VAL_TYPE_TIMESTAMP));
446
+ AMbyteSpan str;
447
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
448
+ assert_int_equal(str.count, 1);
449
+ assert_memory_equal(str.src, "b", str.count);
450
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
451
+ assert_int_equal(str.count, 1);
452
+ assert_memory_equal(str.src, "d", str.count);
453
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
454
+ assert_int_equal(str.count, 1);
455
+ assert_memory_equal(str.src, "e", str.count);
456
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
457
+ assert_int_equal(str.count, 1);
458
+ assert_memory_equal(str.src, "f", str.count);
459
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
460
+ assert_int_equal(str.count, 1);
461
+ assert_memory_equal(str.src, "c", str.count);
462
+ int64_t timestamp;
463
+ assert_true(AMitemToTimestamp(AMitemsNext(&list_items, 1), &timestamp));
464
+ assert_int_equal(timestamp, 3);
465
+ assert_null(AMitemsNext(&list_items, 1));
466
+ }
467
+ /* doc.put(sublist, 0, "z"); */
468
+ AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, false, AMstr("z")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
469
+ /* assert.deepEqual(doc.materialize(), { letters: ["z", "d", "e", "f", "c",
470
+ * new Date(3)] } */
471
+ doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
472
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
473
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
474
+ assert_true(AMitemKey(doc_item, &key));
475
+ assert_int_equal(key.count, strlen("letters"));
476
+ assert_memory_equal(key.src, "letters", key.count);
477
+ {
478
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL),
479
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR | AM_VAL_TYPE_TIMESTAMP));
480
+ AMbyteSpan str;
481
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
482
+ assert_int_equal(str.count, 1);
483
+ assert_memory_equal(str.src, "z", str.count);
484
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
485
+ assert_int_equal(str.count, 1);
486
+ assert_memory_equal(str.src, "d", str.count);
487
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
488
+ assert_int_equal(str.count, 1);
489
+ assert_memory_equal(str.src, "e", str.count);
490
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
491
+ assert_int_equal(str.count, 1);
492
+ assert_memory_equal(str.src, "f", str.count);
493
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
494
+ assert_int_equal(str.count, 1);
495
+ assert_memory_equal(str.src, "c", str.count);
496
+ int64_t timestamp;
497
+ assert_true(AMitemToTimestamp(AMitemsNext(&list_items, 1), &timestamp));
498
+ assert_int_equal(timestamp, 3);
499
+ assert_null(AMitemsNext(&list_items, 1));
500
+ }
501
+ /* assert.deepEqual(doc.materialize(sublist), ["z", "d", "e", "f", "c", new
502
+ * Date(3)] */
503
+ AMitems sublist_items = AMstackItems(stack_ptr, AMlistRange(doc, sublist, 0, SIZE_MAX, NULL), cmocka_cb,
504
+ AMexpect(AM_VAL_TYPE_STR | AM_VAL_TYPE_TIMESTAMP));
505
+ AMbyteSpan str;
506
+ assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str));
507
+ assert_int_equal(str.count, 1);
508
+ assert_memory_equal(str.src, "z", str.count);
509
+ assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str));
510
+ assert_int_equal(str.count, 1);
511
+ assert_memory_equal(str.src, "d", str.count);
512
+ assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str));
513
+ assert_int_equal(str.count, 1);
514
+ assert_memory_equal(str.src, "e", str.count);
515
+ assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str));
516
+ assert_int_equal(str.count, 1);
517
+ assert_memory_equal(str.src, "f", str.count);
518
+ assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str));
519
+ assert_int_equal(str.count, 1);
520
+ assert_memory_equal(str.src, "c", str.count);
521
+ int64_t timestamp;
522
+ assert_true(AMitemToTimestamp(AMitemsNext(&sublist_items, 1), &timestamp));
523
+ assert_int_equal(timestamp, 3);
524
+ assert_null(AMitemsNext(&sublist_items, 1));
525
+ /* assert.deepEqual(doc.length(sublist), 6) */
526
+ assert_int_equal(AMobjSize(doc, sublist, NULL), 6);
527
+ /* assert.deepEqual(doc.materialize("/", heads), { letters: ["b", "a", "c"]
528
+ * } */
529
+ doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), &heads), cmocka_cb,
530
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
531
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
532
+ assert_true(AMitemKey(doc_item, &key));
533
+ assert_int_equal(key.count, strlen("letters"));
534
+ assert_memory_equal(key.src, "letters", key.count);
535
+ {
536
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, &heads),
537
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
538
+ AMbyteSpan str;
539
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
540
+ assert_int_equal(str.count, 1);
541
+ assert_memory_equal(str.src, "b", str.count);
542
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
543
+ assert_int_equal(str.count, 1);
544
+ assert_memory_equal(str.src, "a", str.count);
545
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
546
+ assert_int_equal(str.count, 1);
547
+ assert_memory_equal(str.src, "c", str.count);
548
+ assert_null(AMitemsNext(&list_items, 1));
549
+ }
550
+ }
551
+
552
+ /**
553
+ * \brief should be able to delete non-existent props
554
+ */
555
+ static void test_should_be_able_to_delete_non_existent_props(void** state) {
556
+ BaseState* base_state = *state;
557
+ AMstack** stack_ptr = &base_state->stack;
558
+ /* const doc = create() */
559
+ AMdoc* doc;
560
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
561
+ /* */
562
+ /* doc.put("_root", "foo", "bar") */
563
+ AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("foo"), AMstr("bar")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
564
+ /* doc.put("_root", "bip", "bap") */
565
+ AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("bip"), AMstr("bap")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
566
+ /* const hash1 = doc.commit() */
567
+ AMitems const hash1 =
568
+ AMstackItems(stack_ptr, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
569
+ /* */
570
+ /* assert.deepEqual(doc.keys("_root"), ["bip", "foo"]) */
571
+ AMitems keys = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
572
+ AMbyteSpan str;
573
+ assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str));
574
+ assert_int_equal(str.count, 3);
575
+ assert_memory_equal(str.src, "bip", str.count);
576
+ assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str));
577
+ assert_int_equal(str.count, 3);
578
+ assert_memory_equal(str.src, "foo", str.count);
579
+ /* */
580
+ /* doc.delete("_root", "foo") */
581
+ AMstackItem(NULL, AMmapDelete(doc, AM_ROOT, AMstr("foo")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
582
+ /* doc.delete("_root", "baz") */
583
+ AMstackItem(NULL, AMmapDelete(doc, AM_ROOT, AMstr("baz")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
584
+ /* const hash2 = doc.commit() */
585
+ AMitems const hash2 =
586
+ AMstackItems(stack_ptr, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
587
+ /* */
588
+ /* assert.deepEqual(doc.keys("_root"), ["bip"]) */
589
+ keys = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
590
+ assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str));
591
+ assert_int_equal(str.count, 3);
592
+ assert_memory_equal(str.src, "bip", str.count);
593
+ /* assert.deepEqual(doc.keys("_root", [hash1]), ["bip", "foo"]) */
594
+ keys = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, &hash1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
595
+ assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str));
596
+ assert_int_equal(str.count, 3);
597
+ assert_memory_equal(str.src, "bip", str.count);
598
+ assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str));
599
+ assert_int_equal(str.count, 3);
600
+ assert_memory_equal(str.src, "foo", str.count);
601
+ /* assert.deepEqual(doc.keys("_root", [hash2]), ["bip"]) */
602
+ keys = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, &hash2), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
603
+ assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str));
604
+ assert_int_equal(str.count, 3);
605
+ assert_memory_equal(str.src, "bip", str.count);
606
+ }
607
+
608
+ /**
609
+ * \brief should be able to del
610
+ */
611
+ static void test_should_be_able_to_del(void** state) {
612
+ BaseState* base_state = *state;
613
+ AMstack** stack_ptr = &base_state->stack;
614
+ /* const doc = create() */
615
+ AMdoc* doc;
616
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
617
+ /* const root = "_root" */
618
+ /* */
619
+ /* doc.put(root, "xxx", "xxx"); */
620
+ AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("xxx"), AMstr("xxx")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
621
+ /* assert.deepEqual(doc.getWithType(root, "xxx"), ["str", "xxx"]) */
622
+ AMbyteSpan str;
623
+ assert_true(AMitemToStr(
624
+ AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("xxx"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)),
625
+ &str));
626
+ assert_int_equal(str.count, 3);
627
+ assert_memory_equal(str.src, "xxx", str.count);
628
+ /* doc.delete(root, "xxx"); */
629
+ AMstackItem(NULL, AMmapDelete(doc, AM_ROOT, AMstr("xxx")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
630
+ /* assert.deepEqual(doc.getWithType(root, "xxx"), undefined) */
631
+ AMstackItem(NULL, AMmapGet(doc, AM_ROOT, AMstr("xxx"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
632
+ }
633
+
634
+ /**
635
+ * \brief should be able to use counters
636
+ */
637
+ static void test_should_be_able_to_use_counters(void** state) {
638
+ BaseState* base_state = *state;
639
+ AMstack** stack_ptr = &base_state->stack;
640
+ /* const doc = create() */
641
+ AMdoc* doc;
642
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
643
+ /* const root = "_root" */
644
+ /* */
645
+ /* doc.put(root, "counter", 10, "counter"); */
646
+ AMstackItem(NULL, AMmapPutCounter(doc, AM_ROOT, AMstr("counter"), 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
647
+ /* assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 10]) */
648
+ int64_t counter;
649
+ assert_true(AMitemToCounter(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("counter"), NULL), cmocka_cb,
650
+ AMexpect(AM_VAL_TYPE_COUNTER)),
651
+ &counter));
652
+ assert_int_equal(counter, 10);
653
+ /* doc.increment(root, "counter", 10); */
654
+ AMstackItem(NULL, AMmapIncrement(doc, AM_ROOT, AMstr("counter"), 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
655
+ /* assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 20]) */
656
+ assert_true(AMitemToCounter(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("counter"), NULL), cmocka_cb,
657
+ AMexpect(AM_VAL_TYPE_COUNTER)),
658
+ &counter));
659
+ assert_int_equal(counter, 20);
660
+ /* doc.increment(root, "counter", -5); */
661
+ AMstackItem(NULL, AMmapIncrement(doc, AM_ROOT, AMstr("counter"), -5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
662
+ /* assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 15]) */
663
+ assert_true(AMitemToCounter(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("counter"), NULL), cmocka_cb,
664
+ AMexpect(AM_VAL_TYPE_COUNTER)),
665
+ &counter));
666
+ assert_int_equal(counter, 15);
667
+ }
668
+
669
+ /**
670
+ * \brief should be able to splice text
671
+ */
672
+ static void test_should_be_able_to_splice_text(void** state) {
673
+ BaseState* base_state = *state;
674
+ AMstack** stack_ptr = &base_state->stack;
675
+ /* const doc = create() */
676
+ AMdoc* doc;
677
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
678
+ /* const root = "_root"; */
679
+ /* */
680
+ /* const text = doc.putObject(root, "text", ""); */
681
+ AMobjId const* const text =
682
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("text"), AM_OBJ_TYPE_TEXT), cmocka_cb,
683
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
684
+ /* doc.splice(text, 0, 0, "hello ") */
685
+ AMstackItem(NULL, AMspliceText(doc, text, 0, 0, AMstr("hello ")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
686
+ /* doc.splice(text, 6, 0, "world") */
687
+ AMstackItem(NULL, AMspliceText(doc, text, 6, 0, AMstr("world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
688
+ /* doc.splice(text, 11, 0, "!?") */
689
+ AMstackItem(NULL, AMspliceText(doc, text, 11, 0, AMstr("!?")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
690
+ /* assert.deepEqual(doc.getWithType(text, 0), ["str", "h"]) */
691
+ AMbyteSpan str;
692
+ assert_true(
693
+ AMitemToStr(AMstackItem(stack_ptr, AMlistGet(doc, text, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
694
+ assert_int_equal(str.count, 1);
695
+ assert_memory_equal(str.src, "h", str.count);
696
+ /* assert.deepEqual(doc.getWithType(text, 1), ["str", "e"]) */
697
+ assert_true(
698
+ AMitemToStr(AMstackItem(stack_ptr, AMlistGet(doc, text, 1, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
699
+ assert_int_equal(str.count, 1);
700
+ assert_memory_equal(str.src, "e", str.count);
701
+ /* assert.deepEqual(doc.getWithType(text, 9), ["str", "l"]) */
702
+ assert_true(
703
+ AMitemToStr(AMstackItem(stack_ptr, AMlistGet(doc, text, 9, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
704
+ assert_int_equal(str.count, 1);
705
+ assert_memory_equal(str.src, "l", str.count);
706
+ /* assert.deepEqual(doc.getWithType(text, 10), ["str", "d"]) */
707
+ assert_true(AMitemToStr(
708
+ AMstackItem(stack_ptr, AMlistGet(doc, text, 10, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
709
+ assert_int_equal(str.count, 1);
710
+ assert_memory_equal(str.src, "d", str.count);
711
+ /* assert.deepEqual(doc.getWithType(text, 11), ["str", "!"]) */
712
+ assert_true(AMitemToStr(
713
+ AMstackItem(stack_ptr, AMlistGet(doc, text, 11, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
714
+ assert_int_equal(str.count, 1);
715
+ assert_memory_equal(str.src, "!", str.count);
716
+ /* assert.deepEqual(doc.getWithType(text, 12), ["str", "?"]) */
717
+ assert_true(AMitemToStr(
718
+ AMstackItem(stack_ptr, AMlistGet(doc, text, 12, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
719
+ assert_int_equal(str.count, 1);
720
+ assert_memory_equal(str.src, "?", str.count);
721
+ }
722
+
723
+ /**
724
+ * \brief should be able to save all or incrementally
725
+ */
726
+ static void test_should_be_able_to_save_all_or_incrementally(void** state) {
727
+ BaseState* base_state = *state;
728
+ AMstack** stack_ptr = &base_state->stack;
729
+ /* const doc = create() */
730
+ AMdoc* doc;
731
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
732
+ /* */
733
+ /* doc.put("_root", "foo", 1) */
734
+ AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("foo"), 1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
735
+ /* */
736
+ /* const save1 = doc.save() */
737
+ AMbyteSpan save1;
738
+ assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save1));
739
+ /* */
740
+ /* doc.put("_root", "bar", 2) */
741
+ AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("bar"), 2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
742
+ /* */
743
+ /* const saveMidway = doc.clone().save(); */
744
+ AMdoc* doc_clone;
745
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMclone(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc_clone));
746
+ AMbyteSpan saveMidway;
747
+ assert_true(
748
+ AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc_clone), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &saveMidway));
749
+ /* */
750
+ /* const save2 = doc.saveIncremental(); */
751
+ AMbyteSpan save2;
752
+ assert_true(
753
+ AMitemToBytes(AMstackItem(stack_ptr, AMsaveIncremental(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save2));
754
+ /* */
755
+ /* doc.put("_root", "baz", 3); */
756
+ AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("baz"), 3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
757
+ /* */
758
+ /* const save3 = doc.saveIncremental(); */
759
+ AMbyteSpan save3;
760
+ assert_true(
761
+ AMitemToBytes(AMstackItem(stack_ptr, AMsaveIncremental(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save3));
762
+ /* */
763
+ /* const saveA = doc.save(); */
764
+ AMbyteSpan saveA;
765
+ assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &saveA));
766
+ /* const saveB = new Uint8Array([...save1, ...save2, ...save3]); */
767
+ size_t const saveB_count = save1.count + save2.count + save3.count;
768
+ uint8_t* const saveB_src = test_malloc(saveB_count);
769
+ memcpy(saveB_src, save1.src, save1.count);
770
+ memcpy(saveB_src + save1.count, save2.src, save2.count);
771
+ memcpy(saveB_src + save1.count + save2.count, save3.src, save3.count);
772
+ /* */
773
+ /* assert.notDeepEqual(saveA, saveB); */
774
+ assert_memory_not_equal(saveA.src, saveB_src, saveA.count);
775
+ /* */
776
+ /* const docA = load(saveA); */
777
+ AMdoc* docA;
778
+ assert_true(AMitemToDoc(
779
+ AMstackItem(stack_ptr, AMload(saveA.src, saveA.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &docA));
780
+ /* const docB = load(saveB); */
781
+ AMdoc* docB;
782
+ assert_true(AMitemToDoc(
783
+ AMstackItem(stack_ptr, AMload(saveB_src, saveB_count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &docB));
784
+ test_free(saveB_src);
785
+ /* const docC = load(saveMidway) */
786
+ AMdoc* docC;
787
+ assert_true(AMitemToDoc(
788
+ AMstackItem(stack_ptr, AMload(saveMidway.src, saveMidway.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &docC));
789
+ /* docC.loadIncremental(save3) */
790
+ AMstackItem(NULL, AMloadIncremental(docC, save3.src, save3.count), cmocka_cb, AMexpect(AM_VAL_TYPE_UINT));
791
+ /* */
792
+ /* assert.deepEqual(docA.keys("_root"), docB.keys("_root")); */
793
+ AMitems const keysA = AMstackItems(stack_ptr, AMkeys(docA, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
794
+ AMitems const keysB = AMstackItems(stack_ptr, AMkeys(docB, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
795
+ assert_true(AMitemsEqual(&keysA, &keysB));
796
+ /* assert.deepEqual(docA.save(), docB.save()); */
797
+ AMbyteSpan docA_save;
798
+ assert_true(
799
+ AMitemToBytes(AMstackItem(stack_ptr, AMsave(docA), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &docA_save));
800
+ AMbyteSpan docB_save;
801
+ assert_true(
802
+ AMitemToBytes(AMstackItem(stack_ptr, AMsave(docB), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &docB_save));
803
+ assert_int_equal(docA_save.count, docB_save.count);
804
+ assert_memory_equal(docA_save.src, docB_save.src, docA_save.count);
805
+ /* assert.deepEqual(docA.save(), docC.save()); */
806
+ AMbyteSpan docC_save;
807
+ assert_true(
808
+ AMitemToBytes(AMstackItem(stack_ptr, AMsave(docC), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &docC_save));
809
+ assert_int_equal(docA_save.count, docC_save.count);
810
+ assert_memory_equal(docA_save.src, docC_save.src, docA_save.count);
811
+ }
812
+
813
+ /**
814
+ * \brief should be able to splice text #2
815
+ */
816
+ static void test_should_be_able_to_splice_text_2(void** state) {
817
+ BaseState* base_state = *state;
818
+ AMstack** stack_ptr = &base_state->stack;
819
+ /* const doc = create() */
820
+ AMdoc* doc;
821
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
822
+ /* const text = doc.putObject("_root", "text", ""); */
823
+ AMobjId const* const text =
824
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("text"), AM_OBJ_TYPE_TEXT), cmocka_cb,
825
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
826
+ /* doc.splice(text, 0, 0, "hello world"); */
827
+ AMstackItem(NULL, AMspliceText(doc, text, 0, 0, AMstr("hello world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
828
+ /* const hash1 = doc.commit(); */
829
+ AMitems const hash1 =
830
+ AMstackItems(stack_ptr, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
831
+ /* doc.splice(text, 6, 0, "big bad "); */
832
+ AMstackItem(NULL, AMspliceText(doc, text, 6, 0, AMstr("big bad ")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
833
+ /* const hash2 = doc.commit(); */
834
+ AMitems const hash2 =
835
+ AMstackItems(stack_ptr, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
836
+ /* assert.strictEqual(doc.text(text), "hello big bad world") */
837
+ AMbyteSpan str;
838
+ assert_true(
839
+ AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, text, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
840
+ assert_int_equal(str.count, strlen("hello big bad world"));
841
+ assert_memory_equal(str.src, "hello big bad world", str.count);
842
+ /* assert.strictEqual(doc.length(text), 19) */
843
+ assert_int_equal(AMobjSize(doc, text, NULL), 19);
844
+ /* assert.strictEqual(doc.text(text, [hash1]), "hello world") */
845
+ assert_true(
846
+ AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, text, &hash1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
847
+ assert_int_equal(str.count, strlen("hello world"));
848
+ assert_memory_equal(str.src, "hello world", str.count);
849
+ /* assert.strictEqual(doc.length(text, [hash1]), 11) */
850
+ assert_int_equal(AMobjSize(doc, text, &hash1), 11);
851
+ /* assert.strictEqual(doc.text(text, [hash2]), "hello big bad world") */
852
+ assert_true(
853
+ AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, text, &hash2), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
854
+ assert_int_equal(str.count, strlen("hello big bad world"));
855
+ assert_memory_equal(str.src, "hello big bad world", str.count);
856
+ /* assert.strictEqual(doc.length(text, [hash2]), 19) */
857
+ assert_int_equal(AMobjSize(doc, text, &hash2), 19);
858
+ }
859
+
860
+ /**
861
+ * \brief local inc increments all visible counters in a map
862
+ */
863
+ static void test_local_inc_increments_all_visible_counters_in_a_map(void** state) {
864
+ BaseState* base_state = *state;
865
+ AMstack** stack_ptr = &base_state->stack;
866
+ /* const doc1 = create("aaaa") */
867
+ AMactorId const* actor_id;
868
+ assert_true(AMitemToActorId(
869
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
870
+ AMdoc* doc1;
871
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1));
872
+ /* doc1.put("_root", "hello", "world") */
873
+ AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("hello"), AMstr("world")), cmocka_cb,
874
+ AMexpect(AM_VAL_TYPE_VOID));
875
+ /* const doc2 = load(doc1.save(), "bbbb"); */
876
+ AMbyteSpan save;
877
+ assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save));
878
+ AMdoc* doc2;
879
+ assert_true(
880
+ AMitemToDoc(AMstackItem(stack_ptr, AMload(save.src, save.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2));
881
+ assert_true(AMitemToActorId(
882
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("bbbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
883
+ AMstackItem(NULL, AMsetActorId(doc2, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
884
+ /* const doc3 = load(doc1.save(), "cccc"); */
885
+ AMdoc* doc3;
886
+ assert_true(
887
+ AMitemToDoc(AMstackItem(stack_ptr, AMload(save.src, save.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc3));
888
+ assert_true(AMitemToActorId(
889
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("cccc")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
890
+ AMstackItem(NULL, AMsetActorId(doc3, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
891
+ /* let heads = doc1.getHeads() */
892
+ AMitems const heads1 = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
893
+ /* doc1.put("_root", "cnt", 20) */
894
+ AMstackItem(NULL, AMmapPutInt(doc1, AM_ROOT, AMstr("cnt"), 20), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
895
+ /* doc2.put("_root", "cnt", 0, "counter") */
896
+ AMstackItem(NULL, AMmapPutCounter(doc2, AM_ROOT, AMstr("cnt"), 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
897
+ /* doc3.put("_root", "cnt", 10, "counter") */
898
+ AMstackItem(NULL, AMmapPutCounter(doc3, AM_ROOT, AMstr("cnt"), 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
899
+ /* doc1.applyChanges(doc2.getChanges(heads)) */
900
+ AMitems const changes2 =
901
+ AMstackItems(stack_ptr, AMgetChanges(doc2, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE));
902
+ AMstackItem(NULL, AMapplyChanges(doc1, &changes2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
903
+ /* doc1.applyChanges(doc3.getChanges(heads)) */
904
+ AMitems const changes3 =
905
+ AMstackItems(stack_ptr, AMgetChanges(doc3, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE));
906
+ AMstackItem(NULL, AMapplyChanges(doc1, &changes3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
907
+ /* let result = doc1.getAll("_root", "cnt") */
908
+ AMitems result = AMstackItems(stack_ptr, AMmapGetAll(doc1, AM_ROOT, AMstr("cnt"), NULL), cmocka_cb,
909
+ AMexpect(AM_VAL_TYPE_COUNTER | AM_VAL_TYPE_INT | AM_VAL_TYPE_STR));
910
+ /* assert.deepEqual(result, [
911
+ ['int', 20, '2@aaaa'],
912
+ ['counter', 0, '2@bbbb'],
913
+ ['counter', 10, '2@cccc'],
914
+ ]) */
915
+ AMitem* result_item = AMitemsNext(&result, 1);
916
+ int64_t int_;
917
+ assert_true(AMitemToInt(result_item, &int_));
918
+ assert_int_equal(int_, 20);
919
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2);
920
+ AMbyteSpan str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
921
+ assert_int_equal(str.count, 4);
922
+ assert_memory_equal(str.src, "aaaa", str.count);
923
+ result_item = AMitemsNext(&result, 1);
924
+ int64_t counter;
925
+ assert_true(AMitemToCounter(result_item, &counter));
926
+ assert_int_equal(counter, 0);
927
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2);
928
+ str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
929
+ assert_int_equal(str.count, 4);
930
+ assert_memory_equal(str.src, "bbbb", str.count);
931
+ result_item = AMitemsNext(&result, 1);
932
+ assert_true(AMitemToCounter(result_item, &counter));
933
+ assert_int_equal(counter, 10);
934
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2);
935
+ str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
936
+ assert_int_equal(str.count, 4);
937
+ assert_memory_equal(str.src, "cccc", str.count);
938
+ /* doc1.increment("_root", "cnt", 5) */
939
+ AMstackItem(NULL, AMmapIncrement(doc1, AM_ROOT, AMstr("cnt"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
940
+ /* result = doc1.getAll("_root", "cnt") */
941
+ result = AMstackItems(stack_ptr, AMmapGetAll(doc1, AM_ROOT, AMstr("cnt"), NULL), cmocka_cb,
942
+ AMexpect(AM_VAL_TYPE_COUNTER));
943
+ /* assert.deepEqual(result, [
944
+ ['counter', 5, '2@bbbb'],
945
+ ['counter', 15, '2@cccc'],
946
+ ]) */
947
+ result_item = AMitemsNext(&result, 1);
948
+ assert_true(AMitemToCounter(result_item, &counter));
949
+ assert_int_equal(counter, 5);
950
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2);
951
+ str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
952
+ assert_int_equal(str.count, 4);
953
+ assert_memory_equal(str.src, "bbbb", str.count);
954
+ result_item = AMitemsNext(&result, 1);
955
+ assert_true(AMitemToCounter(result_item, &counter));
956
+ assert_int_equal(counter, 15);
957
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2);
958
+ str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
959
+ assert_int_equal(str.count, 4);
960
+ assert_memory_equal(str.src, "cccc", str.count);
961
+ /* */
962
+ /* const save1 = doc1.save() */
963
+ AMbyteSpan save1;
964
+ assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save1));
965
+ /* const doc4 = load(save1) */
966
+ AMdoc* doc4;
967
+ assert_true(AMitemToDoc(
968
+ AMstackItem(stack_ptr, AMload(save1.src, save1.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc4));
969
+ /* assert.deepEqual(doc4.save(), save1); */
970
+ AMbyteSpan doc4_save;
971
+ assert_true(
972
+ AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc4), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &doc4_save));
973
+ assert_int_equal(doc4_save.count, save1.count);
974
+ assert_memory_equal(doc4_save.src, save1.src, doc4_save.count);
975
+ }
976
+
977
+ /**
978
+ * \brief local inc increments all visible counters in a sequence
979
+ */
980
+ static void test_local_inc_increments_all_visible_counters_in_a_sequence(void** state) {
981
+ BaseState* base_state = *state;
982
+ AMstack** stack_ptr = &base_state->stack;
983
+ /* const doc1 = create("aaaa") */
984
+ AMactorId const* actor_id;
985
+ assert_true(AMitemToActorId(
986
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
987
+ AMdoc* doc1;
988
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1));
989
+ /* const seq = doc1.putObject("_root", "seq", []) */
990
+ AMobjId const* const seq =
991
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("seq"), AM_OBJ_TYPE_LIST), cmocka_cb,
992
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
993
+ /* doc1.insert(seq, 0, "hello") */
994
+ AMstackItem(NULL, AMlistPutStr(doc1, seq, 0, true, AMstr("hello")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
995
+ /* const doc2 = load(doc1.save(), "bbbb"); */
996
+ AMbyteSpan save1;
997
+ assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save1));
998
+ AMdoc* doc2;
999
+ assert_true(AMitemToDoc(
1000
+ AMstackItem(stack_ptr, AMload(save1.src, save1.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2));
1001
+ assert_true(AMitemToActorId(
1002
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("bbbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
1003
+ AMstackItem(NULL, AMsetActorId(doc2, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1004
+ /* const doc3 = load(doc1.save(), "cccc"); */
1005
+ AMdoc* doc3;
1006
+ assert_true(AMitemToDoc(
1007
+ AMstackItem(stack_ptr, AMload(save1.src, save1.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc3));
1008
+ assert_true(AMitemToActorId(
1009
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("cccc")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
1010
+ AMstackItem(NULL, AMsetActorId(doc3, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1011
+ /* let heads = doc1.getHeads() */
1012
+ AMitems const heads1 = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
1013
+ /* doc1.put(seq, 0, 20) */
1014
+ AMstackItem(NULL, AMlistPutInt(doc1, seq, 0, false, 20), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1015
+ /* doc2.put(seq, 0, 0, "counter") */
1016
+ AMstackItem(NULL, AMlistPutCounter(doc2, seq, 0, false, 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1017
+ /* doc3.put(seq, 0, 10, "counter") */
1018
+ AMstackItem(NULL, AMlistPutCounter(doc3, seq, 0, false, 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1019
+ /* doc1.applyChanges(doc2.getChanges(heads)) */
1020
+ AMitems const changes2 =
1021
+ AMstackItems(stack_ptr, AMgetChanges(doc2, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE));
1022
+ AMstackItem(NULL, AMapplyChanges(doc1, &changes2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1023
+ /* doc1.applyChanges(doc3.getChanges(heads)) */
1024
+ AMitems const changes3 =
1025
+ AMstackItems(stack_ptr, AMgetChanges(doc3, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE));
1026
+ AMstackItem(NULL, AMapplyChanges(doc1, &changes3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1027
+ /* let result = doc1.getAll(seq, 0) */
1028
+ AMitems result = AMstackItems(stack_ptr, AMlistGetAll(doc1, seq, 0, NULL), cmocka_cb,
1029
+ AMexpect(AM_VAL_TYPE_COUNTER | AM_VAL_TYPE_INT));
1030
+ /* assert.deepEqual(result, [
1031
+ ['int', 20, '3@aaaa'],
1032
+ ['counter', 0, '3@bbbb'],
1033
+ ['counter', 10, '3@cccc'],
1034
+ ]) */
1035
+ AMitem* result_item = AMitemsNext(&result, 1);
1036
+ int64_t int_;
1037
+ assert_true(AMitemToInt(result_item, &int_));
1038
+ assert_int_equal(int_, 20);
1039
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3);
1040
+ AMbyteSpan str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
1041
+ assert_int_equal(str.count, 4);
1042
+ assert_memory_equal(str.src, "aaaa", str.count);
1043
+ result_item = AMitemsNext(&result, 1);
1044
+ int64_t counter;
1045
+ assert_true(AMitemToCounter(result_item, &counter));
1046
+ assert_int_equal(counter, 0);
1047
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3);
1048
+ str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
1049
+ assert_memory_equal(str.src, "bbbb", str.count);
1050
+ result_item = AMitemsNext(&result, 1);
1051
+ assert_true(AMitemToCounter(result_item, &counter));
1052
+ assert_int_equal(counter, 10);
1053
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3);
1054
+ str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
1055
+ assert_int_equal(str.count, 4);
1056
+ assert_memory_equal(str.src, "cccc", str.count);
1057
+ /* doc1.increment(seq, 0, 5) */
1058
+ AMstackItem(NULL, AMlistIncrement(doc1, seq, 0, 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1059
+ /* result = doc1.getAll(seq, 0) */
1060
+ result = AMstackItems(stack_ptr, AMlistGetAll(doc1, seq, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_COUNTER));
1061
+ /* assert.deepEqual(result, [
1062
+ ['counter', 5, '3@bbbb'],
1063
+ ['counter', 15, '3@cccc'],
1064
+ ]) */
1065
+ result_item = AMitemsNext(&result, 1);
1066
+ assert_true(AMitemToCounter(result_item, &counter));
1067
+ assert_int_equal(counter, 5);
1068
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3);
1069
+ str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
1070
+ assert_int_equal(str.count, 4);
1071
+ assert_memory_equal(str.src, "bbbb", str.count);
1072
+ result_item = AMitemsNext(&result, 1);
1073
+ assert_true(AMitemToCounter(result_item, &counter));
1074
+ assert_int_equal(counter, 15);
1075
+ assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3);
1076
+ str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item)));
1077
+ assert_memory_equal(str.src, "cccc", str.count);
1078
+ /* */
1079
+ /* const save = doc1.save() */
1080
+ AMbyteSpan save;
1081
+ assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save));
1082
+ /* const doc4 = load(save) */
1083
+ AMdoc* doc4;
1084
+ assert_true(
1085
+ AMitemToDoc(AMstackItem(stack_ptr, AMload(save.src, save.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc4));
1086
+ /* assert.deepEqual(doc4.save(), save); */
1087
+ AMbyteSpan doc4_save;
1088
+ assert_true(
1089
+ AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc4), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &doc4_save));
1090
+ assert_int_equal(doc4_save.count, save.count);
1091
+ assert_memory_equal(doc4_save.src, save.src, doc4_save.count);
1092
+ }
1093
+
1094
+ /**
1095
+ * \brief paths can be used instead of objids
1096
+ */
1097
+ static void test_paths_can_be_used_instead_of_objids(void** state);
1098
+
1099
+ /**
1100
+ * \brief should be able to fetch changes by hash
1101
+ */
1102
+ static void test_should_be_able_to_fetch_changes_by_hash(void** state) {
1103
+ BaseState* base_state = *state;
1104
+ AMstack** stack_ptr = &base_state->stack;
1105
+ /* const doc1 = create("aaaa") */
1106
+ AMactorId const* actor_id;
1107
+ assert_true(AMitemToActorId(
1108
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
1109
+ AMdoc* doc1;
1110
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1));
1111
+ /* const doc2 = create("bbbb") */
1112
+ assert_true(AMitemToActorId(
1113
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("bbbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
1114
+ AMdoc* doc2;
1115
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2));
1116
+ /* doc1.put("/", "a", "b") */
1117
+ AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("a"), AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1118
+ /* doc2.put("/", "b", "c") */
1119
+ AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("b"), AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1120
+ /* const head1 = doc1.getHeads() */
1121
+ AMitems head1 = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
1122
+ /* const head2 = doc2.getHeads() */
1123
+ AMitems head2 = AMstackItems(stack_ptr, AMgetHeads(doc2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
1124
+ /* const change1 = doc1.getChangeByHash(head1[0])
1125
+ if (change1 === null) { throw new RangeError("change1 should not be
1126
+ null") */
1127
+ AMbyteSpan change_hash1;
1128
+ assert_true(AMitemToChangeHash(AMitemsNext(&head1, 1), &change_hash1));
1129
+ AMchange* change1;
1130
+ assert_true(AMitemToChange(AMstackItem(stack_ptr, AMgetChangeByHash(doc1, change_hash1.src, change_hash1.count),
1131
+ cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)),
1132
+ &change1));
1133
+ /* const change2 = doc1.getChangeByHash(head2[0])
1134
+ assert.deepEqual(change2, null) */
1135
+ AMbyteSpan change_hash2;
1136
+ assert_true(AMitemToChangeHash(AMitemsNext(&head2, 1), &change_hash2));
1137
+ AMstackItem(NULL, AMgetChangeByHash(doc1, change_hash2.src, change_hash2.count), cmocka_cb,
1138
+ AMexpect(AM_VAL_TYPE_VOID));
1139
+ /* assert.deepEqual(decodeChange(change1).hash, head1[0]) */
1140
+ assert_memory_equal(AMchangeHash(change1).src, change_hash1.src, change_hash1.count);
1141
+ }
1142
+
1143
+ /**
1144
+ * \brief recursive sets are possible
1145
+ */
1146
+ static void test_recursive_sets_are_possible(void** state) {
1147
+ BaseState* base_state = *state;
1148
+ AMstack** stack_ptr = &base_state->stack;
1149
+ /* const doc = create("aaaa") */
1150
+ AMactorId const* actor_id;
1151
+ assert_true(AMitemToActorId(
1152
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
1153
+ AMdoc* doc;
1154
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
1155
+ /* const l1 = doc.putObject("_root", "list", [{ foo: "bar" }, [1, 2, 3]] */
1156
+ AMobjId const* const l1 =
1157
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb,
1158
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1159
+ {
1160
+ AMobjId const* const map = AMitemObjId(AMstackItem(
1161
+ stack_ptr, AMlistPutObject(doc, l1, 0, true, AM_OBJ_TYPE_MAP), cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1162
+ AMstackItem(NULL, AMmapPutStr(doc, map, AMstr("foo"), AMstr("bar")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1163
+ AMobjId const* const list =
1164
+ AMitemObjId(AMstackItem(stack_ptr, AMlistPutObject(doc, l1, SIZE_MAX, true, AM_OBJ_TYPE_LIST), cmocka_cb,
1165
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1166
+ for (int value = 1; value != 4; ++value) {
1167
+ AMstackItem(NULL, AMlistPutInt(doc, list, SIZE_MAX, true, value), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1168
+ }
1169
+ }
1170
+ /* const l2 = doc.insertObject(l1, 0, { zip: ["a", "b"] }) */
1171
+ AMobjId const* const l2 = AMitemObjId(AMstackItem(stack_ptr, AMlistPutObject(doc, l1, 0, true, AM_OBJ_TYPE_MAP),
1172
+ cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1173
+ {
1174
+ AMobjId const* const list =
1175
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, l2, AMstr("zip"), AM_OBJ_TYPE_LIST), cmocka_cb,
1176
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1177
+ AMstackItem(NULL, AMlistPutStr(doc, list, SIZE_MAX, true, AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1178
+ AMstackItem(NULL, AMlistPutStr(doc, list, SIZE_MAX, true, AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1179
+ }
1180
+ /* const l3 = doc.putObject("_root", "info1", "hello world") // 'text'
1181
+ * object */
1182
+ AMobjId const* const l3 =
1183
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("info1"), AM_OBJ_TYPE_TEXT), cmocka_cb,
1184
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1185
+ AMstackItem(NULL, AMspliceText(doc, l3, 0, 0, AMstr("hello world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1186
+ /* doc.put("_root", "info2", "hello world") // 'str' */
1187
+ AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("info2"), AMstr("hello world")), cmocka_cb,
1188
+ AMexpect(AM_VAL_TYPE_VOID));
1189
+ /* const l4 = doc.putObject("_root", "info3", "hello world") */
1190
+ AMobjId const* const l4 =
1191
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("info3"), AM_OBJ_TYPE_TEXT), cmocka_cb,
1192
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1193
+ AMstackItem(NULL, AMspliceText(doc, l4, 0, 0, AMstr("hello world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1194
+ /* assert.deepEqual(doc.materialize(), {
1195
+ "list": [{ zip: ["a", "b"] }, { foo: "bar" }, [1, 2, 3]],
1196
+ "info1": "hello world",
1197
+ "info2": "hello world",
1198
+ "info3": "hello world",
1199
+ }) */
1200
+ AMitems doc_items = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
1201
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE | AM_VAL_TYPE_STR));
1202
+ AMitem* doc_item = AMitemsNext(&doc_items, 1);
1203
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
1204
+ AMbyteSpan key;
1205
+ assert_true(AMitemKey(doc_item, &key));
1206
+ assert_int_equal(key.count, strlen("info1"));
1207
+ assert_memory_equal(key.src, "info1", key.count);
1208
+ AMbyteSpan str;
1209
+ assert_true(AMitemToStr(
1210
+ AMstackItem(stack_ptr, AMtext(doc, AMitemObjId(doc_item), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
1211
+ assert_int_equal(str.count, strlen("hello world"));
1212
+ assert_memory_equal(str.src, "hello world", str.count);
1213
+ doc_item = AMitemsNext(&doc_items, 1);
1214
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
1215
+ assert_true(AMitemKey(doc_item, &key));
1216
+ assert_int_equal(key.count, strlen("info2"));
1217
+ assert_memory_equal(key.src, "info2", key.count);
1218
+ assert_true(AMitemToStr(doc_item, &str));
1219
+ assert_int_equal(str.count, strlen("hello world"));
1220
+ assert_memory_equal(str.src, "hello world", str.count);
1221
+ doc_item = AMitemsNext(&doc_items, 1);
1222
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
1223
+ assert_true(AMitemKey(doc_item, &key));
1224
+ assert_int_equal(key.count, strlen("info3"));
1225
+ assert_memory_equal(key.src, "info3", key.count);
1226
+ assert_true(AMitemToStr(
1227
+ AMstackItem(stack_ptr, AMtext(doc, AMitemObjId(doc_item), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
1228
+ assert_int_equal(str.count, strlen("hello world"));
1229
+ assert_memory_equal(str.src, "hello world", str.count);
1230
+ doc_item = AMitemsNext(&doc_items, 1);
1231
+ assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY);
1232
+ assert_true(AMitemKey(doc_item, &key));
1233
+ assert_int_equal(key.count, strlen("list"));
1234
+ assert_memory_equal(key.src, "list", key.count);
1235
+ {
1236
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL),
1237
+ cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE));
1238
+ AMitem const* list_item = AMitemsNext(&list_items, 1);
1239
+ {
1240
+ AMitems map_items =
1241
+ AMstackItems(stack_ptr, AMmapRange(doc, AMitemObjId(list_item), AMstr(NULL), AMstr(NULL), NULL),
1242
+ cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE));
1243
+ AMitem const* map_item = AMitemsNext(&map_items, 1);
1244
+ assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY);
1245
+ AMbyteSpan key;
1246
+ assert_true(AMitemKey(map_item, &key));
1247
+ assert_int_equal(key.count, strlen("zip"));
1248
+ assert_memory_equal(key.src, "zip", key.count);
1249
+ {
1250
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(map_item), 0, SIZE_MAX, NULL),
1251
+ cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE | AM_VAL_TYPE_STR));
1252
+ AMbyteSpan str;
1253
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
1254
+ assert_int_equal(str.count, 1);
1255
+ assert_memory_equal(str.src, "a", str.count);
1256
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
1257
+ assert_int_equal(str.count, 1);
1258
+ assert_memory_equal(str.src, "b", str.count);
1259
+ }
1260
+ }
1261
+ list_item = AMitemsNext(&list_items, 1);
1262
+ {
1263
+ AMitems map_items =
1264
+ AMstackItems(stack_ptr, AMmapRange(doc, AMitemObjId(list_item), AMstr(NULL), AMstr(NULL), NULL),
1265
+ cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE | AM_VAL_TYPE_STR));
1266
+ AMitem* map_item = AMitemsNext(&map_items, 1);
1267
+ assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY);
1268
+ AMbyteSpan key;
1269
+ assert_true(AMitemKey(map_item, &key));
1270
+ assert_int_equal(key.count, strlen("foo"));
1271
+ assert_memory_equal(key.src, "foo", key.count);
1272
+ AMbyteSpan str;
1273
+ assert_true(AMitemToStr(map_item, &str));
1274
+ assert_int_equal(str.count, 3);
1275
+ assert_memory_equal(str.src, "bar", str.count);
1276
+ }
1277
+ list_item = AMitemsNext(&list_items, 1);
1278
+ {
1279
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(list_item), 0, SIZE_MAX, NULL),
1280
+ cmocka_cb, AMexpect(AM_VAL_TYPE_INT));
1281
+ int64_t int_;
1282
+ assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_));
1283
+ assert_int_equal(int_, 1);
1284
+ assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_));
1285
+ assert_int_equal(int_, 2);
1286
+ assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_));
1287
+ assert_int_equal(int_, 3);
1288
+ }
1289
+ }
1290
+ /* assert.deepEqual(doc.materialize(l2), { zip: ["a", "b"] }) */
1291
+ AMitems map_items = AMstackItems(stack_ptr, AMmapRange(doc, l2, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
1292
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
1293
+ AMitem const* map_item = AMitemsNext(&map_items, 1);
1294
+ assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY);
1295
+ assert_true(AMitemKey(map_item, &key));
1296
+ assert_int_equal(key.count, strlen("zip"));
1297
+ assert_memory_equal(key.src, "zip", key.count);
1298
+ {
1299
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(map_item), 0, SIZE_MAX, NULL),
1300
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
1301
+ AMbyteSpan str;
1302
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
1303
+ assert_int_equal(str.count, 1);
1304
+ assert_memory_equal(str.src, "a", str.count);
1305
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
1306
+ assert_int_equal(str.count, 1);
1307
+ assert_memory_equal(str.src, "b", str.count);
1308
+ }
1309
+ /* assert.deepEqual(doc.materialize(l1), [{ zip: ["a", "b"] }, { foo: "bar"
1310
+ * }, [1, 2, 3]] */
1311
+ AMitems list_items =
1312
+ AMstackItems(stack_ptr, AMlistRange(doc, l1, 0, SIZE_MAX, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE));
1313
+ AMitem const* list_item = AMitemsNext(&list_items, 1);
1314
+ {
1315
+ AMitems map_items =
1316
+ AMstackItems(stack_ptr, AMmapRange(doc, AMitemObjId(list_item), AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
1317
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
1318
+ AMitem const* map_item = AMitemsNext(&map_items, 1);
1319
+ assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY);
1320
+ AMbyteSpan key;
1321
+ assert_true(AMitemKey(map_item, &key));
1322
+ assert_int_equal(key.count, strlen("zip"));
1323
+ assert_memory_equal(key.src, "zip", key.count);
1324
+ {
1325
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(map_item), 0, SIZE_MAX, NULL),
1326
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
1327
+ AMbyteSpan str;
1328
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
1329
+ assert_int_equal(str.count, 1);
1330
+ assert_memory_equal(str.src, "a", str.count);
1331
+ assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str));
1332
+ assert_int_equal(str.count, 1);
1333
+ assert_memory_equal(str.src, "b", str.count);
1334
+ }
1335
+ }
1336
+ list_item = AMitemsNext(&list_items, 1);
1337
+ {
1338
+ AMitems map_items =
1339
+ AMstackItems(stack_ptr, AMmapRange(doc, AMitemObjId(list_item), AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
1340
+ AMexpect(AM_VAL_TYPE_STR));
1341
+ AMitem* map_item = AMitemsNext(&map_items, 1);
1342
+ assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY);
1343
+ AMbyteSpan key;
1344
+ assert_true(AMitemKey(map_item, &key));
1345
+ assert_int_equal(key.count, strlen("foo"));
1346
+ assert_memory_equal(key.src, "foo", key.count);
1347
+ AMbyteSpan str;
1348
+ assert_true(AMitemToStr(map_item, &str));
1349
+ assert_int_equal(str.count, 3);
1350
+ assert_memory_equal(str.src, "bar", str.count);
1351
+ }
1352
+ list_item = AMitemsNext(&list_items, 1);
1353
+ {
1354
+ AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(list_item), 0, SIZE_MAX, NULL),
1355
+ cmocka_cb, AMexpect(AM_VAL_TYPE_INT));
1356
+ int64_t int_;
1357
+ assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_));
1358
+ assert_int_equal(int_, 1);
1359
+ assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_));
1360
+ assert_int_equal(int_, 2);
1361
+ assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_));
1362
+ assert_int_equal(int_, 3);
1363
+ }
1364
+ /* assert.deepEqual(doc.materialize(l4), "hello world") */
1365
+ assert_true(AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, l4, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
1366
+ assert_int_equal(str.count, strlen("hello world"));
1367
+ assert_memory_equal(str.src, "hello world", str.count);
1368
+ }
1369
+
1370
+ /**
1371
+ * \brief only returns an object id when objects are created
1372
+ */
1373
+ static void test_only_returns_an_object_id_when_objects_are_created(void** state) {
1374
+ BaseState* base_state = *state;
1375
+ AMstack** stack_ptr = &base_state->stack;
1376
+ /* const doc = create("aaaa") */
1377
+ AMactorId const* actor_id;
1378
+ assert_true(AMitemToActorId(
1379
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
1380
+ AMdoc* doc;
1381
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc));
1382
+ /* const r1 = doc.put("_root", "foo", "bar")
1383
+ assert.deepEqual(r1, null); */
1384
+ AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("foo"), AMstr("bar")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1385
+ /* const r2 = doc.putObject("_root", "list", []) */
1386
+ AMobjId const* const r2 =
1387
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb,
1388
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1389
+ /* const r3 = doc.put("_root", "counter", 10, "counter")
1390
+ assert.deepEqual(r3, null); */
1391
+ AMstackItem(NULL, AMmapPutCounter(doc, AM_ROOT, AMstr("counter"), 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1392
+ /* const r4 = doc.increment("_root", "counter", 1)
1393
+ assert.deepEqual(r4, null); */
1394
+ AMstackItem(NULL, AMmapIncrement(doc, AM_ROOT, AMstr("counter"), 1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1395
+ /* const r5 = doc.delete("_root", "counter")
1396
+ assert.deepEqual(r5, null); */
1397
+ AMstackItem(NULL, AMmapDelete(doc, AM_ROOT, AMstr("counter")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1398
+ /* const r6 = doc.insert(r2, 0, 10);
1399
+ assert.deepEqual(r6, null); */
1400
+ AMstackItem(NULL, AMlistPutInt(doc, r2, 0, true, 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1401
+ /* const r7 = doc.insertObject(r2, 0, {}); */
1402
+ AMobjId const* const r7 = AMitemObjId(AMstackItem(stack_ptr, AMlistPutObject(doc, r2, 0, true, AM_OBJ_TYPE_LIST),
1403
+ cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1404
+ /* const r8 = doc.splice(r2, 1, 0, ["a", "b", "c"]); */
1405
+ AMresult* data = AMstackResult(
1406
+ stack_ptr, AMresultFrom(3, AMitemFromStr(AMstr("a")), AMitemFromStr(AMstr("b")), AMitemFromStr(AMstr("c"))),
1407
+ NULL, NULL);
1408
+ AMstackItem(NULL, AMsplice(doc, r2, 1, 0, AMresultItems(data)), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1409
+ /* assert.deepEqual(r2, "2@aaaa"); */
1410
+ assert_int_equal(AMobjIdCounter(r2), 2);
1411
+ AMbyteSpan str = AMactorIdStr(AMobjIdActorId(r2));
1412
+ assert_int_equal(str.count, 4);
1413
+ assert_memory_equal(str.src, "aaaa", str.count);
1414
+ /* assert.deepEqual(r7, "7@aaaa"); */
1415
+ assert_int_equal(AMobjIdCounter(r7), 7);
1416
+ str = AMactorIdStr(AMobjIdActorId(r7));
1417
+ assert_memory_equal(str.src, "aaaa", str.count);
1418
+ }
1419
+
1420
+ /**
1421
+ * \brief objects without properties are preserved
1422
+ */
1423
+ static void test_objects_without_properties_are_preserved(void** state) {
1424
+ BaseState* base_state = *state;
1425
+ AMstack** stack_ptr = &base_state->stack;
1426
+ /* const doc1 = create("aaaa") */
1427
+ AMactorId const* actor_id;
1428
+ assert_true(AMitemToActorId(
1429
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id));
1430
+ AMdoc* doc1;
1431
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1));
1432
+ /* const a = doc1.putObject("_root", "a", {}); */
1433
+ AMobjId const* const a =
1434
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("a"), AM_OBJ_TYPE_MAP), cmocka_cb,
1435
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1436
+ /* const b = doc1.putObject("_root", "b", {}); */
1437
+ AMobjId const* const b =
1438
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("b"), AM_OBJ_TYPE_MAP), cmocka_cb,
1439
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1440
+ /* const c = doc1.putObject("_root", "c", {}); */
1441
+ AMobjId const* const c =
1442
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("c"), AM_OBJ_TYPE_MAP), cmocka_cb,
1443
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1444
+ /* const d = doc1.put(c, "d", "dd"); */
1445
+ AMstackItem(NULL, AMmapPutStr(doc1, c, AMstr("d"), AMstr("dd")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1446
+ /* const saved = doc1.save(); */
1447
+ AMbyteSpan saved;
1448
+ assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &saved));
1449
+ /* const doc2 = load(saved); */
1450
+ AMdoc* doc2;
1451
+ assert_true(AMitemToDoc(
1452
+ AMstackItem(stack_ptr, AMload(saved.src, saved.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2));
1453
+ /* assert.deepEqual(doc2.getWithType("_root", "a"), ["map", a]) */
1454
+ AMitems doc_items = AMstackItems(stack_ptr, AMmapRange(doc2, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb,
1455
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE));
1456
+ assert_true(AMobjIdEqual(AMitemObjId(AMitemsNext(&doc_items, 1)), a));
1457
+ /* assert.deepEqual(doc2.keys(a), []) */
1458
+ AMitems keys = AMstackItems(stack_ptr, AMkeys(doc1, a, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
1459
+ assert_int_equal(AMitemsSize(&keys), 0);
1460
+ /* assert.deepEqual(doc2.getWithType("_root", "b"), ["map", b]) */
1461
+ assert_true(AMobjIdEqual(AMitemObjId(AMitemsNext(&doc_items, 1)), b));
1462
+ /* assert.deepEqual(doc2.keys(b), []) */
1463
+ keys = AMstackItems(stack_ptr, AMkeys(doc1, b, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
1464
+ assert_int_equal(AMitemsSize(&keys), 0);
1465
+ /* assert.deepEqual(doc2.getWithType("_root", "c"), ["map", c]) */
1466
+ assert_true(AMobjIdEqual(AMitemObjId(AMitemsNext(&doc_items, 1)), c));
1467
+ /* assert.deepEqual(doc2.keys(c), ["d"]) */
1468
+ keys = AMstackItems(stack_ptr, AMkeys(doc1, c, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
1469
+ AMbyteSpan str;
1470
+ assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str));
1471
+ assert_int_equal(str.count, 1);
1472
+ assert_memory_equal(str.src, "d", str.count);
1473
+ /* assert.deepEqual(doc2.getWithType(c, "d"), ["str", "dd"]) */
1474
+ AMitems obj_items = AMstackItems(stack_ptr, AMobjItems(doc1, c, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
1475
+ assert_true(AMitemToStr(AMitemsNext(&obj_items, 1), &str));
1476
+ assert_int_equal(str.count, 2);
1477
+ assert_memory_equal(str.src, "dd", str.count);
1478
+ }
1479
+
1480
+ /**
1481
+ * \brief should allow you to forkAt a heads
1482
+ */
1483
+ static void test_should_allow_you_to_forkAt_a_heads(void** state) {
1484
+ BaseState* base_state = *state;
1485
+ AMstack** stack_ptr = &base_state->stack;
1486
+ /* const A = create("aaaaaa") */
1487
+ AMactorId const* actor_id;
1488
+ assert_true(AMitemToActorId(
1489
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)),
1490
+ &actor_id));
1491
+ AMdoc* A;
1492
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &A));
1493
+ /* A.put("/", "key1", "val1"); */
1494
+ AMstackItem(NULL, AMmapPutStr(A, AM_ROOT, AMstr("key1"), AMstr("val1")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1495
+ /* A.put("/", "key2", "val2"); */
1496
+ AMstackItem(NULL, AMmapPutStr(A, AM_ROOT, AMstr("key2"), AMstr("val2")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1497
+ /* const heads1 = A.getHeads(); */
1498
+ AMitems const heads1 = AMstackItems(stack_ptr, AMgetHeads(A), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
1499
+ /* const B = A.fork("bbbbbb") */
1500
+ AMdoc* B;
1501
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMfork(A, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &B));
1502
+ assert_true(AMitemToActorId(
1503
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("bbbbbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)),
1504
+ &actor_id));
1505
+ AMstackItem(NULL, AMsetActorId(B, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1506
+ /* A.put("/", "key3", "val3"); */
1507
+ AMstackItem(NULL, AMmapPutStr(A, AM_ROOT, AMstr("key3"), AMstr("val3")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1508
+ /* B.put("/", "key4", "val4"); */
1509
+ AMstackItem(NULL, AMmapPutStr(B, AM_ROOT, AMstr("key4"), AMstr("val4")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1510
+ /* A.merge(B) */
1511
+ AMstackItem(NULL, AMmerge(A, B), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
1512
+ /* const heads2 = A.getHeads(); */
1513
+ AMitems const heads2 = AMstackItems(stack_ptr, AMgetHeads(A), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
1514
+ /* A.put("/", "key5", "val5"); */
1515
+ AMstackItem(NULL, AMmapPutStr(A, AM_ROOT, AMstr("key5"), AMstr("val5")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1516
+ /* assert.deepEqual(A.forkAt(heads1).materialize("/"), A.materialize("/",
1517
+ * heads1) */
1518
+ AMdoc* A_forkAt1;
1519
+ assert_true(
1520
+ AMitemToDoc(AMstackItem(stack_ptr, AMfork(A, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &A_forkAt1));
1521
+ AMitems AforkAt1_items = AMstackItems(stack_ptr, AMmapRange(A_forkAt1, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL),
1522
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
1523
+ AMitems A1_items = AMstackItems(stack_ptr, AMmapRange(A, AM_ROOT, AMstr(NULL), AMstr(NULL), &heads1), cmocka_cb,
1524
+ AMexpect(AM_VAL_TYPE_STR));
1525
+ assert_true(AMitemsEqual(&AforkAt1_items, &A1_items));
1526
+ /* assert.deepEqual(A.forkAt(heads2).materialize("/"), A.materialize("/",
1527
+ * heads2) */
1528
+ AMdoc* A_forkAt2;
1529
+ assert_true(
1530
+ AMitemToDoc(AMstackItem(stack_ptr, AMfork(A, &heads2), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &A_forkAt2));
1531
+ AMitems AforkAt2_items = AMstackItems(stack_ptr, AMmapRange(A_forkAt2, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL),
1532
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR));
1533
+ AMitems A2_items = AMstackItems(stack_ptr, AMmapRange(A, AM_ROOT, AMstr(NULL), AMstr(NULL), &heads2), cmocka_cb,
1534
+ AMexpect(AM_VAL_TYPE_STR));
1535
+ assert_true(AMitemsEqual(&AforkAt2_items, &A2_items));
1536
+ }
1537
+
1538
+ /**
1539
+ * \brief should handle merging text conflicts then saving & loading
1540
+ */
1541
+ static void test_should_handle_merging_text_conflicts_then_saving_and_loading(void** state) {
1542
+ BaseState* base_state = *state;
1543
+ AMstack** stack_ptr = &base_state->stack;
1544
+ /* const A = create("aabbcc") */
1545
+ AMactorId const* actor_id;
1546
+ assert_true(AMitemToActorId(
1547
+ AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aabbcc")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)),
1548
+ &actor_id));
1549
+ AMdoc* A;
1550
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &A));
1551
+ /* const At = A.putObject('_root', 'text', "") */
1552
+ AMobjId const* const At =
1553
+ AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(A, AM_ROOT, AMstr("text"), AM_OBJ_TYPE_TEXT), cmocka_cb,
1554
+ AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1555
+ /* A.splice(At, 0, 0, 'hello') */
1556
+ AMstackItem(NULL, AMspliceText(A, At, 0, 0, AMstr("hello")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1557
+ /* */
1558
+ /* const B = A.fork() */
1559
+ AMdoc* B;
1560
+ assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMfork(A, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &B));
1561
+ /* */
1562
+ /* assert.deepEqual(B.getWithType("_root", "text"), ["text", At]) */
1563
+ AMbyteSpan str;
1564
+ assert_true(
1565
+ AMitemToStr(AMstackItem(stack_ptr,
1566
+ AMtext(B,
1567
+ AMitemObjId(AMstackItem(stack_ptr, AMmapGet(B, AM_ROOT, AMstr("text"), NULL),
1568
+ cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))),
1569
+ NULL),
1570
+ cmocka_cb, AMexpect(AM_VAL_TYPE_STR)),
1571
+ &str));
1572
+ AMbyteSpan str2;
1573
+ assert_true(AMitemToStr(AMstackItem(stack_ptr, AMtext(A, At, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str2));
1574
+ assert_int_equal(str.count, str2.count);
1575
+ assert_memory_equal(str.src, str2.src, str.count);
1576
+ /* */
1577
+ /* B.splice(At, 4, 1) */
1578
+ AMstackItem(NULL, AMspliceText(B, At, 4, 1, AMstr(NULL)), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1579
+ /* B.splice(At, 4, 0, '!') */
1580
+ AMstackItem(NULL, AMspliceText(B, At, 4, 0, AMstr("!")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1581
+ /* B.splice(At, 5, 0, ' ') */
1582
+ AMstackItem(NULL, AMspliceText(B, At, 5, 0, AMstr(" ")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1583
+ /* B.splice(At, 6, 0, 'world') */
1584
+ AMstackItem(NULL, AMspliceText(B, At, 6, 0, AMstr("world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID));
1585
+ /* */
1586
+ /* A.merge(B) */
1587
+ AMstackItem(NULL, AMmerge(A, B), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH));
1588
+ /* */
1589
+ /* const binary = A.save() */
1590
+ AMbyteSpan binary;
1591
+ assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(A), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &binary));
1592
+ /* */
1593
+ /* const C = load(binary) */
1594
+ AMdoc* C;
1595
+ assert_true(AMitemToDoc(
1596
+ AMstackItem(stack_ptr, AMload(binary.src, binary.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &C));
1597
+ /* */
1598
+ /* assert.deepEqual(C.getWithType('_root', 'text'), ['text', '1@aabbcc'] */
1599
+ AMobjId const* const C_text = AMitemObjId(
1600
+ AMstackItem(stack_ptr, AMmapGet(C, AM_ROOT, AMstr("text"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE)));
1601
+ assert_int_equal(AMobjIdCounter(C_text), 1);
1602
+ str = AMactorIdStr(AMobjIdActorId(C_text));
1603
+ assert_int_equal(str.count, strlen("aabbcc"));
1604
+ assert_memory_equal(str.src, "aabbcc", str.count);
1605
+ /* assert.deepEqual(C.text(At), 'hell! world') */
1606
+ assert_true(AMitemToStr(AMstackItem(stack_ptr, AMtext(C, At, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str));
1607
+ assert_int_equal(str.count, strlen("hell! world"));
1608
+ assert_memory_equal(str.src, "hell! world", str.count);
1609
+ }
1610
+
1611
+ int run_ported_wasm_basic_tests(void) {
1612
+ const struct CMUnitTest tests[] = {
1613
+ cmocka_unit_test_setup_teardown(test_create_clone_and_free, setup_base, teardown_base),
1614
+ cmocka_unit_test_setup_teardown(test_start_and_commit, setup_base, teardown_base),
1615
+ cmocka_unit_test_setup_teardown(test_getting_a_nonexistent_prop_does_not_throw_an_error, setup_base,
1616
+ teardown_base),
1617
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_set_and_get_a_simple_value, setup_base, teardown_base),
1618
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_use_bytes, setup_base, teardown_base),
1619
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_make_subobjects, setup_base, teardown_base),
1620
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_make_lists, setup_base, teardown_base),
1621
+ cmocka_unit_test_setup_teardown(test_lists_have_insert_set_splice_and_push_ops, setup_base, teardown_base),
1622
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_delete_non_existent_props, setup_base, teardown_base),
1623
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_del, setup_base, teardown_base),
1624
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_use_counters, setup_base, teardown_base),
1625
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_splice_text, setup_base, teardown_base),
1626
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_save_all_or_incrementally, setup_base, teardown_base),
1627
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_splice_text_2, setup_base, teardown_base),
1628
+ cmocka_unit_test_setup_teardown(test_local_inc_increments_all_visible_counters_in_a_map, setup_base,
1629
+ teardown_base),
1630
+ cmocka_unit_test_setup_teardown(test_local_inc_increments_all_visible_counters_in_a_sequence, setup_base,
1631
+ teardown_base),
1632
+ cmocka_unit_test_setup_teardown(test_should_be_able_to_fetch_changes_by_hash, setup_base, teardown_base),
1633
+ cmocka_unit_test_setup_teardown(test_recursive_sets_are_possible, setup_base, teardown_base),
1634
+ cmocka_unit_test_setup_teardown(test_only_returns_an_object_id_when_objects_are_created, setup_base,
1635
+ teardown_base),
1636
+ cmocka_unit_test_setup_teardown(test_objects_without_properties_are_preserved, setup_base, teardown_base),
1637
+ cmocka_unit_test_setup_teardown(test_should_allow_you_to_forkAt_a_heads, setup_base, teardown_base),
1638
+ cmocka_unit_test_setup_teardown(test_should_handle_merging_text_conflicts_then_saving_and_loading, setup_base,
1639
+ teardown_base)};
1640
+
1641
+ return cmocka_run_group_tests(tests, NULL, NULL);
1642
+ }