/* * Copyright 2013 Canonical Ltd. * * 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 . * * Authors: * Charles Kerr */ #include #include "state-fixture.h" using namespace unity::indicator::datetime; typedef StateFixture ActionsFixture; TEST_F(ActionsFixture, ActionsExist) { EXPECT_TRUE(m_actions != nullptr); const char* names[] = { "desktop-header", "calendar", "set-location", "activate-planner", "activate-appointment", "activate-phone-clock-app", "phone.open-settings", "desktop.open-settings" }; for(const auto& name: names) { EXPECT_TRUE(g_action_group_has_action(m_actions->action_group(), name)); } } TEST_F(ActionsFixture, DesktopOpenSettings) { const auto action_name = "desktop.open-settings"; const auto expected_action = MockActions::OpenDesktopSettings; auto action_group = m_actions->action_group(); auto history = m_mock_actions->history(); EXPECT_EQ(0, history.size()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); g_action_group_activate_action(action_group, action_name, nullptr); history = m_mock_actions->history(); EXPECT_EQ(1, history.size()); EXPECT_EQ(expected_action, history[0]); } TEST_F(ActionsFixture, PhoneOpenSettings) { const auto action_name = "phone.open-settings"; const auto expected_action = MockActions::OpenPhoneSettings; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); g_action_group_activate_action(action_group, action_name, nullptr); auto history = m_mock_actions->history(); EXPECT_EQ(1, history.size()); EXPECT_EQ(expected_action, history[0]); } TEST_F(ActionsFixture, ActivatePhoneClockApp) { const auto action_name = "activate-phone-clock-app"; const auto expected_action = MockActions::OpenPhoneClockApp; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); g_action_group_activate_action(action_group, action_name, nullptr); auto history = m_mock_actions->history(); EXPECT_EQ(1, history.size()); EXPECT_EQ(expected_action, history[0]); } TEST_F(ActionsFixture, ActivatePlanner) { const auto action_name = "activate-planner"; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); const auto expected_action = MockActions::OpenPlanner; auto v = g_variant_new_int64(0); g_action_group_activate_action(action_group, action_name, v); auto history = m_mock_actions->history(); EXPECT_EQ(1, history.size()); EXPECT_EQ(expected_action, history[0]); } TEST_F(ActionsFixture, ActivatePlannerAt) { const auto action_name = "activate-planner"; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); const auto now = DateTime::NowLocal(); auto v = g_variant_new_int64(now.to_unix()); g_action_group_activate_action(action_group, action_name, v); const auto a = MockActions::OpenPlannerAt; EXPECT_EQ(std::vector({a}), m_mock_actions->history()); EXPECT_EQ(now.to_unix(), m_mock_actions->date_time().to_unix()); } TEST_F(ActionsFixture, SetLocation) { const auto action_name = "set-location"; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); auto v = g_variant_new_string("America/Chicago Oklahoma City"); g_action_group_activate_action(action_group, action_name, v); const auto expected_action = MockActions::SetLocation; ASSERT_EQ(1, m_mock_actions->history().size()); EXPECT_EQ(expected_action, m_mock_actions->history()[0]); EXPECT_EQ("America/Chicago", m_mock_actions->zone()); EXPECT_EQ("Oklahoma City", m_mock_actions->name()); } TEST_F(ActionsFixture, SetCalendarDate) { // confirm that such an action exists const auto action_name = "calendar"; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); // pick an arbitrary DateTime... auto tmp = g_date_time_new_local(2010, 1, 2, 3, 4, 5); const auto now = DateTime(tmp); g_date_time_unref(tmp); // confirm that Planner.time gets changed to that date when we // activate the 'calendar' action with that date's time_t as the arg EXPECT_NE (now, m_state->calendar_month->month().get()); auto v = g_variant_new_int64(now.to_unix()); g_action_group_activate_action (action_group, action_name, v); EXPECT_EQ (now, m_state->calendar_month->month().get()); } TEST_F(ActionsFixture, ActivatingTheCalendarResetsItsDate) { // Confirm that the GActions exist auto action_group = m_actions->action_group(); EXPECT_TRUE(g_action_group_has_action(action_group, "calendar")); EXPECT_TRUE(g_action_group_has_action(action_group, "calendar-active")); /// /// Prerequisite for the test: move calendar-date away from today /// // move calendar-date a week into the future... const auto now = m_state->clock->localtime(); auto next_week = g_date_time_add_weeks(now.get(), 1); const auto next_week_unix = g_date_time_to_unix(next_week); g_date_time_unref(next_week); g_action_group_activate_action (action_group, "calendar", g_variant_new_int64(next_week_unix)); // confirm the planner and calendar action state moved a week into the future // but that m_state->clock is unchanged EXPECT_EQ(next_week_unix, m_state->calendar_month->month().get().to_unix()); EXPECT_EQ(now, m_state->clock->localtime()); auto calendar_state = g_action_group_get_action_state(action_group, "calendar"); EXPECT_TRUE(calendar_state != nullptr); EXPECT_TRUE(g_variant_is_of_type(calendar_state, G_VARIANT_TYPE_DICTIONARY)); auto v = g_variant_lookup_value(calendar_state, "calendar-day", G_VARIANT_TYPE_INT64); EXPECT_TRUE(v != nullptr); EXPECT_EQ(next_week_unix, g_variant_get_int64(v)); g_clear_pointer(&v, g_variant_unref); g_clear_pointer(&calendar_state, g_variant_unref); /// /// Now the actual test. /// We set the state of 'calendar-active' to true, which should reset the calendar date. /// This is so the calendar always starts on today's date when the indicator's menu is pulled down. /// // change the state... g_action_group_change_action_state(action_group, "calendar-active", g_variant_new_boolean(true)); // confirm the planner and calendar action state were reset back to m_state->clock's time EXPECT_EQ(now.to_unix(), m_state->calendar_month->month().get().to_unix()); EXPECT_EQ(now, m_state->clock->localtime()); calendar_state = g_action_group_get_action_state(action_group, "calendar"); EXPECT_TRUE(calendar_state != nullptr); EXPECT_TRUE(g_variant_is_of_type(calendar_state, G_VARIANT_TYPE_DICTIONARY)); v = g_variant_lookup_value(calendar_state, "calendar-day", G_VARIANT_TYPE_INT64); EXPECT_TRUE(v != nullptr); EXPECT_EQ(now.to_unix(), g_variant_get_int64(v)); g_clear_pointer(&v, g_variant_unref); g_clear_pointer(&calendar_state, g_variant_unref); } TEST_F(ActionsFixture, OpenAppointment) { Appointment appt; appt.uid = "some arbitrary uid"; appt.url = "http://www.canonical.com/"; appt.begin = m_state->clock->localtime(); m_state->calendar_upcoming->appointments().set(std::vector({appt})); const auto action_name = "activate-appointment"; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); auto v = g_variant_new_string(appt.uid.c_str()); g_action_group_activate_action(action_group, action_name, v); const auto a = MockActions::OpenAppointment; ASSERT_EQ(1, m_mock_actions->history().size()); ASSERT_EQ(a, m_mock_actions->history()[0]); EXPECT_EQ(appt.url, m_mock_actions->url()); }