From f35677e8cf4bbe877ddfe7fa718db4d855046c71 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Thu, 7 Sep 2017 20:17:59 -0700 Subject: [PATCH] Fix mapping of ratios to indexes --- js/utils.js | 16 +++++++++++++--- js/utils.test.js | 9 ++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/js/utils.js b/js/utils.js index db3c11df..c6e5a99d 100644 --- a/js/utils.js +++ b/js/utils.js @@ -92,6 +92,16 @@ export const merge = (target, source) => { return target; }; -// Maps a value in a range (defined my min/max) to the corresponding value in the array `newValues`. -export const segment = (min, max, value, newValues) => - newValues[Math.floor((value - min) / (max - min) * (newValues.length - 1))]; +// Maps a value in a range (defined my min/max) to a value in an array (options). +export const segment = (min, max, value, newValues) => { + const ratio = (value - min) / (max - min); + /* + | 0 | 1 | 2 | + 0 1 2 3 + */ + const index = Math.min( + Math.floor(ratio * newValues.length), + newValues.length - 1 // Special case for 100% + ); + return newValues[index]; +}; diff --git a/js/utils.test.js b/js/utils.test.js index c24c6d0a..178d56a1 100644 --- a/js/utils.test.js +++ b/js/utils.test.js @@ -143,16 +143,19 @@ describe("segment", () => { expect(segment(-1, 100, -1, [0, 1, 2])).toBe(0); }); it("can handle max", () => { - expect(segment(0, 100, 100, [0, 1, 2])).toBe(2); - expect(segment(1, 100, 100, [0, 1, 2])).toBe(2); + //expect(segment(0, 100, 100, [0, 1, 2])).toBe(2); + //expect(segment(1, 100, 100, [0, 1, 2])).toBe(2); expect(segment(-1, 100, 100, [0, 1, 2])).toBe(2); }); it("can handle mid", () => { expect(segment(0, 2, 1, [0, 1, 2])).toBe(1); - expect(segment(0, 2, 1.5, [0, 1, 2])).toBe(1); + expect(segment(0, 2, 1.5, [0, 1, 2])).toBe(2); + expect(segment(1, 3, 2.5, [0, 1, 2])).toBe(2); expect(segment(-1, 2, 0.5, [0, 1, 2])).toBe(1); }); it("can handle mid", () => { expect(segment(-100, 100, -100, ["left", "center", "right"])).toBe("left"); + expect(segment(0, 100, 88, ["left", "center", "right"])).toBe("right"); + expect(segment(0, 100, 50, ["left", "center", "right"])).toBe("center"); }); });