I have a strange behavior on a switch
statement that is supposed to check for possible values of a string.
I’m trying to develop a little parser and using TDD I managed to write (and test) a function that parses a single line at a time, resulting in the expected result for all my cases.
Now I’m developing a bigger function that parses a bunch of lines at once so what it does is essentially split these lines and call the function that parses one line at a time.
The strange behaviour happens when I’m checking a value:
parseLine(terrainLine: string): Terrain | Tile[] | Adventurer {
const [lineType, lineData] = terrainLine.trim().split(' - ');
switch (lineType) {
case 'C':
return Terrain.parseTerrain(lineData);
case 'T':
return Terrain.parseTreasures(lineData);
case 'M':
return [Terrain.parseMountain(lineData)];
case 'A':
return Terrain.parseAdventurer(lineData);
default: {
throw new TerrainError(
`Unable to parse terrain tile with data: "${terrainLine}"`,
);
}
}
}
This function is tested and should be working properly with strings like 'C - 3 - 4'
(this input was tested and passed) but when the following function makes a call, it does not work anymore and instead it triggers the default
statement:
parse(terrainString: stirng): Terrain {
const linesToParse = terrainString
.split('n')
.map((_) => _.trim()) // Get rid of spaces before and after interesting data
.filter((_) => _.length && !_.startsWith('#')); // Get rid of empty lines && comments lines
linesToParse.forEach((line) => {
const parsed = Terrain.parseLine(line);
// [...]
}
// [...]
}
For reference, here are the tests I use:
// This one passes
it('should parse terrain lines right', () => {
const terrainLine = 'C - 3 - 4';
const expectedTerrain = new Terrain(3, 4);
const parsed = parseLine(terrainLine);
expect(parsed).toBeInstanceOf(Terrain);
expect(parsed).toStrictEqual(expectedTerrain);
});
// This one doesn't
it('should accept valid terrains', () => {
const terrainString = 'C• - 3 - 4nM• - 1 - 0nM• - 2 - 1nT• - 0 - 3 - 2nT• - 1 - 3 - 3nA• - Lara - 1 - 1 - S - AADADAGGAn';
expect(() => {
Terrain.parse(terrainString);
}).not.toThrow();
});
Advertisement
Answer
As pointed out by @VLAZ, I had an invisible character of zero width when printed in my string which was causing this bug. Simply removing this character in the first place solved the problem.