UNPKG

nope-js-browser

Version:

NoPE Runtime for the Browser. For nodejs please use nope-js-node

400 lines (399 loc) 17.6 kB
/** * @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"); }); }); });