xref: /AOO41X/main/stoc/test/uriproc/test_uriproc.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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