os/textandloc/fontservices/textshaperplugin/test/t_shapeteststep.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description: 
    15 *
    16 */
    17 
    18 #include <e32math.h>
    19 #include <fbs.h>
    20 #include <badesca.h>
    21 #include <ecom/ecom.h>
    22 #include <ecom/implementationproxy.h>
    23 #include <graphics/shapeimpl.h>
    24 #include <graphics/openfontrasterizer.h>
    25 #include <graphics/openfontconstants.h>
    26 
    27 #include "testData.h"
    28 #include "t_shapeteststep.h"
    29 
    30 #define test(cond)                                          \
    31     {                                                       \
    32     TBool __bb = (cond);                                    \
    33     TEST(__bb);                                             \
    34     if (!__bb)                                              \
    35         {                                                   \
    36         ERR_PRINTF1(_L("ERROR: Test Failed"));              \
    37         User::Leave(1);                                     \
    38         }                                                   \
    39     }
    40 
    41 //add filenames for any test data here
    42 const TText16* KTestFilenames[] =
    43     {
    44     //created from original iculayoutengine test data
    45     (const TText16*) L"z:\\test\\data\\tnr_dev_otshaperdata1.dat",
    46     //created from input data provided by licensee
    47     (const TText16*) L"z:\\test\\data\\tnr_dev_otshaperdata2.dat",
    48     //created from input data provided by licensee
    49     (const TText16*) L"z:\\test\\data\\tnr_dev_otshaperdata3.dat",
    50     //created from input data provided by licensee
    51     (const TText16*) L"z:\\test\\data\\tnr_dev_otshaperdata4.dat",
    52     // Data to test defect fix DEF078032
    53     (const TText16*) L"z:\\test\\data\\tnr_dev_otshaperdata5.dat",
    54     //created from input data provided by licensee
    55     (const TText16*) L"z:\\test\\data\\shaperkannadadata1.dat",
    56     // created from Kannada sample text
    57     (const TText16*) L"z:\\test\\data\\shaperkannadadata2.dat",
    58     // created from Kannada sample text
    59     (const TText16*) L"z:\\test\\data\\shaperkannadadata3.dat",
    60     // created from Gujarati sample text taken from the web
    61     (const TText16*) L"z:\\test\\data\\shapergujaratidata1.dat",
    62     // created from Gujarati sample text taken from the web
    63     (const TText16*) L"z:\\test\\data\\shapergujaratidata2.dat",
    64     // created from Gujarati sample text given by the licensee
    65     (const TText16*) L"z:\\test\\data\\shapergujaratidata3.dat",
    66     // created from Bengali sample text given by the licensee
    67     (const TText16*) L"z:\\test\\data\\shaperbengalidata1.dat",
    68     // created from Bengali sample text given by the licensee
    69     (const TText16*) L"z:\\test\\data\\shaperbengalidata2.dat",
    70     // created from Bengali sample text given by the licensee
    71     (const TText16*) L"z:\\test\\data\\shaperbengalidata3.dat",
    72     // created from Tamil sample text given by the licensee
    73     (const TText16*) L"z:\\test\\data\\shapertamildata1.dat",
    74     // created from Tamil sample text given by the licensee
    75     (const TText16*) L"z:\\test\\data\\shapertamildata2.dat",
    76     // created from Tamil sample text given by the licensee
    77     (const TText16*) L"z:\\test\\data\\shapertamildata3.dat",
    78     // created from Telugu sample text given by the licensee
    79     (const TText16*) L"z:\\test\\data\\shapertelugudata1.dat",
    80     // created from Telugu sample text given by the licensee
    81     (const TText16*) L"z:\\test\\data\\shapertelugudata2.dat",
    82     // created from Telugu sample text given by the licensee
    83     (const TText16*) L"z:\\test\\data\\shapertelugudata3.dat",
    84     //  Test for Gurmukhi digit
    85     (const TText16*) L"z:\\test\\data\\shapergurmukhi1.dat",
    86     (const TText16*) L"z:\\test\\data\\shapergurmukhi2.dat",
    87     (const TText16*) L"z:\\test\\data\\shapergurmukhi3.dat",
    88     (const TText16*) L"z:\\test\\data\\shapergurmukhi4.dat",
    89     (const TText16*) L"z:\\test\\data\\shapergurmukhi5.dat",
    90     //  Test for Malayalam digit
    91     (const TText16*) L"z:\\test\\data\\shapermalayalam1.dat",
    92     (const TText16*) L"z:\\test\\data\\shapermalayalam2.dat",
    93     (const TText16*) L"z:\\test\\data\\shapermalayalam3.dat",
    94     (const TText16*) L"z:\\test\\data\\shapermalayalam4.dat",
    95     (const TText16*) L"z:\\test\\data\\shapermalayalam5.dat"
    96     };
    97 
    98 /**
    99 Number of test data files of each of the scripts/languages bein tests.
   100 Must change these if KTestFilnames[] above is changed
   101 */
   102 const TInt KHindiTestDataIndex = 0;
   103 const TInt KNumberOfHindiTestDataFiles = 5;
   104 const TInt KKannadaTestDataIndex = 5;
   105 const TInt KNumberOfKannadaTestDataFiles = 3;
   106 const TInt KGujaratiTestDataIndex = 8;
   107 const TInt KNumberOfGujaratiTestDataFiles = 3;
   108 const TInt KBengaliTestDataIndex = 11;
   109 const TInt KNumberOfBengaliTestDataFiles = 3;
   110 const TInt KTamilTestDataIndex = 14;
   111 const TInt KNumberOfTamilTestDataFiles = 3;
   112 const TInt KTeluguTestDataIndex = 17;
   113 const TInt KNumberOfTeluguTestDataFiles = 3;
   114 const TInt KGurmukhiTestDataIndex = 20;
   115 const TInt KNumberOfGurmukhiTestDataFiles = 5;
   116 const TInt KMalayalamTestDataIndex = 25;
   117 const TInt KNumberOfMalayalamTestDataFiles = 5;
   118     
   119 const TUint32 KDevanagariScriptCode = 0x64657661;
   120 const TUint32 KKannadaScriptCode = 0x6B6E6461;
   121 const TUint32 KHindiLanguageCode = 0x48494E20;
   122 const TUint32 KKannadaLanguageCode = 0x4B414E20;
   123 const TUint32 KGujaratiScriptCode = 0x67756A72;
   124 const TUint32 KGujaratiLanguageCode = 0x47554A20;
   125 const TUint32 KBengaliScriptCode = 0x62656E67;
   126 const TUint32 KBengaliLanguageCode = 0x42454E20;
   127 const TUint32 KTamilScriptCode = 0x74616D6C;
   128 const TUint32 KTamilLanguageCode = 0x54414D20;
   129 const TUint32 KTeluguScriptCode = 0x74656C75;
   130 const TUint32 KTeluguLanguageCode = 0x54454C20;
   131 const TUint32 KGurmukhiScriptCode = 0x67757275;
   132 const TUint32 KGurmukhiLanguageCode = 0;
   133 const TUint32 KMalayalamScriptCode = 0x6d6c796d;
   134 const TUint32 KMalayalamLanguageCode = 0x4d4c5220;
   135 
   136 _LIT(KTestStep_Hindi, "Hindi");
   137 _LIT(KTestStep_Kannada, "Kannada");
   138 _LIT(KTestStep_Gujarati, "Gujarati");
   139 _LIT(KTestStep_Bengali, "Bengali");
   140 _LIT(KTestStep_Tamil, "Tamil");
   141 _LIT(KTestStep_Telugu, "Telugu");
   142 _LIT(KTestStep_Gurmukhi, "Gurmukhi");
   143 _LIT(KTestStep_Malayalam, "Malayalam");
   144 
   145 _LIT16(KHindi1,"\x0915\x094D\x0937\x0924\x094D\x0930\x093F\x092F\x0020\x0909\x0926\x094D\x0926\x0947\x0936\x094D\x0020\x0915\x094D\x0937\x093F\x092A\x094D\x0930");
   146 _LIT16(KHindi2,"\x092d\x0942\x0930\x094d\x092d\x0941\x0935\x0903\x0020\x0938\x094d\x0935\x0903\x0020\x0924\x0924\x094d\x0938\x0935\x093f\x0924\x0941\x0930\x094d\x0935\x0930\x0947\x0923\x094d\x092f\x0902");
   147 _LIT16(KHindi3,"\x092d\x0930\x094d\x0917\x094b\x0020\x0926\x0947\x0935\x0938\x094d\x092f\x0020\x0927\x0940\x092e\x0939\x093f\x0020\x0927\x093f\x092f\x094b\x0020\x092f\x094b\x0928\x0903\x0020\x092a\x094d\x0930\x091a\x094b\x0926\x092f\x093e\x0924\x094d\x0020");
   148 
   149 _LIT16(KKannada1,"\x0CB6\x0CCD\x0CB0\x0CC0\x0020\x0CAD\x0C97\x0CB5\x0CBE\x0CA8\x0CC1\x0CB5\x0CBE\x0C9A\x0C95\x0CC1\x0CA4\x0CB8\x0CCD\x0CA4\x0CCD\x0CB5\x0CBE\x0020\x0C95\x0CB6\x0CCD\x0CAE\x0CB2\x0CAE\x0CBF\x0CA6\x0C82\x0020\x0CB5\x0CBF\x0CB7\x0CAE\x0020\x0CB8\x0CAE\x0CC1\x0CAA\x0CB8\x0CCD\x0CA5\x0CBF\x0CA4\x0CAE\x0CCD");
   150 _LIT16(KKannada2,"\x0C85\x0CA8\x0CBE\x0CB0\x0CCD\x0CAF\x0C9C\x0CC1\x0CB7\x0CCD\x0CA0\x0CAE\x0CB8\x0CCD\x0CB5\x0CB0\x0CCD\x0C97\x0CCD\x0CAF\x0CAE\x0C95\x0CC0\x0CB0\x0CCD\x0CA4\x0CBF\x0C95\x0CB0\x0CAE\x0CB0\x0CCD\x0C9C\x0CC1\x0CA8");
   151 _LIT16(KKannada3,"\x0C95\x0CCD\x0CB2\x0CC8\x0CAC\x0CCD\x0CAF\x0C82\x0020\x0CAE\x0CBE\x0020\x0CB8\x0CCD\x0CAE\x0020\x0C97\x0CAE\x0C83\x0020\x0CAA\x0CBE\x0CB0\x0CCD\x0CA5\x0020\x0CA8\x0CC8\x0CA4\x0CA4\x0CCD\x0CA4\x0CCD\x0CB5\x0CAF\x0CCD\x0CAF\x0CC1\x0CAA\x0CAA\x0CA7\x0CCD\x0CAF\x0CA4\x0CC7");
   152 
   153 _LIT16(KGujarati1,"\x0AAD\x0ABE\x0AB5\x0ABE\x0AA4\x0ACD\x0AAE\x0A95\x0020\x0AAA\x0AA6\x0ACD\x0AAF\x0ABE\x0AA8\x0AC1\x0AB5\x0ABE\x0AA6\x0020\x0020\x002D\x0020\x0AB6\x0ACD\x0AB0\x0AC0\x0020\x0AAF\x0ACB\x0A97\x0AC7\x0AB6\x0ACD\x0AB5\x0AB0\x0A9C\x0AC0");
   154 _LIT16(KGujarati2,"\x0AB5\x0ABF\x0AA8\x0ACD\x0AA1\x0ACB\x0A9D\x0020\x0AB5\x0ABF\x0AB8\x0ACD\x0A9F\x0ABE\x0020\x002D\x0020\x0A86\x0A82\x0AA4\x0AB0\x0AB0\x0ABE\x0AB7\x0ACD\x0A9F\x0ACD\x0AB0\x0ABF\x0AAF\x0A95\x0AB0\x0AA3\x0020\x0AB5\x0ABF\x0AB6\x0AC7\x0AA8\x0AC0\x0020\x0A9C\x0ABE\x0AA3\x0A95\x0ABE\x0AB0\x0AC0");
   155 _LIT16(KGujarati3,"\x0AAE\x0ABE\x0A88\x0A95\x0ACD\x0AB0\x0ACB\x0AB8\x0ACB\x0AAB\x0ACD\x0A9F\x0AA8\x0ABE\x0020\x0A86\x0020\x0A86\x0A82\x0AA4\x0AB0\x0AB0\x0ABE\x0AB7\x0ACD\x0A9F\x0ACD\x0AB0\x0ABF\x0AAF\x0020\x0AAA\x0ACB\x0AB0\x0ACD\x0A9F\x0AB2\x0020\x0AB5\x0ABF\x0AB6\x0AC7\x0020\x0AB5\x0AA7\x0AC1\x0020\x0A9C\x0ABE\x0AA3\x0ACB\x002E\x0020\x0AB5\x0ABF\x0AB8\x0ACD\x0A9F\x0ABE\x0A8F\x0020\x0AA6\x0AC1\x0AA8\x0ABF\x0AAF\x0ABE\x0AAD\x0AB0\x0AA8\x0AC0\x0020\x0AAD\x0ABE\x0AB7\x0ABE\x0A93\x0020\x0AAE\x0ABE\x0A9F\x0AC7\x0020\x0AA6\x0ACD\x0AB5\x0ABE\x0AB0\x0020\x0A96\x0ACB\x0AB2\x0AC0\x0020\x0AA8\x0ABE\x0A96\x0ACD\x0AAF\x0ABE\x0020\x0A9B\x0AC7");
   156 
   157 _LIT16(KBengali1,"\x099C\x09A8\x0997\x09A3\x09AE\x09A8\x0020\x0985\x09A7\x09BF\x09A8\x09BE\x09AF\x09BC\x0995\x0020\x099C\x09AF\x09BC\x0020\x09B9\x09C7\x0020\x09AD\x09BE\x09B0\x09A4\x0020\x09AD\x09BE\x0997\x09CD\x09AF\x0020\x09AC\x09BF\x09A7\x09BE\x09A4\x09BE\x0020\x09AA\x099E\x09CD\x099C\x09BE\x09AC\x0020\x09B8\x09BF\x09A8\x09CD\x09A7\x09C1\x0020");
   158 _LIT16(KBengali2,"\x0997\x09C1\x099C\x09B0\x09BE\x099F\x0020\x09AE\x09B0\x09BE\x09A0\x09BE\x0020\x09A6\x09CD\x09B0\x09BE\x09AC\x09BF\x09A1\x09BC\x0020\x0989\x09A4\x09CD\x0995\x09B2\x0020\x09AC\x0999\x09CD\x0997\x0020\x09AC\x09BF\x09A8\x09CD\x09A7\x09CD\x09AF\x0020\x09B9\x09BF\x09AE\x09BE\x099A\x09B2\x0020\x09AF\x09AE\x09C1\x09A8\x09BE\x0020\x0997\x0999\x09CD\x0997\x09BE\x0020");
   159 _LIT16(KBengali3,"\x0989\x099A\x09CD\x099B\x09B2\x0020\x099C\x09B2\x09A7\x09BF\x0020\x09A4\x09B0\x0999\x09CD\x0997\x0020\x09A4\x09AC\x0020\x09B6\x09C1\x09AD\x0020\x09A8\x09BE\x09AE\x09C7\x0020\x099C\x09BE\x0997\x09C7\x0020\x09A4\x09AC\x0020\x09B6\x09C1\x09AD\x0020\x0986\x09B6\x09BF\x09B8\x0020\x09AE\x09BE\x0997\x09C7\x0020\x0997\x09BE\x09B9\x09C7\x0020\x09A4\x09AC\x0020\x099C\x09AF\x09BC\x0020");
   160 
   161 _LIT16(KTamil1,"\x0B89\x0BA3\x0BCD\x0BA3\x0020\x0BAE\x0BC1\x0B9F\x0BBF\x0BAF\x0BBE\x0BA4\x0020\x0BB5\x0BCB\x0BA4\x0BA8\x0BC0\x0BB0\x0BCD\x0020\x0BB5\x0BBE\x0BA9\x0BCD\x0BB5\x0BBE\x0BAF\x0BCD\x0BAA\x0BCD\x0BAA\x0B9F\x0BCD\x0020");
   162 _LIT16(KTamil2,"\x0B86\x0BA9\x0BCD\x0BB1\x0BB5\x0BC1\x0BAF\x0BBF\x0BB0\x0BCD\x0020\x0B88\x0BB0\x0BBE\x0BB1\x0BC1\x0BAE\x0BCD\x0020\x0B90\x0B99\x0BCD\x0B95\x0BC1\x0BB1\x0BBF\x0BB2\x0BCD\x0020\x0B8F\x0BB4\x0BCD\x0BA8\x0BC6\x0B9F\x0BBF\x0BB2\x0BBE\x0BAE\x0BCD\x0020");
   163 _LIT16(KTamil3,"\x0BAE\x0BC1\x0BAE\x0BCD\x0BAE\x0BC8\x0BAF\x0BBF\x0B9F\x0BA4\x0BCD\x0020\x0BA4\x0BC8\x0BAF\x0BCC\x0BB5\x0BC1\x0B99\x0BCD\x0020\x0B95\x0BC1\x0BA9\x0BCD\x0BB1\x0BC1\x0BAE\x0BC1\x0BA9\x0BCD\x0020\x0BA9\x0BCA\x0BB1\x0BCD\x0BB1\x0BC1\x0BA3\x0BCD\x0B9F\x0BC7\x0BB1\x0BCD");
   164 
   165 _LIT16(KTelugu1,"\x0C05\x0C2A\x0C4D\x0C30\x0C15\x0C3E\x0C36\x0C4B\x093D\x0C2A\x0C4D\x0C30\x0C35\x0C43\x0C24\x0C4D\x0C24\x0C3F\x0C36\x0C4D\x0C1A\x0020\x0C2A\x0C4D\x0C30\x0C2E\x0C3E\x0C26\x0C4B\x0020\x0C0A\x0C30\x0C4D\x0C27\x0C4D\x0C35\x0C02");
   166 _LIT16(KTelugu2,"\x0C15\x0C48\x0C30\x0C4D\x0C32\x0C3F\x0C19\x0C4D\x0C17\x0C48\x0C38\x0C4D\x0C24\x0C4D\x0C30\x0C40\x0C28\x0C4D\x0C17\x0C41\x0C23\x0C3E\x0C28\x0C47\x0C24\x0C3E\x0C28\x0C24\x0C40\x0C24\x0C4B\x0020\x0C17\x0C41\x0C23\x0C48\x0C30\x0C4D\x0C2F");
   167 _LIT16(KTelugu3,"\x0020\x0C2C\x0C4D\x0C30\x0C39\x0C4D\x0C2E\x0C23\x0C4B\x0020\x0C39\x0C3F\x0020\x0C2A\x0C4D\x0C30\x0C24\x0C3F\x0C37\x0C4D\x0C20\x0C3E\x0C39\x0C2E\x0C2E\x0C43\x0C24\x0C38\x0C4D\x0C2F\x0C3E\x0C35\x0C4D\x0C2F\x0C2F\x0C38\x0C4D\x0C2F");
   168 
   169 _LIT16(KGurmukhi1,"\x0a28\x0a2e\x0a38\x0a15\x0a3e\x0a30\x0a26\x0a\x3e\x0a28\x0a3f\x0a1a\x0a3f\x0a70\x0a26\x0a41\x0020\x0a28\x0a3f\x0a17\x0a4d\x0a30\x0a39\x0a3f\x0a2a\x0a70\x0a16\x0a40\x0a05\x0a32\x0a4b\x0a2a\x0a70\x0a16\x0a40\x0a05\x0a32\x0a4b\x0a2a\x0a30\x0a09\x0a2a\x0a15\x0a3e\x0a30\x0a3f\x0a06\x0a2a\x0a4d\x0a30\x0a24\x0a3e\x0a2a\x0a3f");
   170 _LIT16(KGurmukhi2,"\x0a2a\x0a4d\x0a30\x0a24\x0a3f\x0a2a\x0a3e\x0a32\x0a47\x0020\x0a2a\x0a4d\x0a30\x0a2c\x0a32\x0a1a\x0a70\x0a21\x0a2b\x0a3f\x0a30\x0a70\x0a28\x0a4d\x0a39\x0a4d\x0a39\x0a3f\x0020\x0a2b\x0a41\x0a32\x0a35\x0a24\x0a2c\x0a4d\x0a30\x0a3f\x0a25\x0a3e\x0a2c\x0a4d\x0a30\x0a39\x0a2e\x0a3e\x0a26\x0a3f\x0020\x0a2c\x0a3e\x0a1b\x0a30\x0a2c\x0a3f\x0a38\x0a4d\x0a35\x0a70\x0a2d\x0a30\x0a2d\x0a4d\x0a30\x0a2e\x0a39\x0a41\x0a2d\x0a2f\x0a4b\x0a2d\x0a17\x0a35\x0a70\x0a24");
   171 _LIT16(KGurmukhi3,"\x0a2e\x0a3e\x0a23\x0a40\x0a06\x0a2e\x0a4b\x0a24\x0a38\x0a30\x0a40\x0a06\x0a2f\x0a3e\x0a28\x0a5c\x0a40\x0a0f\x0a2f\x0a15\x0a40\x0a28\x0a3e\x0a30\x0a35\x0a3f\x0a70\x0a26\x0a41\x0020\x0a30\x0a2a\x0a38\x0a40\x0a32\x0a17\x0a3e\x0a35\x0a23\x0a3f\x0a06\x0a32\x0a4b\x0a5c\x0a40\x0a05\x0a39\x0a3f\x0a35\x0a30\x0a28\x0a41\x0a35\x0a40\x0a06\x0a39\x0a3f\x0a06\x0a5c\x0a5c\x0a15\x0a3f\x0a28\x0a2e\x0a38\x0a15\x0a3e\x0a30\x0a26\x0a3e\x0a28\x0a3f\x0a1a\x0a3f\x0a70\x0a26\x0a41\x0020");
   172 
   173 _LIT16(KMalayalam1,"\xd09\xd28\xd4d\xd28\xd2f\xd3f\xd1a\xd4d\xd1a\xd4d\x200c\xd26\xd47\xd36\xd40\xd2f\xd07\xd1f\xd24\xd41\xd2a\xd15\xd4d\xd37\xd1f\xd4d\xd30\xd47\xd21\xd4d\x200c\xd2f\xd42\xd23\xd3f\xd2f\xd28\xd4d\x200d\xd05\xd2d\xd3f\xd28\xd28\xd4d");
   174 _LIT16(KMalayalam2,"\xd2a\xd23\xd3f\xd2e\xd41\xd1f\xd15\xd4d\xd15\xd4d\x200c\xd2a\xd42\xd30\xd4d\x200d");
   175 _LIT16(KMalayalam3,"\xd23\xd02\xd24\xd40\xd35\xd23\xd4d\xd1f\xd3f\xd15\xd33\xd4d\x200d\xd31\xd26\xd4d\xd26\xd3e\xd15\xd4d\xd15\xd3f\xd15\xd4b\xd34\xd3f\xd15\xd4d\xd15\xd4b\xd1f\xd4d\x200c\xd35\xd3f\xd35\xd3f\xd27\xd06\xd35\xd36\xd4d\xd2f\xd19\xd4d\xd19\xd33\xd4d\x200d");
   176 
   177 CShapeTestStep::CShapeTestStep(TInt aTestDataIndex, TInt aNumberOfTestDataFiles, 
   178         TUint32 aScript, TUint32 aLang, const TDesC& aScriptName, const TDesC& aTestID)
   179     : iTestDataIndex(aTestDataIndex), iNumberOfTestDataFiles(aNumberOfTestDataFiles), 
   180       iScript(aScript), iLang(aLang), iScriptName(aScriptName), iTestID(aTestID)
   181     {
   182     SetTestStepName(aScriptName);
   183     }
   184 
   185 // Convenience methods
   186 //**************************************************************************************
   187 
   188 /* 
   189 Used for cleanup of RImplInfoArray implementationArray below 
   190 This method is stolen from FbsTop.cpp
   191 */
   192 LOCAL_C void ResetAndDestroyRImplInfoPtrArray(TAny* aPtr)
   193     {
   194     RImplInfoPtrArray* array = reinterpret_cast <RImplInfoPtrArray*> (aPtr);
   195     array->ResetAndDestroy();
   196     }
   197     
   198 /*
   199 Load all ECOM implemented rasterizer DLLs. 
   200 This method is stolen from CFbTop::LoadOpenFontLibraries()
   201 */
   202 LOCAL_C void LoadOpenFontLibraries(CFontStore* aFontStore)
   203     {
   204     RImplInfoPtrArray implementationArray;
   205     TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
   206     CleanupStack::PushL(cleanup);
   207     TInt error;
   208     TInt ecomerror;
   209     TInt ecomnotready;
   210     TUid uid = {KUidOpenFontRasterizerPlunginInterface};
   211 
   212     // Making sure that no race situation arises
   213     // If ECom is not ready, give it another chance and try again. if it still doesn't work 
   214     // after the third try, then it just carries on quietly and fails... 
   215     for (ecomnotready =0; ecomnotready <3; ecomnotready++)
   216         {
   217         TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
   218         if (!ecomerror)
   219             {
   220             break;
   221             }
   222         else
   223             {
   224             ecomerror = 0;  
   225             User::After(0);
   226             }
   227         }
   228 
   229     const TInt availCount = implementationArray.Count();
   230     for (TInt count=0;count<availCount;++count)
   231         {
   232         const CImplementationInformation* info = implementationArray[count];
   233         TUid rasterizerUid = info->ImplementationUid();
   234         // Create a rasterizer
   235         COpenFontRasterizer* rasterizer=0;
   236         TRAP(error,rasterizer = COpenFontRasterizer::NewL(rasterizerUid));
   237         if (!error)
   238             {
   239             // Install it in the font store.
   240             TRAP(error,aFontStore->InstallRasterizerL(rasterizer));
   241             if (error)
   242                 delete rasterizer;
   243             }
   244         }
   245     CleanupStack::PopAndDestroy(&implementationArray);
   246     }
   247     
   248 void CShapeTestStep::SetupTestDataL()    
   249     {
   250     //set up the testData variables
   251     CDesC16ArrayFlat* testDataFilenames = new CDesC16ArrayFlat(2);
   252     CleanupStack::PushL(testDataFilenames);
   253     
   254     for (TInt i = 0; i != sizeof(KTestFilenames)/sizeof(KTestFilenames[0]); ++i)
   255         {
   256         TPtrC16 d(KTestFilenames[i]);
   257         testDataFilenames->AppendL(d);
   258         }
   259     
   260     for (TInt i = 0; i<testDataFilenames->Count(); i++)
   261         {
   262         CTestData* temp = new(ELeave) CTestData;
   263         temp->Internalize((*testDataFilenames)[i]);
   264         iTestDataArr.AppendL(temp);
   265         }
   266     
   267     CleanupStack::PopAndDestroy(1);     //testDataFilenames
   268     }
   269     
   270     
   271 // test methods
   272 //**************************************************************************************
   273 
   274 /**
   275 @file
   276 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-1479
   277 @SYMTestCaseDesc            Simple test of the shaper
   278 @SYMTestPriority            High
   279 @SYMTestActions             Simple test to shape some text using the shaper, and test that the output is as expected. Does not perform any OOM testing.
   280 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   281 @SYMPREQ                    PREQ18
   282 */
   283 void CShapeTestStep::doShapeText(CBitmapFont* font, CTestData& aTestData, TBool aCheckOutput)
   284     {
   285     INFO_PRINTF1(_L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-1479 "));
   286 
   287     //set up the shaper
   288     CShaper* theShaper = NULL;
   289     CShaperFactory* shaperFactory = NULL;
   290 
   291     RImplInfoPtrArray implementationArray;
   292     TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
   293     CleanupStack::PushL(cleanup);
   294     TInt ecomerror;
   295     TInt ecomnotready;
   296     TUid uid = {KUidShaperFactoryPlunginInterface};
   297 
   298     // Making sure that no race situation arises between FBserv and Ecom
   299     // If ECom is not ready, give it another chance and try again. if it still doesn't work 
   300     // after the third try, then it just carries on quietly and fails... 
   301     for (ecomnotready =0; ecomnotready <3; ecomnotready++)
   302         {
   303 
   304         TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
   305         if (!ecomerror)
   306             {
   307             break;
   308             }
   309         else
   310             {
   311             ecomerror = 0;  
   312             User::After(0);
   313             }
   314         }
   315 
   316     const TInt availCount = implementationArray.Count();
   317     for (TInt count=0;count<availCount;++count)
   318         {
   319         const CImplementationInformation* info = implementationArray[count];
   320         TUid shaperFactoryUid = info->ImplementationUid();
   321         // Create a shaper factory
   322         TInt error;
   323         TRAP(error,shaperFactory = CShaperFactory::NewL(shaperFactoryUid));
   324         test(error == KErrNone);
   325         // Create a shaper
   326         TRAP(error, theShaper = shaperFactory->NewShaperL(font, iScript, iLang, &User::Heap()));
   327         if (error != KErrNone)
   328             {
   329             delete shaperFactory;
   330             shaperFactory = NULL;
   331             }
   332         test(error == KErrNone);
   333         break; // have got valid shaper here
   334         }
   335     CleanupStack::PopAndDestroy(&implementationArray);
   336 
   337     CleanupStack::PushL(shaperFactory);
   338     CleanupStack::PushL(theShaper);
   339 
   340     // create the data to be shaped
   341     // this uses hindiTestData, defined in testData.h
   342     CShaper::TInput input;
   343     input.iText = aTestData.iTextInput;
   344     input.iStart = aTestData.iStart;
   345     input.iEnd = aTestData.iEnd;
   346 
   347     TInt textLength = input.iText->Length();
   348 
   349     //create shape header, and shape the text
   350     TShapeHeader* output = NULL;
   351     TInt err = theShaper->ShapeText(output, input, &User::Heap());
   352     test(err == KErrNone);
   353     CleanupStack::PopAndDestroy(theShaper);
   354     CleanupStack::PopAndDestroy(shaperFactory);
   355     REComSession::FinalClose();
   356 
   357     CleanupStack::PushL(output);    
   358     
   359     if (aCheckOutput)
   360         {
   361         // check the contents of output
   362         TEST(output->iGlyphCount == aTestData.iGlyphCount);
   363         TEST(output->iCharacterCount == aTestData.iCharacterCount);
   364 
   365         // First iGlyphCount * 4 bytes of the output buffer contain the glyph codes as 2byte values
   366         // Compare against expected.
   367         TInt i=0;
   368         TUint32* shapePtr32 = (reinterpret_cast<TUint32*>(&output->iBuffer[0]));
   369         for (i=0; i < output->iGlyphCount; i++)
   370             {
   371             TEST(*shapePtr32 == (*aTestData.iGlyphs)[i]);
   372             shapePtr32++;
   373             }
   374 
   375         // next iGlyphCount * 4 bytes contain the postions in which the glyphs should be drawn, x and y axes.
   376         // Compare against expected
   377         TUint16* shapePtr16 = (reinterpret_cast<TUint16*>(shapePtr32));
   378         for (i=0; i < output->iGlyphCount*2; i++)
   379             {
   380             //check X or Y position
   381             TEST(*shapePtr16 == (*aTestData.iPositions)[i]);
   382             shapePtr16++;
   383             }
   384 
   385         // check advance
   386         TEST(*shapePtr16 == aTestData.iAdvance.iX);
   387         shapePtr16++;
   388         TEST(*shapePtr16 == aTestData.iAdvance.iY);
   389         shapePtr16++;
   390 
   391         // next iGlyphCount * 2 bytes contain the coresponding indices of this character in the original string.
   392         // Compare against expected
   393         for (i=0; i < output->iGlyphCount; i++)
   394             {
   395             TEST(*shapePtr16 == (*aTestData.iIndices)[i]);
   396             shapePtr16++;
   397             }
   398         }
   399     
   400     CleanupStack::PopAndDestroy(output);
   401     }
   402 
   403 void CShapeTestStep::shapeText(CBitmapFont* font, CTestData& aTestData, TBool aCheckOutput)
   404     {
   405     __UHEAP_MARK;
   406     TInt heapSizeAtStart = 0;
   407     User::Heap().AllocSize(heapSizeAtStart);
   408     
   409     INFO_PRINTF2(_L("Heap memory utilized is now %d\n"), heapSizeAtStart);
   410 
   411     doShapeText(font, aTestData, aCheckOutput);
   412     // check the heap used by the shaper
   413     RHeap* heap = &User::Heap();
   414     heap->Check();
   415     TInt heapSizeAtEnd = 0;
   416     TInt heapCellsUsed = heap->AllocSize(heapSizeAtEnd);
   417     if (heapCellsUsed)
   418         {
   419         INFO_PRINTF2(_L("This test leaked %d\n"), heapSizeAtEnd - heapSizeAtStart);
   420         }
   421     __UHEAP_MARKEND;    
   422     }
   423 
   424 /**
   425 @file
   426 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-1480
   427 @SYMTestCaseDesc            Simple OOM test of shaper
   428 @SYMTestPriority            High
   429 @SYMTestActions             OOM testing for the shaper. Also ensures no leaks.
   430 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   431 @SYMPREQ                    PREQ18
   432 */
   433 void CShapeTestStep::oomShapeText(CBitmapFont* font, CTestData& aTestData)
   434     {
   435     __UHEAP_MARK;
   436     INFO_PRINTF1(_L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-1480 "));
   437     doOomShapeText(font,aTestData);     
   438     __UHEAP_MARKEND;
   439     }
   440 
   441 void CShapeTestStep::doOomShapeText(CBitmapFont* font, CTestData& aTestData)
   442     {
   443     TInt count = 0;
   444     TInt err = KErrNone;
   445     TInt heapCellsUsed, heapSizeAtEnd, heapSizeAtStart;
   446     CShaper* theShaper = NULL;  
   447     CShaperFactory* shaperFactory = NULL;
   448     TShapeHeader* output = NULL;
   449         
   450     User::Heap().AllocSize(heapSizeAtStart);
   451 
   452     // create the data to be shaped
   453     CShaper::TInput input;
   454     input.iText = aTestData.iTextInput;
   455     input.iStart = aTestData.iStart;
   456     input.iEnd = aTestData.iEnd;
   457 
   458     //set up shaper, shape, delete shaper in oom loop
   459     RImplInfoPtrArray implementationArray;
   460     TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
   461     CleanupStack::PushL(cleanup);
   462     TInt error;
   463     TInt ecomerror;
   464     TInt ecomnotready;
   465     TUid uid = {KUidShaperFactoryPlunginInterface};
   466 
   467     // Making sure that no race situation arises between FBserv and Ecom
   468     // If ECom is not ready, give it another chance and try again. if it still doesn't work 
   469     // after the third try, then it just carries on quietly and fails... 
   470     for (ecomnotready =0; ecomnotready <3; ecomnotready++)
   471         {
   472 
   473         TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
   474         if (!ecomerror)
   475             {
   476             break;
   477             }
   478         else
   479             {
   480             ecomerror = 0;  
   481             User::After(0);
   482             }
   483         }
   484 
   485     const TInt availCount = implementationArray.Count();
   486     for (TInt count=0;count<availCount;++count)
   487         {
   488         const CImplementationInformation* info = implementationArray[count];
   489         TUid shaperFactoryUid = info->ImplementationUid();
   490         // Create a shaper factory
   491         //CShaperFactory* shaperFactory = 0;
   492         TRAP(error,shaperFactory = CShaperFactory::NewL(shaperFactoryUid));
   493         test(error == KErrNone);
   494         //CleanupStack::PushL(shaperFactory);
   495         }
   496     CleanupStack::PopAndDestroy(&implementationArray);
   497 
   498     do
   499         {
   500         count += 1;
   501         __UHEAP_FAILNEXT(count);
   502     
   503         // Create a shaper
   504         TRAPD(err, theShaper = shaperFactory->NewShaperL(font, iScript, iLang, &User::Heap()));
   505         
   506         //shape text
   507         if (theShaper)
   508             {
   509             err = theShaper->ShapeText(output, input, &User::Heap());
   510             TEST(err == KErrNone);
   511             }
   512 
   513         //free output; to be done by the caller of ShapeText
   514         delete output;
   515         output = NULL;      
   516             
   517         //does not check the output for now
   518         delete theShaper;
   519         delete shaperFactory;
   520         REComSession::FinalClose();
   521         
   522         }while ((err==KErrNoMemory)||(err==KErrGeneral));
   523     __UHEAP_RESET;
   524 
   525     // check the heap used by the shaper
   526     RHeap* heap = &User::Heap();
   527     heap->Check();
   528     heapCellsUsed = heap->AllocSize(heapSizeAtEnd);
   529     if (heapCellsUsed)
   530         {
   531         INFO_PRINTF2(_L("This test leaked %d.\n"), heapSizeAtEnd - heapSizeAtStart);
   532         }
   533     }
   534 
   535 /**
   536 @file
   537 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-1481
   538 @SYMTestCaseDesc            Tests that the shaper can handle multiple calls to ShapeText
   539 @SYMTestPriority            High
   540 @SYMTestActions             Makes multiple calls to CShaper::ShapeText with small amounts of text to be shaped
   541 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   542 @SYMPREQ                    PREQ18
   543 */
   544 void CShapeTestStep::repeatShapeText(CBitmapFont* aFont, CTestData& aTestData)
   545     {
   546     __UHEAP_MARK;
   547     INFO_PRINTF1(_L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-1481 "));
   548     doRepeatShapeText(aFont, aTestData);
   549     __UHEAP_MARKEND;
   550     }
   551 
   552 void CShapeTestStep::doRepeatShapeText(CBitmapFont* font, CTestData& aTestData)
   553     {
   554     //set up the shaper
   555     CShaper* theShaper = NULL;
   556     CShaperFactory* shaperFactory = NULL;
   557 
   558     RImplInfoPtrArray implementationArray;
   559     TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
   560     CleanupStack::PushL(cleanup);
   561     
   562     TInt ecomerror;
   563     TInt ecomnotready;
   564     TUid uid = {KUidShaperFactoryPlunginInterface};
   565 
   566     // Making sure that no race situation arises between FBserv and Ecom
   567     // If ECom is not ready, give it another chance and try again. if it still doesn't work 
   568     // after the third try, then it just carries on quietly and fails... 
   569     for (ecomnotready =0; ecomnotready <3; ecomnotready++)
   570         {
   571 
   572         TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
   573         if (!ecomerror)
   574             {
   575             break;
   576             }
   577         else
   578             {
   579             ecomerror = 0;  
   580             User::After(0);
   581             }
   582         }
   583 
   584     const TInt availCount = implementationArray.Count();
   585     for (TInt count=0;count<availCount;++count)
   586         {
   587         const CImplementationInformation* info = implementationArray[count];
   588         TUid shaperFactoryUid = info->ImplementationUid();
   589         // Create a shaper factory
   590         TInt error;
   591         TRAP(error,shaperFactory = CShaperFactory::NewL(shaperFactoryUid));
   592         test(error == KErrNone);
   593         
   594         // Create a shaper
   595         TRAP(error, theShaper = shaperFactory->NewShaperL(font, iScript, iLang, &User::Heap()));
   596         if (error != KErrNone)
   597             {
   598             delete shaperFactory; 
   599             shaperFactory = NULL;
   600             }
   601         test(error == KErrNone);
   602         break; // have got valid shaper here
   603         }
   604     CleanupStack::PopAndDestroy(&implementationArray);
   605 
   606     CleanupStack::PushL(shaperFactory);
   607     CleanupStack::PushL(theShaper);
   608 
   609     // create the data to be shaped
   610     // this uses CTestData, defined in testData.h
   611     CShaper::TInput input;
   612     input.iText = aTestData.iTextInput;
   613 
   614     //create shape header, and shape the text
   615     TShapeHeader* output = NULL;
   616 
   617     for(TInt i=aTestData.iStart; i<aTestData.iEnd -10; i++)
   618         {
   619         //indicate which 10 chars to be shaped
   620         input.iStart = i;
   621         input.iEnd = i + 10;
   622         
   623         //shape text
   624         TInt err = theShaper->ShapeText(output, input, &User::Heap());
   625         test(err == KErrNone);
   626 
   627         //free output; to be done by the caller of ShapeText
   628         delete(output);
   629         output = NULL;      
   630         
   631         //does not check the output for now
   632         }
   633 
   634     //cleanup the shaper
   635     CleanupStack::PopAndDestroy(theShaper);
   636     CleanupStack::PopAndDestroy(shaperFactory);
   637     REComSession::FinalClose();
   638     }
   639     
   640 /*
   641 @file
   642 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-3401
   643 @SYMTestCaseDesc            Tests that the shaper can handle calls to shapeText with multiple font sizes
   644 @SYMTestPriority            High
   645 @SYMTestActions             Makes multiple calls to CShaper::ShapeText with small amounts of text to be shaped and incremental font sizes
   646 @SYMTestExpectedResults     The test must not show a memory leak at any font size
   647 @SYMPREQ                    DEF103042: TC_SHAP_shapeText test failing with alloc failure
   648 **/ 
   649 void CShapeTestStep::doRepeatShapeUsingVariousFontSizesTest(CFontStore* aFontStore, const TDesC aTypefaceName, const TDesC &aText1, 
   650                                                 const TDesC &aText2, const TDesC &aText3)
   651     {
   652     INFO_PRINTF1(_L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-3401 "));
   653     TInt heapCellsUsed, heapSizeAtEnd, heapSizeAtStart;
   654     User::Heap().AllocSize(heapSizeAtStart);
   655     
   656     // Set up shaper factory
   657     // Set up the shaper
   658     CShaper* theShaper = NULL;
   659     CShaperFactory* shaperFactory = NULL;
   660 
   661     RImplInfoPtrArray implementationArray;
   662     TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
   663     CleanupStack::PushL(cleanup);
   664     TInt err;
   665     TInt ecomerror;
   666     TInt ecomnotready;
   667     TUid uid = {KUidShaperFactoryPlunginInterface};
   668 
   669     // Making sure that no race situation arises between FBserv and Ecom
   670     // If ECom is not ready, give it another chance and try again. if it still doesn't work 
   671     // after the third try, then it just carries on quietly and fails... 
   672     for (ecomnotready =0; ecomnotready <3; ecomnotready++)
   673         {
   674         TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
   675         if (!ecomerror)
   676             {
   677             break;
   678             }
   679         else
   680             {
   681             ecomerror = 0;  
   682             User::After(0);
   683             }
   684         }
   685 
   686     const TInt availCount = implementationArray.Count();
   687     for (TInt count=0;count<availCount;++count)
   688         {
   689         const CImplementationInformation* info = implementationArray[count];
   690         TUid shaperFactoryUid = info->ImplementationUid();
   691         // Create a shaper factory
   692         TRAPD(error,shaperFactory = CShaperFactory::NewL(shaperFactoryUid));
   693         test(error == KErrNone);
   694         }
   695     
   696     CleanupStack::PopAndDestroy(&implementationArray);
   697     
   698     CleanupStack::PushL(shaperFactory);
   699     
   700     // create the data to be shaped
   701     // this explicitely uses hindiTestData, defined in testData.h
   702     CShaper::TInput input;
   703     input.iStart = 0;
   704     
   705     //create shape header, and shape the text
   706     TShapeHeader* output = NULL;
   707     
   708     CBitmapFont* font;
   709     
   710     // Test shaping for the Hindi texts for various font sizes
   711     INFO_PRINTF1(_L("Generating a random initial font size between 0 and 1 for this test\n"));
   712     TInt random = (Math::Random()>>11)%2;
   713     INFO_PRINTF2(_L("Random initial font size is %d. Testing upto size 300 with increments of 2\n"), random);
   714     for (TInt i = random; i <= 300; i+=2)
   715         {
   716         INFO_PRINTF2(_L("Font Size: %d\n"), i);
   717         if (i == 294 || i == 295)
   718             {
   719         INFO_PRINTF2(_L("Font Size: %d\n"), i);
   720             }
   721         TFontSpec fontSpec(aTypefaceName,i*20); 
   722         aFontStore->GetNearestFontInTwips((CFont*&)font, fontSpec); 
   723         CleanupStack::PushL(font);  
   724 
   725         TRAP(err, theShaper = shaperFactory->NewShaperL(font, iScript, iLang, &User::Heap()));
   726         test(err == KErrNone);
   727         CleanupStack::PushL(theShaper);
   728         
   729         // Call the shaper twice because the first time the rasterizer uses memory to cache the tables
   730         // We can then check the heap in the second call
   731         input.iText = &aText1;
   732         input.iEnd = aText1.Length();
   733         err = theShaper->ShapeText(output, input, &User::Heap());
   734         delete output;
   735         TEST(err == KErrNone);
   736         __UHEAP_MARK;
   737         err = theShaper->ShapeText(output, input, &User::Heap());
   738         delete output;
   739         __UHEAP_MARKEND;
   740         TEST(err == KErrNone);
   741                 
   742         input.iText = &aText2;
   743         input.iEnd = aText2.Length();
   744         err = theShaper->ShapeText(output, input, &User::Heap());
   745         delete output;
   746         TEST(err == KErrNone);
   747         __UHEAP_MARK;
   748         err = theShaper->ShapeText(output, input, &User::Heap());
   749         delete output;
   750         __UHEAP_MARKEND;
   751         TEST(err == KErrNone);
   752         
   753         input.iText = &aText3;
   754         input.iEnd = aText3.Length();
   755         err = theShaper->ShapeText(output, input, &User::Heap());
   756         delete output;
   757         TEST(err == KErrNone);
   758 //        __UHEAP_MARK;
   759         err = theShaper->ShapeText(output, input, &User::Heap());
   760         delete output;
   761 //        __UHEAP_MARKEND;
   762         TEST(err == KErrNone);
   763         
   764         CleanupStack::PopAndDestroy(theShaper);
   765         CleanupStack::Pop(font);   
   766         aFontStore->ReleaseFont(font);
   767         }
   768         
   769     CleanupStack::PopAndDestroy(shaperFactory);
   770 
   771     //close the ecom session opened by LoadOpenFontLibraries()
   772     REComSession::FinalClose();
   773     
   774     // check the heap used by the shaper
   775     RHeap* heap = &User::Heap();
   776     heap->Check();
   777     heapCellsUsed = heap->AllocSize(heapSizeAtEnd);
   778     if (heapCellsUsed)
   779         {
   780         INFO_PRINTF2(_L("This test utilised %d bytes\n"), heapSizeAtEnd - heapSizeAtStart);
   781         }
   782     }
   783 
   784 /**
   785 @file
   786 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-3403
   787 @SYMTestCaseDesc            Tests the shaper using Devanagari Unicode. Test include OOM tests (oomShapeText), repeated 
   788                             calls to the shaper (repeatShapeText), simple shaping tests (shapeText), and repeatedly 
   789                             calling the shaper with incremental font sizes.
   790 @SYMTestPriority            High
   791 @SYMTestActions             Performs various tests of the the shaper, calling CShaper::ShapeText in various use cases
   792 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   793 @SYMPREQ                    PREQ19
   794 */
   795 /**
   796 @file
   797 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-3383-0001
   798 @SYMTestCaseDesc            Tests the shaper using Kannada Unicode. Test include OOM tests (oomShapeText), repeated 
   799                             calls to the shaper (repeatShapeText), simple shaping tests (shapeText), and repeatedly 
   800                             calling the shaper with incremental font sizes.
   801 @SYMTestPriority            High
   802 @SYMTestActions             Performs various tests of the the shaper, calling CShaper::ShapeText in various use cases
   803 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   804 @SYMPREQ                    PREQ19
   805 */  
   806 /**
   807 @file
   808 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-3383-0002
   809 @SYMTestCaseDesc            Tests the shaper using Gujarati Unicode. Test include OOM tests (oomShapeText), repeated 
   810                             calls to the shaper (repeatShapeText), simple shaping tests (shapeText), and repeatedly 
   811                             calling the shaper with incremental font sizes.
   812 @SYMTestPriority            High
   813 @SYMTestActions             Performs various tests of the the shaper, calling CShaper::ShapeText in various use cases
   814 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   815 @SYMPREQ                    PREQ19
   816 */  
   817 /**
   818 @file
   819 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-4001
   820 @SYMTestCaseDesc            Tests the shaper using Bengali Unicode. Test include OOM tests (oomShapeText), repeated 
   821                             calls to the shaper (repeatShapeText), simple shaping tests (shapeText), and repeatedly 
   822                             calling the shaper with incremental font sizes.
   823 @SYMTestPriority            High
   824 @SYMTestActions             Performs various tests of the the shaper, calling CShaper::ShapeText in various use cases
   825 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   826 @SYMPREQ                    PREQ1766
   827 @SYMREQ                     REQ8741
   828 */  
   829 /**
   830 @file
   831 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-4002
   832 @SYMTestCaseDesc            Tests the shaper using Tamil Unicode. Test include OOM tests (oomShapeText), repeated 
   833                             calls to the shaper (repeatShapeText), simple shaping tests (shapeText), and repeatedly 
   834                             calling the shaper with incremental font sizes.
   835 @SYMTestPriority            High
   836 @SYMTestActions             Performs various tests of the the shaper, calling CShaper::ShapeText in various use cases
   837 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   838 @SYMPREQ                    PREQ1766
   839 @SYMREQ                     REQ8742
   840 */  
   841 /**
   842 @file
   843 @SYMTestCaseID              GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-4003
   844 @SYMTestCaseDesc            Tests the shaper using Telugu Unicode. Test include OOM tests (oomShapeText), repeated 
   845                             calls to the shaper (repeatShapeText), simple shaping tests (shapeText), and repeatedly 
   846                             calling the shaper with incremental font sizes.
   847 @SYMTestPriority            High
   848 @SYMTestActions             Performs various tests of the the shaper, calling CShaper::ShapeText in various use cases
   849 @SYMTestExpectedResults     The test must exit cleanly and there should not be any User:84 errors, KERN-EXEC's or any memory leaks.
   850 @SYMPREQ                    PREQ1766
   851 @SYMREQ                     REQ8743
   852 */
   853 /**
   854 @SYMTestCaseID              GRAPHICS-TI18N-ICULAYOUTENGINE-CT-4007
   855 @SYMTestCaseDesc            Case to do Gurmukhi component test
   856                             It covers all Iculayout components cases
   857 @SYMTestPriority            High
   858 @SYMTestActions             Iterate Gurmukhi test data, each test data corresponds with a case
   859 @SYMTestExpectedResults     No error returned
   860 @SYMPREQ                    1922: Gurmukhi support
   861 */
   862 /**
   863 @SYMTestCaseID              GRAPHICS-TI18N-ICULAYOUTENGINE-CT-4008
   864 @SYMTestCaseDesc            Case to do Malayalam component test
   865                             It covers all Iculayout components cases
   866 @SYMTestPriority            High
   867 @SYMTestActions             Iterate Malayalam test data, each test data corresponds with a case
   868 @SYMTestExpectedResults     No error returned
   869 @SYMPREQ                    1922: Malayalam support
   870 */
   871 void CShapeTestStep::ShapeTestL()
   872     {
   873     INFO_PRINTF1(iTestID);
   874 
   875     CBitmapFont* font;
   876     TInt err=KErrNone;  
   877     //the font store can use the normal user heap
   878     CFontStore* fontStore = CFontStore::NewL(&User::Heap());    
   879     fontStore->iKPixelWidthInTwips = 11860;
   880     fontStore->iKPixelHeightInTwips = 11860;
   881     CleanupStack::PushL(fontStore);
   882 
   883     //load all ecom implemented rasterizer dlls. installs the rasterizer.
   884     LoadOpenFontLibraries(fontStore);
   885     
   886     //add the required font file
   887     TRAP(err,fontStore->AddFileL(iTestDataArr[iTestDataIndex]->iFilename));
   888     test(err == KErrNone);        
   889     
   890     
   891     //run all tests for TNR_Dev_OT test, which is at position 0 in the aTestDataArr
   892     TFontSpec fontSpec(iTestDataArr[iTestDataIndex]->iTypeFaceName,12);    
   893     fontStore->GetNearestFontToDesignHeightInPixels((CFont*&)font, fontSpec);   
   894     CleanupStack::PushL(font);  
   895     
   896     INFO_PRINTF2(_L("Repeat %S text shaping test\n"), &iScriptName);
   897     doRepeatShapeText(font, *iTestDataArr[iTestDataIndex]);
   898     repeatShapeText(font, *iTestDataArr[iTestDataIndex]);
   899     
   900     INFO_PRINTF2(_L("OOM %S text shaping test\n"), &iScriptName);
   901 #if defined(_DEBUG)
   902     doOomShapeText(font, *iTestDataArr[iTestDataIndex]);
   903     oomShapeText(font, *iTestDataArr[iTestDataIndex]);
   904 #else
   905     INFO_PRINTF1(_L("This test is ignored for release version\n"));
   906 #endif
   907     
   908     INFO_PRINTF2(_L("Run simple %S shape test\n"), &iScriptName);
   909     doShapeText(font, *iTestDataArr[iTestDataIndex], ETrue);
   910     shapeText(font, *iTestDataArr[iTestDataIndex], ETrue);
   911 
   912     CleanupStack::Pop(font);   
   913     fontStore->ReleaseFont(font);
   914 
   915     //for any other test data we have, run the simple shape text test only
   916     for(TInt i=iTestDataIndex+1; i<iTestDataIndex+iNumberOfTestDataFiles; i++)
   917         {
   918         TFontSpec fontSpec(iTestDataArr[i]->iTypeFaceName,12);  
   919         fontStore->GetNearestFontToDesignHeightInPixels((CFont*&)font, fontSpec);   
   920         CleanupStack::PushL(font);
   921         
   922         // First run does not check heap... this ensures that any memory
   923         // stashed by the rasterizer does not show up as a leak.
   924         doShapeText(font, *iTestDataArr[i], ETrue);
   925         shapeText(font, *iTestDataArr[i], ETrue);
   926 
   927         CleanupStack::Pop(font);
   928         fontStore->ReleaseFont(font);
   929         }
   930         
   931     // Now do the last test, the shaping test using various font sizes
   932     INFO_PRINTF2(_L("Repeat %S shaping test using font sizes 20 to 6000\n"), &iScriptName);    
   933     if(iScriptName == KTestStep_Hindi)
   934         {
   935         doRepeatShapeUsingVariousFontSizesTest(fontStore, iTestDataArr[0]->iTypeFaceName, KHindi1, KHindi2, KHindi3);
   936         }
   937     else if(iScriptName == KTestStep_Kannada)
   938         {
   939         doRepeatShapeUsingVariousFontSizesTest(fontStore, iTestDataArr[0]->iTypeFaceName, KKannada1, KKannada2, KKannada3);
   940         }
   941     else if(iScriptName == KTestStep_Gujarati)
   942         {
   943         doRepeatShapeUsingVariousFontSizesTest(fontStore, iTestDataArr[0]->iTypeFaceName, KGujarati1, KGujarati2, KGujarati3);
   944         }
   945     else if(iScriptName == KTestStep_Bengali)
   946         {
   947         doRepeatShapeUsingVariousFontSizesTest(fontStore, iTestDataArr[0]->iTypeFaceName, KBengali1, KBengali2, KBengali3);
   948         }
   949     else if(iScriptName == KTestStep_Tamil)
   950         {
   951         doRepeatShapeUsingVariousFontSizesTest(fontStore, iTestDataArr[0]->iTypeFaceName, KTamil1, KTamil2, KTamil3);
   952         }
   953     else if(iScriptName == KTestStep_Telugu)
   954         {
   955         doRepeatShapeUsingVariousFontSizesTest(fontStore, iTestDataArr[0]->iTypeFaceName, KTelugu1, KTelugu2, KTelugu3);
   956         }
   957     else if(iScriptName == KTestStep_Gurmukhi)
   958         {
   959         doRepeatShapeUsingVariousFontSizesTest(fontStore, iTestDataArr[0]->iTypeFaceName, KGurmukhi1, KGurmukhi2, KGurmukhi3);
   960         }
   961     else if(iScriptName == KTestStep_Malayalam)
   962         {
   963         doRepeatShapeUsingVariousFontSizesTest(fontStore, iTestDataArr[0]->iTypeFaceName, KMalayalam1, KMalayalam2, KMalayalam3);
   964         }
   965 
   966     CleanupStack::PopAndDestroy(fontStore);
   967     REComSession::FinalClose(); //close the ecom session opened by LoadOpenFontLibraries()
   968     }
   969     
   970 TVerdict CShapeTestStep::doTestStepL()
   971     {
   972     SetTestStepResult(EFail);
   973 
   974     __UHEAP_MARK;
   975 
   976     TRAPD(error0, SetupTestDataL());
   977     
   978     if(error0 == KErrNone)
   979         {
   980         TRAPD(error1, ShapeTestL());
   981         
   982         if(error1 == KErrNone)
   983             {
   984             SetTestStepResult(EPass);
   985             }
   986         }
   987     else
   988         {
   989         ERR_PRINTF1(_L("Failed to setup test data."));
   990         }
   991     
   992     iTestDataArr.ResetAndDestroy(); // close the iTestDataArr opened by SetupTestData()        
   993 
   994     __UHEAP_MARKEND;
   995 
   996     return TestStepResult();
   997     }
   998 
   999 CTestStep * CShapeTestStep::CreateShapeTestStep(const TDesC& aStepName)
  1000     {
  1001     if(aStepName == KTestStep_Hindi)
  1002         {
  1003         return new CShapeTestStep(KHindiTestDataIndex, KNumberOfHindiTestDataFiles, KDevanagariScriptCode, KHindiLanguageCode,
  1004                 aStepName, _L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-3403 "));
  1005         }
  1006     else if(aStepName == KTestStep_Kannada)
  1007         {
  1008         return new CShapeTestStep(KKannadaTestDataIndex, KNumberOfKannadaTestDataFiles, KKannadaScriptCode, KKannadaLanguageCode,
  1009                 aStepName, _L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-3383-0001"));
  1010         }
  1011     else if(aStepName == KTestStep_Gujarati)
  1012         {
  1013         return new CShapeTestStep(KGujaratiTestDataIndex, KNumberOfGujaratiTestDataFiles, KGujaratiScriptCode, KGujaratiLanguageCode,
  1014                 aStepName, _L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-3383-0002"));
  1015         }
  1016     else if(aStepName == KTestStep_Bengali)
  1017         {
  1018         return new CShapeTestStep(KBengaliTestDataIndex, KNumberOfBengaliTestDataFiles, KBengaliScriptCode, KBengaliLanguageCode,
  1019                 aStepName, _L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-4001"));
  1020         }
  1021     else if(aStepName == KTestStep_Tamil)
  1022         {
  1023         return new CShapeTestStep(KTamilTestDataIndex, KNumberOfTamilTestDataFiles, KTamilScriptCode, KTamilLanguageCode,
  1024                 aStepName, _L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-4002"));
  1025         }
  1026     else if(aStepName == KTestStep_Telugu)
  1027         {
  1028         return new CShapeTestStep(KTeluguTestDataIndex, KNumberOfTeluguTestDataFiles, KTeluguScriptCode, KTeluguLanguageCode,
  1029                 aStepName, _L("GRAPHICS-SYSLIB-ICULAYOUTENGINE-CT-4003"));
  1030         }
  1031     else if(aStepName == KTestStep_Gurmukhi)
  1032         {
  1033         return new CShapeTestStep(KGurmukhiTestDataIndex, KNumberOfGurmukhiTestDataFiles, KGurmukhiScriptCode, KGurmukhiLanguageCode,
  1034                 aStepName, _L("GRAPHICS-TI18N-ICULAYOUTENGINE-CT-4007"));
  1035         }
  1036     else if(aStepName == KTestStep_Malayalam)
  1037         {
  1038         return new CShapeTestStep(KMalayalamTestDataIndex, KNumberOfMalayalamTestDataFiles, KMalayalamScriptCode, KMalayalamLanguageCode,
  1039                 aStepName, _L("GRAPHICS-TI18N-ICULAYOUTENGINE-CT-4007"));
  1040         }
  1041     return NULL;    
  1042     }