ndn-js
Version:
A JavaScript client library for Named Data Networking
441 lines (384 loc) • 19.1 kB
JavaScript
/**
* Copyright (C) 2014-2019 Regents of the University of California.
* @author: Jeff Thompson <jefft0@remap.ucla.edu>
* From ndn-cxx Regex unit tests:
* https://github.com/named-data/ndn-cxx/blob/master/tests/unit-tests/util/regex.t.cpp
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version, with the additional exemption that
* compiling, linking, and/or using OpenSSL is allowed.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* A copy of the GNU General Public License is in the file COPYING.
*/
var assert = require("assert");
var Name = require('../../..').Name;
var NdnRegexBackrefManager = require('../../../js/util/regex/ndn-regex-backref-manager.js').NdnRegexBackrefManager;
var NdnRegexMatcherBase = require('../../../js/util/regex/ndn-regex-matcher-base.js').NdnRegexMatcherBase;
var NdnRegexComponentMatcher = require('../../../js/util/regex/ndn-regex-component-matcher.js').NdnRegexComponentMatcher;
var NdnRegexComponentSetMatcher = require('../../../js/util/regex/ndn-regex-component-set-matcher.js').NdnRegexComponentSetMatcher;
var NdnRegexRepeatMatcher = require('../../../js/util/regex/ndn-regex-repeat-matcher.js').NdnRegexRepeatMatcher;
var NdnRegexBackrefMatcher = require('../../../js/util/regex/ndn-regex-backref-matcher.js').NdnRegexBackrefMatcher;
var NdnRegexPatternListMatcher = require('../../../js/util/regex/ndn-regex-pattern-list-matcher.js').NdnRegexPatternListMatcher;
var NdnRegexTopMatcher = require('../../../js/util/regex/ndn-regex-top-matcher.js').NdnRegexTopMatcher;
describe('TestRegex', function() {
it('ComponentMatcher', function() {
var backRef = new NdnRegexBackrefManager();
var cm = new NdnRegexComponentMatcher("a", backRef);
var res = cm.match(new Name("/a/b/"), 0, 1);
assert.equal(true, res);
assert.equal(1, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexComponentMatcher("a", backRef);
res = cm.match(new Name("/a/b/"), 1, 1);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexComponentMatcher("(c+)\\.(cd)", backRef);
res = cm.match(new Name("/ccc.cd/b/"), 0, 1);
assert.equal(true, res);
assert.equal(1, cm.getMatchResult().length);
assert.equal("ccc.cd", cm.getMatchResult()[0].toEscapedString());
assert.equal(2, backRef.size());
assert.equal("ccc",
backRef.getBackref(0).getMatchResult()[0].toEscapedString());
assert.equal("cd",
backRef.getBackref(1).getMatchResult()[0].toEscapedString());
});
it('ComponentSetMatcher', function() {
var backRef = new NdnRegexBackrefManager();
var cm = new NdnRegexComponentSetMatcher("<a>", backRef);
var res = cm.match(new Name("/a/b/"), 0, 1);
assert.equal(true, res);
assert.equal(1, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
res = cm.match(new Name("/a/b/"), 1, 1);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
res = cm.match(new Name("/a/b/"), 0, 2);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexComponentSetMatcher("[<a><b><c>]", backRef);
res = cm.match(new Name("/a/b/d"), 1, 1);
assert.equal(true, res);
assert.equal(1, cm.getMatchResult().length);
assert.equal("b", cm.getMatchResult()[0].toEscapedString());
res = cm.match(new Name("/a/b/d"), 2, 1);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexComponentSetMatcher("[^<a><b><c>]", backRef);
res = cm.match(new Name("/b/d"), 1, 1);
assert.equal(true, res);
assert.equal(1, cm.getMatchResult().length);
assert.equal("d", cm.getMatchResult()[0].toEscapedString());
backRef = new NdnRegexBackrefManager();
assert.throws
(function() { new NdnRegexComponentSetMatcher("[<a]", backRef); },
NdnRegexMatcherBase.Error);
});
it('RepeatMatcher', function() {
var backRef = new NdnRegexBackrefManager();
var cm = new NdnRegexRepeatMatcher("[<a><b>]*", backRef, 8);
var res = cm.match(new Name("/a/b/c"), 0, 0);
assert.equal(true, res);
assert.equal(0, cm.getMatchResult().length);
res = cm.match(new Name("/a/b/c"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexRepeatMatcher("[<a><b>]+", backRef, 8);
res = cm.match(new Name("/a/b/c"), 0, 0);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
res = cm.match(new Name("/a/b/c"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexRepeatMatcher("<.*>*", backRef, 4);
res = cm.match(new Name("/a/b/c/d/e/f/"), 0, 6);
assert.equal(true, res);
assert.equal(6, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
assert.equal("d", cm.getMatchResult()[3].toEscapedString());
assert.equal("e", cm.getMatchResult()[4].toEscapedString());
assert.equal("f", cm.getMatchResult()[5].toEscapedString());
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexRepeatMatcher("<>*", backRef, 2);
res = cm.match(new Name("/a/b/c/d/e/f/"), 0, 6);
assert.equal(true, res);
assert.equal(6, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
assert.equal("d", cm.getMatchResult()[3].toEscapedString());
assert.equal("e", cm.getMatchResult()[4].toEscapedString());
assert.equal("f", cm.getMatchResult()[5].toEscapedString());
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexRepeatMatcher("<a>?", backRef, 3);
res = cm.match(new Name("/a/b/c"), 0, 0);
assert.equal(true, res);
assert.equal(0, cm.getMatchResult().length);
cm = new NdnRegexRepeatMatcher("<a>?", backRef, 3);
res = cm.match(new Name("/a/b/c"), 0, 1);
assert.equal(true, res);
assert.equal(1, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
cm = new NdnRegexRepeatMatcher("<a>?", backRef, 3);
res = cm.match(new Name("/a/b/c"), 0, 2);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexRepeatMatcher("[<a><b>]{3}", backRef, 8);
res = cm.match(new Name("/a/b/a/d/"), 0, 2);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
res = cm.match(new Name("/a/b/a/d/"), 0, 3);
assert.equal(true, res);
assert.equal(3, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("a", cm.getMatchResult()[2].toEscapedString());
res = cm.match(new Name("/a/b/a/d/"), 0, 4);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexRepeatMatcher("[<a><b>]{2,3}", backRef, 8);
res = cm.match(new Name("/a/b/a/d/e/"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
res = cm.match(new Name("/a/b/a/d/e/"), 0, 3);
assert.equal(true, res);
assert.equal(3, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("a", cm.getMatchResult()[2].toEscapedString());
res = cm.match(new Name("/a/b/a/b/e/"), 0, 4);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
res = cm.match(new Name("/a/b/a/d/e/"), 0, 1);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexRepeatMatcher("[<a><b>]{2,}", backRef, 8);
res = cm.match(new Name("/a/b/a/d/e/"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
res = cm.match(new Name("/a/b/a/b/e/"), 0, 4);
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("a", cm.getMatchResult()[2].toEscapedString());
assert.equal("b", cm.getMatchResult()[3].toEscapedString());
res = cm.match(new Name("/a/b/a/d/e/"), 0, 1);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexRepeatMatcher("[<a><b>]{,2}", backRef, 8);
res = cm.match(new Name("/a/b/a/b/e/"), 0, 3);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
res = cm.match(new Name("/a/b/a/b/e/"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
res = cm.match(new Name("/a/b/a/d/e/"), 0, 1);
assert.equal(true, res);
assert.equal(1, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
res = cm.match(new Name("/a/b/a/d/e/"), 0, 0);
assert.equal(true, res);
assert.equal(0, cm.getMatchResult().length);
});
it('BackrefMatcher', function() {
var backRef = new NdnRegexBackrefManager();
var cm = new NdnRegexBackrefMatcher("(<a><b>)", backRef);
backRef.pushRef(cm);
cm.lateCompile();
var res = cm.match(new Name("/a/b/c"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal(1, backRef.size());
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexBackrefMatcher("(<a>(<b>))", backRef);
backRef.pushRef(cm);
cm.lateCompile();
res = cm.match(new Name("/a/b/c"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal(2, backRef.size());
assert.equal("a",
backRef.getBackref(0).getMatchResult()[0].toEscapedString());
assert.equal("b",
backRef.getBackref(0).getMatchResult()[1].toEscapedString());
assert.equal("b",
backRef.getBackref(1).getMatchResult()[0].toEscapedString());
});
it('BackrefMatcherAdvanced', function() {
var backRef = new NdnRegexBackrefManager();
var cm = new NdnRegexRepeatMatcher("([<a><b>])+", backRef, 10);
var res = cm.match(new Name("/a/b/c"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal(1, backRef.size());
assert.equal("b",
backRef.getBackref(0).getMatchResult()[0].toEscapedString());
});
it('BackrefMatcherAdvanced2', function() {
var backRef = new NdnRegexBackrefManager();
var cm = new NdnRegexPatternListMatcher("(<a>(<b>))<c>", backRef);
var res = cm.match(new Name("/a/b/c"), 0, 3);
assert.equal(true, res);
assert.equal(3, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
assert.equal(2, backRef.size());
assert.equal("a",
backRef.getBackref(0).getMatchResult()[0].toEscapedString());
assert.equal("b",
backRef.getBackref(0).getMatchResult()[1].toEscapedString());
assert.equal("b",
backRef.getBackref(1).getMatchResult()[0].toEscapedString());
});
it('PatternListMatcher', function() {
var backRef = new NdnRegexBackrefManager();
var cm = new NdnRegexPatternListMatcher("<a>[<a><b>]", backRef);
var res = cm.match(new Name("/a/b/c"), 0, 2);
assert.equal(true, res);
assert.equal(2, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexPatternListMatcher("<>*<a>", backRef);
res = cm.match(new Name("/a/b/c"), 0, 1);
assert.equal(true, res);
assert.equal(1, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexPatternListMatcher("<>*<a>", backRef);
res = cm.match(new Name("/a/b/c"), 0, 2);
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
backRef = new NdnRegexBackrefManager();
cm = new NdnRegexPatternListMatcher("<>*<a><>*", backRef);
res = cm.match(new Name("/a/b/c"), 0, 3);
assert.equal(true, res);
assert.equal(3, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
});
it('TopMatcher', function() {
var cm = new NdnRegexTopMatcher("^<a><b><c>");
var res = cm.match(new Name("/a/b/c/d"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
assert.equal("d", cm.getMatchResult()[3].toEscapedString());
cm = new NdnRegexTopMatcher("<b><c><d>$");
res = cm.match(new Name("/a/b/c/d"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
assert.equal("d", cm.getMatchResult()[3].toEscapedString());
cm = new NdnRegexTopMatcher("^<a><b><c><d>$");
res = cm.match(new Name("/a/b/c/d"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
assert.equal("d", cm.getMatchResult()[3].toEscapedString());
res = cm.match(new Name("/a/b/c/d/e"));
assert.equal(false, res);
assert.equal(0, cm.getMatchResult().length);
cm = new NdnRegexTopMatcher("<a><b><c><d>");
res = cm.match(new Name("/a/b/c/d"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
assert.equal("d", cm.getMatchResult()[3].toEscapedString());
cm = new NdnRegexTopMatcher("<b><c>");
res = cm.match(new Name("/a/b/c/d"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.equal("a", cm.getMatchResult()[0].toEscapedString());
assert.equal("b", cm.getMatchResult()[1].toEscapedString());
assert.equal("c", cm.getMatchResult()[2].toEscapedString());
assert.equal("d", cm.getMatchResult()[3].toEscapedString());
});
it('TopMatcherAdvanced', function() {
var cm = new NdnRegexTopMatcher("^(<.*>*)<.*>");
var res = cm.match(new Name("/n/a/b/c"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.ok(new Name("/n/a/b/").equals(cm.expand("\\1")));
cm = new NdnRegexTopMatcher("^(<.*>*)<.*><c>(<.*>)<.*>");
res = cm.match(new Name("/n/a/b/c/d/e/"));
assert.equal(true, res);
assert.equal(6, cm.getMatchResult().length);
assert.ok(new Name("/n/a/d/").equals(cm.expand("\\1\\2")));
cm = new NdnRegexTopMatcher("(<.*>*)<.*>$");
res = cm.match(new Name("/n/a/b/c/"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.ok(new Name("/n/a/b/").equals(cm.expand("\\1")));
cm = new NdnRegexTopMatcher("<.*>(<.*>*)<.*>$");
res = cm.match(new Name("/n/a/b/c/"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.ok(new Name("/a/b/").equals(cm.expand("\\1")));
cm = new NdnRegexTopMatcher("<a>(<>*)<>$");
res = cm.match(new Name("/n/a/b/c/"));
assert.equal(true, res);
assert.equal(4, cm.getMatchResult().length);
assert.ok(new Name("/b/").equals(cm.expand("\\1")));
cm = new NdnRegexTopMatcher("^<ndn><(.*)\\.(.*)><DNS>(<>*)<>");
res = cm.match(new Name("/ndn/ucla.edu/DNS/yingdi/mac/ksk-1/"));
assert.equal(true, res);
assert.equal(6, cm.getMatchResult().length);
assert.ok(new Name("/ndn/edu/ucla/yingdi/mac/").equals
(cm.expand("<ndn>\\2\\1\\3")));
cm = new NdnRegexTopMatcher
("^<ndn><(.*)\\.(.*)><DNS>(<>*)<>", "<ndn>\\2\\1\\3");
res = cm.match(new Name("/ndn/ucla.edu/DNS/yingdi/mac/ksk-1/"));
assert.equal(true, res);
assert.equal(6, cm.getMatchResult().length);
assert.ok(new Name("/ndn/edu/ucla/yingdi/mac/").equals(cm.expand()));
});
});