@synnaxlabs/x 0.42.3 → 0.44.0

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 (337) hide show
  1. package/.turbo/turbo-build.log +78 -78
  2. package/.vscode/settings.json +4 -6
  3. package/README.md +1 -7
  4. package/dist/array.cjs +1 -0
  5. package/dist/array.js +7 -0
  6. package/dist/binary.cjs +1 -1
  7. package/dist/binary.js +1 -1
  8. package/dist/bounds-D6e9xoHt.cjs +1 -0
  9. package/dist/bounds-Dj9nG39I.js +174 -0
  10. package/dist/bounds.cjs +1 -1
  11. package/dist/bounds.js +1 -1
  12. package/dist/{box-0YrQibkB.cjs → box-BcGdqkt4.cjs} +1 -1
  13. package/dist/{box-Cc8IzcNo.js → box-D_qdUyEe.js} +2 -2
  14. package/dist/box.cjs +1 -1
  15. package/dist/box.js +1 -1
  16. package/dist/caseconv.cjs +1 -1
  17. package/dist/caseconv.js +1 -1
  18. package/dist/compare.cjs +1 -1
  19. package/dist/compare.js +1 -1
  20. package/dist/deep.cjs +1 -1
  21. package/dist/deep.js +100 -88
  22. package/dist/{direction-C-b6XTeU.cjs → direction-386XDm2w.cjs} +1 -1
  23. package/dist/{direction-BL0PhD1k.js → direction-8etxfKaR.js} +4 -3
  24. package/dist/direction.cjs +1 -1
  25. package/dist/direction.js +1 -1
  26. package/dist/external-B9AAGv50.cjs +1 -0
  27. package/dist/external-BFgJjMcS.js +23 -0
  28. package/dist/{external-DqPrWKvU.js → external-BYuXBYJh.js} +10 -17
  29. package/dist/external-mffsMzJx.cjs +1 -0
  30. package/dist/index-B1m2qvBT.cjs +1 -0
  31. package/dist/index-B5l_quQn.js +92 -0
  32. package/dist/index-BQe8OIgm.cjs +3 -0
  33. package/dist/index-D2xcvEO5.js +46 -0
  34. package/dist/index-DdhM_E4k.cjs +1 -0
  35. package/dist/{index-QGplUHuy.js → index-PNh31WTW.js} +64 -37
  36. package/dist/index.cjs +3 -3
  37. package/dist/index.js +472 -428
  38. package/dist/kv.cjs +1 -1
  39. package/dist/kv.js +1 -1
  40. package/dist/{location-C3aeu046.js → location-Ar5y2DX2.js} +1 -1
  41. package/dist/{location-BGl5Ddds.cjs → location-DZi8ftXp.cjs} +1 -1
  42. package/dist/location.cjs +1 -1
  43. package/dist/location.js +1 -1
  44. package/dist/observe.cjs +1 -1
  45. package/dist/observe.js +16 -20
  46. package/dist/path-BXdMenka.js +101 -0
  47. package/dist/path-st_E5-LJ.cjs +1 -0
  48. package/dist/position-DAL0Qqdf.cjs +1 -0
  49. package/dist/position-bA6pUwLn.js +85 -0
  50. package/dist/position.cjs +1 -1
  51. package/dist/position.js +1 -1
  52. package/dist/record-CAcQ5PNX.js +14 -0
  53. package/dist/record-YvCh7bzB.cjs +1 -0
  54. package/dist/record.cjs +1 -1
  55. package/dist/record.js +2 -10
  56. package/dist/scale-Bzn1Cl0r.cjs +1 -0
  57. package/dist/{scale-DfJe9755.js → scale-CdTNWu-d.js} +55 -59
  58. package/dist/scale.cjs +1 -1
  59. package/dist/scale.js +1 -1
  60. package/dist/series-BeJyqCoP.js +2568 -0
  61. package/dist/series-anlpaR_I.cjs +6 -0
  62. package/dist/spatial.cjs +1 -1
  63. package/dist/spatial.js +6 -6
  64. package/dist/src/array/index.d.ts +2 -0
  65. package/dist/src/array/index.d.ts.map +1 -0
  66. package/dist/src/array/toArray.d.ts +19 -0
  67. package/dist/src/array/toArray.d.ts.map +1 -0
  68. package/dist/src/array/toArray.spec.d.ts +2 -0
  69. package/dist/src/array/toArray.spec.d.ts.map +1 -0
  70. package/dist/src/binary/codec.d.ts +7 -15
  71. package/dist/src/binary/codec.d.ts.map +1 -1
  72. package/dist/src/breaker/breaker.d.ts +5 -5
  73. package/dist/src/breaker/breaker.d.ts.map +1 -1
  74. package/dist/src/caseconv/caseconv.d.ts +0 -1
  75. package/dist/src/caseconv/caseconv.d.ts.map +1 -1
  76. package/dist/src/change/change.d.ts +2 -2
  77. package/dist/src/change/change.d.ts.map +1 -1
  78. package/dist/src/color/color.d.ts +60 -36
  79. package/dist/src/color/color.d.ts.map +1 -1
  80. package/dist/src/color/external.d.ts +0 -1
  81. package/dist/src/color/external.d.ts.map +1 -1
  82. package/dist/src/color/gradient.d.ts +6 -6
  83. package/dist/src/color/gradient.d.ts.map +1 -1
  84. package/dist/src/color/palette.d.ts +9 -9
  85. package/dist/src/color/palette.d.ts.map +1 -1
  86. package/dist/src/compare/compare.d.ts +8 -8
  87. package/dist/src/compare/compare.d.ts.map +1 -1
  88. package/dist/src/control/control.d.ts +39 -39
  89. package/dist/src/control/control.d.ts.map +1 -1
  90. package/dist/src/debounce/debounce.d.ts +1 -1
  91. package/dist/src/debounce/debounce.d.ts.map +1 -1
  92. package/dist/src/deep/delete.d.ts +1 -1
  93. package/dist/src/deep/delete.d.ts.map +1 -1
  94. package/dist/src/deep/difference.d.ts.map +1 -1
  95. package/dist/src/deep/equal.d.ts +4 -4
  96. package/dist/src/deep/equal.d.ts.map +1 -1
  97. package/dist/src/deep/merge.d.ts.map +1 -1
  98. package/dist/src/deep/path.d.ts +6 -6
  99. package/dist/src/deep/path.d.ts.map +1 -1
  100. package/dist/src/destructor.d.ts +6 -2
  101. package/dist/src/destructor.d.ts.map +1 -1
  102. package/dist/src/errors/errors.d.ts +65 -35
  103. package/dist/src/errors/errors.d.ts.map +1 -1
  104. package/dist/src/flush.d.ts +11 -0
  105. package/dist/src/flush.d.ts.map +1 -0
  106. package/dist/src/id/id.d.ts +1 -0
  107. package/dist/src/id/id.d.ts.map +1 -1
  108. package/dist/src/identity.d.ts +2 -2
  109. package/dist/src/identity.d.ts.map +1 -1
  110. package/dist/src/index.d.ts +7 -2
  111. package/dist/src/index.d.ts.map +1 -1
  112. package/dist/src/instance/index.d.ts +2 -0
  113. package/dist/src/instance/index.d.ts.map +1 -0
  114. package/dist/src/instance/matcher.d.ts +79 -0
  115. package/dist/src/instance/matcher.d.ts.map +1 -0
  116. package/dist/src/instance/matcher.spec.d.ts +2 -0
  117. package/dist/src/instance/matcher.spec.d.ts.map +1 -0
  118. package/dist/src/jsonrpc/jsonrpc.d.ts +39 -8
  119. package/dist/src/jsonrpc/jsonrpc.d.ts.map +1 -1
  120. package/dist/src/kv/types.d.ts +1 -1
  121. package/dist/src/kv/types.d.ts.map +1 -1
  122. package/dist/src/map/index.d.ts +2 -0
  123. package/dist/src/map/index.d.ts.map +1 -0
  124. package/dist/src/map/map.d.ts +2 -0
  125. package/dist/src/map/map.d.ts.map +1 -0
  126. package/dist/src/map/map.spec.d.ts +2 -0
  127. package/dist/src/map/map.spec.d.ts.map +1 -0
  128. package/dist/src/math/math.d.ts +2 -4
  129. package/dist/src/math/math.d.ts.map +1 -1
  130. package/dist/src/migrate/migrate.d.ts +4 -4
  131. package/dist/src/migrate/migrate.d.ts.map +1 -1
  132. package/dist/src/optional.d.ts +0 -3
  133. package/dist/src/optional.d.ts.map +1 -1
  134. package/dist/src/primitive/index.d.ts +2 -0
  135. package/dist/src/primitive/index.d.ts.map +1 -0
  136. package/dist/src/primitive/primitive.d.ts +39 -0
  137. package/dist/src/primitive/primitive.d.ts.map +1 -0
  138. package/dist/src/primitive/primitive.spec.d.ts +2 -0
  139. package/dist/src/primitive/primitive.spec.d.ts.map +1 -0
  140. package/dist/src/record/index.d.ts +2 -0
  141. package/dist/src/record/index.d.ts.map +1 -0
  142. package/dist/src/record/record.d.ts +90 -0
  143. package/dist/src/record/record.d.ts.map +1 -0
  144. package/dist/src/record/record.spec.d.ts.map +1 -0
  145. package/dist/src/renderable.d.ts +1 -1
  146. package/dist/src/renderable.d.ts.map +1 -1
  147. package/dist/src/replace.d.ts.map +1 -1
  148. package/dist/src/runtime/detect.d.ts.map +1 -1
  149. package/dist/src/spatial/base.d.ts +9 -9
  150. package/dist/src/spatial/base.d.ts.map +1 -1
  151. package/dist/src/spatial/bounds/bounds.d.ts +82 -16
  152. package/dist/src/spatial/bounds/bounds.d.ts.map +1 -1
  153. package/dist/src/spatial/box/box.d.ts +6 -6
  154. package/dist/src/spatial/box/box.d.ts.map +1 -1
  155. package/dist/src/spatial/dimensions/dimensions.d.ts +4 -4
  156. package/dist/src/spatial/dimensions/dimensions.d.ts.map +1 -1
  157. package/dist/src/spatial/direction/direction.d.ts +2 -2
  158. package/dist/src/spatial/direction/direction.d.ts.map +1 -1
  159. package/dist/src/spatial/location/location.d.ts +3 -3
  160. package/dist/src/spatial/location/location.d.ts.map +1 -1
  161. package/dist/src/spatial/scale/scale.d.ts +10 -10
  162. package/dist/src/spatial/scale/scale.d.ts.map +1 -1
  163. package/dist/src/spatial/xy/xy.d.ts +4 -4
  164. package/dist/src/spatial/xy/xy.d.ts.map +1 -1
  165. package/dist/src/status/index.d.ts +2 -0
  166. package/dist/src/status/index.d.ts.map +1 -0
  167. package/dist/src/status/status.d.ts +42 -0
  168. package/dist/src/status/status.d.ts.map +1 -0
  169. package/dist/src/status/status.spec.d.ts +2 -0
  170. package/dist/src/status/status.spec.d.ts.map +1 -0
  171. package/dist/src/strings/strings.d.ts +16 -0
  172. package/dist/src/strings/strings.d.ts.map +1 -1
  173. package/dist/src/sync/index.d.ts.map +1 -1
  174. package/dist/src/sync/mutex.d.ts +0 -1
  175. package/dist/src/sync/mutex.d.ts.map +1 -1
  176. package/dist/src/telem/series.d.ts +473 -66
  177. package/dist/src/telem/series.d.ts.map +1 -1
  178. package/dist/src/telem/telem.d.ts +274 -61
  179. package/dist/src/telem/telem.d.ts.map +1 -1
  180. package/dist/src/testutil/testutil.d.ts +1 -0
  181. package/dist/src/testutil/testutil.d.ts.map +1 -1
  182. package/dist/src/testutil/testutil.spec.d.ts +2 -0
  183. package/dist/src/testutil/testutil.spec.d.ts.map +1 -0
  184. package/dist/src/uuid/index.d.ts +2 -0
  185. package/dist/src/uuid/index.d.ts.map +1 -0
  186. package/dist/src/uuid/uuid.d.ts +35 -0
  187. package/dist/src/uuid/uuid.d.ts.map +1 -0
  188. package/dist/src/uuid/uuid.spec.d.ts +2 -0
  189. package/dist/src/uuid/uuid.spec.d.ts.map +1 -0
  190. package/dist/src/zod/external.d.ts +2 -1
  191. package/dist/src/zod/external.d.ts.map +1 -1
  192. package/dist/src/zod/nullToUndefined.d.ts +3 -0
  193. package/dist/src/zod/nullToUndefined.d.ts.map +1 -0
  194. package/dist/src/zod/nullToUndefined.spec.d.ts +2 -0
  195. package/dist/src/zod/nullToUndefined.spec.d.ts.map +1 -0
  196. package/dist/src/zod/toArray.d.ts +3 -0
  197. package/dist/src/zod/toArray.d.ts.map +1 -0
  198. package/dist/src/zod/toArray.spec.d.ts +2 -0
  199. package/dist/src/zod/toArray.spec.d.ts.map +1 -0
  200. package/dist/src/zod/util.d.ts +1 -1
  201. package/dist/src/zod/util.d.ts.map +1 -1
  202. package/dist/telem.cjs +1 -1
  203. package/dist/telem.js +10 -11
  204. package/dist/url.cjs +1 -1
  205. package/dist/url.js +16 -19
  206. package/dist/worker.cjs +1 -1
  207. package/dist/worker.js +18 -22
  208. package/dist/zod.cjs +1 -1
  209. package/dist/zod.js +1 -1
  210. package/eslint.config.js +1 -1
  211. package/package.json +20 -23
  212. package/src/array/index.ts +10 -0
  213. package/src/array/toArray.spec.ts +56 -0
  214. package/src/array/toArray.ts +28 -0
  215. package/src/binary/codec.spec.ts +200 -277
  216. package/src/binary/codec.ts +19 -75
  217. package/src/breaker/breaker.ts +2 -2
  218. package/src/caseconv/caseconv.ts +14 -14
  219. package/src/change/change.ts +1 -1
  220. package/src/color/color.spec.ts +113 -2
  221. package/src/color/color.ts +88 -58
  222. package/src/color/external.ts +0 -1
  223. package/src/color/gradient.ts +19 -27
  224. package/src/compare/compare.ts +10 -10
  225. package/src/control/control.ts +22 -19
  226. package/src/debounce/debounce.ts +1 -1
  227. package/src/deep/delete.ts +5 -4
  228. package/src/deep/difference.ts +6 -2
  229. package/src/deep/equal.spec.ts +1 -1
  230. package/src/deep/equal.ts +5 -5
  231. package/src/deep/merge.spec.ts +1 -2
  232. package/src/deep/merge.ts +15 -6
  233. package/src/deep/path.spec.ts +41 -0
  234. package/src/deep/path.ts +48 -17
  235. package/src/destructor.ts +6 -2
  236. package/src/errors/errors.spec.ts +20 -20
  237. package/src/errors/errors.ts +67 -43
  238. package/src/flush.ts +21 -0
  239. package/src/id/id.spec.ts +1 -1
  240. package/src/id/id.ts +3 -1
  241. package/src/identity.ts +2 -2
  242. package/src/index.ts +7 -2
  243. package/src/instance/index.ts +10 -0
  244. package/src/instance/matcher.spec.ts +78 -0
  245. package/src/instance/matcher.ts +98 -0
  246. package/src/jsonrpc/jsonrpc.spec.ts +2 -1
  247. package/src/jsonrpc/jsonrpc.ts +35 -6
  248. package/src/map/index.ts +10 -0
  249. package/src/map/map.spec.ts +132 -0
  250. package/src/map/map.ts +17 -0
  251. package/src/math/math.ts +19 -27
  252. package/src/migrate/migrate.spec.ts +1 -1
  253. package/src/migrate/migrate.ts +7 -7
  254. package/src/optional.ts +0 -4
  255. package/src/primitive/index.ts +10 -0
  256. package/src/primitive/primitive.spec.ts +126 -0
  257. package/src/primitive/primitive.ts +82 -0
  258. package/src/record/index.ts +10 -0
  259. package/src/record/record.spec.ts +319 -0
  260. package/src/record/record.ts +118 -0
  261. package/src/renderable.ts +1 -1
  262. package/src/replace.ts +9 -0
  263. package/src/runtime/detect.ts +0 -2
  264. package/src/spatial/bounds/bounds.spec.ts +20 -0
  265. package/src/spatial/bounds/bounds.ts +101 -18
  266. package/src/spatial/dimensions/dimensions.ts +2 -2
  267. package/src/spatial/direction/direction.ts +1 -1
  268. package/src/status/index.ts +10 -0
  269. package/src/status/status.spec.ts +25 -0
  270. package/src/status/status.ts +91 -0
  271. package/src/strings/strings.spec.ts +51 -13
  272. package/src/strings/strings.ts +20 -0
  273. package/src/sync/index.ts +9 -0
  274. package/src/sync/mutex.ts +9 -4
  275. package/src/telem/series.spec.ts +912 -105
  276. package/src/telem/series.ts +577 -201
  277. package/src/telem/telem.spec.ts +262 -90
  278. package/src/telem/telem.ts +335 -125
  279. package/src/testutil/testutil.spec.ts +161 -0
  280. package/src/testutil/testutil.ts +12 -0
  281. package/src/uuid/index.ts +10 -0
  282. package/src/uuid/uuid.spec.ts +82 -0
  283. package/src/uuid/uuid.ts +48 -0
  284. package/src/zod/external.ts +2 -1
  285. package/src/zod/nullToUndefined.spec.ts +31 -0
  286. package/src/zod/nullToUndefined.ts +23 -0
  287. package/src/zod/toArray.spec.ts +182 -0
  288. package/src/{toArray.ts → zod/toArray.ts} +3 -4
  289. package/src/zod/util.spec.ts +1 -1
  290. package/src/zod/util.ts +7 -7
  291. package/tsconfig.json +1 -1
  292. package/tsconfig.tsbuildinfo +1 -1
  293. package/vite.config.ts +2 -3
  294. package/dist/bounds-BQo7rvs9.cjs +0 -1
  295. package/dist/bounds-Bn5_l4Z3.js +0 -173
  296. package/dist/external-C-dNgNQw.cjs +0 -1
  297. package/dist/external-C8TFju8Q.js +0 -29
  298. package/dist/external-DWQITF5_.cjs +0 -1
  299. package/dist/index-BywOGO8U.js +0 -1074
  300. package/dist/index-CYYjI7Uf.cjs +0 -1
  301. package/dist/index-C_6NXBlg.cjs +0 -3
  302. package/dist/index-Dd8DLyMx.cjs +0 -1
  303. package/dist/index-DizUWH6z.js +0 -47
  304. package/dist/path-1tZLZ4AN.cjs +0 -1
  305. package/dist/path-DD6ytXzr.js +0 -76
  306. package/dist/position-Cai5-wi1.cjs +0 -1
  307. package/dist/position-DIglP1l2.js +0 -85
  308. package/dist/scale-BtZINJ-A.cjs +0 -1
  309. package/dist/search.cjs +0 -1
  310. package/dist/search.js +0 -14
  311. package/dist/series-B9JERcqi.js +0 -1977
  312. package/dist/series-DqJ6f97G.cjs +0 -11
  313. package/dist/src/color/transformColorsToHex.d.ts +0 -6
  314. package/dist/src/color/transformColorsToHex.d.ts.map +0 -1
  315. package/dist/src/primitive.d.ts +0 -9
  316. package/dist/src/primitive.d.ts.map +0 -1
  317. package/dist/src/record.d.ts +0 -18
  318. package/dist/src/record.d.ts.map +0 -1
  319. package/dist/src/record.spec.d.ts.map +0 -1
  320. package/dist/src/search.d.ts +0 -18
  321. package/dist/src/search.d.ts.map +0 -1
  322. package/dist/src/toArray.d.ts +0 -3
  323. package/dist/src/toArray.d.ts.map +0 -1
  324. package/dist/src/zod/integer.d.ts +0 -10
  325. package/dist/src/zod/integer.d.ts.map +0 -1
  326. package/dist/src/zod/integer.spec.d.ts +0 -2
  327. package/dist/src/zod/integer.spec.d.ts.map +0 -1
  328. package/dist/toArray.cjs +0 -1
  329. package/dist/toArray.js +0 -5
  330. package/src/color/transformColorsToHex.ts +0 -30
  331. package/src/primitive.ts +0 -46
  332. package/src/record.spec.ts +0 -38
  333. package/src/record.ts +0 -47
  334. package/src/search.ts +0 -42
  335. package/src/zod/integer.spec.ts +0 -148
  336. package/src/zod/integer.ts +0 -38
  337. /package/dist/src/{record.spec.d.ts → record/record.spec.d.ts} +0 -0
