diff options
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; } |