Skip to content

Commit f78ee77

Browse files
authored
handle commas in session yaml (#22)
1 parent 2def1f4 commit f78ee77

File tree

2 files changed

+130
-1
lines changed

2 files changed

+130
-1
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import { describe, it, expect, beforeEach, vi } from 'vitest';
2+
import { IRacingSDK } from './irsdk-node';
3+
import { getSdkOrMock } from './get-sdk';
4+
import type { INativeSDK } from '../native';
5+
6+
// Mock the getSdkOrMock module
7+
vi.mock('./get-sdk', () => ({
8+
getSdkOrMock: vi.fn().mockResolvedValue({
9+
startSDK: vi.fn(),
10+
getSessionData: vi.fn(),
11+
currDataVersion: 0,
12+
enableLogging: false,
13+
stopSDK: vi.fn(),
14+
isRunning: vi.fn().mockReturnValue(true),
15+
waitForData: vi.fn().mockReturnValue(true),
16+
getTelemetryData: vi.fn().mockReturnValue({}),
17+
getTelemetryVariable: vi.fn(),
18+
broadcast: vi.fn(),
19+
} as INativeSDK),
20+
}));
21+
22+
describe('irsdk-node', () => {
23+
let sdk: IRacingSDK;
24+
let mockSdk: INativeSDK;
25+
26+
beforeEach(async () => {
27+
sdk = new IRacingSDK();
28+
// Wait for SDK to be ready
29+
await sdk.ready();
30+
// Get the mock SDK instance
31+
mockSdk = await getSdkOrMock();
32+
});
33+
34+
it('should handle malformed YAML with trailing commas', () => {
35+
const malformedYaml = `
36+
WeekendInfo:
37+
TrackName: test track
38+
TrackID: 123
39+
DriverInfo:
40+
Drivers:
41+
- CarIdx: 1
42+
UserName: test
43+
AbbrevName: test, # Trailing comma
44+
Initials: T
45+
UserID: 12345
46+
`;
47+
48+
vi.mocked(mockSdk.getSessionData).mockReturnValue(malformedYaml);
49+
50+
const result = sdk.getSessionData();
51+
52+
expect(result).toBeDefined();
53+
expect(result?.WeekendInfo).toBeDefined();
54+
expect(result?.WeekendInfo?.TrackName).toBe('test track');
55+
expect(result?.DriverInfo?.Drivers[0]?.UserName).toBe('test');
56+
});
57+
58+
it('should handle empty or null values', () => {
59+
const malformedYaml = `
60+
WeekendInfo:
61+
TrackName: test track
62+
TrackID: 123
63+
DriverInfo:
64+
Drivers:
65+
- CarIdx: 1
66+
UserName: # Empty value
67+
AbbrevName: # Empty value
68+
Initials: # Empty value
69+
UserID: 12345
70+
`;
71+
72+
vi.mocked(mockSdk.getSessionData).mockReturnValue(malformedYaml);
73+
74+
const result = sdk.getSessionData();
75+
76+
expect(result).toBeDefined();
77+
expect(result?.DriverInfo?.Drivers[0]?.UserName).toBe(null);
78+
expect(result?.DriverInfo?.Drivers[0]?.AbbrevName).toBe(null);
79+
expect(result?.DriverInfo?.Drivers[0]?.Initials).toBe(null);
80+
});
81+
82+
it('should handle empty value with trailing comma', () => {
83+
const malformedYaml = `
84+
WeekendInfo:
85+
TrackName: navarra speedlong
86+
TrackID: 515
87+
DriverInfo:
88+
Drivers:
89+
- CarIdx: 11
90+
UserName:
91+
AbbrevName: ,
92+
Initials:
93+
UserID: 1195427
94+
`;
95+
96+
vi.mocked(mockSdk.getSessionData).mockReturnValue(malformedYaml);
97+
98+
const result = sdk.getSessionData();
99+
100+
expect(result).toBeDefined();
101+
expect(result?.DriverInfo?.Drivers[0]?.UserName).toBe(null);
102+
expect(result?.DriverInfo?.Drivers[0]?.AbbrevName).toBe(null);
103+
expect(result?.DriverInfo?.Drivers[0]?.Initials).toBe(null);
104+
expect(result?.DriverInfo?.Drivers[0]?.UserID).toBe(1195427);
105+
});
106+
107+
it('should handle quotes in names', () => {
108+
const malformedYaml = `
109+
WeekendInfo:
110+
TrackName: navarra speedlong
111+
TrackID: 515
112+
DriverInfo:
113+
Drivers:
114+
- CarIdx: 11
115+
TeamName: Mike's Team
116+
UserName: Coolio O'Brien
117+
`;
118+
119+
vi.mocked(mockSdk.getSessionData).mockReturnValue(malformedYaml);
120+
121+
const result = sdk.getSessionData();
122+
123+
expect(result).toBeDefined();
124+
expect(result?.DriverInfo?.Drivers[0]?.TeamName).toBe("Mike's Team");
125+
expect(result?.DriverInfo?.Drivers[0]?.UserName).toBe("Coolio O'Brien");
126+
});
127+
});

src/app/irsdk/node/irsdk-node.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,9 @@ export class IRacingSDK {
165165

166166
try {
167167
const seshString = this._sdk?.getSessionData();
168-
this._sessionData = yaml.load(seshString) as SessionData;
168+
// Remove trailing commas
169+
const fixedYaml = seshString?.replace(/(\w+):\s*,\s*\n/g, '$1: \n');
170+
this._sessionData = yaml.load(fixedYaml) as SessionData;
169171
return this._sessionData;
170172
} catch (err) {
171173
console.error('There was an error getting session data:', err);

0 commit comments

Comments
 (0)