@reventlessdev/reventless-core 3.0.0-alpha.260 → 3.0.0-alpha.261

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 (203) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +9 -9
  3. package/src/Behavior.res +1 -4
  4. package/src/Message.res +17 -14
  5. package/src/Projection.res +51 -25
  6. package/src/RequestContext.res +8 -9
  7. package/src/ResourceAttribution.res +28 -14
  8. package/src/adapter/Adapter.res +48 -4
  9. package/src/adapter/EventLogProvisioning/EventLogProvisioning.res +5 -5
  10. package/src/adapter/Messaging/Messaging_Log_Backend.res +10 -7
  11. package/src/adapter/Messaging/Messaging_Log_Backend.res.mjs +2 -4
  12. package/src/adapter/Monitoring/Monitoring.res +16 -17
  13. package/src/adapter/QueryInterception/QueryInterception.res +0 -1
  14. package/src/adapter/Runtime/AggregateRuntime_Builder_Common.res +12 -5
  15. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +11 -7
  16. package/src/adapter/Runtime/PluginRuntime_Builder_Micro.res +1 -7
  17. package/src/adapter/Runtime/PluginRuntime_Builder_Single.res +1 -7
  18. package/src/adapter/RuntimeExtension/RuntimeExtension.res +0 -1
  19. package/src/admin/Platform_Admin.res +17 -6
  20. package/src/admin/Platform_AdminApi.res +14 -9
  21. package/src/admin/Platform_Admin_Callback.res +1 -1
  22. package/src/admin/Platform_BakedManifest.res +34 -34
  23. package/src/admin/Platform_ComponentDefinitionsApi.res +9 -21
  24. package/src/admin/Platform_PluginStructuresApi.res +15 -12
  25. package/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry.res +1 -1
  26. package/src/components/Aggregate/Aggregate.res +13 -12
  27. package/src/components/Aggregate/Aggregate_Builder.res +22 -21
  28. package/src/components/Aggregate/Aggregate_Callback.res +91 -86
  29. package/src/components/Api/ApiNoApiHelpers.res +1 -3
  30. package/src/components/Api/Api_Ids.res +0 -1
  31. package/src/components/Api/Api_Naming.res +41 -18
  32. package/src/components/Api/GraphQL_FragmentGenerator.res +38 -51
  33. package/src/components/Api/GraphQL_SchemaInspector.res +5 -3
  34. package/src/components/Api/GraphQL_Stitcher.res +9 -10
  35. package/src/components/Api/MCP_SchemaGenerator.res +8 -12
  36. package/src/components/Api/OwnerScopeDiagnostics.res +1 -2
  37. package/src/components/Api/QueryDbListQuery.res +13 -6
  38. package/src/components/Api/SchemaType.res +28 -23
  39. package/src/components/Api/SuryToJsonSchema.res +9 -10
  40. package/src/components/AutomationSlice/AutomationSlice.res +4 -4
  41. package/src/components/AutomationSlice/AutomationSlice_Builder.res +15 -14
  42. package/src/components/AutomationSlice/AutomationSlice_Callback.res +3 -3
  43. package/src/components/Builder_Helpers.res +12 -23
  44. package/src/components/CommandGenerator/CommandGenerator.res +6 -1
  45. package/src/components/CommandGenerator/CommandGenerator_Builder.res +29 -21
  46. package/src/components/CommandGenerator/CommandGenerator_Callback.res +17 -21
  47. package/src/components/CommandTopic/CommandTopic.res +3 -3
  48. package/src/components/CommandTopic/CommandTopic_Builder.res +10 -10
  49. package/src/components/CommandTopic/CommandTopic_Callback.res +1 -4
  50. package/src/components/CommandTopic/CommandTopic_Helpers.res +1 -2
  51. package/src/components/Counter/Counter_Builder.res +1 -6
  52. package/src/components/Counter/Counter_Callback.res +3 -3
  53. package/src/components/Dcb/Dcb_Builder.res +970 -956
  54. package/src/components/DcbEventLog/DcbEventLog.res +4 -4
  55. package/src/components/DcbEventLog/DcbEventLog_Builder.res +0 -1
  56. package/src/components/DcbEventLog/DcbEventLog_Operations.res +17 -18
  57. package/src/components/EventCollector/EventCollector_Builder.res +2 -1
  58. package/src/components/EventLog/EventLog.res +5 -1
  59. package/src/components/EventLog/EventLog_Operations.res +12 -8
  60. package/src/components/EventMapper/EventMapper.res +8 -10
  61. package/src/components/EventMapper/EventMapper_Builder.res +4 -1
  62. package/src/components/EventMapper/EventMapper_Callback.res +46 -31
  63. package/src/components/EventTopic/EventTopic.res +3 -3
  64. package/src/components/EventTopic/EventTopic_Builder.res +1 -1
  65. package/src/components/Extension/Extension.res +4 -1
  66. package/src/components/Extension/Extension_Operations.res +11 -3
  67. package/src/components/ExtensionPoint/ExtensionPoint.res +3 -3
  68. package/src/components/ExtensionPoint/ExtensionPoint_Builder.res +9 -10
  69. package/src/components/ExtensionPoint/ExtensionPoint_Callback.res +2 -6
  70. package/src/components/ExtensionPoint/ExtensionPoint_Operations.res +13 -5
  71. package/src/components/Heartbeat/Heartbeat_Callback.res +3 -3
  72. package/src/components/InboundTranslationSlice/InboundTranslationSlice.res +4 -4
  73. package/src/components/InboundTranslationSlice/InboundTranslationSlice_Builder.res +7 -10
  74. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice.res +4 -4
  75. package/src/components/OutboundTranslationSlice/OutboundTranslationSlice_Builder.res +15 -14
  76. package/src/components/QueryDb/QueryDb_Adapter.res +1 -3
  77. package/src/components/QueryDb/QueryDb_Operations.res +10 -10
  78. package/src/components/ReadModel/ReadModel.res +3 -3
  79. package/src/components/ReadModel/ReadModel_Builder.res +1 -2
  80. package/src/components/ReadModel/ReadModel_Callback.res +2 -1
  81. package/src/components/SideEffectHandler/SideEffectHandler_Callback.res +5 -2
  82. package/src/components/StateChangeSlice/StateChangeSlice.res +3 -3
  83. package/src/components/StateChangeSlice/StateChangeSlice_Builder.res +23 -4
  84. package/src/components/StateChangeSlice/StateChangeSlice_Callback.res +22 -6
  85. package/src/components/StateTopic.res +1 -3
  86. package/src/components/StateViewSlice/StateViewSlice.res +4 -4
  87. package/src/components/StateViewSlice/StateViewSlice_Builder.res +79 -68
  88. package/src/components/StateViewSlice/StateViewSlice_Callback.res +3 -1
  89. package/src/components/Task/Task.res +3 -3
  90. package/src/components/Task/Task_Adapter.res +4 -1
  91. package/src/components/Task/Task_Builder.res +24 -21
  92. package/src/plugin/api/PluginBaseFragment.res +9 -3
  93. package/src/plugin/component/Capability_Inference.res +8 -10
  94. package/src/plugin/component/Plugin.res +6 -6
  95. package/src/plugin/component/Plugin_Builder.res +54 -50
  96. package/src/plugin/component/Plugin_Callback.res +10 -6
  97. package/src/plugin/component/Plugin_Helpers.res +264 -230
  98. package/src/plugin/component/Plugin_Structure.res +370 -324
  99. package/src/plugin/component/Plugin_SubscriptionSchema.res +8 -6
  100. package/src/plugin/component/SchemaWalker.res +11 -12
  101. package/src/plugin/connect/PluginConnectExtension_Mapping.res +45 -50
  102. package/src/plugin/lifecycle/PluginBehavior.res +3 -4
  103. package/src/plugin/lifecycle/PluginSpec.res +1 -2
  104. package/src/plugin/lifecycle/PluginsProjection.res +16 -5
  105. package/src/plugin/lifecycle/PluginsReadModelSpec.res +0 -2
  106. package/src/util/CommandPublisher.res +9 -2
  107. package/src/util/CsvStream.res +3 -3
  108. package/src/util/Interstack.res +7 -15
  109. package/src/util/Interstack.resi +3 -3
  110. package/src/util/LogFormat.res +5 -9
  111. package/src/util/Logger.res +1 -2
  112. package/src/util/Lru.res +2 -1
  113. package/src/util/Lru.resi +2 -3
  114. package/src/util/ScheduleOps.res +24 -27
  115. package/src/util/StorePrefixCollision.res +6 -9
  116. package/src/util/Util_Promise.res +4 -1
  117. package/src/util/Util_Promise.res.mjs +1 -1
  118. package/tests/IdentityTest.res +166 -113
  119. package/tests/ResourceAttributionTest.res +28 -25
  120. package/tests/StorePrefixCollisionTest.res +2 -1
  121. package/tests/TaskBucketNamingTest.res +3 -2
  122. package/tests/adapter/EventLogProvisioningTest.res +51 -48
  123. package/tests/adapter/MonitoringTest.res +81 -38
  124. package/tests/adapter/QueryInterceptionTest.res +2 -2
  125. package/tests/adapter/RefusalVocabularyTest.res +31 -23
  126. package/tests/adapter/RuntimeExtensionHookReachTest.res +9 -8
  127. package/tests/adapter/RuntimeExtensionTest.res +5 -3
  128. package/tests/admin/AdminApiSchemaDriftTest.res +22 -16
  129. package/tests/admin/Platform_Admin_StructureTest.res +10 -11
  130. package/tests/admin/Platform_BakedManifestTest.res +31 -35
  131. package/tests/admin/Platform_ComponentDefinitionsApiTest.res +18 -15
  132. package/tests/admin/Platform_PluginStructuresApiTest.res +5 -3
  133. package/tests/admin/Platform_UIFragmentsApiTest.res +6 -3
  134. package/tests/aggregate/AggregateCacheTest.res +10 -12
  135. package/tests/aggregate/AggregateCallbackTest.res +75 -46
  136. package/tests/aggregate/AggregateCausationTest.res +19 -20
  137. package/tests/aggregate/AggregateConflictTest.res +41 -19
  138. package/tests/aggregate/AggregateFixtures.res +15 -5
  139. package/tests/aggregate/AggregateRejectionTest.res +97 -80
  140. package/tests/aggregate/AggregateSnapshotTest.res +44 -16
  141. package/tests/api/Api_IdsTest.res +10 -4
  142. package/tests/api/BrandedMarkerCompositionTest.res +48 -36
  143. package/tests/api/GeolocationSemanticTest.res +3 -3
  144. package/tests/api/GraphQL_FragmentGeneratorTest.res +66 -54
  145. package/tests/api/OwnerScopeDiagnosticsTest.res +31 -27
  146. package/tests/api/StorageRefFieldsTest.res +30 -18
  147. package/tests/api/SuryToJsonSchemaTest.res +1315 -1014
  148. package/tests/api/TaggedUnionSchemaTest.res +17 -24
  149. package/tests/commandgenerator/CommandGeneratorCallbackTest.res +235 -179
  150. package/tests/commandgenerator/CommandGeneratorFixtures.res +8 -13
  151. package/tests/commandgenerator/OwnerStampingTest.res +91 -76
  152. package/tests/commandtopic/CommandOutcomeHookTest.res +198 -155
  153. package/tests/commandtopic/CommandTopicCallbackFixtures.res +5 -4
  154. package/tests/commandtopic/CommandTopicCallbackTest.res +61 -43
  155. package/tests/commandtopic/CommandTopicHelpersRejectionTest.res +70 -55
  156. package/tests/counter/CounterCallbackTest.res +40 -34
  157. package/tests/counter/CounterFixtures.res +4 -4
  158. package/tests/dcb/DcbDecodeTest.res +115 -84
  159. package/tests/dcb/DcbEventLogOperationsTest.res +194 -143
  160. package/tests/dcb/DcbEventLogSchemaTest.res +13 -13
  161. package/tests/dcb/DcbFixtures.res +4 -5
  162. package/tests/dcb/DcbScopeInferenceTest.res +173 -114
  163. package/tests/dcb/DcbStateChangeSliceTest.res +391 -262
  164. package/tests/dcb/DcbTagTest.res +22 -11
  165. package/tests/dcb/DcbValidationTest.res +288 -218
  166. package/tests/eventlog/EventLogFixtures.res +4 -4
  167. package/tests/eventlog/EventLogOperationsTest.res +102 -67
  168. package/tests/eventlog/EventLogRetryTest.res +104 -65
  169. package/tests/eventmapper/EventMapperCallbackTest.res +118 -83
  170. package/tests/eventmapper/EventMapperFixtures.res +15 -23
  171. package/tests/eventmapper/EventMapperTest.res +54 -38
  172. package/tests/eventtopic/EventTopicFixtures.res +3 -4
  173. package/tests/eventtopic/EventTopicOperationsTest.res +41 -29
  174. package/tests/extensionpoint/ExtensionPointCallbackTest.res +58 -45
  175. package/tests/extensionpoint/ExtensionPointFixtures.res +16 -20
  176. package/tests/extensionpoint/ExtensionPointOperationsTest.res +70 -49
  177. package/tests/extensionpoint/PluginDisconnectScheduleTest.res +2 -1
  178. package/tests/logger/LogFormatTest.res +104 -82
  179. package/tests/logger/LoggerLazyTest.res +21 -12
  180. package/tests/message/MessageTest.res +96 -93
  181. package/tests/message/MetaEnvelopeTest.res +26 -30
  182. package/tests/plugin/HeartbeatDisconnectGraceTest.res +31 -25
  183. package/tests/plugin/ManifestVisibilityTest.res +20 -12
  184. package/tests/plugin/PluginDefinitionScalars.res +1 -2
  185. package/tests/plugin/PluginLifecycleCorpusTest.res +15 -12
  186. package/tests/plugin/PluginSpecExperiment.res +0 -1
  187. package/tests/plugin/PluginStructureTest.res +1529 -1045
  188. package/tests/plugin/Plugin_EventQuerySchemaTest.res +21 -10
  189. package/tests/plugin/SchemaWalkerTest.res +116 -70
  190. package/tests/plugin/StateChange/PsReserveStock.res +4 -4
  191. package/tests/plugin/StateView/PsAnnotatedView.res +4 -4
  192. package/tests/plugin/StateView/PsCustomersView.res +4 -4
  193. package/tests/plugin/StateView/PsShipmentsView.res +3 -2
  194. package/tests/projection/LifecycleTrailTest.res +1 -4
  195. package/tests/projection/ProjectionOptimizeTest.res +13 -9
  196. package/tests/querydb/QueryDbFixtures.res +0 -1
  197. package/tests/querydb/QueryDbOperationsTest.res +99 -64
  198. package/tests/querydb/TaggedUnionStampTest.res +10 -8
  199. package/tests/sideeffecthandler/SideEffectHandlerCallbackTest.res +50 -35
  200. package/tests/sideeffecthandler/SideEffectHandlerFixtures.res +4 -10
  201. package/tests/util/CommandPublisherTest.res +0 -1
  202. package/tests/util/CsvStreamTest.res +3 -3
  203. package/tests/util/LruTest.res +84 -56
