From 5b9e2441344254e7efe167855df09100e8527755 Mon Sep 17 00:00:00 2001 From: Daniel Pecos Martinez Date: Thu, 16 Apr 2026 13:23:12 +0200 Subject: [PATCH] test: verify jump-to-slide works correctly with countIncrementalSlides=false Adds regression tests covering the scenario from issue #10 to confirm that byNumber mapping correctly groups incremental slides and that typing a slide number navigates to the expected displayed slide. Closes #10 --- src/__tests__/slideshow.test.ts | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/__tests__/slideshow.test.ts b/src/__tests__/slideshow.test.ts index cf5594a..51c1f3b 100644 --- a/src/__tests__/slideshow.test.ts +++ b/src/__tests__/slideshow.test.ts @@ -122,6 +122,49 @@ describe('Slideshow', () => { slideshow.loadFromString('a\n---\ncount: false\n\nb\n---\nc'); expect(slideshow.getSlidesByNumber(1)).toHaveLength(2); }); + + describe('jump-to-slide with countIncrementalSlides: false (issue #10)', () => { + // Source: Slide 1, Slide 2, Slide 2b (incremental --), Slide 3 + // With countIncrementalSlides:false the displayed numbers are 1, 2, 2, 3. + // Typing "3" + Enter must navigate to "Slide 3", not an unexpected slide. + const source = '# Slide 1\n---\n# Slide 2\n--\n## Slide 2b\n---\n# Slide 3'; + + beforeEach(() => { + slideshow = new Slideshow(events, dom, { countIncrementalSlides: false }); + slideshow.loadFromString(source); + }); + + it('slide numbers are 1, 2, 2, 3', () => { + const numbers = slideshow.getSlides().map((s) => s.getSlideNumber()); + expect(numbers).toEqual([1, 2, 2, 3]); + }); + + it('byNumber[1] contains only Slide 1', () => { + expect(slideshow.getSlidesByNumber(1)).toHaveLength(1); + expect(slideshow.getSlidesByNumber(1)![0].getSlideNumber()).toBe(1); + }); + + it('byNumber[2] groups Slide 2 and its incremental Slide 2b', () => { + expect(slideshow.getSlidesByNumber(2)).toHaveLength(2); + }); + + it('byNumber[3] contains only Slide 3', () => { + expect(slideshow.getSlidesByNumber(3)).toHaveLength(1); + }); + + it('jumping to displayed number 3 lands on Slide 3 (last slide)', () => { + // gotoSlideNumber resolves via byNumber; the first entry in byNumber[3] + // must be the actual "Slide 3", i.e. the last slide in the deck. + const slides = slideshow.getSlidesByNumber(3)!; + expect(slides).toHaveLength(1); + const lastSlideIndex = slideshow.getSlideCount() - 1; + expect(slides[0].getSlideIndex()).toBe(lastSlideIndex); + }); + + it('byNumber[4] is undefined (no slide with displayed number 4)', () => { + expect(slideshow.getSlidesByNumber(4)).toBeUndefined(); + }); + }); }); describe('layout slides', () => {