[dali_2.3.24] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-MultiLanguage.cpp
old mode 100644 (file)
new mode 100755 (executable)
index f602e8a..a81a462
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 #include <dali-toolkit/internal/text/logical-model-impl.h>
 #include <dali-toolkit/internal/text/multi-language-helper-functions.h>
 #include <dali-toolkit/internal/text/multi-language-support.h>
+#include <dali-toolkit/internal/text/multi-language-support-impl.h>
 #include <dali-toolkit/internal/text/segmentation.h>
 #include <dali-toolkit/internal/text/text-run-container.h>
 #include <dali-toolkit-test-suite-utils.h>
@@ -33,33 +34,38 @@ using namespace Dali;
 using namespace Toolkit;
 using namespace Text;
 
+
 // Tests the following functions with different scripts.
 //
-// void MergeFontDescriptions( const Vector<FontDescriptionRun>& fontDescriptions,
-//                             Vector<FontId>& fontIds,
-//                             const TextAbstraction::FontDescription& defaultFontDescription,
-//                             TextAbstraction::PointSize26Dot6 defaultPointSize,
-//                             CharacterIndex startIndex,
-//                             Length numberOfCharacters );
+// void MergeFontDescriptions(const Vector<FontDescriptionRun>&       fontDescriptions,
+//                            const TextAbstraction::FontDescription& defaultFontDescription,
+//                            TextAbstraction::PointSize26Dot6        defaultPointSize,
+//                            float                                   fontSizeScale,
+//                            CharacterIndex                          characterIndex,
+//                            TextAbstraction::FontDescription&       fontDescription,
+//                            TextAbstraction::PointSize26Dot6&       fontPointSize,
+//                            bool&                                   isDefaultFont);
 //
-// Script GetScript( Length index,
-//                   Vector<ScriptRun>::ConstIterator& scriptRunIt,
-//                   const Vector<ScriptRun>::ConstIterator& scriptRunEndIt );
+// Script GetScript(Length                                  index,
+//                  Vector<ScriptRun>::ConstIterator&       scriptRunIt,
+//                  const Vector<ScriptRun>::ConstIterator& scriptRunEndIt);
 //
 // Constructor, destructor and MultilanguageSupport::Get()
 //
-// void MultilanguageSupport::SetScripts( const Vector<Character>& text,
-//                                        CharacterIndex startIndex,
-//                                        Length numberOfCharacters,
-//                                        Vector<ScriptRun>& scripts );
+// void MultilanguageSupport::SetScripts(const Vector<Character>& text,
+//                                       CharacterIndex           startIndex,
+//                                       Length                   numberOfCharacters,
+//                                       Vector<ScriptRun>&       scripts);
 //
-// void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
-//                                           const Vector<ScriptRun>& scripts,
-//                                           const Vector<FontDescriptionRun>& fontDescriptions,
-//                                           FontId defaultFontId,
-//                                           CharacterIndex startIndex,
-//                                           Length numberOfCharacters,
-//                                           Vector<FontRun>& fonts );
+// void MultilanguageSupport::ValidateFonts(const Vector<Character>&                text,
+//                                          const Vector<ScriptRun>&                scripts,
+//                                          const Vector<FontDescriptionRun>&       fontDescriptions,
+//                                          const TextAbstraction::FontDescription& defaultFontDescription,
+//                                          TextAbstraction::PointSize26Dot6        defaultFontPointSize,
+//                                          float                                   fontSizeScale,
+//                                          CharacterIndex                          startIndex,
+//                                          Length                                  numberOfCharacters,
+//                                          Vector<FontRun>&                        fonts);
 
 //////////////////////////////////////////////////////////
 
@@ -67,7 +73,7 @@ namespace
 {
 
 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
-const unsigned int EMOJI_FONT_SIZE = 3968u;
+const unsigned int EMOJI_FONT_SIZE = 3840u; // 60 * 64
 const unsigned int NON_DEFAULT_FONT_SIZE = 40u;
 
 struct MergeFontDescriptionsData
@@ -76,9 +82,11 @@ struct MergeFontDescriptionsData
   Vector<FontDescriptionRun> fontDescriptionRuns;          ///< The font description runs.
   TextAbstraction::FontDescription defaultFontDescription; ///< The default font description.
   TextAbstraction::PointSize26Dot6 defaultPointSize;       ///< The default point size.
+  float        fontSizeScale;                              ///< The font's size scale.
   unsigned int startIndex;                                 ///< The start index.
   unsigned int numberOfCharacters;                         ///< The number of characters.
   Vector<FontId> expectedFontIds;                          ///< The expected font ids.
+  Vector<bool> expectedIsDefault;                          ///< The expected font ids.
 };
 
 struct ScriptsData
@@ -96,6 +104,7 @@ struct ValidateFontsData
   std::string                text;                ///< Input text.
   std::string                defaultFont;         ///< The default font.
   unsigned int               defaultFontSize;     ///< The default font size.
+  float                      fontSizeScale;       ///< The font's size scale.
   unsigned int               index;               ///< The index of the first character to update the script.
   unsigned int               numberOfCharacters;  ///< The numbers of characters to update the script.
   Vector<FontDescriptionRun> fontDescriptionRuns; ///< The font description runs.
@@ -103,18 +112,34 @@ struct ValidateFontsData
 };
 
 //////////////////////////////////////////////////////////
-
 bool MergeFontDescriptionsTest( const MergeFontDescriptionsData& data )
 {
+  TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
+
   Vector<FontId> fontIds;
   fontIds.Resize( data.startIndex + data.numberOfCharacters, 0u );
+  Vector<bool> isDefaultFont;
+  isDefaultFont.Resize( data.startIndex + data.numberOfCharacters, true );
+
+  for( unsigned int index = data.startIndex; index < data.startIndex + data.numberOfCharacters; ++index )
+  {
+    TextAbstraction::FontDescription fontDescription;
+    TextAbstraction::PointSize26Dot6 fontPointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
+
+    MergeFontDescriptions( data.fontDescriptionRuns,
+                           data.defaultFontDescription,
+                           data.defaultPointSize,
+                           data.fontSizeScale,
+                           index,
+                           fontDescription,
+                           fontPointSize,
+                           isDefaultFont[index] );
 
-  MergeFontDescriptions( data.fontDescriptionRuns,
-                         fontIds,
-                         data.defaultFontDescription,
-                         data.defaultPointSize,
-                         data.startIndex,
-                         data.numberOfCharacters );
+    if( !isDefaultFont[index] )
+    {
+      fontIds[index] = fontClient.GetFontId( fontDescription, fontPointSize );
+    }
+  }
 
   if( fontIds.Count() != data.expectedFontIds.Count() )
   {
@@ -141,6 +166,12 @@ bool MergeFontDescriptionsTest( const MergeFontDescriptionsData& data )
       std::cout << std::endl;
       return false;
     }
+
+    if( isDefaultFont[index] != data.expectedIsDefault[index] )
+    {
+      std::cout << data.description << " Different 'is font default' at index : " << index << ", is font default : " << isDefaultFont[index] << ", expected : " << data.expectedIsDefault[index] << std::endl;
+      return false;
+    }
   }
 
   return true;
@@ -154,9 +185,11 @@ bool ScriptsTest( const ScriptsData& data )
   Vector<Character> utf32;
   utf32.Resize( data.text.size() );
 
-  const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
-                                                   data.text.size(),
-                                                   &utf32[0u] );
+  const uint32_t numberOfCharacters = ( data.text.size() == 0 ) ? 0 :
+    Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
+                 data.text.size(),
+                 &utf32[0u] );
+
   utf32.Resize( numberOfCharacters );
 
   // 2) Set the script info.
@@ -186,6 +219,12 @@ bool ScriptsTest( const ScriptsData& data )
   if( scripts.Count() != data.scriptRuns.Count() )
   {
     tet_printf("ScriptsTest FAIL: different number of scripts. %d, should be %d\n", scripts.Count(), data.scriptRuns.Count() );
+    for( Vector<ScriptRun>::ConstIterator it = scripts.Begin(); it != scripts.End(); ++it)
+    {
+      const ScriptRun& run = *it;
+
+      std::cout << "  index : " << run.characterRun.characterIndex << ", num chars : " << run.characterRun.numberOfCharacters << ", script : [" << TextAbstraction::ScriptName[run.script] << "]" << std::endl;
+    }
     return false;
   }
 