@@ -5,52 +5,67 @@ let _ = beforeEach(() => reset())
5
5
 
6
6
  describe("SideEffectHandler_Callback.handleJsonEvents:", () => {
7
7
  describe("event matching registered side effect", () => {
8
- testPromise("execute called with decoded id and event", async () => {
9
- let event = TestSource.SomethingHappened({value: "hello"})
10
- let eventJson = makeEventJson("entity-1", event)
11
- await TestHandler.handleJsonEvents(Stream.fromIterable([eventJson]))->Effect.runPromise
12
- let call = capturedExecuteCalls.contents->Array.getUnsafe(0)
13
- expect((call.id, call.event))->toEqual(("entity-1", event))
14
- })
8
+ testPromise(
9
+ "execute called with decoded id and event",
10
+ async () => {
11
+ let event = TestSource.SomethingHappened({value: "hello"})
12
+ let eventJson = makeEventJson("entity-1", event)
13
+ await TestHandler.handleJsonEvents(Stream.fromIterable([eventJson]))->Effect.runPromise
14
+ let call = capturedExecuteCalls.contents->Array.getUnsafe(0)
15
+ expect((call.id, call.event))->toEqual(("entity-1", event))
16
+ },
17
+ )
15
18
  })
16
19
 
17
20
  describe("event with no matching source name", () => {
18
- testPromise("execute not called, no error", async () => {
19
- let event = TestSource.SomethingHappened({value: "ignored"})
20
- let eventJson = makeEventJson(~service="UnknownService", "entity-1", event)
21
- await TestHandler.handleJsonEvents(Stream.fromIterable([eventJson]))->Effect.runPromise
22
- expect(capturedExecuteCalls.contents->Array.length)->toBe(0)
23
- })
21
+ testPromise(
22
+ "execute not called, no error",
23
+ async () => {
24
+ let event = TestSource.SomethingHappened({value: "ignored"})
25
+ let eventJson = makeEventJson(~service="UnknownService", "entity-1", event)
26
+ await TestHandler.handleJsonEvents(Stream.fromIterable([eventJson]))->Effect.runPromise
27
+ expect(capturedExecuteCalls.contents->Array.length)->toBe(0)
28
+ },
29
+ )
24
30
  })
25
31
 
26
32
  describe("event with malformed JSON", () => {
27
- testPromise("caught gracefully — does not throw, execute not called", async () => {
28
- let invalidJson = JSON.Encode.string("not-an-object")
29
- await TestHandler.handleJsonEvents(Stream.fromIterable([invalidJson]))->Effect.runPromise
30
- expect(capturedExecuteCalls.contents->Array.length)->toBe(0)
31
- })
33
+ testPromise(
34
+ "caught gracefully — does not throw, execute not called",
35
+ async () => {
36
+ let invalidJson = JSON.Encode.string("not-an-object")
37
+ await TestHandler.handleJsonEvents(Stream.fromIterable([invalidJson]))->Effect.runPromise
38
+ expect(capturedExecuteCalls.contents->Array.length)->toBe(0)
39
+ },
40
+ )
32
41
  })
33
42
 
34
43
  describe("execute throws", () => {
35
- testPromise("error caught per-event, other events still processed", async () => {
36
- // First event causes execute to throw; second event processes normally
37
- executeThrowOnCall := 1
38
- let event = TestSource.SomethingHappened({value: "v"})
39
- let event1 = makeEventJson("entity-1", event)
40
- let event2 = makeEventJson("entity-2", event)
41
- await TestHandler.handleJsonEvents(Stream.fromIterable([event1, event2]))->Effect.runPromise
42
- // entity-2 should still be captured (first event threw)
43
- expect(capturedExecuteCalls.contents->Array.length)->toBe(1)
44
- expect((capturedExecuteCalls.contents->Array.getUnsafe(0)).id)->toBe("entity-2")
45
- })
44
+ testPromise(
45
+ "error caught per-event, other events still processed",
46
+ async () => {
47
+ // First event causes execute to throw; second event processes normally
48
+ executeThrowOnCall := 1
49
+ let event = TestSource.SomethingHappened({value: "v"})
50
+ let event1 = makeEventJson("entity-1", event)
51
+ let event2 = makeEventJson("entity-2", event)
52
+ await TestHandler.handleJsonEvents(Stream.fromIterable([event1, event2]))->Effect.runPromise
53
+ // entity-2 should still be captured (first event threw)
54
+ expect(capturedExecuteCalls.contents->Array.length)->toBe(1)
55
+ expect((capturedExecuteCalls.contents->Array.getUnsafe(0)).id)->toBe("entity-2")
56
+ },
57
+ )
46
58
  })
47
59
 
48
60
  describe("multiple events in batch", () => {
49
- testPromise("each handled independently", async () => {
50
- let event = TestSource.SomethingHappened({value: "v"})
51
- let events = ["entity-1", "entity-2", "entity-3"]->Array.map(id => makeEventJson(id, event))
52
- await TestHandler.handleJsonEvents(Stream.fromIterable(events))->Effect.runPromise
53
- expect(capturedExecuteCalls.contents->Array.length)->toBe(3)
54
- })
61
+ testPromise(
62
+ "each handled independently",
63
+ async () => {
64
+ let event = TestSource.SomethingHappened({value: "v"})
65
+ let events = ["entity-1", "entity-2", "entity-3"]->Array.map(id => makeEventJson(id, event))
66
+ await TestHandler.handleJsonEvents(Stream.fromIterable(events))->Effect.runPromise
67
+ expect(capturedExecuteCalls.contents->Array.length)->toBe(3)
68
+ },
69
+ )
55
70
  })
56
71
  })
