gecko/netwerk/test/unit/test_standardurl.js

171 lines
6.0 KiB
JavaScript

const StandardURL = Components.Constructor("@mozilla.org/network/standard-url;1",
"nsIStandardURL",
"init");
const nsIStandardURL = Components.interfaces.nsIStandardURL;
function symmetricEquality(expect, a, b)
{
/* Use if/else instead of |do_check_eq(expect, a.spec == b.spec)| so
that we get the specs output on the console if the check fails.
*/
if (expect) {
/* Check all the sub-pieces too, since that can help with
debugging cases when equals() returns something unexpected */
/* We don't check port in the loop, because it can be defaulted in
some cases. */
["spec", "prePath", "scheme", "userPass", "username", "password",
"hostPort", "host", "path", "filePath", "param", "query",
"ref", "directory", "fileName", "fileBaseName", "fileExtension"]
.map(function(prop) {
dump("Testing '"+ prop + "'\n");
do_check_eq(a[prop], b[prop]);
});
} else {
do_check_neq(a.spec, b.spec);
}
do_check_eq(expect, a.equals(b));
do_check_eq(expect, b.equals(a));
}
function stringToURL(str) {
return (new StandardURL(nsIStandardURL.URLTYPE_AUTHORITY, 80,
str, "UTF-8", null))
.QueryInterface(Components.interfaces.nsIURL);
}
function pairToURLs(pair) {
do_check_eq(pair.length, 2);
return pair.map(stringToURL);
}
function test_setEmptyPath()
{
var pairs =
[
["http://example.com", "http://example.com/tests/dom/tests"],
["http://example.com:80", "http://example.com/tests/dom/tests"],
["http://example.com:80/", "http://example.com/tests/dom/test"],
["http://example.com/", "http://example.com/tests/dom/tests"],
["http://example.com/a", "http://example.com/tests/dom/tests"],
["http://example.com:80/a", "http://example.com/tests/dom/tests"],
].map(pairToURLs);
for each (var [provided, target] in pairs)
{
symmetricEquality(false, target, provided);
provided.path = "";
target.path = "";
do_check_eq(provided.spec, target.spec);
symmetricEquality(true, target, provided);
}
}
function test_setQuery()
{
var pairs =
[
["http://example.com", "http://example.com/?foo"],
["http://example.com/bar", "http://example.com/bar?foo"],
["http://example.com#bar", "http://example.com/?foo#bar"],
["http://example.com/#bar", "http://example.com/?foo#bar"],
["http://example.com/?longerthanfoo#bar", "http://example.com/?foo#bar"],
["http://example.com/?longerthanfoo", "http://example.com/?foo"],
/* And one that's nonempty but shorter than "foo" */
["http://example.com/?f#bar", "http://example.com/?foo#bar"],
["http://example.com/?f", "http://example.com/?foo"],
].map(pairToURLs);
for each (var [provided, target] in pairs) {
symmetricEquality(false, provided, target);
provided.query = "foo";
do_check_eq(provided.spec, target.spec);
symmetricEquality(true, provided, target);
}
[provided, target] =
["http://example.com/#", "http://example.com/?foo#bar"].map(stringToURL);
symmetricEquality(false, provided, target);
provided.query = "foo";
symmetricEquality(false, provided, target);
var newProvided = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService)
.newURI("#bar", null, provided)
.QueryInterface(Components.interfaces.nsIURL);
do_check_eq(newProvided.spec, target.spec);
symmetricEquality(true, newProvided, target);
}
function test_setRef()
{
var tests =
[
["http://example.com", "", "http://example.com/"],
["http://example.com:80", "", "http://example.com:80/"],
["http://example.com:80/", "", "http://example.com:80/"],
["http://example.com/", "", "http://example.com/"],
["http://example.com/a", "", "http://example.com/a"],
["http://example.com:80/a", "", "http://example.com:80/a"],
["http://example.com", "x", "http://example.com/#x"],
["http://example.com:80", "x", "http://example.com:80/#x"],
["http://example.com:80/", "x", "http://example.com:80/#x"],
["http://example.com/", "x", "http://example.com/#x"],
["http://example.com/a", "x", "http://example.com/a#x"],
["http://example.com:80/a", "x", "http://example.com:80/a#x"],
["http://example.com", "xx", "http://example.com/#xx"],
["http://example.com:80", "xx", "http://example.com:80/#xx"],
["http://example.com:80/", "xx", "http://example.com:80/#xx"],
["http://example.com/", "xx", "http://example.com/#xx"],
["http://example.com/a", "xx", "http://example.com/a#xx"],
["http://example.com:80/a", "xx", "http://example.com:80/a#xx"],
["http://example.com", "xxxxxxxxxxxxxx", "http://example.com/#xxxxxxxxxxxxxx"],
["http://example.com:80", "xxxxxxxxxxxxxx", "http://example.com:80/#xxxxxxxxxxxxxx"],
["http://example.com:80/", "xxxxxxxxxxxxxx", "http://example.com:80/#xxxxxxxxxxxxxx"],
["http://example.com/", "xxxxxxxxxxxxxx", "http://example.com/#xxxxxxxxxxxxxx"],
["http://example.com/a", "xxxxxxxxxxxxxx", "http://example.com/a#xxxxxxxxxxxxxx"],
["http://example.com:80/a", "xxxxxxxxxxxxxx", "http://example.com:80/a#xxxxxxxxxxxxxx"],
];
for each (var [before, ref, result] in tests)
{
/* Test1: starting with empty ref */
var a = stringToURL(before);
a.ref = ref;
var b = stringToURL(result);
do_check_eq(a.spec, b.spec);
do_check_eq(ref, b.ref);
symmetricEquality(true, a, b);
/* Test2: starting with non-empty */
a.ref = "yyyy";
var c = stringToURL(before);
c.ref = "yyyy";
symmetricEquality(true, a, c);
/* Test3: reset the ref */
a.ref = "";
symmetricEquality(true, a, stringToURL(before));
/* Test4: verify again after reset */
a.ref = ref;
symmetricEquality(true, a, b);
}
}
function run_test()
{
test_setEmptyPath();
test_setQuery();
test_setRef();
}