215 lines
6.7 KiB
TypeScript
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' });
|
|
});
|
|
});
|
|
}); |