summaryrefslogtreecommitdiff
path: root/tests/objects
diff options
context:
space:
mode:
authorLorenz Wildberg <lorenz@wild-fisch.de>2021-12-08 18:41:39 +0000
committerRico Tzschichholz <ricotz@ubuntu.com>2022-01-25 13:41:43 +0100
commit3e38dc450eb5a1ebf1dd5d1b88ae69f660097429 (patch)
treefd690b772cedf991c2480b2bb938701a036997f2 /tests/objects
parent44195a02c9d26453dc698282deb4947425a4b0b1 (diff)
downloadvala-3e38dc450eb5a1ebf1dd5d1b88ae69f660097429.tar.gz
vala: Add support to infer return type of dynamic signals
Diffstat (limited to 'tests/objects')
-rw-r--r--tests/objects/signals-dynamic-emit.c-expected76
-rw-r--r--tests/objects/signals-dynamic-emit.vala15
-rw-r--r--tests/objects/signals-dynamic-invalid-return-type.test12
-rw-r--r--tests/objects/signals-emit.c-expected76
-rw-r--r--tests/objects/signals-emit.vala15
5 files changed, 194 insertions, 0 deletions
diff --git a/tests/objects/signals-dynamic-emit.c-expected b/tests/objects/signals-dynamic-emit.c-expected
index 5b04c9bbb..7c71e3b42 100644
--- a/tests/objects/signals-dynamic-emit.c-expected
+++ b/tests/objects/signals-dynamic-emit.c-expected
@@ -33,6 +33,7 @@ enum {
static GParamSpec* foo_properties[FOO_NUM_PROPERTIES];
enum {
FOO_SIG_SIGNAL,
+ FOO_SIG2_SIGNAL,
FOO_NUM_SIGNALS
};
static guint foo_signals[FOO_NUM_SIGNALS] = {0};
@@ -65,15 +66,28 @@ static void g_cclosure_user_marshal_VOID__STRING_INT (GClosure * closure,
const GValue * param_values,
gpointer invocation_hint,
gpointer marshal_data);
+static void g_cclosure_user_marshal_BOOLEAN__STRING_INT (GClosure * closure,
+ GValue * return_value,
+ guint n_param_values,
+ const GValue * param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data);
static GType foo_get_type_once (void);
VALA_EXTERN void sig_cb (GObject* o,
const gchar* s,
gint i);
+VALA_EXTERN gboolean sig2_cb (GObject* o,
+ const gchar* s,
+ gint i);
static void _vala_main (void);
static void _sig_cb_dynamic_sig0_ (GObject* _sender,
const gchar* s,
gint i,
gpointer self);
+static gboolean _sig2_cb_dynamic_sig21_ (GObject* _sender,
+ const gchar* s,
+ gint i,
+ gpointer self);
Foo*
foo_construct (GType object_type)
@@ -116,11 +130,41 @@ g_cclosure_user_marshal_VOID__STRING_INT (GClosure * closure,
}
static void
+g_cclosure_user_marshal_BOOLEAN__STRING_INT (GClosure * closure,
+ GValue * return_value,
+ guint n_param_values,
+ const GValue * param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_INT) (gpointer data1, const char* arg_1, gint arg_2, gpointer data2);
+ register GMarshalFunc_BOOLEAN__STRING_INT callback;
+ register GCClosure * cc;
+ register gpointer data1;
+ register gpointer data2;
+ gboolean v_return;
+ cc = (GCClosure *) closure;
+ g_return_if_fail (return_value != NULL);
+ g_return_if_fail (n_param_values == 3);
+ if (G_CCLOSURE_SWAP_DATA (closure)) {
+ data1 = closure->data;
+ data2 = param_values->data[0].v_pointer;
+ } else {
+ data1 = param_values->data[0].v_pointer;
+ data2 = closure->data;
+ }
+ callback = (GMarshalFunc_BOOLEAN__STRING_INT) (marshal_data ? marshal_data : cc->callback);
+ v_return = callback (data1, g_value_get_string (param_values + 1), g_value_get_int (param_values + 2), data2);
+ g_value_set_boolean (return_value, v_return);
+}
+
+static void
foo_class_init (FooClass * klass,
gpointer klass_data)
{
foo_parent_class = g_type_class_peek_parent (klass);
foo_signals[FOO_SIG_SIGNAL] = g_signal_new ("sig", TYPE_FOO, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT);
+ foo_signals[FOO_SIG2_SIGNAL] = g_signal_new ("sig2", TYPE_FOO, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_BOOLEAN__STRING_INT, G_TYPE_BOOLEAN, 2, G_TYPE_STRING, G_TYPE_INT);
}
static void
@@ -162,6 +206,21 @@ sig_cb (GObject* o,
_vala_assert (i == 42, "i == 42");
}
+gboolean
+sig2_cb (GObject* o,
+ const gchar* s,
+ gint i)
+{
+ gboolean result;
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (o, G_TYPE_OBJECT), FALSE);
+ g_return_val_if_fail (s != NULL, FALSE);
+ success = TRUE;
+ _vala_assert (g_strcmp0 (s, "foo") == 0, "s == \"foo\"");
+ _vala_assert (i == 42, "i == 42");
+ result = TRUE;
+ return result;
+}
+
static void
_sig_cb_dynamic_sig0_ (GObject* _sender,
const gchar* s,
@@ -171,17 +230,34 @@ _sig_cb_dynamic_sig0_ (GObject* _sender,
sig_cb (_sender, s, i);
}
+static gboolean
+_sig2_cb_dynamic_sig21_ (GObject* _sender,
+ const gchar* s,
+ gint i,
+ gpointer self)
+{
+ gboolean result;
+ result = sig2_cb (_sender, s, i);
+ return result;
+}
+
static void
_vala_main (void)
{
GObject* dfoo = NULL;
Foo* _tmp0_;
+ gboolean _tmp1_ = FALSE;
_tmp0_ = foo_new ();
dfoo = G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, G_TYPE_OBJECT, GObject);
g_signal_connect (dfoo, "sig", (GCallback) _sig_cb_dynamic_sig0_, NULL);
success = FALSE;
g_signal_emit_by_name (dfoo, "sig", "foo", 42);
_vala_assert (success, "success");
+ g_signal_connect (dfoo, "sig2", (GCallback) _sig2_cb_dynamic_sig21_, NULL);
+ success = FALSE;
+ g_signal_emit_by_name (dfoo, "sig2", "foo", 42, &_tmp1_);
+ _vala_assert (_tmp1_, "dfoo.sig2.emit (\"foo\", 42)");
+ _vala_assert (success, "success");
_g_object_unref0 (dfoo);
}
diff --git a/tests/objects/signals-dynamic-emit.vala b/tests/objects/signals-dynamic-emit.vala
index 55d6fac98..8605bc5d3 100644
--- a/tests/objects/signals-dynamic-emit.vala
+++ b/tests/objects/signals-dynamic-emit.vala
@@ -1,5 +1,7 @@
class Foo : Object {
public signal void sig (string s, int i);
+
+ public signal bool sig2 (string s, int i);
}
void sig_cb (Object o, string s, int i) {
@@ -8,6 +10,13 @@ void sig_cb (Object o, string s, int i) {
assert (i == 42);
}
+bool sig2_cb (Object o, string s, int i) {
+ success = true;
+ assert (s == "foo");
+ assert (i == 42);
+ return true;
+}
+
bool success = false;
void main () {
@@ -17,4 +26,10 @@ void main () {
success = false;
dfoo.sig.emit ("foo", 42);
assert (success);
+
+ dfoo.sig2.connect (sig2_cb);
+
+ success = false;
+ assert (dfoo.sig2.emit ("foo", 42));
+ assert (success);
}
diff --git a/tests/objects/signals-dynamic-invalid-return-type.test b/tests/objects/signals-dynamic-invalid-return-type.test
new file mode 100644
index 000000000..4c7c1ceef
--- /dev/null
+++ b/tests/objects/signals-dynamic-invalid-return-type.test
@@ -0,0 +1,12 @@
+Invalid Code
+
+class Foo : Object {
+ public signal void sig ();
+}
+
+void main () {
+ var real = new Foo ();
+ dynamic Object foo = real;
+
+ var bar = foo.sig.emit ();
+}
diff --git a/tests/objects/signals-emit.c-expected b/tests/objects/signals-emit.c-expected
index e249f6fe7..3836abc87 100644
--- a/tests/objects/signals-emit.c-expected
+++ b/tests/objects/signals-emit.c-expected
@@ -33,6 +33,7 @@ enum {
static GParamSpec* foo_properties[FOO_NUM_PROPERTIES];
enum {
FOO_SIG_SIGNAL,
+ FOO_SIG2_SIGNAL,
FOO_NUM_SIGNALS
};
static guint foo_signals[FOO_NUM_SIGNALS] = {0};
@@ -66,15 +67,28 @@ static void g_cclosure_user_marshal_VOID__STRING_INT (GClosure * closure,
const GValue * param_values,
gpointer invocation_hint,
gpointer marshal_data);
+static void g_cclosure_user_marshal_BOOLEAN__STRING_INT (GClosure * closure,
+ GValue * return_value,
+ guint n_param_values,
+ const GValue * param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data);
static GType foo_get_type_once (void);
VALA_EXTERN void sig_cb (GObject* o,
const gchar* s,
gint i);
+VALA_EXTERN gboolean sig2_cb (GObject* o,
+ const gchar* s,
+ gint i);
static void _vala_main (void);
static void _sig_cb_foo_sig (Foo* _sender,
const gchar* s,
gint i,
gpointer self);
+static gboolean _sig2_cb_foo_sig2 (Foo* _sender,
+ const gchar* s,
+ gint i,
+ gpointer self);
void
foo_fire (Foo* self)
@@ -124,11 +138,41 @@ g_cclosure_user_marshal_VOID__STRING_INT (GClosure * closure,
}
static void
+g_cclosure_user_marshal_BOOLEAN__STRING_INT (GClosure * closure,
+ GValue * return_value,
+ guint n_param_values,
+ const GValue * param_values,
+ gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_INT) (gpointer data1, const char* arg_1, gint arg_2, gpointer data2);
+ register GMarshalFunc_BOOLEAN__STRING_INT callback;
+ register GCClosure * cc;
+ register gpointer data1;
+ register gpointer data2;
+ gboolean v_return;
+ cc = (GCClosure *) closure;
+ g_return_if_fail (return_value != NULL);
+ g_return_if_fail (n_param_values == 3);
+ if (G_CCLOSURE_SWAP_DATA (closure)) {
+ data1 = closure->data;
+ data2 = param_values->data[0].v_pointer;
+ } else {
+ data1 = param_values->data[0].v_pointer;
+ data2 = closure->data;
+ }
+ callback = (GMarshalFunc_BOOLEAN__STRING_INT) (marshal_data ? marshal_data : cc->callback);
+ v_return = callback (data1, g_value_get_string (param_values + 1), g_value_get_int (param_values + 2), data2);
+ g_value_set_boolean (return_value, v_return);
+}
+
+static void
foo_class_init (FooClass * klass,
gpointer klass_data)
{
foo_parent_class = g_type_class_peek_parent (klass);
foo_signals[FOO_SIG_SIGNAL] = g_signal_new ("sig", TYPE_FOO, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT);
+ foo_signals[FOO_SIG2_SIGNAL] = g_signal_new ("sig2", TYPE_FOO, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_BOOLEAN__STRING_INT, G_TYPE_BOOLEAN, 2, G_TYPE_STRING, G_TYPE_INT);
}
static void
@@ -170,6 +214,21 @@ sig_cb (GObject* o,
_vala_assert (i == 42, "i == 42");
}
+gboolean
+sig2_cb (GObject* o,
+ const gchar* s,
+ gint i)
+{
+ gboolean result;
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (o, G_TYPE_OBJECT), FALSE);
+ g_return_val_if_fail (s != NULL, FALSE);
+ success = TRUE;
+ _vala_assert (g_strcmp0 (s, "foo") == 0, "s == \"foo\"");
+ _vala_assert (i == 42, "i == 42");
+ result = TRUE;
+ return result;
+}
+
static void
_sig_cb_foo_sig (Foo* _sender,
const gchar* s,
@@ -179,11 +238,23 @@ _sig_cb_foo_sig (Foo* _sender,
sig_cb (_sender, s, i);
}
+static gboolean
+_sig2_cb_foo_sig2 (Foo* _sender,
+ const gchar* s,
+ gint i,
+ gpointer self)
+{
+ gboolean result;
+ result = sig2_cb (_sender, s, i);
+ return result;
+}
+
static void
_vala_main (void)
{
Foo* foo = NULL;
Foo* _tmp0_;
+ gboolean _tmp1_ = FALSE;
_tmp0_ = foo_new ();
foo = _tmp0_;
g_signal_connect (foo, "sig", (GCallback) _sig_cb_foo_sig, NULL);
@@ -193,6 +264,11 @@ _vala_main (void)
success = FALSE;
foo_fire (foo);
_vala_assert (success, "success");
+ success = FALSE;
+ g_signal_connect (foo, "sig2", (GCallback) _sig2_cb_foo_sig2, NULL);
+ g_signal_emit (foo, foo_signals[FOO_SIG2_SIGNAL], 0, "foo", 42, &_tmp1_);
+ _vala_assert (_tmp1_, "foo.sig2.emit (\"foo\", 42)");
+ _vala_assert (success, "success");
_g_object_unref0 (foo);
}
diff --git a/tests/objects/signals-emit.vala b/tests/objects/signals-emit.vala
index 5b49cae8c..5ac682f58 100644
--- a/tests/objects/signals-emit.vala
+++ b/tests/objects/signals-emit.vala
@@ -1,6 +1,8 @@
class Foo : Object {
public signal void sig (string s, int i);
+ public signal bool sig2 (string s, int i);
+
public void fire () {
sig.emit ("foo", 42);
}
@@ -12,6 +14,13 @@ void sig_cb (Object o, string s, int i) {
assert (i == 42);
}
+bool sig2_cb (Object o, string s, int i) {
+ success = true;
+ assert (s == "foo");
+ assert (i == 42);
+ return true;
+}
+
bool success = false;
void main () {
@@ -25,4 +34,10 @@ void main () {
success = false;
foo.fire ();
assert (success);
+
+ success = false;
+ foo.sig2.connect (sig2_cb);
+ assert (foo.sig2.emit ("foo", 42));
+ assert (success);
+
}