comparison modules/js/test/main.cpp @ 612:18ec7f4fc3de

Js: new style, closes #685
author David Demelier <markand@malikania.fr>
date Mon, 21 Aug 2017 11:08:49 +0200
parents f48bb09bccc7
children 266f32919d0a
comparison
equal deleted inserted replaced
611:beef249c796c 612:18ec7f4fc3de
1 /* 1 /*
2 * TestJsUnicode.cpp -- test irccd JS functions 2 * main.cpp -- test Duktape extras
3 * 3 *
4 * Copyright (c) 2016 David Demelier <markand@malikania.fr> 4 * Copyright (c) 2016 David Demelier <markand@malikania.fr>
5 * 5 *
6 * Permission to use, copy, modify, and/or distribute this software for any 6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above 7 * purpose with or without fee is hereby granted, provided that the above
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */ 17 */
18 18
19 #include <gtest/gtest.h> 19 #define BOOST_TEST_MODULE "Duktape"
20 #include <boost/test/unit_test.hpp>
20 21
21 #include <duktape.hpp> 22 #include <duktape.hpp>
22
23 TEST(Push, array)
24 {
25 UniqueContext ctx;
26
27 std::vector<int> v{1, 2, 3};
28
29 dukx_push_array(ctx, v, duk_push_int);
30 ASSERT_EQ(v, dukx_get_array(ctx, -1, duk_get_int));
31 }
32
33 TEST(Push, object)
34 {
35 UniqueContext ctx;
36
37 std::unordered_map<std::string, std::string> o{
38 { "file", "foo.txt" },
39 { "password", "test" }
40 };
41
42 dukx_push_object(ctx, o, dukx_push_std_string);
43 ASSERT_EQ(o, dukx_get_object(ctx, -1, dukx_get_std_string));
44 }
45
46 #if 0
47
48 TEST(Basics, enumerate)
49 {
50 duk::UniqueContext context;
51
52 ASSERT_EQ(0, duk::top(context));
53 duk::push(context, duk::Object{});
54 duk::putProperty(context, -1, "x", 123);
55 duk::putProperty(context, -1, "y", 456);
56 ASSERT_EQ(1, duk::top(context));
57 duk::enumerate(context, -1, 0, true, [] (duk::Context *ctx) {
58 ASSERT_EQ(DUK_TYPE_STRING, duk::type(ctx, -2));
59 ASSERT_EQ(DUK_TYPE_NUMBER, duk::type(ctx, -1));
60
61 if (duk::get<std::string>(ctx, -2) == "x")
62 ASSERT_EQ(123, duk::get<int>(ctx, -1));
63 if (duk::get<std::string>(ctx, -2) == "y")
64 ASSERT_EQ(456, duk::get<int>(ctx, -1));
65 });
66 ASSERT_EQ(1, duk::top(context));
67 }
68
69 /*
70 * Exception handling.
71 * ------------------------------------------------------------------
72 */
73
74 TEST(Exception, raise)
75 {
76 duk::UniqueContext context;
77
78 duk::putGlobal(context, "f", duk::Function{[] (duk::Context *ctx) -> duk_idx_t {
79 duk::raise(ctx, DUK_ERR_ERROR, "error thrown");
80
81 return 0;
82 }});
83 duk::evalString(context,
84 "try {"
85 " f();"
86 "} catch (ex) {"
87 " name = ex.name;"
88 " message = ex.message;"
89 " received = true;"
90 "}"
91 );
92
93 ASSERT_TRUE(duk::getGlobal<bool>(context, "received"));
94 ASSERT_EQ("Error", duk::getGlobal<std::string>(context, "name"));
95 ASSERT_EQ("error thrown", duk::getGlobal<std::string>(context, "message"));
96 }
97 23
98 /* 24 /*
99 * Standard exceptions. 25 * Standard exceptions.
100 * -------------------------------------------------------- 26 * --------------------------------------------------------
101 */ 27 */
102 28
103 TEST(StandardExceptions, error) 29 BOOST_AUTO_TEST_SUITE(standard_exceptions)
30
31 BOOST_AUTO_TEST_CASE(error)
104 { 32 {
105 duk::UniqueContext context; 33 dukx_unique_context ctx;
106 34
107 duk::putGlobal(context, "f", duk::Function{[] (duk::Context *ctx) -> duk_idx_t { 35 duk_push_c_function(ctx, [] (duk_context* ctx) -> duk_idx_t {
108 duk::raise(ctx, duk::Error("error thrown")); 36 return dukx_throw(ctx, dukx_error("error thrown"));
109 37 }, 0);
110 return 0; 38 duk_put_global_string(ctx, "f");
111 }}); 39 duk_peval_string(ctx,
112 duk::evalString(context,
113 "try {" 40 "try {"
114 " f();" 41 " f();"
115 "} catch (ex) {" 42 "} catch (ex) {"
116 " name = ex.name;" 43 " name = ex.name;"
117 " message = ex.message;" 44 " message = ex.message;"
118 " received = true;" 45 " instance = (ex instanceof Error);"
119 " correct = (ex instanceof Error);"
120 "}" 46 "}"
121 ); 47 );
122 48
123 ASSERT_TRUE(duk::getGlobal<bool>(context, "received")); 49 duk_get_global_string(ctx, "name");
124 ASSERT_EQ("Error", duk::getGlobal<std::string>(context, "name")); 50 BOOST_REQUIRE_EQUAL("Error", dukx_get_std_string(ctx, -1));
125 ASSERT_EQ("error thrown", duk::getGlobal<std::string>(context, "message")); 51 duk_get_global_string(ctx, "message");
126 ASSERT_TRUE(duk::getGlobal<bool>(context, "correct")); 52 BOOST_REQUIRE_EQUAL("error thrown", dukx_get_std_string(ctx, -1));
53 duk_get_global_string(ctx, "instance");
54 BOOST_REQUIRE(duk_get_boolean(ctx, -1));
127 } 55 }
128 56
129 TEST(StandardExceptions, evalError) 57 BOOST_AUTO_TEST_CASE(eval_error)
130 { 58 {
131 duk::UniqueContext context; 59 dukx_unique_context ctx;
132 60
133 duk::putGlobal(context, "f", duk::Function{[] (duk::Context *ctx) -> duk_idx_t { 61 duk_push_c_function(ctx, [] (duk_context* ctx) -> duk_idx_t {
134 duk::raise(ctx, duk::EvalError("error thrown")); 62 return dukx_throw(ctx, dukx_eval_error("error thrown"));
135 63 }, 0);
136 return 0; 64 duk_put_global_string(ctx, "f");
137 }}); 65 duk_peval_string(ctx,
138 duk::evalString(context,
139 "try {" 66 "try {"
140 " f();" 67 " f();"
141 "} catch (ex) {" 68 "} catch (ex) {"
142 " name = ex.name;" 69 " name = ex.name;"
143 " message = ex.message;" 70 " message = ex.message;"
144 " received = true;" 71 " instance = (ex instanceof EvalError);"
145 " correct = (ex instanceof EvalError);"
146 "}" 72 "}"
147 ); 73 );
148 74
149 ASSERT_TRUE(duk::getGlobal<bool>(context, "received")); 75 duk_get_global_string(ctx, "name");
150 ASSERT_EQ("EvalError", duk::getGlobal<std::string>(context, "name")); 76 BOOST_REQUIRE_EQUAL("EvalError", dukx_get_std_string(ctx, -1));
151 ASSERT_EQ("error thrown", duk::getGlobal<std::string>(context, "message")); 77 duk_get_global_string(ctx, "message");
152 ASSERT_TRUE(duk::getGlobal<bool>(context, "correct")); 78 BOOST_REQUIRE_EQUAL("error thrown", dukx_get_std_string(ctx, -1));
79 duk_get_global_string(ctx, "instance");
80 BOOST_REQUIRE(duk_get_boolean(ctx, -1));
153 } 81 }
154 82
155 TEST(StandardExceptions, rangeError) 83 BOOST_AUTO_TEST_CASE(range_error)
156 { 84 {
157 duk::UniqueContext context; 85 dukx_unique_context ctx;
158 86
159 duk::putGlobal(context, "f", duk::Function{[] (duk::Context *ctx) -> duk_idx_t { 87 duk_push_c_function(ctx, [] (duk_context* ctx) -> duk_idx_t {
160 duk::raise(ctx, duk::RangeError("error thrown")); 88 return dukx_throw(ctx, dukx_range_error("error thrown"));
161 89 }, 0);
162 return 0; 90 duk_put_global_string(ctx, "f");
163 }}); 91 duk_peval_string(ctx,
164 duk::evalString(context,
165 "try {" 92 "try {"
166 " f();" 93 " f();"
167 "} catch (ex) {" 94 "} catch (ex) {"
168 " name = ex.name;" 95 " name = ex.name;"
169 " message = ex.message;" 96 " message = ex.message;"
170 " received = true;" 97 " instance = (ex instanceof RangeError);"
171 " correct = (ex instanceof RangeError);"
172 "}" 98 "}"
173 ); 99 );
174 100
175 ASSERT_TRUE(duk::getGlobal<bool>(context, "received")); 101 duk_get_global_string(ctx, "name");
176 ASSERT_EQ("RangeError", duk::getGlobal<std::string>(context, "name")); 102 BOOST_REQUIRE_EQUAL("RangeError", dukx_get_std_string(ctx, -1));
177 ASSERT_EQ("error thrown", duk::getGlobal<std::string>(context, "message")); 103 duk_get_global_string(ctx, "message");
178 ASSERT_TRUE(duk::getGlobal<bool>(context, "correct")); 104 BOOST_REQUIRE_EQUAL("error thrown", dukx_get_std_string(ctx, -1));
105 duk_get_global_string(ctx, "instance");
106 BOOST_REQUIRE(duk_get_boolean(ctx, -1));
179 } 107 }
180 108
181 TEST(StandardExceptions, referenceError) 109 BOOST_AUTO_TEST_CASE(reference_error)
182 { 110 {
183 duk::UniqueContext context; 111 dukx_unique_context ctx;
184 112
185 duk::putGlobal(context, "f", duk::Function{[] (duk::Context *ctx) -> duk_idx_t { 113 duk_push_c_function(ctx, [] (duk_context* ctx) -> duk_idx_t {
186 duk::raise(ctx, duk::ReferenceError("error thrown")); 114 return dukx_throw(ctx, dukx_reference_error("error thrown"));
187 115 }, 0);
188 return 0; 116 duk_put_global_string(ctx, "f");
189 }}); 117 duk_peval_string(ctx,
190 duk::evalString(context,
191 "try {" 118 "try {"
192 " f();" 119 " f();"
193 "} catch (ex) {" 120 "} catch (ex) {"
194 " name = ex.name;" 121 " name = ex.name;"
195 " message = ex.message;" 122 " message = ex.message;"
196 " received = true;" 123 " instance = (ex instanceof ReferenceError);"
197 " correct = (ex instanceof ReferenceError);"
198 "}" 124 "}"
199 ); 125 );
200 126
201 ASSERT_TRUE(duk::getGlobal<bool>(context, "received")); 127 duk_get_global_string(ctx, "name");
202 ASSERT_EQ("ReferenceError", duk::getGlobal<std::string>(context, "name")); 128 BOOST_REQUIRE_EQUAL("ReferenceError", dukx_get_std_string(ctx, -1));
203 ASSERT_EQ("error thrown", duk::getGlobal<std::string>(context, "message")); 129 duk_get_global_string(ctx, "message");
204 ASSERT_TRUE(duk::getGlobal<bool>(context, "correct")); 130 BOOST_REQUIRE_EQUAL("error thrown", dukx_get_std_string(ctx, -1));
131 duk_get_global_string(ctx, "instance");
132 BOOST_REQUIRE(duk_get_boolean(ctx, -1));
205 } 133 }
206 134
207 TEST(StandardExceptions, syntaxError) 135 BOOST_AUTO_TEST_CASE(syntax_error)
208 { 136 {
209 duk::UniqueContext context; 137 dukx_unique_context ctx;
210 138
211 duk::putGlobal(context, "f", duk::Function{[] (duk::Context *ctx) -> duk_idx_t { 139 duk_push_c_function(ctx, [] (duk_context* ctx) -> duk_idx_t {
212 duk::raise(ctx, duk::SyntaxError("error thrown")); 140 return dukx_throw(ctx, dukx_syntax_error("error thrown"));
213 141 }, 0);
214 return 0; 142 duk_put_global_string(ctx, "f");
215 }}); 143 duk_peval_string(ctx,
216 duk::evalString(context,
217 "try {" 144 "try {"
218 " f();" 145 " f();"
219 "} catch (ex) {" 146 "} catch (ex) {"
220 " name = ex.name;" 147 " name = ex.name;"
221 " message = ex.message;" 148 " message = ex.message;"
222 " received = true;" 149 " instance = (ex instanceof SyntaxError);"
223 " correct = (ex instanceof SyntaxError);"
224 "}" 150 "}"
225 ); 151 );
226 152
227 ASSERT_TRUE(duk::getGlobal<bool>(context, "received")); 153 duk_get_global_string(ctx, "name");
228 ASSERT_EQ("SyntaxError", duk::getGlobal<std::string>(context, "name")); 154 BOOST_REQUIRE_EQUAL("SyntaxError", dukx_get_std_string(ctx, -1));
229 ASSERT_EQ("error thrown", duk::getGlobal<std::string>(context, "message")); 155 duk_get_global_string(ctx, "message");
230 ASSERT_TRUE(duk::getGlobal<bool>(context, "correct")); 156 BOOST_REQUIRE_EQUAL("error thrown", dukx_get_std_string(ctx, -1));
157 duk_get_global_string(ctx, "instance");
158 BOOST_REQUIRE(duk_get_boolean(ctx, -1));
231 } 159 }
232 160
233 TEST(StandardExceptions, typeError) 161 BOOST_AUTO_TEST_CASE(type_error)
234 { 162 {
235 duk::UniqueContext context; 163 dukx_unique_context ctx;
236 164
237 duk::putGlobal(context, "f", duk::Function{[] (duk::Context *ctx) -> duk_idx_t { 165 duk_push_c_function(ctx, [] (duk_context* ctx) -> duk_idx_t {
238 duk::raise(ctx, duk::TypeError("error thrown")); 166 return dukx_throw(ctx, dukx_type_error("error thrown"));
239 167 }, 0);
240 return 0; 168 duk_put_global_string(ctx, "f");
241 }}); 169 duk_peval_string(ctx,
242 duk::evalString(context,
243 "try {" 170 "try {"
244 " f();" 171 " f();"
245 "} catch (ex) {" 172 "} catch (ex) {"
246 " name = ex.name;" 173 " name = ex.name;"
247 " message = ex.message;" 174 " message = ex.message;"
248 " received = true;" 175 " instance = (ex instanceof TypeError);"
249 " correct = (ex instanceof TypeError);"
250 "}" 176 "}"
251 ); 177 );
252 178
253 ASSERT_TRUE(duk::getGlobal<bool>(context, "received")); 179 duk_get_global_string(ctx, "name");
254 ASSERT_EQ("TypeError", duk::getGlobal<std::string>(context, "name")); 180 BOOST_REQUIRE_EQUAL("TypeError", dukx_get_std_string(ctx, -1));
255 ASSERT_EQ("error thrown", duk::getGlobal<std::string>(context, "message")); 181 duk_get_global_string(ctx, "message");
256 ASSERT_TRUE(duk::getGlobal<bool>(context, "correct")); 182 BOOST_REQUIRE_EQUAL("error thrown", dukx_get_std_string(ctx, -1));
183 duk_get_global_string(ctx, "instance");
184 BOOST_REQUIRE(duk_get_boolean(ctx, -1));
257 } 185 }
258 186
259 TEST(StandardExceptions, uriError) 187 BOOST_AUTO_TEST_CASE(uriError)
260 { 188 {
261 duk::UniqueContext context;
262
263 duk::putGlobal(context, "f", duk::Function{[] (duk::Context *ctx) -> duk_idx_t {
264 duk::raise(ctx, duk::URIError("error thrown"));
265
266 return 0;
267 }});
268 duk::evalString(context,
269 "try {"
270 " f();"
271 "} catch (ex) {"
272 " name = ex.name;"
273 " message = ex.message;"
274 " received = true;"
275 " correct = (ex instanceof URIError);"
276 "}"
277 );
278
279 ASSERT_TRUE(duk::getGlobal<bool>(context, "received"));
280 ASSERT_EQ("URIError", duk::getGlobal<std::string>(context, "name"));
281 ASSERT_EQ("error thrown", duk::getGlobal<std::string>(context, "message"));
282 ASSERT_TRUE(duk::getGlobal<bool>(context, "correct"));
283 } 189 }
284 190
285 #endif 191 BOOST_AUTO_TEST_SUITE_END()
286
287 int main(int argc, char **argv)
288 {
289 testing::InitGoogleTest(&argc, argv);
290
291 return RUN_ALL_TESTS();
292 }