@@ -208,7 +247,7 @@ bool ScriptsTest( const ScriptsData& data )
 
     if( scriptRun1.script != scriptRun2.script )
     {
-      tet_printf("ScriptsTest FAIL: different script. %s, should be %s\n", TextAbstraction::ScriptName[scriptRun1.script], TextAbstraction::ScriptName[scriptRun2.script] );
+      tet_printf("ScriptsTest FAIL: script index: %u, different script. %s, should be %s\n", index, TextAbstraction::ScriptName[scriptRun1.script], TextAbstraction::ScriptName[scriptRun2.script] );
       return false;
     }
   }
@@ -225,7 +264,8 @@ bool ValidateFontTest( const ValidateFontsData& data )
   Vector<Character> utf32;
   utf32.Resize( data.text.size() );
 
-  const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
+  const uint32_t numberOfCharacters = (data.text.size() == 0 ) ? 0 :
+    Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
                                                    data.text.size(),
                                                    &utf32[0u] );
   utf32.Resize( numberOfCharacters );
@@ -244,15 +284,20 @@ bool ValidateFontTest( const ValidateFontsData& data )
   // Get the default font id.
   const FontId defaultFontId = fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + data.defaultFont,
                                                      data.defaultFontSize );
+  TextAbstraction::FontDescription defaultFontDescription;
+  fontClient.GetDescription( defaultFontId, defaultFontDescription );
+
+  const TextAbstraction::PointSize26Dot6 defaultPointSize = fontClient.GetPointSize( defaultFontId );
 
-  // To be completed ...
   Vector<FontRun> fontRuns;
 
   // 3) Validate the fonts.
   multilanguageSupport.ValidateFonts( utf32,
                                       scripts,
                                       data.fontDescriptionRuns,
-                                      defaultFontId,
+                                      defaultFontDescription,
+                                      defaultPointSize,
+                                      data.fontSizeScale,
                                       0u,
                                       numberOfCharacters,
                                       fontRuns );
@@ -268,7 +313,9 @@ bool ValidateFontTest( const ValidateFontsData& data )
     multilanguageSupport.ValidateFonts( utf32,
                                         scripts,
                                         data.fontDescriptionRuns,
-                                        defaultFontId,
+                                        defaultFontDescription,
+                                        defaultPointSize,
+                                        data.fontSizeScale,
                                         data.index,
                                         data.numberOfCharacters,
                                         fontRuns );
@@ -414,12 +461,16 @@ int UtcDaliTextMergeFontDescriptions(void)
   TextAbstraction::FontDescription defaultFontDescription01;
   Vector<FontDescriptionRun> fontDescriptionRuns01;
   Vector<FontId> expectedFontIds01;
+  Vector<bool> expectedIsFontDefault01;
 
   TextAbstraction::FontDescription defaultFontDescription02;
   Vector<FontDescriptionRun> fontDescriptionRuns02;
   Vector<FontId> expectedFontIds02;
   expectedFontIds02.PushBack( 0u );
   expectedFontIds02.PushBack( 0u );
+  Vector<bool> expectedIsFontDefault02;
+  expectedIsFontDefault02.PushBack( true );
+  expectedIsFontDefault02.PushBack( true );
 
   TextAbstraction::FontDescription defaultFontDescription03;
   defaultFontDescription03.family = "DejaVu Serif";
@@ -433,9 +484,9 @@ int UtcDaliTextMergeFontDescriptions(void)
     },
     const_cast<char*>( "DejaVu Sans" ),
     11u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
+    TextAbstraction::FontWeight::NONE,
+    TextAbstraction::FontWidth::NONE,
+    TextAbstraction::FontSlant::NONE,
     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
     true,
     false,
@@ -451,8 +502,8 @@ int UtcDaliTextMergeFontDescriptions(void)
     },
     NULL,
     0u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontWeight::NONE,
+    TextAbstraction::FontWidth::NONE,
     TextAbstraction::FontSlant::ITALIC,
     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
     false,
@@ -470,8 +521,8 @@ int UtcDaliTextMergeFontDescriptions(void)
     NULL,
     0u,
     TextAbstraction::FontWeight::BOLD,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
+    TextAbstraction::FontWidth::NONE,
+    TextAbstraction::FontSlant::NONE,
     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
     false,
     true,
@@ -487,9 +538,9 @@ int UtcDaliTextMergeFontDescriptions(void)
     },
     NULL,
     0u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
+    TextAbstraction::FontWeight::NONE,
+    TextAbstraction::FontWidth::NONE,
+    TextAbstraction::FontSlant::NONE,
     NON_DEFAULT_FONT_SIZE,
     false,
     false,
@@ -505,9 +556,9 @@ int UtcDaliTextMergeFontDescriptions(void)
     },
     NULL,
     0u,
-    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWeight::NONE,
     TextAbstraction::FontWidth::EXPANDED,
-    TextAbstraction::FontSlant::NORMAL,
+    TextAbstraction::FontSlant::NONE,
     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
     false,
     false,
@@ -533,6 +584,17 @@ int UtcDaliTextMergeFontDescriptions(void)
   expectedFontIds03.PushBack( 3u );
   expectedFontIds03.PushBack( 6u );
   expectedFontIds03.PushBack( 6u );
+  Vector<bool> expectedIsFontDefault03;
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
+  expectedIsFontDefault03.PushBack( false );
 
   const MergeFontDescriptionsData data[] =
   {
@@ -541,27 +603,33 @@ int UtcDaliTextMergeFontDescriptions(void)
       fontDescriptionRuns01,
       defaultFontDescription01,
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       0u,
-      expectedFontIds01
+      expectedFontIds01,
+      expectedIsFontDefault01
     },
     {
       "No description runs.",
       fontDescriptionRuns02,
       defaultFontDescription02,
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       2u,
-      expectedFontIds02
+      expectedFontIds02,
+      expectedIsFontDefault02
     },
     {
       "Some description runs.",
       fontDescriptionRuns03,
       defaultFontDescription03,
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       10u,
-      expectedFontIds03
+      expectedFontIds03,
+      expectedIsFontDefault03
     }
   };
   const unsigned int numberOfTests = 3u;
@@ -667,7 +735,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
   {
     {
       0u,
-      16u,
+      15u,
     },
     TextAbstraction::LATIN
   };
@@ -679,7 +747,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
   {
     {
       0u,
-      16u,
+      15u,
     },
     TextAbstraction::LATIN
   };
@@ -691,7 +759,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
   {
     {
       0u,
-      16u,
+      15u,
     },
     TextAbstraction::LATIN
   };
@@ -906,7 +974,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       0u,
       3u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1101 =
   {
@@ -914,7 +982,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       3u,
       3u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1102 =
   {
@@ -930,7 +998,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       25u,
       3u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1104 =
   {
@@ -938,7 +1006,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       28u,
       3u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1105 =
   {
@@ -954,7 +1022,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       46u,
       2u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1107 =
   {
@@ -962,7 +1030,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       48u,
       2u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1108 =
   {
@@ -970,7 +1038,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       50u,
       2u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   scriptRuns11.PushBack( scriptRun1100 );
   scriptRuns11.PushBack( scriptRun1101 );
@@ -990,7 +1058,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       0u,
       3u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1201 =
   {
@@ -998,7 +1066,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       3u,
       3u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1202 =
   {
@@ -1006,7 +1074,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       6u,
       3u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   ScriptRun scriptRun1203 =
   {
@@ -1014,7 +1082,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       9u,
       2u,
     },
-    TextAbstraction::LATIN
+    TextAbstraction::UNKNOWN
   };
   scriptRuns12.PushBack( scriptRun1200 );
   scriptRuns12.PushBack( scriptRun1201 );
@@ -1028,7 +1096,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
       0u,
       4u,
     },
-    TextAbstraction::LATIN // An unknown script is transformed to LATIN
+    TextAbstraction::UNKNOWN
   };
   scriptRuns13.PushBack( scriptRun1301 );
 
@@ -1092,23 +1160,23 @@ int UtcDaliTextMultiLanguageSetScripts(void)
     },
     {
       "White spaces. At the beginning of the text.",
-      "    Hello world.",
+      "    Hello world",
       0u,
-      16u,
+      15u,
       scriptRuns04,
     },
     {
       "White spaces. At the end of the text.",
-      "Hello world.    ",
+      "Hello world    ",
       0u,
-      16u,
+      15u,
       scriptRuns05,
     },
     {
       "White spaces. At the middle of the text.",
-      "Hello     world.",
+      "Hello     world",
       0u,
-      16u,
+      15u,
       scriptRuns06,
     },
     {
@@ -1244,15 +1312,26 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
   const std::string pathName( pathNamePtr );
   free( pathNamePtr );
 
+  const PointSize26Dot6 pointSize01 = static_cast<PointSize26Dot6>( 21.f * 64.f );
+  const PointSize26Dot6 pointSize02 = static_cast<PointSize26Dot6>( 35.f * 64.f );
+
   // Load some fonts.
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
-  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenColorEmoji.ttf", EMOJI_FONT_SIZE );
+  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/BreezeColorEmoji.ttf", EMOJI_FONT_SIZE );
+  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf", pointSize01 );
+  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf", pointSize02 );
+  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf", pointSize01 );
+  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf", pointSize02 );
 
   // Font id 1 --> TizenSansArabicRegular.ttf
   // Font id 2 --> TizenSansHebrewRegular.ttf
-  // Font id 3 --> TizenColorEmoji.ttf
-  // Font id 4 --> (default)
+  // Font id 3 --> BreezeColorEmoji.ttf
+  // Font id 4 --> TizenSansRegular.ttf, size 8
+  // Font id 5 --> TizenSansRegular.ttf, size 16
+  // Font id 6 --> TizenSansHebrewRegular.ttf, size 8
+  // Font id 7 --> TizenSansHebrewRegular.ttf, size 16
+  // Font id 8 --> (default)
 
   Vector<FontRun> fontRuns01;
   Vector<FontDescriptionRun> fontDescriptions01;
@@ -1263,7 +1342,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       0u,
       11u
     },
-    4u
+    8u
   };
   Vector<FontRun> fontRuns02;
   fontRuns02.PushBack( fontRun0201 );
@@ -1295,7 +1374,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       0u,
       12u
     },
-    4u
+    8u
   };
   FontRun fontRun0302 =
   {
@@ -1303,7 +1382,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       12u,
       12u
     },
-    4u
+    8u
   };
   FontRun fontRun0303 =
   {
@@ -1311,7 +1390,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       24u,
       4u
     },
