Skip to content

Commit

Permalink
Merge pull request #574 from GuillaumeGomez/validator
Browse files Browse the repository at this point in the history
Command input validator - part 15
  • Loading branch information
GuillaumeGomez authored Mar 9, 2024
2 parents bd7df80 + 3c46167 commit f1b87a2
Show file tree
Hide file tree
Showing 42 changed files with 141 additions and 140 deletions.
186 changes: 91 additions & 95 deletions src/commands/context_setters.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
// Commands changing the browser-ui-test state of the current test.

const consts = require('../consts.js');
const { validator } = require('../validator.js');
const { hasError } = require('../utils.js');

// Possible inputs:
//
// * boolean value (`true` or `false`)
function parseExpectFailure(parser) {
const elems = parser.elems;
if (elems.length === 0) {
return {'error': 'expected `true` or `false` value, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'boolean') {
return {'error': `expected \`true\` or \`false\` value, found \`${parser.getRawArgs()}\``};
const ret = validator(parser, { kind: 'boolean' });
if (hasError(ret)) {
return ret;
}

return {
'instructions': [
`arg.expectedToFail = ${elems[0].getRaw()};`,
`arg.expectedToFail = ${ret.value.getRaw()};`,
],
'wait': false,
};
Expand All @@ -24,25 +25,28 @@ function parseExpectFailure(parser) {
//
// * boolean value (`true` or `false`)
function parseShowText(parser) {
const elems = parser.elems;
if (elems.length === 0) {
return {'error': 'expected `true` or `false` value, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'boolean') {
return {'error': `expected \`true\` or \`false\` value, found \`${parser.getRawArgs()}\``};
const ret = validator(parser, { kind: 'boolean' });
if (hasError(ret)) {
return ret;
}

// We need the value to be updated first.
const instructions = [`arg.showText = ${elems[0].getRaw()};`];
const instructions = [`arg.showText = ${ret.value.getRaw()};`];
// And then to make the expected changes to the DOM.
if (elems[0].getRaw() === 'true') {
instructions.push('await page.evaluate(() => {\n' +
`let tmp = document.getElementById('${consts.STYLE_HIDE_TEXT_ID}');\n` +
'if (tmp) { tmp.remove(); }\n' +
'});');
if (ret.value.getRaw() === 'true') {
instructions.push(`\
await page.evaluate(() => {
let tmp = document.getElementById('${consts.STYLE_HIDE_TEXT_ID}');
if (tmp) { tmp.remove(); }
});`,
);
} else {
instructions.push('await page.evaluate(() => {\n' +
`window.${consts.STYLE_ADDER_FUNCTION}('${consts.CSS_TEXT_HIDE}', ` +
`'${consts.STYLE_HIDE_TEXT_ID}');\n` +
'});');
const text_hide = consts.CSS_TEXT_HIDE;
instructions.push(`\
await page.evaluate(() => {
window.${consts.STYLE_ADDER_FUNCTION}('${text_hide}', '${consts.STYLE_HIDE_TEXT_ID}');
});`,
);
}
return {
'instructions': instructions,
Expand All @@ -55,55 +59,50 @@ function parseShowText(parser) {
// * "CSS selector"
// * "XPath"
function parseScreenshotComparison(parser) {
const elems = parser.elems;
if (elems.length === 0) {
return {'error': 'expected boolean or CSS selector or XPath, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'boolean' && elems[0].kind !== 'string') {
return {
'error': `expected boolean or CSS selector or XPath, found \`${parser.getRawArgs()}\``,
};
} else if (elems[0].kind === 'boolean') {
const ret = validator(parser, {
kind: 'boolean',
alternatives: [
{
kind: 'selector',
},
],
});
if (hasError(ret)) {
return ret;
}

if (ret.value.kind === 'boolean') {
return {
'instructions': [
`arg.screenshotComparison = ${elems[0].getRaw()};`,
`arg.screenshotComparison = ${ret.value.getRaw()};`,
],
'wait': false,
};
}
const warnings = [];
const selector = elems[0].getSelector();
if (selector.error !== undefined) {
return selector;
} else if (selector.value === 'true' || selector.value === 'false') {
warnings.push(`\`${elems[0].getErrorText()}\` is a string and will be used as CSS ` +
'selector. If you want to set `true` or `false` value, remove quotes.');
}
return {
'instructions': [
`arg.screenshotComparison = "${selector.value}";`,
`arg.screenshotComparison = "${ret.value.value}";`,
],
'wait': false,
'warnings': warnings.length > 0 ? warnings.join('\n') : undefined,
};
}

// Possible inputs:
//
// * boolean value (`true` or `false`)
function parseDebug(parser) {
const elems = parser.elems;
if (elems.length === 0) {
return {'error': 'expected `true` or `false` value, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'boolean') {
return {'error': `expected \`true\` or \`false\` value, found \`${parser.getRawArgs()}\``};
const ret = validator(parser, { kind: 'boolean' });
if (hasError(ret)) {
return ret;
}

return {
'instructions': [
'if (arg && arg.debug_log && arg.debug_log.setDebugEnabled) {\n' +
`arg.debug_log.setDebugEnabled(${elems[0].getRaw()});\n` +
'} else {\n' +
'throw "`debug` command needs an object with a `debug_log` field of `Debug` type!";\n' +
'}',
'instructions': [`\
if (arg && arg.debug_log && arg.debug_log.setDebugEnabled) {
arg.debug_log.setDebugEnabled(${ret.value.getRaw()});
} else {
throw "\`debug\` command needs an object with a \`debug_log\` field of \`Debug\` type!";
}`,
],
'wait': false,
};
Expand All @@ -113,15 +112,14 @@ function parseDebug(parser) {
//
// * boolean value (`true` or `false`)
function parseScreenshotOnFailure(parser) {
const elems = parser.elems;
if (elems.length === 0) {
return {'error': 'expected `true` or `false` value, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'boolean') {
return {'error': `expected \`true\` or \`false\` value, found \`${parser.getRawArgs()}\``};
const ret = validator(parser, { kind: 'boolean' });
if (hasError(ret)) {
return ret;
}

return {
'instructions': [
`arg.screenshotOnFailure = ${elems[0].getRaw()};`,
`arg.screenshotOnFailure = ${ret.value.getRaw()};`,
],
'wait': false,
};
Expand All @@ -131,15 +129,14 @@ function parseScreenshotOnFailure(parser) {
//
// * boolean value (`true` or `false`)
function parsePauseOnError(parser) {
const elems = parser.elems;
if (elems.length === 0) {
return {'error': 'expected `true` or `false` value, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'boolean') {
return {'error': `expected \`true\` or \`false\` value, found \`${parser.getRawArgs()}\``};
const ret = validator(parser, { kind: 'boolean' });
if (hasError(ret)) {
return ret;
}

return {
'instructions': [
`arg.pauseOnError = ${elems[0].getRaw()};`,
`arg.pauseOnError = ${ret.value.getRaw()};`,
],
'wait': false,
};
Expand All @@ -149,64 +146,63 @@ function parsePauseOnError(parser) {
//
// * number
function parseSetTimeout(parser) {
const warnings = [];
const elems = parser.elems;

if (elems.length === 0) {
return {'error': 'expected integer for number of milliseconds, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'number') {
return {
'error': 'expected integer for number of milliseconds, found' +
` \`${parser.getRawArgs()}\``,
};
}
const ret = elems[0].getIntegerValue('number of milliseconds', true);
if (ret.error !== undefined) {
const ret = validator(parser, {
kind: 'number',
allowFloat: false,
allowNegative: false,
});
if (hasError(ret)) {
return ret;
}
if (parseInt(ret.value) === 0) {

const warnings = [];
if (parseInt(ret.value.value) === 0) {
warnings.push('You passed 0 as timeout, it means the timeout has been disabled on ' +
'this reload');
}
return {
'instructions': [
`page.setDefaultTimeout(${ret.value})`,
`page.setDefaultTimeout(${ret.value.value})`,
],
'wait': false,
'warnings': warnings.length > 0 ? warnings : undefined,
};
}

// Possible inputs:
//
// * boolean value (`true` or `false`)
function parseFailOnJsError(parser) {
const elems = parser.elems;
if (elems.length === 0) {
return {'error': 'expected `true` or `false` value, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'boolean') {
return {'error': `expected \`true\` or \`false\` value, found \`${parser.getRawArgs()}\``};
const ret = validator(parser, { kind: 'boolean' });
if (hasError(ret)) {
return ret;
}
const instructions = [
`const oldValue = arg.failOnJsError;
arg.failOnJsError = ${elems[0].getRaw()};

const instructions = [`\
const oldValue = arg.failOnJsError;
arg.failOnJsError = ${ret.value.getRaw()};
if (oldValue !== true) {
arg.jsErrors.splice(0, arg.jsErrors.length);
}`];
}`,
];

return {
'instructions': instructions,
'wait': false,
};
}

// Possible inputs:
//
// * boolean value (`true` or `false`)
function parseFailOnRequestError(parser) {
const elems = parser.elems;
if (elems.length === 0) {
return {'error': 'expected `true` or `false` value, found nothing'};
} else if (elems.length !== 1 || elems[0].kind !== 'boolean') {
return {'error': `expected \`true\` or \`false\` value, found \`${parser.getRawArgs()}\``};
const ret = validator(parser, { kind: 'boolean' });
if (hasError(ret)) {
return ret;
}
const instructions = [
`const oldValue = arg.failOnRequestError;
arg.failOnRequestError = ${elems[0].getRaw()};
const instructions = [`\
const oldValue = arg.failOnRequestError;
arg.failOnRequestError = ${ret.value.getRaw()};
if (oldValue !== true) {
arg.requestErrors.splice(0, arg.requestErrors.length);
}`];
Expand Down
6 changes: 6 additions & 0 deletions src/validator.js
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,12 @@ Format looks like this:
allowNegative: false,
optional: true,
},
{
kind: 'boolean',
},
{
kind: 'selector',
},
],
alternatives: [
{
Expand Down
4 changes: 2 additions & 2 deletions tests/test-js/api-output/parseDebug/basic-1.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
instructions = [
"""if (arg && arg.debug_log && arg.debug_log.setDebugEnabled) {
arg.debug_log.setDebugEnabled(false);
arg.debug_log.setDebugEnabled(false);
} else {
throw \"`debug` command needs an object with a `debug_log` field of `Debug` type!\";
throw \"`debug` command needs an object with a `debug_log` field of `Debug` type!\";
}""",
]
wait = false
4 changes: 2 additions & 2 deletions tests/test-js/api-output/parseDebug/basic-2.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
instructions = [
"""if (arg && arg.debug_log && arg.debug_log.setDebugEnabled) {
arg.debug_log.setDebugEnabled(true);
arg.debug_log.setDebugEnabled(true);
} else {
throw \"`debug` command needs an object with a `debug_log` field of `Debug` type!\";
throw \"`debug` command needs an object with a `debug_log` field of `Debug` type!\";
}""",
]
wait = false
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseDebug/err-1.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `hello`"""
error = """expected a boolean, found `hello` (an ident)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseDebug/err-2.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `\"true\"`"""
error = """expected a boolean, found `\"true\"` (a string)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseDebug/err-3.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `tru`"""
error = """expected a boolean, found `tru` (an ident)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseExpectFailure/err-1.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found nothing"""
error = """expected a boolean, found nothing"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseExpectFailure/err-2.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `hello`"""
error = """expected a boolean, found `hello` (an ident)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseExpectFailure/err-3.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `\"true\"`"""
error = """expected a boolean, found `\"true\"` (a string)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseExpectFailure/err-4.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `tru`"""
error = """expected a boolean, found `tru` (an ident)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseFailOnJsError/err-1.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found nothing"""
error = """expected a boolean, found nothing"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseFailOnJsError/err-2.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `hello`"""
error = """expected a boolean, found `hello` (an ident)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseFailOnJsError/err-3.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `\"true\"`"""
error = """expected a boolean, found `\"true\"` (a string)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parseFailOnJsError/err-4.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `tru`"""
error = """expected a boolean, found `tru` (an ident)"""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found nothing"""
error = """expected a boolean, found nothing"""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `hello`"""
error = """expected a boolean, found `hello` (an ident)"""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `\"true\"`"""
error = """expected a boolean, found `\"true\"` (a string)"""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `tru`"""
error = """expected a boolean, found `tru` (an ident)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parsePauseOnError/err-1.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `hello`"""
error = """expected a boolean, found `hello` (an ident)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parsePauseOnError/err-2.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `\"true\"`"""
error = """expected a boolean, found `\"true\"` (a string)"""
2 changes: 1 addition & 1 deletion tests/test-js/api-output/parsePauseOnError/err-3.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `tru`"""
error = """expected a boolean, found `tru` (an ident)"""
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,3 @@ instructions = [
"""arg.screenshotComparison = \"true\";""",
]
wait = false
warnings = """`\"true\"` is a string and will be used as CSS selector. If you want to set `true` or `false` value, remove quotes."""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected boolean or CSS selector or XPath, found nothing"""
error = """expected a boolean or a selector, found nothing"""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected boolean or CSS selector or XPath, found `hello`"""
error = """expected a boolean or a selector, found `hello` (an ident)"""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected boolean or CSS selector or XPath, found `tru`"""
error = """expected a boolean or a selector, found `tru` (an ident)"""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found nothing"""
error = """expected a boolean, found nothing"""
Original file line number Diff line number Diff line change
@@ -1 +1 @@
error = """expected `true` or `false` value, found `hello`"""
error = """expected a boolean, found `hello` (an ident)"""
Loading

0 comments on commit f1b87a2

Please sign in to comment.