Skip to content

Commit

Permalink
fix(range): clamp values that are out of bounds (#17623)
Browse files Browse the repository at this point in the history
* fix(range): clamp out of bounds values, add tests

* lint files
  • Loading branch information
liamdebeasi committed Mar 1, 2019
1 parent c475dab commit 5a197ca
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
18 changes: 18 additions & 0 deletions core/src/components/range/range.tsx
Expand Up @@ -126,9 +126,27 @@ export class Range implements ComponentInterface {
if (!this.noUpdate) {
this.updateRatio();
}

value = this.ensureValueInBounds(value);

this.ionChange.emit({ value });
}

private clampBounds = (value: any): number => {
return clamp(this.min, value, this.max);
}

private ensureValueInBounds = (value: any) => {
if (this.dualKnobs) {
return {
lower: this.clampBounds(value.lower),
upper: this.clampBounds(value.upper)
};
} else {
return this.clampBounds(value);
}
}

/**
* Emitted when the value property has changed.
*/
Expand Down
45 changes: 45 additions & 0 deletions core/src/components/range/test/range.spec.ts
@@ -0,0 +1,45 @@
import { Range } from '../range';

let sharedRange;
describe('Range', () => {
beforeEach(() => {
sharedRange = new Range();
});
describe('ensureValueInBounds()', () => {
it('should return the clamped value for a range single knob component', () => {
sharedRange.min = 0;
sharedRange.max = 100;

const valueTests = [
[50, 50],
[-100, 0],
[1000, 100],
[0, 0],
[100, 100]
];

valueTests.forEach(test => {
expect(sharedRange.ensureValueInBounds(test[0])).toBe(test[1]);
});
});

it('should return the clamped value for a range dual knob component', () => {
sharedRange.min = 0;
sharedRange.max = 100;
sharedRange.dualKnobs = true;

const valueTests = [
[{ lower: 0, upper: 0}, { lower: 0, upper: 0}],
[{ lower: -100, upper: 0}, { lower: 0, upper: 0}],
[{ lower: 0, upper: 10000}, { lower: 0, upper: 100}],
[{ lower: -100, upper: 200}, { lower: 0, upper: 100}],
[{ lower: 0, upper: 100}, { lower: 0, upper: 100}],
[{ lower: 200, upper: -100}, { lower: 100, upper: 0}],
];

valueTests.forEach(test => {
expect(sharedRange.ensureValueInBounds(test[0])).toEqual(test[1]);
});
});
});
});

0 comments on commit 5a197ca

Please sign in to comment.