UNPKG

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
"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); }); }); });