diff options
author | Marcin Kolny <marcin.kolny@gmail.com> | 2015-08-08 14:45:12 +0200 |
---|---|---|
committer | Marcin Kolny <marcin.kolny@gmail.com> | 2015-08-08 14:45:59 +0200 |
commit | 0d5f63b18f5766760cf39e82ee11482984e0a938 (patch) | |
tree | e3f74b9b37e7618c92840024077dff43e6d08f0d /tests/glibmm_interface_implementation/main.cc | |
parent | dce7a844e48a582e42eb2b60eef5c1f2527540ac (diff) | |
parent | d94115843f38967b5e883f5f7d8057882ae364cb (diff) | |
download | glibmm-0d5f63b18f5766760cf39e82ee11482984e0a938.tar.gz |
Merge branch 'master' into glibmm-gir-gmmprocglibmm-gir-gmmproc
Diffstat (limited to 'tests/glibmm_interface_implementation/main.cc')
-rw-r--r-- | tests/glibmm_interface_implementation/main.cc | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/tests/glibmm_interface_implementation/main.cc b/tests/glibmm_interface_implementation/main.cc index bc8253b1..40da2787 100644 --- a/tests/glibmm_interface_implementation/main.cc +++ b/tests/glibmm_interface_implementation/main.cc @@ -1,6 +1,12 @@ +// This program does not only test the implementation of an interface +// in a custom class. It also tests virtual functions that have leaked memory +// or printed unjustified critical messages in glibmm before version 2.44. +// See https://bugzilla.gnome.org/show_bug.cgi?id=705124. + #include <glibmm.h> #include <giomm.h> //There are no Interfaces in glibmm, but there are in giomm. #include <iostream> +#include <cstring> class CustomAction : public Gio::Action, @@ -13,8 +19,10 @@ public: Glib::Property<Glib::ustring> property; protected: - //Implement a vfunc: - virtual Glib::ustring get_name_vfunc() const; + //Implement vfuncs: + Glib::ustring get_name_vfunc() const override; + Glib::VariantType get_state_type_vfunc() const override; + Glib::VariantBase get_state_hint_vfunc() const override; }; CustomAction::CustomAction() @@ -32,33 +40,65 @@ Glib::ustring CustomAction::get_name_vfunc() const return "custom-name"; } +Glib::VariantType CustomAction::get_state_type_vfunc() const +{ + return Glib::VariantType(G_VARIANT_TYPE_INT16); +} + +Glib::VariantBase CustomAction::get_state_hint_vfunc() const +{ + return Glib::Variant<gint16>::create(42); +} int main(int, char**) { Glib::init(); CustomAction action; + bool success = true; + Glib::ustring name = action.get_name(); std::cout << "The name is '" << name << "'." << std::endl; + success &= name == "custom-name"; + std::cout << "The name property of the implemented interface is '" << action.property_name().get_value() << "'." << std::endl; + success &= action.property_name().get_value() == ""; + std::cout << "The custom string property is '" << action.property.get_value() << "'." << std::endl; + success &= action.property.get_value() == "Initial value."; action.property = "A new value."; std::cout << "The custom string property (after changing it) is '" << action.property.get_value() << "'." << std::endl; + success &= action.property.get_value() == "A new value."; - gchar* prop_value = 0; + gchar* prop_value = nullptr; g_object_set(action.gobj(), "custom_property", "Another value", NULL); g_object_get(action.gobj(), "custom_property", &prop_value, NULL); - std::cout << "The custom property after g_object_get/set() is '" + std::cout << "The custom property after g_object_set/get() is '" << prop_value << "'." << std::endl; + success &= std::strcmp(prop_value, "Another value") == 0; + g_free(prop_value); + prop_value = nullptr; + std::cout << "The custom property through the Glib::Property<> is '" << action.property.get_value() << "'." << std::endl; + success &= action.property.get_value() == "Another value"; + std::cout << "The name property of the implemented interface is '" << action.property_name().get_value() << "'." << std::endl; - g_assert(get_name_called); + success &= action.property_name().get_value() == ""; + success &= get_name_called; + + // Check if other vfuncs leak memory. Use valgrind! + action.get_parameter_type(); + action.get_state_type(); + action.get_state_type(); + action.get_state_hint_variant(); + action.get_state_variant(); + action.get_enabled(); - return EXIT_SUCCESS; + return success ? EXIT_SUCCESS : EXIT_FAILURE; } |