@@ -11,6 +11,7 @@ import { describe, expect, it, test } from "vitest";
11
11
 
12
12
  import { binary } from "@/binary";
13
13
  import {
14
+ addSamples,
14
15
  type CrudeDataType,
15
16
  DataType,
16
17
  Density,
@@ -25,22 +26,22 @@ import {
25
26
  describe("TimeStamp", () => {
26
27
  test("construct", () => {
27
28
  const ts = new TimeStamp(1000);
28
- expect(ts.equals(TimeSpan.MICROSECOND)).toBeTruthy();
29
+ expect(ts.equals(TimeSpan.MICROSECOND)).toBe(true);
29
30
  });
30
31
 
31
32
  test("construct from NaN", () => {
32
33
  const ts = new TimeStamp(NaN);
33
- expect(ts.isZero).toBeTruthy();
34
+ expect(ts.isZero).toBe(true);
34
35
  });
35
36
 
36
37
  test("construct from infinity", () => {
37
38
  const ts = new TimeStamp(Infinity);
38
- expect(ts.equals(TimeStamp.MAX)).toBeTruthy();
39
+ expect(ts.equals(TimeStamp.MAX)).toBe(true);
39
40
  });
40
41
 
41
42
  test("construct from negative infinity", () => {
42
43
  const ts = new TimeStamp(-Infinity);
43
- expect(ts.equals(TimeStamp.MIN)).toBeTruthy();
44
+ expect(ts.equals(TimeStamp.MIN)).toBe(true);
44
45
  });
45
46
 
46
47
  test("toString", () => {
@@ -59,24 +60,24 @@ describe("TimeStamp", () => {
59
60
 
60
61
  test("construct from TimeStamp", () => {
61
62
  const ts = new TimeStamp(TimeSpan.microseconds(10));
62
- expect(ts.equals(TimeSpan.microseconds(10))).toBeTruthy();
63
+ expect(ts.equals(TimeSpan.microseconds(10))).toBe(true);
63
64
  });
64
65
 
65
66
  test("construct from local TimeZone", () => {
66
67
  const ts = new TimeStamp(TimeSpan.microseconds(10), "local");
67
- expect(ts.equals(TimeSpan.microseconds(10).add(TimeStamp.utcOffset))).toBeTruthy();
68
+ expect(ts.equals(TimeSpan.microseconds(10).add(TimeStamp.utcOffset))).toBe(true);
68
69
  });
69
70
 
70
71
  test("construct from time string", () => {
71
72
  const ts = new TimeStamp("12:30", "UTC");
72
73
  expect(ts.date().getUTCHours()).toEqual(12);
73
- expect(ts.equals(TimeSpan.hours(12).add(TimeSpan.minutes(30)))).toBeTruthy();
74
+ expect(ts.equals(TimeSpan.hours(12).add(TimeSpan.minutes(30)))).toBe(true);
74
75
  const ts2 = new TimeStamp("12:30:00.22");
75
76
  expect(
76
77
  ts2.equals(
77
78
  TimeSpan.hours(12).add(TimeSpan.minutes(30).add(TimeSpan.milliseconds(22))),
78
79
  ),
79
- ).toBeTruthy();
80
+ ).toBe(true);
80
81
  const ts3 = new TimeStamp("12:30:00.22", "local");
81
82
  expect(
82
83
  ts3.equals(
@@ -84,7 +85,7 @@ describe("TimeStamp", () => {
84
85
  .add(TimeSpan.minutes(30).add(TimeSpan.milliseconds(22)))
85
86
  .add(TimeStamp.utcOffset),
86
87
  ),
87
- ).toBeTruthy();
88
+ ).toBe(true);
88
89
  });
89
90
 
90
91
  test("construct from date", () => {
@@ -108,16 +109,88 @@ describe("TimeStamp", () => {
108
109
  expect(ts2.date().getUTCMinutes()).toEqual(0);
109
110
  });
110
111
 
112
+ describe("schema", () => {
113
+ it("should parse bigint", () => {
114
+ const ts = TimeStamp.z.parse(1000000000n);
115
+ expect(ts).toBeInstanceOf(TimeStamp);
116
+ expect(ts.valueOf()).toBe(1000000000n);
117
+ });
118
+
119
+ it("should parse Date object", () => {
120
+ const date = new Date("2024-01-15T10:30:00.000Z");
121
+ const ts = TimeStamp.z.parse(date);
122
+ expect(ts).toBeInstanceOf(TimeStamp);
123
+ expect(ts.valueOf()).toBe(BigInt(date.getTime()) * 1000000n);
124
+ });
125
+
126
+ it("should parse TimeSpan", () => {
127
+ const span = new TimeSpan(5000000000n);
128
+ const ts = TimeStamp.z.parse(span);
129
+ expect(ts).toBeInstanceOf(TimeStamp);
130
+ expect(ts.valueOf()).toBe(5000000000n);
131
+ });
132
+
133
+ it("should parse DateComponents array", () => {
134
+ const ts = TimeStamp.z.parse([2024, 3, 15]);
135
+ expect(ts).toBeInstanceOf(TimeStamp);
136
+ const expected = new TimeStamp([2024, 3, 15]);
137
+ expect(ts.valueOf()).toBe(expected.valueOf());
138
+ });
139
+
140
+ it("should parse DateComponents with missing elements", () => {
141
+ const ts1 = TimeStamp.z.parse([2024]);
142
+ expect(ts1).toBeInstanceOf(TimeStamp);
143
+ expect(ts1.valueOf()).toBe(new TimeStamp([2024, 1, 1]).valueOf());
144
+
145
+ const ts2 = TimeStamp.z.parse([2024, 6]);
146
+ expect(ts2).toBeInstanceOf(TimeStamp);
147
+ expect(ts2.valueOf()).toBe(new TimeStamp([2024, 6, 1]).valueOf());
148
+ });
149
+
150
+ it("should parse string representation of bigint", () => {
151
+ const ts = TimeStamp.z.parse("123456789000");
152
+ expect(ts).toBeInstanceOf(TimeStamp);
153
+ expect(ts.valueOf()).toBe(123456789000n);
154
+ });
155
+
156
+ it("should parse number", () => {
157
+ const ts = TimeStamp.z.parse(987654321);
158
+ expect(ts).toBeInstanceOf(TimeStamp);
159
+ expect(ts.valueOf()).toBe(987654321n);
160
+ });
161
+
162
+ it("should parse object with value property", () => {
163
+ const ts = TimeStamp.z.parse({ value: 555555555n });
164
+ expect(ts).toBeInstanceOf(TimeStamp);
165
+ expect(ts.valueOf()).toBe(555555555n);
166
+ });
167
+
168
+ it("should pass through existing TimeStamp instance", () => {
169
+ const original = new TimeStamp(777777777n);
170
+ const ts = TimeStamp.z.parse(original);
171
+ expect(ts).toBe(original);
172
+ expect(ts.valueOf()).toBe(777777777n);
173
+ });
174
+
175
+ it("should handle edge cases", () => {
176
+ const ts1 = TimeStamp.z.parse(0);
177
+ expect(ts1.valueOf()).toBe(0n);
178
+
179
+ const ts2 = TimeStamp.z.parse(Number.MAX_SAFE_INTEGER);
180
+ expect(ts2.valueOf()).toBe(BigInt(Number.MAX_SAFE_INTEGER));
181
+ });
182
+ });
183
+
111
184
  test("span", () => {
112
185
  const ts = new TimeStamp(0);
113
- expect(ts.span(new TimeStamp(1000)).equals(TimeSpan.microseconds())).toBeTruthy();
186
+ expect(ts.span(new TimeStamp(1000)).equals(TimeSpan.microseconds())).toBe(true);
114
187
  });
115
188
 
116
189
  test("range", () => {
117
190
  const ts = new TimeStamp(0);
118
191
  expect(
119
192
  ts.range(new TimeStamp(1000)).equals(new TimeRange(ts, TimeSpan.microseconds())),
120
- ).toBeTruthy();
193
+ ).toBe(true);
121
194
  });
122
195
 
123
196
  test("spanRange", () => {
@@ -126,56 +199,56 @@ describe("TimeStamp", () => {
126
199
  ts
127
200
  .spanRange(TimeSpan.microseconds())
128
201
  .equals(new TimeRange(ts, ts.add(TimeSpan.microseconds()))),
129
- ).toBeTruthy();
202
+ ).toBe(true);
130
203
  });
131
204
 
132
205
  test("isZero", () => {
133
206
  const ts = new TimeStamp(0);
134
- expect(ts.isZero).toBeTruthy();
207
+ expect(ts.isZero).toBe(true);
135
208
  });
136
209
 
137
210
  test("after", () => {
138
211
  const ts = new TimeStamp(0);
139
- expect(ts.after(new TimeStamp(-1))).toBeTruthy();
212
+ expect(ts.after(new TimeStamp(-1))).toBe(true);
140
213
  const ts2 = new TimeStamp(1);
141
- expect(ts2.after(new TimeStamp(1))).toBeFalsy();
214
+ expect(ts2.after(new TimeStamp(1))).toBe(false);
142
215
  });
143
216
 
144
217
  test("before", () => {
145
218
  const ts = new TimeStamp(0);
146
- expect(ts.before(new TimeStamp(1))).toBeTruthy();
219
+ expect(ts.before(new TimeStamp(1))).toBe(true);
147
220
  const ts2 = new TimeStamp(1);
148
- expect(ts2.before(new TimeStamp(1))).toBeFalsy();
221
+ expect(ts2.before(new TimeStamp(1))).toBe(false);
149
222
  });
150
223
 
151
224
  test("beforeEq", () => {
152
225
  const ts = new TimeStamp(0);
153
- expect(ts.beforeEq(new TimeStamp(1))).toBeTruthy();
226
+ expect(ts.beforeEq(new TimeStamp(1))).toBe(true);
154
227
  const ts2 = new TimeStamp(1);
155
- expect(ts2.beforeEq(new TimeStamp(1))).toBeTruthy();
228
+ expect(ts2.beforeEq(new TimeStamp(1))).toBe(true);
156
229
  const ts3 = new TimeStamp(2);
157
- expect(ts3.beforeEq(new TimeStamp(1))).toBeFalsy();
230
+ expect(ts3.beforeEq(new TimeStamp(1))).toBe(false);
158
231
  });
159
232
 
160
233
  test("afterEq", () => {
161
234
  const ts = new TimeStamp(0);
162
- expect(ts.afterEq(new TimeStamp(-1))).toBeTruthy();
235
+ expect(ts.afterEq(new TimeStamp(-1))).toBe(true);
163
236
  const ts2 = new TimeStamp(1);
164
- expect(ts2.afterEq(new TimeStamp(1))).toBeTruthy();
237
+ expect(ts2.afterEq(new TimeStamp(1))).toBe(true);
165
238
  const ts3 = new TimeStamp(0);
166
- expect(ts3.afterEq(new TimeStamp(1))).toBeFalsy();
239
+ expect(ts3.afterEq(new TimeStamp(1))).toBe(false);
167
240
  });
168
241
 
169
242
  test("add", () => {
170
243
  const ts = new TimeStamp(0);
171
244
  expect(
172
245
  ts.add(TimeSpan.microseconds()).equals(new TimeStamp(TimeSpan.microseconds(1))),
173
- ).toBeTruthy();
246
+ ).toBe(true);
174
247
  });
175
248
 
176
249
  test("sub", () => {
177
250
  const ts = new TimeStamp(TimeSpan.microseconds());
178
- expect(ts.sub(TimeSpan.microseconds()).equals(new TimeStamp(0))).toBeTruthy();
251
+ expect(ts.sub(TimeSpan.microseconds()).equals(new TimeStamp(0))).toBe(true);
179
252
  });
180
253
 
181
254
  describe("fString", () => {
@@ -250,7 +323,7 @@ describe("TimeStamp", () => {
250
323
  expect(new TimeStamp([2022, 12, 15]).month).toEqual(11);
251
324
  });
252
325
  test("day", () => {
253
- expect(new TimeStamp([2022, 12, 15]).day).toEqual(15);
326
+ expect(new TimeStamp([2022, 12, 15], "UTC").day).toEqual(15);
254
327
  });
255
328
  });
256
329
 
@@ -346,7 +419,7 @@ describe("TimeStamp", () => {
346
419
  `expected ${new TimeSpan(expectedRemainder).toString()} got ${new TimeSpan(
347
420
  remainder,
348
421
  ).toString()}`,
349
- ).toBeTruthy();
422
+ ).toBe(true);
350
423
  });
351
424
  test("second", () => {
352
425
  const expectedRemainder = TimeSpan.milliseconds(12);
@@ -355,40 +428,66 @@ describe("TimeStamp", () => {
355
428
  .add(TimeSpan.minutes(20))
356
429
  .add(TimeSpan.milliseconds(12));
357
430
  const remainder = ts.remainder(TimeSpan.seconds());
358
- expect(remainder.equals(expectedRemainder)).toBeTruthy();
431
+ expect(remainder.equals(expectedRemainder)).toBe(true);
432
+ });
433
+ });
434
+
435
+ describe("sort", () => {
436
+ interface Spec {
437
+ a: TimeStamp;
438
+ b: TimeStamp;
439
+ expected: number;
440
+ }
441
+ const TESTS: Spec[] = [
442
+ {
443
+ a: TimeStamp.seconds(3),
444
+ b: TimeStamp.seconds(2),
445
+ expected: TimeSpan.seconds(1).nanoseconds,
446
+ },
447
+ {
448
+ a: TimeStamp.seconds(2),
449
+ b: TimeStamp.seconds(3),
450
+ expected: TimeSpan.seconds(-1).nanoseconds,
451
+ },
452
+ { a: TimeStamp.seconds(2), b: TimeStamp.seconds(2), expected: 0 },
453
+ ];
454
+ TESTS.forEach(({ a, b, expected }) => {
455
+ test(`TimeStamp.sort(${a.toString()}, ${b.toString()}) = ${expected}`, () => {
456
+ expect(TimeStamp.sort(a, b)).toEqual(expected);
457
+ });
359
458
  });
360
459
  });
361
460
  });
362
461
 
363
462
  describe("TimeSpan", () => {
364
463
  test("construct from static", () => {
365
- expect(TimeSpan.nanoseconds(1).equals(1)).toBeTruthy();
366
- expect(TimeSpan.microseconds(1).equals(1000)).toBeTruthy();
367
- expect(TimeSpan.milliseconds(1).equals(1000000)).toBeTruthy();
368
- expect(TimeSpan.seconds(1).equals(1e9)).toBeTruthy();
369
- expect(TimeSpan.minutes(1).equals(6e10)).toBeTruthy();
370
- expect(TimeSpan.hours(1).equals(36e11)).toBeTruthy();
464
+ expect(TimeSpan.nanoseconds(1).equals(1)).toBe(true);
465
+ expect(TimeSpan.microseconds(1).equals(1000)).toBe(true);
466
+ expect(TimeSpan.milliseconds(1).equals(1000000)).toBe(true);
467
+ expect(TimeSpan.seconds(1).equals(1e9)).toBe(true);
468
+ expect(TimeSpan.minutes(1).equals(6e10)).toBe(true);
469
+ expect(TimeSpan.hours(1).equals(36e11)).toBe(true);
371
470
  });
372
471
 
373
472
  describe("fromMilliseconds", () => {
374
473
  it("should interpret a pure number or bigint as milliseconds", () => {
375
474
  const ts = TimeSpan.fromMilliseconds(1000);
376
- expect(ts.equals(TimeSpan.seconds())).toBeTruthy();
475
+ expect(ts.equals(TimeSpan.seconds())).toBe(true);
377
476
  });
378
477
  it("should interpret a TimeSpan as a normal TimeSpan", () => {
379
478
  const ts = TimeSpan.fromMilliseconds(TimeSpan.milliseconds(30));
380
- expect(ts.equals(TimeSpan.milliseconds(30))).toBeTruthy();
479
+ expect(ts.equals(TimeSpan.milliseconds(30))).toBe(true);
381
480
  });
382
481
  });
383
482
 
384
483
  describe("fromSeconds", () => {
385
484
  it("should interpret a pure number or bigint as seconds", () => {
386
485
  const ts = TimeSpan.fromSeconds(1);
387
- expect(ts.equals(TimeSpan.SECOND)).toBeTruthy();
486
+ expect(ts.equals(TimeSpan.SECOND)).toBe(true);
388
487
  });
389
488
  it("should interpret a TimeSpan as a normal TimeSpan", () => {
390
489
  const ts = TimeSpan.fromSeconds(TimeSpan.milliseconds(30));
391
- expect(ts.equals(TimeSpan.milliseconds(30))).toBeTruthy();
490
+ expect(ts.equals(TimeSpan.milliseconds(30))).toBe(true);
392
491
  });
393
492
  });
394
493
 
@@ -397,16 +496,16 @@ describe("TimeSpan", () => {
397
496
  });
398
497
 
399
498
  test("isZero", () => {
400
- expect(TimeSpan.ZERO.isZero).toBeTruthy();
401
- expect(TimeSpan.seconds(1).isZero).toBeFalsy();
499
+ expect(TimeSpan.ZERO.isZero).toBe(true);
500
+ expect(TimeSpan.seconds(1).isZero).toBe(false);
402
501
  });
403
502
 
404
503
  test("add", () => {
405
- expect(TimeSpan.seconds(1).add(TimeSpan.SECOND).equals(2e9)).toBeTruthy();
504
+ expect(TimeSpan.seconds(1).add(TimeSpan.SECOND).equals(2e9)).toBe(true);
406
505
  });
407
506
 
408
507
  test("sub", () => {
409
- expect(TimeSpan.seconds(1).sub(TimeSpan.SECOND).isZero).toBeTruthy();
508
+ expect(TimeSpan.seconds(1).sub(TimeSpan.SECOND).isZero).toBe(true);
410
509
  });
411
510
 
412
511
  const TRUNCATE_TESTS = [
@@ -419,7 +518,7 @@ describe("TimeSpan", () => {
419
518
  expect(
420
519
  ts.truncate(unit).equals(expected),
421
520
  `expected ${expected.toString()} got ${ts.truncate(unit).toString()}`,
422
- ).toBeTruthy();
521
+ ).toBe(true);
423
522
  });
424
523
  });
425
524
 
@@ -434,7 +533,7 @@ describe("TimeSpan", () => {
434
533
 
435
534
  test("remainder", () => {
436
535
  REMAINDER_TESTS.forEach(([ts, unit, expected]) => {
437
- expect(ts.remainder(unit).equals(expected)).toBeTruthy();
536
+ expect(ts.remainder(unit).equals(expected)).toBe(true);
438
537
  });
439
538
  });
440
539
 
@@ -463,12 +562,12 @@ describe("TimeSpan", () => {
463
562
  });
464
563
 
465
564
  describe("Rate", () => {
466
- test("construct", () => expect(new Rate(1).equals(1)).toBeTruthy());
565
+ test("construct", () => expect(new Rate(1).equals(1)).toBe(true));
467
566
 
468
- test("period", () => expect(new Rate(1).period.equals(TimeSpan.SECOND)).toBeTruthy());
567
+ test("period", () => expect(new Rate(1).period.equals(TimeSpan.SECOND)).toBe(true));
469
568
 
470
569
  test("period", () =>
471
- expect(new Rate(2).period.equals(TimeSpan.milliseconds(500))).toBeTruthy());
570
+ expect(new Rate(2).period.equals(TimeSpan.milliseconds(500))).toBe(true));
472
571
 
473
572
  test("sampleCount", () =>
474
573
  expect(new Rate(1).sampleCount(TimeSpan.SECOND)).toEqual(1));
@@ -477,22 +576,22 @@ describe("Rate", () => {
477
576
  expect(new Rate(1).byteCount(TimeSpan.SECOND, Density.BIT64)).toEqual(8));
478
577
 
479
578
  test("span", () =>
480
- expect(new Rate(1).span(4).equals(TimeSpan.seconds(4))).toBeTruthy());
579
+ expect(new Rate(1).span(4).equals(TimeSpan.seconds(4))).toBe(true));
481
580
 
482
581
  test("byteSpan", () =>
483
582
  expect(
484
583
  new Rate(1).byteSpan(new Size(32), Density.BIT64).equals(TimeSpan.seconds(4)),
485
- ).toBeTruthy());
584
+ ).toBe(true));
486
585
 
487
- test("Hz", () => expect(Rate.hz(1).equals(1)).toBeTruthy());
488
- test("KHz", () => expect(Rate.khz(1).equals(1e3)).toBeTruthy());
586
+ test("Hz", () => expect(Rate.hz(1).equals(1)).toBe(true));
587
+ test("KHz", () => expect(Rate.khz(1).equals(1e3)).toBe(true));
489
588
  });
490
589
 
491
590
  describe("TimeRange", () => {
492
591
  test("construct", () => {
493
592
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
494
- expect(tr.start.equals(new TimeStamp(0))).toBeTruthy();
495
- expect(tr.end.equals(new TimeStamp(1000))).toBeTruthy();
593
+ expect(tr.start.equals(new TimeStamp(0))).toBe(true);
594
+ expect(tr.end.equals(new TimeStamp(1000))).toBe(true);
496
595
  });
497
596
 
498
597
  test("construct from object", () => {
@@ -500,69 +599,69 @@ describe("TimeRange", () => {
500
599
  start: new TimeStamp(1000),
501
600
  end: new TimeStamp(100000),
502
601
  });
503
- expect(tr.start.equals(new TimeStamp(1000))).toBeTruthy();
504
- expect(tr.end.equals(new TimeStamp(100000))).toBeTruthy();
602
+ expect(tr.start.equals(new TimeStamp(1000))).toBe(true);
603
+ expect(tr.end.equals(new TimeStamp(100000))).toBe(true);
505
604
  });
506
605
 
507
606
  test("span", () => {
508
607
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
509
- expect(tr.span.equals(TimeSpan.MICROSECOND)).toBeTruthy();
608
+ expect(tr.span.equals(TimeSpan.MICROSECOND)).toBe(true);
510
609
  });
511
610
 
512
611
  test("isValid", () => {
513
612
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
514
- expect(tr.isValid).toBeTruthy();
613
+ expect(tr.isValid).toBe(true);
515
614
  const tr2 = new TimeRange(new TimeStamp(1000), new TimeStamp(0));
516
- expect(tr2.isValid).toBeFalsy();
615
+ expect(tr2.isValid).toBe(false);
517
616
  });
518
617
 
519
618
  test("isZero", () => {
520
619
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(0));
521
- expect(tr.isZero).toBeTruthy();
620
+ expect(tr.isZero).toBe(true);
522
621
  const tr2 = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
523
- expect(tr2.isZero).toBeFalsy();
622
+ expect(tr2.isZero).toBe(false);
524
623
  });
525
624
 
526
625
  test("swap", () => {
527
626
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
528
- expect(
529
- tr.swap().equals(new TimeRange(new TimeStamp(1000), new TimeStamp(0))),
530
- ).toBeTruthy();
627
+ expect(tr.swap().equals(new TimeRange(new TimeStamp(1000), new TimeStamp(0)))).toBe(
628
+ true,
629
+ );
531
630
  });
532
631
  describe("contains", () => {
533
632
  test("TimeStamp", () => {
534
633
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
535
- expect(tr.contains(new TimeStamp(500))).toBeTruthy();
536
- expect(tr.contains(new TimeStamp(1001))).toBeFalsy();
634
+ expect(tr.contains(new TimeStamp(500))).toBe(true);
635
+ expect(tr.contains(new TimeStamp(1001))).toBe(false);
537
636
  });
538
637
  test("TimeRange", () => {
539
638
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
540
- expect(
541
- tr.contains(new TimeRange(new TimeStamp(500), new TimeStamp(600))),
542
- ).toBeTruthy();
543
- expect(
544
- tr.contains(new TimeRange(new TimeStamp(500), new TimeStamp(1001))),
545
- ).toBeFalsy();
639
+ expect(tr.contains(new TimeRange(new TimeStamp(500), new TimeStamp(600)))).toBe(
640
+ true,
641
+ );
642
+ expect(tr.contains(new TimeRange(new TimeStamp(500), new TimeStamp(1001)))).toBe(
643
+ false,
644
+ );
546
645
  });
547
646
  });
548
647
  describe("overlapsWith", () => {
549
648
  it("should return true if the end of one time range is after the start of the next time range", () => {
550
649
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
551
650
  const one = new TimeRange(new TimeStamp(500), new TimeStamp(600));
552
- expect(tr.overlapsWith(one)).toBeTruthy();
553
- expect(one.overlapsWith(tr)).toBeTruthy();
651
+ expect(tr.overlapsWith(one)).toBe(true);
652
+ expect(one.overlapsWith(tr)).toBe(true);
554
653
  });
555
654
  it("should return false if two time ranges are clearly separate", () => {
556
655
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
557
656
  const one = new TimeRange(new TimeStamp(1001), new TimeStamp(2000));
558
- expect(tr.overlapsWith(one)).toBeFalsy();
559
- expect(one.overlapsWith(tr)).toBeFalsy();
657
+ expect(tr.overlapsWith(one)).toBe(false);
658
+ expect(one.overlapsWith(tr)).toBe(false);
560
659
  });
561
660
  it("should return false if the end of the first time range is the start of the next time range", () => {
562
661
  const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
563
662
  const one = new TimeRange(new TimeStamp(1000), new TimeStamp(2000));
564
- expect(tr.overlapsWith(one)).toBeFalsy();
565
- expect(one.overlapsWith(tr)).toBeFalsy();
663
+ expect(tr.overlapsWith(one)).toBe(false);
664
+ expect(one.overlapsWith(tr)).toBe(false);
566
665
  });
567
666
  it("should return true only if the overlap is within a threshold", () => {
568
667
  const tr = new TimeRange(TimeStamp.milliseconds(0), TimeStamp.milliseconds(1000));
@@ -570,13 +669,13 @@ describe("TimeRange", () => {
570
669
  TimeStamp.milliseconds(998),
571
670
  TimeStamp.milliseconds(2000),
572
671
  );
573
- expect(tr.overlapsWith(one, TimeSpan.milliseconds(2))).toBeTruthy();
574
- expect(one.overlapsWith(tr, TimeSpan.milliseconds(3))).toBeFalsy();
672
+ expect(tr.overlapsWith(one, TimeSpan.milliseconds(2))).toBe(true);
673
+ expect(one.overlapsWith(tr, TimeSpan.milliseconds(3))).toBe(false);
575
674
  });
576
675
  it("should return two for two ZERO time ranges", () => {
577
676
  const tr = new TimeRange(TimeStamp.ZERO, TimeStamp.ZERO);
578
677
  const one = new TimeRange(TimeStamp.ZERO, TimeStamp.ZERO);
579
- expect(tr.overlapsWith(one)).toBeTruthy();
678
+ expect(tr.overlapsWith(one)).toBe(true);
580
679
  });
581
680
  });
582
681
 
@@ -586,14 +685,14 @@ describe("TimeRange", () => {
586
685
  const bound = new TimeRange(TimeSpan.seconds(2), TimeSpan.seconds(3));
587
686
  const bounded = tr.boundBy(bound);
588
687
  const expected = new TimeRange(TimeSpan.seconds(2), TimeSpan.seconds(3));
589
- expect(bounded.equals(expected)).toBeTruthy();
688
+ expect(bounded.equals(expected)).toBe(true);
590
689
  });
591
690
  it("should bound the time range even if the start is after the end", () => {
592
691
  const tr = new TimeRange(TimeSpan.seconds(4), TimeSpan.seconds(1));
593
692
  const bound = new TimeRange(TimeSpan.seconds(2), TimeSpan.seconds(3));
594
693
  const bounded = tr.boundBy(bound);
595
694
  const expected = new TimeRange(TimeSpan.seconds(3), TimeSpan.seconds(2));
596
- expect(bounded.equals(expected)).toBeTruthy();
695
+ expect(bounded.equals(expected)).toBe(true);
597
696
  });
598
697
  });
599
698
 
@@ -604,8 +703,8 @@ describe("TimeRange", () => {
604
703
  TimeSpan.seconds(1),
605
704
  TimeSpan.seconds(4).add(TimeSpan.milliseconds(500)),
606
705
  );
607
- expect(tr.equals(one, TimeSpan.seconds(1))).toBeTruthy();
608
- expect(tr.equals(one, TimeSpan.seconds(0))).toBeFalsy();
706
+ expect(tr.equals(one, TimeSpan.seconds(1))).toBe(true);
707
+ expect(tr.equals(one, TimeSpan.seconds(0))).toBe(false);
609
708
  });
610
709
  });
