From a5037dcedc828117f2a81e56c71913a5c7ef9b46 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 12 Feb 2015 16:09:13 -0600 Subject: Add in ability to easily check GVariants --- tests/gtest-gvariant.h | 95 +++++++++++++++++++++++++++++++++++++++++++++ tests/notifications-test.cc | 6 +++ 2 files changed, 101 insertions(+) create mode 100644 tests/gtest-gvariant.h (limited to 'tests') diff --git a/tests/gtest-gvariant.h b/tests/gtest-gvariant.h new file mode 100644 index 0000000..5a24dfa --- /dev/null +++ b/tests/gtest-gvariant.h @@ -0,0 +1,95 @@ +/* + * Copyright © 2015 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: + * Ted Gould + */ + +#include +#include + +namespace GTestGVariant { + +testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gchar * haveStr, GVariant * expect, GVariant * have) +{ + if (expect == nullptr && have == nullptr) { + auto result = testing::AssertionSuccess(); + return result; + } + + if (expect == nullptr || have == nullptr) { + gchar * havePrint; + if (have == nullptr) { + havePrint = g_strdup("(nullptr)"); + } else { + havePrint = g_variant_print(have, TRUE); + } + + auto result = testing::AssertionFailure(); + result << + " Result: " << haveStr << std::endl << + " Value: " << havePrint << std::endl << + " Expected: " << expectStr << std::endl; + + g_free(havePrint); + return result; + } + + if (g_variant_equal(expect, have)) { + auto result = testing::AssertionSuccess(); + return result; + } else { + gchar * havePrint = g_variant_print(have, TRUE); + gchar * expectPrint = g_variant_print(expect, TRUE); + + auto result = testing::AssertionFailure(); + result << + " Result: " << haveStr << std::endl << + " Value: " << havePrint << std::endl << + " Expected: " << expectStr << std::endl << + " Expected: " << expectPrint << std::endl; + + g_free(havePrint); + g_free(expectPrint); + + return result; + } +} + +testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gchar * haveStr, std::shared_ptr expect, std::shared_ptr have) +{ + return expectVariantEqual(expectStr, haveStr, expect.get(), have.get()); +} + +testing::AssertionResult expectVariantEqual (const gchar * expectStr, const gchar * haveStr, const char * expect, std::shared_ptr have) +{ + auto expectv = std::shared_ptr([expect]() { + auto variant = g_variant_parse(nullptr, expect, nullptr, nullptr, nullptr); + if (variant != nullptr) + g_variant_ref_sink(variant); + return variant; + }(), + [](GVariant * variant) { + if (variant != nullptr) + g_variant_unref(variant); + }); + + return expectVariantEqual(expectStr, haveStr, expectv, have); +} + +}; // ns GTestGVariant + +#define EXPECT_GVARIANT_EQ(expect, have) \ + EXPECT_PRED_FORMAT2(GTestGVariant::expectVariantEqual, expect, have) diff --git a/tests/notifications-test.cc b/tests/notifications-test.cc index 06eac7a..1b101f5 100644 --- a/tests/notifications-test.cc +++ b/tests/notifications-test.cc @@ -25,6 +25,7 @@ #include #include "notifications-mock.h" +#include "gtest-gvariant.h" extern "C" { #include "indicator-sound-service.h" @@ -133,6 +134,10 @@ TEST_F(NotificationsTest, VolumeChanges) { auto notev = notifications->getNotifications(); ASSERT_EQ(1, notev.size()); EXPECT_EQ("indicator-sound", notev[0].app_name); + EXPECT_EQ("Volume", notev[0].summary); + EXPECT_EQ(0, notev[0].actions.size()); + EXPECT_GVARIANT_EQ("@s 'true'", notev[0].hints["x-canonical-private-synchronous"]); + EXPECT_GVARIANT_EQ("@i 5000", notev[0].hints["value"]); /* Set a different volume */ notifications->clearNotifications(); @@ -140,6 +145,7 @@ TEST_F(NotificationsTest, VolumeChanges) { loop(50); notev = notifications->getNotifications(); ASSERT_EQ(1, notev.size()); + EXPECT_GVARIANT_EQ("@i 6000", notev[0].hints["value"]); /* Set the same volume */ notifications->clearNotifications(); -- cgit v1.2.3