/* * Copyright 2013 Canonical Ltd. * * Authors: * Charles Kerr * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, 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 . */ #include "glib-fixture.h" #include #include #include #include #include #include #include using unity::indicator::datetime::Location; using unity::indicator::datetime::Locations; using unity::indicator::datetime::SettingsLocations; using unity::indicator::datetime::Timezones; /*** **** ***/ class LocationsFixture: public GlibFixture { private: typedef GlibFixture super; protected: GSettings * settings = nullptr; std::shared_ptr timezones; const std::string nyc = "America/New_York"; const std::string chicago = "America/Chicago"; virtual void SetUp() { super::SetUp(); settings = g_settings_new(SETTINGS_INTERFACE); const gchar * location_strv[] = { "America/Los_Angeles Oakland", "America/Chicago Chicago", "America/Chicago Oklahoma City", "America/Toronto Toronto", "Europe/London London", "Europe/Berlin Berlin", NULL }; g_settings_set_strv(settings, SETTINGS_LOCATIONS_S, location_strv); g_settings_set_boolean(settings, SETTINGS_SHOW_LOCATIONS_S, true); timezones.reset(new Timezones); timezones->timezone.set(chicago); timezones->timezones.set(std::set({ nyc, chicago })); } virtual void TearDown() { //timezones.reset(nullptr); g_clear_object(&settings); super::TearDown(); } }; TEST_F(LocationsFixture, Timezones) { g_settings_set_boolean(settings, SETTINGS_SHOW_LOCATIONS_S, false); SettingsLocations locations(SETTINGS_INTERFACE, timezones); std::vector l = locations.locations.get(); EXPECT_EQ(2, l.size()); EXPECT_EQ("Chicago", l[0].name); EXPECT_EQ(chicago, l[0].zone); EXPECT_EQ("New York", l[1].name); EXPECT_EQ(nyc, l[1].zone); } TEST_F(LocationsFixture, SettingsLocations) { SettingsLocations locations(SETTINGS_INTERFACE, timezones); std::vector l = locations.locations.get(); EXPECT_EQ(7, l.size()); EXPECT_EQ("Chicago", l[0].name); EXPECT_EQ(chicago, l[0].zone); EXPECT_EQ("New York", l[1].name); EXPECT_EQ(nyc, l[1].zone); EXPECT_EQ("Oakland", l[2].name); EXPECT_EQ("America/Los_Angeles", l[2].zone); EXPECT_EQ("Oklahoma City", l[3].name); EXPECT_EQ("America/Chicago", l[3].zone); EXPECT_EQ("Toronto", l[4].name); EXPECT_EQ("America/Toronto", l[4].zone); EXPECT_EQ("London", l[5].name); EXPECT_EQ("Europe/London", l[5].zone); EXPECT_EQ("Berlin", l[6].name); EXPECT_EQ("Europe/Berlin", l[6].zone); } TEST_F(LocationsFixture, ChangeLocationStrings) { SettingsLocations locations(SETTINGS_INTERFACE, timezones); bool locations_changed = false; locations.locations.changed().connect([&locations_changed, this](const std::vector&){ locations_changed = true; g_main_loop_quit(loop); }); g_idle_add([](gpointer gsettings){ const gchar * strv[] = { "America/Los_Angeles Oakland", "Europe/London London", "Europe/Berlin Berlin", NULL }; g_settings_set_strv(static_cast(gsettings), SETTINGS_LOCATIONS_S, strv); return G_SOURCE_REMOVE; }, settings); g_main_loop_run(loop); EXPECT_TRUE(locations_changed); std::vector l = locations.locations.get(); EXPECT_EQ(5, l.size()); EXPECT_EQ("Chicago", l[0].name); EXPECT_EQ(chicago, l[0].zone); EXPECT_EQ("New York", l[1].name); EXPECT_EQ(nyc, l[1].zone); EXPECT_EQ("Oakland", l[2].name); EXPECT_EQ("America/Los_Angeles", l[2].zone); EXPECT_EQ("London", l[3].name); EXPECT_EQ("Europe/London", l[3].zone); EXPECT_EQ("Berlin", l[4].name); EXPECT_EQ("Europe/Berlin", l[4].zone); locations_changed = false; } TEST_F(LocationsFixture, ChangeLocationVisibility) { SettingsLocations locations(SETTINGS_INTERFACE, timezones); bool locations_changed = false; locations.locations.changed().connect([&locations_changed, this](const std::vector&){ locations_changed = true; g_main_loop_quit(loop); }); g_idle_add([](gpointer gsettings){ g_settings_set_boolean(static_cast(gsettings), SETTINGS_SHOW_LOCATIONS_S, false); return G_SOURCE_REMOVE; }, settings); g_main_loop_run(loop); EXPECT_TRUE(locations_changed); std::vector l = locations.locations.get(); EXPECT_EQ(2, l.size()); EXPECT_EQ("Chicago", l[0].name); EXPECT_EQ(chicago, l[0].zone); EXPECT_EQ("New York", l[1].name); EXPECT_EQ(nyc, l[1].zone); }