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 // 2) Clear the model.
84 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
85 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
87 if( 0u != charactersToGlyph.Count() )
89 // The number of glyphs to be removed.
90 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
92 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
93 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
94 glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.startIndex,
95 glyphsPerCharacter.Begin() + data.startIndex + data.numberOfCharacters );
97 // Update the character to glyph indices.
98 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
99 endIt = charactersToGlyph.End();
103 *it -= numberOfGlyphs;
107 // 3) Call the CreateGlyphsPerCharacterTable() function
108 visualModel->CreateGlyphsPerCharacterTable( data.startIndex,
109 data.numberOfCharacters );
111 // 4) Compare the results.
112 if( data.totalNumberOfCharacters != glyphsPerCharacter.Count() )
114 std::cout << " Different number of characters : " << glyphsPerCharacter.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
118 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
120 if( data.glyphsPerCharacter[i] != glyphsPerCharacter[i] )
122 std::cout << " Different number of glyphs for index " << i << std::endl;
123 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
125 std::cout << glyphsPerCharacter[j] << " ";
127 std::cout << std::endl;
128 std::cout << " expected" << std::endl;
129 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
131 std::cout << data.glyphsPerCharacter[j] << " ";
133 std::cout << std::endl;
141 bool SetCharacterToGlyphTest( const SetCharacterToGlyphData& data )
143 // 1) Create the model.
144 LogicalModelPtr logicalModel = LogicalModel::New();
145 VisualModelPtr visualModel = VisualModel::New();
146 Size textArea(100.f, 60.f);
149 const Vector<FontDescriptionRun> fontDescriptions;
150 const LayoutOptions options;
151 CreateTextModel( data.text,
159 // 2) Clear the model.
160 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
161 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
163 if( 0u != charactersToGlyph.Count() )
165 // The number of glyphs to be removed.
166 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
168 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
169 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
171 // Update the character to glyph indices.
172 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
173 endIt = charactersToGlyph.End();
177 *it -= numberOfGlyphs;
181 // 3) Call the CreateCharacterToGlyphTable() function
182 visualModel->CreateCharacterToGlyphTable( data.startIndex,
183 data.numberOfCharacters );
185 // 4) Compare the results.
186 if( data.totalNumberOfCharacters != charactersToGlyph.Count() )
188 std::cout << " Different number of character : " << charactersToGlyph.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
192 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
194 if( data.glyphsIndices[i] != charactersToGlyph[i] )
196 std::cout << " Different number of character to glyph index " << i << std::endl;
197 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
199 std::cout << charactersToGlyph[j] << " ";
201 std::cout << std::endl;
202 std::cout << " expected" << std::endl;
203 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
205 std::cout << data.glyphsIndices[j] << " ";
207 std::cout << std::endl;
217 //////////////////////////////////////////////////////////
219 int UtcDaliSetGlyphsPerCharacter(void)
221 ToolkitTestApplication application;
222 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
224 Length glyphsPerCharacter02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
225 Length glyphsPerCharacter03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
226 Length glyphsPerCharacter04[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u,
227 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
228 1u, 1u, 1u, 1u, 0u, 1u, 0u, 2u, 1u, 0u,
229 2u, 0u, 2u, 0u, 2u, 1u, 1u, 0u, 0u, 0u,
230 2u, 1u, 1u, 1u, 1u, 1u, 0u, 0u, 2u, 1u,
233 struct SetGlyphsPerCharacterData data[] =
236 "Zero characters text",
244 "Simple 1 to 1 text",
249 glyphsPerCharacter02,
252 "Text with different number of glyphs and characters.",
253 "Hello different world",
257 glyphsPerCharacter03,
260 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
261 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
265 glyphsPerCharacter04,
268 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
269 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
273 glyphsPerCharacter04,
276 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
277 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
281 glyphsPerCharacter04,
284 const unsigned int numberOfTests = 6u;
286 for( unsigned int index = 0u; index < numberOfTests; ++index )
288 if( !SetGlyphsPerCharacterTest( data[index] ) )
290 tet_result(TET_FAIL);
294 tet_result(TET_PASS);
298 int UtcDaliSetCharacterToGlyph(void)
300 ToolkitTestApplication application;
301 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
303 GlyphIndex glyphIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u };
304 GlyphIndex glyphIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u };
305 GlyphIndex glyphIndices04[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u,
306 21u, 22u, 23u, 23u, 24u, 24u, 26u, 27u, 27u, 29u, 29u, 31u, 31u, 33u,
307 34u, 35u, 35u, 35u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 42u, 42u, 44u, 45u, 45u, 47u, 48u };
309 struct SetCharacterToGlyphData data[] =
312 "Zero characters text",
320 "Simple 1 to 1 text",
328 "Text with different number of glyphs and characters.",
329 "Hello different world",
336 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
337 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
344 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
345 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
352 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
353 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
361 const unsigned int numberOfTests = 6u;
363 for( unsigned int index = 0u; index < numberOfTests; ++index )
365 if( !SetCharacterToGlyphTest( data[index] ) )
367 tet_result(TET_FAIL);
371 tet_result(TET_PASS);