nope-js-browser
Version:
NoPE Runtime for the Browser. For nodejs please use nope-js-node
400 lines (399 loc) • 17.6 kB
JavaScript
/**
* @author Martin Karkowski
* @email m.karkowski@zema.de
* @desc [description]
*/
import { assert, expect } from "chai";
import { describe, it } from "mocha";
import { comparePatternAndPath, containsWildcards, generateResult, patternIsValid, } from "./pathMatchingMethods";
describe("pathMatchingMethods", function () {
// Describe the required Test:
describe("comparePatternAndPath", function () {
describe("pattern test", function () {
const functionTests = [
{
desc: "simple matching topics",
pattern: "test",
path: "test",
expectedResult: generateResult({
pathToExtractData: "test",
affectedOnSameLevel: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "topics should match",
pattern: "test1",
path: "test2",
expectedResult: generateResult({
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "simple root topic compare topics",
pattern: "test",
path: "",
expectedResult: generateResult({
pathToExtractData: "test",
affectedByParent: true,
patternLengthComparedToPathLength: ">",
}),
},
{
desc: "match with multilevel wildcard",
pattern: "test/#",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedByChild: true,
containsWildcards: true,
patternLengthComparedToPathLength: "<",
}),
},
{
desc: "match with multilevel wildcard and same length",
pattern: "test/test/#",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with singlelevel wildcard",
pattern: "test/+/test",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with singlelevel wildcard as first element in pattern",
pattern: "+/test/test",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with singlelevel wildcard as last element in pattern",
pattern: "test/test/+",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with multiple singlelevel wildcards in pattern",
pattern: "test/+/+",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with singlelevel and multilevel wildcard in pattern",
pattern: "+/#",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedByChild: true,
containsWildcards: true,
patternLengthComparedToPathLength: "<",
}),
},
{
desc: "match with multilevel wildcard in pattern",
pattern: "test/#",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedByChild: true,
containsWildcards: true,
patternLengthComparedToPathLength: "<",
}),
},
{
desc: "pattern is longer than path",
pattern: "test/test/test/#",
path: "test",
expectedResult: generateResult({
patternToExtractData: "test/test/test/#",
affectedByParent: true,
containsWildcards: true,
patternLengthComparedToPathLength: ">",
}),
},
];
for (const test of functionTests) {
it(test.desc, function () {
let result = null;
try {
result = comparePatternAndPath(test.pattern, test.path);
expect(result).to.deep.equal(test.expectedResult);
}
catch (e) {
const delta = [];
for (const [key, value] of Object.entries(test.expectedResult)) {
if (result[key] !== value) {
delta.push(`- "${key}": expected: ${value}; got: ${result[key]}"`);
}
}
throw Error(`Failed with Test "${test.desc}".\nexpected=\t${JSON.stringify(test.expectedResult)}\nresult= \t${JSON.stringify(result)}\n${delta.join("\n")}`);
}
});
}
const errorTests = [
{
desc: "invalid pattern",
pattern: "test//",
path: "test",
},
{
desc: "invalid pattern",
pattern: "test/#/a",
path: "test",
},
{
desc: "invalid path",
pattern: "test/a",
path: "test//a",
},
{
desc: "invalid path",
pattern: "test/a",
path: "test/+",
},
{
desc: "invalid path",
pattern: "test/a",
path: "test/#",
},
{
desc: "invalid path",
pattern: "test/a",
path: "test/+/#",
},
];
for (const test of errorTests) {
it(test.desc, function () {
const error = new Error("A Error should be thrown");
try {
const result = comparePatternAndPath(test.pattern, test.path);
throw error;
}
catch (e) {
if (e == error) {
throw e;
}
}
});
}
});
describe("pattern without wildcard symbols", function () {
const functionTests = [
{
desc: "simple matching topics",
pattern: "test",
path: "test",
expectedResult: generateResult({
pathToExtractData: "test",
affectedOnSameLevel: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "topics should match",
pattern: "test1",
path: "test2",
expectedResult: generateResult({
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "simple root topic compare topics",
pattern: "test",
path: "",
expectedResult: generateResult({
pathToExtractData: "test",
affectedByParent: true,
patternLengthComparedToPathLength: ">",
}),
},
{
desc: "match with multilevel wildcard",
pattern: "test/#",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedByChild: true,
containsWildcards: true,
patternLengthComparedToPathLength: "<",
}),
},
{
desc: "match with multilevel wildcard and same length",
pattern: "test/test/#",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with singlelevel wildcard",
pattern: "test/+/test",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with singlelevel wildcard as first element in pattern",
pattern: "+/test/test",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with singlelevel wildcard as last element in pattern",
pattern: "test/test/+",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with multiple singlelevel wildcards in pattern",
pattern: "test/+/+",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedOnSameLevel: true,
containsWildcards: true,
patternLengthComparedToPathLength: "=",
}),
},
{
desc: "match with singlelevel and multilevel wildcard in pattern",
pattern: "+/#",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedByChild: true,
containsWildcards: true,
patternLengthComparedToPathLength: "<",
}),
},
{
desc: "match with multilevel wildcard in pattern",
pattern: "test/#",
path: "test/test/test",
expectedResult: generateResult({
pathToExtractData: "test/test/test",
affectedByChild: true,
containsWildcards: true,
patternLengthComparedToPathLength: "<",
}),
},
{
desc: "pattern is longer than path",
pattern: "test/test/test/#",
path: "test",
expectedResult: generateResult({
patternToExtractData: "test/test/test/#",
affectedByParent: true,
containsWildcards: true,
patternLengthComparedToPathLength: ">",
}),
},
// Now the specific Tests start:
{
desc: "pattern is longer than path",
pattern: "a/b",
path: "a",
expectedResult: generateResult({
pathToExtractData: "a/b",
affectedByParent: true,
containsWildcards: false,
patternLengthComparedToPathLength: ">",
}),
},
{
desc: "path is longer than pattern",
pattern: "a/b",
path: "a/b/c",
expectedResult: generateResult({
pathToExtractData: "a/b",
affectedByChild: true,
patternLengthComparedToPathLength: "<",
}),
},
];
for (const test of functionTests) {
it(test.desc, function () {
let result = null;
try {
result = comparePatternAndPath(test.pattern, test.path, {
matchTopicsWithoutWildcards: true,
});
expect(result).to.deep.equal(test.expectedResult);
}
catch (e) {
throw Error(`Failed with Test "${test.desc}".\nexpected=\t${JSON.stringify(test.expectedResult)}\nresult= \t${JSON.stringify(result)}`);
}
});
}
});
});
describe("containsWildcards", function () {
it("test wildcard detection", function () {
expect(containsWildcards("test")).to.be.false;
expect(containsWildcards("test/#")).to.be.true;
expect(containsWildcards("test/+")).to.be.true;
});
});
describe("patternIsValid", function () {
it("should be invalid", function () {
expect(patternIsValid("test//#")).to.be.false;
expect(patternIsValid("test/a/#/b")).to.be.false;
// Leading Splitchar
expect(patternIsValid("test/a/")).to.be.false;
});
it("should be valid", function () {
assert.isTrue(patternIsValid("test/#"), "multi-level wildcard at the end should be fine");
assert.isTrue(patternIsValid("#"), "multi-level wildcard only should be fine");
assert.isTrue(patternIsValid("+"), "single-level only should be fine");
assert.isTrue(patternIsValid("+/#"), "combined should be fine");
assert.isTrue(patternIsValid("a/+/a/#"), "combined with char");
assert.isTrue(patternIsValid("+/+"), "multi single-level should be fine");
assert.isTrue(patternIsValid("a/b/c"), "chars only should be fine");
});
});
});