From 94ceeee931b852296861e9a2d21a9b34a88dff54 Mon Sep 17 00:00:00 2001 From: Kjell Ahlstedt Date: Wed, 16 Aug 2017 09:04:36 +0200 Subject: Glib::Variant: Improved support for D-Bus object paths and signatures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * glib/glibmm/filelist.am: Add variantdbusstring.h and variantdbusstring.cc. * glib/glibmm/variantdbusstring.[cc|h]: New files. String classes meant only for Variants with D-Bus object paths or D-Bus signatures. * glib/src/variant.[ccg|hg]: Add specializations for Variant, Variant and Variant>. * glib/src/varianttype.[ccg|hg]: Add VARIANT_TYPE_OBJECT_PATH_ARRAY. * tests/glibmm_variant/main.cc: Add test_object_path(). Make it possible to create a composite Variant containing variant type o (D-Bus object path) or g (D-Bus signature). Bug 785700 --- tests/glibmm_variant/main.cc | 55 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/glibmm_variant/main.cc b/tests/glibmm_variant/main.cc index 4d3c2c74..0836ec2e 100644 --- a/tests/glibmm_variant/main.cc +++ b/tests/glibmm_variant/main.cc @@ -14,7 +14,7 @@ static void test_dynamic_cast(); namespace { -int test_tuple() +bool test_tuple() { using TupleType = std::tuple; using MapType = std::map; @@ -70,7 +70,54 @@ int test_tuple() ostr << "Extracted tuple2: (" << q4 << ", " << s4 << ", " << b4 << ")" << std::endl; result_ok &= q4 == q2 && s4 == s2 && b4 == b2; - return result_ok ? EXIT_SUCCESS : EXIT_FAILURE; + return result_ok; +} + +bool test_object_path() +{ + bool result_ok = true; + + // Object path vector + std::vector vec1 {"/object/path1", "/object/path_two", "/object/pathIII" }; + auto variantvec1 = Glib::Variant>::create(vec1); + + auto vec2 = variantvec1.get(); + ostr << "Extracted object paths: " << vec2[0] << ", " << vec2[1] << ", " << vec2[2] << std::endl; + + for (std::size_t i = 0; i < vec1.size(); ++i) + result_ok &= vec1[i] == vec2[i]; + + // Complicated structure of variant type a{oa{sa{sv}}} + // Glib::Variant>>> + using three_leveled_map = + std::map>>; + + // Create the map + std::map map1; + map1["map1_1"] = Glib::Variant::create("value1"); + std::map> map2; + map2["map2_1"] = map1; + three_leveled_map map3; + map3["/map3/path1"] = map2; + // Create the corresponding Variant and check its type + auto variantmap = Glib::Variant::create(map3); + ostr << "variantmap.get_type_string() = " << variantmap.get_type_string() << std::endl; + result_ok &= variantmap.get_type_string() == "a{oa{sa{sv}}}"; + // Extract the map and check that the stored value remains. + auto map4 = variantmap.get(); + auto variant1 = map4["/map3/path1"]["map2_1"]["map1_1"]; + ostr << "variant1.get_type_string() = " << variant1.get_type_string() << std::endl; + auto variantstring = Glib::VariantBase::cast_dynamic>(variant1); + if (variantstring && variantstring.get_type_string() == "s") + { + ostr << "Extracted map value: " << variantstring.get() << std::endl; + result_ok &= variantstring.get() == "value1"; + } + else + { + result_ok = false; + } + return result_ok; } } // anonymous namespace @@ -227,7 +274,9 @@ main(int, char**) test_variant_floating(); test_dynamic_cast(); - return test_tuple(); + bool result_ok = test_tuple(); + result_ok &= test_object_path(); + return result_ok ? EXIT_SUCCESS : EXIT_FAILURE; } // Test casting of multiple types to a ustring: -- cgit v1.2.1