summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjell.ahlstedt@bredband.net>2015-04-13 18:57:26 +0200
committerKjell Ahlstedt <kjell.ahlstedt@bredband.net>2015-04-13 18:57:26 +0200
commit6641ac99f95e02c7ef9e4259f6b6b8af1dcbb3f4 (patch)
tree4f0cdc03053fde83ba31eb83949014cdcedca9bd /tests
parent192ddfca9a17eaa5e6c78061dfb0bf48cf000377 (diff)
downloadglibmm-6641ac99f95e02c7ef9e4259f6b6b8af1dcbb3f4.tar.gz
Glib::Variant: Improve handling of object paths and signatures
* glib/src/variant.[ccg|hg]: Add VariantBase::is_castable_to() and VariantContainerBase::get_iter(). Accept casts of complicated types containing object paths and DBus type signatures to Variant<> types containing Glib::ustring and std::string. Change some get(), get_child() and get_iter() methods similarly. * tests/glibmm_variant/main.cc: Add test_dynamic_cast_composite_types(). Bug #747508.
Diffstat (limited to 'tests')
-rw-r--r--tests/glibmm_variant/main.cc59
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/glibmm_variant/main.cc b/tests/glibmm_variant/main.cc
index 086719f2..484cb8f1 100644
--- a/tests/glibmm_variant/main.cc
+++ b/tests/glibmm_variant/main.cc
@@ -276,6 +276,64 @@ static void test_dynamic_cast_string_types()
}
}
+// Test casting a complicated type, containing an object path and a DBus type signature.
+void test_dynamic_cast_composite_types()
+{
+ // Build a GVaraint of type a{oag}, and cast it to
+ // Glib::Variant<std::map<Glib::ustring, std::vector<std::string>>>.
+ // 'o' is VARIANT_TYPE_OBJECT_PATH and 'g' is VARIANT_TYPE_SIGNATURE.
+
+ GVariantBuilder dict_builder;
+ GVariantBuilder array_builder;
+ g_variant_builder_init(&dict_builder, G_VARIANT_TYPE("a{oag}"));
+
+ g_variant_builder_init(&array_builder, G_VARIANT_TYPE("ag"));
+ g_variant_builder_add(&array_builder, "g","id");
+ g_variant_builder_add(&array_builder, "g","isi");
+ g_variant_builder_add(&array_builder, "g","ia{si}");
+ g_variant_builder_add(&dict_builder, "{oag}", "/remote/object/path1", &array_builder);
+
+ g_variant_builder_init(&array_builder, G_VARIANT_TYPE("ag"));
+ g_variant_builder_add(&array_builder, "g","i(d)");
+ g_variant_builder_add(&array_builder, "g","i(si)");
+ g_variant_builder_add(&dict_builder, "{oag}", "/remote/object/path2", &array_builder);
+
+ Glib::VariantBase cppdict(g_variant_builder_end(&dict_builder));
+
+ try
+ {
+ typedef std::map<Glib::ustring, std::vector<std::string> > composite_type;
+ Glib::Variant<composite_type> derived =
+ Glib::VariantBase::cast_dynamic<Glib::Variant<composite_type> >(cppdict);
+
+ ostr << "Cast composite type (get_type_string()=" << derived.get_type_string()
+ << ", variant_type().get_string()=" << derived.variant_type().get_string() << "): ";
+ composite_type var = derived.get();
+ for (composite_type::const_iterator iter1 = var.begin(); iter1 != var.end(); ++iter1)
+ {
+ ostr << "\n " << iter1->first << ":";
+ const std::vector<std::string>& vec = iter1->second;
+ for (std::vector<std::string>::const_iterator iter2 = vec.begin(); iter2 != vec.end(); ++iter2)
+ ostr << " " << *iter2;
+ }
+ ostr << std::endl;
+ }
+ catch (const std::bad_cast& e)
+ {
+ g_assert_not_reached();
+ }
+
+ try
+ {
+ Glib::Variant<std::map<Glib::ustring, std::string > > derived =
+ Glib::VariantBase::cast_dynamic<Glib::Variant<std::map<Glib::ustring, std::string> > >(cppdict);
+ g_assert_not_reached();
+ }
+ catch (const std::bad_cast& e)
+ {
+ }
+}
+
static void test_dynamic_cast()
{
Glib::Variant<int> v1 = Glib::Variant<int>::create(10);
@@ -359,6 +417,7 @@ static void test_dynamic_cast()
test_dynamic_cast_ustring_types();
test_dynamic_cast_string_types();
+ test_dynamic_cast_composite_types();
}
static GLogLevelFlags