property parser

jh-changes
Shin'ya Ueoka 7 years ago
parent 5c449df9b6
commit 3dbdcdba07
  1. 31
      src/shared/commands/properties.js
  2. 41
      test/shared/commands/property.test.js

@ -0,0 +1,31 @@
const mustNumber = (v) => {
let num = Number(v);
if (isNaN(num)) {
throw new Error('Not number: ' + v);
}
return num;
};
const parseProperty = (word, types) => {
let [key, value] = word.split('=');
if (!value) {
value = !key.startsWith('no');
key = value ? key : key.slice(2);
}
let type = types[key];
if (!type) {
throw new Error('Unknown property: ' + key);
}
if (type === 'boolean' && typeof value !== 'boolean' ||
type !== 'boolean' && typeof value === 'boolean') {
throw new Error('Invalid argument: ' + word);
}
switch (type) {
case 'string': return [key, value];
case 'number': return [key, mustNumber(value)];
case 'boolean': return [key, value];
}
};
export { parseProperty };

@ -0,0 +1,41 @@
import { expect } from "chai";
import { parseProperty } from 'shared/commands/properties';
describe("shared/commands/properties", () => {
describe("#parseProperty", () => {
it('parse set string', () => {
let [key, value] = parseProperty('encoding=utf-8', { encoding: 'string' });
expect(key).to.equal('encoding');
expect(value).to.equal('utf-8');
});
it('parse set string', () => {
let [key, value] = parseProperty('history=50', { history: 'number' });
expect(key).to.equal('history');
expect(value).to.equal(50);
});
it('parse set boolean', () => {
let [key, value] = parseProperty('paste', { paste: 'boolean' });
expect(key).to.equal('paste');
expect(value).to.be.true;
[key, value] = parseProperty('nopaste', { paste: 'boolean' });
expect(key).to.equal('paste');
expect(value).to.be.false;
});
it('throws error on unknown property', () => {
expect(() => parseProperty('charset=utf-8', {})).to.throw(Error, 'Unknown');
expect(() => parseProperty('smoothscroll', {})).to.throw(Error, 'Unknown');
expect(() => parseProperty('nosmoothscroll', {})).to.throw(Error, 'Unknown');
})
it('throws error on invalid property', () => {
expect(() => parseProperty('charset=utf-8', { charset: 'number' })).to.throw(Error, 'Not number');
expect(() => parseProperty('charset=utf-8', { charset: 'boolean' })).to.throw(Error, 'Invalid');
expect(() => parseProperty('smoothscroll', { smoothscroll: 'string' })).to.throw(Error, 'Invalid');
expect(() => parseProperty('smoothscroll', { smoothscroll: 'number' })).to.throw(Error, 'Invalid');
})
});
});