test: add support for mocha (#3376)
This commit is contained in:
parent
7580360f59
commit
823ef86470
3764
package-lock.json
generated
3764
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -80,6 +80,7 @@
|
||||||
"jest": "^26.2.2",
|
"jest": "^26.2.2",
|
||||||
"jest-circus": "^26.2.2",
|
"jest-circus": "^26.2.2",
|
||||||
"jest-image-snapshot": "^4.0.2",
|
"jest-image-snapshot": "^4.0.2",
|
||||||
|
"mocha": "^8.1.1",
|
||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"node-stream-zip": "^1.8.2",
|
"node-stream-zip": "^1.8.2",
|
||||||
"pirates": "^4.0.1",
|
"pirates": "^4.0.1",
|
||||||
|
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
||||||
|
|
||||||
exports[`should work with complicated usecases 1`] = `
|
|
||||||
"[
|
|
||||||
{
|
|
||||||
\\"url\\": \\"http://localhost:<PORT>/csscoverage/involved.html\\",
|
|
||||||
\\"ranges\\": [
|
|
||||||
{
|
|
||||||
\\"start\\": 149,
|
|
||||||
\\"end\\": 297
|
|
||||||
},
|
|
||||||
{
|
|
||||||
\\"start\\": 327,
|
|
||||||
\\"end\\": 433
|
|
||||||
}
|
|
||||||
],
|
|
||||||
\\"text\\": \\"\\\\n@charset \\\\\\"utf-8\\\\\\";\\\\n@namespace svg url(http://www.w3.org/2000/svg);\\\\n@font-face {\\\\n font-family: \\\\\\"Example Font\\\\\\";\\\\n src: url(\\\\\\"./Dosis-Regular.ttf\\\\\\");\\\\n}\\\\n\\\\n#fluffy {\\\\n border: 1px solid black;\\\\n z-index: 1;\\\\n /* -webkit-disabled-property: rgb(1, 2, 3) */\\\\n -lol-cats: \\\\\\"dogs\\\\\\" /* non-existing property */\\\\n}\\\\n\\\\n@media (min-width: 1px) {\\\\n span {\\\\n -webkit-border-radius: 10px;\\\\n font-family: \\\\\\"Example Font\\\\\\";\\\\n animation: 1s identifier;\\\\n }\\\\n}\\\\n\\"
|
|
||||||
}
|
|
||||||
]"
|
|
||||||
`;
|
|
||||||
|
|
@ -72,8 +72,25 @@ it.skip(!CHROMIUM)('should work with media queries', async function({page, serve
|
||||||
it.skip(!CHROMIUM)('should work with complicated usecases', async function({page, server}) {
|
it.skip(!CHROMIUM)('should work with complicated usecases', async function({page, server}) {
|
||||||
await page.coverage.startCSSCoverage();
|
await page.coverage.startCSSCoverage();
|
||||||
await page.goto(server.PREFIX + '/csscoverage/involved.html');
|
await page.goto(server.PREFIX + '/csscoverage/involved.html');
|
||||||
const coverage = await page.coverage.stopCSSCoverage();
|
const coverage: any = await page.coverage.stopCSSCoverage();
|
||||||
expect(JSON.stringify(coverage, null, 2).replace(/:\d{4}\//g, ':<PORT>/')).toMatchSnapshot();
|
delete coverage[0].text;
|
||||||
|
delete coverage[0].url;
|
||||||
|
expect(coverage).toEqual(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"ranges": [
|
||||||
|
{
|
||||||
|
"start": 149,
|
||||||
|
"end": 297
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"start": 327,
|
||||||
|
"end": 433
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.skip(!CHROMIUM)('should ignore injected stylesheets', async function({page, server}) {
|
it.skip(!CHROMIUM)('should ignore injected stylesheets', async function({page, server}) {
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,8 @@ class FixturePool {
|
||||||
}
|
}
|
||||||
|
|
||||||
wrapTestCallback(callback) {
|
wrapTestCallback(callback) {
|
||||||
|
if (!callback)
|
||||||
|
return callback;
|
||||||
return async() => {
|
return async() => {
|
||||||
try {
|
try {
|
||||||
return await this.resolveParametersAndRun(callback);
|
return await this.resolveParametersAndRun(callback);
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const colors = require('colors/safe');
|
const colors = require('colors/safe');
|
||||||
const { runTestsByPath } = require('../../jest.config');
|
|
||||||
const failures = [];
|
const failures = [];
|
||||||
|
|
||||||
module.exports = function Reporter() {
|
module.exports = function Reporter() {
|
||||||
|
|
|
||||||
51
test/mocha/dot.js
Normal file
51
test/mocha/dot.js
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) Microsoft Corporation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Base = require('mocha/lib/reporters/base');
|
||||||
|
const constants = require('mocha/lib/runner').constants;
|
||||||
|
const colors = require('colors/safe');
|
||||||
|
|
||||||
|
class Dot extends Base {
|
||||||
|
constructor(runner, options) {
|
||||||
|
super(runner, options);
|
||||||
|
|
||||||
|
runner.on(constants.EVENT_RUN_BEGIN, () => {
|
||||||
|
process.stdout.write('\n');
|
||||||
|
});
|
||||||
|
|
||||||
|
runner.on(constants.EVENT_TEST_PENDING, test => {
|
||||||
|
process.stdout.write(colors.yellow('\u00B7'))
|
||||||
|
});
|
||||||
|
|
||||||
|
runner.on(constants.EVENT_TEST_PASS, () => {
|
||||||
|
process.stdout.write(colors.green('\u00B7'));
|
||||||
|
});
|
||||||
|
|
||||||
|
runner.on(constants.EVENT_TEST_FAIL, test => {
|
||||||
|
if (test.duration >= test.timeout())
|
||||||
|
process.stdout.write(colors.red('T'));
|
||||||
|
else
|
||||||
|
process.stdout.write(colors.red('F'));
|
||||||
|
});
|
||||||
|
|
||||||
|
runner.once(constants.EVENT_RUN_END, () => {
|
||||||
|
process.stdout.write('\n');
|
||||||
|
this.epilogue();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Dot;
|
||||||
134
test/mocha/fixturesUI.js
Normal file
134
test/mocha/fixturesUI.js
Normal file
|
|
@ -0,0 +1,134 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) Microsoft Corporation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { FixturePool, registerFixture, registerWorkerFixture } = require('../harness/fixturePool');
|
||||||
|
const { Test, Suite } = require('mocha');
|
||||||
|
const pirates = require('pirates');
|
||||||
|
const babel = require('@babel/core');
|
||||||
|
const commonSuite = require('mocha/lib/interfaces/common');
|
||||||
|
|
||||||
|
Error.stackTraceLimit = 15;
|
||||||
|
global.testOptions = require('../harness/testOptions');
|
||||||
|
global.registerFixture = registerFixture;
|
||||||
|
global.registerWorkerFixture = registerWorkerFixture;
|
||||||
|
process.env.JEST_WORKER_ID = 1;
|
||||||
|
|
||||||
|
const fixturePool = new FixturePool();
|
||||||
|
let revertBabelRequire;
|
||||||
|
|
||||||
|
function fixturesUI(suite) {
|
||||||
|
const suites = [suite];
|
||||||
|
|
||||||
|
suite.on(Suite.constants.EVENT_FILE_PRE_REQUIRE, function(context, file, mocha) {
|
||||||
|
const common = commonSuite(suites, context, mocha);
|
||||||
|
|
||||||
|
context.beforeEach = common.beforeEach;
|
||||||
|
context.afterEach = common.afterEach;
|
||||||
|
fixturePool.patchToEnableFixtures(context, 'beforeEach');
|
||||||
|
fixturePool.patchToEnableFixtures(context, 'afterEach');
|
||||||
|
|
||||||
|
context.run = mocha.options.delay && common.runWithSuite(suite);
|
||||||
|
|
||||||
|
context.describe = (title, fn) => {
|
||||||
|
return common.suite.create({
|
||||||
|
title: title,
|
||||||
|
file: file,
|
||||||
|
fn: fn
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
context.xdescribe = (title, fn) => {
|
||||||
|
return common.suite.skip({
|
||||||
|
title: title,
|
||||||
|
file: file,
|
||||||
|
fn: fn
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
context.describe.skip = function(condition) {
|
||||||
|
return condition ? context.xdescribe : context.describe;
|
||||||
|
};
|
||||||
|
|
||||||
|
context.describe.only = (title, fn) => {
|
||||||
|
return common.suite.only({
|
||||||
|
title: title,
|
||||||
|
file: file,
|
||||||
|
fn: fn
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
context.fdescribe = context.describe.only;
|
||||||
|
|
||||||
|
context.it = context.specify = function(title, fn) {
|
||||||
|
const suite = suites[0];
|
||||||
|
if (suite.isPending()) {
|
||||||
|
fn = null;
|
||||||
|
}
|
||||||
|
const wrapped = fixturePool.wrapTestCallback(fn);
|
||||||
|
const wrapper = wrapped ? (done, ...args) => {
|
||||||
|
wrapped(...args).then(done).catch(done);
|
||||||
|
} : undefined;
|
||||||
|
|
||||||
|
const test = new Test(title, wrapper);
|
||||||
|
test.file = file;
|
||||||
|
suite.addTest(test);
|
||||||
|
return test;
|
||||||
|
};
|
||||||
|
|
||||||
|
context.it.only = function(title, fn) {
|
||||||
|
return common.test.only(mocha, context.it(title, fn));
|
||||||
|
};
|
||||||
|
|
||||||
|
context.fit = context.it.only;
|
||||||
|
|
||||||
|
context.xit = function(title) {
|
||||||
|
return context.it(title);
|
||||||
|
};
|
||||||
|
|
||||||
|
context.it.skip = function(condition) {
|
||||||
|
return condition ? context.xit : context.it;
|
||||||
|
};
|
||||||
|
|
||||||
|
context.it.fail = function(condition) {
|
||||||
|
return condition ? context.xit : context.it;
|
||||||
|
};
|
||||||
|
|
||||||
|
context.it.slow = function(condition) {
|
||||||
|
return context.it;
|
||||||
|
};
|
||||||
|
|
||||||
|
context.it.retries = function(n) {
|
||||||
|
context.retries(n);
|
||||||
|
};
|
||||||
|
|
||||||
|
revertBabelRequire = pirates.addHook((code, filename) => {
|
||||||
|
const result = babel.transformFileSync(filename, {
|
||||||
|
presets: [
|
||||||
|
['@babel/preset-env', {targets: {node: 'current'}}],
|
||||||
|
'@babel/preset-typescript']
|
||||||
|
});
|
||||||
|
return result.code;
|
||||||
|
}, {
|
||||||
|
exts: ['.ts']
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
suite.on(Suite.constants.EVENT_FILE_POST_REQUIRE, function(context, file, mocha) {
|
||||||
|
revertBabelRequire();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = { fixturesUI, fixturePool, registerFixture, registerWorkerFixture };
|
||||||
51
test/mocha/index.js
Normal file
51
test/mocha/index.js
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) Microsoft Corporation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const Mocha = require('mocha');
|
||||||
|
const { fixturesUI, fixturePool } = require('./fixturesUI');
|
||||||
|
const dot = require('./dot');
|
||||||
|
const { Matchers } = require('../../utils/testrunner/Matchers');
|
||||||
|
|
||||||
|
const browserName = process.env.BROWSER || 'chromium';
|
||||||
|
const goldenPath = path.join(__dirname, '..', 'golden-' + browserName);
|
||||||
|
const outputPath = path.join(__dirname, '..', 'output-' + browserName);
|
||||||
|
global.expect = new Matchers({ goldenPath, outputPath }).expect;
|
||||||
|
global.testOptions = require('../harness/testOptions');
|
||||||
|
|
||||||
|
const mocha = new Mocha({
|
||||||
|
ui: fixturesUI,
|
||||||
|
reporter: dot,
|
||||||
|
timeout: 10000,
|
||||||
|
});
|
||||||
|
const testDir = path.join(process.cwd(), 'test');
|
||||||
|
|
||||||
|
const filter = process.argv[2];
|
||||||
|
|
||||||
|
fs.readdirSync(testDir).filter(function(file) {
|
||||||
|
return file.includes('.spec.') && (!filter || file.includes(filter));
|
||||||
|
}).forEach(function(file) {
|
||||||
|
mocha.addFile(path.join(testDir, file));
|
||||||
|
});
|
||||||
|
|
||||||
|
const runner = mocha.run((failures) => {
|
||||||
|
process.exitCode = failures ? 1 : 0;
|
||||||
|
});
|
||||||
|
const constants = Mocha.Runner.constants;
|
||||||
|
runner.on(constants.EVENT_RUN_END, test => {
|
||||||
|
fixturePool.teardownScope('worker');
|
||||||
|
});
|
||||||
|
|
@ -22,7 +22,6 @@ const pirates = require('pirates');
|
||||||
const babel = require('@babel/core');
|
const babel = require('@babel/core');
|
||||||
const TestRunner = require('../../utils/testrunner');
|
const TestRunner = require('../../utils/testrunner');
|
||||||
const { FixturePool, registerFixture, registerWorkerFixture } = require('../harness/fixturePool');
|
const { FixturePool, registerFixture, registerWorkerFixture } = require('../harness/fixturePool');
|
||||||
const testOptions = require('../harness/testOptions');
|
|
||||||
|
|
||||||
Error.stackTraceLimit = 15;
|
Error.stackTraceLimit = 15;
|
||||||
global.testOptions = require('../harness/testOptions');
|
global.testOptions = require('../harness/testOptions');
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,12 @@ class Matchers {
|
||||||
outputPath: config.outputPath,
|
outputPath: config.outputPath,
|
||||||
goldenName
|
goldenName
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
|
|
||||||
|
toMatch: function(received, other, message) {
|
||||||
|
message = message || `${received}`;
|
||||||
|
return { pass: received.match(other), message };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue