diff -r 28839de615b4 -r 26645d81f48d persistentstorage/sqlite3api/TEST/t_sqliteperf.cpp --- a/persistentstorage/sqlite3api/TEST/t_sqliteperf.cpp Thu Aug 19 11:36:21 2010 +0300 +++ b/persistentstorage/sqlite3api/TEST/t_sqliteperf.cpp Tue Aug 31 16:57:14 2010 +0300 @@ -18,11 +18,13 @@ #include #include #include +#include "sqliteTestUtl.h" #include "t_sqliteperf.h" /////////////////////////////////////////////////////////////////////////////////////// -static RTest TheTest(_L("t_sqliteperf test")); +const char* const KTestName = "t_sqliteperf test"; + _LIT(KTestDir, "c:\\test\\"); _LIT(KTestDbName, "c:\\test\\t_sqliteperf.db"); _LIT8(KTestDbName8, "c:\\test\\t_sqliteperf.db\x0"); @@ -65,37 +67,11 @@ /////////////////////////////////////////////////////////////////////////////////////// -extern "C" void TestAbort(TInt aLine) - { - TheTest(0, aLine); - } - extern "C" const char* TestDbName(void) { return (const char*)KTestDbName8().Ptr(); } -extern "C" void PrintS(const char* aFmt, const char* aMsg) - { - TheSqlBuf.Format(TPtrC8((const TUint8*)aFmt), aMsg); - ThePrintBuf.Copy(TheSqlBuf); - TheTest.Printf(ThePrintBuf); - } - -extern "C" void PrintI(const char* aFmt, int a1) - { - TheSqlBuf.Format(TPtrC8((const TUint8*)aFmt), a1); - ThePrintBuf.Copy(TheSqlBuf); - TheTest.Printf(ThePrintBuf); - } - -extern "C" void PrintIII(const char* aFmt, int a1, int a2, int a3) - { - TheSqlBuf.Format(TPtrC8((const TUint8*)aFmt), a1, a2, a3); - ThePrintBuf.Copy(TheSqlBuf); - TheTest.Printf(ThePrintBuf); - } - static void DeleteTestFiles() { TheDb.Close(); @@ -109,7 +85,7 @@ if(!aValue) { DeleteTestFiles(); - TheTest(EFalse, aLine); + TestTestLine(EFalse, aLine); } } static void Check(TInt aValue, TInt aExpected, TInt aLine) @@ -118,7 +94,7 @@ { DeleteTestFiles(); RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue); - TheTest(EFalse, aLine); + TestTestLine(EFalse, aLine); } } #define TEST(arg) ::Check((arg), __LINE__) @@ -175,7 +151,9 @@ static void GetFastCounterFrequency() { TEST2(HAL::Get(HAL::EFastCounterFrequency, TheCounterFreq), KErrNone); - TheTest.Printf(_L("Counter frequency=%d\r\n"), TheCounterFreq); + TBuf8<32> printString; + printString.Format(_L8("Counter frequency=%d\r\n"), TheCounterFreq); + TestPrintf((const char*)printString.PtrZ()); } extern "C" unsigned int FastCounterValue(void) @@ -193,62 +171,71 @@ static void PrintPerfTestResults() { + TBuf8<256> printString; TInt r1 = FcDiff2Us(ThePerfTestResult[EPerfTestSqlMode] [EPerfTestMultiInsert]); TInt r2 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteSqlMode] [EPerfTestMultiInsert]); TInt r3 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteDefaultMode][EPerfTestMultiInsert]); TInt r4 = (TInt)((Abs(r2 - r1) * 100.0) / r1); TInt r5 = (TInt)((Abs(r3 - r1) * 100.0) / r1); - TheTest.Printf(_L("### SQL SQLITE-SQL SQLITE-DEFAULT\r\n")); - TheTest.Printf(_L("###Mutli Insert: %8dus %8dus %8dus %8d%% %8d%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf("### SQL SQLITE-SQL SQLITE-DEFAULT\r\n"); + printString.Format(_L8("###Multi Insert: %8dus %8dus %8dus %8d%%%% %8d%%%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf((const char*)printString.PtrZ()); r1 = FcDiff2Us(ThePerfTestResult[EPerfTestSqlMode] [EPerfTestMultiUpdate]); r2 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteSqlMode] [EPerfTestMultiUpdate]); r3 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteDefaultMode][EPerfTestMultiUpdate]); r4 = (TInt)((Abs(r2 - r1) * 100.0) / r1); r5 = (TInt)((Abs(r3 - r1) * 100.0) / r1); - TheTest.Printf(_L("###Mutli Update: %8dus %8dus %8dus %8d%% %8d%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + printString.Format(_L8("###Multi Update: %8dus %8dus %8dus %8d%%%% %8d%%%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf((const char*)printString.PtrZ()); r1 = FcDiff2Us(ThePerfTestResult[EPerfTestSqlMode] [EPerfTestMultiDelete]); r2 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteSqlMode] [EPerfTestMultiDelete]); r3 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteDefaultMode][EPerfTestMultiDelete]); r4 = (TInt)((Abs(r2 - r1) * 100.0) / r1); r5 = (TInt)((Abs(r3 - r1) * 100.0) / r1); - TheTest.Printf(_L("###Mutli Delete: %8dus %8dus %8dus %8d%% %8d%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + printString.Format(_L8("###Multi Delete: %8dus %8dus %8dus %8d%%%% %8d%%%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf((const char*)printString.PtrZ()); r1 = FcDiff2Us(ThePerfTestResult[EPerfTestSqlMode] [EPerfTestMultiSelect]); r2 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteSqlMode] [EPerfTestMultiSelect]); r3 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteDefaultMode][EPerfTestMultiSelect]); r4 = (TInt)((Abs(r2 - r1) * 100.0) / r1); r5 = (TInt)((Abs(r3 - r1) * 100.0) / r1); - TheTest.Printf(_L("###Mutli Select: %8dus %8dus %8dus %8d%% %8d%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + printString.Format(_L8("###Multi Select: %8dus %8dus %8dus %8d%%%% %8d%%%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf((const char*)printString.PtrZ()); r1 = FcDiff2Us(ThePerfTestResult[EPerfTestSqlMode] [EPerfTestSingleInsert]); r2 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteSqlMode] [EPerfTestSingleInsert]); r3 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteDefaultMode][EPerfTestSingleInsert]); r4 = (TInt)((Abs(r2 - r1) * 100.0) / r1); r5 = (TInt)((Abs(r3 - r1) * 100.0) / r1); - TheTest.Printf(_L("##Single Insert: %8dus %8dus %8dus %8d%% %8d%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + printString.Format(_L8("##Single Insert: %8dus %8dus %8dus %8d%%%% %8d%%%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf((const char*)printString.PtrZ()); r1 = FcDiff2Us(ThePerfTestResult[EPerfTestSqlMode] [EPerfTestSingleUpdate]); r2 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteSqlMode] [EPerfTestSingleUpdate]); r3 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteDefaultMode][EPerfTestSingleUpdate]); r4 = (TInt)((Abs(r2 - r1) * 100.0) / r1); r5 = (TInt)((Abs(r3 - r1) * 100.0) / r1); - TheTest.Printf(_L("##Single Update: %8dus %8dus %8dus %8d%% %8d%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + printString.Format(_L8("##Single Update: %8dus %8dus %8dus %8d%%%% %8d%%%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf((const char*)printString.PtrZ()); r1 = FcDiff2Us(ThePerfTestResult[EPerfTestSqlMode] [EPerfTestSingleDelete]); r2 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteSqlMode] [EPerfTestSingleDelete]); r3 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteDefaultMode][EPerfTestSingleDelete]); r4 = (TInt)((Abs(r2 - r1) * 100.0) / r1); r5 = (TInt)((Abs(r3 - r1) * 100.0) / r1); - TheTest.Printf(_L("##Single Delete: %8dus %8dus %8dus %8d%% %8d%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + printString.Format(_L8("##Single Delete: %8dus %8dus %8dus %8d%%%% %8d%%%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf((const char*)printString.PtrZ()); r1 = FcDiff2Us(ThePerfTestResult[EPerfTestSqlMode] [EPerfTestSingleSelect]); r2 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteSqlMode] [EPerfTestSingleSelect]); r3 = FcDiff2Us(ThePerfTestResult[EPerfTestSqliteDefaultMode][EPerfTestSingleSelect]); r4 = (TInt)((Abs(r2 - r1) * 100.0) / r1); r5 = (TInt)((Abs(r3 - r1) * 100.0) / r1); - TheTest.Printf(_L("##Single Select: %8dus %8dus %8dus %8d%% %8d%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + printString.Format(_L8("##Single Select: %8dus %8dus %8dus %8d%%%% %8d%%%%\r\n"), r1, r2, r3, r2 > r1 ? -r4 : +r4, r3 > r1 ? -r5 : +r5); + TestPrintf((const char*)printString.PtrZ()); } /////////////////////////////////////////////////////////////////////////////////////// @@ -300,7 +287,7 @@ */ static void SqlServerMultiInsertTest(const char aInsertSql[], TInt aInsertRecCnt) { - TheTest.Next( _L(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4010 ")); + TestNext(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4010 "); (void)KillProcess(KSqlSrvName); TInt err = TheDb.Open(KTestDbName); @@ -357,7 +344,7 @@ */ static void SqlServerMultiUpdateTest(const char aUpdateSql[], TInt aUpdateRecIds[], TInt aUpdateRecCnt) { - TheTest.Next( _L(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4011 ")); + TestNext(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4011 "); (void)KillProcess(KSqlSrvName); TInt err = TheDb.Open(KTestDbName); @@ -385,7 +372,7 @@ */ static void SqlServerMultiDeleteTest(const char aDeleteSql[], TInt aDeleteRecIds[], TInt aDeleteRecCnt) { - TheTest.Next( _L(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4012 ")); + TestNext(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4012 "); (void)KillProcess(KSqlSrvName); TInt err = TheDb.Open(KTestDbName); @@ -413,7 +400,7 @@ */ static void SqlServerMultiSelectTest(const char aSelectSql[], TInt aSelectRecIds[], TInt aSelectRecCnt) { - TheTest.Next( _L(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4013 ")); + TestNext(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4013 "); (void)KillProcess(KSqlSrvName); TInt err = TheDb.Open(KTestDbName); @@ -462,7 +449,7 @@ */ static void SqlServerSingleInsertTest(const char aSingleInsertSql[], TInt aInsertRecId) { - TheTest.Next( _L(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4014 ")); + TestNext(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4014 "); (void)KillProcess(KSqlSrvName); TInt err = TheDb.Open(KTestDbName); @@ -489,7 +476,7 @@ */ static void SqlServerSingleUpdateTest(const char aSingleUpdateSql[], TInt aUpdateRecId) { - TheTest.Next( _L(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4015 ")); + TestNext(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4015 "); (void)KillProcess(KSqlSrvName); TInt err = TheDb.Open(KTestDbName); @@ -517,7 +504,7 @@ */ static void SqlServerSingleDeleteTest(const char aSingleDeleteSql[], TInt aDeleteRecId) { - TheTest.Next( _L(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4016 ")); + TestNext(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4016 "); (void)KillProcess(KSqlSrvName); TInt err = TheDb.Open(KTestDbName); @@ -545,7 +532,7 @@ */ static void SqlServerSingleSelectTest(const char aSingleSelectSql[], TInt aSelectRecId) { - TheTest.Next( _L(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4017 ")); + TestNext(" @SYMTestCaseID:SYSLIB-SQLITE3-UT-4017 "); (void)KillProcess(KSqlSrvName); TInt err = TheDb.Open(KTestDbName); @@ -589,37 +576,38 @@ static void DoSqlServerTests() { - TheTest.Next(_L("SQL: Create the test database")); + TestNext("SQL: Create the test database"); CreateTestDatabase(); - TBuf<100> msgbuf; + TBuf8<100> msgbuf; - msgbuf.Format(_L("SQL: insert %d records in a single transaction"), KInsertRecCnt); - TheTest.Next(msgbuf); + msgbuf.Format(_L8("SQL: insert %d records in a single transaction"), KInsertRecCnt); + TestNext((const char*)msgbuf.PtrZ()); SqlServerMultiInsertTest(KMultiInsertSql, KInsertRecCnt); - msgbuf.Format(_L("SQL: update %d records in a single transaction"), KUpdateRecCnt); - TheTest.Next(msgbuf); + msgbuf.Format(_L8("SQL: update %d records in a single transaction"), KUpdateRecCnt); + TestNext((const char*)msgbuf.PtrZ()); SqlServerMultiUpdateTest(KMultiUpdateSql, TheUpdateRecIds, KUpdateRecCnt); - msgbuf.Format(_L("SQL: delete %d records in a single transaction"), KDeleteRecCnt); - TheTest.Next(msgbuf); + msgbuf.Format(_L8("SQL: delete %d records in a single transaction"), KDeleteRecCnt); + TestNext((const char*)msgbuf.PtrZ()); SqlServerMultiDeleteTest(KMultiDeleteSql, TheDeleteRecIds, KDeleteRecCnt); - msgbuf.Format(_L("SQL: select %d records"), KSelectRecCnt); - TheTest.Next(msgbuf); + msgbuf.Format(_L8("SQL: select %d records"), KSelectRecCnt); + msgbuf.Copy(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqlServerMultiSelectTest(KMultiSelectSql, TheSelectRecIds, KSelectRecCnt); - TheTest.Next(_L("SQL: insert a single record")); + TestNext("SQL: insert a single record"); SqlServerSingleInsertTest(KSingleInsertSql, TheInsertRecId); - TheTest.Next(_L("SQL: update a single record")); + TestNext("SQL: update a single record"); SqlServerSingleUpdateTest(KSingleUpdateSql, TheUpdateRecId); - TheTest.Next(_L("SQL: delete a single record")); + TestNext("SQL: delete a single record"); SqlServerSingleDeleteTest(KSingleDeleteSql, TheDeleteRecId); - TheTest.Next(_L("SQL: select a single record")); + TestNext("SQL: select a single record"); SqlServerSingleSelectTest(KSingleSelectSql, TheSelectRecId); (void)RSqlDatabase::Delete(KTestDbName); @@ -631,51 +619,51 @@ SqliteInitialize(aPerfTestMode); - TheTest.Next( _L("SQLite: Create the test database")); + TestNext("SQLite: Create the test database"); CreateTestDatabase(); - TBuf<200> msgbuf; - _LIT(KSqliteConfigSql, "\"SQL\""); - _LIT(KSqliteConfigDefault, "\"Default\""); + TBuf8<200> msgbuf; + _LIT8(KSqliteConfigSql, "\"SQL\""); + _LIT8(KSqliteConfigDefault, "\"Default\""); - msgbuf.Format(_L("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4018: SQLite, configuration: %S: insert %d records in a single transaction"), + msgbuf.Format(_L8("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4018: SQLite, configuration: %S: insert %d records in a single transaction"), aPerfTestMode == EPerfTestSqliteSqlMode ? &KSqliteConfigSql : &KSqliteConfigDefault, KInsertRecCnt); - TheTest.Next(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqliteMultiInsertTest(aPerfTestMode, KMultiInsertSql, KInsertRecCnt); - msgbuf.Format(_L("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4019: SQLite, configuration: %S: update %d records in a single transaction"), + msgbuf.Format(_L8("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4019: SQLite, configuration: %S: update %d records in a single transaction"), aPerfTestMode == EPerfTestSqliteSqlMode ? &KSqliteConfigSql : &KSqliteConfigDefault, KUpdateRecCnt); - TheTest.Next(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqliteMultiUpdateTest(aPerfTestMode, KMultiUpdateSql, TheUpdateRecIds, KUpdateRecCnt); - msgbuf.Format(_L("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4020: SQLite, configuration: %S: delete %d records in a single transaction"), + msgbuf.Format(_L8("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4020: SQLite, configuration: %S: delete %d records in a single transaction"), aPerfTestMode == EPerfTestSqliteSqlMode ? &KSqliteConfigSql : &KSqliteConfigDefault, KDeleteRecCnt); - TheTest.Next(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqliteMultiDeleteTest(aPerfTestMode, KMultiDeleteSql, TheDeleteRecIds, KDeleteRecCnt); - msgbuf.Format(_L("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4021: SQLite, configuration: %S: select %d records"), + msgbuf.Format(_L8("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4021: SQLite, configuration: %S: select %d records"), aPerfTestMode == EPerfTestSqliteSqlMode ? &KSqliteConfigSql : &KSqliteConfigDefault, KSelectRecCnt); - TheTest.Next(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqliteMultiSelectTest(aPerfTestMode, KMultiSelectSql, TheSelectRecIds, KSelectRecCnt); - msgbuf.Format(_L("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4022: SQLite, configuration: %S: insert a single record"), + msgbuf.Format(_L8("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4022: SQLite, configuration: %S: insert a single record"), aPerfTestMode == EPerfTestSqliteSqlMode ? &KSqliteConfigSql : &KSqliteConfigDefault); - TheTest.Next(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqliteSingleInsertTest(aPerfTestMode, KSingleInsertSql, TheInsertRecId); - msgbuf.Format(_L("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4023: SQLite, configuration: %S: update a single record"), + msgbuf.Format(_L8("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4023: SQLite, configuration: %S: update a single record"), aPerfTestMode == EPerfTestSqliteSqlMode ? &KSqliteConfigSql : &KSqliteConfigDefault); - TheTest.Next(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqliteSingleUpdateTest(aPerfTestMode, KSingleUpdateSql, TheUpdateRecId); - msgbuf.Format(_L("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4024: SQLite, configuration: %S: delete a single record"), + msgbuf.Format(_L8("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4024: SQLite, configuration: %S: delete a single record"), aPerfTestMode == EPerfTestSqliteSqlMode ? &KSqliteConfigSql : &KSqliteConfigDefault); - TheTest.Next(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqliteSingleDeleteTest(aPerfTestMode, KSingleDeleteSql, TheDeleteRecId); - msgbuf.Format(_L("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4025: SQLite, configuration: %S: select a single record"), + msgbuf.Format(_L8("@SYMTestCaseID:SYSLIB-SQLITE3-UT-4025: SQLite, configuration: %S: select a single record"), aPerfTestMode == EPerfTestSqliteSqlMode ? &KSqliteConfigSql : &KSqliteConfigDefault); - TheTest.Next(msgbuf); + TestNext((const char*)msgbuf.PtrZ()); SqliteSingleSelectTest(aPerfTestMode, KSingleSelectSql, TheSelectRecId); (void)RSqlDatabase::Delete(KTestDbName); @@ -819,13 +807,13 @@ static void DoTests() { - TheTest.Start(_L("Get fast counter frequency")); + TestStart("Get fast counter frequency"); GetFastCounterFrequency(); - TheTest.Next( _L("Generate test record ids")); + TestNext("Generate test record ids"); GenerateTestRecIds(); - TheTest.Next( _L("Verify generated test record ids")); + TestNext("Verify generated test record ids"); VerifyGeneratedRecIds(); DoSqlServerTests(); @@ -840,7 +828,8 @@ TInt E32Main() { - TheTest.Title(); + TestOpen(KTestName); + TestTitle(); CTrapCleanup* tc = CTrapCleanup::New(); @@ -853,8 +842,8 @@ __UHEAP_MARKEND; - TheTest.End(); - TheTest.Close(); + TestEnd(); + TestClose(); delete tc;