1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include "HistoryOptTest.hxx"
25 #include <unotools/historyoptions_const.hxx>
26 
27 #include <com/sun/star/uno/Sequence.hxx>
28 #include <com/sun/star/beans/PropertyValue.hpp>
29 #include <com/sun/star/beans/XPropertySet.hpp>
30 #include <com/sun/star/container/XNameAccess.hpp>
31 #include <com/sun/star/container/XNameContainer.hpp>
32 
33 #include <comphelper/configurationhelper.hxx>
34 #include <comphelper/sequenceashashmap.hxx>
35 #include <unotools/processfactory.hxx>
36 
37 namespace css = ::com::sun::star;
38 
39 //=============================================================================
40 static const ::rtl::OUString MESSAGE_CLEAR_FAILED       = ::rtl::OUString::createFromAscii("Clearing the list failed.");
41 static const ::rtl::OUString MESSAGE_SETSIZE_FAILED     = ::rtl::OUString::createFromAscii("Setting a new size for a list failed.");
42 static const ::rtl::OUString MESSAGE_MISS_HISTORY       = ::rtl::OUString::createFromAscii("Could not get config access to history list inside config.");
43 static const ::rtl::OUString MESSAGE_MISS_ITEMLIST      = ::rtl::OUString::createFromAscii("Could not get config access to item list inside config.");
44 static const ::rtl::OUString MESSAGE_MISS_ORDERLIST     = ::rtl::OUString::createFromAscii("Could not get config access to order list inside config.");
45 static const ::rtl::OUString MESSAGE_MISS_ITEM          = ::rtl::OUString::createFromAscii("Could not locate item.");
46 static const ::rtl::OUString MESSAGE_UNEXPECTED_ITEM    = ::rtl::OUString::createFromAscii("Found an unexpected item.");
47 static const ::rtl::OUString MESSAGE_WRONG_ORDER        = ::rtl::OUString::createFromAscii("Wrong order in history list.");
48 
49 //=============================================================================
50 HistoryOptTest::HistoryOptTest()
51     : m_aConfigItem  (         )
52     , m_eList        (ePICKLIST)
53     , m_xHistoriesXCU(         )
54     , m_xCommonXCU   (         )
55 {
56 }
57 
58 //=============================================================================
59 HistoryOptTest::~HistoryOptTest()
60 {
61     m_xHistoriesXCU.clear();
62     m_xCommonXCU.clear();
63 }
64 
65 //=============================================================================
66 void HistoryOptTest::checkPicklist()
67 {
68     impl_testHistory(ePICKLIST, 4);
69 }
70 
71 //=============================================================================
72 void HistoryOptTest::checkURLHistory()
73 {
74     impl_testHistory(eHISTORY, 10);
75 }
76 
77 //=============================================================================
78 void HistoryOptTest::checkHelpBookmarks()
79 {
80     impl_testHistory(eHELPBOOKMARKS, 100);
81 }
82 
83 //=============================================================================
84 void HistoryOptTest::impl_testHistory(EHistoryType eHistory ,
85                                       ::sal_Int32  nMaxItems)
86 {
87 	try
88 	{
89 		m_eList       = eHistory;
90 		::sal_Int32 c = nMaxItems;
91 		::sal_Int32 i = 0;
92 
93 		impl_clearList( );
94 		impl_setSize  (c);
95 
96 		// a) fill list completely and check if all items could be really created.
97 		//    But dont check its order here! Because every new item will change that order.
98 		for (i=0; i<c; ++i)
99 		{
100 			impl_appendItem(i);
101 			if ( ! impl_existsItem(i))
102 				throw css::uno::Exception(MESSAGE_MISS_ITEM, 0);
103 		}
104 
105 		// b) Check order of all items in list now.
106 		//    It must be reverse to the item number ...
107 		//      item max   = index 0
108 		//      item max-1 = index 1
109 		//      ...
110 		for (i=0; i<c; ++i)
111 		{
112 			::sal_Int32 nExpectedIndex = (c-1)-i;
113 			if ( ! impl_existsItemAtIndex(i, nExpectedIndex))
114 				throw css::uno::Exception(MESSAGE_WRONG_ORDER, 0);
115 		}
116 
117 		// c) increase prio of "first" item so it will switch
118 		//    to "second" and "second" will switch to "first" :-)
119 		//    Check also if all other items was not touched.
120 		::sal_Int32 nFirstItem  = (c-1);
121 		::sal_Int32 nSecondItem = (c-2);
122 		impl_appendItem(nSecondItem);
123 
124 		if (
125 			( ! impl_existsItemAtIndex(nSecondItem, 0)) ||
126 			( ! impl_existsItemAtIndex(nFirstItem , 1))
127 		   )
128 			throw css::uno::Exception(MESSAGE_WRONG_ORDER, 0);
129 
130 		for (i=0; i<nSecondItem; ++i)
131 		{
132 			::sal_Int32 nExpectedIndex = (c-1)-i;
133 			if ( ! impl_existsItemAtIndex(i, nExpectedIndex))
134 				throw css::uno::Exception(MESSAGE_WRONG_ORDER, 0);
135 		}
136 
137 		// d) Check if appending new items will destroy the oldest one.
138 		::sal_Int32 nNewestItem = c;
139 		::sal_Int32 nOldestItem = 0;
140 
141 		impl_appendItem(nNewestItem);
142 
143 		if ( ! impl_existsItemAtIndex(nNewestItem, 0))
144 			throw css::uno::Exception(MESSAGE_WRONG_ORDER, 0);
145 
146 		if (impl_existsItem(nOldestItem))
147 			throw css::uno::Exception(MESSAGE_UNEXPECTED_ITEM, 0);
148 
149 		// e) Check if decreasing list size will remove oldest items.
150 		//    Note: impl_setSize() will make sure that 3 items exists only.
151 		//    Otherwhise it throws an exception. If we further check
152 		//    positions of three items no further items must be checked.
153 		//    They can't exists :-)
154 		::sal_Int32 nNewSize = 3;
155 		impl_setSize(nNewSize);
156 		if (
157 			( ! impl_existsItemAtIndex(nNewestItem, 0)) ||
158 			( ! impl_existsItemAtIndex(nSecondItem, 1)) ||
159 			( ! impl_existsItemAtIndex(nFirstItem , 2))
160 		   )
161 			throw css::uno::Exception(MESSAGE_WRONG_ORDER, 0);
162 
163 		// finally we should try to clean up all used structures so the same office can be used
164 		// without problems :-)
165 		impl_clearList();
166 	}
167 	catch (const css::uno::Exception& ex)
168 	{
169 		impl_clearList();
170 		throw ex;
171 	}
172 
173 }
174 
175 //=============================================================================
176 void HistoryOptTest::impl_clearList()
177 {
178     m_aConfigItem.Clear(m_eList);
179     ::sal_Int32 nCount = m_aConfigItem.GetList(m_eList).getLength();
180 
181     if (nCount != 0)
182         throw css::uno::Exception(MESSAGE_CLEAR_FAILED, 0);
183 
184     css::uno::Reference< css::container::XNameAccess > xList;
185     xList  = impl_getItemList();
186     nCount = xList->getElementNames().getLength();
187 
188     if (nCount != 0)
189         throw css::uno::Exception(MESSAGE_CLEAR_FAILED, 0);
190 
191     xList  = impl_getOrderList();
192     nCount = xList->getElementNames().getLength();
193 
194     if (nCount != 0)
195         throw css::uno::Exception(MESSAGE_CLEAR_FAILED, 0);
196 }
197 
198 //=============================================================================
199 void HistoryOptTest::impl_setSize(::sal_Int32 nSize)
200 {
201     m_aConfigItem.SetSize (m_eList, nSize);
202 
203 	// a) size info returned by GetSize() means "MaxSize"
204 	//    so it must match exactly !
205     ::sal_Int32 nCheck = m_aConfigItem.GetSize(m_eList);
206     if (nCheck != nSize)
207         throw css::uno::Exception(MESSAGE_SETSIZE_FAILED, 0);
208 
209 	// b) current size of used XCU lists reflects the current state of
210 	//    history list and not max size. So it can be less then size !
211     css::uno::Reference< css::container::XNameAccess > xList;
212     xList  = impl_getItemList();
213     nCheck = xList->getElementNames().getLength();
214     if (nCheck > nSize)
215         throw css::uno::Exception(MESSAGE_SETSIZE_FAILED, 0);
216 
217     xList  = impl_getOrderList();
218     nCheck = xList->getElementNames().getLength();
219     if (nCheck > nSize)
220         throw css::uno::Exception(MESSAGE_SETSIZE_FAILED, 0);
221 }
222 
223 //=============================================================================
224 void HistoryOptTest::impl_appendItem(::sal_Int32 nItem)
225 {
226     const ::rtl::OUString sURL      = impl_createItemURL     (nItem);
227     const ::rtl::OUString sTitle    = impl_createItemTitle   (nItem);
228     const ::rtl::OUString sPassword = impl_createItemPassword(nItem);
229 
230     m_aConfigItem.AppendItem(m_eList, sURL, ::rtl::OUString(), sTitle, sPassword);
231 }
232 
233 //=============================================================================
234 ::rtl::OUString HistoryOptTest::impl_createItemURL(::sal_Int32 nItem)
235 {
236     ::rtl::OUStringBuffer sURL(256);
237     sURL.appendAscii("file:///ooo_api_test/non_existing_test_url_");
238     sURL.append     ((::sal_Int32)nItem  );
239     sURL.appendAscii(".odt"              );
240 
241     return sURL.makeStringAndClear();
242 }
243 
244 //=============================================================================
245 ::rtl::OUString HistoryOptTest::impl_createItemTitle(::sal_Int32 nItem)
246 {
247     ::rtl::OUStringBuffer sTitle(256);
248     sTitle.appendAscii("Non Existing Test Item Nr ");
249     sTitle.append     ((::sal_Int32)nItem          );
250 
251     return sTitle.makeStringAndClear();
252 }
253 
254 //=============================================================================
255 ::rtl::OUString HistoryOptTest::impl_createItemPassword(::sal_Int32 nItem)
256 {
257     ::rtl::OUStringBuffer sPassword(256);
258     sPassword.appendAscii("Password_"       );
259     sPassword.append     ((::sal_Int32)nItem);
260 
261     return sPassword.makeStringAndClear();
262 }
263 
264 //=============================================================================
265 ::sal_Bool HistoryOptTest::impl_existsItem(::sal_Int32 nItem)
266 {
267     const ::rtl::OUString                                                       sURL     = impl_createItemURL(nItem);
268     const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > lItems   = m_aConfigItem.GetList(m_eList);
269     const ::sal_Int32                                                           c        = lItems.getLength ();
270           ::sal_Int32                                                           i        = 0;
271           ::sal_Bool                                                            bFound   = sal_False;
272 
273     for (i=0; i<c; ++i)
274     {
275         const ::comphelper::SequenceAsHashMap aItem(lItems[i]);
276         const ::rtl::OUString&                sCheck = aItem.getUnpackedValueOrDefault(s_sURL, ::rtl::OUString());
277 
278         bFound = sCheck.equals(sURL);
279         if (bFound)
280             break;
281     }
282 
283     if ( ! bFound)
284         return sal_False;
285     bFound = sal_False;
286 
287     try
288     {
289         css::uno::Reference< css::container::XNameAccess > xItemList = impl_getItemList();
290         css::uno::Reference< css::container::XNameAccess > xItem     ;
291         xItemList->getByName(sURL) >>= xItem;
292 
293         bFound = xItem.is();
294     }
295     catch(const css::container::NoSuchElementException&)
296         {}
297 
298     return bFound;
299 }
300 
301 //=============================================================================
302 ::sal_Bool HistoryOptTest::impl_existsItemAtIndex(::sal_Int32 nItem ,
303                                                   ::sal_Int32 nIndex)
304 {
305     const ::rtl::OUString                                                       sURL     = impl_createItemURL(nItem);
306     const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > lItems   = m_aConfigItem.GetList(m_eList);
307     const ::sal_Int32                                                           c        = lItems.getLength ();
308           ::sal_Bool                                                            bFound   = sal_False;
309 
310     if (nIndex >= c)
311         return sal_False;
312 
313     const ::comphelper::SequenceAsHashMap aItem(lItems[nIndex]);
314           ::rtl::OUString                 sCheck = aItem.getUnpackedValueOrDefault(s_sURL, ::rtl::OUString());
315 
316     bFound = sCheck.equals(sURL);
317     if ( ! bFound)
318         return sal_False;
319     bFound = sal_False;
320 
321     try
322     {
323         css::uno::Reference< css::container::XNameAccess > xItemList = impl_getItemList();
324         css::uno::Reference< css::container::XNameAccess > xItem     ;
325         xItemList->getByName(sURL) >>= xItem;
326 
327         bFound = xItem.is();
328     }
329     catch(const css::container::NoSuchElementException&)
330         {}
331 
332     if ( ! bFound)
333         return sal_False;
334     bFound = sal_False;
335 
336     try
337     {
338         const ::rtl::OUString                              sOrder     = ::rtl::OUString::valueOf(nIndex);
339         css::uno::Reference< css::container::XNameAccess > xOrderList = impl_getOrderList();
340         css::uno::Reference< css::container::XNameAccess > xOrder     ;
341         xOrderList->getByName(sOrder) >>= xOrder;
342 
343         if (xOrder.is())
344         {
345             xOrder->getByName(s_sHistoryItemRef) >>= sCheck;
346             bFound = sCheck.equals(sURL);
347         }
348     }
349     catch(const css::container::NoSuchElementException&)
350         {}
351 
352     return bFound;
353 }
354 
355 //=============================================================================
356 css::uno::Reference< css::container::XNameAccess > HistoryOptTest::impl_getItemList()
357 {
358     css::uno::Reference< css::container::XNameAccess > xHistory = impl_getNewHistory();
359     css::uno::Reference< css::container::XNameAccess > xList    ;
360     xHistory->getByName (s_sItemList) >>= xList;
361 
362     if ( ! xList.is())
363         throw css::uno::Exception(MESSAGE_MISS_ITEMLIST, 0);
364 
365     return xList;
366 }
367 
368 //=============================================================================
369 css::uno::Reference< css::container::XNameAccess > HistoryOptTest::impl_getOrderList()
370 {
371     css::uno::Reference< css::container::XNameAccess > xHistory = impl_getNewHistory();
372     css::uno::Reference< css::container::XNameAccess > xList    ;
373     xHistory->getByName (s_sOrderList) >>= xList;
374 
375     if ( ! xList.is())
376         throw css::uno::Exception(MESSAGE_MISS_ORDERLIST, 0);
377 
378     return xList;
379 }
380 
381 //=============================================================================
382 css::uno::Reference< css::container::XNameAccess > HistoryOptTest::impl_getNewHistory()
383 {
384     if ( ! m_xHistoriesXCU.is())
385     {
386         m_xHistoriesXCU = css::uno::Reference< css::container::XNameAccess >(
387             ::comphelper::ConfigurationHelper::openConfig(
388             ::utl::getProcessServiceFactory(),
389             s_sHistories,
390             ::comphelper::ConfigurationHelper::E_STANDARD),
391             css::uno::UNO_QUERY_THROW);
392     }
393 
394     css::uno::Reference< css::container::XNameAccess > xHistory;
395 
396     switch (m_eList)
397     {
398         case ePICKLIST :
399                 m_xHistoriesXCU->getByName(s_sPickList) >>= xHistory;
400                 break;
401 
402         case eHISTORY :
403                 m_xHistoriesXCU->getByName(s_sURLHistory) >>= xHistory;
404                 break;
405 
406         case eHELPBOOKMARKS :
407                 m_xHistoriesXCU->getByName(s_sHelpBookmarks) >>= xHistory;
408                 break;
409     }
410 
411     if ( ! xHistory.is())
412         throw css::uno::Exception(MESSAGE_MISS_HISTORY, 0);
413 
414     return xHistory;
415 }
416 
417 //=============================================================================
418 css::uno::Reference< css::container::XNameAccess > HistoryOptTest::impl_getOldHistory()
419 {
420     if ( ! m_xCommonXCU.is())
421     {
422         m_xCommonXCU = css::uno::Reference< css::container::XNameAccess >(
423             ::comphelper::ConfigurationHelper::openConfig(
424             ::utl::getProcessServiceFactory(),
425             s_sCommonHistory,
426             ::comphelper::ConfigurationHelper::E_STANDARD),
427             css::uno::UNO_QUERY_THROW);
428     }
429 
430     css::uno::Reference< css::container::XNameAccess > xHistory;
431 
432     switch (m_eList)
433     {
434         case ePICKLIST :
435                 m_xCommonXCU->getByName(s_sPickList) >>= xHistory;
436                 break;
437 
438         case eHISTORY :
439                 m_xCommonXCU->getByName(s_sURLHistory) >>= xHistory;
440                 break;
441 
442         case eHELPBOOKMARKS :
443                 m_xCommonXCU->getByName(s_sHelpBookmarks) >>= xHistory;
444                 break;
445     }
446 
447     if ( ! xHistory.is())
448         throw css::uno::Exception(MESSAGE_MISS_HISTORY, 0);
449 
450     return xHistory;
451 }
452 
453 /*
454 //=============================================================================
455 // clear the list in XML directly when using the new Histories.xcs
456 void HistoryOptTest::impl_clearList(const ::rtl::OUString& sList)
457 {
458 	css::uno::Reference< css::container::XNameAccess >    xListAccess;
459 	css::uno::Reference< css::container::XNameContainer > xItemOrder;
460 	css::uno::Reference< css::beans::XPropertySet >       xFirstItem;
461 	css::uno::Sequence< ::rtl::OUString >                 sFileList;
462 
463 	if (sList.equalsAscii("PickList"))
464 		m_xCfg->getByName(s_sPickList) >>= xListAccess;
465 
466 	else if (sList.equalsAscii("URLHistory"))
467 		m_xCfg->getByName(s_sURLHistory) >>= xListAccess;
468 
469 	else if (sList.equalsAscii("HelpBookmarks"))
470 		m_xCfg->getByName(s_sHelpBookmarks) >>= xListAccess;
471 
472 	if (xListAccess.is())
473 	{
474 		xListAccess->getByName(s_sItemList)  >>= xItemOrder  ;
475 		sFileList = xItemOrder->getElementNames();
476 		for(sal_Int32 i=0; i<sFileList.getLength(); ++i)
477 			xItemOrder->removeByName(sFileList[i]);
478 
479 		xListAccess->getByName(s_sOrderList) >>= xItemOrder ;
480 		sFileList = xItemOrder->getElementNames();
481 		for(sal_Int32 j=0; j<sFileList.getLength(); ++j)
482 			xItemOrder->removeByName(sFileList[j]);
483 
484 		xFirstItem = css::uno::Reference< css::beans::XPropertySet >(xListAccess, css::uno::UNO_QUERY);
485 		xFirstItem->setPropertyValue( s_sFirstItem, css::uno::makeAny((sal_Int32)0) );
486 
487 		::comphelper::ConfigurationHelper::flush(m_xCfg);
488 	}
489 }
490 
491 //=============================================================================
492 // use configuration API (not ConfigItem!) to verify the results within XML !
493 sal_Bool HistoryOptTest::impl_isListEmpty(const ::rtl::OUString& sList)
494 {
495 	css::uno::Reference< css::container::XNameAccess > xListAccess;
496 	css::uno::Reference< css::container::XNameAccess > xItemList;
497 	css::uno::Reference< css::container::XNameAccess > xOrderList;
498 	sal_Bool bRet = sal_True;
499 
500 	if (sList.equalsAscii("PickList"))
501 		m_xCfg->getByName(s_sPickList) >>= xListAccess;
502 
503 	else if (sList.equalsAscii("URLHistory"))
504 		m_xCfg->getByName(s_sURLHistory) >>= xListAccess;
505 
506 	else if (sList.equalsAscii("HelpBookmarks"))
507 		m_xCfg->getByName(s_sHelpBookmarks) >>= xListAccess;
508 
509 	if (xListAccess.is())
510 	{
511 		xListAccess->getByName(s_sItemList)  >>= xItemList;
512 		xListAccess->getByName(s_sOrderList) >>= xOrderList;
513 
514 		css::uno::Sequence< ::rtl::OUString > sItemList  = xItemList->getElementNames();
515 		css::uno::Sequence< ::rtl::OUString > sOrderList = xOrderList->getElementNames();
516 		if (sItemList.getLength()!=0 || sOrderList.getLength()!=0)
517 			bRet = sal_False;
518 	}
519 
520 	return bRet;
521 }
522 
523 //=============================================================================
524 // append a item: use configuration API (not ConfigItem!) to verify the results within XML !
525 void HistoryOptTest::impl_appendItem(const ::rtl::OUString& sList)
526 {//to do...
527 }
528 
529 //=============================================================================
530 // test SvtHistoryOptions::GetSize()
531 void HistoryOptTest::impl_checkGetSize(const ::rtl::OUString& sList)
532 {
533 	css::uno::Reference< css::beans::XPropertySet > xSet(m_xCommonXCU, css::uno::UNO_QUERY);
534 
535 	sal_uInt32 nSize  = 0;
536 	sal_uInt32 nSize_ = 0;
537 
538 	if (sList.equalsAscii("PickList"))
539 	{
540 		nSize  = aHistoryOpt.GetSize(ePICKLIST);
541 
542 		xSet->setPropertyValue(s_sPickListSize, css::uno::makeAny(nSize+1));
543 		::comphelper::ConfigurationHelper::flush(m_xCommonXCU);
544 
545 		nSize_ = aHistoryOpt.GetSize(ePICKLIST);
546 		if (nSize_ == nSize)
547 			throw css::uno::RuntimeException(
548 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GetSize(ePICKLIST) error!")), 0);
549 	}
550 
551 	else if (sList.equalsAscii("URLHistory"))
552 	{
553 		nSize  = aHistoryOpt.GetSize(eHISTORY);
554 
555 		xSet->setPropertyValue(s_sURLHistorySize, css::uno::makeAny(nSize+1));
556 		::comphelper::ConfigurationHelper::flush(m_xCommonXCU);
557 
558 		nSize_ = aHistoryOpt.GetSize(eHISTORY);
559 
560 		if (nSize_ == nSize)
561 			throw css::uno::RuntimeException(
562 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GetSize(eHISTORY) error!")), 0);
563 	}
564 
565 	else if (sList.equalsAscii("HelpBookmarks"))
566 	{
567 		nSize  = aHistoryOpt.GetSize(eHELPBOOKMARKS);
568 
569 		xSet->setPropertyValue(s_sHelpBookmarksSize, css::uno::makeAny(nSize+1));
570 		::comphelper::ConfigurationHelper::flush(m_xCommonXCU);
571 
572 		nSize_ = aHistoryOpt.GetSize(eHELPBOOKMARKS);
573 
574 		if (nSize_ == nSize)
575 			throw css::uno::RuntimeException(
576 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GetSize(eHELPBOOKMARKS) error!")), 0);
577 	}
578 }
579 
580 //=============================================================================
581 // test SvtHistoryOptions::SetSize()
582 void HistoryOptTest::impl_checkSetSize(const ::rtl::OUString& sList)
583 {
584 	css::uno::Reference< css::beans::XPropertySet > xSet(m_xCommonXCU, css::uno::UNO_QUERY);
585 
586 	sal_uInt32 nSize  = 0;
587 	sal_uInt32 nSize_ = 0;
588 
589 	if (sList.equalsAscii("PickList"))
590 	{
591 		xSet->getPropertyValue(s_sPickListSize) >>= nSize;
592 		aHistoryOpt.SetSize(ePICKLIST, (nSize+1));
593 		xSet->getPropertyValue(s_sPickListSize) >>= nSize_;
594 
595 		if (nSize_ == nSize) //old config item will throw error
596 			throw css::uno::RuntimeException(
597 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SetSize(ePICKLIST) error!")), 0);
598 	}
599 
600 	else if (sList.equalsAscii("URLHistory"))
601 	{
602 		xSet->getPropertyValue(s_sURLHistorySize) >>= nSize;
603 		aHistoryOpt.SetSize(eHISTORY, (nSize+1));
604 		xSet->getPropertyValue(s_sURLHistorySize) >>= nSize_;
605 
606 		if (nSize_ == nSize) //old config item will throw error
607 			throw css::uno::RuntimeException(
608 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SetSize(eHISTORY) error!")), 0);
609 	}
610 
611 	else if (sList.equalsAscii("HelpBookmarks"))
612 	{
613 		xSet->getPropertyValue(s_sHelpBookmarksSize) >>= nSize;
614 		aHistoryOpt.SetSize(eHELPBOOKMARKS, (nSize+1));
615 		xSet->getPropertyValue(s_sHelpBookmarksSize) >>= nSize_;
616 
617 		if (nSize_ == nSize) //old config item will throw error
618 			throw css::uno::RuntimeException(
619 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SetSize(eHELPBOOKMARKS) error!")), 0);
620 	}
621 }
622 
623 //=============================================================================
624 // test SvtHistoryOptions::Clear()
625 void HistoryOptTest::impl_checkClear(const ::rtl::OUString& sList)
626 {
627 	if (sList.equalsAscii("PickList"))
628 	{
629 		aHistoryOpt.Clear(ePICKLIST);
630 		if ( !impl_isListEmpty(s_sPickList) )
631 			throw css::uno::RuntimeException(
632 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Clear(ePICKLIST) error!")), 0);
633 	}
634 
635 	else if (sList.equalsAscii("URLHistory"))
636 	{
637 		aHistoryOpt.Clear(eHISTORY);
638 		if ( !impl_isListEmpty(s_sURLHistory) )
639 			throw css::uno::RuntimeException(
640 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Clear(eHISTORY) error!")), 0);
641 	}
642 
643 	else if (sList.equalsAscii("HelpBookmarks"))
644 	{
645 		aHistoryOpt.Clear(eHELPBOOKMARKS);
646 		if ( !impl_isListEmpty(s_sHelpBookmarks) )
647 			throw css::uno::RuntimeException(
648 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Clear(eHELPBOOKMARKS) error!")), 0);
649 	}
650 }
651 
652 //=============================================================================
653 // test SvtHistoryOptions::GetList()
654 void HistoryOptTest::impl_checkGetList(const ::rtl::OUString& sList)
655 {
656 	if (sList.equalsAscii("PickList"))
657 	{
658 		impl_clearList(s_sPickList);
659 		aHistoryOpt.AppendItem( ePICKLIST  ,
660 			::rtl::OUString::createFromAscii("file:///c/test1"),
661 			::rtl::OUString::createFromAscii(""),
662 			::rtl::OUString::createFromAscii(""),
663 			::rtl::OUString::createFromAscii("") );
664 		css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > aHistoryList = aHistoryOpt.GetList( ePICKLIST );
665 
666 		if ( aHistoryList.getLength()==0 )
667 			throw css::uno::RuntimeException(
668 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GetList(ePICKLIST) error!")), 0);
669 	}
670 
671 	else if (sList.equalsAscii("URLHistory"))
672 	{
673 		impl_clearList(s_sURLHistory);
674 		aHistoryOpt.AppendItem( eHISTORY  ,
675 			::rtl::OUString::createFromAscii("file:///c/test1"),
676 			::rtl::OUString::createFromAscii(""),
677 			::rtl::OUString::createFromAscii(""),
678 			::rtl::OUString::createFromAscii("") );
679 		css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > aHistoryList = aHistoryOpt.GetList( eHISTORY );
680 
681 		if ( aHistoryList.getLength()==0 )
682 			throw css::uno::RuntimeException(
683 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GetList(eHISTORY) error!")), 0);
684 	}
685 
686 	else if (sList.equalsAscii("HelpBookmarks"))
687 	{
688 		impl_clearList(s_sHelpBookmarks);
689 		aHistoryOpt.AppendItem( eHELPBOOKMARKS  ,
690 			::rtl::OUString::createFromAscii("file:///c/test1"),
691 			::rtl::OUString::createFromAscii(""),
692 			::rtl::OUString::createFromAscii(""),
693 			::rtl::OUString::createFromAscii("") );
694 		css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > aHistoryList = aHistoryOpt.GetList( eHELPBOOKMARKS );
695 
696 		if ( aHistoryList.getLength()==0 )
697 			throw css::uno::RuntimeException(
698 			::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GetList(eHELPBOOKMARKS) error!")), 0);
699 	}
700 }
701 
702 void HistoryOptTest::impl_checkAppendItem(const ::rtl::OUString& sList)
703 {
704 	if (sList.equalsAscii("PickList"))
705 	{
706 		impl_clearList(s_sPickList);
707 		sal_Int32 nListSize = aHistoryOpt.GetSize(ePICKLIST);
708 
709 		for (sal_Int32 i=0; i<nListSize; ++i)
710 			aHistoryOpt.AppendItem( ePICKLIST  ,
711 			::rtl::OUString::valueOf(i),
712 			::rtl::OUString::createFromAscii(""),
713 			::rtl::OUString::createFromAscii(""),
714 			::rtl::OUString::createFromAscii("") );
715 
716 		aHistoryOpt.AppendItem( ePICKLIST  ,
717 			::rtl::OUString::valueOf(nListSize),
718 			::rtl::OUString::createFromAscii(""),
719 			::rtl::OUString::createFromAscii(""),
720 			::rtl::OUString::createFromAscii("") );
721 	}
722 
723 	else if (sList.equalsAscii("URLHistory"))
724 	{
725 		impl_clearList(s_sURLHistory);
726 		sal_Int32 nListSize = aHistoryOpt.GetSize(eHISTORY);
727 
728 		for (sal_Int32 i=0; i<nListSize; ++i)
729 			aHistoryOpt.AppendItem( eHISTORY  ,
730 			::rtl::OUString::valueOf(i),
731 			::rtl::OUString::createFromAscii(""),
732 			::rtl::OUString::createFromAscii(""),
733 			::rtl::OUString::createFromAscii("") );
734 
735 		aHistoryOpt.AppendItem( eHISTORY  ,
736 			::rtl::OUString::valueOf(nListSize),
737 			::rtl::OUString::createFromAscii(""),
738 			::rtl::OUString::createFromAscii(""),
739 			::rtl::OUString::createFromAscii("") );
740 	}
741 
742 	else if (sList.equalsAscii("HelpBookmarks"))
743 	{
744 		//impl_clearList(s_sHelpBookmarks);
745 		//sal_Int32 nListSize = aHistoryOpt.GetSize(eHELPBOOKMARKS);
746 
747 		//for (sal_Int32 i=0; i<nListSize; ++i)
748 		//	aHistoryOpt.AppendItem( eHELPBOOKMARKS  ,
749 		//	::rtl::OUString::valueOf(i),
750 		//	::rtl::OUString::createFromAscii(""),
751 		//	::rtl::OUString::createFromAscii(""),
752 		//	::rtl::OUString::createFromAscii("") );
753 
754 		//aHistoryOpt.AppendItem( eHELPBOOKMARKS  ,
755 		//	::rtl::OUString::valueOf(nListSize),
756 		//	::rtl::OUString::createFromAscii(""),
757 		//	::rtl::OUString::createFromAscii(""),
758 		//	::rtl::OUString::createFromAscii("") );
759 	}
760 }
761 
762 //=============================================================================
763 void HistoryOptTest::impl_checkPicklist()
764 {
765 	impl_checkGetSize(s_sPickList);
766 	impl_checkSetSize(s_sPickList);
767 
768 	impl_checkClear(s_sPickList);
769 	impl_checkGetList(s_sPickList);
770 	impl_checkAppendItem(s_sPickList);
771 }
772 
773 //=============================================================================
774 void HistoryOptTest::impl_checkURLHistory()
775 {
776 	impl_checkGetSize(s_sURLHistory);
777 	impl_checkSetSize(s_sURLHistory);
778 
779 	impl_checkClear(s_sURLHistory);
780 	impl_checkGetList(s_sURLHistory);
781 	impl_checkAppendItem(s_sURLHistory);
782 }
783 
784 //=============================================================================
785 void HistoryOptTest::impl_checkHelpBookmarks()
786 {
787 	impl_checkGetSize(s_sHelpBookmarks);
788 	impl_checkSetSize(s_sHelpBookmarks);
789 
790 	impl_checkClear(s_sHelpBookmarks);
791 	impl_checkGetList(s_sHelpBookmarks);
792 	impl_checkAppendItem(s_sHelpBookmarks);
793 }
794 */
795