151 lines
5.8 KiB
TypeScript
151 lines
5.8 KiB
TypeScript
import 'mocha';
|
|
import { expect } from 'chai';
|
|
import { ScriptCode } from '@/domain/ScriptCode';
|
|
import { IScriptCode } from '../../../src/domain/IScriptCode';
|
|
|
|
describe('ScriptCode', () => {
|
|
describe('scriptName', () => {
|
|
it('throws if undefined', () => {
|
|
// arrange
|
|
const expectedError = 'name is undefined';
|
|
const name = undefined;
|
|
// act
|
|
const act = () => new ScriptCode(name, 'non-empty-code', '');
|
|
// assert
|
|
expect(act).to.throw(expectedError);
|
|
});
|
|
});
|
|
describe('code', () => {
|
|
describe('throws with invalid code', () => {
|
|
// arrange
|
|
const scriptName = 'test-script';
|
|
const testCases = [
|
|
{
|
|
name: 'throws when "execute" and "revert" are same',
|
|
code: {
|
|
execute: 'same',
|
|
revert: 'same',
|
|
},
|
|
expectedError: `${scriptName} (revert): Code itself and its reverting code cannot be the same`,
|
|
},
|
|
{
|
|
name: 'cannot construct with undefined "execute"',
|
|
code: {
|
|
execute: undefined,
|
|
revert: 'code',
|
|
},
|
|
expectedError: `code of ${scriptName} is empty or undefined`,
|
|
},
|
|
{
|
|
name: 'cannot construct with empty "execute"',
|
|
code: {
|
|
execute: '',
|
|
revert: 'code',
|
|
},
|
|
expectedError: `code of ${scriptName} is empty or undefined`,
|
|
},
|
|
];
|
|
for (const testCase of testCases) {
|
|
it(testCase.name, () => {
|
|
// act
|
|
const act = () => new ScriptCode(scriptName, testCase.code.execute, testCase.code.revert);
|
|
// assert
|
|
expect(act).to.throw(testCase.expectedError);
|
|
});
|
|
}
|
|
});
|
|
describe('throws with invalid code in both "execute" or "revert"', () => {
|
|
// arrange
|
|
const scriptName = 'script-name';
|
|
const testCases = [
|
|
{
|
|
testName: 'cannot construct with duplicate lines',
|
|
code: 'duplicate\nduplicate\ntest\nduplicate',
|
|
expectedMessage: 'Duplicates detected in script "$scriptName":\n duplicate\nduplicate',
|
|
},
|
|
{
|
|
testName: 'cannot construct with empty lines',
|
|
code: 'line1\n\n\nline2',
|
|
expectedMessage: 'script has empty lines "$scriptName"',
|
|
},
|
|
];
|
|
// act
|
|
const actions = [];
|
|
for (const testCase of testCases) {
|
|
const substituteScriptName = (name) => testCase.expectedMessage.replace('$scriptName', name);
|
|
actions.push(...[
|
|
{
|
|
act: () => new ScriptCode(scriptName, testCase.code, undefined),
|
|
testName: `execute: ${testCase.testName}`,
|
|
expectedMessage: substituteScriptName(scriptName),
|
|
},
|
|
{
|
|
act: () => new ScriptCode(scriptName, 'valid code', testCase.code),
|
|
testName: `revert: ${testCase.testName}`,
|
|
expectedMessage: substituteScriptName(`${scriptName} (revert)`),
|
|
},
|
|
]);
|
|
}
|
|
// assert
|
|
for (const action of actions) {
|
|
it(action.testName, () => {
|
|
expect(action.act).to.throw(action.expectedMessage,
|
|
`Code used: ${action.code}`);
|
|
});
|
|
}
|
|
});
|
|
describe('sets as expected with valid "execute" or "revert"', () => {
|
|
// arrange
|
|
const testCases = [
|
|
{
|
|
testName: 'code is a valid string',
|
|
code: 'valid code',
|
|
},
|
|
{
|
|
testName: 'code consists of frequent code parts',
|
|
code: ') else (',
|
|
},
|
|
{
|
|
testName: 'code is a frequent code part',
|
|
code: ')',
|
|
},
|
|
{
|
|
testName: 'code with duplicated comment lines (::)',
|
|
code: ':: comment\n:: comment',
|
|
},
|
|
{
|
|
testName: 'code with duplicated comment lines (REM)',
|
|
code: 'REM comment\nREM comment',
|
|
},
|
|
];
|
|
// act
|
|
const actions = [];
|
|
for (const testCase of testCases) {
|
|
actions.push(...[
|
|
{
|
|
testName: `execute: ${testCase.testName}`,
|
|
act: () => createSut(testCase.code),
|
|
expect: (sut: IScriptCode) => sut.execute === testCase.code,
|
|
},
|
|
{
|
|
testName: `revert: ${testCase.testName}`,
|
|
act: () => createSut('different code', testCase.code),
|
|
expect: (sut: IScriptCode) => sut.revert === testCase.code,
|
|
},
|
|
]);
|
|
}
|
|
// assert
|
|
for (const action of actions) {
|
|
it(action.testName, () => {
|
|
const sut = action.act();
|
|
expect(action.expect(sut));
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
function createSut(code: string, revert = ''): ScriptCode {
|
|
return new ScriptCode('test-code', code, revert);
|
|
}
|