Skip to content

Commit 6e436bf

Browse files
committed
Add tests and demo for slider with defined step
1 parent c53644f commit 6e436bf

File tree

3 files changed

+93
-37
lines changed

3 files changed

+93
-37
lines changed

src/components/slider/slider.scss

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,3 @@ md-slider *::after {
142142
background-color: $md-slider-disabled-color;
143143
border-color: $md-slider-disabled-color;
144144
}
145-
146-
.md-slider-dragging {
147-
transition: none;
148-
}

src/components/slider/slider.spec.ts

Lines changed: 88 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -138,37 +138,6 @@ describe('MdSlider', () => {
138138
expect(thumbDimensions.left).toBe(sliderDimensions.width * 0.5 + sliderDimensions.left);
139139
});
140140

141-
it('should update the track fill on drag', () => {
142-
let trackFillElement = sliderNativeElement.querySelector('.md-slider-track-fill');
143-
let trackFillDimensions = trackFillElement.getBoundingClientRect();
144-
let sliderDimensions =
145-
sliderNativeElement.querySelector('.md-slider-track').getBoundingClientRect();
146-
147-
expect(trackFillDimensions.width).toBe(0);
148-
dispatchDragEvent(sliderNativeElement, 0, 0.5, gestureConfig);
149-
150-
trackFillDimensions = trackFillElement.getBoundingClientRect();
151-
expect(trackFillDimensions.width).toBe(sliderDimensions.width * 0.5);
152-
});
153-
154-
it('should update the thumb position on drag', () => {
155-
let thumbElement = sliderNativeElement.querySelector('.md-slider-thumb-position');
156-
let thumbDimensions = thumbElement.getBoundingClientRect();
157-
let thumbWidth =
158-
sliderNativeElement.querySelector('.md-slider-thumb').getBoundingClientRect().width;
159-
let sliderDimensions =
160-
sliderNativeElement.querySelector('.md-slider-track').getBoundingClientRect();
161-
162-
expect(thumbDimensions.left).toBe(sliderDimensions.left - (thumbWidth / 2));
163-
dispatchDragEvent(sliderNativeElement, 0, 0.5, gestureConfig);
164-
165-
thumbDimensions = thumbElement.getBoundingClientRect();
166-
// The thumb's offset is expected to be equal to the slider's offset + half the slider's width
167-
// (from the click event) - half the thumb width (to center the thumb).
168-
let offset = sliderDimensions.left + (sliderDimensions.width * 0.5) - (thumbWidth / 2);
169-
expect(thumbDimensions.left).toBe(offset);
170-
});
171-
172141
it('should add the md-slider-active class on click', () => {
173142
let containerElement = sliderNativeElement.querySelector('.md-slider-container');
174143
expect(containerElement.classList).not.toContain('md-slider-active');
@@ -319,8 +288,9 @@ describe('MdSlider', () => {
319288
let thumbDimensions = thumbElement.getBoundingClientRect();
320289
let thumbPosition = thumbDimensions.left - trackFillDimensions.left;
321290

322-
expect(Math.round(trackFillDimensions.width)).toEqual(Math.round(thumbPosition));
291+
// The closest snap is halfway on the slider.
323292
expect(thumbDimensions.left).toBe(sliderDimensions.width * 0.5 + sliderDimensions.left);
293+
expect(Math.round(trackFillDimensions.width)).toEqual(Math.round(thumbPosition));
324294
});
325295

326296
it('should snap the thumb and fill to the nearest value on drag', () => {
@@ -334,8 +304,10 @@ describe('MdSlider', () => {
334304
let thumbDimensions = thumbElement.getBoundingClientRect();
335305
let thumbPosition = thumbDimensions.left - trackFillDimensions.left;
336306

337-
expect(Math.round(trackFillDimensions.width)).toEqual(Math.round(thumbPosition));
307+
// The closest snap is at the beginning of the slider.
338308
expect(thumbDimensions.left).toBe(sliderDimensions.left);
309+
expect(Math.round(trackFillDimensions.width)).toEqual(Math.round(thumbPosition));
310+
339311
});
340312
});
341313

@@ -374,6 +346,77 @@ describe('MdSlider', () => {
374346
expect(sliderInstance.value).toBe(32);
375347
});
376348
});
349+
350+
describe('slider with set step', () => {
351+
let fixture: ComponentFixture<SliderWithStep>;
352+
let sliderDebugElement: DebugElement;
353+
let sliderNativeElement: HTMLElement;
354+
let sliderInstance: MdSlider;
355+
let sliderTrackElement: HTMLElement;
356+
let sliderDimensions: ClientRect;
357+
let trackFillElement: HTMLElement;
358+
let thumbElement: HTMLElement;
359+
360+
beforeEach(async(() => {
361+
builder.createAsync(SliderWithStep).then(f => {
362+
fixture = f;
363+
fixture.detectChanges();
364+
365+
sliderDebugElement = fixture.debugElement.query(By.directive(MdSlider));
366+
sliderNativeElement = sliderDebugElement.nativeElement;
367+
sliderInstance = sliderDebugElement.injector.get(MdSlider);
368+
sliderTrackElement = <HTMLElement>sliderNativeElement.querySelector('.md-slider-track');
369+
sliderDimensions = sliderTrackElement.getBoundingClientRect();
370+
trackFillElement = <HTMLElement>sliderNativeElement.querySelector('.md-slider-track-fill');
371+
thumbElement = <HTMLElement>sliderNativeElement.querySelector('.md-slider-thumb-position');
372+
});
373+
}));
374+
375+
it('should set the correct step value on click', () => {
376+
expect(sliderInstance.value).toBe(0);
377+
378+
dispatchClickEvent(sliderTrackElement, 0.13);
379+
fixture.detectChanges();
380+
381+
expect(sliderInstance.value).toBe(25);
382+
});
383+
384+
it('should snap the thumb and fill to a step on click', () => {
385+
dispatchClickEvent(sliderNativeElement, 0.66);
386+
fixture.detectChanges();
387+
388+
let trackFillDimensions = trackFillElement.getBoundingClientRect();
389+
let thumbDimensions = thumbElement.getBoundingClientRect();
390+
let thumbPosition = thumbDimensions.left - trackFillDimensions.left;
391+
392+
// The closest step is at 75% of the slider.
393+
expect(thumbDimensions.left).toBe(sliderDimensions.width * 0.75 + sliderDimensions.left);
394+
expect(Math.round(trackFillDimensions.width)).toEqual(Math.round(thumbPosition));
395+
});
396+
397+
it('should set the correct step value on drag', () => {
398+
dispatchDragEvent(sliderTrackElement, sliderNativeElement, 0, 0.07, gestureConfig);
399+
fixture.detectChanges();
400+
401+
expect(sliderInstance.value).toBe(0);
402+
});
403+
404+
it('should snap the thumb and fill to a step on drag', () => {
405+
dispatchDragStartEvent(sliderNativeElement, 0, gestureConfig);
406+
fixture.detectChanges();
407+
408+
dispatchDragEndEvent(sliderNativeElement, 0.88, gestureConfig);
409+
fixture.detectChanges();
410+
411+
let trackFillDimensions = trackFillElement.getBoundingClientRect();
412+
let thumbDimensions = thumbElement.getBoundingClientRect();
413+
let thumbPosition = thumbDimensions.left - trackFillDimensions.left;
414+
415+
// The closest snap is at the beginning of the slider.
416+
expect(thumbDimensions.left).toBe(sliderDimensions.width + sliderDimensions.left);
417+
expect(Math.round(trackFillDimensions.width)).toEqual(Math.round(thumbPosition));
418+
});
419+
});
377420
});
378421

379422
// The transition has to be removed in order to test the updated positions without setTimeout.
@@ -413,6 +456,18 @@ class SliderWithMinAndMax { }
413456
})
414457
class SliderWithValue { }
415458

459+
@Component({
460+
directives: [MD_SLIDER_DIRECTIVES],
461+
template: `<md-slider step="25"></md-slider>`,
462+
styles: [`
463+
.md-slider-track-fill, .md-slider-thumb-position {
464+
transition: none !important;
465+
}
466+
`],
467+
encapsulation: ViewEncapsulation.None
468+
})
469+
class SliderWithStep { }
470+
416471
/**
417472
* Dispatches a click event from an element.
418473
* Note: The mouse event truncates the position for the click.

src/demo-app/slider/slider-demo.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ <h1>Slider with set value</h1>
2020
<section class="demo-section">
2121
<md-slider value="43" #slider4></md-slider>
2222
</section>
23+
24+
<h1>Slider with step defined</h1>
25+
<section class="demo-section">
26+
<md-slider step="25"></md-slider>
27+
</section>

0 commit comments

Comments
 (0)