string_test.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:65k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: string_test.cpp,v 1.8.42.3 2004/07/09 01:45:55 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "./string_test.h"
  50. #include "hx_ut_debug.h"
  51. #include "ut_param_util.h"
  52. #include "./param_util.h"
  53. HLXStringTest::HLXStringTest() :
  54.     m_pA(0),
  55.     m_pB(0),
  56.     m_ANthFieldState(0),
  57.     m_BNthFieldState(0),
  58.     m_pABuffer(0),
  59.     m_pBBuffer(0)
  60. {}
  61. HLXStringTest::~HLXStringTest()
  62. {
  63.     delete m_pA;
  64.     delete m_pB;
  65. }
  66. const char* HLXStringTest::DefaultCommandLine() const
  67. {
  68.     return "tstring tstring.in";
  69. }
  70.     
  71. void HLXStringTest::GetCommandInfo(UTVector<HLXUnitTestCmdInfo*>& cmds)
  72. {
  73.     cmds.Resize(65);
  74.     int i = 0;
  75.     HX_ASSERT(i < cmds.Nelements());
  76.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  77.         this, 
  78.         "CHXString()",
  79.         &HLXStringTest::HandleConstruct1Cmd,
  80.         2);
  81.     HX_ASSERT(i < cmds.Nelements());
  82.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  83.         this, 
  84.         "CHXString(CHXString)",
  85.         &HLXStringTest::HandleConstruct2Cmd,
  86.         3);
  87.     HX_ASSERT(i < cmds.Nelements());
  88.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  89.         this, 
  90.         "CHXString(char,int)",
  91.         &HLXStringTest::HandleConstruct3Cmd,
  92.         4);
  93.     HX_ASSERT(i < cmds.Nelements());
  94.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  95.         this, 
  96.         "CHXString(char*)",
  97.         &HLXStringTest::HandleConstruct4Cmd,
  98.         3);
  99.     HX_ASSERT(i < cmds.Nelements());
  100.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  101.         this, 
  102.         "CHXString(char*,int)",
  103.         &HLXStringTest::HandleConstruct5Cmd,
  104.         4);
  105.     HX_ASSERT(i < cmds.Nelements());
  106.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  107.         this, 
  108.         "CHXString(uchar*)",
  109.         &HLXStringTest::HandleConstruct6Cmd,
  110.         3);
  111.     HX_ASSERT(i < cmds.Nelements());
  112.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  113.         this, 
  114.         "GetLength",
  115.         &HLXStringTest::HandleGetLengthCmd,
  116.         3);
  117.     HX_ASSERT(i < cmds.Nelements());
  118.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  119.         this, 
  120.         "IsEmpty",
  121.         &HLXStringTest::HandleIsEmptyCmd,
  122.         3);
  123.     HX_ASSERT(i < cmds.Nelements());
  124.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  125.         this, 
  126.         "Empty",
  127.         &HLXStringTest::HandleEmptyCmd,
  128.         2);
  129.     HX_ASSERT(i < cmds.Nelements());
  130.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  131.         this, 
  132.         "(char*)",
  133.         &HLXStringTest::HandleCharStarOpCmd,
  134.         3,999);                 // (char*) A|B <expected> [... <alternate returns>]
  135.     HX_ASSERT(i < cmds.Nelements());
  136.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  137.         this,
  138.         "GetAt",
  139.         &HLXStringTest::HandleGetAtCmd,
  140.         4);                     // GetAt A|B <index> <expected char return>
  141.     HX_ASSERT(i < cmds.Nelements());
  142.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  143.         this,
  144.         "SetAt",
  145.         &HLXStringTest::HandleSetAtCmd,
  146.         4);                     // SetAt A|B <index> <char>
  147.     HX_ASSERT(i < cmds.Nelements());
  148.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  149.         this,
  150.         "[]",
  151.         &HLXStringTest::HandleSubscriptCmd,
  152.         4);                     // [] A|B <index> <expected char return>
  153.     // XXXSAB: don't forget to verify that return value ref is same as A|B
  154.     //         on all these assignment ops.
  155.     HX_ASSERT(i < cmds.Nelements());
  156.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  157.         this,
  158.         "=CHXString",
  159.         &HLXStringTest::HandleAssignOp1Cmd,
  160.         3);                     // =CHXString A|B <from string: A|B>
  161.     HX_ASSERT(i < cmds.Nelements());
  162.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  163.         this,
  164.         "=char",
  165.         &HLXStringTest::HandleAssignOp2Cmd,
  166.         3);                     // =char A|B <from char>
  167.     HX_ASSERT(i < cmds.Nelements());
  168.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  169.         this,
  170.         "=char*",
  171.         &HLXStringTest::HandleAssignOp3Cmd,
  172.         3);                     // =char* A|B <from string>
  173.     HX_ASSERT(i < cmds.Nelements());
  174.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  175.         this,
  176.         "=uchar*",
  177.         &HLXStringTest::HandleAssignOp4Cmd,
  178.         3);                     // =uchar* A|B <from string>
  179.     HX_ASSERT(i < cmds.Nelements());
  180.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  181.         this,
  182.         "+=CHXString",
  183.         &HLXStringTest::HandleAppendTo1Cmd,
  184.         3);                     // +=CHXString A|B <from string: A|B>
  185.     HX_ASSERT(i < cmds.Nelements());
  186.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  187.         this,
  188.         "+=char",
  189.         &HLXStringTest::HandleAppendTo2Cmd,
  190.         3);                     // +=char A|B <from char>
  191.     HX_ASSERT(i < cmds.Nelements());
  192.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  193.         this,
  194.         "+=char*",
  195.         &HLXStringTest::HandleAppendTo3Cmd,
  196.         3);                     // +=char* A|B <from string>
  197.     HX_ASSERT(i < cmds.Nelements());
  198.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  199.         this,
  200.         "CHXString+CHXString",
  201.         &HLXStringTest::HandleAdd1Cmd,
  202.         4);                     // CHXString+CHXString A|B A|B <expected string>
  203.     HX_ASSERT(i < cmds.Nelements());
  204.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  205.         this,
  206.         "CHXString+char",
  207.         &HLXStringTest::HandleAdd2Cmd,
  208.         4);                     // CHXString+char A|B <char> <expected string>
  209.     HX_ASSERT(i < cmds.Nelements());
  210.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  211.         this,
  212.         "char+CHXString",
  213.         &HLXStringTest::HandleAdd3Cmd,
  214.         4);                     // char+CHXString <char> A|B <expected string>
  215.     HX_ASSERT(i < cmds.Nelements());
  216.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  217.         this,
  218.         "CHXString+char*",
  219.         &HLXStringTest::HandleAdd4Cmd,
  220.         4);                     // CHXString+char* A|B <string> <expected string>
  221.     HX_ASSERT(i < cmds.Nelements());
  222.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  223.         this,
  224.         "char*+CHXString",
  225.         &HLXStringTest::HandleAdd5Cmd,
  226.         4);                     // char*+CHXString <string> A|B <expected string>
  227.     HX_ASSERT(i < cmds.Nelements());
  228.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  229.         this,
  230.         "Center",
  231.         &HLXStringTest::HandleCenterCmd,
  232.         3);                     // Center A|B <length>
  233.     HX_ASSERT(i < cmds.Nelements());
  234.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  235.         this,
  236.         "Compare",
  237.         &HLXStringTest::HandleCompareCmd,
  238.         4);                     // Compare A|B <string> <expected value>
  239.     HX_ASSERT(i < cmds.Nelements());
  240.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  241.         this,
  242.         "CompareNoCase",
  243.         &HLXStringTest::HandleCompareNoCaseCmd,
  244.         4);                     // CompareNoCase A|B <string> <expected value>
  245.     HX_ASSERT(i < cmds.Nelements());
  246.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  247.         this,
  248.         "Mid",
  249.         &HLXStringTest::HandleMidCmd,
  250.         4, 5);                  // Mid A|B <index> [<length>] <expected string>
  251.     HX_ASSERT(i < cmds.Nelements());
  252.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  253.         this,
  254.         "Left",
  255.         &HLXStringTest::HandleLeftCmd,
  256.         4);                     // Left A|B <length> <expected string>
  257.     HX_ASSERT(i < cmds.Nelements());
  258.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  259.         this,
  260.         "Right",
  261.         &HLXStringTest::HandleRightCmd,
  262.         4);                     // Right A|B <length> <expected string>
  263.     HX_ASSERT(i < cmds.Nelements());
  264.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  265.         this,
  266.         "CountFields",
  267.         &HLXStringTest::HandleCountFieldsCmd,
  268.         4);                     // CountFields A|B <delimeter char> <expected value>
  269.     HX_ASSERT(i < cmds.Nelements());
  270.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  271.         this,
  272.         "NthField",
  273.         &HLXStringTest::HandleNthFieldCmd,
  274.         5);                     // NthField A|B <delimeter char> <field index> <expected string>
  275.     HX_ASSERT(i < cmds.Nelements());
  276.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  277.         this,
  278.         "GetNthField",
  279.         &HLXStringTest::HandleGetNthFieldCmd,
  280.         5);                     // GetNthField A|B <delimeter char> <field index> <expected string>
  281.     HX_ASSERT(i < cmds.Nelements());
  282.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  283.         this,
  284.         "ResetNthFieldState",
  285.         &HLXStringTest::HandleResetNthFieldStateCmd,
  286.         2);                     // ResetNthFieldState A|B
  287.     HX_ASSERT(i < cmds.Nelements());
  288.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  289.         this,
  290.         "SpanIncluding",
  291.         &HLXStringTest::HandleSpanIncludingCmd,
  292.         4);                     // SpanIncluding A|B <string> <expected string>
  293.     HX_ASSERT(i < cmds.Nelements());
  294.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  295.         this,
  296.         "SpanExcluding",
  297.         &HLXStringTest::HandleSpanExcludingCmd,
  298.         4);                     // SpanExcluding A|B <string> <expected string>
  299.     HX_ASSERT(i < cmds.Nelements());
  300.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  301.         this,
  302.         "MakeUpper",
  303.         &HLXStringTest::HandleMakeUpperCmd,
  304.         2);                     // MakeUpper A|B
  305.     HX_ASSERT(i < cmds.Nelements());
  306.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  307.         this,
  308.         "MakeLower",
  309.         &HLXStringTest::HandleMakeLowerCmd,
  310.         2);                     // MakeLower A|B
  311.     HX_ASSERT(i < cmds.Nelements());
  312.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  313.         this,
  314.         "TrimRight",
  315.         &HLXStringTest::HandleTrimRightCmd,
  316.         2);                     // TrimRight A|B
  317.     HX_ASSERT(i < cmds.Nelements());
  318.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  319.         this,
  320.         "TrimLeft",
  321.         &HLXStringTest::HandleTrimLeftCmd,
  322.         2);                     // TrimLeft A|B
  323.     HX_ASSERT(i < cmds.Nelements());
  324.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  325.         this,
  326.         "FindChar",
  327.         &HLXStringTest::HandleFind1Cmd,
  328.         4);                     // FindChar A|B <char> <expected value>
  329.     HX_ASSERT(i < cmds.Nelements());
  330.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  331.         this,
  332.         "FindChar*",
  333.         &HLXStringTest::HandleFind2Cmd,
  334.         4);                     // FindChar* A|B <string> <expected value>
  335.     HX_ASSERT(i < cmds.Nelements());
  336.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  337.         this,
  338.         "ReverseFind",
  339.         &HLXStringTest::HandleReverseFindCmd,
  340.         4);                     // ReverseFind A|B <char> <expected value>
  341.     HX_ASSERT(i < cmds.Nelements());
  342.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  343.         this,
  344.         "FindAndReplace",
  345.         &HLXStringTest::HandleFindAndReplaceCmd,
  346.         6);                     // FindAndReplace A|B <search string> <repl string> <repl all bool> <expected value>
  347.     HX_ASSERT(i < cmds.Nelements());
  348.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  349.         this,
  350.         "FormatInt",
  351.         &HLXStringTest::HandleFormatIntCmd,
  352.         4,13);                  // FormatInt A|B <format string> <data1> [... <data10>]
  353.     HX_ASSERT(i < cmds.Nelements());
  354.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  355.         this,
  356.         "FormatLong",
  357.         &HLXStringTest::HandleFormatLongCmd,
  358.         4,13);                  // FormatLong A|B <format string> <data1> [... <data10>]
  359.     HX_ASSERT(i < cmds.Nelements());
  360.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  361.         this,
  362.         "FormatUInt",
  363.         &HLXStringTest::HandleFormatUIntCmd,
  364.         4,13);                  // FormatUInt A|B <format string> <data1> [... <data10>]
  365.     HX_ASSERT(i < cmds.Nelements());
  366.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  367.         this,
  368.         "FormatULong",
  369.         &HLXStringTest::HandleFormatULongCmd,
  370.         4,13);                  // FormatULong A|B <format string> <data1> [... <data10>]
  371.     HX_ASSERT(i < cmds.Nelements());
  372.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  373.         this,
  374.         "FormatChar",
  375.         &HLXStringTest::HandleFormatCharCmd,
  376.         4,13);                  // FormatChar A|B <format string> <data1> [... <data10>]
  377.     HX_ASSERT(i < cmds.Nelements());
  378.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  379.         this,
  380.         "FormatCharStar",
  381.         &HLXStringTest::HandleFormatCharStarCmd,
  382.         4,13);                  // FormatChar* A|B <format string> <data1> [... <data10>]
  383.     HX_ASSERT(i < cmds.Nelements());
  384.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  385.         this,
  386.         "FormatPtr",
  387.         &HLXStringTest::HandleFormatPtrCmd,
  388.         4,13);                  // FormatPtr A|B <format string> <data1> [... <data10>]
  389.     HX_ASSERT(i < cmds.Nelements());
  390.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  391.         this,
  392.         "FormatDouble",
  393.         &HLXStringTest::HandleFormatDoubleCmd,
  394.         4,13);                  // FormatDouble A|B <format string> <data1> [... <data10>]
  395.     HX_ASSERT(i < cmds.Nelements());
  396.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  397.         this,
  398.         "FormatMixed",
  399.         &HLXStringTest::HandleFormatMixedCmd,
  400.         1);                     // FormatMixed
  401.     HX_ASSERT(i < cmds.Nelements());
  402.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  403.         this,
  404.         "AppendULONG",
  405.         &HLXStringTest::HandleAppendULONGCmd,
  406.         3);                     // AppendULONG A|B <ULONG value>
  407.     HX_ASSERT(i < cmds.Nelements());
  408.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  409.         this,
  410.         "AppendEndOfLine",
  411.         &HLXStringTest::HandleAppendEndOfLineCmd,
  412.         2);                     // AppendEndOfLine A|B
  413.     HX_ASSERT(i < cmds.Nelements());
  414.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  415.         this,
  416.         "GetBuffer",
  417.         &HLXStringTest::HandleGetBufferCmd,
  418.         3, 4);                  // GetBuffer A|B <length> [<expected value>]
  419.     HX_ASSERT(i < cmds.Nelements());
  420.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  421.         this,
  422.         "BufferSet",
  423.         &HLXStringTest::HandleBufferSetCmd,
  424.         3, 4);                  // BufferSet A|B [<index>] <string>
  425.     HX_ASSERT(i < cmds.Nelements());
  426.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  427.         this,
  428.         "BufferFill",
  429.         &HLXStringTest::HandleBufferFillCmd,
  430.         4, 5);                  // BufferFill A|B [<index>] <string> <repeat count>
  431.     HX_ASSERT(i < cmds.Nelements());
  432.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  433.         this,
  434.         "BufferEndString",
  435.         &HLXStringTest::HandleBufferEndStringCmd,
  436.         3);                     // BufferEndString A|B <index>
  437.     HX_ASSERT(i < cmds.Nelements());
  438.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  439.         this,
  440.         "GetBufferSetLength",
  441.         &HLXStringTest::HandleGetBufferSetLengthCmd,
  442.         4);                     // GetBufferSetLength A|B <length> <expected value>
  443. #ifdef XXXSAB
  444.     HX_ASSERT(i < cmds.Nelements());
  445.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  446.         this,
  447.         "ReleaseBuffer0",
  448.         &HLXStringTest::HandleReleaseBufferCmd,
  449.         2);                     // ReleaseBuffer0 A|B
  450.     HX_ASSERT(i < cmds.Nelements());
  451.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  452.         this,
  453.         "ReleaseBuffer1",
  454.         &HLXStringTest::HandleReleaseBufferCmd,
  455.         3);                     // ReleaseBuffer1 A|B <length>
  456. #endif /* XXXSAB */
  457.     HX_ASSERT(i < cmds.Nelements());
  458.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  459.         this,
  460.         "ReleaseBuffer",
  461.         &HLXStringTest::HandleReleaseBufferCmd,
  462.         2, 3);                  // ReleaseBuffer A|B [<length>]
  463.     HX_ASSERT(i < cmds.Nelements());
  464.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  465.         this,
  466.         "FreeExtra",
  467.         &HLXStringTest::HandleFreeExtraCmd,
  468.         2);                     // FreeExtra A|B
  469.     HX_ASSERT(i < cmds.Nelements());
  470.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  471.         this,
  472.         "GetAllocLength",
  473.         &HLXStringTest::HandleGetAllocLengthCmd,
  474.         3, 4);                  // GetAllocLength A|B <expected value> [<max expected>]
  475.     HX_ASSERT(i < cmds.Nelements());
  476.     cmds[i++] = new HLXUnitTestCmdInfoDisp<HLXStringTest>(
  477.         this,
  478.         "SetMinBufSize",
  479.         &HLXStringTest::HandleSetMinBufSizeCmd,
  480.         4);                     // SetMinBufSize A|B <new value> <expected value>
  481. }
  482. HLXCmdBasedTest* HLXStringTest::Clone() const
  483. {
  484.     return new HLXStringTest();
  485. }
  486. bool HLXStringTest::HandleConstruct1Cmd(const UTVector<UTString>& info)
  487. {
  488.     SetStringObj(info[1], new CHXString());
  489.     return true;
  490. }
  491. bool HLXStringTest::HandleConstruct2Cmd(const UTVector<UTString>& info)
  492. {
  493.     bool ret = false;
  494.     CHXString* pStr = GetStringObj(info[2]);
  495.     if (!pStr)
  496.     {
  497. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  498.   (const char*)info[2]));
  499.     }
  500.     else
  501.     {
  502. SetStringObj(info[1], new CHXString(*pStr));
  503. ret = true;
  504.     }
  505.     return ret;
  506. }
  507. bool HLXStringTest::HandleConstruct3Cmd(const UTVector<UTString>& info)
  508. {
  509.     bool ret = false;
  510.     char ch;
  511.     int size;
  512.     if (!UTParamUtil::GetChar(info[2], ch) || 
  513. !UTParamUtil::GetInt(info[3], size))
  514.     {
  515. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  516.     }
  517.     else
  518.     {
  519. SetStringObj(info[1], new CHXString(ch, size));
  520. ret = true;
  521.     }
  522.     return ret;
  523. }
  524. bool HLXStringTest::HandleConstruct4Cmd(const UTVector<UTString>& info)
  525. {
  526.     SetStringObj(info[1], new CHXString((const char*)info[2]));
  527.     return true;
  528. }
  529. bool HLXStringTest::HandleConstruct5Cmd(const UTVector<UTString>& info)
  530. {
  531.     bool ret = false;
  532.     int size;
  533.     if (!UTParamUtil::GetInt(info[3], size))
  534.     {
  535. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  536.     }
  537.     else
  538.     {
  539. SetStringObj(info[1], new CHXString((const char*)(info[2]), size));
  540. ret = true;
  541.     }
  542.     return ret;
  543. }
  544. bool HLXStringTest::HandleConstruct6Cmd(const UTVector<UTString>& info)
  545. {
  546.     SetStringObj(info[1], new CHXString((const unsigned char*)(const char*)(info[2])));
  547.     return true;
  548. }
  549. bool HLXStringTest::HandleGetLengthCmd(const UTVector<UTString>& info)
  550. {
  551.     bool ret = false;
  552.     CHXString* pStr = GetStringObj(info[1]);
  553.     int expected = 0;
  554.     if (!pStr)
  555.     {
  556. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  557.   (const char*)info[1]));
  558.     }
  559.     else if (!UTParamUtil::GetInt(info[2], expected))
  560.     {
  561. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  562.     }
  563.     else if ((int)pStr->GetLength() != expected)
  564.     {
  565. DPRINTF (D_ERROR, ("Got %lu expected %dn", 
  566.    (unsigned long)pStr->GetLength(), 
  567.    expected));
  568.     }
  569.     else
  570. ret = true;
  571.     return ret;
  572. }
  573. bool HLXStringTest::HandleIsEmptyCmd(const UTVector<UTString>& info)
  574. {
  575.     bool ret = false;
  576.     CHXString* pStr = GetStringObj(info[1]);
  577.     bool expected = false;
  578.     if (!pStr)
  579.     {
  580. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  581.   (const char*)info[1]));
  582.     }
  583.     else if (!UTParamUtil::GetBool(info[2], expected))
  584.     {
  585. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  586.     }
  587.     else if ((pStr->IsEmpty() == TRUE) != expected)
  588.     {
  589. DPRINTF(D_ERROR, ("Got %d expected %dn", 
  590.   pStr->IsEmpty(),
  591.   expected));
  592.     }
  593.     else
  594. ret = true;
  595.     return ret;
  596. }
  597. bool HLXStringTest::HandleEmptyCmd(const UTVector<UTString>& info)
  598. {
  599.     bool ret = false;
  600.     CHXString* pStr = GetStringObj(info[1]);
  601.     if (!pStr)
  602.     {
  603. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  604.   (const char*)info[1]));
  605.     }
  606.     else
  607.     {
  608. pStr->Empty();
  609. ret = true;
  610.     }
  611.     return ret;
  612. }
  613. bool HLXStringTest::HandleCharStarOpCmd(const UTVector<UTString>& info)
  614. {
  615.     bool ret = false;
  616.     CHXString* pStr = GetStringObj(info[1]);
  617.     int i;
  618.     if (!pStr)
  619.     {
  620. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  621.   (const char*)info[1]));
  622.     }
  623.     for (i = 2; i < info.Nelements(); ++i)
  624.     {
  625.         if (info[i] == (const char*)*pStr)
  626.         {
  627.             ret = true;
  628.             break;
  629.         }
  630.     }
  631.     if (! ret)
  632.     {
  633. DPRINTF(D_ERROR, ("Got "%s" expected%s "%s"",
  634.                           (const char*)*pStr,
  635.                           info.Nelements() > 3 ? " one of" : "",
  636.                           (const char*)info[2]));
  637.         for (i = 3; i < info.Nelements(); ++i)
  638.             DPRINTF(D_ERROR, (", "%s"", (const char*)info[i]));
  639.         DPRINTF(D_ERROR, ("n"));
  640.     }
  641.     return ret;
  642. }
  643. bool HLXStringTest::HandleGetAtCmd(const UTVector<UTString>& info)
  644. {
  645.     bool ret = false;
  646.     CHXString* pStr = GetStringObj(info[1]);
  647.     int index, expected, got;
  648.     if (!pStr)
  649.     {
  650. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  651.   (const char*)info[1]));
  652.     }
  653.     else if (!UTParamUtil::GetInt(info[2], index))
  654.     {
  655. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  656.     }
  657.     else if ((got = pStr->GetAt(index)) != (expected = *((const char*)info[3])))
  658.     {
  659.         DPRINTF(D_ERROR, ("HLXStringTest::GetAt: Got %c[0x%02x] expected %c[0x%02x]n",
  660.                           got, got, expected, expected));
  661.     }
  662.     else ret = true;
  663.     return ret;
  664. }
  665. bool HLXStringTest::HandleSetAtCmd(const UTVector<UTString>& info)
  666. {
  667.     bool ret = false;
  668.     CHXString* pStr = GetStringObj(info[1]);
  669.     int index;
  670.     if (!pStr)
  671.     {
  672. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  673.   (const char*)info[1]));
  674.     }
  675.     else if (!UTParamUtil::GetInt(info[2], index))
  676.     {
  677. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  678.     }
  679.     else
  680.     {
  681.         ret = true;
  682.         pStr->SetAt(index, *((const char*)info[3]));
  683.     }
  684.     return ret;
  685. }
  686. #define SUBTEST(TYPE) 
  687.     if ((got = (*pStr)[(TYPE)index]) != expected) { 
  688.         DPRINTF(D_ERROR, ("operator[](" #TYPE "): Got %c[0x%02x] expected %c[0x%02x]n", 
  689.                           got, got, expected, expected)); 
  690.         ret = false; 
  691.     }
  692. bool HLXStringTest::HandleSubscriptCmd(const UTVector<UTString>& info)
  693. {
  694.     bool ret = false;
  695.     CHXString* pStr = GetStringObj(info[1]);
  696.     int index;
  697.     if (!pStr)
  698.     {
  699. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  700.   (const char*)info[1]));
  701.     }
  702.     else if (!UTParamUtil::GetInt(info[2], index))
  703.     {
  704. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  705.     }
  706.     else
  707.     {
  708.         // cycle through various subscript types and make sure that they
  709.         // all work.
  710.         char expected = *((const char*)info[3]);
  711.         char got;
  712.         ret = true;
  713.         SUBTEST(short);
  714.         SUBTEST(unsigned short);
  715.         SUBTEST(int);
  716.         SUBTEST(unsigned int);
  717.         SUBTEST(long);
  718.         SUBTEST(unsigned long);
  719.     }
  720.     return ret;
  721. }
  722. #undef SUBTEST
  723. bool HLXStringTest::HandleAssignOp1Cmd(const UTVector<UTString>& info)
  724. {
  725.     bool ret = true;
  726.     CHXString* pDest = GetStringObj(info[1]);
  727.     CHXString* pSrc = GetStringObj(info[2]);
  728.     if (!pDest)
  729.     {
  730. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  731.   (const char*)info[1]));
  732.         ret = false;
  733.     }
  734.     if (!pSrc)
  735.     {
  736. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  737.   (const char*)info[2]));
  738.         ret = false;
  739.     }
  740.     if (ret)
  741.     {
  742.         const CHXString& result = (*pDest = *pSrc);
  743.         if (&result != pDest)
  744.         {
  745.             DPRINTF(D_ERROR, ("operator=(const CHXString&) didn't return object: got %p expected %pn",
  746.                               &result, pDest));
  747.             ret = false;
  748.         }
  749.     }
  750.     return ret;
  751. }
  752. bool HLXStringTest::HandleAssignOp2Cmd(const UTVector<UTString>& info)
  753. {
  754.     bool ret = false;
  755.     CHXString* pStr = GetStringObj(info[1]);
  756.     char ch = 0;
  757.     if (!pStr)
  758.     {
  759. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  760.   (const char*)info[1]));
  761.     }
  762.     else if (!UTParamUtil::GetChar(info[2], ch))
  763.     {
  764. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  765.     }
  766.     else
  767.     {
  768.         const CHXString& result = (*pStr = ch);
  769.         if (&result != pStr)
  770.         {
  771.             DPRINTF(D_ERROR, ("operator=(char) didn't return object: got %p expected %pn",
  772.                               &result, pStr));
  773.         }
  774.         else ret = true;
  775.     }
  776.     return ret;
  777. }
  778. bool HLXStringTest::HandleAssignOp3Cmd(const UTVector<UTString>& info)
  779. {
  780.     bool ret = false;
  781.     CHXString* pStr = GetStringObj(info[1]);
  782.     if (!pStr)
  783.     {
  784. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  785.   (const char*)info[1]));
  786.     }
  787.     else
  788.     {
  789.         const CHXString& result = (*pStr = (const char*)info[2]);
  790.         if (&result != pStr)
  791.         {
  792.             DPRINTF(D_ERROR, ("operator=(char) didn't return object: got %p expected %pn",
  793.                               &result, pStr));
  794.         }
  795.         else ret = true;
  796.     }
  797.     return ret;
  798. }
  799. bool HLXStringTest::HandleAssignOp4Cmd(const UTVector<UTString>& info)
  800. {
  801.     bool ret = false;
  802.     CHXString* pStr = GetStringObj(info[1]);
  803.     if (!pStr)
  804.     {
  805. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  806.   (const char*)info[1]));
  807.     }
  808.     else
  809.     {
  810.         const CHXString& result = (*pStr = (const unsigned char*)(const char*)info[2]);
  811.         if (&result != pStr)
  812.         {
  813.             DPRINTF(D_ERROR, ("operator=(char) didn't return object: got %p expected %pn",
  814.                               &result, pStr));
  815.         }
  816.         else ret = true;
  817.     }
  818.     return ret;
  819. }
  820. bool HLXStringTest::HandleAppendTo1Cmd(const UTVector<UTString>& info)
  821. {
  822.     bool ret = true;
  823.     CHXString* pDest = GetStringObj(info[1]);
  824.     CHXString* pSrc = GetStringObj(info[2]);
  825.     if (!pDest)
  826.     {
  827. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  828.   (const char*)info[1]));
  829.         ret = false;
  830.     }
  831.     if (!pSrc)
  832.     {
  833. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  834.   (const char*)info[2]));
  835.         ret = false;
  836.     }
  837.     if (ret)
  838.     {
  839.         const CHXString& result = (*pDest += *pSrc);
  840.         if (&result != pDest)
  841.         {
  842.             DPRINTF(D_ERROR, ("operator=(const CHXString&) didn't return object: got %p expected %pn",
  843.                               &result, pDest));
  844.             ret = false;
  845.         }
  846.     }
  847.     return ret;
  848. }
  849. bool HLXStringTest::HandleAppendTo2Cmd(const UTVector<UTString>& info)
  850. {
  851.     bool ret = true;
  852.     CHXString* pStr = GetStringObj(info[1]);
  853.     if (!pStr)
  854.     {
  855. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  856.   (const char*)info[1]));
  857.     }
  858.     else
  859.     {
  860.         const CHXString& result = (*pStr += *((const char*)info[2]));
  861.         if (&result != pStr)
  862.         {
  863.             DPRINTF(D_ERROR, ("operator=(const CHXString&) didn't return object: got %p expected %pn",
  864.                               &result, pStr));
  865.             ret = false;
  866.         }
  867.     }
  868.     return ret;
  869. }
  870. bool HLXStringTest::HandleAppendTo3Cmd(const UTVector<UTString>& info)
  871. {
  872.     bool ret = true;
  873.     CHXString* pStr = GetStringObj(info[1]);
  874.     if (!pStr)
  875.     {
  876. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  877.   (const char*)info[1]));
  878.     }
  879.     else
  880.     {
  881.         const CHXString& result = (*pStr += (const char*)info[2]);
  882.         if (&result != pStr)
  883.         {
  884.             DPRINTF(D_ERROR, ("operator=(const CHXString&) didn't return object: got %p expected %pn",
  885.                               &result, pStr));
  886.             ret = false;
  887.         }
  888.     }
  889.     return ret;
  890. }
  891. bool HLXStringTest::HandleAdd1Cmd(const UTVector<UTString>& info)
  892. {
  893.     bool ret = true;
  894.     CHXString* pStr1 = GetStringObj(info[1]);
  895.     CHXString* pStr2 = GetStringObj(info[2]);
  896.     if (!pStr1)
  897.     {
  898. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  899.   (const char*)info[1]));
  900.         ret = false;
  901.     }
  902.     if (!pStr2)
  903.     {
  904. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  905.   (const char*)info[2]));
  906.         ret = false;
  907.     }
  908.     if (ret)
  909.     {
  910.         CHXString got = *pStr1 + *pStr2;
  911.         if (strcmp (got, (const char*)info[3]) != 0)
  912.         {
  913.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  914.                               (const char*)got,
  915.                               (const char*)info[3]));
  916.             ret = false;
  917.         }
  918.     }
  919.     return ret;
  920. }
  921. bool HLXStringTest::HandleAdd2Cmd(const UTVector<UTString>& info)
  922. {
  923.     bool ret = true;
  924.     CHXString* pStr1 = GetStringObj(info[1]);
  925.     if (!pStr1)
  926.     {
  927. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  928.   (const char*)info[1]));
  929.         ret = false;
  930.     }
  931.     if (ret)
  932.     {
  933.         CHXString got = *pStr1 + *((const char*)info[2]);
  934.         if (strcmp (got, (const char*)info[3]) != 0)
  935.         {
  936.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  937.                               (const char*)got,
  938.                               (const char*)info[3]));
  939.             ret = false;
  940.         }
  941.     }
  942.     return ret;
  943. }
  944. bool HLXStringTest::HandleAdd3Cmd(const UTVector<UTString>& info)
  945. {
  946.     bool ret = true;
  947.     CHXString* pStr2 = GetStringObj(info[2]);
  948.     if (!pStr2)
  949.     {
  950. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  951.   (const char*)info[2]));
  952.         ret = false;
  953.     }
  954.     if (ret)
  955.     {
  956.         CHXString got = *((const char*)info[1]) + *pStr2;
  957.         if (strcmp (got, (const char*)info[3]) != 0)
  958.         {
  959.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  960.                               (const char*)got,
  961.                               (const char*)info[3]));
  962.             ret = false;
  963.         }
  964.     }
  965.     return ret;
  966. }
  967. bool HLXStringTest::HandleAdd4Cmd(const UTVector<UTString>& info)
  968. {
  969.     bool ret = true;
  970.     CHXString* pStr1 = GetStringObj(info[1]);
  971.     if (!pStr1)
  972.     {
  973. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  974.   (const char*)info[1]));
  975.         ret = false;
  976.     }
  977.     if (ret)
  978.     {
  979.         CHXString got = *pStr1 + (const char*)info[2];
  980.         if (strcmp (got, (const char*)info[3]) != 0)
  981.         {
  982.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  983.                               (const char*)got,
  984.                               (const char*)info[3]));
  985.             ret = false;
  986.         }
  987.     }
  988.     return ret;
  989. }
  990. bool HLXStringTest::HandleAdd5Cmd(const UTVector<UTString>& info)
  991. {
  992.     bool ret = true;
  993.     CHXString* pStr2 = GetStringObj(info[2]);
  994.     if (!pStr2)
  995.     {
  996. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  997.   (const char*)info[2]));
  998.         ret = false;
  999.     }
  1000.     if (ret)
  1001.     {
  1002.         CHXString got = (const char*)info[1] + *pStr2;
  1003.         if (strcmp (got, (const char*)info[3]) != 0)
  1004.         {
  1005.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1006.                               (const char*)got,
  1007.                               (const char*)info[3]));
  1008.             ret = false;
  1009.         }
  1010.     }
  1011.     return ret;
  1012. }
  1013. bool HLXStringTest::HandleCenterCmd(const UTVector<UTString>& info)
  1014. {
  1015.     bool ret = false;
  1016.     CHXString* pStr = GetStringObj(info[1]);
  1017.     int len;
  1018.     if (!pStr)
  1019.     {
  1020. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1021.   (const char*)info[1]));
  1022.     }
  1023.     else if (!UTParamUtil::GetInt(info[2], len))
  1024.     {
  1025. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1026.     }
  1027.     else
  1028.     {
  1029.         pStr->Center(len);
  1030.         ret = true;
  1031.     }
  1032.     return ret;
  1033. }
  1034. bool HLXStringTest::HandleCompareCmd(const UTVector<UTString>& info)
  1035. {
  1036.     bool ret = false;
  1037.     CHXString* pStr = GetStringObj(info[1]);
  1038.     int expected = -9999;
  1039.     bool bNumberExpected = (info[3] != "-" && info[3] != "+");
  1040.     if (!pStr)
  1041.     {
  1042. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1043.   (const char*)info[1]));
  1044.     }
  1045.     else if (bNumberExpected && !UTParamUtil::GetInt(info[3], expected))
  1046.     {
  1047. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1048.     }
  1049.     else
  1050.     {
  1051.         INT32 got = pStr->Compare(info[2]);
  1052.         if ((info[3] == "+" && got > 0) ||
  1053.             (info[3] == "-" && got < 0) ||
  1054.             (bNumberExpected && got == expected)) ret = true;
  1055.         else DPRINTF(D_ERROR, ("Got %d expected %sn",
  1056.                                got, (const char*)info[3]));
  1057.     }
  1058.     return ret;
  1059. }
  1060. bool HLXStringTest::HandleCompareNoCaseCmd(const UTVector<UTString>& info)
  1061. {
  1062.     bool ret = false;
  1063.     CHXString* pStr = GetStringObj(info[1]);
  1064.     int expected = -9999;
  1065.     bool bNumberExpected = (info[3] != "-" && info[3] != "+");
  1066.     if (!pStr)
  1067.     {
  1068. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1069.   (const char*)info[1]));
  1070.     }
  1071.     else if (bNumberExpected && !UTParamUtil::GetInt(info[3], expected))
  1072.     {
  1073. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1074.     }
  1075.     else
  1076.     {
  1077.         INT32 got = pStr->CompareNoCase(info[2]);
  1078.         if ((info[3] == "+" && got > 0) ||
  1079.             (info[3] == "-" && got < 0) ||
  1080.             (bNumberExpected && got == expected)) ret = true;
  1081.         else DPRINTF(D_ERROR, ("Got %d expected %sn",
  1082.                                got, (const char*)info[3]));
  1083.     }
  1084.     return ret;
  1085. }
  1086. bool HLXStringTest::HandleMidCmd(const UTVector<UTString>& info)
  1087. {
  1088.     bool ret = true;
  1089.     CHXString* pStr = GetStringObj(info[1]);
  1090.     int index;
  1091.     const char* expected = NULL;
  1092.     int length = -9999;
  1093.     if (!pStr)
  1094.     {
  1095. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1096.   (const char*)info[1]));
  1097.         ret = false;
  1098.     }
  1099.     else if (!UTParamUtil::GetInt(info[2], index))
  1100.     {
  1101. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1102.         ret = false;
  1103.     }
  1104.     else if (info.Nelements() == 4)
  1105.     {
  1106.         expected = (const char*)info[3];
  1107.     }
  1108.     else if (info.Nelements() == 5)
  1109.     {
  1110.         if (!UTParamUtil::GetInt(info[3], length))
  1111.         {
  1112.             DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1113.             ret = false;
  1114.         }
  1115.         else expected = (const char*)info[4];
  1116.     }
  1117.     else
  1118.     {
  1119.         DPRINTF(D_ERROR, ("Bad number of arguments: %ldn",
  1120.                           (long)info.Nelements()));
  1121.         ret = false;
  1122.     }
  1123.     if (ret)
  1124.     {
  1125.         CHXString got =
  1126.             (length == -9999 ? pStr->Mid(index) : pStr->Mid(index, length));
  1127.         if (strcmp(got, expected) != 0)
  1128.         {
  1129.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1130.                               (const char*)got,
  1131.                               expected));
  1132.             ret = false;
  1133.         }
  1134.     }
  1135.     return ret;
  1136. }
  1137. bool HLXStringTest::HandleLeftCmd(const UTVector<UTString>& info)
  1138. {
  1139.     bool ret = true;
  1140.     CHXString* pStr = GetStringObj(info[1]);
  1141.     const char* expected = (const char*)info[3];
  1142.     int length = -9999;
  1143.     if (!pStr)
  1144.     {
  1145. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1146.   (const char*)info[1]));
  1147.         ret = false;
  1148.     }
  1149.     else if (!UTParamUtil::GetInt(info[2], length))
  1150.     {
  1151. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1152.         ret = false;
  1153.     }
  1154.     else
  1155.     {
  1156.         CHXString got = pStr->Left(length);
  1157.         if (strcmp(got, expected) != 0)
  1158.         {
  1159.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1160.                               (const char*)got,
  1161.                               expected));
  1162.             ret = false;
  1163.         }
  1164.     }
  1165.     return ret;
  1166. }
  1167. bool HLXStringTest::HandleRightCmd(const UTVector<UTString>& info)
  1168. {
  1169.     bool ret = true;
  1170.     CHXString* pStr = GetStringObj(info[1]);
  1171.     const char* expected = (const char*)info[3];
  1172.     int length = -9999;
  1173.     if (!pStr)
  1174.     {
  1175. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1176.   (const char*)info[1]));
  1177.         ret = false;
  1178.     }
  1179.     else if (!UTParamUtil::GetInt(info[2], length))
  1180.     {
  1181. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1182.         ret = false;
  1183.     }
  1184.     else
  1185.     {
  1186.         CHXString got = pStr->Right(length);
  1187.         if (strcmp(got, expected) != 0)
  1188.         {
  1189.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1190.                               (const char*)got,
  1191.                               expected));
  1192.             ret = false;
  1193.         }
  1194.     }
  1195.     return ret;
  1196. }
  1197. bool HLXStringTest::HandleCountFieldsCmd(const UTVector<UTString>& info)
  1198. {
  1199.     bool ret = true;
  1200.     CHXString* pStr = GetStringObj(info[1]);
  1201.     unsigned int expected;
  1202.     if (!pStr)
  1203.     {
  1204. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1205.   (const char*)info[1]));
  1206.         ret = false;
  1207.     }
  1208.     else if (!UTParamUtil::GetUInt(info[3], expected))
  1209.     {
  1210. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1211.         ret = false;
  1212.     }
  1213.     else
  1214.     {
  1215.         ULONG32 got = pStr->CountFields(*((const char*)info[2]));
  1216.         if (got != expected)
  1217.         {
  1218.             DPRINTF(D_ERROR, ("Got %lu expected %lun",
  1219.                               (unsigned long)got, (unsigned long)expected));
  1220.             ret = false;
  1221.         }
  1222.     }
  1223.     return ret;
  1224. }
  1225. bool HLXStringTest::HandleNthFieldCmd(const UTVector<UTString>& info)
  1226. {
  1227.     bool ret = true;
  1228.     CHXString* pStr = GetStringObj(info[1]);
  1229.     unsigned int field;
  1230.     if (!pStr)
  1231.     {
  1232. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1233.   (const char*)info[1]));
  1234.         ret = false;
  1235.     }
  1236.     else if (!UTParamUtil::GetUInt(info[3], field))
  1237.     {
  1238. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1239.         ret = false;
  1240.     }
  1241.     else
  1242.     {
  1243.         CHXString got = pStr->NthField(*((const char*)info[2]),
  1244.                                        (ULONG32)field);
  1245.         const char* expected = (const char*)info[4];
  1246.         if (strcmp(got, expected) != 0)
  1247.         {
  1248.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1249.                               (const char*)got, expected));
  1250.             ret = false;
  1251.         }
  1252.     }
  1253.     return ret;
  1254. }
  1255. bool HLXStringTest::HandleResetNthFieldStateCmd(const UTVector<UTString>& info)
  1256. {
  1257.     bool ret = true;
  1258.     CHXString* pStr = GetStringObj(info[1]);
  1259.     // XXXSAB: Should we have a way to set this NthFieldState thing to garbage???
  1260.     if (!pStr)
  1261.     {
  1262. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1263.   (const char*)info[1]));
  1264.         ret = false;
  1265.     }
  1266.     else
  1267.     {
  1268.         if (pStr == m_pA) m_ANthFieldState = 0;
  1269.         else if (pStr == m_pB) m_BNthFieldState = 0;
  1270.     }
  1271.     return ret;
  1272. }
  1273. bool HLXStringTest::HandleGetNthFieldCmd(const UTVector<UTString>& info)
  1274. {
  1275.     bool ret = true;
  1276.     CHXString* pStr = GetStringObj(info[1]);
  1277.     unsigned int field;
  1278.     if (!pStr)
  1279.     {
  1280. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1281.   (const char*)info[1]));
  1282.         ret = false;
  1283.     }
  1284.     else if (!UTParamUtil::GetUInt(info[3], field))
  1285.     {
  1286. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1287.         ret = false;
  1288.     }
  1289.     else
  1290.     {
  1291.         UINT64& state = (pStr == m_pA) ? m_ANthFieldState : m_BNthFieldState;
  1292.         CHXString got = pStr->GetNthField(*((const char*)info[2]),
  1293.                                           (ULONG32)field,
  1294.                                           state);
  1295.         const char* expected = (const char*)info[4];
  1296.         if (strcmp(got, expected) != 0)
  1297.         {
  1298.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1299.                               (const char*)got, expected));
  1300.             ret = false;
  1301.         }
  1302.     }
  1303.     return ret;
  1304. }
  1305. bool HLXStringTest::HandleSpanIncludingCmd(const UTVector<UTString>& info)
  1306. {
  1307.     bool ret = false;
  1308.     CHXString* pStr = GetStringObj(info[1]);
  1309.     if (!pStr)
  1310.     {
  1311. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1312.   (const char*)info[1]));
  1313.     }
  1314.     else
  1315.     {
  1316.         CHXString got = pStr->SpanIncluding((const char*)info[2]);
  1317.         if (strcmp(got, (const char*)info[3]) == 0) ret = true;
  1318.         else DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1319.                                (const char*)got, (const char*)info[3]));
  1320.     }
  1321.     return ret;
  1322. }
  1323. bool HLXStringTest::HandleSpanExcludingCmd(const UTVector<UTString>& info)
  1324. {
  1325.     bool ret = false;
  1326.     CHXString* pStr = GetStringObj(info[1]);
  1327.     if (!pStr)
  1328.     {
  1329. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1330.   (const char*)info[1]));
  1331.     }
  1332.     else
  1333.     {
  1334.         CHXString got = pStr->SpanExcluding((const char*)info[2]);
  1335.         if (strcmp(got, (const char*)info[3]) == 0) ret = true;
  1336.         else DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1337.                                (const char*)got, (const char*)info[3]));
  1338.     }
  1339.     return ret;
  1340. }
  1341. bool HLXStringTest::HandleMakeUpperCmd(const UTVector<UTString>& info)
  1342. {
  1343.     bool ret = false;
  1344.     CHXString* pStr = GetStringObj(info[1]);
  1345.     if (!pStr)
  1346.     {
  1347. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1348.   (const char*)info[1]));
  1349.     }
  1350.     else
  1351.     {
  1352.         ret = true;
  1353.         pStr->MakeUpper();
  1354.     }
  1355.     return ret;
  1356. }
  1357. bool HLXStringTest::HandleMakeLowerCmd(const UTVector<UTString>& info)
  1358. {
  1359.     bool ret = false;
  1360.     CHXString* pStr = GetStringObj(info[1]);
  1361.     if (!pStr)
  1362.     {
  1363. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1364.   (const char*)info[1]));
  1365.     }
  1366.     else
  1367.     {
  1368.         ret = true;
  1369.         pStr->MakeLower();
  1370.     }
  1371.     return ret;
  1372. }
  1373. bool HLXStringTest::HandleTrimRightCmd(const UTVector<UTString>& info)
  1374. {
  1375.     bool ret = false;
  1376.     CHXString* pStr = GetStringObj(info[1]);
  1377.     if (!pStr)
  1378.     {
  1379. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1380.   (const char*)info[1]));
  1381.     }
  1382.     else
  1383.     {
  1384.         ret = true;
  1385.         pStr->TrimRight();
  1386.     }
  1387.     return ret;
  1388. }
  1389. bool HLXStringTest::HandleTrimLeftCmd(const UTVector<UTString>& info)
  1390. {
  1391.     bool ret = false;
  1392.     CHXString* pStr = GetStringObj(info[1]);
  1393.     if (!pStr)
  1394.     {
  1395. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1396.   (const char*)info[1]));
  1397.     }
  1398.     else
  1399.     {
  1400.         ret = true;
  1401.         pStr->TrimLeft();
  1402.     }
  1403.     return ret;
  1404. }
  1405. bool HLXStringTest::HandleFind1Cmd(const UTVector<UTString>& info)
  1406. {
  1407.     bool ret = false;
  1408.     CHXString* pStr = GetStringObj(info[1]);
  1409.     int expected;
  1410.     if (!pStr)
  1411.     {
  1412. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1413.   (const char*)info[1]));
  1414.     }
  1415.     else if (!UTParamUtil::GetInt(info[3], expected))
  1416.     {
  1417. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1418.     }
  1419.     else
  1420.     {
  1421.         INT32 got = pStr->Find(*((const char*)info[2]));
  1422.         if (got == expected) ret = true;
  1423.         else DPRINTF(D_ERROR, ("Got %ld expected %ldn",
  1424.                                (long)got, (long)expected));
  1425.     }
  1426.     return ret;
  1427. }
  1428. bool HLXStringTest::HandleFind2Cmd(const UTVector<UTString>& info)
  1429. {
  1430.     bool ret = false;
  1431.     CHXString* pStr = GetStringObj(info[1]);
  1432.     int expected;
  1433.     if (!pStr)
  1434.     {
  1435. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1436.   (const char*)info[1]));
  1437.     }
  1438.     else if (!UTParamUtil::GetInt(info[3], expected))
  1439.     {
  1440. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1441.     }
  1442.     else
  1443.     {
  1444.         INT32 got = pStr->Find((const char*)info[2]);
  1445.         if (got == expected) ret = true;
  1446.         else DPRINTF(D_ERROR, ("Got %ld expected %ldn",
  1447.                                (long)got, (long)expected));
  1448.     }
  1449.     return ret;
  1450. }
  1451. bool HLXStringTest::HandleReverseFindCmd(const UTVector<UTString>& info)
  1452. {
  1453.     bool ret = false;
  1454.     CHXString* pStr = GetStringObj(info[1]);
  1455.     int expected;
  1456.     if (!pStr)
  1457.     {
  1458. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1459.   (const char*)info[1]));
  1460.     }
  1461.     else if (!UTParamUtil::GetInt(info[3], expected))
  1462.     {
  1463. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1464.     }
  1465.     else
  1466.     {
  1467.         INT32 got = pStr->ReverseFind(*((const char*)info[2]));
  1468.         if (got == expected) ret = true;
  1469.         else DPRINTF(D_ERROR, ("Got %ld expected %ldn",
  1470.                                (long)got, (long)expected));
  1471.     }
  1472.     return ret;
  1473. }
  1474. bool HLXStringTest::HandleFindAndReplaceCmd(const UTVector<UTString>& info)
  1475. {
  1476.     bool ret = false;
  1477.     CHXString* pStr = GetStringObj(info[1]);
  1478.     bool expected, bReplaceAll;
  1479.     if (!pStr)
  1480.     {
  1481. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1482.   (const char*)info[1]));
  1483.     }
  1484.     else if (!UTParamUtil::GetBool(info[4], bReplaceAll) ||
  1485.              !UTParamUtil::GetBool(info[5], expected))
  1486.     {
  1487. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1488.     }
  1489.     else
  1490.     {
  1491.         bool got = pStr->FindAndReplace((const char*)info[2],
  1492.                                         (const char*)info[3],
  1493.                                         bReplaceAll) ? true : false;
  1494.         if (got == expected) ret = true;
  1495.         else DPRINTF(D_ERROR, ("Got %s expected %sn",
  1496.                                got ? "TRUE" : "FALSE",
  1497.                                expected ? "TRUE" : "FALSE"));
  1498.     }
  1499.     return ret;
  1500. }
  1501. namespace
  1502. {
  1503.     inline bool
  1504.     GetCharStar (const char* strRep, const char*& value)
  1505.     {
  1506.         value = strRep;
  1507.         return true;
  1508.     }
  1509.     inline bool
  1510.     GetPtr (const char* strRep, void*& value)
  1511.     {
  1512.         unsigned long iValue;
  1513.         bool ret = UTParamUtil::GetULong(strRep, iValue);
  1514.         if (ret) value = (void*)iValue;
  1515.         return ret;
  1516.     }
  1517.     template <class T>
  1518.     bool HandleFormat (CHXString& str, const UTVector<UTString>& info,
  1519.                        bool (*GetValue)(const char* strRep, T& retValue))
  1520.     {
  1521.         const char* fmt = (const char*)info[2];
  1522.         T* values = new T[info.Nelements() - 3];
  1523.         
  1524.         int beginData = 3;
  1525.         int endData = info.Nelements();
  1526.         int infoIdx = beginData;
  1527.         int valIdx = 0;
  1528.         for (; infoIdx < endData; ++infoIdx, ++valIdx)
  1529.         {
  1530.             if (!GetValue(info[infoIdx], values[valIdx]))
  1531.             {
  1532.                 DPRINTF(D_ERROR, ("Failed to convert arg "%s"n",
  1533.                                   (const char*)info[infoIdx]));
  1534.                 return false;
  1535.             }
  1536.         }
  1537.         switch (valIdx)
  1538.         {
  1539.             case 1:
  1540.                 str.Format(fmt, values[0]);
  1541.                 break;
  1542.             case 2:
  1543.                 str.Format(fmt, values[0], values[1]);
  1544.                 break;
  1545.             case 3:
  1546.                 str.Format(fmt, values[0], values[1], values[2]);
  1547.                 break;
  1548.             case 4:
  1549.                 str.Format(fmt, values[0], values[1], values[2], values[3]);
  1550.                 break;
  1551.             case 5:
  1552.                 str.Format(fmt, values[0], values[1], values[2], values[3],
  1553.                            values[4]);
  1554.                 break;
  1555.             case 6:
  1556.                 str.Format(fmt, values[0], values[1], values[2], values[3],
  1557.                            values[4], values[5]);
  1558.                 break;
  1559.             case 7:
  1560.                 str.Format(fmt, values[0], values[1], values[2], values[3],
  1561.                            values[4], values[5], values[6]);
  1562.                 break;
  1563.             case 8:
  1564.                 str.Format(fmt, values[0], values[1], values[2], values[3],
  1565.                            values[4], values[5], values[6], values[7]);
  1566.                 break;
  1567.             case 9:
  1568.                 str.Format(fmt, values[0], values[1], values[2], values[3],
  1569.                            values[4], values[5], values[6], values[7],
  1570.                            values[8]);
  1571.                 break;
  1572.             case 10:
  1573.                 str.Format(fmt, values[0], values[1], values[2], values[3],
  1574.                            values[4], values[5], values[6], values[7],
  1575.                            values[8], values[9]);
  1576.                 break;
  1577.             default:
  1578.                 DPRINTF(D_ERROR, ("Unsupported num of data values (%d)n",
  1579.                                   valIdx));
  1580.                 return false;
  1581.                 break;
  1582.         }
  1583. delete [] values;
  1584.         return true;
  1585.     }
  1586. };
  1587. bool HLXStringTest::HandleFormatIntCmd(const UTVector<UTString>& info)
  1588. {
  1589.     bool ret = false;
  1590.     CHXString* pStr = GetStringObj(info[1]);
  1591.     if (!pStr)
  1592.     {
  1593. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1594.   (const char*)info[1]));
  1595.     }
  1596.     else ret = HandleFormat<int>(*pStr, info, UTParamUtil::GetInt);
  1597.     return ret;
  1598. }
  1599. bool HLXStringTest::HandleFormatLongCmd(const UTVector<UTString>& info)
  1600. {
  1601.     bool ret = false;
  1602.     CHXString* pStr = GetStringObj(info[1]);
  1603.     if (!pStr)
  1604.     {
  1605. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1606.   (const char*)info[1]));
  1607.     }
  1608.     else ret = HandleFormat<long int>(*pStr, info, UTParamUtil::GetLong);
  1609.     return ret;
  1610. }
  1611. bool HLXStringTest::HandleFormatUIntCmd(const UTVector<UTString>& info)
  1612. {
  1613.     bool ret = false;
  1614.     CHXString* pStr = GetStringObj(info[1]);
  1615.     if (!pStr)
  1616.     {
  1617. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1618.   (const char*)info[1]));
  1619.     }
  1620.     else ret = HandleFormat<unsigned int>(*pStr, info, UTParamUtil::GetUInt);
  1621.     return ret;
  1622. }
  1623. bool HLXStringTest::HandleFormatULongCmd(const UTVector<UTString>& info)
  1624. {
  1625.     bool ret = false;
  1626.     CHXString* pStr = GetStringObj(info[1]);
  1627.     if (!pStr)
  1628.     {
  1629. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1630.   (const char*)info[1]));
  1631.     }
  1632.     else ret = HandleFormat<unsigned long int>(*pStr, info, 
  1633.        UTParamUtil::GetULong);
  1634.     return ret;
  1635. }
  1636. bool HLXStringTest::HandleFormatCharCmd(const UTVector<UTString>& info)
  1637. {
  1638.     bool ret = false;
  1639.     CHXString* pStr = GetStringObj(info[1]);
  1640.     if (!pStr)
  1641.     {
  1642. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1643.   (const char*)info[1]));
  1644.     }
  1645.     else ret = HandleFormat<char>(*pStr, info, UTParamUtil::GetChar);
  1646.     return ret;
  1647. }
  1648. bool HLXStringTest::HandleFormatCharStarCmd(const UTVector<UTString>& info)
  1649. {
  1650.     bool ret = false;
  1651.     CHXString* pStr = GetStringObj(info[1]);
  1652.     if (!pStr)
  1653.     {
  1654. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1655.   (const char*)info[1]));
  1656.     }
  1657.     else ret = HandleFormat<const char*>(*pStr, info, GetCharStar);
  1658.     return ret;
  1659. }
  1660. bool HLXStringTest::HandleFormatPtrCmd(const UTVector<UTString>& info)
  1661. {
  1662.     bool ret = false;
  1663.     CHXString* pStr = GetStringObj(info[1]);
  1664.     if (!pStr)
  1665.     {
  1666. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1667.   (const char*)info[1]));
  1668.     }
  1669.     else ret = HandleFormat<void*>(*pStr, info, GetPtr);
  1670.     return ret;
  1671. }
  1672. bool HLXStringTest::HandleFormatDoubleCmd(const UTVector<UTString>& info)
  1673. {
  1674.     bool ret = false;
  1675.     CHXString* pStr = GetStringObj(info[1]);
  1676.     if (!pStr)
  1677.     {
  1678. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1679.   (const char*)info[1]));
  1680.     }
  1681.     else ret = HandleFormat<double>(*pStr, info, UTParamUtil::GetDouble);
  1682.     return ret;
  1683. }
  1684. bool HLXStringTest::HandleFormatMixedCmd(const UTVector<UTString>& /*info*/)
  1685. {
  1686.     CHXString str;
  1687.     // XXXSAB - now what???
  1688.     const char* expected = "";
  1689.     char* ptr = (char*)0x60616263;
  1690.     str.Format ("%p,%d,%u,%c",
  1691.                 ptr, (int)ptr, (unsigned int)ptr, (char)ptr);
  1692. #ifdef _WINDOWS
  1693.     expected = "60616263,1616994915,1616994915,c";
  1694. #else
  1695.     expected = "0x60616263,1616994915,1616994915,c";
  1696. #endif /* _WINDOWS */
  1697.     if (str != expected)
  1698.     {
  1699.         DPRINTF(D_ERROR, ("FormatMixed #1: Got "%s" expected "%s"n",
  1700.                           (const char*)str, expected));
  1701.         return false;
  1702.     }
  1703.     ptr = 0;
  1704.     str.Format ("%p,%p,%p,%p", ptr, ptr+1, ptr+2, ptr+3);
  1705. #ifdef _WINDOWS
  1706.     expected = "00000000,00000001,00000002,00000003";
  1707. #elif defined(_SYMBIAN)
  1708.     expected = "0x0,0x1,0x2,0x3";
  1709. #else
  1710.     expected = "(nil),0x1,0x2,0x3";
  1711. #endif /* _WINDOWS */
  1712.     if (str != expected)
  1713.     {
  1714.         DPRINTF(D_ERROR, ("FormatMixed #2: Got "%s" expected "%s"n",
  1715.                           (const char*)str, expected));
  1716.         return false;
  1717.     }
  1718.     str.Format ("%6d,%5u,%x", 1,1,1);
  1719.     expected = "     1,    1,1";
  1720.     if (str != expected)
  1721.     {
  1722.         DPRINTF(D_ERROR, ("FormatMixed #3: Got "%s" expected "%s"n",
  1723.                           (const char*)str, expected));
  1724.         return false;
  1725.     }
  1726.     return true;
  1727. }
  1728. bool HLXStringTest::HandleAppendULONGCmd(const UTVector<UTString>& info)
  1729. {
  1730.     bool ret = false;
  1731.     CHXString* pStr = GetStringObj(info[1]);
  1732.     unsigned int value;
  1733.     if (!pStr)
  1734.     {
  1735. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1736.   (const char*)info[1]));
  1737.     }
  1738.     else if (!UTParamUtil::GetUInt(info[2], value))
  1739.     {
  1740. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1741.     }
  1742.     else
  1743.     {
  1744.         ret = true;
  1745.         pStr->AppendULONG((ULONG32)value);
  1746.     }
  1747.     return ret;
  1748. }
  1749. bool HLXStringTest::HandleAppendEndOfLineCmd(const UTVector<UTString>& info)
  1750. {
  1751.     bool ret = false;
  1752.     CHXString* pStr = GetStringObj(info[1]);
  1753.     if (!pStr)
  1754.     {
  1755. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1756.   (const char*)info[1]));
  1757.     }
  1758.     else
  1759.     {
  1760.         UINT32 beforeLength = pStr->GetLength();
  1761.         pStr->AppendEndOfLine();
  1762.         // Check that the proper EOL sequence was added
  1763.         if (pStr->IsEmpty())
  1764.         {
  1765.             DPRINTF(D_ERROR, ("Failed to add EOL sequence: string is now emptyn"));
  1766.         }
  1767.         else
  1768.         {
  1769.             const char* pEnd = (const char*)*pStr + pStr->GetLength() - 1;
  1770. #if defined(_UNIX) 
  1771.             ret = (*pEnd == 'n') &&
  1772.                 (pStr->GetLength() == (beforeLength+1));
  1773. #elif defined(_MACINTOSH)
  1774.             ret = (*pEnd == 'r') &&
  1775.                 (pStr->GetLength() == (beforeLength+1));
  1776. #elif defined(_WINDOWS) || defined(_SYMBIAN)
  1777.             ret = (*(pEnd-1) == 'r' && *pEnd == 'n') &&
  1778.                 (pStr->GetLength() == (beforeLength+2));
  1779. #else
  1780.            ret = (*pEnd == 'n') &&
  1781.                 (pStr->GetLength() == (beforeLength+1));
  1782. #endif
  1783.             if (!ret)
  1784.             {
  1785.                 DPRINTF(D_ERROR, ("Failed to add EOL: got "%s"n",
  1786.                               (const char*)*pStr));
  1787.             }
  1788.         }
  1789.     }
  1790.     return ret;
  1791. }
  1792. bool HLXStringTest::HandleGetBufferCmd(const UTVector<UTString>& info)
  1793. {
  1794.     bool ret = false;
  1795.     CHXString* pStr = GetStringObj(info[1]);
  1796.     int length;
  1797.     if (!pStr)
  1798.     {
  1799. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1800.   (const char*)info[1]));
  1801.     }
  1802.     else if (!UTParamUtil::GetInt(info[2], length))
  1803.     {
  1804. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1805.     }
  1806.     else
  1807.     {
  1808.         // NOTE: If didn't get at least 4 elements in 'info', then we
  1809.         //       don't care what's in the returned buffer...
  1810.         char*& p = (pStr == m_pA ? m_pABuffer : m_pBBuffer);
  1811.         p = pStr->GetBuffer(length);
  1812.         if (!p) DPRINTF(D_ERROR, ("Got NULL from GetBuffer()n"));
  1813.         else if (info.Nelements() >= 4 &&
  1814.                  strcmp(p, (const char*)info[3]) != 0)
  1815.         {
  1816.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1817.                               p, (const char*)info[3]));
  1818.         }
  1819.         else ret = true;
  1820.     }
  1821.     return ret;
  1822. }
  1823. bool HLXStringTest::HandleGetBufferSetLengthCmd(const UTVector<UTString>& info)
  1824. {
  1825.     bool ret = false;
  1826.     CHXString* pStr = GetStringObj(info[1]);
  1827.     int length;
  1828.     if (!pStr)
  1829.     {
  1830. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1831.   (const char*)info[1]));
  1832.     }
  1833.     else if (!UTParamUtil::GetInt(info[2], length))
  1834.     {
  1835. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1836.     }
  1837.     else
  1838.     {
  1839.         // NOTE: If didn't get at least 4 elements in 'info', then we
  1840.         //       don't care what's in the returned buffer...
  1841.         char*& p = (pStr == m_pA ? m_pABuffer : m_pBBuffer);
  1842.         p = pStr->GetBufferSetLength(length);
  1843.         if (!p) DPRINTF(D_ERROR, ("Got NULL from GetBuffer()n"));
  1844.         else if (info.Nelements() >= 4 &&
  1845.                  strcmp(p, (const char*)info[3]) != 0)
  1846.         {
  1847.             DPRINTF(D_ERROR, ("Got "%s" expected "%s"n",
  1848.                               p, (const char*)info[3]));
  1849.         }
  1850.         else ret = true;
  1851.     }
  1852.     return ret;
  1853. }
  1854. bool HLXStringTest::HandleBufferSetCmd(const UTVector<UTString>& info)
  1855. {
  1856.     bool ret = false;
  1857.     CHXString* pStr = GetStringObj(info[1]);
  1858.     int index = 0;
  1859.     if (!pStr)
  1860.     {
  1861. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1862.   (const char*)info[1]));
  1863.     }
  1864.     else if (info.Nelements() >= 4 && !UTParamUtil::GetInt(info[2], index))
  1865.     {
  1866. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1867.     }
  1868.     else
  1869.     {
  1870.         char* p = (pStr == m_pA ? m_pABuffer : m_pBBuffer);
  1871.         const char* pValue = (const char*)info[info.Nelements()-1];
  1872.         memcpy (p+index, pValue, strlen(pValue)); /* Flawfinder: ignore */
  1873.         ret = true;
  1874.     }
  1875.     return ret;
  1876. }
  1877. bool HLXStringTest::HandleBufferFillCmd(const UTVector<UTString>& info)
  1878. {
  1879.     bool ret = false;
  1880.     CHXString* pStr = GetStringObj(info[1]);
  1881.     int index = 0;
  1882.     int repeat = 0;
  1883.     if (!pStr)
  1884.     {
  1885. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1886.   (const char*)info[1]));
  1887.     }
  1888.     else if (!UTParamUtil::GetInt(info[info.Nelements() - 1], repeat) ||
  1889.              (info.Nelements() >= 5 && !UTParamUtil::GetInt(info[2], index)))
  1890.     {
  1891. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1892.     }
  1893.     else
  1894.     {
  1895.         char* p = (pStr == m_pA ? m_pABuffer : m_pBBuffer);
  1896.         const char* pValue = (const char*)info[info.Nelements()-2];
  1897.         size_t len = strlen(pValue);
  1898.         for (p += index; repeat > 0; p += len, --repeat)
  1899.             memcpy (p, pValue, len); /* Flawfinder: ignore */
  1900.         
  1901.         ret = true;
  1902.     }
  1903.     return ret;
  1904. }
  1905. bool HLXStringTest::HandleBufferEndStringCmd(const UTVector<UTString>& info)
  1906. {
  1907.     bool ret = false;
  1908.     CHXString* pStr = GetStringObj(info[1]);
  1909.     int index = 0;
  1910.     if (!pStr)
  1911.     {
  1912. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1913.   (const char*)info[1]));
  1914.     }
  1915.     else if (!UTParamUtil::GetInt(info[2], index))
  1916.     {
  1917. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1918.     }
  1919.     else
  1920.     {
  1921.         char* p = (pStr == m_pA ? m_pABuffer : m_pBBuffer);
  1922.         *(p+index) = 0;
  1923.         ret = true;
  1924.     }
  1925.     return ret;
  1926. }
  1927. bool HLXStringTest::HandleReleaseBufferCmd(const UTVector<UTString>& info)
  1928. {
  1929.     bool ret = false;
  1930.     CHXString* pStr = GetStringObj(info[1]);
  1931.     int length = -9999;
  1932.     if (!pStr)
  1933.     {
  1934. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1935.   (const char*)info[1]));
  1936.     }
  1937.     else if (info.Nelements() >= 3 && !UTParamUtil::GetInt(info[2], length))
  1938.     {
  1939. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1940.     }
  1941.     else
  1942.     {
  1943.         ret = true;
  1944.         if (length == -9999) pStr->ReleaseBuffer();
  1945.         else pStr->ReleaseBuffer(length);
  1946.         if (pStr == m_pA) m_pABuffer = 0;
  1947.         else m_pBBuffer = 0;
  1948.     }
  1949.     return ret;
  1950. }
  1951. bool HLXStringTest::HandleFreeExtraCmd(const UTVector<UTString>& info)
  1952. {
  1953.     bool ret = false;
  1954.     CHXString* pStr = GetStringObj(info[1]);
  1955.     if (!pStr)
  1956.     {
  1957. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1958.   (const char*)info[1]));
  1959.     }
  1960.     else
  1961.     {
  1962.         ret = true;
  1963.         pStr->FreeExtra();
  1964.     }
  1965.     return ret;
  1966. }
  1967. bool HLXStringTest::HandleGetAllocLengthCmd(const UTVector<UTString>& info)
  1968. {
  1969.     bool ret = false;
  1970.     CHXString* pStr = GetStringObj(info[1]);
  1971.     int expected, maxExpected = -1;
  1972.     if (!pStr)
  1973.     {
  1974. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  1975.   (const char*)info[1]));
  1976.     }
  1977.     else if (!UTParamUtil::GetInt(info[2], expected) ||
  1978.              (info.Nelements() >= 4 && !UTParamUtil::GetInt(info[3], maxExpected)))
  1979.     {
  1980. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  1981.     }
  1982.     else if (pStr->GetAllocLength() < expected ||
  1983.              pStr->GetAllocLength() > (maxExpected > expected ?
  1984.                                        maxExpected : expected))
  1985.     {
  1986.         if (maxExpected > expected)
  1987.             DPRINTF (D_ERROR, ("Got %d expected %d..%dn",
  1988.                                pStr->GetAllocLength(), 
  1989.                                expected, maxExpected));
  1990.         else
  1991.             DPRINTF (D_ERROR, ("Got %d expected %dn", 
  1992.                                pStr->GetAllocLength(), 
  1993.                                expected));
  1994.     }
  1995.     else ret = true;
  1996.     return ret;
  1997. }
  1998. bool HLXStringTest::HandleSetMinBufSizeCmd(const UTVector<UTString>& info)
  1999. {
  2000.     bool ret = false;
  2001.     CHXString* pStr = GetStringObj(info[1]);
  2002.     int value, expected;
  2003.     if (!pStr)
  2004.     {
  2005. DPRINTF(D_ERROR, ("Failed to get the string object '%s'n", 
  2006.   (const char*)info[1]));
  2007.     }
  2008.     else if (!UTParamUtil::GetInt(info[2], value) || 
  2009.      !UTParamUtil::GetInt(info[3], expected))
  2010.     {
  2011. DPRINTF(D_ERROR, ("Failed to convert parametersn"));
  2012.     }
  2013.     else
  2014.     {
  2015.         INT32 got = pStr->SetMinBufSize(value);
  2016.         if (got == expected) ret = true;
  2017. else DPRINTF (D_ERROR, ("Got %d expected %dn", got, expected));
  2018.     }
  2019.     return ret;
  2020. }
  2021. CHXString* HLXStringTest::GetStringObj(const UTString& strName)
  2022. {
  2023.     CHXString* pRet = 0;
  2024.     if (strName == "A")
  2025. pRet = m_pA;
  2026.     else if (strName == "B")
  2027. pRet = m_pB;
  2028.     else
  2029.     {
  2030. DPRINTF(D_ERROR, ("GetStringObj() : get '%s' failedn",
  2031.   (const char*)strName));
  2032.     }
  2033.     return pRet;
  2034. }
  2035. void HLXStringTest::SetStringObj(const UTString& strName, CHXString* pNewStr)
  2036. {
  2037.     if (strName == "A")
  2038.     {
  2039. delete m_pA;
  2040. m_pA = pNewStr;
  2041.     }
  2042.     else if (strName == "B")
  2043.     {
  2044. delete m_pB;
  2045. m_pB = pNewStr;
  2046.     }
  2047.     else
  2048. DPRINTF(D_ERROR, ("SetStringObj() : set '%s' failedn",
  2049.   (const char*)strName));
  2050. }