ptr2ptr_tests.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:14k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "./map_spec_tests.h"
  36. // #include "hxmap.h"
  37. #include "chxmapptrtoptr.h"
  38. #include "hx_ut_debug.h"
  39. #include "./hxlist.h"
  40. #include "./kv_store.h"
  41. #include "./find_match.h"
  42. template<>
  43. class MapSpecificTests<CHXMapPtrToPtr>
  44. {
  45. public:
  46.     bool operator()();
  47.     
  48. private:
  49.     bool TestIterator();
  50.     bool TestIterator2();
  51.     bool TestGetStartPosition();
  52.     bool TestGetNextAssoc();
  53.     bool TestLookup();
  54.     bool TestRemove();
  55.     POSITION PredictRemovePosition(CHXMapPtrToPtr& map, void* key);
  56. };
  57. bool MapSpecificTests<CHXMapPtrToPtr>::operator() ()
  58. {
  59.     bool ret = (TestIterator() &&
  60. TestIterator2() &&
  61. TestGetStartPosition() &&
  62. TestGetNextAssoc() &&
  63. TestLookup() &&
  64. TestRemove());
  65.     DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr> : %dn",
  66.        ret));
  67.     return ret;
  68. }
  69. bool MapSpecificTests<CHXMapPtrToPtr>::TestIterator()
  70. {
  71.     bool ret = true;
  72.     CHXMapPtrToPtr map;
  73.     KeyValueStore<void*, void*> store;
  74.     for (int i = 0; i < 2000; i++)
  75. store.Create(i);
  76.     for (int j = 0; j < store.GetCount(); j++)
  77. map.SetAt(store.GetKey(j), store.GetValue(j));
  78.     CHXMapPtrToPtr::Iterator itr = map.Begin();
  79.     HLXList<int> matchList;
  80.     for (; ret && (itr != map.End()); ++itr)
  81.     {
  82. int index = 0;
  83. if (FindMatch<void*, void*>()(store, itr.get_key(), *itr, index))
  84. {
  85.     if (!matchList.Find(index))
  86. matchList.AddTail(index);
  87.     else
  88.             {
  89. ret = false;
  90.                 DPRINTF (D_ERROR,
  91.                          ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator() : "
  92.                           "got duplicate key %pn",
  93.                           itr.get_key()));
  94.             }
  95. }
  96. else
  97.         {
  98.     ret = false;
  99.             DPRINTF (D_ERROR,
  100.                      ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator() : "
  101.                       "got unknown key %pn",
  102.                       itr.get_key()));
  103.         }
  104.     }
  105.     if (ret)
  106.     {
  107. ret = (matchList.GetCount() == map.GetCount());
  108.         if (!ret)
  109.         {
  110.             DPRINTF (D_ERROR,
  111.                      ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator() : "
  112.                       "items visited count doesn't match map item count "
  113.                       "(%ld vs %ld)n",
  114.                       matchList.GetCount(), map.GetCount()));
  115.         }
  116.     }
  117. #ifdef DO_MAP_DUMP
  118.     map.Dump();
  119. #endif /* DO_MAP_DUMP */
  120.     if (ret)
  121.     {
  122.         CHXMapPtrToPtr::Iterator itr = map.Find(store.GetKey(4));
  123.         if (itr == map.End())
  124.         {
  125.             ret = false;
  126.             DPRINTF (D_ERROR,
  127.                      ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator() : "
  128.                       "couldn't Find() 4th key (%p)n",
  129.                       store.GetKey(4)));
  130.         }
  131.         else if (*itr != store.GetValue(4) || itr.get_key() != store.GetKey(4))
  132.         {
  133.             ret = false;
  134.             DPRINTF (D_ERROR,
  135.                      ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator() : "
  136.                       "Find() 4th key doesn't match (%p=%p vs %p=%p)n",
  137.                       store.GetKey(4), store.GetValue(4),
  138.                       itr.get_key(), *itr));
  139.         }
  140.         // FYI: Erase() method isn't implemented in older CHXMap (it's
  141.         //      declared in the class definition, but the method isn't
  142.         //      implemented, so this leads to an undef'd symbol
  143.         //      reference).
  144.         if (ret)
  145.         {
  146.             map.Erase (itr);
  147.             ret = (matchList.GetCount() == (map.GetCount() + 1));
  148.             if (ret)
  149.             {
  150.                 itr = map.Find(store.GetKey(4));
  151.                 if (itr != map.End())
  152.                 {
  153.                     DPRINTF (D_ERROR,
  154.                              ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator() : "
  155.                               "Erase() 4th key left it in mapn"));
  156.                     ret = false;
  157.                     
  158.                 }
  159.             }
  160.             else
  161.             {
  162.                 DPRINTF (D_ERROR,
  163.                          ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator() : "
  164.                           "Erase() 4th key decrease map count by onen"));
  165.             }
  166.         }
  167.     }
  168.     return ret;
  169. }
  170. bool MapSpecificTests<CHXMapPtrToPtr>::TestIterator2()
  171. {
  172.     // This test is basically the same as the first part of
  173.     // TestIterator() except it uses the default constructor
  174.     // instead of the copy constructor.
  175.     bool ret = true;
  176.     CHXMapPtrToPtr map;
  177.     KeyValueStore<void*, void*> store;
  178.     for (int i = 0; i < 2000; i++)
  179. store.Create(i);
  180.     for (int j = 0; j < store.GetCount(); j++)
  181. map.SetAt(store.GetKey(j), store.GetValue(j));
  182.     CHXMapPtrToPtr::Iterator itr; // Use default constructor
  183.     HLXList<int> matchList;
  184.     for (itr = map.Begin(); ret && (itr != map.End()); ++itr)
  185.     {
  186. int index = 0;
  187. if (FindMatch<void*, void*>()(store, itr.get_key(), *itr, index))
  188. {
  189.     if (!matchList.Find(index))
  190. matchList.AddTail(index);
  191.     else
  192.             {
  193. ret = false;
  194.                 DPRINTF (D_ERROR,
  195.                          ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator2() : "
  196.                           "got duplicate key %pn",
  197.                           itr.get_key()));
  198.             }
  199. }
  200. else
  201.         {
  202.     ret = false;
  203.             DPRINTF (D_ERROR,
  204.                      ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator2() : "
  205.                       "got unknown key %pn",
  206.                       itr.get_key()));
  207.         }
  208.     }
  209.     if (ret)
  210.     {
  211. ret = (matchList.GetCount() == map.GetCount());
  212.         if (!ret)
  213.         {
  214.             DPRINTF (D_ERROR,
  215.                      ("MapSpecificTests<CHXMapPtrToPtr>::TestIterator2() : "
  216.                       "items visited count doesn't match map item count "
  217.                       "(%ld vs %ld)n",
  218.                       matchList.GetCount(), map.GetCount()));
  219.         }
  220.     }
  221. #ifdef DO_MAP_DUMP
  222.     map.Dump();
  223. #endif /* DO_MAP_DUMP */
  224.     return ret;
  225. }
  226. bool MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition()
  227. {
  228.     bool ret = true;
  229.     CHXMapPtrToPtr map;
  230.     POSITION pos = map.GetStartPosition();
  231.     if (pos)
  232.     {
  233. DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : pos not NULL for an empty mapn"));
  234.         ret = false;
  235.     }
  236.     KeyValueStore<void*, void*> store;
  237.     store.Create(0);
  238.     store.Create(1);
  239.     if (ret)
  240.     {
  241. map.SetAt(store.GetKey(0), store.GetValue(0));
  242. pos = map.GetStartPosition();
  243.         if (!pos)
  244. {
  245.     DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : pos NULL for a one-item mapn"));
  246.             ret = false;
  247. }
  248.     }
  249.     if (ret)
  250.     {
  251. map.SetAt(store.GetKey(1), store.GetValue(1));
  252. pos = map.GetStartPosition();
  253.         if (!pos)
  254. {
  255.     DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : pos NULL for a two-item mapn"));
  256.             ret = false;
  257. }
  258.     }
  259.     void* key;
  260.     void* value;
  261.     if (ret)
  262.     {
  263.         map.GetNextAssoc(pos, key, value);
  264.         if (! map.RemoveKey(key))
  265.         {
  266.             DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : RemoveKey() of start key failed.n"));
  267.             ret = false;
  268.         }
  269.     }
  270.     if (ret)
  271.     {
  272.         pos = map.GetStartPosition();
  273.         if (!pos)
  274.         {
  275.             DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : pos NULL for a one-item map(down from 2)n"));
  276.             ret = false;
  277.         }
  278.     }
  279.     void* key2;
  280.     void* value2;
  281.     if (ret)
  282.     {
  283.         // We should be on the one (and now only) item
  284.         map.GetNextAssoc(pos, key2, value2);
  285.         if (pos)
  286.         {
  287.             DPRINTF(D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : pos non-NULL for 2nd item in a one-item mapn"));
  288.             ret = false;
  289.         }
  290.         else if (key == key2)
  291.         {
  292.             DPRINTF(D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : start key same as now removed keyn"));
  293.             ret = false;
  294.         }
  295.     }
  296.     if (ret)
  297.     {
  298.         pos = map.GetStartPosition();
  299.         if (!pos)
  300.         {
  301.             DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : pos NULL for a one-item map (#2)n"));
  302.             ret = false;
  303.         }
  304.     }
  305.     if (ret)
  306.     {
  307.         map.RemoveKey(key2);
  308.         pos = map.GetStartPosition();
  309.         if (pos)
  310.         {
  311.             DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetStartPosition() : pos non-NULL for an empty map(down from 2)n"));
  312.             ret = false;
  313.         }
  314.     }
  315.     return ret;
  316. }
  317. bool MapSpecificTests<CHXMapPtrToPtr>::TestGetNextAssoc()
  318. {
  319.     bool ret = true;
  320.     CHXMapPtrToPtr map;
  321.     KeyValueStore<void*, void*> store;
  322.     for (int i = 0; i < 10; i++)
  323. store.Create(i);
  324.     for (int j = 0; j < store.GetCount(); j++)
  325. map.SetAt(store.GetKey(j), store.GetValue(j));
  326.     POSITION pos = map.GetStartPosition();
  327.     HLXList<int> matchList;
  328.     while (ret && pos)
  329.     {
  330. void* key = 0;
  331. void* value = 0;
  332. int index = 0;
  333. map.GetNextAssoc(pos, key, value);
  334. if (!FindMatch<void*, void*>()(store, key, value, index))
  335. {
  336.     DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetNextAssoc() : failed to find the key/value pairn"));
  337.     
  338.     ret = false;
  339. }
  340. else if (matchList.Find(index))
  341. {
  342.     DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetNextAssoc() : Item %d already visitedn", index));
  343.     ret = false;
  344. }
  345. else
  346.         {
  347.     matchList.AddTail(index);
  348.         }
  349.     }
  350.     if (ret && (matchList.GetCount() != map.GetCount()))
  351.     {
  352. DPRINTF (D_ERROR, ("MapSpecificTests<CHXMapPtrToPtr>::TestGetNextAssoc() : items visited count doesn't match map item count (%ld vs %ld)n",
  353.                            matchList.GetCount(), map.GetCount()));
  354. ret = false;
  355.     }
  356.     
  357.     return ret;
  358. }
  359. bool MapSpecificTests<CHXMapPtrToPtr>::TestLookup()
  360. {
  361.     bool ret = true;
  362.     CHXMapPtrToPtr map;
  363.     KeyValueStore<void*, void*> store;
  364.     for (int i = 0; i < 10; i++)
  365. store.Create(i);
  366.     for (int j = 0; j < store.GetCount(); j++)
  367. map.SetAt(store.GetKey(j), store.GetValue(j));
  368.     
  369.     for (int k = 0; ret && (k < store.GetCount()); k++)
  370.     {
  371. POSITION pos = map.Lookup(store.GetKey(k));
  372. void* key = 0;
  373. void* value = 0;
  374. int index = -1;
  375.         map.GetNextAssoc(pos, key, value);
  376. if (FindMatch<void*, void*>()(store, key, value, index))
  377. {
  378.     if (index != k)
  379.     {
  380. DPRINTF (D_ERROR,("MapSpecificTests<CHXMapPtrToPtr>::TestLookup() : got %d expected %dn",
  381.   index,
  382.   k));
  383. ret = false;
  384.     }
  385. }
  386. else
  387. {
  388.     DPRINTF (D_ERROR,("MapSpecificTests<CHXMapPtrToPtr>::TestLookup() : failed to find key/value pairn"));
  389.     ret = false;
  390. }
  391.     }
  392.     return ret;
  393. }
  394. bool MapSpecificTests<CHXMapPtrToPtr>::TestRemove()
  395. {
  396.     bool ret = true;
  397.     CHXMapPtrToPtr map;
  398.     KeyValueStore<void*, void*> store;
  399.     for (int i = 0; i < 10; i++)
  400. store.Create(i);
  401.     for (int j = 0; j < store.GetCount(); j++)
  402. map.SetAt(store.GetKey(j), store.GetValue(j));
  403.     
  404.     for (int k = 0; ret && (k < store.GetCount()); k++)
  405.     {
  406. int expectedCount = store.GetCount() - k;
  407. POSITION resultPos = 0;
  408. POSITION expectedPos = 0;
  409. if (map.GetCount() != expectedCount)
  410. {
  411.     DPRINTF(D_ERROR,("MapSpecificTests<CHXMapPtrToPtr>::TestRemove() : %d item count %d expected %dn",
  412.      k,
  413.      map.GetCount(),
  414.      expectedCount));
  415.     ret = false;
  416. }
  417. else
  418. {
  419.     expectedPos = PredictRemovePosition(map, store.GetKey(k));
  420.     resultPos = map.Remove(store.GetKey(k));
  421.     if (resultPos != expectedPos)
  422.     {
  423. DPRINTF(D_ERROR,("MapSpecificTests<CHXMapPtrToPtr>::TestRemove() : %d got pos %p expected %pn",
  424.  k,
  425.  resultPos,
  426.  expectedPos));
  427. ret = false;
  428.     }
  429. }
  430.     }
  431.     return ret;
  432. }
  433. POSITION MapSpecificTests<CHXMapPtrToPtr>::PredictRemovePosition(CHXMapPtrToPtr& map, void* key)
  434. {
  435.     POSITION ret = map.GetStartPosition();
  436.     bool foundIt = false;
  437.     while (ret && !foundIt)
  438.     {
  439. void* pKey = 0;
  440. void* pValue = 0;
  441. map.GetNextAssoc(ret, pKey, pValue);
  442. if (key == pKey)
  443.     foundIt = true;
  444.     }
  445.     return ret;
  446. }