import { GetDashboardDataOutputDTO } from './GetDashboardDataOutputDTO';

describe('GetDashboardDataOutputDTO', () => {
  describe('TDD - Test First', () => {
    it('should create valid DTO with all fields', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 100;
      dto.activeUsers = 50;
      dto.totalRaces = 20;
      dto.totalLeagues = 5;

      // Assert
      expect(dto.totalUsers).toBe(100);
      expect(dto.activeUsers).toBe(50);
      expect(dto.totalRaces).toBe(20);
      expect(dto.totalLeagues).toBe(5);
    });

    it('should handle zero values', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 0;
      dto.activeUsers = 0;
      dto.totalRaces = 0;
      dto.totalLeagues = 0;

      // Assert
      expect(dto.totalUsers).toBe(0);
      expect(dto.activeUsers).toBe(0);
      expect(dto.totalRaces).toBe(0);
      expect(dto.totalLeagues).toBe(0);
    });

    it('should handle large numbers', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 1000000;
      dto.activeUsers = 500000;
      dto.totalRaces = 100000;
      dto.totalLeagues = 10000;

      // Assert
      expect(dto.totalUsers).toBe(1000000);
      expect(dto.activeUsers).toBe(500000);
      expect(dto.totalRaces).toBe(100000);
      expect(dto.totalLeagues).toBe(10000);
    });

    it('should handle single digit values', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 1;
      dto.activeUsers = 1;
      dto.totalRaces = 1;
      dto.totalLeagues = 1;

      // Assert
      expect(dto.totalUsers).toBe(1);
      expect(dto.activeUsers).toBe(1);
      expect(dto.totalRaces).toBe(1);
      expect(dto.totalLeagues).toBe(1);
    });

    it('should handle active users greater than total users', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 100;
      dto.activeUsers = 150;
      dto.totalRaces = 20;
      dto.totalLeagues = 5;

      // Assert
      expect(dto.totalUsers).toBe(100);
      expect(dto.activeUsers).toBe(150);
    });

    it('should handle zero active users', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 100;
      dto.activeUsers = 0;
      dto.totalRaces = 20;
      dto.totalLeagues = 5;

      // Assert
      expect(dto.activeUsers).toBe(0);
    });

    it('should handle zero total users', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 0;
      dto.activeUsers = 0;
      dto.totalRaces = 20;
      dto.totalLeagues = 5;

      // Assert
      expect(dto.totalUsers).toBe(0);
    });

    it('should handle zero races', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 100;
      dto.activeUsers = 50;
      dto.totalRaces = 0;
      dto.totalLeagues = 5;

      // Assert
      expect(dto.totalRaces).toBe(0);
    });

    it('should handle zero leagues', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 100;
      dto.activeUsers = 50;
      dto.totalRaces = 20;
      dto.totalLeagues = 0;

      // Assert
      expect(dto.totalLeagues).toBe(0);
    });

    it('should handle very large numbers', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 999999999;
      dto.activeUsers = 888888888;
      dto.totalRaces = 777777777;
      dto.totalLeagues = 666666666;

      // Assert
      expect(dto.totalUsers).toBe(999999999);
      expect(dto.activeUsers).toBe(888888888);
      expect(dto.totalRaces).toBe(777777777);
      expect(dto.totalLeagues).toBe(666666666);
    });

    it('should handle decimal numbers', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 100.5;
      dto.activeUsers = 50.7;
      dto.totalRaces = 20.3;
      dto.totalLeagues = 5.9;

      // Assert
      expect(dto.totalUsers).toBe(100.5);
      expect(dto.activeUsers).toBe(50.7);
      expect(dto.totalRaces).toBe(20.3);
      expect(dto.totalLeagues).toBe(5.9);
    });

    it('should handle negative numbers', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = -100;
      dto.activeUsers = -50;
      dto.totalRaces = -20;
      dto.totalLeagues = -5;

      // Assert
      expect(dto.totalUsers).toBe(-100);
      expect(dto.activeUsers).toBe(-50);
      expect(dto.totalRaces).toBe(-20);
      expect(dto.totalLeagues).toBe(-5);
    });

    it('should handle scientific notation', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = 1e6;
      dto.activeUsers = 5e5;
      dto.totalRaces = 2e4;
      dto.totalLeagues = 5e3;

      // Assert
      expect(dto.totalUsers).toBe(1000000);
      expect(dto.activeUsers).toBe(500000);
      expect(dto.totalRaces).toBe(20000);
      expect(dto.totalLeagues).toBe(5000);
    });

    it('should handle maximum safe integer', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = Number.MAX_SAFE_INTEGER;
      dto.activeUsers = Number.MAX_SAFE_INTEGER;
      dto.totalRaces = Number.MAX_SAFE_INTEGER;
      dto.totalLeagues = Number.MAX_SAFE_INTEGER;

      // Assert
      expect(dto.totalUsers).toBe(Number.MAX_SAFE_INTEGER);
      expect(dto.activeUsers).toBe(Number.MAX_SAFE_INTEGER);
      expect(dto.totalRaces).toBe(Number.MAX_SAFE_INTEGER);
      expect(dto.totalLeagues).toBe(Number.MAX_SAFE_INTEGER);
    });

    it('should handle minimum safe integer', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = Number.MIN_SAFE_INTEGER;
      dto.activeUsers = Number.MIN_SAFE_INTEGER;
      dto.totalRaces = Number.MIN_SAFE_INTEGER;
      dto.totalLeagues = Number.MIN_SAFE_INTEGER;

      // Assert
      expect(dto.totalUsers).toBe(Number.MIN_SAFE_INTEGER);
      expect(dto.activeUsers).toBe(Number.MIN_SAFE_INTEGER);
      expect(dto.totalRaces).toBe(Number.MIN_SAFE_INTEGER);
      expect(dto.totalLeagues).toBe(Number.MIN_SAFE_INTEGER);
    });

    it('should handle Infinity', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = Infinity;
      dto.activeUsers = Infinity;
      dto.totalRaces = Infinity;
      dto.totalLeagues = Infinity;

      // Assert
      expect(dto.totalUsers).toBe(Infinity);
      expect(dto.activeUsers).toBe(Infinity);
      expect(dto.totalRaces).toBe(Infinity);
      expect(dto.totalLeagues).toBe(Infinity);
    });

    it('should handle NaN', () => {
      // Arrange & Act
      const dto = new GetDashboardDataOutputDTO();
      dto.totalUsers = NaN;
      dto.activeUsers = NaN;
      dto.totalRaces = NaN;
      dto.totalLeagues = NaN;

      // Assert
      expect(dto.totalUsers).toBeNaN();
      expect(dto.activeUsers).toBeNaN();
      expect(dto.totalRaces).toBeNaN();
      expect(dto.totalLeagues).toBeNaN();
    });
  });
});
