delayed-presence.test.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { expect, jest, test } from "bun:test"
  2. import { createRoot, createSignal } from "solid-js"
  3. import { createDelayedPresence } from "../../src/util/delayed-presence"
  4. test("shows only after the same value remains present for the delay", async () => {
  5. jest.useFakeTimers()
  6. const scope = createRoot((dispose) => {
  7. const [value, setValue] = createSignal<string>()
  8. return { dispose, setValue, visible: createDelayedPresence(value, 1_000) }
  9. })
  10. try {
  11. scope.setValue("first")
  12. await Promise.resolve()
  13. jest.advanceTimersByTime(500)
  14. expect(scope.visible()).toBe(false)
  15. scope.setValue("second")
  16. await Promise.resolve()
  17. jest.advanceTimersByTime(999)
  18. expect(scope.visible()).toBe(false)
  19. jest.advanceTimersByTime(1)
  20. expect(scope.visible()).toBe(true)
  21. } finally {
  22. scope.dispose()
  23. jest.useRealTimers()
  24. }
  25. })
  26. test("cancels the delay when the value disappears or the owner is disposed", async () => {
  27. jest.useFakeTimers()
  28. const scope = createRoot((dispose) => {
  29. const [value, setValue] = createSignal<string>()
  30. return { dispose, setValue, visible: createDelayedPresence(value, 1_000) }
  31. })
  32. try {
  33. scope.setValue("running")
  34. await Promise.resolve()
  35. jest.advanceTimersByTime(500)
  36. scope.setValue(undefined)
  37. await Promise.resolve()
  38. jest.advanceTimersByTime(1_000)
  39. expect(scope.visible()).toBe(false)
  40. scope.setValue("running")
  41. await Promise.resolve()
  42. scope.dispose()
  43. jest.advanceTimersByTime(1_000)
  44. expect(scope.visible()).toBe(false)
  45. } finally {
  46. scope.dispose()
  47. jest.useRealTimers()
  48. }
  49. })