kerneltest/f32test/locl/t_locChange.cpp
changeset 9 96e5fb8b040d
child 6 0173bcd7697c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/locl/t_locChange.cpp	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,135 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+//
+
+#include <e32test.h>
+#include <f32file.h>
+
+_LIT(KGerLocale, "T_LOCLGE.DLL");
+_LIT(KEngLocale, "T_LOCLUS.DLL");
+
+#ifndef __WINS__  
+_LIT(KEngLocaleRAM, "T_LOCLUS_RAM.DLL"); //this should be RAM-loaded library.. 
+#else 
+_LIT(KEngLocaleRAM, "T_LOCLUS.DLL"); 
+#endif
+    
+// 
+class RTestSafeLocale : public RTest
+    {
+    public:
+    RTestSafeLocale(const TDesC &aTitle):  RTest(aTitle),  iFailHdnFunc(NULL) {}
+    RTestSafeLocale(const TDesC &aTitle, void(*func)(RTest &aTest)) : RTest(aTitle), iFailHdnFunc(func) {}
+    
+    //new wersion of operator, which calls handler if check failed
+    void operator()(TInt aResult)
+        {
+        if (!aResult && iFailHdnFunc) iFailHdnFunc(*this);
+        RTest::operator ()(aResult);
+        }
+    
+    //new version of End, which calls handler before exit..
+    IMPORT_C void End() 
+        { 
+        if (iFailHdnFunc) iFailHdnFunc(*this);
+        RTest::End();
+        }
+    
+    //pointer to handler..
+    void (*iFailHdnFunc)(RTest &aTest);
+    };
+    
+// cleanup handler, which restores default locale on test end or failure..
+void TestCleanup(RTest &aTest)
+    {
+    aTest.Printf(_L("\nTest cleanup: changing locale to default..\n"));
+    UserSvr::ChangeLocale(_L(""));
+    aTest.Printf(_L("Default language: %d\n"), User::Language());
+    }
+
+// global gTest object..
+RTestSafeLocale gTest(_L("T_LOCCHANGE"), &TestCleanup);
+
+// try to load locale dll prior to changing it..
+TInt LoadLocaleCrash(const TDesC& aName)
+    {
+    //First - load the library.. 
+    RLibrary lib;
+    TInt err = lib.Load(aName);
+    if (err)
+        {
+        gTest.Printf(_L("\nRLibrary::Load() failed, err %d"), err);
+        return err;
+        }
+    // try to change locale.. (it should ignore the previously loaded library.. 
+    // and load locale library again in the global area.
+    err = UserSvr::ChangeLocale(aName);
+    if (err)
+        {
+        gTest.Printf(_L("\nUserSvr::ChangeLocale() failed, err %d"), err);
+        return err;
+        }
+
+    lib.Close();
+    return KErrNone;
+    }
+
+// change locale normally..
+TInt LoadLocale(const TDesC& aName)
+    {
+    TInt r = UserSvr::ChangeLocale(aName);
+    if (r != KErrNone)
+        return r;
+    return KErrNone;
+    }
+
+// main..
+TInt E32Main()
+    {
+    gTest.Start(_L("Test Locale Change\n"));
+
+    TInt r;
+    RChangeNotifier notifier;
+    TRequestStatus status;
+    gTest(notifier.Create() == KErrNone);
+    gTest(notifier.Logon(status) == KErrNone);
+    User::WaitForRequest(status);
+
+    // Monitor locale change event
+    gTest(notifier.Logon(status) == KErrNone);
+    
+    r = LoadLocale(KGerLocale);
+    gTest(r == KErrNone);
+    User::WaitForRequest(status);
+    gTest(status.Int() & EChangesLocale);
+    gTest.Printf(_L("New Language: %d\n"), User::Language());
+    gTest(notifier.Logon(status) == KErrNone);
+
+    r = LoadLocale(KEngLocale);
+    gTest(r == KErrNone);
+    User::WaitForRequest(status);
+    gTest(status.Int() & EChangesLocale);
+    gTest.Printf(_L("New Language: %d\n"), User::Language());
+    gTest(notifier.Logon(status) == KErrNone);
+
+    r = LoadLocaleCrash(KEngLocaleRAM);
+    gTest(r == KErrNone);
+    User::WaitForRequest(status);
+    gTest(status.Int() & EChangesLocale);
+    gTest.Printf(_L("New Language: %d\n"), User::Language());
+    
+    notifier.Close();
+    gTest.End();
+    return 0;
+    }