/* ** Copyright (C) 2022 Dirk-Jan C. Binnema ** ** 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; either version 3, or (at your option) any ** later version. ** ** 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, write to the Free Software Foundation, ** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ /* * implementation is almost completely in the header; here we just add some * compile-time tests. */ #include "mu-message-flags.hh" using namespace Mu; std::string Mu::message_flags_to_string(MessageFlags flags) { std::string str; for (auto&& info: AllMessageFlagInfos) if (any_of(info.flag & flags)) str+=info.shortcut; return str; } /* * flags & flag-info */ constexpr bool validate_message_info_flags() { for (auto id = 0U; id != AllMessageFlagInfos.size(); ++id) { const auto flag = static_cast(1 << id); if (flag != AllMessageFlagInfos[id].flag) return false; } return true; } /* * tests... also build as runtime-tests, so we can get coverage info */ #ifdef BUILD_TESTS #define static_assert g_assert_true #endif /*BUILD_TESTS*/ [[maybe_unused]] static void test_basic() { static_assert(AllMessageFlagInfos.size() == __builtin_ctz(static_cast(MessageFlags::_final_))); static_assert(validate_message_info_flags()); static_assert(!!message_flag_info(MessageFlags::Encrypted)); static_assert(!message_flag_info(MessageFlags::None)); static_assert(!message_flag_info(static_cast(0))); static_assert(!message_flag_info(static_cast(1<flag == MessageFlags::Draft); static_assert(message_flag_info('l')->flag == MessageFlags::MailingList); static_assert(!message_flag_info('q')); static_assert(message_flag_info("trashed")->flag == MessageFlags::Trashed); static_assert(message_flag_info("attach")->flag == MessageFlags::HasAttachment); static_assert(!message_flag_info("fnorb")); static_assert(message_flag_info('D')->shortcut_lower() == 'd'); static_assert(message_flag_info('u')->shortcut_lower() == 'u'); } /* * message_flags_from_expr */ [[maybe_unused]] static void test_message_flags_from_expr() { static_assert(message_flags_from_absolute_expr("SRP").value() == (MessageFlags::Seen | MessageFlags::Replied | MessageFlags::Passed)); static_assert(message_flags_from_absolute_expr("Faul").value() == (MessageFlags::Flagged | MessageFlags::Unread | MessageFlags::HasAttachment | MessageFlags::MailingList)); static_assert(!message_flags_from_absolute_expr("DRT?")); static_assert(message_flags_from_absolute_expr("DRT?", true/*ignore invalid*/).value() == (MessageFlags::Draft | MessageFlags::Replied | MessageFlags::Trashed)); static_assert(message_flags_from_absolute_expr("DFPNxulabcdef", true/*ignore invalid*/).value() == (MessageFlags::Draft|MessageFlags::Flagged|MessageFlags::Passed| MessageFlags::New | MessageFlags::Encrypted | MessageFlags::Unread | MessageFlags::MailingList | MessageFlags::HasAttachment)); } /* * message_flags_from_delta_expr */ [[maybe_unused]] static void test_message_flags_from_delta_expr() { static_assert(message_flags_from_delta_expr( "+S-u-N", MessageFlags::New|MessageFlags::Unread).value() == MessageFlags::Seen); static_assert(message_flags_from_delta_expr("+R+P-F", MessageFlags::Seen).value() == (MessageFlags::Seen|MessageFlags::Passed|MessageFlags::Replied)); /* '-B' is invalid */ static_assert(!message_flags_from_delta_expr("+R+P-B", MessageFlags::Seen)); /* '-B' is invalid, but ignore invalid */ static_assert(message_flags_from_delta_expr("+R+P-B", MessageFlags::Seen, true) == (MessageFlags::Replied|MessageFlags::Passed|MessageFlags::Seen)); static_assert(message_flags_from_delta_expr("+F+T-S", MessageFlags::None, true).value() == (MessageFlags::Flagged|MessageFlags::Trashed)); } /* * message_flags_filter */ [[maybe_unused]] static void test_message_flags_filter() { static_assert(message_flags_filter(message_flags_from_absolute_expr( "DFPNxulabcdef", true/*ignore invalid*/).value(), MessageFlagCategory::Mailfile) == (MessageFlags::Draft|MessageFlags::Flagged|MessageFlags::Passed)); } #ifdef BUILD_TESTS int main(int argc, char* argv[]) { g_test_init(&argc, &argv, NULL); g_test_add_func("/message/flags/basic", test_basic); g_test_add_func("/message/flags/flag-info", test_message_flag_info); g_test_add_func("/message/flags/flags-from-absolute-expr", test_message_flags_from_expr); g_test_add_func("/message/flags/flags-from-delta-expr", test_message_flags_from_delta_expr); g_test_add_func("/message/flags/flags-filter", test_message_flags_filter); return g_test_run(); } #endif /*BUILD_TESTS*/