225 lines
4.7 KiB
JavaScript
Raw Normal View History

/**
* Copyright 2017 Google Inc. All rights reserved.
* Modifications 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 Location = require('./Location');
const TestExpectation = {
Ok: 'ok',
Fail: 'fail',
};
function createHook(callback, name) {
const location = Location.getCallerLocation();
return { name, body: callback, location };
}
class Environment {
constructor(name) {
this._name = name;
this._hooks = [];
}
name() {
return this._name;
}
beforeEach(callback) {
this._hooks.push(createHook(callback, 'beforeEach'));
return this;
}
afterEach(callback) {
this._hooks.push(createHook(callback, 'afterEach'));
return this;
}
beforeAll(callback) {
this._hooks.push(createHook(callback, 'beforeAll'));
return this;
}
afterAll(callback) {
this._hooks.push(createHook(callback, 'afterAll'));
return this;
}
globalSetup(callback) {
this._hooks.push(createHook(callback, 'globalSetup'));
return this;
}
globalTeardown(callback) {
this._hooks.push(createHook(callback, 'globalTeardown'));
return this;
}
hooks(name) {
return this._hooks.filter(hook => !name || hook.name === name);
}
isEmpty() {
return !this._hooks.length;
}
}
class Test {
constructor(suite, name, callback, location) {
this._suite = suite;
this._name = name;
this._fullName = (suite.fullName() + ' ' + name).trim();
this._skipped = false;
this._expectation = TestExpectation.Ok;
this._body = callback;
this._location = location;
this._timeout = 100000000;
this._defaultEnvironment = new Environment(this._fullName);
this._environments = [this._defaultEnvironment];
this.Expectations = { ...TestExpectation };
}
suite() {
return this._suite;
}
name() {
return this._name;
}
fullName() {
return this._fullName;
}
location() {
return this._location;
}
body() {
return this._body;
}
skipped() {
return this._skipped;
}
setSkipped(skipped) {
this._skipped = skipped;
return this;
}
timeout() {
return this._timeout;
}
setTimeout(timeout) {
this._timeout = timeout;
return this;
}
expectation() {
return this._expectation;
}
setExpectation(expectation) {
this._expectation = expectation;
return this;
}
environment() {
return this._defaultEnvironment;
}
addEnvironment(environment) {
this._environments.push(environment);
return this;
}
removeEnvironment(environment) {
const index = this._environments.indexOf(environment);
if (index === -1)
throw new Error(`Environment "${environment.name()}" cannot be removed because it was not added to the suite "${this.fullName()}"`);
this._environments.splice(index, 1);
return this;
}
}
class Suite {
constructor(parentSuite, name, location) {
this._parentSuite = parentSuite;
this._name = name;
this._fullName = (parentSuite ? parentSuite.fullName() + ' ' + name : name).trim();
this._location = location;
this._skipped = false;
this._expectation = TestExpectation.Ok;
this._defaultEnvironment = new Environment(this._fullName);
this._environments = [this._defaultEnvironment];
this.Expectations = { ...TestExpectation };
}
parentSuite() {
return this._parentSuite;
}
name() {
return this._name;
}
fullName() {
return this._fullName;
}
skipped() {
return this._skipped;
}
setSkipped(skipped) {
this._skipped = skipped;
return this;
}
location() {
return this._location;
}
expectation() {
return this._expectation;
}
setExpectation(expectation) {
this._expectation = expectation;
return this;
}
environment() {
return this._defaultEnvironment;
}
addEnvironment(environment) {
this._environments.push(environment);
return this;
}
removeEnvironment(environment) {
const index = this._environments.indexOf(environment);
if (index === -1)
throw new Error(`Environment "${environment.name()}" cannot be removed because it was not added to the suite "${this.fullName()}"`);
this._environments.splice(index, 1);
return this;
}
}
module.exports = { TestExpectation, Environment, Test, Suite };