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