1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_stoc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "com/sun/star/lang/XComponent.hpp" 32*cdf0e10cSrcweir #include "com/sun/star/lang/XMultiComponentFactory.hpp" 33*cdf0e10cSrcweir #include "com/sun/star/uno/Reference.hxx" 34*cdf0e10cSrcweir #include "com/sun/star/uno/XComponentContext.hpp" 35*cdf0e10cSrcweir #include "com/sun/star/uri/ExternalUriReferenceTranslator.hpp" 36*cdf0e10cSrcweir #include "com/sun/star/uri/UriReferenceFactory.hpp" 37*cdf0e10cSrcweir #include "com/sun/star/uri/VndSunStarPkgUrlReferenceFactory.hpp" 38*cdf0e10cSrcweir #include "com/sun/star/uri/XExternalUriReferenceTranslator.hpp" 39*cdf0e10cSrcweir #include "com/sun/star/uri/XUriReference.hpp" 40*cdf0e10cSrcweir #include "com/sun/star/uri/XUriReferenceFactory.hpp" 41*cdf0e10cSrcweir #include "com/sun/star/uri/XVndSunStarExpandUrlReference.hpp" 42*cdf0e10cSrcweir #include "com/sun/star/uri/XVndSunStarPkgUrlReferenceFactory.hpp" 43*cdf0e10cSrcweir #include "com/sun/star/uri/XVndSunStarScriptUrlReference.hpp" 44*cdf0e10cSrcweir #include "com/sun/star/util/XMacroExpander.hpp" 45*cdf0e10cSrcweir #include "cppuhelper/bootstrap.hxx" 46*cdf0e10cSrcweir #include "cppunit/TestAssert.h" 47*cdf0e10cSrcweir #include "cppunit/TestFixture.h" 48*cdf0e10cSrcweir #include "cppunit/extensions/HelperMacros.h" 49*cdf0e10cSrcweir #include "cppunit/plugin/TestPlugIn.h" 50*cdf0e10cSrcweir #include "osl/diagnose.h" 51*cdf0e10cSrcweir #include "rtl/string.h" 52*cdf0e10cSrcweir #include "rtl/string.hxx" 53*cdf0e10cSrcweir #include "rtl/textenc.h" 54*cdf0e10cSrcweir #include "rtl/ustrbuf.hxx" 55*cdf0e10cSrcweir #include "rtl/ustring.hxx" 56*cdf0e10cSrcweir #include "sal/types.h" 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir #include <cstdlib> 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir namespace css = com::sun::star; 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir namespace { 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir #define TEST_ASSERT_EQUAL(token1, token2, token3, expected, actual) \ 65*cdf0e10cSrcweir CPPUNIT_ASSERT_MESSAGE( \ 66*cdf0e10cSrcweir createTestAssertEqualMessage( \ 67*cdf0e10cSrcweir token1, token2, token3, #expected, #actual, expected, actual). \ 68*cdf0e10cSrcweir getStr(), \ 69*cdf0e10cSrcweir (actual) == (expected)) 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir template< typename T > void append( 72*cdf0e10cSrcweir rtl::OUStringBuffer & buffer, T const & value) 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir buffer.append(value); 75*cdf0e10cSrcweir } 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir template<> void append(rtl::OUStringBuffer & buffer, bool const & value) { 78*cdf0e10cSrcweir buffer.append(static_cast< sal_Bool >(value)); 79*cdf0e10cSrcweir } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir template<> void append(rtl::OUStringBuffer & buffer, std::size_t const & value) 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir buffer.append(static_cast< sal_Int32 >(value)); 84*cdf0e10cSrcweir } 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir template<> void append(rtl::OUStringBuffer & buffer, char const * const & value) 87*cdf0e10cSrcweir { 88*cdf0e10cSrcweir buffer.appendAscii(value); 89*cdf0e10cSrcweir } 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir template< typename T1, typename T2, typename T3, typename T4 > 92*cdf0e10cSrcweir rtl::OString createTestAssertEqualMessage( 93*cdf0e10cSrcweir char const * token1, T1 const & token2, T2 const & token3, 94*cdf0e10cSrcweir char const * expectedExpr, char const * actualExpr, T3 const & expected, 95*cdf0e10cSrcweir T4 const & actual) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir rtl::OUStringBuffer buf; 98*cdf0e10cSrcweir buf.appendAscii(token1); 99*cdf0e10cSrcweir buf.append(static_cast< sal_Unicode >('|')); 100*cdf0e10cSrcweir append(buf, token2); 101*cdf0e10cSrcweir buf.append(static_cast< sal_Unicode >('|')); 102*cdf0e10cSrcweir append(buf, token3); 103*cdf0e10cSrcweir buf.appendAscii(RTL_CONSTASCII_STRINGPARAM(": TEST_ASSERT_EQUAL(")); 104*cdf0e10cSrcweir buf.appendAscii(expectedExpr); 105*cdf0e10cSrcweir buf.appendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); 106*cdf0e10cSrcweir buf.appendAscii(actualExpr); 107*cdf0e10cSrcweir buf.appendAscii(RTL_CONSTASCII_STRINGPARAM("): <")); 108*cdf0e10cSrcweir append(buf, expected); 109*cdf0e10cSrcweir buf.appendAscii(RTL_CONSTASCII_STRINGPARAM("> != <")); 110*cdf0e10cSrcweir append(buf, actual); 111*cdf0e10cSrcweir buf.append(static_cast< sal_Unicode >('>')); 112*cdf0e10cSrcweir return rtl::OUStringToOString( 113*cdf0e10cSrcweir buf.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US); 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir class Test: public CppUnit::TestFixture { 117*cdf0e10cSrcweir public: 118*cdf0e10cSrcweir virtual void setUp(); 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir virtual void tearDown(); 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir void testParse(); 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir void testMakeAbsolute(); 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir void testMakeRelative(); 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir void testVndSunStarExpand(); 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir void testVndSunStarScript(); 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir void testTranslator(); 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir void testPkgUrlFactory(); 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir CPPUNIT_TEST_SUITE(Test); 137*cdf0e10cSrcweir CPPUNIT_TEST(testParse); 138*cdf0e10cSrcweir CPPUNIT_TEST(testMakeAbsolute); 139*cdf0e10cSrcweir CPPUNIT_TEST(testMakeRelative); 140*cdf0e10cSrcweir CPPUNIT_TEST(testVndSunStarExpand); 141*cdf0e10cSrcweir CPPUNIT_TEST(testVndSunStarScript); 142*cdf0e10cSrcweir CPPUNIT_TEST(testTranslator); 143*cdf0e10cSrcweir CPPUNIT_TEST(testPkgUrlFactory); 144*cdf0e10cSrcweir CPPUNIT_TEST_SUITE_END(); 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir private: 147*cdf0e10cSrcweir css::uno::Reference< css::uno::XComponentContext > m_context; 148*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReferenceFactory > m_uriFactory; 149*cdf0e10cSrcweir }; 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir void Test::setUp() { 152*cdf0e10cSrcweir m_context = cppu::defaultBootstrap_InitialComponentContext(); 153*cdf0e10cSrcweir m_uriFactory = css::uri::UriReferenceFactory::create(m_context); 154*cdf0e10cSrcweir } 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir void Test::tearDown() { 157*cdf0e10cSrcweir m_uriFactory.clear(); 158*cdf0e10cSrcweir css::uno::Reference< css::lang::XComponent >( 159*cdf0e10cSrcweir m_context, css::uno::UNO_QUERY_THROW)->dispose(); 160*cdf0e10cSrcweir } 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir void Test::testParse() { 163*cdf0e10cSrcweir struct Data { 164*cdf0e10cSrcweir char const * uriReference; 165*cdf0e10cSrcweir char const * scheme; 166*cdf0e10cSrcweir char const * schemeSpecificPart; 167*cdf0e10cSrcweir bool isHierarchical; 168*cdf0e10cSrcweir char const * authority; 169*cdf0e10cSrcweir char const * path; 170*cdf0e10cSrcweir bool hasRelativePath; 171*cdf0e10cSrcweir sal_Int32 pathSegmentCount; 172*cdf0e10cSrcweir char const * pathSegment0; 173*cdf0e10cSrcweir char const * pathSegment1; 174*cdf0e10cSrcweir char const * pathSegment2; 175*cdf0e10cSrcweir char const * pathSegment3; 176*cdf0e10cSrcweir char const * pathSegment4; 177*cdf0e10cSrcweir char const * query; 178*cdf0e10cSrcweir char const * fragment; 179*cdf0e10cSrcweir }; 180*cdf0e10cSrcweir Data data[] = { 181*cdf0e10cSrcweir { "", 0, "", true, 0, 182*cdf0e10cSrcweir "", true, 0, "", "", "", "", "", 0, 0 }, 183*cdf0e10cSrcweir { "scheme:", 0, 0, false, 0, 184*cdf0e10cSrcweir 0, false, 0, 0, 0, 0, 0, 0, 0, 0 }, 185*cdf0e10cSrcweir { "scheme:/", "scheme", "/", true, 0, 186*cdf0e10cSrcweir "/", false, 1, "", "", "", "", "", 0, 0 }, 187*cdf0e10cSrcweir { "scheme://", "scheme", "//", true, "", 188*cdf0e10cSrcweir "", false, 0, "", "", "", "", "", 0, 0 }, 189*cdf0e10cSrcweir { "scheme:///", "scheme", "///", true, "", 190*cdf0e10cSrcweir "/", false, 1, "", "", "", "", "", 0, 0 }, 191*cdf0e10cSrcweir { "scheme:////", "scheme", "////", true, "", 192*cdf0e10cSrcweir "//", false, 2, "", "", "", "", "", 0, 0 }, 193*cdf0e10cSrcweir { "scheme:////", "scheme", "////", true, "", 194*cdf0e10cSrcweir "//", false, 2, "", "", "", "", "", 0, 0 }, 195*cdf0e10cSrcweir { "scheme:#", 0, 0, false, 0, 196*cdf0e10cSrcweir 0, false, 0, 0, 0, 0, 0, 0, 0, 0 }, 197*cdf0e10cSrcweir { "scheme:?", "scheme", "?", false, 0, 198*cdf0e10cSrcweir "?", false, 0, "", "", "", "", "", 0, 0 }, 199*cdf0e10cSrcweir { "/", 0, "/", true, 0, 200*cdf0e10cSrcweir "/", false, 1, "", "", "", "", "", 0, 0 }, 201*cdf0e10cSrcweir { "//", 0, "//", true, "", 202*cdf0e10cSrcweir "", false, 0, "", "", "", "", "", 0, 0 }, 203*cdf0e10cSrcweir { "///", 0, "///", true, "", 204*cdf0e10cSrcweir "/", false, 1, "", "", "", "", "", 0, 0 }, 205*cdf0e10cSrcweir { "////", 0, "////", true, "", 206*cdf0e10cSrcweir "//", false, 2, "", "", "", "", "", 0, 0 } }; 207*cdf0e10cSrcweir for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 208*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > uriRef( 209*cdf0e10cSrcweir m_uriFactory->parse( 210*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].uriReference))); 211*cdf0e10cSrcweir CPPUNIT_ASSERT(uriRef.is() == (data[i].schemeSpecificPart != 0)); 212*cdf0e10cSrcweir if (uriRef.is()) { 213*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 214*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 215*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].uriReference), 216*cdf0e10cSrcweir uriRef->getUriReference()); 217*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 218*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 219*cdf0e10cSrcweir data[i].scheme != 0, uriRef->isAbsolute()); 220*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 221*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 222*cdf0e10cSrcweir rtl::OUString::createFromAscii( 223*cdf0e10cSrcweir data[i].scheme == 0 ? "" : data[i].scheme), 224*cdf0e10cSrcweir uriRef->getScheme()); 225*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 226*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 227*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].schemeSpecificPart), 228*cdf0e10cSrcweir uriRef->getSchemeSpecificPart()); 229*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 230*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 231*cdf0e10cSrcweir data[i].isHierarchical, 232*cdf0e10cSrcweir static_cast< bool >(uriRef->isHierarchical())); 233*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 234*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 235*cdf0e10cSrcweir data[i].authority != 0, uriRef->hasAuthority()); 236*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 237*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 238*cdf0e10cSrcweir rtl::OUString::createFromAscii( 239*cdf0e10cSrcweir data[i].authority == 0 ? "" : data[i].authority), 240*cdf0e10cSrcweir uriRef->getAuthority()); 241*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 242*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 243*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].path), 244*cdf0e10cSrcweir uriRef->getPath()); 245*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 246*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 247*cdf0e10cSrcweir data[i].hasRelativePath, 248*cdf0e10cSrcweir static_cast< bool >(uriRef->hasRelativePath())); 249*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 250*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 251*cdf0e10cSrcweir data[i].pathSegmentCount, uriRef->getPathSegmentCount()); 252*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 253*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 254*cdf0e10cSrcweir rtl::OUString::createFromAscii(""), uriRef->getPathSegment(-1)); 255*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 256*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 257*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].pathSegment0), 258*cdf0e10cSrcweir uriRef->getPathSegment(0)); 259*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 260*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 261*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].pathSegment1), 262*cdf0e10cSrcweir uriRef->getPathSegment(1)); 263*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 264*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 265*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].pathSegment2), 266*cdf0e10cSrcweir uriRef->getPathSegment(2)); 267*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 268*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 269*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].pathSegment3), 270*cdf0e10cSrcweir uriRef->getPathSegment(3)); 271*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 272*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 273*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].pathSegment4), 274*cdf0e10cSrcweir uriRef->getPathSegment(4)); 275*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 276*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 277*cdf0e10cSrcweir rtl::OUString::createFromAscii(""), uriRef->getPathSegment(5)); 278*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 279*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 280*cdf0e10cSrcweir data[i].query != 0, uriRef->hasQuery()); 281*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 282*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 283*cdf0e10cSrcweir rtl::OUString::createFromAscii( 284*cdf0e10cSrcweir data[i].query == 0 ? "" : data[i].query), 285*cdf0e10cSrcweir uriRef->getQuery()); 286*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 287*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 288*cdf0e10cSrcweir data[i].fragment != 0, uriRef->hasFragment()); 289*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 290*cdf0e10cSrcweir "testParse", i, data[i].uriReference, 291*cdf0e10cSrcweir rtl::OUString::createFromAscii( 292*cdf0e10cSrcweir data[i].fragment == 0 ? "" : data[i].fragment), 293*cdf0e10cSrcweir uriRef->getFragment()); 294*cdf0e10cSrcweir } 295*cdf0e10cSrcweir } 296*cdf0e10cSrcweir } 297*cdf0e10cSrcweir 298*cdf0e10cSrcweir void Test::testMakeAbsolute() { 299*cdf0e10cSrcweir struct Data { 300*cdf0e10cSrcweir char const * baseUriReference; 301*cdf0e10cSrcweir char const * uriReference; 302*cdf0e10cSrcweir bool processSpecialBaseSegments; 303*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments excessParentSegments; 304*cdf0e10cSrcweir char const * absolute; 305*cdf0e10cSrcweir }; 306*cdf0e10cSrcweir Data data[] = { 307*cdf0e10cSrcweir // The following tests are taken from RFC 2396, Appendix C: 308*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g:h", true, 309*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "g:h" }, 310*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g", true, 311*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g" }, 312*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "./g", true, 313*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g" }, 314*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g/", true, 315*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g/" }, 316*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "//g", true, 317*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://g" }, 318*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "?y", true, 319*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/?y" }, 320*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g?y", true, 321*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 322*cdf0e10cSrcweir "http://a/b/c/g?y" }, 323*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "#s", true, 324*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 325*cdf0e10cSrcweir "http://a/b/c/d;p?q#s" }, 326*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g#s", true, 327*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 328*cdf0e10cSrcweir "http://a/b/c/g#s" }, 329*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g?y#s", true, 330*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 331*cdf0e10cSrcweir "http://a/b/c/g?y#s" }, 332*cdf0e10cSrcweir { "http://a/b/c/d;p?q", ";x", true, 333*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/;x" }, 334*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g;x", true, 335*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 336*cdf0e10cSrcweir "http://a/b/c/g;x" }, 337*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g;x?y#s", true, 338*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 339*cdf0e10cSrcweir "http://a/b/c/g;x?y#s" }, 340*cdf0e10cSrcweir { "http://a/b/c/d;p?q", ".", true, 341*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/" }, 342*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "./", true, 343*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/" }, 344*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "..", true, 345*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/" }, 346*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../", true, 347*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/" }, 348*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../g", true, 349*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/g" }, 350*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../..", true, 351*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/" }, 352*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../../", true, 353*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/" }, 354*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../../g", true, 355*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/g" }, 356*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "", true, 357*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 358*cdf0e10cSrcweir "http://a/b/c/d;p?q" }, 359*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../../../g", true, 360*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 0 }, 361*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../../../g", true, 362*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_RETAIN, "http://a/../g" }, 363*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../../../g", true, 364*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_REMOVE, "http://a/g" }, 365*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../../../../g", true, 366*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 0 }, 367*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../../../../g", true, 368*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_RETAIN, 369*cdf0e10cSrcweir "http://a/../../g" }, 370*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "../../../../g", true, 371*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_REMOVE, "http://a/g" }, 372*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "/./g", true, 373*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/./g" }, 374*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "/../g", true, 375*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/../g" }, 376*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g.", true, 377*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g." }, 378*cdf0e10cSrcweir { "http://a/b/c/d;p?q", ".g", true, 379*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/.g" }, 380*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g..", true, 381*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 382*cdf0e10cSrcweir "http://a/b/c/g.." }, 383*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "..g", true, 384*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 385*cdf0e10cSrcweir "http://a/b/c/..g" }, 386*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "./../g", true, 387*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/g" }, 388*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "./g/.", true, 389*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/g/" }, 390*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g/./h", true, 391*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 392*cdf0e10cSrcweir "http://a/b/c/g/h" }, 393*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g/../h", true, 394*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/h" }, 395*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g;x=1/./y", true, 396*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 397*cdf0e10cSrcweir "http://a/b/c/g;x=1/y" }, 398*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g;x=1/../y", true, 399*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http://a/b/c/y" }, 400*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g?y/./x", true, 401*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 402*cdf0e10cSrcweir "http://a/b/c/g?y/./x" }, 403*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g?y/../x", true, 404*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 405*cdf0e10cSrcweir "http://a/b/c/g?y/../x" }, 406*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g#s/./x", true, 407*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 408*cdf0e10cSrcweir "http://a/b/c/g#s/./x" }, 409*cdf0e10cSrcweir { "http://a/b/c/d;p?q", "g#s/../x", true, 410*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, 411*cdf0e10cSrcweir "http://a/b/c/g#s/../x" }, 412*cdf0e10cSrcweir { "http.://a/b/c/d;p?q", "http.:g", true, 413*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "http.:g" }, 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir { "scheme://a", "", true, 416*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 417*cdf0e10cSrcweir { "scheme://a", ".", true, 418*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 419*cdf0e10cSrcweir { "scheme://a", "./", true, 420*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 421*cdf0e10cSrcweir { "scheme://a", "./.", true, 422*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 423*cdf0e10cSrcweir { "scheme://a", "././", true, 424*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 425*cdf0e10cSrcweir { "scheme://a", "././.", true, 426*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 427*cdf0e10cSrcweir { "scheme://a", "x/..", true, 428*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 429*cdf0e10cSrcweir { "scheme://a", "x/../", true, 430*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 431*cdf0e10cSrcweir { "scheme://a", "x/../.", true, 432*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 433*cdf0e10cSrcweir { "scheme://a", "x/.././", true, 434*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 435*cdf0e10cSrcweir { "scheme://a", "x/.././.", true, 436*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 437*cdf0e10cSrcweir { "scheme://a", "x/../././", true, 438*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 439*cdf0e10cSrcweir { "scheme://a", "x/../././.", true, 440*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 441*cdf0e10cSrcweir { "scheme://a", "./x/..", true, 442*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 443*cdf0e10cSrcweir { "scheme://a", "././x/..", true, 444*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 445*cdf0e10cSrcweir { "scheme://a", "./././x/..", true, 446*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 447*cdf0e10cSrcweir { "scheme://a", "./x/../.", true, 448*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 449*cdf0e10cSrcweir { "scheme://a", "./x/.././", true, 450*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 451*cdf0e10cSrcweir { "scheme://a", "././x/.././.", true, 452*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 453*cdf0e10cSrcweir { "scheme://a", "././x/../././", true, 454*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 455*cdf0e10cSrcweir { "scheme://a", "./././x/../././.", true, 456*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir { "scheme://a/", "", true, 459*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 460*cdf0e10cSrcweir { "scheme://a/", ".", true, 461*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 462*cdf0e10cSrcweir { "scheme://a/", "./", true, 463*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 464*cdf0e10cSrcweir { "scheme://a/", "./.", true, 465*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 466*cdf0e10cSrcweir { "scheme://a/", "././", true, 467*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 468*cdf0e10cSrcweir { "scheme://a/", "././.", true, 469*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 470*cdf0e10cSrcweir { "scheme://a/", "x/..", true, 471*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 472*cdf0e10cSrcweir { "scheme://a/", "x/../", true, 473*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 474*cdf0e10cSrcweir { "scheme://a/", "x/../.", true, 475*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 476*cdf0e10cSrcweir { "scheme://a/", "x/.././", true, 477*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 478*cdf0e10cSrcweir { "scheme://a/", "x/.././.", true, 479*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 480*cdf0e10cSrcweir { "scheme://a/", "x/../././", true, 481*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 482*cdf0e10cSrcweir { "scheme://a/", "x/../././.", true, 483*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 484*cdf0e10cSrcweir { "scheme://a/", "./x/..", true, 485*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 486*cdf0e10cSrcweir { "scheme://a/", "././x/..", true, 487*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 488*cdf0e10cSrcweir { "scheme://a/", "./././x/..", true, 489*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 490*cdf0e10cSrcweir { "scheme://a/", "./x/../.", true, 491*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 492*cdf0e10cSrcweir { "scheme://a/", "./x/.././", true, 493*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 494*cdf0e10cSrcweir { "scheme://a/", "././x/.././.", true, 495*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 496*cdf0e10cSrcweir { "scheme://a/", "././x/../././", true, 497*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 498*cdf0e10cSrcweir { "scheme://a/", "./././x/../././.", true, 499*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 500*cdf0e10cSrcweir 501*cdf0e10cSrcweir { "scheme://a/b", "", true, 502*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b" }, 503*cdf0e10cSrcweir { "scheme://a/b", ".", true, 504*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 505*cdf0e10cSrcweir { "scheme://a/b", "./", true, 506*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 507*cdf0e10cSrcweir { "scheme://a/b", "./.", true, 508*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 509*cdf0e10cSrcweir { "scheme://a/b", "././", true, 510*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 511*cdf0e10cSrcweir { "scheme://a/b", "././.", true, 512*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 513*cdf0e10cSrcweir { "scheme://a/b", "x/..", true, 514*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 515*cdf0e10cSrcweir { "scheme://a/b", "x/../", true, 516*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 517*cdf0e10cSrcweir { "scheme://a/b", "x/../.", true, 518*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 519*cdf0e10cSrcweir { "scheme://a/b", "x/.././", true, 520*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 521*cdf0e10cSrcweir { "scheme://a/b", "x/.././.", true, 522*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 523*cdf0e10cSrcweir { "scheme://a/b", "x/../././", true, 524*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 525*cdf0e10cSrcweir { "scheme://a/b", "x/../././.", true, 526*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 527*cdf0e10cSrcweir { "scheme://a/b", "./x/..", true, 528*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 529*cdf0e10cSrcweir { "scheme://a/b", "././x/..", true, 530*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 531*cdf0e10cSrcweir { "scheme://a/b", "./././x/..", true, 532*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 533*cdf0e10cSrcweir { "scheme://a/b", "./x/../.", true, 534*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 535*cdf0e10cSrcweir { "scheme://a/b", "./x/.././", true, 536*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 537*cdf0e10cSrcweir { "scheme://a/b", "././x/.././.", true, 538*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 539*cdf0e10cSrcweir { "scheme://a/b", "././x/../././", true, 540*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 541*cdf0e10cSrcweir { "scheme://a/b", "./././x/../././.", true, 542*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/" }, 543*cdf0e10cSrcweir 544*cdf0e10cSrcweir { "scheme://a/b/", "", true, 545*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 546*cdf0e10cSrcweir { "scheme://a/b/", ".", true, 547*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 548*cdf0e10cSrcweir { "scheme://a/b/", "./", true, 549*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 550*cdf0e10cSrcweir { "scheme://a/b/", "./.", true, 551*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 552*cdf0e10cSrcweir { "scheme://a/b/", "././", true, 553*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 554*cdf0e10cSrcweir { "scheme://a/b/", "././.", true, 555*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 556*cdf0e10cSrcweir { "scheme://a/b/", "x/..", true, 557*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 558*cdf0e10cSrcweir { "scheme://a/b/", "x/../", true, 559*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 560*cdf0e10cSrcweir { "scheme://a/b/", "x/../.", true, 561*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 562*cdf0e10cSrcweir { "scheme://a/b/", "x/.././", true, 563*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 564*cdf0e10cSrcweir { "scheme://a/b/", "x/.././.", true, 565*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 566*cdf0e10cSrcweir { "scheme://a/b/", "x/../././", true, 567*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 568*cdf0e10cSrcweir { "scheme://a/b/", "x/../././.", true, 569*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 570*cdf0e10cSrcweir { "scheme://a/b/", "./x/..", true, 571*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 572*cdf0e10cSrcweir { "scheme://a/b/", "././x/..", true, 573*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 574*cdf0e10cSrcweir { "scheme://a/b/", "./././x/..", true, 575*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 576*cdf0e10cSrcweir { "scheme://a/b/", "./x/../.", true, 577*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 578*cdf0e10cSrcweir { "scheme://a/b/", "./x/.././", true, 579*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 580*cdf0e10cSrcweir { "scheme://a/b/", "././x/.././.", true, 581*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 582*cdf0e10cSrcweir { "scheme://a/b/", "././x/../././", true, 583*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 584*cdf0e10cSrcweir { "scheme://a/b/", "./././x/../././.", true, 585*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a/b/" }, 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir { "scheme://a#s", "", true, 588*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a" }, 589*cdf0e10cSrcweir { "scheme://a", "?q", true, 590*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a?q" }, 591*cdf0e10cSrcweir { "scheme://a#s", "?q", true, 592*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a?q" }, 593*cdf0e10cSrcweir { "scheme://a", "#s", true, 594*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a#s" }, 595*cdf0e10cSrcweir { "scheme://a#s1", "#s2", true, 596*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR, "scheme://a#s2" } }; 597*cdf0e10cSrcweir for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 598*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > baseUriRef( 599*cdf0e10cSrcweir m_uriFactory->parse( 600*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].baseUriReference))); 601*cdf0e10cSrcweir CPPUNIT_ASSERT(baseUriRef.is()); 602*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > uriRef( 603*cdf0e10cSrcweir m_uriFactory->parse( 604*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].uriReference))); 605*cdf0e10cSrcweir CPPUNIT_ASSERT(uriRef.is()); 606*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > absolute( 607*cdf0e10cSrcweir m_uriFactory->makeAbsolute( 608*cdf0e10cSrcweir baseUriRef, uriRef, data[i].processSpecialBaseSegments, 609*cdf0e10cSrcweir data[i].excessParentSegments)); 610*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 611*cdf0e10cSrcweir "testMakeAbsolute", i, data[i].uriReference, 612*cdf0e10cSrcweir data[i].absolute != 0, absolute.is()); 613*cdf0e10cSrcweir if (absolute.is()) { 614*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 615*cdf0e10cSrcweir "testMakeAbsolute", i, data[i].uriReference, 616*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].absolute), 617*cdf0e10cSrcweir absolute->getUriReference()); 618*cdf0e10cSrcweir } 619*cdf0e10cSrcweir } 620*cdf0e10cSrcweir } 621*cdf0e10cSrcweir 622*cdf0e10cSrcweir void Test::testMakeRelative() { 623*cdf0e10cSrcweir struct Data { 624*cdf0e10cSrcweir char const * baseUriReference; 625*cdf0e10cSrcweir char const * uriReference; 626*cdf0e10cSrcweir bool preferAuthorityOverRelativePath; 627*cdf0e10cSrcweir bool preferAbsoluteOverRelativePath; 628*cdf0e10cSrcweir bool encodeRetainedSpecialSegments; 629*cdf0e10cSrcweir char const * relative; 630*cdf0e10cSrcweir char const * absolute; 631*cdf0e10cSrcweir }; 632*cdf0e10cSrcweir Data data[] = { 633*cdf0e10cSrcweir { "scheme1://a/b/c", "scheme2://a/b/c?q#s", true, true, false, 634*cdf0e10cSrcweir "scheme2://a/b/c?q#s", 0 }, 635*cdf0e10cSrcweir { "scheme://a/b/c", "scheme:a/b/c?q#s", true, true, false, 636*cdf0e10cSrcweir "scheme:a/b/c?q#s", 0 }, 637*cdf0e10cSrcweir { "scheme://a/b/c", "", true, true, false, "", "scheme://a/b/c" }, 638*cdf0e10cSrcweir { "scheme://a/b/c", "//d/e/f", true, true, false, "//d/e/f", 639*cdf0e10cSrcweir "scheme://d/e/f" }, 640*cdf0e10cSrcweir { "scheme://a/b/c", "./e?q#s", true, true, false, "./e?q#s", 641*cdf0e10cSrcweir "scheme://a/b/e?q#s" }, 642*cdf0e10cSrcweir { "scheme://a/b", "scheme://a?q", true, true, false, "/?q", 643*cdf0e10cSrcweir "scheme://a/?q" }, 644*cdf0e10cSrcweir { "scheme://a/b", "scheme://a?q", true, false, false, "?q", 645*cdf0e10cSrcweir "scheme://a/?q" }, 646*cdf0e10cSrcweir { "scheme://a", "scheme://a?q", true, true, false, "?q", 0 }, 647*cdf0e10cSrcweir { "scheme://a/", "scheme://a?q", true, true, false, "?q", 648*cdf0e10cSrcweir "scheme://a/?q" }, 649*cdf0e10cSrcweir { "scheme://a", "scheme://a/?q", true, true, false, "?q", 650*cdf0e10cSrcweir "scheme://a?q" }, 651*cdf0e10cSrcweir { "scheme://a/", "scheme://a/?q", true, true, false, "?q", 652*cdf0e10cSrcweir "scheme://a/?q" }, 653*cdf0e10cSrcweir { "scheme://a?q", "scheme://a?q", true, true, false, "", 0 }, 654*cdf0e10cSrcweir { "scheme://a/?q", "scheme://a?q", true, true, false, "", 655*cdf0e10cSrcweir "scheme://a/?q" }, 656*cdf0e10cSrcweir { "scheme://a?q", "scheme://a/?q", true, true, false, "", 657*cdf0e10cSrcweir "scheme://a?q" }, 658*cdf0e10cSrcweir { "scheme://a/?q", "scheme://a/?q", true, true, false, "", 0 }, 659*cdf0e10cSrcweir { "scheme://a/b/c/d", "scheme://a//", true, true, false, "//a//", 0 }, 660*cdf0e10cSrcweir { "scheme://a/b/c/d", "scheme://a//", false, true, false, "../..//", 661*cdf0e10cSrcweir 0 }, 662*cdf0e10cSrcweir { "scheme://a/b/c/d", "scheme://a//", true, false, false, "../..//", 663*cdf0e10cSrcweir 0 }, 664*cdf0e10cSrcweir { "scheme://a/b/c/d", "scheme://a//", false, false, false, "../..//", 665*cdf0e10cSrcweir 0 }, 666*cdf0e10cSrcweir { "scheme://a/b/c/d", "scheme://a/e", true, true, false, "/e", 0 }, 667*cdf0e10cSrcweir { "scheme://a/b/c/d", "scheme://a/e", true, false, false, "../../e", 668*cdf0e10cSrcweir 0 }, 669*cdf0e10cSrcweir { "scheme://a/b/c/d/e", "scheme://a/b/f", true, true, false, "../../f", 670*cdf0e10cSrcweir 0 }, 671*cdf0e10cSrcweir { "scheme://a/b/c/d/e", "scheme://a/b", true, true, false, "/b", 0 }, 672*cdf0e10cSrcweir { "scheme://a/b/c/d/e", "scheme://a/b", true, false, false, 673*cdf0e10cSrcweir "../../../b", 0 }, 674*cdf0e10cSrcweir { "scheme://a/b/c/d/e", "scheme://a/b/", true, true, false, "../..", 675*cdf0e10cSrcweir 0 }, 676*cdf0e10cSrcweir { "scheme://a/b/c/d/e", "scheme://a/b/c", true, true, false, "../../c", 677*cdf0e10cSrcweir 0 }, 678*cdf0e10cSrcweir { "scheme://a/b/c/d/e", "scheme://a/b/c/", true, true, false, "..", 0 }, 679*cdf0e10cSrcweir { "scheme://a/b/", "scheme://a/b/c/d", true, true, false, "c/d", 0 }, 680*cdf0e10cSrcweir { "scheme://a/b/", "scheme://a/b/c/d/", true, true, false, "c/d/", 0 }, 681*cdf0e10cSrcweir { "scheme://a/b/c", "scheme://a/b//", true, true, false, ".//", 0 }, 682*cdf0e10cSrcweir { "scheme://a/b/c", "scheme://a/b//d", true, true, false, ".//d", 0 }, 683*cdf0e10cSrcweir { "scheme://a/b/c", "scheme://a/b//d//", true, true, false, ".//d//", 684*cdf0e10cSrcweir 0 }, 685*cdf0e10cSrcweir { "scheme://a/b/c", "scheme://a/b/d+:", true, true, false, "./d+:", 0 }, 686*cdf0e10cSrcweir { "scheme://a/b/c", "scheme://a/b/+d:", true, true, false, "+d:", 0 }, 687*cdf0e10cSrcweir { "scheme://a/b/c", "scheme://a/b/d#e:f", true, true, false, "d#e:f", 688*cdf0e10cSrcweir 0 }, 689*cdf0e10cSrcweir { "scheme://a/b/c/", "scheme://a/b/../d/.e/.", true, true, false, 690*cdf0e10cSrcweir "../../d/.e/.", 691*cdf0e10cSrcweir "scheme://a/d/.e/" }, 692*cdf0e10cSrcweir { "scheme://a/b/c/", "scheme://a/b/../d/.e/.", true, true, true, 693*cdf0e10cSrcweir "../%2E%2E/d/.e/%2E", "scheme://a/b/%2E%2E/d/.e/%2E" }, 694*cdf0e10cSrcweir { "scheme://auth/a/b", "scheme://auth//c/d", true, true, false, 695*cdf0e10cSrcweir "//auth//c/d", 0 }, 696*cdf0e10cSrcweir { "scheme://auth/a/b", "scheme://auth//c/d", false, true, false, 697*cdf0e10cSrcweir "..//c/d", 0 }, 698*cdf0e10cSrcweir { "scheme://auth/a/b", "scheme://auth/c/d", true, true, false, "/c/d", 699*cdf0e10cSrcweir 0 }, 700*cdf0e10cSrcweir { "scheme://auth/a/b", "scheme://auth/c/d", true, false, false, 701*cdf0e10cSrcweir "../c/d", 0 } }; 702*cdf0e10cSrcweir for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 703*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > baseUriRef( 704*cdf0e10cSrcweir m_uriFactory->parse( 705*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].baseUriReference))); 706*cdf0e10cSrcweir CPPUNIT_ASSERT(baseUriRef.is()); 707*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > uriRef( 708*cdf0e10cSrcweir m_uriFactory->parse( 709*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].uriReference))); 710*cdf0e10cSrcweir CPPUNIT_ASSERT(uriRef.is()); 711*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > relative( 712*cdf0e10cSrcweir m_uriFactory->makeRelative( 713*cdf0e10cSrcweir baseUriRef, uriRef, data[i].preferAuthorityOverRelativePath, 714*cdf0e10cSrcweir data[i].preferAbsoluteOverRelativePath, 715*cdf0e10cSrcweir data[i].encodeRetainedSpecialSegments)); 716*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 717*cdf0e10cSrcweir "testMakeRelative", i, data[i].uriReference, 718*cdf0e10cSrcweir data[i].relative != 0, relative.is()); 719*cdf0e10cSrcweir if (relative.is()) { 720*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 721*cdf0e10cSrcweir "testMakeRelative", i, data[i].uriReference, 722*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].relative), 723*cdf0e10cSrcweir relative->getUriReference()); 724*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > absolute( 725*cdf0e10cSrcweir m_uriFactory->makeAbsolute( 726*cdf0e10cSrcweir baseUriRef, relative, true, 727*cdf0e10cSrcweir css::uri::RelativeUriExcessParentSegments_ERROR)); 728*cdf0e10cSrcweir CPPUNIT_ASSERT(absolute.is()); 729*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 730*cdf0e10cSrcweir "testMakeRelative", i, data[i].uriReference, 731*cdf0e10cSrcweir rtl::OUString::createFromAscii( 732*cdf0e10cSrcweir data[i].absolute == 0 733*cdf0e10cSrcweir ? data[i].uriReference : data[i].absolute), 734*cdf0e10cSrcweir absolute->getUriReference()); 735*cdf0e10cSrcweir } 736*cdf0e10cSrcweir } 737*cdf0e10cSrcweir } 738*cdf0e10cSrcweir 739*cdf0e10cSrcweir void Test::testVndSunStarExpand() { 740*cdf0e10cSrcweir struct Data { 741*cdf0e10cSrcweir char const * uriReference; 742*cdf0e10cSrcweir char const * expanded; 743*cdf0e10cSrcweir }; 744*cdf0e10cSrcweir Data data[] = { 745*cdf0e10cSrcweir { "vnd.sun.star.expand:", "" }, // liberally accepted 746*cdf0e10cSrcweir { "vnd.sun.star.expand:/", "/" }, // liberally accepted 747*cdf0e10cSrcweir { "vnd.sun.star.expand:%80", 0 }, 748*cdf0e10cSrcweir { "vnd.sun.star.expand:%5C$%5C%24%5C%5C", "$$\\" } }; 749*cdf0e10cSrcweir css::uno::Reference< css::util::XMacroExpander > expander( 750*cdf0e10cSrcweir m_context->getValueByName( 751*cdf0e10cSrcweir rtl::OUString( 752*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 753*cdf0e10cSrcweir "/singletons/com.sun.star.util.theMacroExpander"))), 754*cdf0e10cSrcweir css::uno::UNO_QUERY_THROW); 755*cdf0e10cSrcweir for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 756*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > uriRef( 757*cdf0e10cSrcweir m_uriFactory->parse( 758*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].uriReference))); 759*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 760*cdf0e10cSrcweir "testVndSunStarExpand", i, data[i].uriReference, 761*cdf0e10cSrcweir data[i].expanded != 0, uriRef.is()); 762*cdf0e10cSrcweir if (uriRef.is()) { 763*cdf0e10cSrcweir css::uno::Reference< css::uri::XVndSunStarExpandUrlReference > 764*cdf0e10cSrcweir expandUrl(uriRef, css::uno::UNO_QUERY_THROW); 765*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 766*cdf0e10cSrcweir "testVndSunStarExpand", i, data[i].uriReference, 767*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].expanded), 768*cdf0e10cSrcweir expandUrl->expand(expander)); 769*cdf0e10cSrcweir } 770*cdf0e10cSrcweir } 771*cdf0e10cSrcweir } 772*cdf0e10cSrcweir 773*cdf0e10cSrcweir void Test::testVndSunStarScript() { 774*cdf0e10cSrcweir struct Parameter { 775*cdf0e10cSrcweir char const * key; 776*cdf0e10cSrcweir char const * value; 777*cdf0e10cSrcweir }; 778*cdf0e10cSrcweir std::size_t const parameterCount = 3; 779*cdf0e10cSrcweir struct Data { 780*cdf0e10cSrcweir char const * uriReference; 781*cdf0e10cSrcweir char const * name; 782*cdf0e10cSrcweir const bool normalized; 783*cdf0e10cSrcweir Parameter parameters[parameterCount]; 784*cdf0e10cSrcweir }; 785*cdf0e10cSrcweir Data data[] = { 786*cdf0e10cSrcweir { "vnd.sun.star.script:", 0, false, {} }, 787*cdf0e10cSrcweir { "vnd.sun.star.script:/", 0, false, {} }, 788*cdf0e10cSrcweir { "vnd.sun.star.script:/abc/def?ghi=jkl&mno=pqr", 0, false, {} }, 789*cdf0e10cSrcweir { "vnd.sun.star.script:abc%3fdef/ghi", "abc?def/ghi", false, {} }, 790*cdf0e10cSrcweir { "vnd.sun.star.script:name?a", 0, false, {} }, 791*cdf0e10cSrcweir { "vnd.sun.star.script:name?a=", "name", true, { { "a", "" }, { "A", 0 } } }, 792*cdf0e10cSrcweir { "vnd.sun.star.script:name?a=&", 0, true, {} }, 793*cdf0e10cSrcweir { "vnd.sun.star.script:name?key1=&%26=%3D&key1=hello", "name", true, 794*cdf0e10cSrcweir { { "key1", "" }, { "key2", 0 }, { "&", "=" } } } }; 795*cdf0e10cSrcweir for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 796*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > uriRef( 797*cdf0e10cSrcweir m_uriFactory->parse( 798*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].uriReference))); 799*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 800*cdf0e10cSrcweir "testVndSunStarScript", i, data[i].uriReference, data[i].name != 0, 801*cdf0e10cSrcweir uriRef.is()); 802*cdf0e10cSrcweir if (uriRef.is()) { 803*cdf0e10cSrcweir css::uno::Reference< css::uri::XVndSunStarScriptUrlReference > 804*cdf0e10cSrcweir scriptUrl(uriRef, css::uno::UNO_QUERY_THROW); 805*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 806*cdf0e10cSrcweir "testVndSunStarScript", i, data[i].uriReference, 807*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].uriReference), 808*cdf0e10cSrcweir scriptUrl->getUriReference()); 809*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 810*cdf0e10cSrcweir "testVndSunStarScript", i, data[i].uriReference, 811*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].name), 812*cdf0e10cSrcweir scriptUrl->getName()); 813*cdf0e10cSrcweir rtl::OUString originalReference(uriRef->getUriReference()); 814*cdf0e10cSrcweir for (std::size_t j = 0; j < parameterCount; ++j) { 815*cdf0e10cSrcweir if (data[i].parameters[j].key != 0) { 816*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 817*cdf0e10cSrcweir "testVndSunStarScript", 818*cdf0e10cSrcweir static_cast< double >(i) 819*cdf0e10cSrcweir + static_cast< double >(j) / 10.0, 820*cdf0e10cSrcweir data[i].uriReference, 821*cdf0e10cSrcweir data[i].parameters[j].value != 0, 822*cdf0e10cSrcweir scriptUrl->hasParameter( 823*cdf0e10cSrcweir rtl::OUString::createFromAscii( 824*cdf0e10cSrcweir data[i].parameters[j].key))); 825*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 826*cdf0e10cSrcweir "testVndSunStarScript", 827*cdf0e10cSrcweir static_cast< double >(i) 828*cdf0e10cSrcweir + static_cast< double >(j) / 10.0, 829*cdf0e10cSrcweir data[i].uriReference, 830*cdf0e10cSrcweir rtl::OUString::createFromAscii( 831*cdf0e10cSrcweir data[i].parameters[j].value), 832*cdf0e10cSrcweir scriptUrl->getParameter( 833*cdf0e10cSrcweir rtl::OUString::createFromAscii( 834*cdf0e10cSrcweir data[i].parameters[j].key))); 835*cdf0e10cSrcweir 836*cdf0e10cSrcweir // setting the parameter to its original value should not change 837*cdf0e10cSrcweir // the overall uri reference (provided it was normalized before) 838*cdf0e10cSrcweir if ( data[i].normalized ) { 839*cdf0e10cSrcweir if ( scriptUrl->hasParameter(rtl::OUString::createFromAscii( 840*cdf0e10cSrcweir data[i].parameters[j].key)) ) { 841*cdf0e10cSrcweir scriptUrl->setParameter( 842*cdf0e10cSrcweir rtl::OUString::createFromAscii( 843*cdf0e10cSrcweir data[i].parameters[j].key), 844*cdf0e10cSrcweir scriptUrl->getParameter( 845*cdf0e10cSrcweir rtl::OUString::createFromAscii( 846*cdf0e10cSrcweir data[i].parameters[j].key))); 847*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 848*cdf0e10cSrcweir "testVndSunStarScript", 849*cdf0e10cSrcweir static_cast< double >(i) 850*cdf0e10cSrcweir + static_cast< double >(j) / 10.0, 851*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("setParameter"), 852*cdf0e10cSrcweir originalReference, 853*cdf0e10cSrcweir uriRef->getUriReference()); 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir } 856*cdf0e10cSrcweir } 857*cdf0e10cSrcweir } 858*cdf0e10cSrcweir if ( data[i].normalized ) { 859*cdf0e10cSrcweir scriptUrl->setName(scriptUrl->getName()); 860*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 861*cdf0e10cSrcweir "testVndSunStarScript", 862*cdf0e10cSrcweir i, 863*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("setName"), 864*cdf0e10cSrcweir originalReference, 865*cdf0e10cSrcweir uriRef->getUriReference()); 866*cdf0e10cSrcweir } 867*cdf0e10cSrcweir } 868*cdf0e10cSrcweir } 869*cdf0e10cSrcweir 870*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > uriRef( 871*cdf0e10cSrcweir m_uriFactory->parse( 872*cdf0e10cSrcweir rtl::OUString( 873*cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 874*cdf0e10cSrcweir "vnd.sun.star.script:Hello?location=Library.Module"))), 875*cdf0e10cSrcweir css::uno::UNO_SET_THROW); 876*cdf0e10cSrcweir css::uno::Reference< css::uri::XVndSunStarScriptUrlReference > 877*cdf0e10cSrcweir scriptUrl(uriRef, css::uno::UNO_QUERY_THROW); 878*cdf0e10cSrcweir 879*cdf0e10cSrcweir scriptUrl->setParameter( 880*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "location")), 881*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "foo"))); 882*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 883*cdf0e10cSrcweir "testVndSunStarScript", (sal_Int32)10, (sal_Int32)1, 884*cdf0e10cSrcweir uriRef->getUriReference(), 885*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.script:Hello?location=foo"))); 886*cdf0e10cSrcweir 887*cdf0e10cSrcweir scriptUrl->setParameter( 888*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "language")), 889*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "StarBasic"))); 890*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 891*cdf0e10cSrcweir "testVndSunStarScript", (sal_Int32)10, (sal_Int32)2, 892*cdf0e10cSrcweir uriRef->getUriReference(), 893*cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.script:Hello?location=foo&language=StarBasic"))); 894*cdf0e10cSrcweir 895*cdf0e10cSrcweir 896*cdf0e10cSrcweir bool caughtExpected = false; 897*cdf0e10cSrcweir try { 898*cdf0e10cSrcweir scriptUrl->setName(::rtl::OUString()); 899*cdf0e10cSrcweir } 900*cdf0e10cSrcweir catch( const css::lang::IllegalArgumentException& ) { 901*cdf0e10cSrcweir caughtExpected = true; 902*cdf0e10cSrcweir } 903*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 904*cdf0e10cSrcweir "testVndSunStarScript", 905*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("illegal arguments"), 906*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("name"), 907*cdf0e10cSrcweir caughtExpected, 908*cdf0e10cSrcweir true); 909*cdf0e10cSrcweir 910*cdf0e10cSrcweir caughtExpected = false; 911*cdf0e10cSrcweir try { 912*cdf0e10cSrcweir scriptUrl->setParameter( 913*cdf0e10cSrcweir ::rtl::OUString(), 914*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("non-empty")); 915*cdf0e10cSrcweir } 916*cdf0e10cSrcweir catch( const css::lang::IllegalArgumentException& ) { 917*cdf0e10cSrcweir caughtExpected = true; 918*cdf0e10cSrcweir } 919*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 920*cdf0e10cSrcweir "testVndSunStarScript", 921*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("illegal arguments"), 922*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("parameter"), 923*cdf0e10cSrcweir caughtExpected, 924*cdf0e10cSrcweir true); 925*cdf0e10cSrcweir } 926*cdf0e10cSrcweir 927*cdf0e10cSrcweir void Test::testTranslator() { 928*cdf0e10cSrcweir struct Data { 929*cdf0e10cSrcweir char const * externalUriReference; 930*cdf0e10cSrcweir char const * internalUriReference; 931*cdf0e10cSrcweir bool toInternal; 932*cdf0e10cSrcweir }; 933*cdf0e10cSrcweir Data data[] = { 934*cdf0e10cSrcweir { "", "", true }, 935*cdf0e10cSrcweir { "#fragment", "#fragment", true }, 936*cdf0e10cSrcweir { "segment/segment?query#fragment", "segment/segment?query#fragment", 937*cdf0e10cSrcweir true }, 938*cdf0e10cSrcweir { "/segment/segment?query#fragment", "/segment/segment?query#fragment", 939*cdf0e10cSrcweir true }, 940*cdf0e10cSrcweir { "//authority/segment?query#fragment", 941*cdf0e10cSrcweir "//authority/segment?query#fragment", true }, 942*cdf0e10cSrcweir { "foo:bar#fragment", "foo:bar#fragment", true }, 943*cdf0e10cSrcweir { "file:///abc/def", "file:///abc/def", true }, 944*cdf0e10cSrcweir { "file:///abc/%FEef", "file:///abc/%feef", false }, 945*cdf0e10cSrcweir { "file:///abc/%80%80ef", "file:///abc/%80%80ef", false }, 946*cdf0e10cSrcweir { "file:///abc/%ED%A0%80%ED%B0%80ef", 947*cdf0e10cSrcweir "file:///abc/%ED%A0%80%ED%B0%80ef", false }, 948*cdf0e10cSrcweir { "file:///abc/%25.ef", "file:///abc/%.ef", false }, 949*cdf0e10cSrcweir { "file:///abc/%25ef", "file:///abc/%25ef", true } }; 950*cdf0e10cSrcweir css::uno::Reference< css::uri::XExternalUriReferenceTranslator > 951*cdf0e10cSrcweir translator(css::uri::ExternalUriReferenceTranslator::create(m_context)); 952*cdf0e10cSrcweir for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 953*cdf0e10cSrcweir if (data[i].toInternal) { 954*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 955*cdf0e10cSrcweir "testTranslator, translateToInternal", i, 956*cdf0e10cSrcweir data[i].externalUriReference, 957*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].internalUriReference), 958*cdf0e10cSrcweir translator->translateToInternal( 959*cdf0e10cSrcweir rtl::OUString::createFromAscii( 960*cdf0e10cSrcweir data[i].externalUriReference))); 961*cdf0e10cSrcweir } 962*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 963*cdf0e10cSrcweir "testTranslator, translateToExternal", i, 964*cdf0e10cSrcweir data[i].internalUriReference, 965*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].externalUriReference), 966*cdf0e10cSrcweir translator->translateToExternal( 967*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].internalUriReference))); 968*cdf0e10cSrcweir } 969*cdf0e10cSrcweir } 970*cdf0e10cSrcweir 971*cdf0e10cSrcweir void Test::testPkgUrlFactory() { 972*cdf0e10cSrcweir struct Data { 973*cdf0e10cSrcweir char const * authority; 974*cdf0e10cSrcweir char const * result; 975*cdf0e10cSrcweir }; 976*cdf0e10cSrcweir Data data[] = { 977*cdf0e10cSrcweir { "a/b/c", 0 }, 978*cdf0e10cSrcweir { "file:///#foo", 0 }, 979*cdf0e10cSrcweir { "file:///a%25b%2fc/d~e&f@g?h", 980*cdf0e10cSrcweir "vnd.sun.star.pkg://file:%2F%2F%2Fa%2525b%252fc%2Fd~e&f@g%3Fh" } }; 981*cdf0e10cSrcweir css::uno::Reference< css::uri::XVndSunStarPkgUrlReferenceFactory > factory( 982*cdf0e10cSrcweir css::uri::VndSunStarPkgUrlReferenceFactory::create(m_context)); 983*cdf0e10cSrcweir for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) { 984*cdf0e10cSrcweir css::uno::Reference< css::uri::XUriReference > url( 985*cdf0e10cSrcweir factory->createVndSunStarPkgUrlReference( 986*cdf0e10cSrcweir m_uriFactory->parse( 987*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].authority)))); 988*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 989*cdf0e10cSrcweir "testVndSunStarPkgFactory", i, data[i].authority, 990*cdf0e10cSrcweir data[i].result != 0, static_cast< bool >(url.is())); 991*cdf0e10cSrcweir if (data[i].result != 0) { 992*cdf0e10cSrcweir TEST_ASSERT_EQUAL( 993*cdf0e10cSrcweir "testVndSunStarPkgFactory", i, data[i].authority, 994*cdf0e10cSrcweir rtl::OUString::createFromAscii(data[i].result), 995*cdf0e10cSrcweir url->getUriReference()); 996*cdf0e10cSrcweir } 997*cdf0e10cSrcweir } 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir 1000*cdf0e10cSrcweir CPPUNIT_TEST_SUITE_REGISTRATION(Test); 1001*cdf0e10cSrcweir 1002*cdf0e10cSrcweir } 1003*cdf0e10cSrcweir 1004*cdf0e10cSrcweir CPPUNIT_PLUGIN_IMPLEMENT(); 1005