126 lines
5.7 KiB
TypeScript
126 lines
5.7 KiB
TypeScript
import 'mocha';
|
|
import { expect } from 'chai';
|
|
import { getScriptNodeId, getScriptId, getCategoryNodeId, getCategoryId } from '@/presentation/Scripts/ScriptsTree/ScriptNodeParser';
|
|
import { CategoryStub } from '../../../stubs/CategoryStub';
|
|
import { ScriptStub } from '../../../stubs/ScriptStub';
|
|
import { parseSingleCategory, parseAllCategories } from '@/presentation/Scripts/ScriptsTree/ScriptNodeParser';
|
|
import { CategoryCollectionStub } from '../../../stubs/CategoryCollectionStub';
|
|
import { INode, NodeType } from '@/presentation/Scripts/ScriptsTree/SelectableTree/Node/INode';
|
|
import { IScript } from '@/domain/IScript';
|
|
import { ICategory } from '@/domain/ICategory';
|
|
|
|
describe('ScriptNodeParser', () => {
|
|
it('can convert script id and back', () => {
|
|
// arrange
|
|
const script = new ScriptStub('test');
|
|
// act
|
|
const nodeId = getScriptNodeId(script);
|
|
const scriptId = getScriptId(nodeId);
|
|
// assert
|
|
expect(scriptId).to.equal(script.id);
|
|
});
|
|
it('can convert category id and back', () => {
|
|
// arrange
|
|
const category = new CategoryStub(55);
|
|
// act
|
|
const nodeId = getCategoryNodeId(category);
|
|
const scriptId = getCategoryId(nodeId);
|
|
// assert
|
|
expect(scriptId).to.equal(category.id);
|
|
});
|
|
describe('parseSingleCategory', () => {
|
|
it('can parse when category has sub categories', () => {
|
|
// arrange
|
|
const categoryId = 31;
|
|
const firstSubCategory = new CategoryStub(11).withScriptIds('111', '112');
|
|
const secondSubCategory = new CategoryStub(categoryId)
|
|
.withCategory(new CategoryStub(33).withScriptIds('331', '331'))
|
|
.withCategory(new CategoryStub(44).withScriptIds('44'));
|
|
const collection = new CategoryCollectionStub().withAction(new CategoryStub(categoryId)
|
|
.withCategory(firstSubCategory)
|
|
.withCategory(secondSubCategory));
|
|
// act
|
|
const nodes = parseSingleCategory(categoryId, collection);
|
|
// assert
|
|
expect(nodes).to.have.lengthOf(2);
|
|
expectSameCategory(nodes[0], firstSubCategory);
|
|
expectSameCategory(nodes[1], secondSubCategory);
|
|
});
|
|
it('can parse when category has sub scripts', () => {
|
|
// arrange
|
|
const categoryId = 31;
|
|
const scripts = [ new ScriptStub('script1'), new ScriptStub('script2'), new ScriptStub('script3') ];
|
|
const collection = new CategoryCollectionStub()
|
|
.withAction(new CategoryStub(categoryId).withScripts(...scripts));
|
|
// act
|
|
const nodes = parseSingleCategory(categoryId, collection);
|
|
// assert
|
|
expect(nodes).to.have.lengthOf(3);
|
|
expectSameScript(nodes[0], scripts[0]);
|
|
expectSameScript(nodes[1], scripts[1]);
|
|
expectSameScript(nodes[2], scripts[2]);
|
|
});
|
|
});
|
|
|
|
it('parseAllCategories parses as expected', () => {
|
|
// arrange
|
|
const collection = new CategoryCollectionStub()
|
|
.withAction(new CategoryStub(0).withScriptIds('1, 2'))
|
|
.withAction(new CategoryStub(1).withCategories(
|
|
new CategoryStub(3).withScriptIds('3', '4'),
|
|
new CategoryStub(4).withCategory(new CategoryStub(5).withScriptIds('6')),
|
|
));
|
|
// act
|
|
const nodes = parseAllCategories(collection);
|
|
// assert
|
|
expect(nodes).to.have.lengthOf(2);
|
|
expectSameCategory(nodes[0], collection.actions[0]);
|
|
expectSameCategory(nodes[1], collection.actions[1]);
|
|
});
|
|
});
|
|
|
|
function isReversible(category: ICategory): boolean {
|
|
if (category.scripts) {
|
|
return category.scripts.every((s) => s.canRevert());
|
|
}
|
|
return category.subCategories.every((c) => isReversible(c));
|
|
}
|
|
|
|
function expectSameCategory(node: INode, category: ICategory): void {
|
|
expect(node.type).to.equal(NodeType.Category, getErrorMessage('type'));
|
|
expect(node.id).to.equal(getCategoryNodeId(category), getErrorMessage('id'));
|
|
expect(node.documentationUrls).to.equal(category.documentationUrls, getErrorMessage('documentationUrls'));
|
|
expect(node.text).to.equal(category.name, getErrorMessage('name'));
|
|
expect(node.isReversible).to.equal(isReversible(category), getErrorMessage('isReversible'));
|
|
expect(node.children).to.have.lengthOf(category.scripts.length || category.subCategories.length, getErrorMessage('name'));
|
|
for (let i = 0; i < category.subCategories.length; i++) {
|
|
expectSameCategory(node.children[i], category.subCategories[i]);
|
|
}
|
|
for (let i = 0; i < category.scripts.length; i++) {
|
|
expectSameScript(node.children[i], category.scripts[i]);
|
|
}
|
|
function getErrorMessage(field: string) {
|
|
return `Unexpected node field: ${field}.\n` +
|
|
`\nActual node:\n${print(node)}` +
|
|
`\nExpected category:\n${print(category)}`;
|
|
}
|
|
}
|
|
|
|
function expectSameScript(node: INode, script: IScript): void {
|
|
expect(node.type).to.equal(NodeType.Script, getErrorMessage('type'));
|
|
expect(node.id).to.equal(getScriptNodeId(script), getErrorMessage('id'));
|
|
expect(node.documentationUrls).to.equal(script.documentationUrls, getErrorMessage('documentationUrls'));
|
|
expect(node.text).to.equal(script.name, getErrorMessage('name'));
|
|
expect(node.isReversible).to.equal(script.canRevert(), getErrorMessage('canRevert'));
|
|
expect(node.children).to.equal(undefined);
|
|
function getErrorMessage(field: string) {
|
|
return `Unexpected node field: ${field}.` +
|
|
`\nActual node:\n${print(node)}\n` +
|
|
`\nExpected script:\n${print(script)}`;
|
|
}
|
|
}
|
|
|
|
function print(object: any) {
|
|
return JSON.stringify(object, null, 2);
|
|
}
|