]>
Lady’s Gitweb - Pisces/blob - iri.test.js
   1 // ♓🌟 Piscēs ∷ iri.test.js 
   2 // ==================================================================== 
   4 // Copyright © 2022 Lady [@ Lady’s Computer]. 
   6 // This Source Code Form is subject to the terms of the Mozilla Public 
   7 // License, v. 2.0. If a copy of the MPL was not distributed with this 
   8 // file, You can obtain one at <https://mozilla.org/MPL/2.0/>. 
  15 } from "./dev-deps.js"; 
  41 const exampleURIReferences 
= { 
  42   "ftp://ftp.is.co.za/rfc/rfc1808.txt": { 
  44     authority: "ftp.is.co.za", 
  45     path: "/rfc/rfc1808.txt", 
  47   "http://www.ietf.org/rfc/rfc2396.txt": { 
  49     authority: "www.ietf.org", 
  50     path: "/rfc/rfc2396.txt", 
  52   "ldap://[2001:db8::7]/c=GB?objectClass?one": { 
  54     authority: "[2001:db8::7]", 
  56     query: "objectClass?one", 
  58   "mailto:John.Doe@example.com": { 
  60     path: "John.Doe@example.com", 
  62   "news:comp.infosystems.www.servers.unix": { 
  64     path: "comp.infosystems.www.servers.unix", 
  66   "tel:+1-816-555-1212": { 
  68     path: "+1-816-555-1212", 
  70   "telnet://192.0.2.16:80/": { 
  72     authority: "192.0.2.16:80", 
  75   "urn:oasis:names:specification:docbook:dtd:xml:4.1.2": { 
  77     path: "oasis:names:specification:docbook:dtd:xml:4.1.2", 
  79   "foo://example.com:8042/over/there?name=ferret#nose": { 
  81     authority: "example.com:8042", 
  91 // If `path` is non·empty, it must contain an IRI character for tests 
  93 const exampleIRIReferences 
= { 
  94   ...exampleURIReferences
, 
  95   "http://ヒキワリ.ナットウ.ニホン": { 
  97     authority: "ヒキワリ.ナットウ.ニホン", 
 100   "http://JP納豆.例.jp/dir1/引き割り.html": { 
 102     authority: "JP納豆.例.jp", 
 103     path: "/dir1/引き割り.html", 
 106     path: "/dir1/引き割り.html", 
 110 // If `path` is non·empty, it must contain an LEIRI character for tests 
 112 const exampleLEIRIReferences 
= { 
 113   ...exampleIRIReferences
, 
 114   "http://example.com/ foo /": { 
 116     authority: "example.com", 
 124 // These will not parse, so the parse result must be empty. 
 125 const exampleReferences 
= { 
 126   ...exampleLEIRIReferences
, 
 132 describe("composeReference", () => { 
 133   it("[[Call]] correctly composes references", () => { 
 135       const [iri
, value
] of Object
.entries(exampleLEIRIReferences
) 
 137       assertStrictEquals(composeReference(value
), iri
); 
 142 describe("escapeForIRI", () => { 
 143   it("[[Call]] converts L·E·I·R·Is to I·R·Is", () => { 
 145       escapeForIRI(" æ\0"), 
 149       escapeForIRI("\u{F0000}?\u{F0000}#\u{F0000}"), 
 150       "%F3%B0%80%80?\u{F0000}#%F3%B0%80%80", 
 155 describe("escapeForURI", () => { 
 156   it("[[Call]] converts L·E·I·R·Is to U·R·Is", () => { 
 158       escapeForURI("/dir1/引き割り.html"), 
 159       "/dir1/%E5%BC%95%E3%81%8D%E5%89%B2%E3%82%8A.html", 
 162       escapeForURI(" æ\0"), 
 166       escapeForURI("\u{F0000}?\u{F0000}#\u{F0000}"), 
 167       "%F3%B0%80%80?%F3%B0%80%80#%F3%B0%80%80", 
 172 describe("isAbsoluteIRI", () => { 
 173   it("[[Call]] identifies absolute I·R·Is", () => { 
 175       const [iri
, { scheme
, fragment 
}] of Object
.entries( 
 181         iri 
in exampleIRIReferences 
&& scheme 
!= null && 
 189 describe("isAbsoluteLEIRI", () => { 
 190   it("[[Call]] identifies absolute L·E·I·R·Is", () => { 
 192       const [leiri
, { scheme
, fragment 
}] of Object
.entries( 
 197         isAbsoluteLEIRI(leiri
), 
 198         leiri 
in exampleLEIRIReferences 
&& scheme 
!= null && 
 206 describe("isAbsoluteURI", () => { 
 207   it("[[Call]] identifies absolute U·R·Is", () => { 
 209       const [uri
, { scheme
, fragment 
}] of Object
.entries( 
 215         uri 
in exampleURIReferences 
&& scheme 
!= null && 
 223 describe("isIRI", () => { 
 224   it("[[Call]] identifies I·R·Is", () => { 
 226       const [iri
, { scheme 
}] of Object
.entries(exampleReferences
) 
 230         iri 
in exampleIRIReferences 
&& scheme 
!= null, 
 237 describe("isIRIPath", () => { 
 238   it("[[Call]] identifies I·R·I paths", () => { 
 239     for (const [iri
, { path 
}] of Object
.entries(exampleReferences
)) { 
 244           isIRIPath(path 
?? iri
), 
 245           iri 
in exampleIRIReferences
, 
 253 describe("isIRIReference", () => { 
 254   it("[[Call]] identifies I·R·I references", () => { 
 255     for (const iri 
of Object
.keys(exampleReferences
)) { 
 258         iri 
in exampleIRIReferences
, 
 265 describe("isIRISuffix", () => { 
 266   it("[[Call]] identifies I·R·I suffixes", () => { 
 268       const [iri
, { authority
, path 
}] of Object
.entries( 
 276           isIRISuffix(authority 
+ path
), 
 277           iri 
in exampleIRIReferences
, 
 285 describe("isLEIRI", () => { 
 286   it("[[Call]] identifies L·E·I·R·Is", () => { 
 288       const [leiri
, { scheme 
}] of Object
.entries(exampleReferences
) 
 292         leiri 
in exampleLEIRIReferences 
&& scheme 
!= null, 
 299 describe("isLEIRIPath", () => { 
 300   it("[[Call]] identifies L·E·I·R·I paths", () => { 
 302       const [leiri
, { path 
}] of Object
.entries(exampleReferences
) 
 308           isLEIRIPath(path 
?? leiri
), 
 309           leiri 
in exampleLEIRIReferences
, 
 317 describe("isLEIRIReference", () => { 
 318   it("[[Call]] identifies L·E·I·R·I references", () => { 
 319     for (const leiri 
of Object
.keys(exampleReferences
)) { 
 321         isLEIRIReference(leiri
), 
 322         leiri 
in exampleLEIRIReferences
, 
 329 describe("isLEIRISuffix", () => { 
 330   it("[[Call]] identifies L·E·I·R·I suffixes", () => { 
 332       const [leiri
, { authority
, path 
}] of Object
.entries( 
 340           isLEIRISuffix(authority 
+ path
), 
 341           leiri 
in exampleLEIRIReferences
, 
 349 describe("isURI", () => { 
 350   it("[[Call]] identifies U·R·Is", () => { 
 352       const [uri
, { scheme 
}] of Object
.entries(exampleReferences
) 
 356         uri 
in exampleURIReferences 
&& scheme 
!= null, 
 363 describe("isURIPath", () => { 
 364   it("[[Call]] identifies U·R·I paths", () => { 
 365     for (const [uri
, { path 
}] of Object
.entries(exampleReferences
)) { 
 370           isURIPath(path 
?? uri
), 
 371           uri 
in exampleURIReferences
, 
 379 describe("isURIReference", () => { 
 380   it("[[Call]] identifies U·R·I references", () => { 
 381     for (const uri 
of Object
.keys(exampleReferences
)) { 
 384         uri 
in exampleURIReferences
, 
 391 describe("isURISuffix", () => { 
 392   it("[[Call]] identifies U·R·I suffixes", () => { 
 394       const [uri
, { authority
, path 
}] of Object
.entries( 
 402           isURISuffix(authority 
+ path
), 
 403           uri 
in exampleURIReferences
, 
 411 describe("mergePaths", () => { 
 412   it("[[Call]] handles the case of an empty base path", () => { 
 414       mergePaths("", "etaoin"), 
 419   it("[[Call]] handles the case of a non·empty base path", () => { 
 421       mergePaths("/etaoin/cmfwyp", "shrdlu"), 
 427 describe("parseReference", () => { 
 428   it("[[Call]] correctly parses references", () => { 
 429     for (const [iri
, value
] of Object
.entries(exampleReferences
)) { 
 430       assertEquals(parseReference(iri
), { 
 432         authority: undefined, 
 442 describe("removeDotSegments", () => { 
 443   it("[[Call]] correctly removes dot segments", () => { 
 444     assertStrictEquals(removeDotSegments("/a/b/c/./../../g"), "/a/g"); 
 446       removeDotSegments("mid/content=5/../6"), 
 452 describe("resolveReference", () => { 
 453   it("[[Call]] correctly resolves references", () => { 
 454     const base 
= "http://a/b/c/d;p?q"; 
 455     assertStrictEquals(resolveReference("g:h", base
), "g:h"); 
 456     assertStrictEquals(resolveReference("g", base
), "http://a/b/c/g"); 
 458       resolveReference("./g", base
), 
 462       resolveReference("g/", base
), 
 465     assertStrictEquals(resolveReference("/g", base
), "http://a/g"); 
 466     assertStrictEquals(resolveReference("//g", base
), "http://g"); 
 468       resolveReference("?y", base
), 
 469       "http://a/b/c/d;p?y", 
 472       resolveReference("g?y", base
), 
 476       resolveReference("#s", base
), 
 477       "http://a/b/c/d;p?q#s", 
 480       resolveReference("g#s", base
), 
 484       resolveReference("g?y#s", base
), 
 485       "http://a/b/c/g?y#s", 
 488       resolveReference(";x", base
), 
 492       resolveReference("g;x", base
), 
 496       resolveReference("g;x?y#s", base
), 
 497       "http://a/b/c/g;x?y#s", 
 500       resolveReference("", base
), 
 501       "http://a/b/c/d;p?q", 
 503     assertStrictEquals(resolveReference(".", base
), "http://a/b/c/"); 
 504     assertStrictEquals(resolveReference("./", base
), "http://a/b/c/"); 
 505     assertStrictEquals(resolveReference("..", base
), "http://a/b/"); 
 506     assertStrictEquals(resolveReference("../", base
), "http://a/b/"); 
 507     assertStrictEquals(resolveReference("../g", base
), "http://a/b/g"); 
 508     assertStrictEquals(resolveReference("../..", base
), "http://a/"); 
 509     assertStrictEquals(resolveReference("../../", base
), "http://a/"); 
 511       resolveReference("../../g", base
), 
 515       resolveReference("../../../g", base
), 
 519       resolveReference("../../../../g", base
), 
 522     assertStrictEquals(resolveReference("/./g", base
), "http://a/g"); 
 523     assertStrictEquals(resolveReference("/../g", base
), "http://a/g"); 
 525       resolveReference("g.", base
), 
 529       resolveReference(".g", base
), 
 533       resolveReference("g..", base
), 
 537       resolveReference("..g", base
), 
 541       resolveReference("./../g", base
), 
 545       resolveReference("./g/.", base
), 
 549       resolveReference("g/./h", base
), 
 553       resolveReference("g/../h", base
), 
 557       resolveReference("g;x=1/./y", base
), 
 558       "http://a/b/c/g;x=1/y", 
 561       resolveReference("g;x=1/../y", base
), 
 565       resolveReference("g?y/./x", base
), 
 566       "http://a/b/c/g?y/./x", 
 569       resolveReference("g?y/../x", base
), 
 570       "http://a/b/c/g?y/../x", 
 573       resolveReference("g#s/./x", base
), 
 574       "http://a/b/c/g#s/./x", 
 577       resolveReference("g#s/../x", base
), 
 578       "http://a/b/c/g#s/../x", 
 580     assertStrictEquals(resolveReference("http:g", base
), "http:g"); 
 
This page took 0.114035 seconds  and 5 git commands  to generate.