animation.test.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { expect, test } from "bun:test"
  2. import { createRoot } from "solid-js"
  3. import { createAnimatable, spring, tween } from "../../src/ui/animation"
  4. test("animates numeric objects and arrays to their targets", async () => {
  5. let dispose = () => {}
  6. const visual = createRoot((nextDispose) => {
  7. dispose = nextDispose
  8. return createAnimatable(
  9. { widths: [8, 8], selection: 0 },
  10. { transition: tween({ duration: 0.02, ease: (progress) => progress }) },
  11. )
  12. })
  13. try {
  14. visual.animate({ widths: [12, 4], selection: 1 })
  15. await Bun.sleep(80)
  16. expect(visual.value()).toEqual({ widths: [12, 4], selection: 1 })
  17. } finally {
  18. dispose()
  19. }
  20. })
  21. test("retains spring state while retargeting and supports immediate jumps", async () => {
  22. let dispose = () => {}
  23. const visual = createRoot((nextDispose) => {
  24. dispose = nextDispose
  25. return createAnimatable({ value: 0 }, { transition: spring({ visualDuration: 0.02 }) })
  26. })
  27. try {
  28. visual.animate({ value: 1 })
  29. await Bun.sleep(20)
  30. const target = visual.value().value
  31. visual.animate({ value: target })
  32. await Bun.sleep(20)
  33. expect(visual.value().value).not.toBe(target)
  34. await Bun.sleep(80)
  35. expect(visual.value().value).toBeCloseTo(target)
  36. visual.jump({ value: 0 })
  37. expect(visual.value().value).toBe(0)
  38. } finally {
  39. dispose()
  40. }
  41. })