1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkNew.h"
#include "vtkTestUtilities.h"
#include "vtkURI.h"
#include <iostream>
#define Check(expr, message) \
do \
{ \
if (!(expr)) \
{ \
vtkErrorWithObjectMacro(nullptr, "Test failed: \n" << message); \
return false; \
} \
} while (false)
namespace
{
bool Parse(const std::string& uri)
{
auto parsed = vtkURI::Parse(uri);
Check(parsed, "Failed to parse URI \"" + uri + "\"");
const auto parsedStr = parsed->ToString();
Check(parsedStr == uri, "Parsed URI (" + parsedStr + ") does not match input (" + uri + ")");
return true;
}
bool TestParsing()
{
// full
Check(Parse("scheme://auth/p/a/t/h?query#frag"), "Parsing failed");
// parts
Check(Parse("scheme:"), "Parsing failed");
Check(Parse("//auth"), "Parsing failed");
Check(Parse("/p/a/t/h"), "Parsing failed");
Check(Parse("p/a/t/h"), "Parsing failed");
Check(Parse("?query"), "Parsing failed");
Check(Parse("#frag"), "Parsing failed");
// combinations
Check(Parse("scheme:/p/a/t/h#frag"), "Parsing failed");
Check(Parse("scheme://auth#frag"), "Parsing failed");
Check(Parse("scheme:#frag"), "Parsing failed");
Check(Parse("scheme:?query#frag"), "Parsing failed");
Check(Parse("//auth/p/a/t/h?query#frag"), "Parsing failed");
Check(Parse("p/a/t/h?query#frag"), "Parsing failed");
return true;
}
bool TestEmptyButDefinedComponents()
{
auto uri = vtkURI::Parse("s://?#");
Check(uri->GetScheme(), "Scheme must be defined");
Check(uri->GetScheme().GetValue() == "s",
"Scheme must be \"s\", got \"" + uri->GetScheme().GetValue() + "\"");
Check(uri->GetAuthority(), "Authority must be defined");
Check(uri->GetAuthority().GetValue().empty(), "Authority must be empty");
Check(uri->GetPath(), "Path must be defined");
Check(uri->GetPath().GetValue().empty(), "Path must be empty");
Check(uri->GetQuery(), "Query must be defined");
Check(uri->GetQuery().GetValue().empty(), "Query must be empty");
Check(uri->GetFragment(), "Fragment must be defined");
Check(uri->GetFragment().GetValue().empty(), "Fragment must be empty");
const auto uriStr = uri->ToString();
Check(
uriStr == "s://?#", "Invalid string recomposition, expected \"s://?#\" got \"" + uriStr + "\"");
return true;
}
bool TestTypes()
{
Check(vtkURI::Parse("s:")->IsAbsolute(), "\"s:\" must be absolute");
Check(!vtkURI::Parse("s:#f")->IsAbsolute(), "\"s:#f\" must not be absolute");
Check(vtkURI::Parse("//")->IsRelative(), "\"//\" must be relative");
Check(vtkURI::Parse("p")->IsRelative(), "\"p\" must be relative");
Check(vtkURI::Parse("?")->IsRelative(), "\"?\" must be relative");
Check(vtkURI::Parse("#")->IsRelative(), "\"#\" must be relative");
Check(vtkURI::Parse("///?#")->IsRelative(), "\"///?#\" must be relative");
Check(!vtkURI::Parse("s:")->IsRelative(), "\"s:\" must not be relative");
Check(vtkURI::Parse("s:///")->IsFull(), "\"s:///\" must be full");
Check(vtkURI::Parse("s:///?#")->IsFull(), "\"s:///?#\" must be full");
Check(!vtkURI::Parse("///?#")->IsFull(), "\"///?#\" must not be full");
Check(vtkURI::Parse("#")->IsSameDocRef(), "\"s:///\" must be same document reference");
Check(!vtkURI::Parse("s:///?#")->IsSameDocRef(), "\"s:///?#\" must be full");
Check(vtkURI::Parse("")->IsEmpty(), "\"\" must be empty");
Check(!vtkURI::Parse("x")->IsEmpty(), "\"x\" must not be empty");
return true;
}
bool TestPercentEncoding()
{
const std::string str{ "Th1s; is/ \\@ #string \xF2\t \n !" };
Check(vtkURI::PercentDecode(vtkURI::PercentEncode(str)) == str,
"Failed to encode/decode percent-encoded string");
return true;
}
}
int TestURI(int, char*[])
{
if (!TestParsing())
{
return EXIT_FAILURE;
}
if (!TestEmptyButDefinedComponents())
{
return EXIT_FAILURE;
}
if (!TestTypes())
{
return EXIT_FAILURE;
}
if (!TestPercentEncoding())
{
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
|