react-native-timer-picker
Version:
A simple, flexible, performant duration picker for React Native apps 🔥 Great for timers, alarms and duration inputs ⏰🕰️⏳ Includes iOS-style haptic and audio feedback 🍏
396 lines (395 loc) • 12.7 kB
JavaScript
;
var _getInitialScrollIndex = require("../utils/getInitialScrollIndex");
describe("getInitialScrollIndex", () => {
describe("infinite scroll disabled", () => {
it("calculates index for value 0", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: true,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 1,
value: 0
});
expect(result).toBe(0);
});
it("calculates index for middle value", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: true,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 1,
value: 30
});
expect(result).toBe(30);
});
it("calculates index for max value", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: true,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 1,
value: 59
});
expect(result).toBe(59);
});
it("handles interval of 5", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: true,
interval: 5,
numberOfItems: 12,
padWithNItems: 2,
repeatNumbersNTimes: 1,
value: 25
});
expect(result).toBe(5); // 25 / 5 = 5
});
it("handles interval of 15", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: true,
interval: 15,
numberOfItems: 4,
padWithNItems: 2,
repeatNumbersNTimes: 1,
value: 45
});
expect(result).toBe(3); // 45 / 15 = 3
});
it("handles different padding values", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: true,
interval: 1,
numberOfItems: 24,
padWithNItems: 5,
repeatNumbersNTimes: 1,
value: 12
});
expect(result).toBe(12);
});
});
describe("infinite scroll enabled", () => {
it("accounts for padding offset at value 0", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 0
});
expect(result).toBe(58); // 60 * 1 + 0 - 2 = 58
});
it("calculates index with padding offset for middle value", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 30
});
expect(result).toBe(88); // 60 * 1 + 30 - 2 = 88
});
it("handles larger padding", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 5,
repeatNumbersNTimes: 3,
value: 15
});
expect(result).toBe(70); // 60 * 1 + 15 - 5 = 70
});
it("handles zero padding", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 0,
repeatNumbersNTimes: 3,
value: 30
});
expect(result).toBe(90); // 60 * 1 + 30 - 0 = 90
});
it("handles interval of 5 with padding", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 5,
numberOfItems: 12,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 30
});
expect(result).toBe(16); // 12 * 1 + 6 - 2 = 16
});
});
describe("repeat numbers", () => {
it("positions at middle repetition when repeatNTimes is 3", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 24,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 12
});
expect(result).toBe(34); // 24 * 1 + 12 - 2 = 34
});
it("positions at middle repetition when repeatNTimes is 5", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 24,
padWithNItems: 2,
repeatNumbersNTimes: 5,
value: 12
});
expect(result).toBe(58); // 24 * 2 + 12 - 2 = 58
});
it("handles even repeatNTimes", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 4,
value: 30
});
expect(result).toBe(148); // 60 * 2 + 30 - 2 = 148
});
it("handles repeatNTimes of 1", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 1,
value: 30
});
expect(result).toBe(28); // 60 * 0 + 30 - 2 = 28
});
it("handles large repeatNTimes", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 24,
padWithNItems: 2,
repeatNumbersNTimes: 7,
value: 12
});
expect(result).toBe(82); // 24 * 3 + 12 - 2 = 82
});
});
describe("different intervals", () => {
it("handles interval of 1", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 45
});
expect(result).toBe(103); // 60 * 1 + 45 - 2 = 103
});
it("handles interval of 5", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 5,
numberOfItems: 12,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 35
});
expect(result).toBe(17); // 12 * 1 + 7 - 2 = 17
});
it("handles interval of 15", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 15,
numberOfItems: 4,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 30
});
expect(result).toBe(4); // 4 * 1 + 2 - 2 = 4
});
it("handles interval of 10", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 10,
numberOfItems: 6,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 40
});
expect(result).toBe(8); // 6 * 1 + 4 - 2 = 8
});
});
describe("wrap-around behavior", () => {
it("handles value greater than numberOfItems * interval", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 24,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 72
});
expect(result).toBe(22); // 24 * 1 + (72 % 24) - 2 = 22
});
it("handles negative result from Math.max", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 10,
repeatNumbersNTimes: 1,
value: 5
});
expect(result).toBe(0); // Math.max(0 + 5 - 10, 0) = 0
});
it("ensures non-negative result with large padding", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 24,
padWithNItems: 50,
repeatNumbersNTimes: 1,
value: 0
});
expect(result).toBe(0); // Math.max ensures >= 0
});
});
describe("edge cases", () => {
it("handles value of 0", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 0
});
expect(result).toBe(58);
});
it("handles small numberOfItems", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 2,
padWithNItems: 1,
repeatNumbersNTimes: 3,
value: 1
});
expect(result).toBe(2); // 2 * 1 + 1 - 1 = 2
});
it("handles large value", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 200
});
expect(result).toBe(78); // 60 * floor(3/2) + ((200 + 60) % 60) - 2 = 60 + 20 - 2 = 78
});
it("handles numberOfItems of 1", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 1,
padWithNItems: 0,
repeatNumbersNTimes: 3,
value: 0
});
expect(result).toBe(1); // 1 * 1 + 0 - 0 = 1
});
});
describe("real-world scenarios", () => {
it("handles typical hour picker initialization", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 24,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 14
});
expect(result).toBe(36); // 24 * 1 + 14 - 2 = 36
});
it("handles typical minute picker initialization", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 45
});
expect(result).toBe(103); // 60 * 1 + 45 - 2 = 103
});
it("handles minute picker with 5-minute interval", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 5,
numberOfItems: 12,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 30
});
expect(result).toBe(16); // 12 * 1 + 6 - 2 = 16
});
it("handles second picker initialization", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 1,
numberOfItems: 60,
padWithNItems: 2,
repeatNumbersNTimes: 3,
value: 0
});
expect(result).toBe(58); // 60 * 1 + 0 - 2 = 58
});
it("handles day picker without repetition", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: true,
interval: 1,
numberOfItems: 100,
padWithNItems: 2,
repeatNumbersNTimes: 1,
value: 15
});
expect(result).toBe(15);
});
});
describe("combination scenarios", () => {
it("combines interval, padding, and repetition", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: false,
interval: 15,
numberOfItems: 4,
padWithNItems: 3,
repeatNumbersNTimes: 5,
value: 45
});
expect(result).toBe(8); // 4 * 2 + 3 - 3 = 8
});
it("handles disabled infinite scroll with repetition", () => {
const result = (0, _getInitialScrollIndex.getInitialScrollIndex)({
disableInfiniteScroll: true,
interval: 5,
numberOfItems: 12,
padWithNItems: 5,
repeatNumbersNTimes: 3,
value: 35
});
expect(result).toBe(19); // 12 * 1 + 7 = 19
});
});
});
//# sourceMappingURL=getInitialScrollIndex.test.js.map