/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/uno/Reference.hxx>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/uri/ExternalUriReferenceTranslator.hpp>
#include <com/sun/star/uri/UriReferenceFactory.hpp>
#include <com/sun/star/uri/VndSunStarPkgUrlReferenceFactory.hpp>
#include <com/sun/star/uri/XExternalUriReferenceTranslator.hpp>
#include <com/sun/star/uri/XUriReference.hpp>
#include <com/sun/star/uri/XUriReferenceFactory.hpp>
#include <com/sun/star/uri/XVndSunStarExpandUrlReference.hpp>
#include <com/sun/star/uri/XVndSunStarPkgUrlReferenceFactory.hpp>
#include <com/sun/star/uri/XVndSunStarScriptUrlReference.hpp>
#include <com/sun/star/util/XMacroExpander.hpp>
#include <cppuhelper/bootstrap.hxx>
#include <cppunit/TestAssert.h>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/plugin/TestPlugIn.h>
#include <rtl/string.hxx>
#include <rtl/textenc.h>
#include <rtl/uri.hxx>
#include <rtl/ustrbuf.hxx>
#include <rtl/ustring.hxx>
#include <sal/types.h>
#include <sal/macros.h>
namespace {
#define TEST_ASSERT_EQUAL(token1, token2, token3, expected, actual) \
CPPUNIT_ASSERT_EQUAL_MESSAGE( \
createTestAssertEqualMessage( \
token1, token2, token3,
#expected ,
#actual , expected, actual). \
getStr(), \
(expected), (actual))
template <
typename T >
void append(
OUStringBuffer & buffer, T
const & value)
{
buffer.append(value);
}
template <>
void append(OUStringBuffer & buffer,
bool const & value) {
buffer.append(value);
}
template <>
void append(OUStringBuffer & buffer, std::size_t
const & value)
{
buffer.append(
static_cast < sal_Int32 >(value));
}
template <>
void append(OUStringBuffer & buffer,
char const *
const & value)
{
buffer.appendAscii(value);
}
template <
typename T1,
typename T2,
typename T3,
typename T4 >
OString createTestAssertEqualMessage(
char const * token1, T1
const & token2, T2
const & token3,
char const * expectedExpr,
char const * actualExpr, T3
const & expected,
T4
const & actual)
{
OUStringBuffer buf(512);
buf.appendAscii(token1);
buf.append(
'|' );
append(buf, token2);
buf.append(
'|' );
append(buf, token3);
buf.append(
": TEST_ASSERT_EQUAL(" );
buf.appendAscii(expectedExpr);
buf.append(
", " );
buf.appendAscii(actualExpr);
buf.append(
"): <" );
append(buf, expected);
buf.append(
"> != <" );
append(buf, actual);
buf.append(
'>' );
return OUStringToOString(
buf.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US);
}
class Test:
public CppUnit::TestFixture {
public :
virtual void setUp();
virtual void tearDown();
void testParse();
void testMakeAbsolute();
void testMakeRelative();
void testVndSunStarExpand();
void testVndSunStarScript();
void testTranslator();
void testPkgUrlFactory();
CPPUNIT_TEST_SUITE(Test);
CPPUNIT_TEST(testParse);
CPPUNIT_TEST(testMakeAbsolute);
CPPUNIT_TEST(testMakeRelative);
CPPUNIT_TEST(testVndSunStarExpand);
CPPUNIT_TEST(testVndSunStarScript);
CPPUNIT_TEST(testTranslator);
CPPUNIT_TEST(testPkgUrlFactory);
CPPUNIT_TEST_SUITE_END();
private :
css::uno::Reference< css::uno::XComponentContext > m_context;
css::uno::Reference< css::uri::XUriReferenceFactory > m_uriFactory;
};
void Test::setUp() {
m_context = cppu::defaultBootstrap_InitialComponentContext();
m_uriFactory = css::uri::UriReferenceFactory::create(m_context);
}
void Test::tearDown() {
m_uriFactory.clear();
css::uno::Reference< css::lang::XComponent >(
m_context, css::uno::UNO_QUERY_THROW)->dispose();
}
void Test::testParse() {
struct Data {
char const * uriReference;
char const * scheme;
char const * schemeSpecificPart;
bool isHierarchical;
char const * authority;
char const * path;
bool hasRelativePath;
sal_Int32 pathSegmentCount;
char const * pathSegment0;
char const * pathSegment1;
char const * pathSegment2;
char const * pathSegment3;
char const * pathSegment4;
char const * query;
char const * fragment;
};
Data data[] = {
{
"" , nullptr,
"" ,
true , nullptr,
"" ,
true , 0,
"" ,
"" ,
"" ,
"" ,
"" , nullptr, nullptr },
{
"scheme:" ,
"scheme" ,
"" ,
false , nullptr,
"" ,
true , 0,
"" ,
"" ,
"" ,
"" ,
"" , nullptr, nullptr },
{
"scheme:/" ,
"scheme" ,
"/" ,
true , nullptr,
"/" ,
false , 1,
"" ,
"" ,
"" ,
"" ,
"" , nullptr, nullptr },
{
"scheme://", "scheme", "//", true, "",
"" ,
false , 0,
"" ,
"" ,
"" ,
"" ,
"" , nullptr, nullptr },
{
"scheme:///", "scheme", "///", true, "",
"/" ,
false , 1,
"" ,
"" ,
"" ,
"" ,
"" , nullptr, nullptr },
{
"scheme:////", "scheme", "////", true, "",
"//", false, 2, "", "", "", "", "", nullptr, nullptr },
{
"scheme:////", "scheme", "////", true, "",
"//", false, 2, "", "", "", "", "", nullptr, nullptr },
{
"scheme:#" ,
"scheme" ,
"" ,
false , nullptr,
"" ,
true , 0,
"" ,
"" ,
"" ,
"" ,
"" , nullptr,
"" },
{
"scheme:?" ,
"scheme" ,
"?" ,
false , nullptr,
"" ,
true , 0,
"" ,
"" ,
"" ,
"" ,
"" ,
"" , nullptr },
{
"/" , nullptr,
"/" ,
true , nullptr,
"/" ,
false , 1,
"" ,
"" ,
"" ,
"" ,
"" , nullptr, nullptr },
{
"//", nullptr, "//", true, "",
"" ,
false , 0,
"" ,
"" ,
"" ,
"" ,
"" , nullptr, nullptr },
{
"///", nullptr, "///", true, "",
"/" ,
false , 1,
"" ,
"" ,
"" ,
"" ,
"" , nullptr, nullptr },
{
"////", nullptr, "////", true, "",
"//", false, 2, "", "", "", "", "", nullptr, nullptr } };
for (std::size_t i = 0; i < std::size(data); ++i) {
css::uno::Reference< css::uri::XUriReference > uriRef(
m_uriFactory->parse(
OUString::createFromAscii(data[i].uriReference)));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference, data[i].schemeSpecificPart != nullptr,
uriRef.is());
if (uriRef.is()) {
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(data[i].uriReference),
uriRef->getUriReference());
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
data[i].scheme != nullptr,
bool (uriRef->isAbsolute()));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(
data[i].scheme == nullptr ?
"" : data[i].scheme),
uriRef->getScheme());
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(data[i].schemeSpecificPart),
uriRef->getSchemeSpecificPart());
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
data[i].isHierarchical,
static_cast <
bool >(uriRef->isHierarchical()));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
data[i].authority != nullptr,
bool (uriRef->hasAuthority()));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(
data[i].authority == nullptr ?
"" : data[i].authority),
uriRef->getAuthority());
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(data[i].path),
uriRef->getPath());
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
data[i].hasRelativePath,
static_cast <
bool >(uriRef->hasRelativePath()));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
data[i].pathSegmentCount, uriRef->getPathSegmentCount());
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString(), uriRef->getPathSegment(-1));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(data[i].pathSegment0),
uriRef->getPathSegment(0));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(data[i].pathSegment1),
uriRef->getPathSegment(1));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(data[i].pathSegment2),
uriRef->getPathSegment(2));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(data[i].pathSegment3),
uriRef->getPathSegment(3));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(data[i].pathSegment4),
uriRef->getPathSegment(4));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString(), uriRef->getPathSegment(5));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
data[i].query != nullptr,
bool (uriRef->hasQuery()));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(
data[i].query == nullptr ?
"" : data[i].query),
uriRef->getQuery());
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
data[i].fragment != nullptr,
bool (uriRef->hasFragment()));
TEST_ASSERT_EQUAL(
"testParse" , i, data[i].uriReference,
OUString::createFromAscii(
data[i].fragment == nullptr ?
"" : data[i].fragment),
uriRef->getFragment());
}
}
}
void Test::testMakeAbsolute() {
struct Data {
char const * baseUriReference;
char const * uriReference;
bool processSpecialBaseSegments;
css::uri::RelativeUriExcessParentSegments excessParentSegments;
char const * absolute;
};
Data data[] = {
// The following tests are taken from RFC 3986, Section 5.4:
{
"http://a/b/c/d;p?q ", "g:h", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"g:h" },
{
"http://a/b/c/d;p?q ", "g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g " },
{
"http://a/b/c/d;p?q ", "./g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g " },
{
"http://a/b/c/d;p?q ", "g/", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g/ " },
{
"http://a/b/c/d;p?q ", "/g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/g " },
{
"http://a/b/c/d;p?q ", "//g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://g " },
{
"http://a/b/c/d;p?q ", "?y", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/d;p?y " },
{
"http://a/b/c/d;p?q ", "g?y", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g?y " },
{
"http://a/b/c/d;p?q ", "#s", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/d;p?q#s " },
{
"http://a/b/c/d;p?q ", "g#s", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g#s " },
{
"http://a/b/c/d;p?q ", "g?y#s", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g?y#s " },
{
"http://a/b/c/d;p?q ", ";x", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/;x " },
{
"http://a/b/c/d;p?q ", "g;x", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g;x " },
{
"http://a/b/c/d;p?q ", "g;x?y#s", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g;x?y#s " },
{
"http://a/b/c/d;p?q ", "", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/d;p?q " },
{
"http://a/b/c/d;p?q ", ".", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/ " },
{
"http://a/b/c/d;p?q ", "./", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/ " },
{
"http://a/b/c/d;p?q ", "..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/ " },
{
"http://a/b/c/d;p?q ", "../", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/ " },
{
"http://a/b/c/d;p?q ", "../g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/g " },
{
"http://a/b/c/d;p?q ", "../..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/ " },
{
"http://a/b/c/d;p?q ", "../../", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/ " },
{
"http://a/b/c/d;p?q ", "../../g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/g " },
{
"http://a/b/c/d;p?q ", "../../../g", true,
css::uri::RelativeUriExcessParentSegments_ERROR, nullptr },
{
"http://a/b/c/d;p?q ", "../../../g", true,
css::uri::RelativeUriExcessParentSegments_RETAIN,
"http://a/../g " },
{
"http://a/b/c/d;p?q ", "../../../g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/g " },
{
"http://a/b/c/d;p?q ", "../../../../g", true,
css::uri::RelativeUriExcessParentSegments_ERROR, nullptr },
{
"http://a/b/c/d;p?q ", "../../../../g", true,
css::uri::RelativeUriExcessParentSegments_RETAIN,
"http://a/../../g " },
{
"http://a/b/c/d;p?q ", "../../../../g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/g " },
{
"http://a/b/c/d;p?q ", "/./g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/g " },
{
"http://a/b/c/d;p?q ", "/../g", true,
css::uri::RelativeUriExcessParentSegments_ERROR, nullptr },
{
"http://a/b/c/d;p?q ", "/../g", true,
css::uri::RelativeUriExcessParentSegments_RETAIN,
"http://a/../g " },
{
"http://a/b/c/d;p?q ", "/../g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/g " },
{
"http://a/b/c/d;p?q ", "g.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g. " },
{
"http://a/b/c/d;p?q ", ".g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/.g " },
{
"http://a/b/c/d;p?q ", "g..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g.. " },
{
"http://a/b/c/d;p?q ", "..g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/..g " },
{
"http://a/b/c/d;p?q ", "./../g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/g " },
{
"http://a/b/c/d;p?q ", "./g/.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g/ " },
{
"http://a/b/c/d;p?q ", "g/./h", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g/h " },
{
"http://a/b/c/d;p?q ", "g/../h", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/h " },
{
"http://a/b/c/d;p?q ", "g;x=1/./y", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g;x=1/y " },
{
"http://a/b/c/d;p?q ", "g;x=1/../y", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/y " },
{
"http://a/b/c/d;p?q ", "g?y/./x", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g?y/./x " },
{
"http://a/b/c/d;p?q ", "g?y/../x", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g?y/../x " },
{
"http://a/b/c/d;p?q ", "g#s/./x", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g#s/./x " },
{
"http://a/b/c/d;p?q ", "g#s/../x", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http://a/b/c/g#s/../x " },
{
"http://a/b/c/d;p?q ", "http:g", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"http:g" },
{
"scheme:" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme://a", "", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a" },
{
"scheme://a", ".", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "./", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "./.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "x/../", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "x/../.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "x/.././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "x/.././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "x/../././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "x/../././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "./x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "././x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "./././x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "./x/../.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "./x/.././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "././x/.././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "././x/../././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a", "./././x/../././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", ".", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "./", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "./.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "x/../", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "x/../.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "x/.././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "x/.././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "x/../././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "x/../././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "./x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "././x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "./././x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "./x/../.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "./x/.././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "././x/.././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "././x/../././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/", "./././x/../././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b" },
{
"scheme://a/b", ".", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "./", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "./.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "x/../", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "x/../.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "x/.././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "x/.././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "x/../././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "x/../././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "./x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "././x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "./././x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "./x/../.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "./x/.././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "././x/.././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "././x/../././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b", "./././x/../././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/" },
{
"scheme://a/b/", "", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", ".", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "./", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "./.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "x/../", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "x/../.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "x/.././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "x/.././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "x/../././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "x/../././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "./x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "././x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "./././x/..", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "./x/../.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "./x/.././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "././x/.././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "././x/../././", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme://a/b/", "./././x/../././.", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a/b/" },
{
"scheme:a" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a" },
{
"scheme:a" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:a" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:a" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:a" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:a" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:" },
{
"scheme:a" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:a/" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b" },
{
"scheme:a/b" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/" },
{
"scheme:a/b/" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:a/b/" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:a/b/" },
{
"scheme:/a" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a" },
{
"scheme:/a" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/" },
{
"scheme:/a/" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b" },
{
"scheme:/a/b" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/" },
{
"scheme:/a/b/" ,
"" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"./" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"./." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"x/../" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"./x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"./././x/.." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"./x/../." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"./x/.././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"././x/.././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"././x/../././" ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme:/a/b/" ,
"./././x/../././." ,
true ,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/b/" },
{
"scheme://a#s", "", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a" },
{
"scheme://a", "?q", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a?q" },
{
"scheme://a#s", "?q", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a?q" },
{
"scheme://a", "#s", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a#s" },
{
"scheme://a#s1", "#s2", true,
css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme://a#s2" },
{
"schema://a", "schema://b/c/../d", true, css::uri::RelativeUriExcessParentSegments_REMOVE,
"schema://b/d" },
// Per RFC 3986 Section 5.2.1 "Pre-parse the Base URI", "Normalization of the base URI
// [...; esp. dot-segment removal per Section 6.2.2.3 "Path Segment Normalization"] is
// optional" (and not done by our implementation), so if the relative URI has no scheme and
// no authority and an empty path, the Base URI's path is used unmodified per Section 5.2.2
// "Transform References" and thus still contains dot-segments:
{
"scheme:/a/../b/c" ,
"" ,
true , css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/a/../b/c" },
{
"scheme:/a/../b/c" ,
"d" ,
true , css::uri::RelativeUriExcessParentSegments_REMOVE,
"scheme:/b/d" } };
for (std::size_t i = 0; i < std::size(data); ++i) {
css::uno::Reference< css::uri::XUriReference > baseUriRef(
m_uriFactory->parse(
OUString::createFromAscii(data[i].baseUriReference)));
TEST_ASSERT_EQUAL(
"testMakeAbsolute" , i, data[i].baseUriReference,
true , baseUriRef.
is());
css::uno::Reference< css::uri::XUriReference > uriRef(
m_uriFactory->parse(
OUString::createFromAscii(data[i].uriReference)));
TEST_ASSERT_EQUAL("testMakeAbsolute" , i, data[i].uriReference, true , uriRef.is());
css::uno::Reference< css::uri::XUriReference > absolute(
m_uriFactory->makeAbsolute(
baseUriRef, uriRef, data[i].processSpecialBaseSegments,
data[i].excessParentSegments));
TEST_ASSERT_EQUAL(
"testMakeAbsolute" , i, data[i].uriReference,
data[i].absolute != nullptr, absolute.is());
if (absolute.is()) {
TEST_ASSERT_EQUAL(
"testMakeAbsolute" , i, data[i].uriReference,
OUString::createFromAscii(data[i].absolute),
absolute->getUriReference());
}
// For those test cases that conform to RFC 3986, check that the behavior matches
// rtl::Uri::convertRelToAbs:
if (data[i].processSpecialBaseSegments
&& data[i].excessParentSegments == css::uri::RelativeUriExcessParentSegments_REMOVE)
{
try {
auto const absolute2 = rtl::Uri::convertRelToAbs(
OUString::createFromAscii(data[i].baseUriReference),
OUString::createFromAscii(data[i].uriReference));
TEST_ASSERT_EQUAL(
"testMakeAbsolute" , i, data[i].uriReference, true , data[i].absolute != nullptr);
TEST_ASSERT_EQUAL(
"testMakeAbsolute" , i, data[i].uriReference,
OUString::createFromAscii(data[i].absolute), absolute2);
} catch (rtl::MalformedUriException &) {
TEST_ASSERT_EQUAL(
"testMakeAbsolute" , i, data[i].uriReference, true , data[i].absolute == nullptr);
}
}
}
}
void Test::testMakeRelative() {
struct Data {
char const * baseUriReference;
char const * uriReference;
bool preferAuthorityOverRelativePath;
bool preferAbsoluteOverRelativePath;
bool encodeRetainedSpecialSegments;
char const * relative;
char const * absolute;
};
Data data[] = {
{ "scheme1://a/b/c", "scheme2://a/b/c?q#s", true, true, false,
"scheme2://a/b/c?q#s", nullptr },
{ "scheme://a/b/c", "scheme:a/b/c?q#s", true, true, false,
"scheme:a/b/c?q#s" , nullptr },
{ "scheme://a/b/c", "", true, true, false, "", "scheme://a/b/c" },
{ "scheme://a/b/c", "//d/e/f", true, true, false, "//d/e/f",
"scheme://d/e/f" },
{ "scheme://a/b/c", "./e?q#s", true, true, false, "./e?q#s",
"scheme://a/b/e?q#s" },
{ "scheme://a/b", "scheme://a?q", true, true, false, "/?q",
"scheme://a/?q" },
{ "scheme://a/b", "scheme://a?q", true, false, false, "/?q",
"scheme://a/?q" },
{ "scheme://a", "scheme://a?q", true, true, false, "?q", nullptr },
{ "scheme://a/", "scheme://a?q", true, true, false, "?q",
"scheme://a/?q" },
{ "scheme://a", "scheme://a/?q", true, true, false, "/?q",
nullptr },
{ "scheme://a/", "scheme://a/?q", true, true, false, "?q",
nullptr },
{ "scheme://a?q", "scheme://a?q", true, true, false, "", nullptr },
{ "scheme://a/?q", "scheme://a?q", true, true, false, "",
"scheme://a/?q" },
{ "scheme://a?q", "scheme://a/?q", true, true, false, "/?q",
nullptr },
{ "scheme://a/?q", "scheme://a/?q", true, true, false, "", nullptr },
{ "scheme://a/b/c/d", "scheme://a//", true, true, false, "//a//", nullptr },
{ "scheme://a/b/c/d", "scheme://a//", false, true, false, "../..//",
nullptr },
{ "scheme://a/b/c/d", "scheme://a//", true, false, false, "../..//",
nullptr },
{ "scheme://a/b/c/d", "scheme://a//", false, false, false, "../..//",
nullptr },
{ "scheme://a/b/c/d", "scheme://a/e", true, true, false, "/e", nullptr },
{ "scheme://a/b/c/d", "scheme://a/e", true, false, false, "../../e",
nullptr },
{ "scheme://a/b/c/d/e", "scheme://a/b/f", true, true, false, "../../f",
nullptr },
{ "scheme://a/b/c/d/e", "scheme://a/b", true, true, false, "/b", nullptr },
{ "scheme://a/b/c/d/e", "scheme://a/b", true, false, false,
"../../../b" , nullptr },
{ "scheme://a/b/c/d/e", "scheme://a/b/", true, true, false, "../..",
nullptr },
{ "scheme://a/b/c/d/e", "scheme://a/b/c", true, true, false, "../../c",
nullptr },
{ "scheme://a/b/c/d/e", "scheme://a/b/c/", true, true, false, "..", nullptr },
{ "scheme://a/b/", "scheme://a/b/c/d", true, true, false, "c/d", nullptr },
{ "scheme://a/b/", "scheme://a/b/c/d/", true, true, false, "c/d/", nullptr },
{ "scheme://a/b/c", "scheme://a/b//", true, true, false, ".//", nullptr },
{ "scheme://a/b/c", "scheme://a/b//d", true, true, false, ".//d", nullptr },
{ "scheme://a/b/c", "scheme://a/b//d//", true, true, false, ".//d//",
nullptr },
{ "scheme://a/b/c", "scheme://a/b/d+:", true, true, false, "./d+:", nullptr },
{ "scheme://a/b/c", "scheme://a/b/+d:", true, true, false, "+d:", nullptr },
{ "scheme://a/b/c", "scheme://a/b/d#e:f", true, true, false, "d#e:f",
nullptr },
{ "scheme://a/b/c/", "scheme://a/b/../d/.e/.", true, true, false,
"../../d/.e/." ,
"scheme://a/d/.e/" },
{ "scheme://a/b/c/", "scheme://a/b/../d/.e/.", true, true, true,
"../%2E%2E/d/.e/%2E" , "scheme://a/b/%2E%2E/d/.e/%2E" },
{ "scheme://auth/a/b", "scheme://auth//c/d", true, true, false,
"//auth//c/d", nullptr },
{ "scheme://auth/a/b", "scheme://auth//c/d", false, true, false,
"..//c/d", nullptr },
{ "scheme://auth/a/b", "scheme://auth/c/d", true, true, false, "/c/d",
nullptr },
{ "scheme://auth/a/b", "scheme://auth/c/d", true, false, false,
"../c/d" , nullptr },
{ "scheme:a/b/c" , "scheme://d/e/f", true, true, false, "//d/e/f", nullptr },
{ "scheme:/a/b/c" , "scheme://d/e/f", true, true, false, "//d/e/f", nullptr },
{ "scheme:a/b/c" , "scheme:/d/e/f" , true , true , false , "/d/e/f" , nullptr },
{ "scheme:/a/b/c" , "scheme:/d/e/f" , true , true , false , "/d/e/f" , nullptr },
{ "scheme:a/b/c" , "scheme:d/e/f" , true , true , false , "scheme:d/e/f" , nullptr },
{ "scheme:/a/b/c" , "scheme:d/e/f" , true , true , false , "scheme:d/e/f" , nullptr } };
for (std::size_t i = 0; i < std::size(data); ++i) {
css::uno::Reference< css::uri::XUriReference > baseUriRef(
m_uriFactory->parse(
OUString::createFromAscii(data[i].baseUriReference)));
TEST_ASSERT_EQUAL("testMakeRelative" , i, data[i].baseUriReference, true , baseUriRef.is());
css::uno::Reference< css::uri::XUriReference > uriRef(
m_uriFactory->parse(
OUString::createFromAscii(data[i].uriReference)));
TEST_ASSERT_EQUAL("testMakeRelative" , i, data[i].uriReference, true , uriRef.is());
css::uno::Reference< css::uri::XUriReference > relative(
m_uriFactory->makeRelative(
baseUriRef, uriRef, data[i].preferAuthorityOverRelativePath,
data[i].preferAbsoluteOverRelativePath,
data[i].encodeRetainedSpecialSegments));
TEST_ASSERT_EQUAL(
"testMakeRelative" , i, data[i].uriReference,
data[i].relative != nullptr, relative.is());
if (relative.is()) {
TEST_ASSERT_EQUAL(
"testMakeRelative" , i, data[i].uriReference,
OUString::createFromAscii(data[i].relative),
relative->getUriReference());
css::uno::Reference< css::uri::XUriReference > absolute(
m_uriFactory->makeAbsolute(
baseUriRef, relative, true ,
css::uri::RelativeUriExcessParentSegments_ERROR));
TEST_ASSERT_EQUAL("testMakeRelative" , i, data[i].uriReference, true , absolute.is());
TEST_ASSERT_EQUAL(
"testMakeRelative" , i, data[i].uriReference,
OUString::createFromAscii(
data[i].absolute == nullptr
? data[i].uriReference : data[i].absolute),
absolute->getUriReference());
}
}
}
void Test::testVndSunStarExpand() {
struct Data {
char const * uriReference;
char const * expanded;
};
Data data[] = {
{ "vnd.sun.star.expand:" , "" }, // liberally accepted
{ "vnd.sun.star.expand:/" , "/" }, // liberally accepted
{ "vnd.sun.star.expand:%80" , nullptr },
{ "vnd.sun.star.expand:%5C$%5C%24%5C%5C" , "$$\\" } };
css::uno::Reference< css::util::XMacroExpander > expander(
m_context->getValueByName(
u"/singletons/com.sun.star.util.theMacroExpander" _ustr),
css::uno::UNO_QUERY_THROW);
for (std::size_t i = 0; i < std::size(data); ++i) {
css::uno::Reference< css::uri::XUriReference > uriRef(
m_uriFactory->parse(
OUString::createFromAscii(data[i].uriReference)));
TEST_ASSERT_EQUAL(
"testVndSunStarExpand" , i, data[i].uriReference,
data[i].expanded != nullptr, uriRef.is());
if (uriRef.is()) {
css::uno::Reference< css::uri::XVndSunStarExpandUrlReference >
expandUrl(uriRef, css::uno::UNO_QUERY_THROW);
TEST_ASSERT_EQUAL(
"testVndSunStarExpand" , i, data[i].uriReference,
OUString::createFromAscii(data[i].expanded),
expandUrl->expand(expander));
}
}
}
void Test::testVndSunStarScript() {
struct Parameter {
char const * key;
char const * value;
};
std::size_t const parameterCount = 3;
struct Data {
char const * uriReference;
char const * name;
const bool normalized;
Parameter parameters[parameterCount];
};
Data data[] = {
{ "vnd.sun.star.script:" , nullptr, false , {} },
{ "vnd.sun.star.script:/" , nullptr, false , {} },
{ "vnd.sun.star.script:/abc/def?ghi=jkl&mno=pqr" , nullptr, false , {} },
{ "vnd.sun.star.script:abc%3fdef/ghi" , "abc?def/ghi" , false , {} },
{ "vnd.sun.star.script:name?a" , nullptr, false , {} },
{ "vnd.sun.star.script:name?a=" , "name" , true , { { "a" , "" }, { "A" , nullptr } } },
{ "vnd.sun.star.script:name?a=&" , nullptr, true , {} },
{ "vnd.sun.star.script:name?key1=&%26=%3D&key1=hello" , "name" , true ,
{ { "key1" , "" }, { "key2" , nullptr }, { "&" , "=" } } } };
for (std::size_t i = 0; i < std::size(data); ++i) {
css::uno::Reference< css::uri::XUriReference > uriRef(
m_uriFactory->parse(
OUString::createFromAscii(data[i].uriReference)));
TEST_ASSERT_EQUAL(
"testVndSunStarScript" , i, data[i].uriReference, data[i].name != nullptr,
uriRef.is());
if (uriRef.is()) {
css::uno::Reference< css::uri::XVndSunStarScriptUrlReference >
scriptUrl(uriRef, css::uno::UNO_QUERY_THROW);
TEST_ASSERT_EQUAL(
"testVndSunStarScript" , i, data[i].uriReference,
OUString::createFromAscii(data[i].uriReference),
scriptUrl->getUriReference());
TEST_ASSERT_EQUAL(
"testVndSunStarScript" , i, data[i].uriReference,
OUString::createFromAscii(data[i].name),
scriptUrl->getName());
OUString originalReference(uriRef->getUriReference());
for (std::size_t j = 0; j < parameterCount; ++j) {
if (data[i].parameters[j].key != nullptr) {
TEST_ASSERT_EQUAL(
"testVndSunStarScript" ,
static_cast < double >(i)
+ static_cast < double >(j) / 10.0,
data[i].uriReference,
data[i].parameters[j].value != nullptr,
bool (
scriptUrl->hasParameter(
OUString::createFromAscii(
data[i].parameters[j].key))));
TEST_ASSERT_EQUAL(
"testVndSunStarScript" ,
static_cast < double >(i)
+ static_cast < double >(j) / 10.0,
data[i].uriReference,
OUString::createFromAscii(
data[i].parameters[j].value),
scriptUrl->getParameter(
OUString::createFromAscii(
data[i].parameters[j].key)));
// setting the parameter to its original value should not change
// the overall uri reference (provided it was normalized before)
if ( data[i].normalized ) {
if ( scriptUrl->hasParameter(OUString::createFromAscii(
data[i].parameters[j].key)) ) {
scriptUrl->setParameter(
OUString::createFromAscii(
data[i].parameters[j].key),
scriptUrl->getParameter(
OUString::createFromAscii(
data[i].parameters[j].key)));
TEST_ASSERT_EQUAL(
"testVndSunStarScript" ,
static_cast < double >(i)
+ static_cast < double >(j) / 10.0,
u"setParameter" _ustr,
originalReference,
uriRef->getUriReference());
}
}
}
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5 C=85 H=94 G=89
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.17Bemerkung:
¤
*© Formatika GbR, Deutschland