X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gobject%2Ftests%2Fbinding.c;h=5f87e84efffe15e5e01f90b1cc5f5bb53b3647e5;hb=e81e33b35d389f14858015d759c9a3f416420c2d;hp=31993f3454e3495ef64f78175bf049fb5f55828a;hpb=e02571e93bb4c1986ec1190fb6c7d02eba0c746a;p=platform%2Fupstream%2Fglib.git diff --git a/gobject/tests/binding.c b/gobject/tests/binding.c index 31993f3..5f87e84 100644 --- a/gobject/tests/binding.c +++ b/gobject/tests/binding.c @@ -7,6 +7,7 @@ typedef struct _BindingSource GObject parent_instance; gint foo; + gint bar; gdouble value; gboolean toggle; } BindingSource; @@ -21,10 +22,12 @@ enum PROP_SOURCE_0, PROP_SOURCE_FOO, + PROP_SOURCE_BAR, PROP_SOURCE_VALUE, PROP_SOURCE_TOGGLE }; +static GType binding_source_get_type (void); G_DEFINE_TYPE (BindingSource, binding_source, G_TYPE_OBJECT); static void @@ -41,6 +44,10 @@ binding_source_set_property (GObject *gobject, source->foo = g_value_get_int (value); break; + case PROP_SOURCE_BAR: + source->bar = g_value_get_int (value); + break; + case PROP_SOURCE_VALUE: source->value = g_value_get_double (value); break; @@ -68,6 +75,10 @@ binding_source_get_property (GObject *gobject, g_value_set_int (value, source->foo); break; + case PROP_SOURCE_BAR: + g_value_set_int (value, source->bar); + break; + case PROP_SOURCE_VALUE: g_value_set_double (value, source->value); break; @@ -94,6 +105,11 @@ binding_source_class_init (BindingSourceClass *klass) -1, 100, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_SOURCE_BAR, + g_param_spec_int ("bar", "Bar", "Bar", + -1, 100, + 0, + G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_SOURCE_VALUE, g_param_spec_double ("value", "Value", "Value", -100.0, 200.0, @@ -133,6 +149,7 @@ enum PROP_TARGET_TOGGLE }; +static GType binding_target_get_type (void); G_DEFINE_TYPE (BindingTarget, binding_target, G_TYPE_OBJECT); static void @@ -220,44 +237,44 @@ binding_target_init (BindingTarget *self) static gboolean celsius_to_fahrenheit (GBinding *binding, - const GValue *source_value, - GValue *target_value, + const GValue *from_value, + GValue *to_value, gpointer user_data G_GNUC_UNUSED) { gdouble celsius, fahrenheit; - g_assert (G_VALUE_HOLDS (source_value, G_TYPE_DOUBLE)); - g_assert (G_VALUE_HOLDS (target_value, G_TYPE_DOUBLE)); + g_assert (G_VALUE_HOLDS (from_value, G_TYPE_DOUBLE)); + g_assert (G_VALUE_HOLDS (to_value, G_TYPE_DOUBLE)); - celsius = g_value_get_double (source_value); + celsius = g_value_get_double (from_value); fahrenheit = (9 * celsius / 5) + 32.0; if (g_test_verbose ()) g_print ("Converting %.2fC to %.2fF\n", celsius, fahrenheit); - g_value_set_double (target_value, fahrenheit); + g_value_set_double (to_value, fahrenheit); return TRUE; } static gboolean fahrenheit_to_celsius (GBinding *binding, - const GValue *source_value, - GValue *target_value, + const GValue *from_value, + GValue *to_value, gpointer user_data G_GNUC_UNUSED) { gdouble celsius, fahrenheit; - g_assert (G_VALUE_HOLDS (source_value, G_TYPE_DOUBLE)); - g_assert (G_VALUE_HOLDS (target_value, G_TYPE_DOUBLE)); + g_assert (G_VALUE_HOLDS (from_value, G_TYPE_DOUBLE)); + g_assert (G_VALUE_HOLDS (to_value, G_TYPE_DOUBLE)); - fahrenheit = g_value_get_double (source_value); + fahrenheit = g_value_get_double (from_value); celsius = 5 * (fahrenheit - 32.0) / 9; if (g_test_verbose ()) g_print ("Converting %.2fF to %.2fC\n", fahrenheit, celsius); - g_value_set_double (target_value, celsius); + g_value_set_double (to_value, celsius); return TRUE; } @@ -273,6 +290,7 @@ binding_default (void) target, "bar", G_BINDING_DEFAULT); + g_object_add_weak_pointer (G_OBJECT (binding), (gpointer *) &binding); g_assert ((BindingSource *) g_binding_get_source (binding) == source); g_assert ((BindingTarget *) g_binding_get_target (binding) == target); g_assert_cmpstr (g_binding_get_source_property (binding), ==, "foo"); @@ -292,6 +310,7 @@ binding_default (void) g_object_unref (source); g_object_unref (target); + g_assert (binding == NULL); } static void @@ -304,6 +323,7 @@ binding_bidirectional (void) binding = g_object_bind_property (source, "foo", target, "bar", G_BINDING_BIDIRECTIONAL); + g_object_add_weak_pointer (G_OBJECT (binding), (gpointer *) &binding); g_object_set (source, "foo", 42, NULL); g_assert_cmpint (source->foo, ==, target->bar); @@ -318,6 +338,7 @@ binding_bidirectional (void) g_object_unref (source); g_object_unref (target); + g_assert (binding == NULL); } static void @@ -329,11 +350,55 @@ data_free (gpointer data) } static void -binding_transform (void) +binding_transform_default (void) { BindingSource *source = g_object_new (binding_source_get_type (), NULL); BindingTarget *target = g_object_new (binding_target_get_type (), NULL); GBinding *binding; + gpointer src, trg; + gchar *src_prop, *trg_prop; + GBindingFlags flags; + + binding = g_object_bind_property (source, "foo", + target, "value", + G_BINDING_BIDIRECTIONAL); + + g_object_add_weak_pointer (G_OBJECT (binding), (gpointer *) &binding); + + g_object_get (binding, + "source", &src, + "source-property", &src_prop, + "target", &trg, + "target-property", &trg_prop, + "flags", &flags, + NULL); + g_assert (src == source); + g_assert (trg == target); + g_assert_cmpstr (src_prop, ==, "foo"); + g_assert_cmpstr (trg_prop, ==, "value"); + g_assert_cmpint (flags, ==, G_BINDING_BIDIRECTIONAL); + g_object_unref (src); + g_object_unref (trg); + g_free (src_prop); + g_free (trg_prop); + + g_object_set (source, "foo", 24, NULL); + g_assert_cmpfloat (target->value, ==, 24.0); + + g_object_set (target, "value", 69.0, NULL); + g_assert_cmpint (source->foo, ==, 69); + + g_object_unref (target); + g_object_unref (source); + g_assert (binding == NULL); +} + +static void +binding_transform (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), NULL); + GBinding *binding G_GNUC_UNUSED; gboolean unused_data = FALSE; binding = g_object_bind_property_full (source, "value", @@ -360,7 +425,7 @@ binding_transform_closure (void) { BindingSource *source = g_object_new (binding_source_get_type (), NULL); BindingTarget *target = g_object_new (binding_target_get_type (), NULL); - GBinding *binding; + GBinding *binding G_GNUC_UNUSED; gboolean unused_data_1 = FALSE, unused_data_2 = FALSE; GClosure *c2f_clos, *f2c_clos; @@ -399,7 +464,10 @@ binding_chain (void) /* A -> B, B -> C */ binding_1 = g_object_bind_property (a, "foo", b, "foo", G_BINDING_BIDIRECTIONAL); + g_object_add_weak_pointer (G_OBJECT (binding_1), (gpointer *) &binding_1); + binding_2 = g_object_bind_property (b, "foo", c, "foo", G_BINDING_BIDIRECTIONAL); + g_object_add_weak_pointer (G_OBJECT (binding_2), (gpointer *) &binding_2); /* verify the chain */ g_object_set (a, "foo", 42, NULL); @@ -408,7 +476,9 @@ binding_chain (void) /* unbind A -> B and B -> C */ g_object_unref (binding_1); + g_assert (binding_1 == NULL); g_object_unref (binding_2); + g_assert (binding_2 == NULL); /* bind A -> C directly */ binding_2 = g_object_bind_property (a, "foo", c, "foo", G_BINDING_BIDIRECTIONAL); @@ -471,7 +541,7 @@ binding_invert_boolean (void) binding = g_object_bind_property (source, "toggle", target, "toggle", - G_BINDING_DEFAULT | G_BINDING_INVERT_BOOLEAN); + G_BINDING_BIDIRECTIONAL | G_BINDING_INVERT_BOOLEAN); g_assert (source->toggle); g_assert (!target->toggle); @@ -480,15 +550,71 @@ binding_invert_boolean (void) g_assert (!source->toggle); g_assert (target->toggle); + g_object_set (target, "toggle", FALSE, NULL); + g_assert (source->toggle); + g_assert (!target->toggle); + g_object_unref (binding); g_object_unref (source); g_object_unref (target); } +static void +binding_same_object (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), + "foo", 100, + "bar", 50, + NULL); + GBinding *binding; + + binding = g_object_bind_property (source, "foo", + source, "bar", + G_BINDING_BIDIRECTIONAL); + g_object_add_weak_pointer (G_OBJECT (binding), (gpointer *) &binding); + + g_object_set (source, "foo", 10, NULL); + g_assert_cmpint (source->foo, ==, 10); + g_assert_cmpint (source->bar, ==, 10); + g_object_set (source, "bar", 30, NULL); + g_assert_cmpint (source->foo, ==, 30); + g_assert_cmpint (source->bar, ==, 30); + + g_object_unref (source); + g_assert (binding == NULL); +} + +static void +binding_unbind (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), NULL); + GBinding *binding; + + binding = g_object_bind_property (source, "foo", + target, "bar", + G_BINDING_DEFAULT); + g_object_add_weak_pointer (G_OBJECT (binding), (gpointer *) &binding); + + g_object_set (source, "foo", 42, NULL); + g_assert_cmpint (source->foo, ==, target->bar); + + g_object_set (target, "bar", 47, NULL); + g_assert_cmpint (source->foo, !=, target->bar); + + g_binding_unbind (binding); + g_assert (binding == NULL); + + g_object_set (source, "foo", 0, NULL); + g_assert_cmpint (source->foo, !=, target->bar); + + g_object_unref (source); + g_object_unref (target); +} + int main (int argc, char *argv[]) { - g_type_init (); g_test_init (&argc, &argv, NULL); g_test_bug_base ("http://bugzilla.gnome.org/"); @@ -496,10 +622,13 @@ main (int argc, char *argv[]) g_test_add_func ("/binding/default", binding_default); g_test_add_func ("/binding/bidirectional", binding_bidirectional); g_test_add_func ("/binding/transform", binding_transform); + g_test_add_func ("/binding/transform-default", binding_transform_default); g_test_add_func ("/binding/transform-closure", binding_transform_closure); g_test_add_func ("/binding/chain", binding_chain); g_test_add_func ("/binding/sync-create", binding_sync_create); g_test_add_func ("/binding/invert-boolean", binding_invert_boolean); + g_test_add_func ("/binding/same-object", binding_same_object); + g_test_add_func ("/binding/unbind", binding_unbind); return g_test_run (); }