Skip to content

Commit

Permalink
move sequence editor number parsing utils to codemirror-utils.ts and …
Browse files Browse the repository at this point in the history
…write unit tests
  • Loading branch information
dandelany committed Sep 18, 2024
1 parent 9eb3d7e commit e3efeef
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 15 deletions.
37 changes: 36 additions & 1 deletion src/utilities/codemirror/codemirror-utils.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
import { describe, expect, it } from 'vitest';
import { isQuoted, quoteEscape, removeEscapedQuotes, unquoteUnescape } from './codemirror-utils';
import {
isHexValue,
isQuoted,
parseNumericArg,
quoteEscape,
removeEscapedQuotes,
unquoteUnescape,
} from './codemirror-utils';

describe(`'Escaped quotes' from input`, () => {
it('Should remove escaped quotes surrounding a string', () => {
Expand Down Expand Up @@ -82,3 +89,31 @@ describe('quoteEscape', () => {
});
});
});

describe('parseNumericArg', function () {
it("should parse 'float' and 'numeric' args as floats", function () {
expect(parseNumericArg('1.23', 'float')).toEqual(1.23);
expect(parseNumericArg('2.34', 'numeric')).toEqual(2.34);
expect(parseNumericArg('bad', 'float')).toEqual(NaN);
// can't parse hex numbers as float
expect(parseNumericArg('0xabc', 'float')).toEqual(0);
});
it("should parse 'integer' and 'unsigned' args as integers", function () {
expect(parseNumericArg('123', 'integer')).toEqual(123);
expect(parseNumericArg('234', 'unsigned')).toEqual(234);
expect(parseNumericArg('234.567', 'integer')).toEqual(234);
// can parse hex integers
expect(parseNumericArg('0xff', 'integer')).toEqual(255);
expect(parseNumericArg('0x1f', 'unsigned')).toEqual(31);
});
});
describe('isHexValue', function () {
it('should correctly identify a hex number string', function () {
expect(isHexValue('12')).toBe(false);
expect(isHexValue('ff')).toBe(false);
expect(isHexValue('0x99')).toBe(true);
expect(isHexValue('0xdeadbeef')).toBe(true);
expect(isHexValue('0x12ab')).toBe(true);
expect(isHexValue('0x12xx')).toBe(false);
});
});
13 changes: 13 additions & 0 deletions src/utilities/codemirror/codemirror-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,16 @@ export function removeEscapedQuotes(text: string | number | boolean): string | n
}
return text;
}

export function parseNumericArg(argText: string, dictArgType: 'float' | 'integer' | 'numeric' | 'unsigned') {
switch (dictArgType) {
case 'float':
case 'numeric':
return parseFloat(argText);
}
return parseInt(argText);
}

export function isHexValue(argText: string) {
return /^0x[\da-f]+$/i.test(argText);
}
15 changes: 1 addition & 14 deletions src/utilities/sequence-editor/sequence-linter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { TOKEN_COMMAND, TOKEN_ERROR, TOKEN_REPEAT_ARG, TOKEN_REQUEST } from '../
import { TimeTypes } from '../../enums/time';
import { getGlobals, sequenceAdaptation } from '../../stores/sequence-adaptation';
import { CustomErrorCodes } from '../../workers/customCodes';
import { addDefaultArgs, quoteEscape } from '../codemirror/codemirror-utils';
import { addDefaultArgs, quoteEscape, parseNumericArg, isHexValue } from '../codemirror/codemirror-utils';
import {
getBalancedDuration,
getDoyTime,
Expand Down Expand Up @@ -72,19 +72,6 @@ type VariableMap = {
[name: string]: VariableDeclaration;
};

function parseNumericArg(argText: string, dictArgType: 'float' | 'integer' | 'numeric' | 'unsigned') {
switch (dictArgType) {
case 'float':
case 'numeric':
return parseFloat(argText);
}
return parseInt(argText);
}

function isHexValue(argText: string) {
return /^0x[\da-f]+$/i.test(argText);
}

/**
* Linter function that returns a Code Mirror extension function.
* Can be optionally called with a command dictionary so it's available during linting.
Expand Down

0 comments on commit e3efeef

Please sign in to comment.