2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <toolkit-text-model.h>
28 using namespace Toolkit;
31 // Tests the following functions.
33 // void CreateCharacterToGlyphTable( CharacterIndex startIndex,
34 // Length numberOfCharacters )
36 // void CreateGlyphsPerCharacterTable( CharacterIndex startIndex,
37 // Length numberOfCharacters )
40 //////////////////////////////////////////////////////////
45 struct SetGlyphsPerCharacterData
47 std::string description; ///< Description of the test.
48 std::string text; ///< Input text.
49 unsigned int startIndex; ///< The start index from where the glyphs per character table is set.
50 unsigned int numberOfCharacters; ///< The number of characters to set.
51 unsigned int totalNumberOfCharacters; ///< The total number of characters.
52 unsigned int* glyphsPerCharacter; ///< The number of glyphs per character.
55 struct SetCharacterToGlyphData
57 std::string description; ///< Description of the test.
58 std::string text; ///< Input text.
59 unsigned int startIndex; ///< The start index from where the character to glyph table is set.
60 unsigned int numberOfCharacters; ///< The number of characters to set.
61 unsigned int totalNumberOfCharacters; ///< The total number of characters.
62 unsigned int* glyphsIndices; ///< The glyph indices.
65 bool SetGlyphsPerCharacterTest( const SetGlyphsPerCharacterData& data )
67 // 1) Create the model.
68 LogicalModelPtr logicalModel = LogicalModel::New();
69 VisualModelPtr visualModel = VisualModel::New();
70 Size textArea(100.f, 60.f);
73 const Vector<FontDescriptionRun> fontDescriptions;
74 const LayoutOptions options;
75 CreateTextModel( data.text,
83 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
84 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
86 // 2) Clear the model.
88 GlyphIndex startGlyphIndex = 0u;
89 if( 0u != charactersToGlyph.Count() )
91 // The number of glyphs to be removed.
92 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
93 startGlyphIndex = charactersToGlyph[data.startIndex];
95 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
96 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
97 glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.startIndex,
98 glyphsPerCharacter.Begin() + data.startIndex + data.numberOfCharacters );
100 // Update the character to glyph indices.
101 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
102 endIt = charactersToGlyph.End();
106 *it -= numberOfGlyphs;
110 // 3) Call the CreateGlyphsPerCharacterTable() function
111 visualModel->CreateGlyphsPerCharacterTable( data.startIndex,
113 data.numberOfCharacters );
115 // 4) Compare the results.
116 if( data.totalNumberOfCharacters != glyphsPerCharacter.Count() )
118 std::cout << " Different number of characters : " << glyphsPerCharacter.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
122 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
124 if( data.glyphsPerCharacter[i] != glyphsPerCharacter[i] )
126 std::cout << " Different number of glyphs for index " << i << std::endl;
127 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
129 std::cout << glyphsPerCharacter[j] << " ";
131 std::cout << std::endl;
132 std::cout << " expected" << std::endl;
133 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
135 std::cout << data.glyphsPerCharacter[j] << " ";
137 std::cout << std::endl;
145 bool SetCharacterToGlyphTest( const SetCharacterToGlyphData& data )
147 // 1) Create the model.
148 LogicalModelPtr logicalModel = LogicalModel::New();
149 VisualModelPtr visualModel = VisualModel::New();
150 Size textArea(100.f, 60.f);
153 const Vector<FontDescriptionRun> fontDescriptions;
154 const LayoutOptions options;
155 CreateTextModel( data.text,
163 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
164 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
166 // 2) Clear the model.
168 GlyphIndex startGlyphIndex = 0u;
169 if( 0u != charactersToGlyph.Count() )
171 // The number of glyphs to be removed.
172 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
173 startGlyphIndex = charactersToGlyph[data.startIndex];
175 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
176 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
178 // Update the character to glyph indices.
179 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
180 endIt = charactersToGlyph.End();
184 *it -= numberOfGlyphs;
188 // 3) Call the CreateCharacterToGlyphTable() function
189 visualModel->CreateCharacterToGlyphTable( data.startIndex,
191 data.numberOfCharacters );
193 // 4) Compare the results.
194 if( data.totalNumberOfCharacters != charactersToGlyph.Count() )
196 std::cout << " Different number of character : " << charactersToGlyph.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
200 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
202 if( data.glyphsIndices[i] != charactersToGlyph[i] )
204 std::cout << " Different number of character to glyph index " << i << std::endl;
205 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
207 std::cout << charactersToGlyph[j] << " ";
209 std::cout << std::endl;
210 std::cout << " expected" << std::endl;
211 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
213 std::cout << data.glyphsIndices[j] << " ";
215 std::cout << std::endl;
225 //////////////////////////////////////////////////////////
227 int UtcDaliSetGlyphsPerCharacter(void)
229 ToolkitTestApplication application;
230 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
232 Length glyphsPerCharacter02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
233 Length glyphsPerCharacter03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
234 Length glyphsPerCharacter04[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u,
235 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
236 1u, 1u, 1u, 1u, 0u, 1u, 0u, 2u, 1u, 0u,
237 2u, 0u, 2u, 0u, 2u, 1u, 1u, 0u, 0u, 0u,
238 2u, 1u, 1u, 1u, 1u, 1u, 0u, 0u, 2u, 1u,
241 struct SetGlyphsPerCharacterData data[] =
244 "Zero characters text",
252 "Simple 1 to 1 text",
257 glyphsPerCharacter02,
260 "Text with different number of glyphs and characters.",
261 "Hello different world",
265 glyphsPerCharacter03,
268 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
269 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
273 glyphsPerCharacter04,
276 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
277 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
281 glyphsPerCharacter04,
284 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
285 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
289 glyphsPerCharacter04,
292 const unsigned int numberOfTests = 6u;
294 for( unsigned int index = 0u; index < numberOfTests; ++index )
296 if( !SetGlyphsPerCharacterTest( data[index] ) )
298 tet_result(TET_FAIL);
302 tet_result(TET_PASS);
306 int UtcDaliSetCharacterToGlyph(void)
308 ToolkitTestApplication application;
309 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
311 GlyphIndex glyphIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u };
312 GlyphIndex glyphIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u };
313 GlyphIndex glyphIndices04[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u,
314 21u, 22u, 23u, 23u, 24u, 24u, 26u, 27u, 27u, 29u, 29u, 31u, 31u, 33u,
315 34u, 35u, 35u, 35u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 42u, 42u, 44u, 45u, 45u, 47u, 48u };
317 struct SetCharacterToGlyphData data[] =
320 "Zero characters text",
328 "Simple 1 to 1 text",
336 "Text with different number of glyphs and characters.",
337 "Hello different world",
344 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
345 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
352 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
353 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
360 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
361 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
369 const unsigned int numberOfTests = 6u;
371 for( unsigned int index = 0u; index < numberOfTests; ++index )
373 if( !SetCharacterToGlyphTest( data[index] ) )
375 tet_result(TET_FAIL);
379 tet_result(TET_PASS);