// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// Tests some code internal to BaflUtils
//
//
#include "BaUtilsImp.h"
#include <bautils.h>
#include <e32test.h>
#include <baflpan.h>
#define UNUSED_VAR(a) a = a
const TPtrC KValFolderName=_L("ValidFolderName");
const TPtrC KCurrentPath=_L("C:\\System\\Data\\");
const TPtrC KNoFolderName = _L("");
const TPtrC KInValidFolderName=_L("C:\\System\\Data\\InValid3+FollderName");
namespace
{
CTrapCleanup* TrapCleanup;
RTest test(_L("T_BaflUtilsImp - Internal Bafl function tests"));
}
class RTestDirectoryScanner : public RDirectoryScanner
{
public:
RTestDirectoryScanner(CDesCArray*& aMember)
: iOpenError(0), iFilesThatExist(aMember)
{
for (TInt i = 0; i != 26; ++i)
iDriveError[i] = 0;
}
virtual TInt Open(RFs&, const TDesC& aMatchPattern)
{
iMatch = aMatchPattern;
iIndex = 0;
return iOpenError;
}
virtual TInt Next(TEntry& aOut)
{
if (!iFilesThatExist)
return KErrEof;
while (iIndex < iFilesThatExist->Count())
{
TInt i = iIndex++;
if (0 <= (*iFilesThatExist)[i].MatchF(iMatch))
{
TPtrC fullName=(*iFilesThatExist)[i];
TParsePtrC name(fullName);
aOut.iName=name.NameAndExt();
if (1 < fullName.Length() && fullName[1] == ':')
{
TInt drive = fullName[0];
if ('a' <= drive && drive <= 'z')
drive -= 'a';
else
{
ASSERT('A' <= drive && drive <= 'Z');
drive -= 'A';
}
return iDriveError[drive];
}
return KErrNone;
}
}
return KErrEof;
}
virtual void Close() {}
TInt iOpenError;
TInt iDriveError[26];
private:
CDesCArray *&iFilesThatExist;
TInt iIndex;
TFileName iMatch;
};
class TTestNearestLanguageFileFinder : public TNearestLanguageFileFinder
{
public:
TTestNearestLanguageFileFinder(const RFs& aFs)
: TNearestLanguageFileFinder(aFs), iTestScanner(iFilesThatExist)
{
iFilesThatExist = 0;
iFilesSearchedFor = 0;
}
~TTestNearestLanguageFileFinder()
{
delete iFilesThatExist;
delete iFilesSearchedFor;
}
virtual TInt GetCustomResourceDriveNumber() const { return iCustomRscDrive; }
virtual TBool FileExists(const TDesC& aFileName) const
{
test(aFileName[1] == ':');
test(0 == aFileName.Left(1).CompareF(iDrivesChecked.Left(1)));
iDrivesChecked.Delete(0, 1);
test(0 <= aFileName.MatchF(iFileCheckedFor));
if (iFilesSearchedFor)
{
test(0 == aFileName.CompareF((*iFilesSearchedFor)[0]));
iFilesSearchedFor->Delete(0);
}
if (!iFilesThatExist)
return EFalse;
TInt i;
iFilesThatExist->Find(aFileName, i);
return (0 <= i && i < iFilesThatExist->Count())? ETrue : EFalse;
}
virtual RDirectoryScanner& DirectoryScanner() { return iTestScanner; }
TInt iCustomRscDrive;
CDesCArray* iFilesThatExist;
// File that is expected to go into FileExists.
// Can contain wildcards.
TFileName iFileCheckedFor;
// Drives expected in calls to FileExists. The first one is checked then
// discarded each time FileExists is called.
mutable TBuf<26> iDrivesChecked;
CDesCArray* iFilesSearchedFor;
RTestDirectoryScanner iTestScanner;
};
void TestPath(const TLanguagePath& aPath, const TLanguage* aExpected, TInt aExpectedCount)
{
for (int i = 0; i != aExpectedCount; ++i)
test(aPath[i] == *aExpected++);
test(aPath[aExpectedCount] == ELangNone);
}
const TLanguage ExpectedPath[] = { ELangFrench, ELangJapanese, ELangGerman, ELangGreek,
ELangArabic, ELangEnglish, ELangItalian, ELangHebrew };
/**
@SYMTestCaseID SYSLIB-BAFL-CT-0443
@SYMTestCaseDesc Tests TLanguagePath class
@SYMTestPriority High
@SYMTestActions Test for adding different language paths
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
void TestAddLanguage()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0443 "));
TLanguagePath path;
path[0] = ELangNone;
AddLanguage(path, ELangNone);
TestPath(path, ExpectedPath, 0);
AddLanguage(path, ELangFrench);
TestPath(path, ExpectedPath, 1);
AddLanguage(path, ELangFrench);
TestPath(path, ExpectedPath, 1);
AddLanguage(path, ELangNone);
TestPath(path, ExpectedPath, 1);
AddLanguage(path, ELangFrench);
TestPath(path, ExpectedPath, 1);
AddLanguage(path, ELangJapanese);
TestPath(path, ExpectedPath, 2);
AddLanguage(path, ELangFrench);
TestPath(path, ExpectedPath, 2);
AddLanguage(path, ELangNone);
TestPath(path, ExpectedPath, 2);
AddLanguage(path, ELangGerman);
TestPath(path, ExpectedPath, 3);
AddLanguage(path, ELangGreek);
TestPath(path, ExpectedPath, 4);
AddLanguage(path, ELangArabic);
TestPath(path, ExpectedPath, 5);
AddLanguage(path, ELangNone);
TestPath(path, ExpectedPath, 5);
AddLanguage(path, ELangEnglish);
TestPath(path, ExpectedPath, 6);
AddLanguage(path, ELangItalian);
TestPath(path, ExpectedPath, 7);
AddLanguage(path, ELangNone);
TestPath(path, ExpectedPath, 7);
AddLanguage(path, ELangHebrew);
TestPath(path, ExpectedPath, 8);
AddLanguage(path, ELangHebrew);
TestPath(path, ExpectedPath, 8);
AddLanguage(path, ELangEnglish);
TestPath(path, ExpectedPath, 8);
AddLanguage(path, ELangItalian);
TestPath(path, ExpectedPath, 8);
AddLanguage(path, ELangNone);
TestPath(path, ExpectedPath, 8);
AddLanguage(path, ELangFrench);
TestPath(path, ExpectedPath, 8);
AddLanguage(path, ELangNone);
TestPath(path, ExpectedPath, 8);
AddLanguage(path, ELangGerman);
TestPath(path, ExpectedPath, 8);
}
struct SDowngradeTest
{
TLanguage iIn[4];
TLanguage iOut[9];
};
/**
@SYMTestCaseID SYSLIB-BAFL-CT-0444
@SYMTestCaseDesc Tests for the functionality of TLocale class
@SYMTestPriority High
@SYMTestActions Test for language downgrades
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
void TestDowngrade(SDowngradeTest& aTest)
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0444 "));
TLocale loc;
loc.SetLanguageDowngrade(0, aTest.iIn[1]);
loc.SetLanguageDowngrade(1, aTest.iIn[2]);
loc.SetLanguageDowngrade(2, aTest.iIn[3]);
TLanguagePath path;
MakeLanguageDowngradePath(path, aTest.iIn[0], ELangNone, loc);
for (int i = 0; ; ++i)
{
test(i < 9);
test(aTest.iOut[i] == path[i]);
if (path[i] == ELangNone)
return;
}
}
// Test Dialect enumeration.
// Each value represents a dialect (variant) of a TLanguage language.
// E.g. AmericanSprint is represented by ELangAmerican | EDialectSprint
// The dialect location -- top six bits
const TUint KDialectFactor=0x0400;
enum TDialect
{
// The following are example dialects for testing only
EDialectSprint = (1*KDialectFactor),
EDialectOrange = (2*KDialectFactor),
EDialectMaximum = EDialectOrange // This must always be equal to the last TDialect enum.
// Up to 63 dialects.
};
const TLanguage ELangEnglishOrange = static_cast<TLanguage>(ELangEnglish|EDialectOrange);
const TLanguage ELangAmericanSprint = static_cast<TLanguage>(ELangAmerican|EDialectSprint);
SDowngradeTest DowngradeData[] =
{
// 0 = test language
// 1-3 = language downgrade for locale
// 4- = calculated language downgrade path, terminated with ELangNone.
{{ELangEnglishOrange, ELangNone, ELangNone, ELangNone},
{ELangEnglishOrange, ELangEnglish, ELangNone}},
{{ELangAmericanSprint, ELangNone, ELangNone, ELangNone},
{ELangAmericanSprint, ELangAmerican, ELangEnglish, ELangNone}},
{{ELangFrench, ELangNone, ELangNone, ELangNone},
{ELangFrench, ELangNone}},
{{ELangSwissFrench, ELangNone, ELangNone, ELangNone},
{ELangSwissFrench, ELangFrench, ELangNone}},
{{ELangCanadianEnglish, ELangNone, ELangNone, ELangNone},
{ELangCanadianEnglish, ELangAmerican, ELangEnglish, ELangNone}},
{{ELangSwissFrench, ELangNone, ELangFrench, ELangNone},
{ELangSwissFrench, ELangFrench, ELangNone}},
{{ELangCanadianEnglish, ELangEnglish, ELangNone, ELangAmerican},
{ELangCanadianEnglish, ELangEnglish, ELangAmerican, ELangNone}},
{{ELangCanadianEnglish, ELangNone, ELangNone, ELangSwissFrench},
{ELangCanadianEnglish, ELangSwissFrench, ELangAmerican, ELangEnglish, ELangNone}},
{{ELangCanadianEnglish, ELangFrench, ELangAmerican, ELangSwissFrench},
{ELangCanadianEnglish, ELangFrench, ELangAmerican, ELangSwissFrench, ELangEnglish, ELangNone}},
{{ELangCanadianEnglish, ELangNone, ELangGerman, ELangSwissFrench},
{ELangCanadianEnglish, ELangGerman, ELangSwissFrench, ELangAmerican, ELangEnglish, ELangNone}},
{{ELangCanadianEnglish, ELangFinlandSwedish, ELangGerman, ELangSwissFrench},
{ELangCanadianEnglish, ELangFinlandSwedish, ELangGerman, ELangSwissFrench, ELangAmerican, ELangEnglish, ELangNone}},
{{ELangFinlandSwedish, ELangFinlandSwedish, ELangFinlandSwedish, ELangFinlandSwedish},
{ELangFinlandSwedish, ELangSwedish, ELangNone}},
};
/**
@SYMTestCaseID SYSLIB-BAFL-CT-0445
@SYMTestCaseDesc Tests for language downgrades
@SYMTestPriority High
@SYMTestActions Call up downgrade path test function
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
void TestMakeLanguageDowngradePath()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0445 "));
for (int i = 0; i != sizeof(DowngradeData)/sizeof(DowngradeData[0]); ++i)
TestDowngrade(DowngradeData[i]);
}
void SetUpFinderForLanguageAndDriveSearchL(
TTestNearestLanguageFileFinder& aFinder)
{
aFinder.iDrives = _L("ZAG");
aFinder.iFilesSearchedFor = new(ELeave) CDesCArraySeg(10);
aFinder.iFilesSearchedFor->AppendL(_L("z:\\dir\\name.e02"));
aFinder.iFilesSearchedFor->AppendL(_L("a:\\dir\\name.e02"));
aFinder.iFilesSearchedFor->AppendL(_L("g:\\dir\\name.e02"));
aFinder.iFilesSearchedFor->AppendL(_L("z:\\dir\\name.e15702")); //Extended lang
aFinder.iFilesSearchedFor->AppendL(_L("a:\\dir\\name.e15702"));
aFinder.iFilesSearchedFor->AppendL(_L("g:\\dir\\name.e15702"));
aFinder.iFilesSearchedFor->AppendL(_L("z:\\dir\\name.e01"));
aFinder.iFilesSearchedFor->AppendL(_L("a:\\dir\\name.e01"));
aFinder.iFilesSearchedFor->AppendL(_L("g:\\dir\\name.e01"));
aFinder.iFilesSearchedFor->AppendL(_L("z:\\dir\\name.ext"));
aFinder.iFilesSearchedFor->AppendL(_L("a:\\dir\\name.ext"));
aFinder.iFilesSearchedFor->AppendL(_L("g:\\dir\\name.ext"));
aFinder.iDrivesChecked = _L("zagzagzagzagzag");
}
_LIT(KTestFileName1, "z:\\dir\\name.ext");
//_LIT(KTestFileName2, "z:\\dir\\náme.ext");
_LIT(KTestFileName2, "z:\\dir\\n\u00c1me.ext");
_LIT(KTestFileName3, "a:\\dir\\name.ext");
_LIT(KTestFileName4, "c:\\dir\\name.ext");
_LIT(KTestFileName5, "d:\\dir\\name.ext");
_LIT(KTestFileName6, "y:\\dir\\name.ext");
_LIT(KTestFileName7, "A:\\dir\\name.ext");
_LIT(KTestFileName8, "C:\\dir\\name.ext");
_LIT(KTestFileName9, "Y:\\dir\\name.ext");
_LIT(KTestFileName11, "\\abc\\defg.hijkl");
_LIT(KTestFileName256Chars, "\
\\abcdefghijklmnopqrstuvwxyz01234\\abcdefghijklmnopqrstuvwxyz01234\
\\abcdefghijklmnopqrstuvwxyz01234\\abcdefghijklmnopqrstuvwxyz01234\
\\abcdefghijklmnopqrstuvwxyz01234\\abcdefghijklmnopqrstuvwxyz01234\
\\abcdefghijklmnopqrstuvwxyz01234\\abcdefghijklmnopqrstuvwxyz0.ext");
_LIT(KExpectedFileName256Chars, "?:\
\\abcdefghijklmnopqrstuvwxyz01234\\abcdefghijklmnopqrstuvwxyz01234\
\\abcdefghijklmnopqrstuvwxyz01234\\abcdefghijklmnopqrstuvwxyz01234\
\\abcdefghijklmnopqrstuvwxyz01234\\abcdefghijklmnopqrstuvwxyz01234\
\\abcdefghijklmnopqrstuvwxyz01234\\abcdefghijklmnopqrstuvwxyz0.e");
_LIT(KExpectedFileName1, "?:\\dir\\name.e");
_LIT(KExpectedSuffix1, "xt");
_LIT(KExpectedFileName2, "?:\\abc\\defg.hij");
_LIT(KExpectedSuffix2, "kl");
_LIT(KTestFileName1French, "z:\\dir\\name.e02");
_LIT(KTestFileName1Japanese, "z:\\dir\\name.e32");
_LIT(KTestFileName1Mongolian, "z:\\dir\\name.e54321");
_LIT(KTestFileName1AmericanSprint, "z:\\dir\\name.e1034"); //American=0x0A, Sprint=0x0400. 0x040A=1034.
_LIT(KCheckedForFrench, "?:\\dir\\name.e02");
/**
@SYMTestCaseID SYSLIB-BAFL-CT-0446
@SYMTestCaseDesc Nearest language finder test
@SYMTestPriority High
@SYMTestActions Test drive sequence construction
Test addition of language number
Test searching each drive for the specified file
Test searching language and drive down the language path
Test filename matching
Test searching for any language file within a drive
Test searching all drives for any language
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
void TestNearestLanguageFinder()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0446 "));
RFs dummy;
TTestNearestLanguageFileFinder finder(dummy);
// Test file name setting and disecting
// SetFileName
// RepairFileName
TFileName fileName(KTestFileName1);
finder.SetFileName(fileName);
test(0 <= finder.iFileName->MatchF(KExpectedFileName1));
test(0 == finder.iSuffix.Compare(KExpectedSuffix1));
test('z' == finder.iInitialDriveLetter);
finder.RepairFileName();
test(0 == finder.iFileName->Compare(KTestFileName1));
fileName = KTestFileName11;
finder.SetFileName(fileName);
test(0 <= finder.iFileName->MatchF(KExpectedFileName2));
test(0 == finder.iSuffix.Compare(KExpectedSuffix2));
test(-1 == finder.iInitialDriveLetter);
finder.RepairFileName();
test(0 == finder.iFileName->Compare(KTestFileName11));
fileName = KTestFileName256Chars;
finder.SetFileName(fileName);
test(0 <= finder.iFileName->MatchF(KExpectedFileName256Chars));
test(0 == finder.iSuffix.Compare(KExpectedSuffix1));
test(-1 == finder.iInitialDriveLetter);
finder.RepairFileName();
test(0 == finder.iFileName->Compare(KTestFileName256Chars));
// Test drive sequence construction
// AddCustomResourceDrive
finder.iCustomRscDrive = static_cast<TInt>(EDriveC); // drive c:
fileName = KTestFileName1;
finder.SetFileName(fileName);
test(finder.AddCustomResourceDrive() == KErrNone);
test(0 == finder.iDrives.CompareF(_L("CZ")));
fileName = KTestFileName3;
finder.SetFileName(fileName);
test(finder.AddCustomResourceDrive() == KErrNone);
test(0 == finder.iDrives.CompareF(_L("CA")));
fileName = KTestFileName4;
finder.SetFileName(fileName);
test(finder.AddCustomResourceDrive() == KErrAlreadyExists);
test(0 == finder.iDrives.CompareF(_L("C")));
fileName = KTestFileName5;
finder.SetFileName(fileName);
test(finder.AddCustomResourceDrive() == KErrNone);
test(0 == finder.iDrives.CompareF(_L("CD")));
fileName = KTestFileName6;
finder.SetFileName(fileName);
test(finder.AddCustomResourceDrive() == KErrNone);
test(0 == finder.iDrives.CompareF(_L("CY")));
fileName = KTestFileName7;
finder.SetFileName(fileName);
test(finder.AddCustomResourceDrive() == KErrNone);
test(0 == finder.iDrives.CompareF(_L("CA")));
fileName = KTestFileName8;
finder.SetFileName(fileName);
test(finder.AddCustomResourceDrive() == KErrAlreadyExists);
test(0 == finder.iDrives.CompareF(_L("C")));
fileName = KTestFileName9;
finder.SetFileName(fileName);
test(finder.AddCustomResourceDrive() == KErrNone);
test(0 == finder.iDrives.CompareF(_L("CY")));
// AddAllDrives
fileName = KTestFileName1;
finder.SetFileName(fileName);
finder.AddAllDrives();
test(0 == finder.iDrives.CompareF(_L("ZYXWVUTSRQPONMLKJIHGFEDCBA")));
fileName = KTestFileName3;
finder.SetFileName(fileName);
finder.AddAllDrives();
test(0 == finder.iDrives.CompareF(_L("AYXWVUTSRQPONMLKJIHGFEDCBZ")));
fileName = KTestFileName4;
finder.SetFileName(fileName);
finder.AddAllDrives();
test(0 == finder.iDrives.CompareF(_L("CYXWVUTSRQPONMLKJIHGFEDBAZ")));
fileName = KTestFileName5;
finder.SetFileName(fileName);
finder.AddAllDrives();
test(0 == finder.iDrives.CompareF(_L("DYXWVUTSRQPONMLKJIHGFECBAZ")));
fileName = KTestFileName6;
finder.SetFileName(fileName);
finder.AddAllDrives();
test(0 == finder.iDrives.CompareF(_L("YXWVUTSRQPONMLKJIHGFEDCBAZ")));
fileName = KTestFileName7;
finder.SetFileName(fileName);
finder.AddAllDrives();
test(0 == finder.iDrives.CompareF(_L("AYXWVUTSRQPONMLKJIHGFEDCBZ")));
fileName = KTestFileName8;
finder.SetFileName(fileName);
finder.AddAllDrives();
test(0 == finder.iDrives.CompareF(_L("CYXWVUTSRQPONMLKJIHGFEDBAZ")));
fileName = KTestFileName9;
finder.SetFileName(fileName);
finder.AddAllDrives();
test(0 == finder.iDrives.CompareF(_L("YXWVUTSRQPONMLKJIHGFEDCBAZ")));
// Test addition of language number
// AppendLanguageCode
fileName = KTestFileName1;
finder.SetFileName(fileName);
finder.AppendLanguageCode(ELangFrench);
test(0 == finder.iFileName->CompareF(KTestFileName1French));
finder.SetFileName(fileName);
finder.AppendLanguageCode(ELangJapanese);
test(0 == finder.iFileName->CompareF(KTestFileName1Japanese));
finder.SetFileName(fileName);
finder.AppendLanguageCode(ELangAmericanSprint);
test(0 == finder.iFileName->CompareF(KTestFileName1AmericanSprint));
fileName = KTestFileName1;
finder.SetFileName(fileName);
finder.AppendLanguageCode(static_cast<TLanguage>(54321));
test(0 == finder.iFileName->CompareF(KTestFileName1Mongolian));
fileName = KTestFileName256Chars;
finder.SetFileName(fileName);
test(!finder.AppendLanguageCode(ELangFrench));
// Test searching each drive for the specified file
// FindDrive
finder.iFileCheckedFor = KCheckedForFrench;
finder.iDrivesChecked = _L("D");
fileName = KTestFileName5;
finder.SetFileName(fileName);
finder.AppendLanguageCode(ELangFrench);
finder.FindDrive();
test(finder.iDrivesChecked.Length() == 0);
finder.SetFileName(fileName);
finder.AddAllDrives();
finder.iDrivesChecked = _L("dyxwvutsrqponmlkjihgfecbaz");
finder.AppendLanguageCode(ELangFrench);
finder.FindDrive();
test(finder.iDrivesChecked.Length() == 0);
fileName = KTestFileName5;
finder.SetFileName(fileName);
finder.AddAllDrives();
finder.iDrivesChecked = _L("dyxwvutsrqponmlkjihgfecbaz");
finder.AppendLanguageCode(ELangFrench);
finder.iFilesThatExist = new (ELeave) CDesCArraySeg(10);
finder.iFilesThatExist->AppendL(_L("o:\\dIR\\NAmE.E02"));
test(finder.FindDrive());
test(0 == finder.iFileName->CompareF(_L("O:\\dir\\name.e02")));
fileName = KTestFileName2;
finder.SetFileName(fileName);
finder.AppendLanguageCode(ELangFrench);
finder.AddAllDrives();
finder.iDrivesChecked = _L("zyxwvutsrqponmlkjihgfedcba");
finder.iFilesThatExist->AppendL(_L("v:\\dIR\\NA\x301mE.E02"));
//finder.iFileCheckedFor = _L("?:\\dir\\nÁme.e02");
finder.iFileCheckedFor = _L("?:\\dir\\n\u00c1me.e02");
test(finder.FindDrive());
//test(0 == finder.iFileName->CompareF(_L("v:\\dir\\nÁme.e02")));
test(0 == finder.iFileName->CompareF(_L("v:\\dir\\n\u00c1me.e02")));
delete finder.iFilesThatExist;
finder.iFilesThatExist = 0;
// Test searching language and drive down the language path
// FindLanguageAndDrive
finder.iPath[0] = static_cast<TLanguage>(2);
finder.iPath[1] = static_cast<TLanguage>(15702);
finder.iPath[2] = static_cast<TLanguage>(1);
finder.iPath[3] = ELangNone;
fileName = KTestFileName1;
finder.SetFileName(fileName);
SetUpFinderForLanguageAndDriveSearchL(finder);
finder.iFileCheckedFor = _L("?:\\dir\\name.e*");
test(!finder.FindLanguageAndDrive());
// check that iFileName is undamaged
finder.RepairFileName();
test(0 == finder.iFileName->CompareF(KTestFileName1));
delete finder.iFilesSearchedFor;
finder.iFilesThatExist = new (ELeave) CDesCArraySeg(10);
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name.e15702"));
fileName = KTestFileName1;
finder.SetFileName(fileName);
SetUpFinderForLanguageAndDriveSearchL(finder);
test(finder.FindLanguageAndDrive());
test(0 == finder.iFileName->CompareF(_L("a:\\dir\\name.e15702")));
delete finder.iFilesSearchedFor;
finder.iFilesSearchedFor = 0;
finder.iPath[0] = static_cast<TLanguage>(7);
finder.iPath[1] = ELangNone;
finder.iFilesThatExist->AppendL(_L("g:\\dir\\name.ext"));
fileName = KTestFileName1;
finder.SetFileName(fileName);
finder.iDrives = _L("ZAG");
finder.iDrivesChecked = _L("ZAGZAG");
test(finder.FindLanguageAndDrive());
test(0 == finder.iFileName->CompareF(_L("g:\\dir\\name.ext")));
delete finder.iFilesThatExist;
finder.iFilesThatExist = 0;
// Test filename matching
// LanguageNumberFromFile
test(4 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb04"), _L("AVB")));
//test(4 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("ávb04"), _L("A\x301VB")));
//test(4 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("a\x301vb04"), _L("ÁVB")));
test(4 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("\u00e1vb04"), _L("A\x301VB")));
test(4 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("a\x301vb04"), _L("\u00c1VB")));
test(5254 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb5254"), _L("aVb")));
test(KErrNotFound == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb04"), _L("avb04")));
test(KErrNotFound == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb04"), _L("av")));
test(KErrNotFound == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb04"), _L("")));
test(0 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb0000000"), _L("AVB00000")));
test(4 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb000000004"), _L("AVB0000000")));
test(100004 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb000100004"), _L("AVB000")));
test(111114 == TNearestLanguageFileFinder::LanguageNumberFromFile(_L("avb0111114"), _L("AVB0")));
// Test searching for any language file within a drive
// FindFirstLanguageFile
fileName = KTestFileName3;
finder.SetFileName(fileName);
finder.iFilesThatExist = new (ELeave) CDesCArraySeg(10);
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name.e107"));
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name.e07"));
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name.e02"));
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name.ee01"));
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name.01"));
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name01"));
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name01.e01"));
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name.e15108"));
finder.iFilesThatExist->AppendL(_L("a:\\dir\\name.e03"));
finder.iTestScanner.iDriveError[0] = KErrNoMemory;
fileName = KTestFileName3;
finder.SetFileName(fileName);
test(KErrNotFound == finder.FindFirstLanguageFile(dummy));
finder.iTestScanner.iDriveError[0] = KErrAbort;
fileName = KTestFileName3;
finder.SetFileName(fileName);
test(KErrNotFound == finder.FindFirstLanguageFile(dummy));
finder.iTestScanner.iDriveError[0] = KErrNone;
fileName = KTestFileName3;
finder.SetFileName(fileName);
test(0 <= finder.FindFirstLanguageFile(dummy));
test(0 == finder.iFileName->CompareF(_L("a:\\dir\\name.e02")));
finder.iFilesThatExist->AppendL(_L("a:\\abaffafg.100"));
finder.iFilesThatExist->AppendL(_L("a:\\abcdefg.9539"));
finder.iFilesThatExist->AppendL(_L("a:\\abcdefg.19539"));
finder.iFilesThatExist->AppendL(_L("a:\\abcdefg.1000"));
finder.iFilesThatExist->AppendL(_L("a:\\abaffafg.102"));
fileName = _L("a:\\abcdefg.xx");
finder.SetFileName(fileName);
test(0 <= finder.FindFirstLanguageFile(dummy));
test(0 == finder.iFileName->CompareF(_L("a:\\abcdefg.1000")));
finder.iFilesThatExist->AppendL(_L("a:\\abaffafg.aaa100"));
finder.iFilesThatExist->AppendL(_L("a:\\abcdefg.0523")); // not well-formed. Will not count.
finder.iFilesThatExist->AppendL(_L("a:\\abcdefg.1001"));
fileName = _L("a:\\abcdefg.xx");
finder.SetFileName(fileName);
test(0 <= finder.FindFirstLanguageFile(dummy));
test(0 == finder.iFileName->CompareF(_L("a:\\abcdefg.1000")));
fileName = _L("a:\\abaffafg.xx");
finder.SetFileName(fileName);
test(0 <= finder.FindFirstLanguageFile(dummy));
test(0 == finder.iFileName->CompareF(_L("a:\\abaffafg.100")));
finder.iFilesThatExist->AppendL(_L("a:\\abaffafg.09"));
fileName = _L("a:\\abaffafg.xx");
finder.SetFileName(fileName);
test(0 <= finder.FindFirstLanguageFile(dummy));
test(0 == finder.iFileName->CompareF(_L("a:\\abaffafg.09")));
// Test searching all drives for any language
// FindFirstLanguageFileAndDrive
finder.iFilesThatExist->AppendL(_L("z:\\abcdefg.05"));
fileName = _L("c:\\abcdefg.xx");
finder.SetFileName(fileName);
finder.iDrives = _L("az");
test(0 <= finder.FindFirstLanguageFileAndDrive());
test(0 == finder.iFileName->CompareF(_L("a:\\abcdefg.1000")));
fileName = _L("c:\\abaffafg.xx");
finder.SetFileName(fileName);
finder.iDrives = _L("az");
test(0 <= finder.FindFirstLanguageFileAndDrive());
test(0 == finder.iFileName->CompareF(_L("a:\\abaffafg.09")));
fileName = _L("c:\\abcdefg.xx");
finder.SetFileName(fileName);
finder.iDrives = _L("za");
test(0 <= finder.FindFirstLanguageFileAndDrive());
test(0 == finder.iFileName->CompareF(_L("z:\\abcdefg.05")));
fileName = _L("c:\\xxx.xx");
finder.SetFileName(fileName);
finder.iDrives = _L("za");
test(KErrNotFound == finder.FindFirstLanguageFileAndDrive());
finder.iTestScanner.iDriveError[25] = KErrAbort;
fileName = _L("c:\\abcdefg.xx");
finder.SetFileName(fileName);
finder.iDrives = _L("za");
test(0 <= finder.FindFirstLanguageFileAndDrive());
test(0 == finder.iFileName->CompareF(_L("a:\\abcdefg.1000")));
fileName = _L("c:\\abcdefg.xx");
finder.SetFileName(fileName);
finder.iDrives = _L("za");
finder.iTestScanner.iDriveError[0] = KErrNoMemory;
test(KErrNotFound == finder.FindFirstLanguageFileAndDrive());
fileName = _L("c:\\abcdefg.xx");
finder.SetFileName(fileName);
finder.iDrives = _L("za");
finder.iTestScanner.iDriveError[0] = KErrAbort;
test(KErrNotFound == finder.FindFirstLanguageFileAndDrive());
}
/**
@SYMTestCaseID SYSLIB-BAFL-CT-0447
@SYMTestCaseDesc Tests for defect number DEF039977
@SYMTestPriority High
@SYMTestActions Test for Panic in BaflUtils::DiskIsReadOnly()
when unexpected parameter supplied
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
void TestforDEF039977()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0447 "));
TFileName filename;
TBool readOnly;
TInt theRes;
RFs fileserver;
TInt err=fileserver.Connect();
test(err==KErrNone);
filename=_L("c");
theRes=BaflUtils::DiskIsReadOnly(fileserver,filename,readOnly);
test(theRes==KErrBadName);
filename=_L(" z:");
theRes=BaflUtils::DiskIsReadOnly(fileserver,filename,readOnly);
test(theRes==KErrBadName);
filename=_L("z\\");
theRes=BaflUtils::DiskIsReadOnly(fileserver,filename,readOnly);
test(theRes==KErrBadName);
filename=_L("b:");
theRes=BaflUtils::DiskIsReadOnly(fileserver,filename,readOnly);
test(theRes==KErrNotReady);
filename=_L("c:");
theRes=BaflUtils::DiskIsReadOnly(fileserver,filename,readOnly);
test(theRes==KErrNone);
test(!readOnly);
filename=_L("z:");
theRes=BaflUtils::DiskIsReadOnly(fileserver,filename,readOnly);
test(theRes==KErrNone);
test(readOnly);
filename=_L("z:\\");
theRes=BaflUtils::DiskIsReadOnly(fileserver,filename,readOnly);
test(theRes==KErrNone);
filename=_L("z:\\system\\data\\");
theRes=BaflUtils::DiskIsReadOnly(fileserver,filename,readOnly);
test(theRes==KErrNone);
fileserver.Close();
}
/*
@SYMTestCaseID SYSLIB-BAFL-CT-1284
@SYMTestCaseDesc Tests for invalid character
@SYMTestPriority High
@SYMTestActions Test for panic when an invalid character when
supplied to BaflUtils::RootFolderPath's parameter as drive letter
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
TInt TestforInvalidCharacter(TAny* /*aData*/)
/**
This is a root thread function which runs as part of the TestforDEF040198().
It tests a panic is produced when an invalid non alphabet character is supplied
in the aDriveLetter argument in BaflUtils::RootFolderPath(const TBuf<1> aDriveLetter)
*/
{
TBuf<1> buf1=_L("?");
TFileName retValue;
retValue=BaflUtils::RootFolderPath(buf1);
// Line above panics if working OK, so should never get here.
test(0);
return 0;
}
/**
This method is a test case to demonstrate the fix for DEF040198 by supplying an invalid
input aDriveLetter argument (e.g "?") to BaflUtils::RootFolderPath(aDriveLetter).
@SYMTestCaseID SYSLIB-BAFL-CT-0448
@SYMTestCaseDesc Tests for defect number DEF040198
@SYMTestPriority High
@SYMTestActions Check by giving an invalid aDriveLetter argument
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
void TestforDEF040198()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0448 "));
//Check invalid aDriveLetter argument panics with panic code EBaflPanicBadOpenArg
#if defined(_DEBUG)
TRequestStatus threadStatus;
RThread thread;
_LIT(KThreadName,"ThreadTest");
TInt rc;
TBool jit;
jit=User::JustInTime();
User::SetJustInTime(EFalse);
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-1284 "));
rc=thread.Create(KThreadName,TestforInvalidCharacter,KDefaultStackSize,KMinHeapSize,KMinHeapSize*4,NULL);
test(rc==KErrNone);
thread.Logon(threadStatus);
thread.Resume();
User::WaitForRequest(threadStatus);
test (thread.ExitType()==EExitPanic);
test (thread.ExitReason()==EBafPanicBadOpenArg);
thread.Close();
User::SetJustInTime(jit);
#endif
}
/*
@SYMTestCaseID SYSLIB-BAFL-CT-1285
@SYMTestCaseDesc Tests for invalid path name
@SYMTestPriority High
@SYMTestActions Test for panic when an invalid character supplied to BaflUtils::RootFolderPath's parameter as drive letter
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
TInt TestforInvalidPathName(TAny* /*aData*/)
/**
This is a root thread function which runs as part of the TestforDEF040299().
It tests a panic is produced when an invalid name is supplied
in the aFullName argument in BaflUtils::FolderNameFromFullName(const TDesC& aFullName)
*/
{
TBuf<1> buf1=_L("?");
TFileName retValue;
retValue=BaflUtils::FolderNameFromFullName(buf1);
// Line above panics if working OK, so should never get here.
test(0);
return 0;
}
/**
@SYMTestCaseID SYSLIB-BAFL-CT-0449
@SYMTestCaseDesc Tests for defect number DEF047305
@SYMTestPriority High
@SYMTestActions Test for correct syntax
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
void TestForDEF047305()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0449 "));
RFs aFs;
CleanupClosePushL(aFs);
User::LeaveIfError(aFs.Connect());
TFileName newFolderFullName = KCurrentPath;
test(User::LeaveIfError(BaflUtils::ValidateFolderNameTypedByUserL(aFs, KValFolderName, KCurrentPath, newFolderFullName)==KErrNone));
test(User::LeaveIfError(BaflUtils::ValidateFolderNameTypedByUserL(aFs, KNoFolderName, KCurrentPath, newFolderFullName)==KErrArgument));
test(User::LeaveIfError(BaflUtils::ValidateFolderNameTypedByUserL(aFs, KInValidFolderName, KCurrentPath, newFolderFullName)==KErrBadName));
CleanupStack::PopAndDestroy(&aFs);
}
/**
@SYMTestCaseID SYSLIB-BAFL-CT-0450
@SYMTestCaseDesc Tests for defect number DEF040299
@SYMTestPriority High
@SYMTestActions Test by supplying an invalid input aFullName argument to BaflUtils::FolderNameFromFullName(aFullName)
@SYMTestExpectedResults Test must not fail
@SYMREQ REQ0000
*/
void TestforDEF040299()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0450 "));
TBuf<30> buf;
TFileName fileName;
//Path name="c:"
buf=_L("c:");
fileName=BaflUtils::FolderNameFromFullName(buf);
test(buf==fileName);
//Path name="c:\\"
buf=_L("c:\\");
fileName=BaflUtils::FolderNameFromFullName(buf);
test(fileName==buf);
//Path name="c:\\file.txt"
buf=_L("c:\\file.txt");
fileName=BaflUtils::FolderNameFromFullName(buf);
test(fileName==_L("c:\\"));
//Path name="c:\\system\\file.txt"
buf=_L("c:\\system\\file.txt");
fileName=BaflUtils::FolderNameFromFullName(buf);
test(fileName==_L("system"));
/**
This method is a test case to demonstrate the fix for DEF040299 by supplying an invalid
input aFullName argument (e.g "?") to BaflUtils::FolderNameFromFullName(aFullName).
*/
//Check invalid aFullName argument panics with panic code EBaflPanicBadOpenArg
#if defined(_DEBUG)
TRequestStatus threadStatus;
RThread thread;
//Tread name is changed due to test failing on slow machine
//Using "TreadTest" here are causing KErrAlreadyExist at tread creating stage.
//This is because the previous tread maybe still being closed when this thread is created.
_LIT(KThreadName,"ThreadTest1");
TInt rc;
TBool jit;
jit=User::JustInTime();
User::SetJustInTime(EFalse);
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-1285 "));
rc=thread.Create(KThreadName,TestforInvalidPathName,KDefaultStackSize,KMinHeapSize,KMinHeapSize*4,NULL);
test(rc==KErrNone);
thread.Logon(threadStatus);
thread.Resume();
User::WaitForRequest(threadStatus);
test (thread.ExitType()==EExitPanic);
test (thread.ExitReason()==EBafPanicBadOpenArg);
thread.Close();
User::SetJustInTime(jit);
#endif
}
/**
@SYMTestCaseID SYSLIB-BAFL-CT-3416
@SYMTestCaseDesc Tests for defect number DEF101927
@SYMTestPriority High
@SYMTestActions Test the simulated Tls functionalities Dll::Tls, Dll::SetTls and Dll::FreeTls
which is needed for BAUtils.cpp to be complied as part of an .exe.
Dll::Tls - Recalls the value currently referred to by the Tls pointer
Dll::SetTls - Sets the the values referred to by the Tls pointer
Dll::FreeTls - Sets the Tls pointer to NULL
@SYMTestExpectedResults Pass if the TLanguage values is returned as expected after calls to IdealLanguage,
SetIdealLanguage and ReleaseIdealLanguage.
@SYMDEF DEF101927
*/
void TestForDEF101927()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-3416 "));
TLanguage test_language(ELangAmerican);
test(BaflUtils::IdealLanguage()==ELangNone);
BaflUtils::SetIdealLanguage(ELangAmerican);
test(test_language == ELangAmerican);
test_language = ELangNone;
test_language = BaflUtils::IdealLanguage();
test(test_language == ELangAmerican);
BaflUtils::ReleaseIdealLanguage();
test_language = BaflUtils::IdealLanguage();
test(test_language == ELangNone);
}
/**
@SYMTestCaseID SYSLIB-BAFL-UT-3667
@SYMTestCaseDesc Tests for defect number DEF109928
@SYMTestPriority Normal
@SYMTestActions Test for the extended NextLanguage(). Check if the MakeLanguageDowngradePath()
can now return the correct default fallback for the languages which are newly
added into the NextLanguage().
@SYMTestExpectedResults Test must not fail
@SYMDEF DEF109928
*/
void TestForDEF109928()
{
test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-UT-3667 "));
TLanguage testDeviceLangs[8] = {ELangEnglish_Japan, ELangSwissFrench, ELangSwissGerman,
ELangLatinAmericanSpanish, ELangSwissItalian, ELangFinlandSwedish,
ELangMalay_Apac, ELangBrazilianPortuguese};
TLanguagePath testOutputPath[8] = {{ELangEnglish_Japan, ELangEnglish}, {ELangSwissFrench, ELangFrench},
{ELangSwissGerman, ELangGerman}, {ELangLatinAmericanSpanish, ELangSpanish},
{ELangSwissItalian, ELangItalian}, {ELangFinlandSwedish, ELangSwedish},
{ELangMalay_Apac, ELangMalay}, {ELangBrazilianPortuguese, ELangPortuguese}};
TLocale loc;
loc.SetLanguageDowngrade(0, ELangNone);
loc.SetLanguageDowngrade(1, ELangNone);
loc.SetLanguageDowngrade(2, ELangNone);
TLanguagePath path;
TLanguage testlang;
for(TInt i = 0; i < 8 ; i++)
{
testlang = testDeviceLangs[i];
MakeLanguageDowngradePath(path, testlang, ELangNone, loc);
test(path[0] == testOutputPath[i][0]);
test(path[1] == testOutputPath[i][1]);
test(path[2] == ELangNone);
}
}
/* The following 3 function is defined so that the functions IdealLanguage,
SetIdealLanguage, ReleaseIdealLanguage will compile as part as an .exe
These functions use a global TAny* to store the data that would have been
stored in the TLS under normal compilation (ie If the BaUtils was compilled
as part of a DLL).
*/
TAny* ptr(NULL);
TAny* Dll::Tls()
{
return ptr;
}
TInt Dll::SetTls(TAny* aPtr)
{
ptr = aPtr;
return KErrNone;
}
void Dll::FreeTls()
{
ptr = NULL;
}
void RunTestsL()
{
__UHEAP_MARK;
test.Title();
test.Start(_L("BaflUtils Internal Tests: "));
TestAddLanguage();
TestMakeLanguageDowngradePath();
TestNearestLanguageFinder();
TestforDEF039977();
TestforDEF040198();
TestforDEF040299();
TestForDEF047305();
TestForDEF101927();
TestForDEF109928();
test.End();
test.Close();
__UHEAP_MARKENDC(0);
}
TInt E32Main()
{
TrapCleanup = CTrapCleanup::New();
TRAPD(err, RunTestsL());
test(err == KErrNone);
delete TrapCleanup;
return 0;
}