diff -r 000000000000 -r 6474c204b198 netwerk/test/unit/test_standardurl.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/netwerk/test/unit/test_standardurl.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,170 @@ +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(); +}