void CPersistKitList::UnitTest()
{
  CPersistKitList kitList;
  wxString sError;
  if(!kitList.Load())
  {
    sError.Append(_T("CPersistKitList::Load() failed\n"));
  }
  else
  {
    const wxArrayString *psKitArray;
    const wxArrayString *psArray;
    psKitArray = &kitList.GetArray();
    size_t nCount = psKitArray->GetCount();
#define PP12 _T("PowerPlex 1.2")
#define PP18D _T("PowerPlex 18D")
#define SGM _T("SGM Plus")
#define SEFILER _T("SEfilerPlus")
#define NGM _T("NGMSElect")
#define PP21 _T("PowerPlex 21")
    struct
    {
      size_t n; // number of loci
      const wxChar *psName;
    } LIST[] = 
    {
      {7,  _T("Cofiler")},
      {16, _T("Identifiler Less ILS250")},
      {16, _T("IdentifilerPlus Less ILS250")},
      {16, _T("IdentifilerPlus")},
      {16, _T("Identifiler")},
      {9,  PP12},
      {18,  PP18D},
      {16, _T("PowerPlex 16")},
      {11, _T("PowerPlex Y")},
      {16, _T("Yfiler")},
      {12, SEFILER},
      {11, SGM},
      {10, _T("ProfilerPlus")},
      {17, NGM},
      {21,PP21}
    };
    size_t N_LIST = sizeof(LIST) / sizeof(LIST[0]);
    if(nCount != N_LIST)
    {
      sError.Append(wxString::Format(
        _T("\nNumber of kits is %d, expected %d"),
        (int)nCount, (int)N_LIST ));
    }
    map<wxString,size_t> kitLocusCount;
    map<wxString,size_t>::iterator itrKL;
    size_t i;
    for(i = 0; i < N_LIST; i++)
    {
      kitLocusCount.insert(
        map<wxString,size_t>::value_type(
          wxString(LIST[i].psName),LIST[i].n));
    }

    for(i = 0; i < nCount; i++)
    {
      // verify LS count

      const wxString &sItem = psKitArray->Item(i);
      psArray = kitList.GetLsArray(sItem);
      if(psArray == NULL)
      {
        sError.Append(_T("\nCannot find ILS for kit: "));
        sError.Append(sItem);
      }
      else
      {
        size_t nExpected = 4;
        if(sItem == PP12 || sItem == PP18D || sItem == NGM || sItem == SEFILER || sItem == PP21)
        { nExpected = 1;
        }
        else if(sItem == SGM)
        { nExpected = 5;
        }
        else if(
          sItem.StartsWith(_T("Identifiler")) &&
          !sItem.Contains(_T("250"))
          )
        { nExpected = 5;
        }

        if(psArray->GetCount() != nExpected)
        {
          sError.Append(
            _T("\nLS count for kit: "));
          sError.Append(sItem);
          sError.Append(wxString::Format(
            _T(", is %d, expected %d"),
            (int)psArray->GetCount(),(int)nExpected));
        }
      }
        
      itrKL = kitLocusCount.find(sItem);
      const CLocusNameList *pList = kitList.GetLocusNameList(sItem);
      if(pList == NULL)
      {
        sError.Append(_T("\nCannot find loci for kit: "));
        sError.Append(sItem);
      }
      if(itrKL == kitLocusCount.end())
      {
        sError.Append(_T("\nUnknown kit name: "));
        sError.Append(sItem);
      }
      else if( (pList != NULL) && (pList->size() != itrKL->second) )
      {
        sError.Append(_T("\nLocus count for kit: "));
        sError.Append(sItem);
        sError.Append(wxString::Format(
          _T(", is %d, expected %d"),
          (int)pList->size(),(int)itrKL->second));
      }
    }
  }
  wxASSERT_MSG(sError.IsEmpty(),sError);
#undef PP12
}