footer.menu.test.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { expect, test } from "bun:test"
  2. import { createRoot } from "solid-js"
  3. import { FOOTER_MENU_ROWS, createFooterMenuState } from "../../src/mini/footer.menu"
  4. function mount(count: number, limit = FOOTER_MENU_ROWS) {
  5. let dispose!: () => void
  6. let menu!: ReturnType<typeof createFooterMenuState>
  7. createRoot((nextDispose) => {
  8. dispose = nextDispose
  9. menu = createFooterMenuState({ count: () => count, limit })
  10. return null
  11. })
  12. return { menu, dispose }
  13. }
  14. test("footer menu scrolls before the selected row hits the bottom edge", () => {
  15. const state = mount(20)
  16. try {
  17. Array.from({ length: 6 }).forEach(() => state.menu.move(1))
  18. expect(state.menu.selected()).toBe(6)
  19. expect(state.menu.offset()).toBe(1)
  20. } finally {
  21. state.dispose()
  22. }
  23. })
  24. test("footer menu scrolls before the selected row hits the top edge", () => {
  25. const state = mount(20)
  26. try {
  27. Array.from({ length: 13 }).forEach(() => state.menu.move(1))
  28. Array.from({ length: 4 }).forEach(() => state.menu.move(-1))
  29. expect(state.menu.selected()).toBe(9)
  30. expect(state.menu.offset()).toBe(7)
  31. } finally {
  32. state.dispose()
  33. }
  34. })