PageRenderTime 262ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/js/closure-library/closure/goog/uri/uri_test.html

https://gitlab.com/gregtyka/napster.fm
HTML | 1046 lines | 868 code | 170 blank | 8 comment | 0 complexity | 07dfb144f32179bb47a541f124f1d506 MD5 | raw file
  1. <!DOCTYPE html>
  2. <html>
  3. <!--
  4. Copyright 2006 The Closure Library Authors. All Rights Reserved.
  5. Use of this source code is governed by the Apache License, Version 2.0.
  6. See the COPYING file for details.
  7. -->
  8. <!--
  9. -->
  10. <head>
  11. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  12. <title>Closure Unit Tests - goog.Uri</title>
  13. <script src="../base.js"></script>
  14. <script>
  15. goog.require('goog.Uri');
  16. goog.require('goog.testing.jsunit');
  17. </script>
  18. </head>
  19. <body>
  20. <script>
  21. function testUriParse() {
  22. var uri = new goog.Uri('http://www.google.com:80/path?q=query#fragmento');
  23. assertEquals('http', uri.getScheme());
  24. assertEquals('', uri.getUserInfo());
  25. assertEquals('www.google.com', uri.getDomain());
  26. assertEquals(80, uri.getPort());
  27. assertEquals('/path', uri.getPath());
  28. assertEquals('q=query', uri.getQuery());
  29. assertEquals('fragmento', uri.getFragment());
  30. assertEquals('terer258+foo@gmail.com',
  31. goog.Uri.parse('mailto:terer258+foo@gmail.com').getPath());
  32. }
  33. function testUriParseAcceptsThingsWithToString() {
  34. // Ensure that the goog.Uri constructor coerces random types to strings.
  35. var uriStr = 'http://www.google.com:80/path?q=query#fragmento';
  36. var uri = new goog.Uri({toString: function() { return uriStr; }});
  37. assertEquals('http://www.google.com:80/path?q=query#fragmento',
  38. uri.toString());
  39. }
  40. function testUriCreate() {
  41. assertEquals(
  42. 'http://www.google.com:81/search%20path?q=what%20to%20eat%2Bdrink%3F',
  43. goog.Uri.create('http', null, 'www.google.com', 81, '/search path',
  44. (new goog.Uri.QueryData).set('q', 'what to eat+drink?'), null)
  45. .toString());
  46. assertEquals(
  47. 'http://www.google.com:80/search%20path?q=what%20to%20eat%2Bdrink%3F',
  48. goog.Uri.create('http', null, 'www.google.com', 80, '/search path',
  49. (new goog.Uri.QueryData).set('q', 'what to eat+drink?'), null)
  50. .toString());
  51. assertEquals(
  52. 'http://www.google.com/search%20path?q=what%20to%20eat%2Bdrink%3F',
  53. goog.Uri.create('http', null, 'www.google.com', null, '/search path',
  54. (new goog.Uri.QueryData).set('q', 'what to eat+drink?'), null)
  55. .toString());
  56. assertEquals(
  57. 'http://www.google.com/search%20path?q=what%20to%20eat%2Bdrink%3F',
  58. goog.Uri.create('http', null, 'www.google.com', null, '/search path',
  59. new goog.Uri.QueryData(null, null, true).set('Q', 'what to eat+drink?'), null)
  60. .toString());
  61. }
  62. function testClone() {
  63. var uri1 = new goog.Uri(
  64. 'http://user:pass@www.google.com:8080/foo?a=1&b=2#c=3');
  65. // getCount forces instantiation of internal data structures to more thoroughly test clone.
  66. uri1.getQueryData().getCount();
  67. var uri2 = uri1.clone();
  68. assertNotEquals(uri1, uri2);
  69. assertEquals(uri1.toString(), uri2.toString());
  70. assertEquals(2, uri2.getQueryData().getCount());
  71. uri2.setParameterValues('q','bar');
  72. assertFalse(uri1.getParameterValue('q') == 'bar');
  73. }
  74. function testRelativeUris() {
  75. assertFalse(new goog.Uri('?hello').hasPath());
  76. }
  77. function testAbsolutePathResolution() {
  78. var uri1 = new goog.Uri('http://www.google.com:8080/path?q=query#fragmento');
  79. assertEquals('http://www.google.com:8080/foo',
  80. uri1.resolve(new goog.Uri('/foo')).toString());
  81. assertEquals('http://www.google.com:8080/foo/bar',
  82. goog.Uri.resolve('http://www.google.com:8080/search/',
  83. '/foo/bar').toString());
  84. }
  85. function testRelativePathResolution() {
  86. var uri1 = new goog.Uri('http://www.google.com:8080/path?q=query#fragmento');
  87. assertEquals('http://www.google.com:8080/foo',
  88. uri1.resolve(goog.Uri.parse('foo')).toString());
  89. var uri2 = new goog.Uri('http://www.google.com:8080/search');
  90. assertEquals('http://www.google.com:8080/foo/bar',
  91. uri2.resolve(new goog.Uri('foo/bar')).toString());
  92. var uri3 = new goog.Uri('http://www.google.com:8080/search/');
  93. assertEquals('http://www.google.com:8080/search/foo/bar',
  94. uri3.resolve(new goog.Uri('foo/bar')).toString());
  95. var uri4 = new goog.Uri('foo');
  96. assertEquals('bar',
  97. uri4.resolve(new goog.Uri('bar')).toString());
  98. }
  99. function testDomainResolution() {
  100. assertEquals('https://www.google.com/foo/bar',
  101. new goog.Uri('https://www.fark.com:443/search/').resolve(
  102. new goog.Uri('//www.google.com/foo/bar')
  103. ).toString());
  104. assertEquals('http://www.google.com/',
  105. goog.Uri.resolve('http://www.fark.com/search/',
  106. '//www.google.com/').toString());
  107. }
  108. function testQueryResolution() {
  109. assertEquals('http://www.google.com/search?q=new%20search',
  110. goog.Uri.parse('http://www.google.com/search?q=old+search').
  111. resolve(goog.Uri.parse('?q=new%20search')).toString());
  112. assertEquals('http://www.google.com/search?q=new%20search',
  113. goog.Uri.parse('http://www.google.com/search?q=old+search#hi').
  114. resolve(goog.Uri.parse('?q=new%20search')).toString());
  115. }
  116. function testFragmentResolution() {
  117. assertEquals('http://www.google.com/foo/bar?q=hi#there',
  118. goog.Uri.resolve('http://www.google.com/foo/bar?q=hi',
  119. '#there').toString());
  120. assertEquals('http://www.google.com/foo/bar?q=hi#there',
  121. goog.Uri.resolve('http://www.google.com/foo/bar?q=hi#you',
  122. '#there').toString());
  123. }
  124. function testBogusResolution() {
  125. assertEquals('a://completely.different/url',
  126. goog.Uri.parse('some:base/url').resolve(
  127. goog.Uri.parse('a://completely.different/url')
  128. ).toString());
  129. }
  130. function testDotSegmentsRemovalRemoveLeadingDots() {
  131. // Test removing leading "../" and "./"
  132. assertDotRemovedEquals('bar', '../bar');
  133. assertDotRemovedEquals('bar', './bar');
  134. assertDotRemovedEquals('bar', '.././bar');
  135. assertDotRemovedEquals('bar', '.././bar');
  136. }
  137. function testDotSegmentRemovalRemoveSingleDot() {
  138. // Tests replacing "/./" with "/"
  139. assertDotRemovedEquals('/foo/bar', '/foo/./bar');
  140. assertDotRemovedEquals('/bar/', '/bar/./');
  141. // Test replacing trailing "/." with "/"
  142. assertDotRemovedEquals('/', '/.');
  143. assertDotRemovedEquals('/bar/', '/bar/.');
  144. }
  145. function testDotSegmentRemovalRemoveDoubleDot() {
  146. // Test resolving "/../"
  147. assertDotRemovedEquals('/bar', '/foo/../bar');
  148. assertDotRemovedEquals('/', '/bar/../');
  149. // Test resolving trailing "/.."
  150. assertDotRemovedEquals('/', '/..');
  151. assertDotRemovedEquals('/', '/', '/bar/..');
  152. assertDotRemovedEquals('/foo/', '/foo/bar/..');
  153. }
  154. function testDotSegmentRemovalRemovePlainDots() {
  155. // RFC 3986, section 5.2.4, point 2.D.
  156. // Test resolving plain ".." or "."
  157. assertDotRemovedEquals('', '.');
  158. assertDotRemovedEquals('', '..');
  159. }
  160. function testPathConcatenation() {
  161. // Check accordenance with RFC 3986, section 5.2.4
  162. assertResolvedEquals('bar', '', 'bar');
  163. assertResolvedEquals('/bar', '/', 'bar');
  164. assertResolvedEquals('/bar', '/foo', '/bar');
  165. assertResolvedEquals('/foo/foo', '/foo/bar', 'foo');
  166. }
  167. function testPathConcatenationDontRemoveForEmptyUri() {
  168. // Resolving URIs with empty path should not result in dot segments removal.
  169. // See: algorithm in section 5.2.2: code inside 'if (R.path == "")' clause.
  170. assertResolvedEquals('/search/../foo', '/search/../foo', '');
  171. assertResolvedEquals('/search/./foo', '/search/./foo', '');
  172. }
  173. function testParameterGetters() {
  174. function assertArraysEqual(l1, l2) {
  175. if (!l1 || !l2) {
  176. assertEquals(l1, l2);
  177. return;
  178. }
  179. var l1s = l1.toString(), l2s = l2.toString();
  180. assertEquals(l1s, l2s);
  181. assertEquals(l1s, l1.length, l2.length);
  182. for (var i = 0; i < l1.length; ++i) {
  183. assertEquals("part " + i + " of " + l1.length + " in " + l1s,
  184. l1[i], l2[i]);
  185. }
  186. }
  187. assertArraysEqual(['v1', 'v2'],
  188. goog.Uri.parse('/path?a=b&key=v1&c=d&key=v2&keywithsuffix=v3').
  189. getParameterValues('key'));
  190. assertArraysEqual(['v1', 'v2'],
  191. goog.Uri.parse('/path?a=b&keY=v1&c=d&KEy=v2&keywithsuffix=v3', true).
  192. getParameterValues('kEy'));
  193. assertEquals('v1',
  194. goog.Uri.parse('/path?key=v1&c=d&keywithsuffix=v3&key=v2').
  195. getParameterValue('key'));
  196. assertEquals('v1',
  197. goog.Uri.parse('/path?kEY=v1&c=d&keywithsuffix=v3&key=v2', true).
  198. getParameterValue('Key'));
  199. assertEquals('v1=v2',
  200. goog.Uri.parse('/path?key=v1=v2', true).
  201. getParameterValue('key'));
  202. assertEquals('v1=v2=v3',
  203. goog.Uri.parse('/path?key=v1=v2=v3', true).
  204. getParameterValue('key'));
  205. assertArraysEqual(undefined,
  206. goog.Uri.parse('/path?key=v1&c=d&keywithsuffix=v3&key=v2').
  207. getParameterValue('nosuchkey'));
  208. // test boundary conditions
  209. assertArraysEqual(['v1', 'v2'],
  210. goog.Uri.parse('/path?key=v1&c=d&key=v2&keywithsuffix=v3').
  211. getParameterValues('key'));
  212. assertArraysEqual(['v1', 'v2'],
  213. goog.Uri.parse('/path?key=v1&c=d&keywithsuffix=v3&key=v2').
  214. getParameterValues('key'));
  215. // test no =
  216. assertArraysEqual([''],
  217. goog.Uri.parse('/path?key').getParameterValues('key'));
  218. assertArraysEqual([''],
  219. goog.Uri.parse('/path?key', true).getParameterValues('key'));
  220. assertArraysEqual([''],
  221. goog.Uri.parse('/path?foo=bar&key').
  222. getParameterValues('key'));
  223. assertArraysEqual([''],
  224. goog.Uri.parse('/path?foo=bar&key', true).
  225. getParameterValues('key'));
  226. assertEquals('',
  227. goog.Uri.parse('/path?key').getParameterValue('key'));
  228. assertEquals('',
  229. goog.Uri.parse('/path?key', true).getParameterValue('key'));
  230. assertEquals('',
  231. goog.Uri.parse('/path?foo=bar&key').getParameterValue('key'));
  232. assertEquals('',
  233. goog.Uri.parse('/path?foo=bar&key', true).
  234. getParameterValue('key'));
  235. var u = new goog.Uri('/path?a=b&key=v1&c=d&key=v2&keywithsuffix=v3');
  236. assertArraysEqual(u.getParameterValues('a'), ['b']);
  237. assertArraysEqual(u.getParameterValues('key'), ['v1', 'v2']);
  238. assertArraysEqual(u.getParameterValues('c'), ['d']);
  239. assertArraysEqual(u.getParameterValues('keywithsuffix'), ['v3']);
  240. assertArraysEqual(u.getParameterValues('KeyWITHSuffix'), []);
  241. // Make sure constructing from another URI preserves case-sensitivity
  242. var u2 = new goog.Uri(u);
  243. assertArraysEqual(u2.getParameterValues('a'), ['b']);
  244. assertArraysEqual(u2.getParameterValues('key'), ['v1', 'v2']);
  245. assertArraysEqual(u2.getParameterValues('c'), ['d']);
  246. assertArraysEqual(u2.getParameterValues('keywithsuffix'), ['v3']);
  247. assertArraysEqual(u2.getParameterValues('KeyWITHSuffix'), []);
  248. u = new goog.Uri('/path?a=b&key=v1&c=d&kEy=v2&keywithsuffix=v3', true);
  249. assertArraysEqual(u.getParameterValues('A'), ['b']);
  250. assertArraysEqual(u.getParameterValues('keY'), ['v1', 'v2']);
  251. assertArraysEqual(u.getParameterValues('c'), ['d']);
  252. assertArraysEqual(u.getParameterValues('keyWITHsuffix'), ['v3']);
  253. // Make sure constructing from another URI preserves case-insensitivity
  254. u2 = new goog.Uri(u);
  255. assertArraysEqual(u2.getParameterValues('A'), ['b']);
  256. assertArraysEqual(u2.getParameterValues('keY'), ['v1', 'v2']);
  257. assertArraysEqual(u2.getParameterValues('c'), ['d']);
  258. assertArraysEqual(u2.getParameterValues('keyWITHsuffix'), ['v3']);
  259. }
  260. function testRemoveParameter() {
  261. assertEquals('/path?a=b&c=d&keywithsuffix=v3',
  262. goog.Uri.parse('/path?a=b&key=v1&c=d&key=v2&keywithsuffix=v3')
  263. .removeParameter('key').toString());
  264. }
  265. function testParameterSetters() {
  266. assertEquals('/path?a=b&key=newval&c=d&keywithsuffix=v3',
  267. goog.Uri.parse('/path?a=b&key=v1&c=d&key=v2&keywithsuffix=v3')
  268. .setParameterValue('key', 'newval').toString());
  269. assertEquals('/path?a=b&key=1&key=2&key=3&c=d&keywithsuffix=v3',
  270. goog.Uri.parse('/path?a=b&key=v1&c=d&key=v2&keywithsuffix=v3')
  271. .setParameterValues('key', ['1', '2', '3']).toString());
  272. assertEquals('/path',
  273. goog.Uri.parse('/path?key=v1&key=v2')
  274. .setParameterValues('key', []).toString());
  275. // Test case-insensitive setters
  276. assertEquals('/path?a=b&key=newval&c=d&keywithsuffix=v3',
  277. goog.Uri.parse('/path?a=b&key=v1&c=d&key=v2&keywithsuffix=v3', true)
  278. .setParameterValue('KEY', 'newval').toString());
  279. assertEquals('/path?a=b&key=1&key=2&key=3&c=d&keywithsuffix=v3',
  280. goog.Uri.parse('/path?a=b&key=v1&c=d&key=v2&keywithsuffix=v3', true)
  281. .setParameterValues('kEY', ['1', '2', '3']).toString());
  282. }
  283. function testEncoding() {
  284. assertEquals('/foo bar baz',
  285. goog.Uri.parse('/foo%20bar%20baz').getPath());
  286. assertEquals('/foo+bar+baz',
  287. goog.Uri.parse('/foo+bar+baz').getPath());
  288. }
  289. function testSetScheme() {
  290. var uri = new goog.Uri('http://www.google.com:80/path?q=query#fragmento');
  291. uri.setScheme('https');
  292. assertTrue(uri.hasScheme());
  293. assertEquals('https', uri.getScheme());
  294. assertEquals('https://www.google.com:80/path?q=query#fragmento',
  295. uri.toString());
  296. uri.setScheme(encodeURIComponent('ab cd'), true);
  297. assertTrue(uri.hasScheme());
  298. assertEquals('ab cd', uri.getScheme());
  299. assertEquals('ab%20cd://www.google.com:80/path?q=query#fragmento',
  300. uri.toString());
  301. uri.setScheme('http:');
  302. assertTrue(uri.hasScheme());
  303. assertEquals('http', uri.getScheme());
  304. assertEquals('http://www.google.com:80/path?q=query#fragmento',
  305. uri.toString());
  306. uri.setScheme('');
  307. assertFalse(uri.hasScheme());
  308. assertEquals('', uri.getScheme());
  309. assertEquals('//www.google.com:80/path?q=query#fragmento',
  310. uri.toString());
  311. }
  312. function testSetDomain() {
  313. var uri = new goog.Uri('http://www.google.com:80/path?q=query#fragmento');
  314. uri.setDomain('\u1e21oogle.com');
  315. assertTrue(uri.hasDomain());
  316. assertEquals('\u1e21oogle.com', uri.getDomain());
  317. assertEquals('http://%E1%B8%A1oogle.com:80/path?q=query#fragmento',
  318. uri.toString());
  319. uri.setDomain(encodeURIComponent('\u1e21oogle.com'), true);
  320. assertTrue(uri.hasDomain());
  321. assertEquals('\u1e21oogle.com', uri.getDomain());
  322. assertEquals('http://%E1%B8%A1oogle.com:80/path?q=query#fragmento',
  323. uri.toString());
  324. uri.setDomain('');
  325. assertFalse(uri.hasDomain());
  326. assertEquals('', uri.getDomain());
  327. assertEquals('http:/path?q=query#fragmento',
  328. uri.toString());
  329. }
  330. function testSetPort() {
  331. var uri = new goog.Uri('http://www.google.com:80/path?q=query#fragmento');
  332. assertThrows(function() {
  333. uri.setPort(-1);
  334. });
  335. assertEquals(80, uri.getPort());
  336. assertThrows(function() {
  337. uri.setPort('a');
  338. });
  339. assertEquals(80, uri.getPort());
  340. uri.setPort(443);
  341. assertTrue(uri.hasPort());
  342. assertEquals(443, uri.getPort());
  343. assertEquals('http://www.google.com:443/path?q=query#fragmento',
  344. uri.toString());
  345. // TODO(user): This is undocumented, but exist in previous unit
  346. // test. We should clarify whether this is intended (alternatively,
  347. // setPort(0) also works).
  348. uri.setPort(null);
  349. assertFalse(uri.hasPort());
  350. assertEquals(null, uri.getPort());
  351. assertEquals('http://www.google.com/path?q=query#fragmento',
  352. uri.toString());
  353. }
  354. function testSetPath() {
  355. var uri = new goog.Uri('http://www.google.com:80/path?q=query#fragmento');
  356. uri.setPath('/search path/');
  357. assertTrue(uri.hasPath());
  358. assertEquals('/search path/', uri.getPath());
  359. assertEquals(
  360. 'http://www.google.com:80/search%20path/?q=query#fragmento',
  361. uri.toString());
  362. uri.setPath(encodeURIComponent('/search path 2/'), true);
  363. assertTrue(uri.hasPath());
  364. assertEquals('/search path 2/', uri.getPath());
  365. assertEquals(
  366. 'http://www.google.com:80/search%20path%202/?q=query#fragmento',
  367. uri.toString());
  368. uri.setPath('');
  369. assertFalse(uri.hasPath());
  370. assertEquals('', uri.getPath());
  371. assertEquals(
  372. 'http://www.google.com:80?q=query#fragmento',
  373. uri.toString());
  374. }
  375. function testSetFragment() {
  376. var uri = new goog.Uri('http://www.google.com:80/path?q=query#fragmento');
  377. uri.setFragment('foo?bar=a b&baz=2');
  378. assertTrue(uri.hasFragment());
  379. assertEquals('foo?bar=a b&baz=2', uri.getFragment());
  380. assertEquals(
  381. 'http://www.google.com:80/path?q=query#foo?bar=a%20b&baz=2',
  382. uri.toString());
  383. uri.setFragment(encodeURIComponent('foo?bar=a b&baz=3'), true);
  384. assertTrue(uri.hasFragment());
  385. assertEquals('foo?bar=a b&baz=3', uri.getFragment());
  386. assertEquals(
  387. 'http://www.google.com:80/path?q=query#foo?bar=a%20b&baz=3',
  388. uri.toString());
  389. uri.setFragment('');
  390. assertFalse(uri.hasFragment());
  391. assertEquals('', uri.getFragment());
  392. assertEquals(
  393. 'http://www.google.com:80/path?q=query',
  394. uri.toString());
  395. }
  396. function testSetUserInfo() {
  397. var uri = new goog.Uri('http://www.google.com:80/path?q=query#fragmento');
  398. uri.setUserInfo('user:pw d');
  399. assertTrue(uri.hasUserInfo());
  400. assertEquals('user:pw d', uri.getUserInfo());
  401. assertEquals('http://user:pw%20d@www.google.com:80/path?q=query#fragmento',
  402. uri.toString());
  403. uri.setUserInfo(encodeURIComponent('user:pw d2'), true);
  404. assertTrue(uri.hasUserInfo());
  405. assertEquals('user:pw d2', uri.getUserInfo());
  406. assertEquals('http://user:pw%20d2@www.google.com:80/path?q=query#fragmento',
  407. uri.toString());
  408. uri.setUserInfo('user');
  409. assertTrue(uri.hasUserInfo());
  410. assertEquals('user', uri.getUserInfo());
  411. assertEquals('http://user@www.google.com:80/path?q=query#fragmento',
  412. uri.toString());
  413. uri.setUserInfo('');
  414. assertFalse(uri.hasUserInfo());
  415. assertEquals('', uri.getUserInfo());
  416. assertEquals('http://www.google.com:80/path?q=query#fragmento',
  417. uri.toString());
  418. }
  419. function testSetParameterValues() {
  420. var uri = new goog.Uri('http://www.google.com:80/path?q=query#fragmento');
  421. uri.setParameterValues('q', ['foo', 'other query']);
  422. assertEquals('http://www.google.com:80/path?q=foo&q=other%20query#fragmento',
  423. uri.toString());
  424. uri.setParameterValues('lang', 'en');
  425. assertEquals(
  426. 'http://www.google.com:80/path?q=foo&q=other%20query&lang=en#fragmento',
  427. uri.toString());
  428. }
  429. function testTreatmentOfAt1() {
  430. var uri = new goog.Uri('http://www.google.com?q=johndoe@gmail.com');
  431. assertEquals('http', uri.getScheme());
  432. assertEquals('www.google.com', uri.getDomain());
  433. assertEquals('johndoe@gmail.com', uri.getParameterValue('q'));
  434. assertEquals('http://www.google.com?q=johndoe%40gmail.com',
  435. goog.Uri.create('http', null, 'www.google.com', null, null,
  436. 'q=johndoe@gmail.com', null).toString());
  437. }
  438. function testTreatmentOfAt2() {
  439. var uri = new goog.Uri('http://www/~johndoe@gmail.com/foo');
  440. assertEquals('http', uri.getScheme());
  441. assertEquals('www', uri.getDomain());
  442. assertEquals('/~johndoe@gmail.com/foo', uri.getPath());
  443. assertEquals('http://www/~johndoe@gmail.com/foo',
  444. goog.Uri.create('http', null, 'www', null,
  445. '/~johndoe@gmail.com/foo', null, null).
  446. toString());
  447. }
  448. function testTreatmentOfAt3() {
  449. var uri = new goog.Uri('ftp://skroob:1234@teleport/~skroob@vacuum');
  450. assertEquals('ftp', uri.getScheme());
  451. assertEquals('skroob:1234', uri.getUserInfo());
  452. assertEquals('teleport', uri.getDomain());
  453. assertEquals('/~skroob@vacuum', uri.getPath());
  454. assertEquals('ftp://skroob:1234@teleport/~skroob@vacuum',
  455. goog.Uri.create('ftp', 'skroob:1234', 'teleport', null,
  456. '/~skroob@vacuum', null, null).toString());
  457. }
  458. function testTreatmentOfAt4() {
  459. assertEquals('ftp://darkhelmet:45%4078@teleport/~dhelmet@vacuum',
  460. goog.Uri.create('ftp', 'darkhelmet:45@78', 'teleport', null,
  461. '/~dhelmet@vacuum', null, null).toString());
  462. }
  463. function testSameDomain1() {
  464. var uri1 = 'http://www.google.com/a';
  465. var uri2 = 'http://www.google.com/b';
  466. assertTrue(goog.Uri.haveSameDomain(uri1, uri2));
  467. assertTrue(goog.Uri.haveSameDomain(uri2, uri1));
  468. }
  469. function testSameDomain2() {
  470. var uri1 = 'http://www.google.com:1234/a';
  471. var uri2 = 'http://www.google.com/b';
  472. assertFalse(goog.Uri.haveSameDomain(uri1, uri2));
  473. assertFalse(goog.Uri.haveSameDomain(uri2, uri1));
  474. }
  475. function testSameDomain3() {
  476. var uri1 = 'www.google.com/a';
  477. var uri2 = 'http://www.google.com/b';
  478. assertFalse(goog.Uri.haveSameDomain(uri1, uri2));
  479. assertFalse(goog.Uri.haveSameDomain(uri2, uri1));
  480. }
  481. function testSameDomain4() {
  482. var uri1 = '/a';
  483. var uri2 = 'http://www.google.com/b';
  484. assertFalse(goog.Uri.haveSameDomain(uri1, uri2));
  485. assertFalse(goog.Uri.haveSameDomain(uri2, uri1));
  486. }
  487. function testSameDomain5() {
  488. var uri1 = 'http://www.google.com/a';
  489. var uri2 = 'http://mail.google.com/b';
  490. assertFalse(goog.Uri.haveSameDomain(uri1, uri2));
  491. assertFalse(goog.Uri.haveSameDomain(uri2, uri1));
  492. }
  493. function testSameDomain6() {
  494. var uri1 = '/a';
  495. var uri2 = '/b';
  496. assertTrue(goog.Uri.haveSameDomain(uri1, uri2));
  497. assertTrue(goog.Uri.haveSameDomain(uri2, uri1));
  498. }
  499. function testMakeUnique() {
  500. var uri1 = new goog.Uri('http://www.google.com/setgmail');
  501. uri1.makeUnique();
  502. var uri2 = new goog.Uri('http://www.google.com/setgmail');
  503. uri2.makeUnique();
  504. assertTrue(uri1.getQueryData().containsKey(goog.Uri.RANDOM_PARAM));
  505. assertTrue(uri1.toString() != uri2.toString());
  506. }
  507. function testSetReadOnly() {
  508. var uri = new goog.Uri('http://www.google.com/setgmail');
  509. uri.setReadOnly(true);
  510. assertThrows(function() {
  511. uri.setParameterValue('cant', 'dothis')
  512. });
  513. }
  514. function testSetReadOnlyChained() {
  515. var uri = new goog.Uri('http://www.google.com/setgmail').setReadOnly(true);
  516. assertThrows(function() {
  517. uri.setParameterValue('cant', 'dothis');
  518. });
  519. }
  520. function testQueryDataCount() {
  521. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  522. assertEquals(5, qd.getCount());
  523. }
  524. function testQueryDataRemove() {
  525. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  526. qd.remove('c');
  527. assertEquals(4, qd.getCount());
  528. assertEquals('a=A&a=A2&b=B&b=B2', String(qd));
  529. qd.remove('a');
  530. assertEquals(2, qd.getCount());
  531. assertEquals('b=B&b=B2', String(qd));
  532. }
  533. function testQueryDataClear() {
  534. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  535. qd.clear();
  536. assertEquals(0, qd.getCount());
  537. assertEquals('', String(qd));
  538. }
  539. function testQueryDataIsEmpty() {
  540. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  541. qd.remove('a');
  542. assertFalse(qd.isEmpty());
  543. qd.remove('b');
  544. assertFalse(qd.isEmpty());
  545. qd.remove('c');
  546. assertTrue(qd.isEmpty());
  547. qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  548. qd.clear();
  549. assertTrue(qd.isEmpty());
  550. qd = new goog.Uri.QueryData('');
  551. assertTrue(qd.isEmpty());
  552. }
  553. function testQueryDataContainsKey() {
  554. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  555. assertTrue(qd.containsKey('a'));
  556. assertTrue(qd.containsKey('b'));
  557. assertTrue(qd.containsKey('c'));
  558. qd.remove('a');
  559. assertFalse(qd.containsKey('a'));
  560. assertTrue(qd.containsKey('b'));
  561. assertTrue(qd.containsKey('c'));
  562. qd.remove('b');
  563. assertFalse(qd.containsKey('a'));
  564. assertFalse(qd.containsKey('b'));
  565. assertTrue(qd.containsKey('c'));
  566. qd.remove('c');
  567. assertFalse(qd.containsKey('a'));
  568. assertFalse(qd.containsKey('b'));
  569. assertFalse(qd.containsKey('c'));
  570. qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  571. qd.clear();
  572. assertFalse(qd.containsKey('a'));
  573. assertFalse(qd.containsKey('b'));
  574. assertFalse(qd.containsKey('c'));
  575. // Test case-insensitive
  576. qd = new goog.Uri.QueryData('aaa=A&bbb=B&aaa=A2&bbbb=B2&ccc=C', null, true);
  577. assertTrue(qd.containsKey('aaa'));
  578. assertTrue(qd.containsKey('bBb'));
  579. assertTrue(qd.containsKey('CCC'));
  580. qd = new goog.Uri.QueryData('a=b=c');
  581. assertTrue(qd.containsKey('a'));
  582. assertFalse(qd.containsKey('b'));
  583. }
  584. function testQueryDataContainsValue() {
  585. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  586. assertTrue(qd.containsValue('A'));
  587. assertTrue(qd.containsValue('B'));
  588. assertTrue(qd.containsValue('A2'));
  589. assertTrue(qd.containsValue('B2'));
  590. assertTrue(qd.containsValue('C'));
  591. qd.remove('a');
  592. assertFalse(qd.containsValue('A'));
  593. assertTrue(qd.containsValue('B'));
  594. assertFalse(qd.containsValue('A2'));
  595. assertTrue(qd.containsValue('B2'));
  596. assertTrue(qd.containsValue('C'));
  597. qd.remove('b');
  598. assertFalse(qd.containsValue('A'));
  599. assertFalse(qd.containsValue('B'));
  600. assertFalse(qd.containsValue('A2'));
  601. assertFalse(qd.containsValue('B2'));
  602. assertTrue(qd.containsValue('C'));
  603. qd.remove('c');
  604. assertFalse(qd.containsValue('A'));
  605. assertFalse(qd.containsValue('B'));
  606. assertFalse(qd.containsValue('A2'));
  607. assertFalse(qd.containsValue('B2'));
  608. assertFalse(qd.containsValue('C'));
  609. qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  610. qd.clear();
  611. assertFalse(qd.containsValue('A'));
  612. assertFalse(qd.containsValue('B'));
  613. assertFalse(qd.containsValue('A2'));
  614. assertFalse(qd.containsValue('B2'));
  615. assertFalse(qd.containsValue('C'));
  616. qd = new goog.Uri.QueryData('a=b=c');
  617. assertTrue(qd.containsValue('b=c'));
  618. assertFalse(qd.containsValue('b'));
  619. assertFalse(qd.containsValue('c'));
  620. }
  621. function testQueryDataGetKeys() {
  622. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C=extra');
  623. assertEquals('aabbc', qd.getKeys().join(''));
  624. qd.remove('a');
  625. assertEquals('bbc', qd.getKeys().join(''));
  626. qd.add('d', 'D');
  627. qd.add('d', 'D');
  628. assertEquals('bbcdd', qd.getKeys().join(''));
  629. // Test case-insensitive
  630. qd = new goog.Uri.QueryData('A=A&B=B&a=A2&b=B2&C=C=extra', null, true);
  631. assertEquals('aabbc', qd.getKeys().join(''));
  632. qd.remove('a');
  633. assertEquals('bbc', qd.getKeys().join(''));
  634. qd.add('d', 'D');
  635. qd.add('D', 'D');
  636. assertEquals('bbcdd', qd.getKeys().join(''));
  637. }
  638. function testQueryDataGetValues() {
  639. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C=extra');
  640. assertArrayEquals(['A', 'A2', 'B', 'B2', 'C=extra'], qd.getValues());
  641. qd.remove('a');
  642. assertArrayEquals(['B', 'B2', 'C=extra'], qd.getValues());
  643. qd.add('d', 'D');
  644. qd.add('d', 'D');
  645. assertArrayEquals(['B', 'B2', 'C=extra', 'D', 'D'], qd.getValues());
  646. qd.add('e', new String('Eee'));
  647. assertArrayEquals(['B', 'B2', 'C=extra', 'D', 'D', 'Eee'], qd.getValues());
  648. assertArrayEquals(['Eee'], qd.getValues('e'));
  649. }
  650. function testQueryDataSet() {
  651. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  652. qd.set('d', 'D');
  653. assertEquals('a=A&a=A2&b=B&b=B2&c=C&d=D', String(qd));
  654. qd.set('d', 'D2');
  655. assertEquals('a=A&a=A2&b=B&b=B2&c=C&d=D2', String(qd));
  656. qd.set('a', 'A3');
  657. assertEquals('a=A3&b=B&b=B2&c=C&d=D2', String(qd));
  658. qd.remove('a');
  659. qd.set('a', 'A4');
  660. // this is different in IE and Mozilla so we cannot use the toString to test
  661. assertEquals('A4', qd.get('a'));
  662. }
  663. function testQueryDataGet() {
  664. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C=extra');
  665. assertEquals('A', qd.get('a'));
  666. assertEquals('B', qd.get('b'));
  667. assertEquals('C=extra', qd.get('c'));
  668. assertEquals('Default', qd.get('d', 'Default'));
  669. qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C=extra', null, true);
  670. assertEquals('A', qd.get('A'));
  671. assertEquals('B', qd.get('b'));
  672. assertEquals('C=extra', qd.get('C'));
  673. assertEquals('Default', qd.get('D', 'Default'));
  674. // Some unit tests pass undefined to get method (even though the type
  675. // for key is {string}). This is not caught by JsCompiler as
  676. // tests aren't typically compiled.
  677. assertUndefined(qd.get(undefined));
  678. }
  679. function testQueryDataSetValues() {
  680. var qd = new goog.Uri.QueryData('a=A&b=B&a=A2&b=B2&c=C');
  681. qd.setValues('a', ['A3', 'A4', 'A5']);
  682. assertEquals('a=A3&a=A4&a=A5&b=B&b=B2&c=C', String(qd));
  683. qd.setValues('d', ['D']);
  684. assertEquals('a=A3&a=A4&a=A5&b=B&b=B2&c=C&d=D', String(qd));
  685. qd.setValues('e', []);
  686. assertEquals('a=A3&a=A4&a=A5&b=B&b=B2&c=C&d=D', String(qd));
  687. }
  688. function testQueryDataSetIgnoreCase() {
  689. var qd = new goog.Uri.QueryData('aaA=one&BBb=two&cCc=three');
  690. assertEquals('one', qd.get('aaA'));
  691. assertEquals(undefined, qd.get('aaa'));
  692. qd.setIgnoreCase(true);
  693. assertEquals('one', qd.get('aaA'));
  694. assertEquals('one', qd.get('aaa'));
  695. qd.setIgnoreCase(false);
  696. assertEquals(undefined, qd.get('aaA'));
  697. assertEquals('one', qd.get('aaa'));
  698. qd.add('DdD', 'four');
  699. assertEquals('four', qd.get('DdD'));
  700. assertEquals(undefined, qd.get('ddd'));
  701. }
  702. function testQueryDataSetIgnoreCaseWithMultipleValues() {
  703. var qd = new goog.Uri.QueryData('aaA=one&aaA=two');
  704. qd.setIgnoreCase(true);
  705. assertArrayEquals(['one', 'two'], qd.getValues('aaA'));
  706. assertArrayEquals(['one', 'two'], qd.getValues('aaa'));
  707. }
  708. function testQueryDataExtend() {
  709. var qd1 = new goog.Uri.QueryData('a=A&b=B&c=C');
  710. var qd2 = new goog.Uri.QueryData('d=D&e=E');
  711. qd1.extend(qd2);
  712. assertEquals('a=A&b=B&c=C&d=D&e=E', String(qd1));
  713. qd1 = new goog.Uri.QueryData('a=A&b=B&c=C');
  714. qd2 = new goog.Uri.QueryData('d=D&e=E');
  715. var qd3 = new goog.Uri.QueryData('f=F&g=G');
  716. qd1.extend(qd2, qd3);
  717. assertEquals('a=A&b=B&c=C&d=D&e=E&f=F&g=G', String(qd1));
  718. qd1 = new goog.Uri.QueryData('a=A&b=B&c=C');
  719. qd2 = new goog.Uri.QueryData('a=A&c=C');
  720. qd1.extend(qd2);
  721. assertEquals('a=A&a=A&b=B&c=C&c=C', String(qd1));
  722. }
  723. function testQueryDataCreateFromMap() {
  724. assertEquals('', String(goog.Uri.QueryData.createFromMap({})));
  725. assertEquals('a=A&b=B&c=C',
  726. String(goog.Uri.QueryData.createFromMap({a:'A',b:'B',c:'C'})));
  727. assertEquals('a=foo%26bar',
  728. String(goog.Uri.QueryData.createFromMap({a:'foo&bar'})));
  729. }
  730. function testQueryDataCreateFromMapWithArrayValues() {
  731. var obj = {'key': ['1', '2', '3']};
  732. var qd = goog.Uri.QueryData.createFromMap(obj);
  733. assertEquals('key=1&key=2&key=3', qd.toString());
  734. qd.add('breakCache', 1);
  735. obj.key.push('4');
  736. assertEquals('key=1&key=2&key=3&breakCache=1', qd.toString());
  737. }
  738. function testQueryDataCreateFromKeysValues() {
  739. assertEquals('', String(goog.Uri.QueryData.createFromKeysValues([], [])));
  740. assertEquals('a=A&b=B&c=C', String(goog.Uri.QueryData.createFromKeysValues(
  741. ['a','b','c'],['A','B','C'])));
  742. assertEquals('a=A&a=B&a=C', String(goog.Uri.QueryData.createFromKeysValues(
  743. ['a','a','a'],['A','B','C'])));
  744. }
  745. function testQueryDataAddMultipleValuesWithSameKey() {
  746. var qd = new goog.Uri.QueryData();
  747. qd.add('abc', 'v');
  748. qd.add('abc', 'v2');
  749. qd.add('abc', 'v3');
  750. assertEquals('abc=v&abc=v2&abc=v3', qd.toString());
  751. }
  752. function testQueryDataAddWithArray() {
  753. var qd = new goog.Uri.QueryData();
  754. qd.add('abc', ['v', 'v2']);
  755. assertEquals('abc=v%2Cv2', qd.toString());
  756. }
  757. function testFragmentEncoding() {
  758. var allowedInFragment = /[A-Za-z0-9\-\._~!$&'()*+,;=:@/?]/g;
  759. var sb = [];
  760. for (var i = 33; i < 500; i++) { // arbitrarily use first 500 chars.
  761. sb.push(String.fromCharCode(i));
  762. }
  763. var testString = sb.join('');
  764. var fragment = new goog.Uri().setFragment(testString).toString();
  765. // Remove first '#' character.
  766. fragment = fragment.substr(1);
  767. // Strip all percent encoded characters, as they're ok.
  768. fragment = fragment.replace(/%[0-9A-F][0-9A-F]/g, '');
  769. // Remove allowed characters.
  770. fragment = fragment.replace(allowedInFragment, '');
  771. // Only illegal characters should remain, which is a fail.
  772. assertEquals('String should be empty', 0, fragment.length);
  773. }
  774. // Tests, that creating URI from components and then
  775. // getting the components back yields equal results.
  776. // The special attention is payed to test proper encoding
  777. // and decoding of URI components.
  778. function testComponentsAfterUriCreate() {
  779. var createdUri = new goog.Uri.create('%40', // scheme
  780. '%41', // user info
  781. '%42', // domain
  782. 43, // port
  783. '%44', // path
  784. '%45', // query
  785. '%46'); // fragment
  786. assertEquals('%40', createdUri.getScheme());
  787. assertEquals('%41', createdUri.getUserInfo());
  788. assertEquals('%42', createdUri.getDomain());
  789. assertEquals(43, createdUri.getPort());
  790. assertEquals('%44', createdUri.getPath());
  791. assertEquals('%2545', createdUri.getQuery()); // returns encoded value
  792. assertEquals('%45', createdUri.getDecodedQuery());
  793. assertEquals('%2545', createdUri.getEncodedQuery());
  794. assertEquals('%46', createdUri.getFragment());
  795. }
  796. // Tests setting the query string and then reading back
  797. // query parameter values.
  798. function testSetQueryAndGetParameterValue() {
  799. var uri = new goog.Uri();
  800. // Sets query as decoded string.
  801. uri.setQuery('i=j&k');
  802. assertEquals('?i=j&k', uri.toString());
  803. assertEquals('i=j&k', uri.getDecodedQuery());
  804. assertEquals('i=j&k', uri.getEncodedQuery());
  805. assertEquals('i=j&k', uri.getQuery()); // returns encoded value
  806. assertEquals('j', uri.getParameterValue('i'));
  807. assertEquals('', uri.getParameterValue('k'));
  808. // Sets query as encoded string.
  809. uri.setQuery('i=j&k', true);
  810. assertEquals('?i=j&k', uri.toString());
  811. assertEquals('i=j&k', uri.getDecodedQuery());
  812. assertEquals('i=j&k', uri.getEncodedQuery());
  813. assertEquals('i=j&k', uri.getQuery()); // returns encoded value
  814. assertEquals('j', uri.getParameterValue('i'));
  815. assertEquals('', uri.getParameterValue('k'));
  816. // Sets query as decoded string.
  817. uri.setQuery('i=j%26k');
  818. assertEquals('?i=j%2526k', uri.toString());
  819. assertEquals('i=j%26k', uri.getDecodedQuery());
  820. assertEquals('i=j%2526k', uri.getEncodedQuery());
  821. assertEquals('i=j%2526k', uri.getQuery()); // returns encoded value
  822. assertEquals('j%26k', uri.getParameterValue('i'));
  823. assertUndefined(uri.getParameterValue('k'));
  824. // Sets query as encoded string.
  825. uri.setQuery('i=j%26k', true);
  826. assertEquals('?i=j%26k', uri.toString());
  827. assertEquals('i=j&k', uri.getDecodedQuery());
  828. assertEquals('i=j%26k', uri.getEncodedQuery());
  829. assertEquals('i=j%26k', uri.getQuery()); // returns encoded value
  830. assertEquals('j&k', uri.getParameterValue('i'));
  831. assertUndefined(uri.getParameterValue('k'));
  832. }
  833. // Tests setting query parameter values and the reading back the query string.
  834. function testSetParameterValueAndGetQuery() {
  835. var uri = new goog.Uri();
  836. uri.setParameterValue('a', 'b&c');
  837. assertEquals('?a=b%26c', uri.toString());
  838. assertEquals('a=b&c', uri.getDecodedQuery());
  839. assertEquals('a=b%26c', uri.getEncodedQuery());
  840. assertEquals('a=b%26c', uri.getQuery()); // returns encoded value
  841. uri.setParameterValue('a', 'b%26c');
  842. assertEquals('?a=b%2526c', uri.toString());
  843. assertEquals('a=b%26c', uri.getDecodedQuery());
  844. assertEquals('a=b%2526c', uri.getEncodedQuery());
  845. assertEquals('a=b%2526c', uri.getQuery()); // returns encoded value
  846. }
  847. // Tests that building a URI with a query string and then reading it back
  848. // gives the same result.
  849. function testQueryNotModified() {
  850. assertEquals('?foo', new goog.Uri('?foo').toString());
  851. assertEquals('?foo=', new goog.Uri('?foo=').toString());
  852. assertEquals('?foo=bar', new goog.Uri('?foo=bar').toString());
  853. assertEquals('?&=&=&', new goog.Uri('?&=&=&').toString());
  854. }
  855. function testRelativePathNotUnescapedWithColon() {
  856. assertEquals('javascript%3aalert(1)',
  857. new goog.Uri('javascript%3aalert(1)').toString());
  858. }
  859. function testAbsolutePathUnescapedWithColon() {
  860. assertEquals('/javascript:alert(1)',
  861. new goog.Uri('/javascript%3aalert(1)').toString());
  862. assertEquals('http://www.foo.bar/path:with:colon/x',
  863. new goog.Uri('http://www.foo.bar/path:with:colon/x').toString());
  864. assertEquals('//www.foo.bar/path:with:colon/x',
  865. new goog.Uri('//www.foo.bar/path:with:colon/x').toString());
  866. }
  867. function assertDotRemovedEquals(expected, path) {
  868. assertEquals(expected, goog.Uri.removeDotSegments(path));
  869. }
  870. function assertResolvedEquals(expected, base, other) {
  871. assertEquals(expected, goog.Uri.resolve(base, other).toString());
  872. }
  873. </script>
  874. </body>
  875. </html>