quantitivecalc
Version:
A TypeScript library providing advanced quantitative finance functions for risk analysis, performance metrics, and technical indicators. (Currently in development)
171 lines (170 loc) • 8.26 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const findExtremesInColumn_1 = __importDefault(require("./findExtremesInColumn")); // Adjust import path as needed
describe('findExtremesInColumn', () => {
const people = [
{ id: 1, name: 'Alice', age: 30, score: 85 },
{ id: 2, name: 'Bob', age: 25, score: 92 },
{ id: 3, name: 'Charlie', age: 35, score: 78 },
{ id: 4, name: 'Diana', age: 28, score: 95 }
];
const products = [
{ id: 1, name: 'Laptop', price: 999.99, rating: 4.5 },
{ id: 2, name: 'Mouse', price: 29.99, rating: 4.8 },
{ id: 3, name: 'Keyboard', price: 79.99, rating: 4.2 },
{ id: 4, name: 'Monitor', price: 299.99, rating: 4.7 }
];
describe('Number column extremes', () => {
test('should find min and max by age', () => {
const result = (0, findExtremesInColumn_1.default)(people, 'age');
expect(result.min).toEqual({ id: 2, name: 'Bob', age: 25, score: 92 });
expect(result.max).toEqual({ id: 3, name: 'Charlie', age: 35, score: 78 });
});
test('should find min and max by score', () => {
const result = (0, findExtremesInColumn_1.default)(people, 'score');
expect(result.min).toEqual({ id: 3, name: 'Charlie', age: 35, score: 78 });
expect(result.max).toEqual({ id: 4, name: 'Diana', age: 28, score: 95 });
});
test('should find min and max by price', () => {
const result = (0, findExtremesInColumn_1.default)(products, 'price');
expect(result.min).toEqual({ id: 2, name: 'Mouse', price: 29.99, rating: 4.8 });
expect(result.max).toEqual({ id: 1, name: 'Laptop', price: 999.99, rating: 4.5 });
});
test('should find min and max by rating', () => {
const result = (0, findExtremesInColumn_1.default)(products, 'rating');
expect(result.min).toEqual({ id: 3, name: 'Keyboard', price: 79.99, rating: 4.2 });
expect(result.max).toEqual({ id: 2, name: 'Mouse', price: 29.99, rating: 4.8 });
});
});
describe('String column extremes', () => {
test('should find min and max by name (alphabetical)', () => {
const result = (0, findExtremesInColumn_1.default)(people, 'name');
expect(result.min).toEqual({ id: 1, name: 'Alice', age: 30, score: 85 });
expect(result.max).toEqual({ id: 4, name: 'Diana', age: 28, score: 95 });
});
test('should find min and max product names', () => {
const result = (0, findExtremesInColumn_1.default)(products, 'name');
expect(result.min).toEqual({ id: 3, name: 'Keyboard', price: 79.99, rating: 4.2 });
expect(result.max).toEqual({ id: 2, name: 'Mouse', price: 29.99, rating: 4.8 });
});
});
describe('Edge cases', () => {
test('should return undefined for empty array', () => {
const result = (0, findExtremesInColumn_1.default)([], 'age');
expect(result.min).toBeUndefined();
expect(result.max).toBeUndefined();
});
test('should handle single item array', () => {
const singlePerson = [{ id: 1, name: 'Solo', age: 25, score: 90 }];
const result = (0, findExtremesInColumn_1.default)(singlePerson, 'age');
expect(result.min).toEqual(singlePerson[0]);
expect(result.max).toEqual(singlePerson[0]);
expect(result.min).toBe(singlePerson[0]); // Same reference
expect(result.max).toBe(singlePerson[0]); // Same reference
});
test('should handle identical values', () => {
const identical = [
{ id: 1, value: 50 },
{ id: 2, value: 50 },
{ id: 3, value: 50 }
];
const result = (0, findExtremesInColumn_1.default)(identical, 'value');
expect(result.min?.value).toBe(50);
expect(result.max?.value).toBe(50);
expect(result.min).toBe(identical[0]); // Should be first item
expect(result.max).toBe(identical[0]); // Should be first item
});
test('should handle two identical values', () => {
const twoItems = [
{ id: 1, score: 75 },
{ id: 2, score: 75 }
];
const result = (0, findExtremesInColumn_1.default)(twoItems, 'score');
expect(result.min).toBe(twoItems[0]);
expect(result.max).toBe(twoItems[0]);
});
});
describe('Mixed and extreme values', () => {
test('should handle negative numbers', () => {
const withNegatives = [
{ id: 1, value: -10 },
{ id: 2, value: 5 },
{ id: 3, value: -25 },
{ id: 4, value: 15 }
];
const result = (0, findExtremesInColumn_1.default)(withNegatives, 'value');
expect(result.min).toEqual({ id: 3, value: -25 });
expect(result.max).toEqual({ id: 4, value: 15 });
});
test('should handle decimal numbers', () => {
const withDecimals = [
{ id: 1, value: 3.14 },
{ id: 2, value: 2.71 },
{ id: 3, value: 1.41 },
{ id: 4, value: 1.73 }
];
const result = (0, findExtremesInColumn_1.default)(withDecimals, 'value');
expect(result.min).toEqual({ id: 3, value: 1.41 });
expect(result.max).toEqual({ id: 1, value: 3.14 });
});
test('should handle zero values', () => {
const withZero = [
{ id: 1, value: 0 },
{ id: 2, value: -5 },
{ id: 3, value: 10 }
];
const result = (0, findExtremesInColumn_1.default)(withZero, 'value');
expect(result.min).toEqual({ id: 2, value: -5 });
expect(result.max).toEqual({ id: 3, value: 10 });
});
});
describe('Reference integrity', () => {
test('should return references to original objects', () => {
const result = (0, findExtremesInColumn_1.default)(people, 'age');
expect(result.min).toBe(people[1]); // Bob (age 25)
expect(result.max).toBe(people[2]); // Charlie (age 35)
});
test('should not mutate original array', () => {
const original = [...people];
const result = (0, findExtremesInColumn_1.default)(people, 'age');
expect(people).toEqual(original);
expect(result.min).toBeTruthy();
expect(result.max).toBeTruthy();
});
});
describe('Complex scenarios', () => {
test('should handle first item being both min and max', () => {
const sameValue = [
{ id: 1, value: 42 },
{ id: 2, value: 42 },
{ id: 3, value: 42 }
];
const result = (0, findExtremesInColumn_1.default)(sameValue, 'value');
expect(result.min).toBe(sameValue[0]);
expect(result.max).toBe(sameValue[0]);
});
test('should handle min at end, max at beginning', () => {
const items = [
{ id: 1, value: 100 }, // max
{ id: 2, value: 50 },
{ id: 3, value: 25 }, // min
];
const result = (0, findExtremesInColumn_1.default)(items, 'value');
expect(result.min).toBe(items[2]);
expect(result.max).toBe(items[0]);
});
test('should work with different data types for comparison', () => {
const dates = [
{ id: 1, timestamp: new Date('2023-06-15') },
{ id: 2, timestamp: new Date('2023-01-01') }, // min
{ id: 3, timestamp: new Date('2023-12-31') } // max
];
const result = (0, findExtremesInColumn_1.default)(dates, 'timestamp');
expect(result.min?.id).toBe(2);
expect(result.max?.id).toBe(3);
});
});
});