[M120 Migration][MM] Support W3C EME
[platform/framework/web/chromium-efl.git] / tizen_src / ewk / unittest / utc_blink_ewk_value_compare.h
1 // Copyright 2016 Samsung Electronics. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <cstring>
6
7 #include "ewk_value_product.h"
8 #include "utc_blink_ewk_base.h"
9
10 template <typename T, size_t N>
11 size_t ArraySize(T (&)[N]) {
12   return N;
13 }
14
15 namespace {
16
17 const char* test_strings[] = {
18     "",                                   // empty
19     "a",                                  // one char
20     "    \n\n",                           // white space string
21     "testtesttest",                       // continous text string
22     "1 2 3 4 5 6 7 8 9 0",                // digits
23     "test test test 1 2 3 4 5 6 7 8 9 0"  // mixed
24 };
25
26 const char* test_keys[] = {"bool_key",   "double_key", "int_key",
27                            "string_key", "array_key",  "dictionary_key"};
28
29 enum TestKeysTypes {
30   BOOL_KEY,
31   DOUBLE_KEY,
32   INT_KEY,
33   STRING_KEY,
34   ARRAY_KEY,
35   DICT_KEY,
36   KEY_COUNT
37 };
38
39 bool CompareString(Ewk_Value v1, Ewk_Value v2);
40 bool CompareArray(Ewk_Value v1, Ewk_Value v2);
41 bool CompareDictionary(Ewk_Value v1, Ewk_Value v2);
42
43 bool Compare(Ewk_Value v1, Ewk_Value v2) {
44   if (ewk_value_type_get(v1) != ewk_value_type_get(v2))
45     return false;
46
47   if (ewk_value_type_get(v1) == ewk_value_boolean_type_get()) {
48     Eina_Bool b1, b2;
49     ewk_value_boolean_value_get(v1, &b1);
50     ewk_value_boolean_value_get(v2, &b2);
51     return b1 == b2;
52   } else if (ewk_value_type_get(v1) == ewk_value_double_type_get()) {
53     double d1, d2;
54     ewk_value_double_value_get(v1, &d1);
55     ewk_value_double_value_get(v2, &d2);
56     return d1 == d2;
57   } else if (ewk_value_type_get(v1) == ewk_value_int_type_get()) {
58     int i1, i2;
59     ewk_value_int_value_get(v1, &i1);
60     ewk_value_int_value_get(v2, &i2);
61     return i1 == i2;
62   } else if (ewk_value_type_get(v1) == ewk_value_string_type_get()) {
63     return CompareString(v1, v2);
64   } else if (ewk_value_type_get(v1) == ewk_value_array_type_get()) {
65     return CompareArray(v1, v2);
66   } else if (ewk_value_type_get(v1) == ewk_value_dictionary_type_get()) {
67     return CompareDictionary(v1, v2);
68   } else {
69     return false;
70   }
71 }
72
73 bool CompareString(Ewk_Value v1, Ewk_Value v2) {
74   if (ewk_value_type_get(v1) != ewk_value_string_type_get() ||
75       ewk_value_type_get(v2) != ewk_value_string_type_get())
76     return false;
77
78   Eina_Stringshare* s1 = ewk_value_string_value_get(v1);
79   Eina_Stringshare* s2 = ewk_value_string_value_get(v2);
80   bool cmp =
81       strcmp(static_cast<const char*>(s1), static_cast<const char*>(s2)) == 0;
82   eina_stringshare_del(s1);
83   eina_stringshare_del(s2);
84   return cmp;
85 }
86
87 bool CompareArray(Ewk_Value v1, Ewk_Value v2) {
88   if (ewk_value_type_get(v1) != ewk_value_array_type_get() ||
89       ewk_value_type_get(v2) != ewk_value_array_type_get() ||
90       ewk_value_array_is_mutable(v1) == EINA_FALSE ||
91       ewk_value_array_is_mutable(v2) == EINA_FALSE ||
92       ewk_value_array_count(v1) != ewk_value_array_count(v2))
93     return false;
94
95   size_t count = ewk_value_array_count(v1);
96   for (size_t i = 0; i < count; ++i) {
97     Ewk_Value a1, a2;
98     if (ewk_value_array_get(v1, i, &a1) == EINA_FALSE)
99       return false;
100     if (ewk_value_array_get(v2, i, &a2) == EINA_FALSE) {
101       ewk_value_unref(a1);
102       return false;
103     }
104     bool cmp = Compare(a1, a2);
105     ewk_value_unref(a1);
106     ewk_value_unref(a2);
107     if (!cmp)
108       return false;
109   }
110   return true;
111 }
112
113 bool CompareDictionary(Ewk_Value v1, Ewk_Value v2) {
114   if (ewk_value_type_get(v1) != ewk_value_dictionary_type_get() ||
115       ewk_value_type_get(v2) != ewk_value_dictionary_type_get() ||
116       ewk_value_dictionary_is_mutable(v1) == EINA_FALSE ||
117       ewk_value_dictionary_is_mutable(v2) == EINA_FALSE)
118     return false;
119
120   Ewk_Value k;
121   if (ewk_value_dictionary_keys(v1, &k) == EINA_FALSE)
122     return false;
123
124   size_t count = ewk_value_array_count(k);
125   for (size_t i = 0; i < count; ++i) {
126     Ewk_Value key;
127     if (ewk_value_array_get(k, i, &key) == EINA_FALSE)
128       return false;
129
130     Ewk_Value a1, a2;
131     if (ewk_value_dictionary_get(v1, key, &a1) == EINA_FALSE) {
132       ewk_value_unref(k);
133       return false;
134     }
135     if (ewk_value_dictionary_get(v2, key, &a2) == EINA_FALSE) {
136       ewk_value_unref(k);
137       ewk_value_unref(a1);
138       return false;
139     }
140
141     bool cmp = Compare(a1, a2);
142     ewk_value_unref(a1);
143     ewk_value_unref(a2);
144     if (!cmp) {
145       ewk_value_unref(k);
146       return false;
147     }
148   }
149   ewk_value_unref(k);
150   return true;
151 }
152
153 }  // namespace