-    4u
+    8u
   };
   Vector<FontRun> fontRuns03;
   fontRuns03.PushBack( fontRun0301 );
@@ -1334,7 +1413,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       4u,
       1u
     },
-    4u
+    8u
   };
   FontRun fontRun0703 =
   {
@@ -1420,8 +1499,8 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       0u,
       4u
     },
-    const_cast<char*>( "TizenColorEmoji" ),
-    15u,
+    const_cast<char*>( "BreezeColorEmoji" ),
+    16u,
     TextAbstraction::FontWeight::NORMAL,
     TextAbstraction::FontWidth::NORMAL,
     TextAbstraction::FontSlant::NORMAL,
@@ -1434,6 +1513,242 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
   };
   fontDescriptions09.PushBack( fontDescription0901 );
 
+  FontRun fontRun1001 =
+  {
+    {
+      0u,
+      13u
+    },
+    4u
+  };
+  FontRun fontRun1002 =
+  {
+    {
+      13u,
+      9u
+    },
+    6u
+  };
+  FontRun fontRun1003 =
+  {
+    {
+      22u,
+      15u
+    },
+    5u
+  };
+  FontRun fontRun1004 =
+  {
+    {
+      37u,
+      9u
+    },
+    7u
+  };
+  Vector<FontRun> fontRuns10;
+  fontRuns10.PushBack( fontRun1001 );
+  fontRuns10.PushBack( fontRun1002 );
+  fontRuns10.PushBack( fontRun1003 );
+  fontRuns10.PushBack( fontRun1004 );
+
+  FontDescriptionRun fontDescription1001 =
+  {
+    {
+      0u,
+      13u
+    },
+    const_cast<char*>( "TizenSans" ),
+    9u,
+    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontSlant::NORMAL,
+    pointSize01,
+    true,
+    false,
+    false,
+    false,
+    true
+  };
+  FontDescriptionRun fontDescription1002 =
+  {
+    {
+      13u,
+      9u
+    },
+    const_cast<char*>( "TizenSansHebrew" ),
+    15u,
+    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontSlant::NORMAL,
+    pointSize01,
+    true,
+    false,
+    false,
+    false,
+    true
+  };
+  FontDescriptionRun fontDescription1003 =
+  {
+    {
+      22u,
+      15u
+    },
+    const_cast<char*>( "TizenSans" ),
+    9u,
+    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontSlant::NORMAL,
+    pointSize02,
+    true,
+    false,
+    false,
+    false,
+    true
+  };
+  FontDescriptionRun fontDescription1004 =
+  {
+    {
+      37u,
+      9u
+    },
+    const_cast<char*>( "TizenSansHebrew" ),
+    15u,
+    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontSlant::NORMAL,
+    pointSize02,
+    true,
+    false,
+    false,
+    false,
+    true
+  };
+  Vector<FontDescriptionRun> fontDescriptions10;
+  fontDescriptions10.PushBack( fontDescription1001 );
+  fontDescriptions10.PushBack( fontDescription1002 );
+  fontDescriptions10.PushBack( fontDescription1003 );
+  fontDescriptions10.PushBack( fontDescription1004 );
+
+  FontRun fontRun1101 =
+  {
+    {
+      0u,
+      22u
+    },
+    5u
+  };
+  Vector<FontRun> fontRuns11;
+  fontRuns11.PushBack( fontRun1101 );
+
+  FontDescriptionRun fontDescription1101 =
+  {
+    {
+      0,
+      22u
+    },
+    const_cast<char*>( "TizenSans" ),
+    9u,
+    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontSlant::NORMAL,
+    pointSize02,
+    true,
+    false,
+    false,
+    false,
+    true
+  };
+  Vector<FontDescriptionRun> fontDescriptions11;
+  fontDescriptions11.PushBack( fontDescription1101 );
+
+  FontRun fontRun1201 =
+  {
+    {
+      0u,
+      6u
+    },
+    8u
+  };
+  FontRun fontRun1202 =
+  {
+    {
+      6u,
+      1u
+    },
+    9u
+  };
+  FontRun fontRun1203 =
+  {
+    {
+      7u,
+      5u
+    },
+    8u
+  };
+  Vector<FontRun> fontRuns12;
+  fontRuns12.PushBack( fontRun1201 );
+  fontRuns12.PushBack( fontRun1202 );
+  fontRuns12.PushBack( fontRun1203 );
+
+  FontDescriptionRun fontDescription1201 =
+  {
+    {
+      0u,
+      6u
+    },
+    const_cast<char*>( "TizenSans" ),
+    9u,
+    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontSlant::NORMAL,
+    0u,
+    true,
+    false,
+    false,
+    false,
+    false
+  };
+  FontDescriptionRun fontDescription1202 =
+  {
+    {
+      6u,
+      1u
+    },
+    const_cast<char*>( "TizenSans" ),
+    9u,
+    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontSlant::NORMAL,
+    0u,
+    true,
+    false,
+    false,
+    false,
+    false
+  };
+  FontDescriptionRun fontDescription1203 =
+  {
+    {
+      7u,
+      5u
+    },
+    const_cast<char*>( "TizenSans" ),
+    9u,
+    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontSlant::NORMAL,
+    0u,
+    true,
+    false,
+    false,
+    false,
+    false
+  };
+  Vector<FontDescriptionRun> fontDescriptions12;
+  fontDescriptions12.PushBack( fontDescription1201 );
+  fontDescriptions12.PushBack( fontDescription1202 );
+  fontDescriptions12.PushBack( fontDescription1203 );
+
   const ValidateFontsData data[] =
   {
     {
@@ -1441,6 +1756,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       "",
       "/tizen/TizenSansRegular.ttf",
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       0u,
       fontDescriptions01,
@@ -1451,6 +1767,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       "Hello world",
       "/tizen/TizenSansRegular.ttf",
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       11u,
       fontDescriptions02,
@@ -1461,6 +1778,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       "Hello world\nhello world\ndemo",
       "/tizen/TizenSansRegular.ttf",
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       28u,
       fontDescriptions03,
@@ -1471,6 +1789,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       "Hello world\nhello world\ndemo",
       "/tizen/TizenSansRegular.ttf",
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       12u,
       fontDescriptions03,
@@ -1481,6 +1800,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       "Hello world\nhello world\ndemo",
       "/tizen/TizenSansRegular.ttf",
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       12u,
       12u,
       fontDescriptions03,
@@ -1491,6 +1811,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       "Hello world\nhello world\ndemo",
       "/tizen/TizenSansRegular.ttf",
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       24u,
       4u,
       fontDescriptions03,
@@ -1501,6 +1822,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       "שלום עולם",
       "/tizen/TizenSansRegular.ttf",
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       9u,
       fontDescriptions07,
@@ -1511,6 +1833,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       "שלום עולם",
       "/tizen/TizenSansHebrewRegular.ttf",
       TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
       0u,
       9u,
       fontDescriptions08,
@@ -1519,15 +1842,49 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
     {
       "Emojis",
       "\xF0\x9F\x98\x81\xF0\x9F\x98\x82\xF0\x9F\x98\x83\xF0\x9F\x98\x84",
-      "/tizen/TizenColorEmoji.ttf",
+      "/tizen/BreezeColorEmoji.ttf",
       EMOJI_FONT_SIZE,
+      1.0f,
       0u,
       4u,
       fontDescriptions09,
       fontRuns09
     },
+    {
+      "Mix text. Default font: latin. Different font sizes",
+      "Hello world, שלום עולם, hello world, שלום עולם",
+      "/tizen/TizenSansRegular.ttf",
+      TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
+      0u,
+      46u,
+      fontDescriptions10,
+      fontRuns10
+    },
+    {
+      "Unknown script -> changed to LATIN",
+      "WRC – The Official App",
+      "/tizen/TizenSansRegular.ttf",
+      TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
+      0u,
+      22u,
+      fontDescriptions11,
+      fontRuns11
+    },
+    {
+      "Common script.",
+      "Hello \tworld",
+      "/tizen/TizenSansRegular.ttf",
+      TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+      1.0f,
+      0u,
+      12u,
+      fontDescriptions12,
+      fontRuns12
+    },
   };
-  const unsigned int numberOfTests = 9u;
+  const unsigned int numberOfTests = 12u;
 
   for( unsigned int index = 0u; index < numberOfTests; ++index )
   {
@@ -1540,3 +1897,76 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
   tet_result(TET_PASS);
   END_TEST;
 }
+
+int UtcDaliTextMultiLanguageValidateFontsPerScriptCache(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliTextMultiLanguageValidateFontsPerScriptCache");
+
+  std::size_t MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE = 63u;
+  std::size_t VALIDATE_FONTS_PER_SCRIPT_REMAIN_COUNT   = 8u;
+
+  Dali::Toolkit::Text::Internal::ValidateFontsPerScript* validateFontsPerScript = new Dali::Toolkit::Text::Internal::ValidateFontsPerScript();
+
+  for(std::size_t i = 0u; i < MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE; i ++)
+  {
+    FontId fontId = i;
+    validateFontsPerScript->Cache(fontId);
+  }
+
+  DALI_TEST_EQUALS(MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE, validateFontsPerScript->mValidFonts.Count(), TEST_LOCATION);
+
+  FontId fontId = MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE;
+  validateFontsPerScript->Cache(fontId);
+
+  DALI_TEST_EQUALS(VALIDATE_FONTS_PER_SCRIPT_REMAIN_COUNT, validateFontsPerScript->mValidFonts.Count(), TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliTextMultiLanguageDefaultFontsCache(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliTextMultiLanguageDefaultFontsCache");
+
+  std::size_t MAX_DEFAULT_FONTS_CACHE_SIZE = 15;
+  std::size_t DEFAULT_FONTS_REMAIN_COUNT   = 2;
+
+  Dali::Toolkit::Text::Internal::DefaultFonts* defaultFontsPerScript = new Dali::Toolkit::Text::Internal::DefaultFonts();
+
+  for(std::size_t i = 0u; i < MAX_DEFAULT_FONTS_CACHE_SIZE; i ++)
+  {
+    TextAbstraction::FontDescription fontDescription;
+    FontId fontId = i;
+    defaultFontsPerScript->Cache(fontDescription, fontId);
+  }
+
+  DALI_TEST_EQUALS(MAX_DEFAULT_FONTS_CACHE_SIZE, defaultFontsPerScript->mFonts.size(), TEST_LOCATION);
+
+  TextAbstraction::FontDescription fontDescription;
+  FontId fontId = MAX_DEFAULT_FONTS_CACHE_SIZE;
+  defaultFontsPerScript->Cache(fontDescription, fontId);
+
+  DALI_TEST_EQUALS(DEFAULT_FONTS_REMAIN_COUNT, defaultFontsPerScript->mFonts.size(), TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliTextMultiLanguageLocaleChange(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliTextMultiLanguageLocaleChange");
+
+  Adaptor &adaptor = application.GetAdaptor();
+  MultilanguageSupport multilanguageSupport = MultilanguageSupport::Get();
+
+  std::string newLocale = "multi_TEST";
+  adaptor.LocaleChangedSignal().Emit(newLocale);
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS(newLocale.data(), GetImplementation(multilanguageSupport).GetLocale(), TEST_LOCATION);
+
+  END_TEST;
+}
\ No newline at end of file