Revert "[Tizen] Appendix log for ttrace + Print keycode and timestamp"
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Hash.cpp
1 /*
2  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <dali-test-suite-utils.h>
19 #include <dali/devel-api/common/hash.h>
20 #include <stdlib.h>
21
22 #include <string>
23
24 namespace
25 {
26 Dali::Vector<std::uint8_t> ConverterVector(const std::vector<std::uint8_t>& v)
27 {
28   Dali::Vector<std::uint8_t> res;
29   for(const auto it : v)
30   {
31     res.PushBack(it);
32   }
33   return res;
34 };
35 } // namespace
36
37 void utc_dali_hash_startup(void)
38 {
39   test_return_value = TET_UNDEF;
40 }
41
42 void utc_dali_hash_cleanup(void)
43 {
44   test_return_value = TET_PASS;
45 }
46
47 int UtcDaliHash(void)
48 {
49   // To fully test the Hash distribution we need to use a tool like http://code.google.com/p/smhasher/
50   // DALi currently uses the hash for variable length strings which come from:
51   // shader vert+frag source, font family + style, image filename.
52   TestApplication application;
53
54   tet_infoline("UtcDaliHash");
55
56   const std::string testString1("highp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
57   const std::string testString2("lowp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
58
59   DALI_TEST_CHECK(Dali::CalculateHash(testString1) != Dali::CalculateHash(testString2));
60   DALI_TEST_CHECK(Dali::CalculateHash(testString1, testString2) != Dali::CalculateHash(testString2, testString1));
61
62   END_TEST;
63 }
64
65 int UtcDaliHashNegative(void)
66 {
67   // negative test, check hash value == initial value
68   const std::string emptyString;
69
70   DALI_TEST_CHECK(Dali::CalculateHash(emptyString) != 0);
71   DALI_TEST_CHECK(Dali::CalculateHash(emptyString, emptyString) != 0);
72
73   END_TEST;
74 }
75
76 int UtcDaliHashBuffer(void)
77 {
78   TestApplication application;
79
80   tet_infoline("UtcDaliHashBuffer");
81
82   const std::vector<std::uint8_t> testBuffer1 = {11, 22, 33, 0, 0};
83   const std::vector<std::uint8_t> testBuffer2 = {11, 22, 33};
84   const std::vector<std::uint8_t> testBuffer3 = {0, 0, 33, 22, 11};
85   const std::vector<std::uint8_t> testBuffer4 = {};
86
87   const std::string testString1 = std::string(testBuffer1.begin(), testBuffer1.end());
88   const std::string testString2 = std::string(testBuffer2.begin(), testBuffer2.end());
89   const std::string testString3 = std::string(testBuffer3.begin(), testBuffer3.end());
90   const std::string testString4 = std::string(testBuffer4.begin(), testBuffer4.end());
91
92   tet_printf("const char * type terminate by \\0 char. we cannot seperate two buffer only by std::string().c_str()\n");
93   DALI_TEST_CHECK(Dali::CalculateHash(testString1) == Dali::CalculateHash(testString2));
94   DALI_TEST_CHECK(Dali::CalculateHash(testString3) == Dali::CalculateHash(testString4));
95
96   tet_printf("To fix this limitation, we make one more API for hashing std::vector<std::uint8_t>\n");
97   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer2));
98   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer3));
99   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer4));
100   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer3));
101   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer4));
102   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer3) != Dali::CalculateHash(testBuffer4));
103
104   END_TEST;
105 }
106
107 int UtcDaliHashBuffer02(void)
108 {
109   TestApplication application;
110
111   tet_infoline("UtcDaliHashBuffer02");
112   tet_infoline("Same string must have same hash value. even though generated by std::string and std::vector<std::uint8_t>.");
113
114   const std::string               testString("highp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
115   const std::vector<std::uint8_t> testBuffer = std::vector<std::uint8_t>(testString.begin(), testString.end());
116
117   DALI_TEST_CHECK(Dali::CalculateHash(testString) == Dali::CalculateHash(testBuffer));
118
119   END_TEST;
120 }
121
122 int UtcDaliHashBufferNegative(void)
123 {
124   // negative test, check hash value == initial value
125   const std::vector<std::uint8_t> emptyBuffer;
126   const std::vector<std::uint8_t> notEmptyBuffer1{0};
127   const std::vector<std::uint8_t> notEmptyBuffer2{0, 0};
128
129   // Check with zero-only buffers also did not zero.
130   DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != 0);
131   DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != 0);
132   DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer2) != 0);
133
134   // Check with zero-only buffers with difference lengths have difference value each other.
135   DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer1));
136   DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer2));
137   DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != Dali::CalculateHash(notEmptyBuffer2));
138
139   END_TEST;
140 }
141
142 int UtcDaliHashDaliBuffer(void)
143 {
144   TestApplication application;
145
146   tet_infoline("UtcDaliHashDaliBuffer");
147
148   Dali::Vector<std::uint8_t> testBuffer1 = ConverterVector({11, 22, 33, 0, 0});
149   Dali::Vector<std::uint8_t> testBuffer2 = ConverterVector({11, 22, 33});
150   Dali::Vector<std::uint8_t> testBuffer3 = ConverterVector({0, 0, 33, 22, 11});
151   Dali::Vector<std::uint8_t> testBuffer4 = ConverterVector({});
152
153   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer2));
154   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer3));
155   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer4));
156   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer3));
157   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer4));
158   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer3) != Dali::CalculateHash(testBuffer4));
159
160   END_TEST;
161 }
162
163 int UtcDaliHashDaliBuffer02(void)
164 {
165   TestApplication application;
166
167   tet_infoline("UtcDaliHashDaliBuffer02");
168   tet_infoline("Same string must have same hash value. even though generated by std::string and std::vector<std::uint8_t> and Dali::Vector<std::uint8_t>.");
169
170   const std::string                testString("highp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
171   const std::vector<std::uint8_t>  testBuffer  = std::vector<std::uint8_t>(testString.begin(), testString.end());
172   const Dali::Vector<std::uint8_t> testBuffer2 = ConverterVector(testBuffer);
173
174   DALI_TEST_CHECK(Dali::CalculateHash(testString) == Dali::CalculateHash(testBuffer2));
175   DALI_TEST_CHECK(Dali::CalculateHash(testBuffer) == Dali::CalculateHash(testBuffer2));
176
177   END_TEST;
178 }
179
180 int UtcDaliHashDaliBufferNegative(void)
181 {
182   // negative test, check hash value == initial value
183   const Dali::Vector<std::uint8_t> emptyBuffer;
184   const Dali::Vector<std::uint8_t> notEmptyBuffer1 = ConverterVector({0});
185   const Dali::Vector<std::uint8_t> notEmptyBuffer2 = ConverterVector({0, 0});
186
187   // Check with zero-only buffers also did not zero.
188   DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != 0);
189   DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != 0);
190   DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer2) != 0);
191
192   // Check with zero-only buffers with difference lengths have difference value each other.
193   DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer1));
194   DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer2));
195   DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != Dali::CalculateHash(notEmptyBuffer2));
196
197   END_TEST;
198 }