@@ -1,4 +1,3 @@
1
-
2
1
  // ─────────────────────────────────────────────────────────────
3
2
  // Event source spec for SideEffect
4
3
  // ─────────────────────────────────────────────────────────────
@@ -8,7 +7,7 @@ module TestSource = {
8
7
  let name = "TestSideEffectSource"
9
8
 
10
9
  @schema
11
- type event = | SomethingHappened({value: string})
10
+ type event = SomethingHappened({value: string})
12
11
  }
13
12
 
14
13
  // ─────────────────────────────────────────────────────────────
@@ -18,7 +17,7 @@ module TestSource = {
18
17
  type executeCall = {id: string, event: TestSource.event}
19
18
 
20
19
  let capturedExecuteCalls: ref<array<executeCall>> = ref([])
21
- let executeThrowOnCall = ref(0) // throw on this call number (1-based); 0 = never throw
20
+ let executeThrowOnCall = ref(0) // throw on this call number (1-based); 0 = never throw
22
21
  let executeCallCount = ref(0)
23
22
 
24
23
  // ─────────────────────────────────────────────────────────────
@@ -35,9 +34,7 @@ module TestSideEffect: Reventless.SideEffect.T = {
35
34
  JsError.throwWithMessage("side effect failed")
36
35
  }
37
36
  capturedExecuteCalls :=
38
- capturedExecuteCalls.contents->Array.concat([
39
- {id: id->TestSource.Id.toString, event},
40
- ])
37
+ capturedExecuteCalls.contents->Array.concat([{id: id->TestSource.Id.toString, event}])
41
38
  }
