2021-11-14 22:16:07 +00:00
|
|
|
/**
|
|
|
|
* @author Martin Karkowski
|
|
|
|
* @email m.karkowski@zema.de
|
|
|
|
* @create date 2021-11-13 08:17:19
|
|
|
|
* @modify date 2021-11-13 09:44:51
|
|
|
|
* @desc [description]
|
|
|
|
*/
|
|
|
|
|
2022-01-10 06:52:05 +00:00
|
|
|
import { assert, expect } from "chai";
|
2021-11-14 22:16:07 +00:00
|
|
|
import { describe, it } from "mocha";
|
2021-12-04 07:25:26 +00:00
|
|
|
import {
|
|
|
|
comparePatternAndPath,
|
|
|
|
containsWildcards,
|
|
|
|
generateResult,
|
|
|
|
patternIsValid,
|
|
|
|
TPathCompareResult,
|
|
|
|
} from "./pathMatchingMethods";
|
2021-11-14 22:16:07 +00:00
|
|
|
|
|
|
|
describe("pathMatchingMethods", function () {
|
|
|
|
// Describe the required Test:
|
|
|
|
|
|
|
|
describe("comparePatternAndPath", function () {
|
|
|
|
describe("pattern test", function () {
|
|
|
|
const functionTests: {
|
|
|
|
// Name of the Test
|
2021-12-04 07:25:26 +00:00
|
|
|
desc: string;
|
|
|
|
args?: [];
|
|
|
|
path: string;
|
|
|
|
pattern: string;
|
|
|
|
expectedResult: TPathCompareResult;
|
2021-11-14 22:16:07 +00:00
|
|
|
}[] = [
|
2021-12-04 07:25:26 +00:00
|
|
|
{
|
|
|
|
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: ">",
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
];
|
2021-11-14 22:16:07 +00:00
|
|
|
|
|
|
|
for (const test of functionTests) {
|
|
|
|
it(test.desc, function () {
|
|
|
|
let result: any = null;
|
|
|
|
try {
|
|
|
|
result = comparePatternAndPath(test.pattern, test.path);
|
2022-01-10 06:52:05 +00:00
|
|
|
expect(result).to.deep.equal(test.expectedResult);
|
2021-11-14 22:16:07 +00:00
|
|
|
} catch (e) {
|
|
|
|
const delta: string[] = [];
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(test.expectedResult)) {
|
|
|
|
if (result[key] !== value) {
|
2021-12-04 07:25:26 +00:00
|
|
|
delta.push(
|
|
|
|
`- "${key}": expected: ${value}; got: ${result[key]}"`
|
|
|
|
);
|
2021-11-14 22:16:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-04 07:25:26 +00:00
|
|
|
throw Error(
|
|
|
|
`Failed with Test "${test.desc}".\nexpected=\t${JSON.stringify(
|
|
|
|
test.expectedResult
|
|
|
|
)}\nresult= \t${JSON.stringify(result)}\n${delta.join("\n")}`
|
|
|
|
);
|
2021-11-14 22:16:07 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const errorTests: {
|
|
|
|
// Name of the Test
|
2021-12-04 07:25:26 +00:00
|
|
|
desc: string;
|
|
|
|
path: string;
|
|
|
|
pattern: string;
|
2021-11-14 22:16:07 +00:00
|
|
|
}[] = [
|
2021-12-04 07:25:26 +00:00
|
|
|
{
|
|
|
|
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/+/#",
|
|
|
|
},
|
|
|
|
];
|
2021-11-14 22:16:07 +00:00
|
|
|
|
|
|
|
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) {
|
2021-12-04 07:25:26 +00:00
|
|
|
throw e;
|
2021-11-14 22:16:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("pattern without wildcard symbols", function () {
|
|
|
|
const functionTests: {
|
|
|
|
// Name of the Test
|
2021-12-04 07:25:26 +00:00
|
|
|
desc: string;
|
|
|
|
args?: [];
|
|
|
|
path: string;
|
|
|
|
pattern: string;
|
|
|
|
expectedResult: TPathCompareResult;
|
2021-11-14 22:16:07 +00:00
|
|
|
}[] = [
|
2021-12-04 07:25:26 +00:00
|
|
|
{
|
|
|
|
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: "<",
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
];
|
2021-11-14 22:16:07 +00:00
|
|
|
|
|
|
|
for (const test of functionTests) {
|
|
|
|
it(test.desc, function () {
|
|
|
|
let result: any = null;
|
|
|
|
try {
|
2021-12-04 07:25:26 +00:00
|
|
|
result = comparePatternAndPath(test.pattern, test.path, {
|
|
|
|
matchTopicsWithoutWildcards: true,
|
|
|
|
});
|
2022-01-10 06:52:05 +00:00
|
|
|
expect(result).to.deep.equal(test.expectedResult);
|
2021-11-14 22:16:07 +00:00
|
|
|
} catch (e) {
|
2021-12-04 07:25:26 +00:00
|
|
|
throw Error(
|
|
|
|
`Failed with Test "${test.desc}".\nexpected=\t${JSON.stringify(
|
|
|
|
test.expectedResult
|
|
|
|
)}\nresult= \t${JSON.stringify(result)}`
|
|
|
|
);
|
2021-11-14 22:16:07 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("containsWildcards", function () {
|
|
|
|
it("test wildcard detection", function () {
|
2022-01-10 06:52:05 +00:00
|
|
|
expect(containsWildcards("test")).to.be.false;
|
|
|
|
expect(containsWildcards("test/#")).to.be.true;
|
|
|
|
expect(containsWildcards("test/+")).to.be.true;
|
2021-11-14 22:16:07 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("patternIsValid", function () {
|
|
|
|
it("should be invalid", function () {
|
2022-01-10 06:52:05 +00:00
|
|
|
expect(patternIsValid("test//#")).to.be.false;
|
|
|
|
expect(patternIsValid("test/a/#/b")).to.be.false;
|
2021-11-14 22:16:07 +00:00
|
|
|
// Leading Splitchar
|
2022-01-10 06:52:05 +00:00
|
|
|
expect(patternIsValid("test/a/")).to.be.false;
|
2021-11-14 22:16:07 +00:00
|
|
|
});
|
|
|
|
it("should be valid", function () {
|
2021-12-04 07:25:26 +00:00
|
|
|
assert.isTrue(
|
|
|
|
patternIsValid("test/#"),
|
|
|
|
"multi-level wildcard at the end should be fine"
|
|
|
|
);
|
|
|
|
assert.isTrue(
|
|
|
|
patternIsValid("#"),
|
|
|
|
"multi-level wildcard only should be fine"
|
|
|
|
);
|
2021-11-14 22:16:07 +00:00
|
|
|
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");
|
|
|
|
});
|
|
|
|
});
|
2021-12-04 07:25:26 +00:00
|
|
|
});
|