annotate C++/tests/Js/main.cpp @ 398:94bfe7ba9a13

Js: - Rename some functions - Cleanup a lot - Add more documentation - Add specialization of getProperty and getGlobal to void to push on the stack
author David Demelier <markand@malikania.fr>
date Wed, 30 Sep 2015 19:59:12 +0200
parents 6b2db5425836
children 73517fd307dd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * TestJsUnicode.cpp -- test irccd JS functions
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013, 2014, 2015 David Demelier <markand@malikania.fr>
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <gtest/gtest.h>
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <Js.h>
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 using namespace js;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 /* --------------------------------------------------------
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 * Push & get
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 * -------------------------------------------------------- */
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 TEST(PushAndGet, boolean)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
33 context.push(true);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
34 ASSERT_TRUE(context.get<bool>(-1));
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
35 context.push(false);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
36 ASSERT_FALSE(context.get<bool>(-1));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 TEST(PushAndGet, integer)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
43 context.push(123);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
44 ASSERT_EQ(123, context.get<int>(-1));
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
45 context.push(456);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
46 ASSERT_EQ(456, context.get<int>(-1));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 TEST(PushAndGet, number)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
53 context.push(10.5);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
54 ASSERT_EQ(10.5, context.get<double>(-1));
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
55 context.push(50.1);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
56 ASSERT_EQ(50.1, context.get<double>(-1));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 TEST(PushAndGet, string)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
63 context.push("hello world!");
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
64 ASSERT_EQ("hello world!", context.get<std::string>(-1));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 /* --------------------------------------------------------
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 * Basics
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 * -------------------------------------------------------- */
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 TEST(Basics, global)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 // boolean
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
76 context.setGlobal("valueBoolean", true);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
77 ASSERT_TRUE(context.getGlobal<bool>("valueBoolean"));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 // integer
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
80 context.setGlobal("valueInteger", 123);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
81 ASSERT_EQ(123, context.getGlobal<int>("valueInteger"));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 TEST(Basics, top)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
87
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
88 int current = context.top();
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
89 context.push(true);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
90 ASSERT_EQ(current + 1, context.top());
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 TEST(Basics, pop1)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
97 int current = context.top();
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
98 context.push(true);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
99 context.pop();
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
100 ASSERT_EQ(current, context.top());
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 TEST(Basics, pop2)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
107 int current = context.top();
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
108 context.push(true);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
109 context.push(true);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
110 context.pop(2);
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
111 ASSERT_EQ(current, context.top());
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
114 TEST(Basics, putProperty)
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
118 context.push(Object{});
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
119 context.putProperty(-1, "x", 123);
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
120 ASSERT_EQ(123, context.getProperty<int>(-1, "x"));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 TEST(Basics, enumerate)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
127 context.push(Object{});
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
128 context.putProperty(-1, "x", 123);
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
129 context.putProperty(-1, "y", 456);
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
130 context.enumerate(-1, 0, true, [] (Context &ctx) {
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
131 ASSERT_EQ(DUK_TYPE_STRING, ctx.type(-2));
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
132 ASSERT_EQ(DUK_TYPE_NUMBER, ctx.type(-1));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
134 if (ctx.get<std::string>(-2) == "x")
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
135 ASSERT_EQ(123, ctx.get<int>(-1));
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
136 if (ctx.get<std::string>(-2) == "y")
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
137 ASSERT_EQ(456, ctx.get<int>(-1));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 });
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 TEST(Basics, call)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
145 context.push(Function{[] (Context &ctx) -> int {
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
146 ctx.setGlobal("x", 123);
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
147
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 return 0;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 }});
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
150 context.call();
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
152 ASSERT_EQ(123, context.getGlobal<int>("x"));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 /* ------------------------------------------------------------------
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 * Eval
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 * ------------------------------------------------------------------ */
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 TEST(Eval, simple)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
163 context.eval(Script{"x = 123;"});
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
164 ASSERT_EQ(123, context.getGlobal<int>("x"));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 TEST(Eval, function)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
171 context.eval(Script{"function f() { x = 123; }; f();"});
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
172 ASSERT_EQ(123, context.getGlobal<int>("x"));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 TEST(Eval, cfunction)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
178
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
179 context.setGlobal("f", Function{[] (Context &ctx) -> int {
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
180 ctx.setGlobal("x", 123);
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
181
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 return 0;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 }});
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
184 context.eval(Script{"f()"});
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
185
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
186 ASSERT_EQ(123, context.getGlobal<int>("x"));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 /* ------------------------------------------------------------------
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 * Protected eval
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 * ------------------------------------------------------------------ */
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
192
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 TEST(Peval, success)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 try {
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
198 context.peval(Script{"x = 1"});
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 } catch (const ErrorInfo &info) {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 FAIL() << "error unexpected: " << info.what();
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 TEST(Peval, failure)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 try {
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
209 context.peval(Script{"doesnotexists()"});
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 FAIL() << "expected exception";
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
212 } catch (const std::exception &) {
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 /* ------------------------------------------------------------------
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 * Exception handling
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 * ------------------------------------------------------------------ */
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
219
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 TEST(Exception, error)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 Context context;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
224 context.setGlobal("f", Function{[] (ContextPtr pctx) -> duk_idx_t {
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
225 Context ctx{pctx};
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
226
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
227 ctx.raise(Error{"error thrown"});
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 return 0;
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 }});
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
231 context.eval(Script{
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 "try {"
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 " f();"
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 "} catch (ex) {"
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 " name = ex.name;"
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 " message = ex.message;"
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 " received = true;"
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 "}"
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
239 });
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
240
392
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
241 ASSERT_TRUE(context.getGlobal<bool>("received"));
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
242 ASSERT_EQ("Error", context.getGlobal<std::string>("name"));
69adcefe73ae Js: make it object-oriented
David Demelier <markand@malikania.fr>
parents: 391
diff changeset
243 ASSERT_EQ("error thrown", context.getGlobal<std::string>("message"));
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 }
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
397
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
246 /* --------------------------------------------------------
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
247 * TypeInfo with shared
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
248 * -------------------------------------------------------- */
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
249
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
250 class Player {
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
251 public:
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
252 bool m_updated{false};
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
253 };
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
254
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
255 template <>
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
256 class TypeInfo<std::shared_ptr<Player>> : public TypeInfoShared<Player> {
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
257 public:
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
258 static void prototype(Context &ctx)
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
259 {
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
260 /* Create a temporary for the test */
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
261 ctx.push(Object{});
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
262
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
263 /* "update" method */
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
264 ctx.putProperty(-1, "update", Function{[] (ContextPtr pctx) -> duk_ret_t {
397
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
265 Context{pctx}.self<std::shared_ptr<Player>>()->m_updated = true;
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
266
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
267 return 0;
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
268 }});
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
269 }
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
270 };
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
271
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
272 TEST(Shared, simple)
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
273 {
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
274 Context ctx;
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
275 std::shared_ptr<Player> p{new Player};
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
276
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
277 ctx.push(p);
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
278 std::shared_ptr<Player> p2 = ctx.get<std::shared_ptr<Player>>(-1);
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
279
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
280 p2->m_updated = true;
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
281
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
282 ASSERT_TRUE(p->m_updated);
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
283 }
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
284
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
285 TEST(Shared, self)
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
286 {
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
287 Context ctx;
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
288 std::shared_ptr<Player> p{new Player};
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
289
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
290 try {
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
291 ctx.setGlobal("player", p);
398
David Demelier <markand@malikania.fr>
parents: 397
diff changeset
292 ctx.peval(Script{"player.update();"});
397
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
293
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
294 ASSERT_TRUE(p->m_updated);
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
295 } catch (const std::exception &ex) {
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
296 FAIL() << ex.what();
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
297 }
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
298 }
6b2db5425836 Js: initial support for objects as shared_ptr
David Demelier <markand@malikania.fr>
parents: 392
diff changeset
299
391
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 int main(int argc, char **argv)
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 {
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 testing::InitGoogleTest(&argc, argv);
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
303
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 return RUN_ALL_TESTS();
e2cefd0ee511 Add Js, Duktape wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 }