UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

206 lines (160 loc) • 6.04 kB
import { describe, expect, it, vi } from 'vitest'; import { MAX_SEED, calculateThumbnailDimensions, generateUniqueSeeds } from './number'; describe('number utilities', () => { describe('MAX_SEED constant', () => { it('should be 2^31 - 1', () => { expect(MAX_SEED).toBe(2147483647); expect(MAX_SEED).toBe(2 ** 31 - 1); }); }); describe('generateUniqueSeeds', () => { it('should generate the correct number of seeds', () => { const seedCount = 5; const seeds = generateUniqueSeeds(seedCount); expect(seeds).toHaveLength(seedCount); }); it('should generate unique seeds', () => { const seedCount = 10; const seeds = generateUniqueSeeds(seedCount); // Convert to Set to check uniqueness const uniqueSeeds = new Set(seeds); expect(uniqueSeeds.size).toBe(seedCount); }); it('should generate seeds within valid range', () => { const seedCount = 20; const seeds = generateUniqueSeeds(seedCount); seeds.forEach((seed) => { expect(seed).toBeGreaterThanOrEqual(0); expect(seed).toBeLessThanOrEqual(MAX_SEED); expect(Number.isInteger(seed)).toBe(true); }); }); it('should handle edge case of 0 seeds', () => { const seeds = generateUniqueSeeds(0); expect(seeds).toHaveLength(0); expect(Array.isArray(seeds)).toBe(true); }); it('should handle edge case of 1 seed', () => { const seeds = generateUniqueSeeds(1); expect(seeds).toHaveLength(1); expect(seeds[0]).toBeGreaterThanOrEqual(0); expect(seeds[0]).toBeLessThanOrEqual(MAX_SEED); }); it('should generate different results on different calls', () => { const seedCount = 5; // Generate seeds at different times to ensure different timestamps const seeds1 = generateUniqueSeeds(seedCount); // Add a small delay to ensure different timestamp vi.useFakeTimers(); vi.advanceTimersByTime(1); const seeds2 = generateUniqueSeeds(seedCount); vi.useRealTimers(); // The arrays should not be identical (very low probability of collision) expect(seeds1).not.toEqual(seeds2); }); it('should handle larger seed counts', () => { const seedCount = 100; const seeds = generateUniqueSeeds(seedCount); expect(seeds).toHaveLength(seedCount); // Verify uniqueness const uniqueSeeds = new Set(seeds); expect(uniqueSeeds.size).toBe(seedCount); // Verify all are in valid range seeds.forEach((seed) => { expect(seed).toBeGreaterThanOrEqual(0); expect(seed).toBeLessThanOrEqual(MAX_SEED); }); }); it('should use current timestamp as initial seed', () => { const mockTimestamp = 1234567890123; vi.useFakeTimers(); vi.setSystemTime(mockTimestamp); // Mock Date.now to verify it's being used const dateSpy = vi.spyOn(Date, 'now').mockReturnValue(mockTimestamp); generateUniqueSeeds(3); expect(dateSpy).toHaveBeenCalled(); dateSpy.mockRestore(); vi.useRealTimers(); }); }); describe('calculateThumbnailDimensions', () => { it('should not resize when both dimensions are within max size', () => { const result = calculateThumbnailDimensions(400, 300); expect(result).toEqual({ shouldResize: false, thumbnailWidth: 400, thumbnailHeight: 300, }); }); it('should not resize when dimensions equal max size', () => { const result = calculateThumbnailDimensions(512, 512); expect(result).toEqual({ shouldResize: false, thumbnailWidth: 512, thumbnailHeight: 512, }); }); it('should resize when width exceeds max size (landscape)', () => { const result = calculateThumbnailDimensions(1024, 768); expect(result).toEqual({ shouldResize: true, thumbnailWidth: 512, thumbnailHeight: 384, // Math.round((768 * 512) / 1024) }); }); it('should resize when height exceeds max size (portrait)', () => { const result = calculateThumbnailDimensions(768, 1024); expect(result).toEqual({ shouldResize: true, thumbnailWidth: 384, // Math.round((768 * 512) / 1024) thumbnailHeight: 512, }); }); it('should resize square images correctly', () => { const result = calculateThumbnailDimensions(1024, 1024); expect(result).toEqual({ shouldResize: true, thumbnailWidth: 512, thumbnailHeight: 512, }); }); it('should handle very large images', () => { const result = calculateThumbnailDimensions(2048, 1536); expect(result).toEqual({ shouldResize: true, thumbnailWidth: 512, thumbnailHeight: 384, // Math.round((1536 * 512) / 2048) }); }); it('should handle very tall images', () => { const result = calculateThumbnailDimensions(800, 2400); expect(result).toEqual({ shouldResize: true, thumbnailWidth: 171, // Math.round((800 * 512) / 2400) thumbnailHeight: 512, }); }); it('should work with custom max size', () => { const result = calculateThumbnailDimensions(1000, 800, 256); expect(result).toEqual({ shouldResize: true, thumbnailWidth: 256, thumbnailHeight: 205, // Math.round((800 * 256) / 1000) }); }); it('should handle edge case with very small dimensions', () => { const result = calculateThumbnailDimensions(50, 100); expect(result).toEqual({ shouldResize: false, thumbnailWidth: 50, thumbnailHeight: 100, }); }); it('should maintain aspect ratio correctly', () => { const result = calculateThumbnailDimensions(1600, 900); const originalRatio = 1600 / 900; const thumbnailRatio = result.thumbnailWidth / result.thumbnailHeight; expect(Math.abs(originalRatio - thumbnailRatio)).toBeLessThan(0.01); }); }); });