Files
gridpilot.gg/core/racing/domain/value-objects/TeamDrivingReasonCode.test.ts
2026-01-16 19:46:49 +01:00

215 lines
6.7 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import { TEAM_DRIVING_REASON_CODES, TeamDrivingReasonCode } from './TeamDrivingReasonCode';
describe('TeamDrivingReasonCode', () => {
describe('create', () => {
it('should create valid reason codes', () => {
for (const code of TEAM_DRIVING_REASON_CODES) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.value).toBe(code);
}
});
it('should throw error for empty string', () => {
expect(() => TeamDrivingReasonCode.create('')).toThrow(RacingDomainValidationError);
expect(() => TeamDrivingReasonCode.create('')).toThrow('cannot be empty');
});
it('should throw error for whitespace-only string', () => {
expect(() => TeamDrivingReasonCode.create(' ')).toThrow(RacingDomainValidationError);
});
it('should throw error for leading whitespace', () => {
expect(() => TeamDrivingReasonCode.create(' RACE_PERFORMANCE')).toThrow(RacingDomainValidationError);
expect(() => TeamDrivingReasonCode.create(' RACE_PERFORMANCE')).toThrow('leading or trailing whitespace');
});
it('should throw error for trailing whitespace', () => {
expect(() => TeamDrivingReasonCode.create('RACE_PERFORMANCE ')).toThrow(RacingDomainValidationError);
expect(() => TeamDrivingReasonCode.create('RACE_PERFORMANCE ')).toThrow('leading or trailing whitespace');
});
it('should throw error for invalid reason code', () => {
expect(() => TeamDrivingReasonCode.create('INVALID_CODE')).toThrow(RacingDomainValidationError);
expect(() => TeamDrivingReasonCode.create('INVALID_CODE')).toThrow('Invalid team driving reason code');
});
it('should throw error for null/undefined', () => {
expect(() => TeamDrivingReasonCode.create(null as unknown as string)).toThrow(RacingDomainValidationError);
expect(() => TeamDrivingReasonCode.create(undefined as unknown as string)).toThrow(RacingDomainValidationError);
});
});
describe('equals', () => {
it('should return true for same value', () => {
const code1 = TeamDrivingReasonCode.create('RACE_PERFORMANCE');
const code2 = TeamDrivingReasonCode.create('RACE_PERFORMANCE');
expect(code1.equals(code2)).toBe(true);
});
it('should return false for different values', () => {
const code1 = TeamDrivingReasonCode.create('RACE_PERFORMANCE');
const code2 = TeamDrivingReasonCode.create('RACE_INCIDENTS');
expect(code1.equals(code2)).toBe(false);
});
});
describe('toString', () => {
it('should return the string value', () => {
const code = TeamDrivingReasonCode.create('RACE_PERFORMANCE');
expect(code.toString()).toBe('RACE_PERFORMANCE');
});
});
describe('isPerformance', () => {
it('should return true for performance codes', () => {
const performanceCodes = [
'RACE_PERFORMANCE',
'RACE_GAIN_BONUS',
'RACE_PACE',
'RACE_QUALIFYING',
'RACE_CONSISTENCY',
];
for (const code of performanceCodes) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.isPerformance()).toBe(true);
}
});
it('should return false for non-performance codes', () => {
const nonPerformanceCodes = [
'RACE_INCIDENTS',
'RACE_DNF',
'RACE_DSQ',
'RACE_DNS',
'RACE_AFK',
'RACE_OVERTAKE',
'RACE_DEFENSE',
'RACE_TEAMWORK',
'RACE_SPORTSMANSHIP',
];
for (const code of nonPerformanceCodes) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.isPerformance()).toBe(false);
}
});
});
describe('isPenalty', () => {
it('should return true for penalty codes', () => {
const penaltyCodes = [
'RACE_INCIDENTS',
'RACE_DNF',
'RACE_DSQ',
'RACE_DNS',
'RACE_AFK',
];
for (const code of penaltyCodes) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.isPenalty()).toBe(true);
}
});
it('should return false for non-penalty codes', () => {
const nonPenaltyCodes = [
'RACE_PERFORMANCE',
'RACE_GAIN_BONUS',
'RACE_PACE',
'RACE_QUALIFYING',
'RACE_CONSISTENCY',
'RACE_OVERTAKE',
'RACE_DEFENSE',
'RACE_TEAMWORK',
'RACE_SPORTSMANSHIP',
];
for (const code of nonPenaltyCodes) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.isPenalty()).toBe(false);
}
});
});
describe('isPositive', () => {
it('should return true for positive codes', () => {
const positiveCodes = [
'RACE_PERFORMANCE',
'RACE_GAIN_BONUS',
'RACE_OVERTAKE',
'RACE_DEFENSE',
'RACE_TEAMWORK',
'RACE_SPORTSMANSHIP',
];
for (const code of positiveCodes) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.isPositive()).toBe(true);
}
});
it('should return false for non-positive codes', () => {
const nonPositiveCodes = [
'RACE_INCIDENTS',
'RACE_DNF',
'RACE_DSQ',
'RACE_DNS',
'RACE_AFK',
'RACE_PACE',
'RACE_QUALIFYING',
'RACE_CONSISTENCY',
];
for (const code of nonPositiveCodes) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.isPositive()).toBe(false);
}
});
});
describe('isNegative', () => {
it('should return true for negative codes', () => {
const negativeCodes = [
'RACE_INCIDENTS',
'RACE_DNF',
'RACE_DSQ',
'RACE_DNS',
'RACE_AFK',
];
for (const code of negativeCodes) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.isNegative()).toBe(true);
}
});
it('should return false for non-negative codes', () => {
const nonNegativeCodes = [
'RACE_PERFORMANCE',
'RACE_GAIN_BONUS',
'RACE_PACE',
'RACE_QUALIFYING',
'RACE_CONSISTENCY',
'RACE_OVERTAKE',
'RACE_DEFENSE',
'RACE_TEAMWORK',
'RACE_SPORTSMANSHIP',
];
for (const code of nonNegativeCodes) {
const reasonCode = TeamDrivingReasonCode.create(code);
expect(reasonCode.isNegative()).toBe(false);
}
});
});
describe('props', () => {
it('should return the correct props object', () => {
const code = TeamDrivingReasonCode.create('RACE_PERFORMANCE');
expect(code.props).toEqual({ value: 'RACE_PERFORMANCE' });
});
});
});