test: More merge tests

This commit is contained in:
2025-09-07 18:50:23 +01:00
parent c94ea76243
commit e8f17bbba1

View File

@@ -1,7 +1,7 @@
import gleam/option.{None, Some} import gleam/option.{None, Some}
import gleeunit/should import gleeunit/should
import startest.{describe, it} import startest.{describe, it}
import types.{Uri} import types.{Uri, empty_uri}
import uri import uri
pub fn main() { pub fn main() {
@@ -895,6 +895,205 @@ pub fn merge_tests() {
}), }),
]) ])
} }
pub fn more_merge_tests() {
describe("rfc merge tests", [
it("normal examples", fn() {
let base = uri.parse("http://a/b/c/d;p?q") |> should.be_ok
let rel = uri.parse("g:h") |> should.be_ok
uri.merge(base, rel) |> should.be_ok |> should.equal(rel)
let rel = uri.parse("g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g") |> should.be_ok)
let rel = uri.parse("./g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g") |> should.be_ok)
let rel = uri.parse("g/") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g/") |> should.be_ok)
let rel = uri.parse("/g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/g") |> should.be_ok)
let rel = uri.parse("//g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://g") |> should.be_ok)
let rel = uri.parse("?y") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/d;p?y") |> should.be_ok)
let rel = uri.parse("g?y") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g?y") |> should.be_ok)
let rel = uri.parse("#s") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/d;p?q#s") |> should.be_ok)
let rel = uri.parse("g#s") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g#s") |> should.be_ok)
let rel = uri.parse("g?y#s") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g?y#s") |> should.be_ok)
let rel = uri.parse(";x") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/;x") |> should.be_ok)
let rel = uri.parse("g;x") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g;x") |> should.be_ok)
let rel = uri.parse("g;x?y#s") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g;x?y#s") |> should.be_ok)
let rel = uri.parse("") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/d;p?q") |> should.be_ok)
let rel = uri.parse(".") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/") |> should.be_ok)
let rel = uri.parse("./") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/") |> should.be_ok)
let rel = uri.parse("..") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/") |> should.be_ok)
let rel = uri.parse("../") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/") |> should.be_ok)
let rel = uri.parse("../g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/g") |> should.be_ok)
let rel = uri.parse("../..") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/") |> should.be_ok)
let rel = uri.parse("../../") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/") |> should.be_ok)
let rel = uri.parse("../../g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/g") |> should.be_ok)
}),
])
}
pub fn normalise_tests() {
describe("normalise", [
it("basic normalise", fn() {
uri.parse("/a/b/c/./../../g")
|> should.be_ok
|> uri.normalise
|> should.equal(Uri(..empty_uri, path: "/a/g"))
uri.parse("mid/content=5/../6")
|> should.be_ok
|> uri.normalise
|> should.equal(Uri(..empty_uri, path: "mid/6"))
}),
it("abnormal examples", fn() {
let base = uri.parse("http://a/b/c/d;p?q") |> should.be_ok
let rel = uri.parse("../../../g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/g") |> should.be_ok)
let rel = uri.parse("../../../../g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/g") |> should.be_ok)
let rel = uri.parse("/./g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/g") |> should.be_ok)
let rel = uri.parse("/../g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/g") |> should.be_ok)
let rel = uri.parse("g.") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g.") |> should.be_ok)
let rel = uri.parse(".g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/.g") |> should.be_ok)
let rel = uri.parse("g..") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g..") |> should.be_ok)
let rel = uri.parse("..g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/..g") |> should.be_ok)
}),
it("weird examples", fn() {
let base = uri.parse("http://a/b/c/d;p?q") |> should.be_ok
let rel = uri.parse("./../g") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/g") |> should.be_ok)
let rel = uri.parse("./g/.") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g/") |> should.be_ok)
let rel = uri.parse("g/./h") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g/h") |> should.be_ok)
let rel = uri.parse("g/../h") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/h") |> should.be_ok)
let rel = uri.parse("g;x=1/./y") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g;x=1/y") |> should.be_ok)
let rel = uri.parse("g;x=1/../y") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/y") |> should.be_ok)
}),
it("weird fragment examples", fn() {
let base = uri.parse("http://a/b/c/d;p?q") |> should.be_ok
let rel = uri.parse("g?y/./x") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g?y/./x") |> should.be_ok)
let rel = uri.parse("g?y/../x") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g?y/../x") |> should.be_ok)
let rel = uri.parse("g#s/./x") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g#s/./x") |> should.be_ok)
let rel = uri.parse("g#s/../x") |> should.be_ok
uri.merge(base, rel)
|> should.be_ok
|> should.equal(uri.parse("http://a/b/c/g#s/../x") |> should.be_ok)
}),
])
}
// gleeunit test functions end in `_test` // gleeunit test functions end in `_test`
// pub fn uri_test() { // pub fn uri_test() {
// match("uri:") // match("uri:")