611
710
 
@@ -622,15 +721,60 @@ describe("TimeRange", () => {
622
721
  const trString = tr.toString();
623
722
  expect(trString).toEqual("1970-01-03T00:20:00.283Z - 1970-01-05T00:20:00.283Z");
624
723
  });
625
- });
626
724
 
627
- describe("DataType", () => {
628
- test("json serialization", () => {
629
- const dt = DataType.INT32;
630
- const v = JSON.parse(JSON.stringify({ dt }));
631
- expect(v.dt === "int32").toBeTruthy();
725
+ describe("sort", () => {
726
+ interface Spec {
727
+ a: TimeRange;
728
+ b: TimeRange;
729
+ expected: number;
730
+ }
731
+ const TESTS: Spec[] = [
732
+ { a: new TimeRange(1, 2), b: new TimeRange(2, 3), expected: -1 },
733
+ { a: new TimeRange(2, 3), b: new TimeRange(1, 2), expected: 1 },
734
+ { a: new TimeRange(1, 2), b: new TimeRange(1, 2), expected: 0 },
735
+ { a: new TimeRange(2, 0), b: new TimeRange(1, 1), expected: 1 },
736
+ { a: new TimeRange(2, 2), b: new TimeRange(3, 0), expected: -1 },
737
+ { a: new TimeRange(2, 8), b: new TimeRange(2, 9), expected: -1 },
738
+ { a: new TimeRange(2, 9), b: new TimeRange(2, 8), expected: 1 },
739
+ ];
740
+ TESTS.forEach(({ a, b, expected }) => {
741
+ test(`TimeRange.sort(${a.toString()}, ${b.toString()}) = ${expected}`, () => {
742
+ expect(TimeRange.sort(a, b)).toEqual(expected);
743
+ });
744
+ });
632
745
  });
746
+ describe("numericBounds", () => {
747
+ it("should return correct numeric bounds for a valid time range", () => {
748
+ const tr = new TimeRange(TimeSpan.seconds(1), TimeSpan.seconds(4));
749
+ const bounds = tr.numericBounds;
750
+ expect(bounds.lower).toBe(tr.start.nanoseconds);
751
+ expect(bounds.upper).toBe(tr.end.nanoseconds);
752
+ });
633
753
 
754
+ it("should return correct numeric bounds for an invalid time range", () => {
755
+ const tr = new TimeRange(TimeSpan.seconds(4), TimeSpan.seconds(1));
756
+ const bounds = tr.numericBounds;
757
+ expect(bounds.lower).toBe(tr.start.nanoseconds);
758
+ expect(bounds.upper).toBe(tr.end.nanoseconds);
759
+ });
760
+
761
+ it("should handle zero time range", () => {
762
+ const tr = new TimeRange(TimeStamp.ZERO, TimeStamp.ZERO);
763
+ const bounds = tr.numericBounds;
764
+ expect(bounds.lower).toBe(0);
765
+ expect(bounds.upper).toBe(0);
766
+ });
767
+
768
+ it("should handle large time values", () => {
769
+ const tr = new TimeRange(TimeSpan.days(365), TimeSpan.days(730));
770
+ const bounds = tr.numericBounds;
771
+ expect(bounds.lower).toBe(tr.start.nanoseconds);
772
+ expect(bounds.upper).toBe(tr.end.nanoseconds);
773
+ });
774
+ });
775
+ });
776
+
777
+ describe("DataType", () => {
634
778
  describe("isVariable", () => {
635
779
  it("should return true if the data type has a variable length", () => {
636
780
  expect(DataType.INT32.isVariable).toBe(false);
@@ -680,6 +824,7 @@ describe("DataType", () => {
680
824
  }),
681
825
  );
682
826
  });
827
+
683
828
  describe("canCastTo", () => {
684
829
  it("should return true for any two numeric data types", () => {
685
830
  const numericTypes = [
@@ -745,3 +890,30 @@ describe("Size", () => {
745
890
  });
746
891
  });
747
892
  });
893
+
894
+ describe("addSamples", () => {
895
+ test("adds two numbers", () => {
896
+ expect(addSamples(1, 2)).toBe(3);
897
+ expect(addSamples(1.5, 2.5)).toBe(4);
898
+ expect(addSamples(-1, 1)).toBe(0);
899
+ });
900
+
901
+ test("adds two bigints", () => {
902
+ expect(addSamples(1n, 2n)).toBe(3n);
903
+ expect(addSamples(-1n, 1n)).toBe(0n);
904
+ expect(addSamples(9007199254740991n, 1n)).toBe(9007199254740992n);
905
+ });
906
+
907
+ test("handles mixed numeric types", () => {
908
+ expect(addSamples(1, 2n)).toBe(3);
909
+ expect(addSamples(2n, 1)).toBe(3);
910
+ expect(addSamples(1.5, 2n)).toBe(3.5);
911
+ expect(addSamples(2n, 1.5)).toBe(3.5);
912
+ });
913
+
914
+ test("handles edge cases", () => {
915
+ expect(addSamples(0, 0)).toBe(0);
916
+ expect(addSamples(Number.MAX_SAFE_INTEGER, 1)).toBe(Number.MAX_SAFE_INTEGER + 1);
917
+ expect(addSamples(Number.MIN_SAFE_INTEGER, -1)).toBe(Number.MIN_SAFE_INTEGER - 1);
918
+ });
919
+ });