42
39
  }
43
40
 
@@ -79,10 +76,7 @@ let testMeta: Message.meta = {
79
76
  let makeEventJson = (~service=TestSource.name, id, event): JSON.t =>
80
77
  [
81
78
  ("id", JSON.Encode.string(id)),
82
- (
83
- "meta",
84
- {...testMeta, service: service}->Message.encode(Message.metaSchema),
85
- ),
79
+ ("meta", {...testMeta, service}->Message.encode(Message.metaSchema)),
86
80
  ("event", event->Message.encode(TestSource.eventSchema)),
87
81
  ]
88
82
  ->Dict.fromArray
@@ -11,7 +11,6 @@
11
11
 
12
12
  open JestGlobals
13
13
 
14
-
15
14
  let published: ref<array<Reventless.Message.commandJson>> = ref([])
16
15
 
17
16
  module TestSpec = {
@@ -37,9 +37,9 @@ describe("CsvStream.parseRows", () => {
37
37
  ->Array.join("\n")
38
38
  let path = writeTempCsv("name\n" ++ dataRows)
39
39
  let result = await CsvStream.parseRows(~path)
40
- ->Stream.take(2)
41
- ->Stream.runCollect
42
- ->Effect.runPromise
40
+ ->Stream.take(2)
41
+ ->Stream.runCollect
42
+ ->Effect.runPromise
43
43
  expect(result->Array.length)->toBe(2)
44
44
  })
45
45
 
@@ -2,72 +2,100 @@ open JestGlobals
2
2
 
3
3
  describe("Lru:", () => {
4
4
  describe("get / put", () => {
5
- testSync("get on an empty cache misses", () => {
6
- let cache = Lru.make(~capacity=2)
7
- expect(cache->Lru.get("a"))->toEqual(None)
8
- })
5
+ testSync(
6
+ "get on an empty cache misses",
7
+ () => {
8
+ let cache = Lru.make(~capacity=2)
9
+ expect(cache->Lru.get("a"))->toEqual(None)
10
+ },
11
+ )
9
12
 
10
- testSync("put then get returns the stored value", () => {
11
- let cache = Lru.make(~capacity=2)
12
- cache->Lru.put("a", 1)
13
- expect(cache->Lru.get("a"))->toEqual(Some(1))
14
- })
13
+ testSync(
14
+ "put then get returns the stored value",
15
+ () => {
16
+ let cache = Lru.make(~capacity=2)
17
+ cache->Lru.put("a", 1)
18
+ expect(cache->Lru.get("a"))->toEqual(Some(1))
19
+ },
20
+ )
15
21
 
16
- testSync("put on an existing key overwrites", () => {
17
- let cache = Lru.make(~capacity=2)
18
- cache->Lru.put("a", 1)
19
- cache->Lru.put("a", 2)
20
- expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((Some(2), 1))
21
- })
22
+ testSync(
23
+ "put on an existing key overwrites",
24
+ () => {
25
+ let cache = Lru.make(~capacity=2)
26
+ cache->Lru.put("a", 1)
27
+ cache->Lru.put("a", 2)
28
+ expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((Some(2), 1))
29
+ },
30
+ )
22
31
 
23
- testSync("invalidate removes a key", () => {
24
- let cache = Lru.make(~capacity=2)
25
- cache->Lru.put("a", 1)
26
- cache->Lru.invalidate("a")
27
- expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((None, 0))
28
- })
32
+ testSync(
33
+ "invalidate removes a key",
34
+ () => {
35
+ let cache = Lru.make(~capacity=2)
36
+ cache->Lru.put("a", 1)
37
+ cache->Lru.invalidate("a")
38
+ expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((None, 0))
39
+ },
40
+ )
29
41
  })
30
42
 
31
43
  describe("eviction", () => {
32
- testSync("evicts the least-recently-used entry past capacity", () => {
33
- let cache = Lru.make(~capacity=2)
34
- cache->Lru.put("a", 1)
35
- cache->Lru.put("b", 2)
36
- cache->Lru.put("c", 3) // evicts "a" (oldest)
37
- expect((cache->Lru.get("a"), cache->Lru.get("b"), cache->Lru.get("c"), cache->Lru.size))->toEqual((
38
- None,
39
- Some(2),
40
- Some(3),
41
- 2,
42
- ))
43
- })
44
+ testSync(
45
+ "evicts the least-recently-used entry past capacity",
46
+ () => {
47
+ let cache = Lru.make(~capacity=2)
48
+ cache->Lru.put("a", 1)
49
+ cache->Lru.put("b", 2)
50
+ cache->Lru.put("c", 3) // evicts "a" (oldest)
51
+ expect((
52
+ cache->Lru.get("a"),
53
+ cache->Lru.get("b"),
54
+ cache->Lru.get("c"),
55
+ cache->Lru.size,
56
+ ))->toEqual((None, Some(2), Some(3), 2))
57
+ },
58
+ )
44
59
 
45
- testSync("get refreshes recency so a touched key survives eviction", () => {
46
- let cache = Lru.make(~capacity=2)
47
- cache->Lru.put("a", 1)
48
- cache->Lru.put("b", 2)
49
- let _ = cache->Lru.get("a") // "a" is now most-recently-used
50
- cache->Lru.put("c", 3) // evicts "b", not "a"
51
- expect((cache->Lru.get("a"), cache->Lru.get("b"), cache->Lru.get("c")))->toEqual((
52
- Some(1),
53
- None,
54
- Some(3),
55
- ))
56
- })
60
+ testSync(
61
+ "get refreshes recency so a touched key survives eviction",
62
+ () => {
63
+ let cache = Lru.make(~capacity=2)
64
+ cache->Lru.put("a", 1)
65
+ cache->Lru.put("b", 2)
66
+ let _ = cache->Lru.get("a") // "a" is now most-recently-used
67
+ cache->Lru.put("c", 3) // evicts "b", not "a"
68
+ expect((cache->Lru.get("a"), cache->Lru.get("b"), cache->Lru.get("c")))->toEqual((
69
+ Some(1),
70
+ None,
71
+ Some(3),
72
+ ))
73
+ },
74
+ )
57
75
 
58
- testSync("101 distinct keys against capacity 100 keeps exactly 100", () => {
59
- let cache = Lru.make(~capacity=100)
60
- // 101 distinct keys: 0..100 inclusive.
61
- Array.fromInitializer(~length=101, i => i)->Array.forEach(i => cache->Lru.put(i, i))
62
- expect((cache->Lru.size, cache->Lru.get(0), cache->Lru.get(100)))->toEqual((100, None, Some(100)))
63
- })
76
+ testSync(
77
+ "101 distinct keys against capacity 100 keeps exactly 100",
78
+ () => {
79
+ let cache = Lru.make(~capacity=100)
80
+ // 101 distinct keys: 0..100 inclusive.
81
+ Array.fromInitializer(~length=101, i => i)->Array.forEach(i => cache->Lru.put(i, i))
82
+ expect((cache->Lru.size, cache->Lru.get(0), cache->Lru.get(100)))->toEqual((
83
+ 100,
84
+ None,
85
+ Some(100),
86
+ ))
87
+ },
88
+ )
64
89
  })
65
90
 
66
91
  describe("disabled cache (capacity <= 0)", () => {
67
- testSync("never stores", () => {
68
- let cache = Lru.make(~capacity=0)
69
- cache->Lru.put("a", 1)
70
- expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((None, 0))
71
- })
92
+ testSync(
93
+ "never stores",
94
+ () => {
95
+ let cache = Lru.make(~capacity=0)
96
+ cache->Lru.put("a", 1)
97
+ expect((cache->Lru.get("a"), cache->Lru.size))->toEqual((None, 0))
98
+ },
99
+ )
72
100
  })
73
101
  })