/*
* This file is part of the ZoneMinder Project. See AUTHORS file for Copyright information
*
* 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 2 of the License, 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, see .
*/
#include "zm_catch2.h"
#include "zm_monitorlink_token.h"
#include
// LinkedMonitors is stored as typed, so a token can be anything that isn't a
// delimiter. One that isn't a monitor id or monitor id:zone id must not throw
// out of the noexcept constructor (std::terminate, before the fix); it is
// ignored and scores 0. None of these reach Monitor::Load, so no database.
TEST_CASE("Token ignores a monitor link that isn't a number", "[MonitorLink]") {
const std::string value = GENERATE(
std::string("abc"),
std::string("1:x"),
std::string(":3"),
std::string(" "),
std::string("99999999999999999999"));
CAPTURE(value);
Token token(value);
REQUIRE(token.is(Token::TokenType::monitorlink));
REQUIRE(token.value() == value);
REQUIRE(token.score() == 0);
REQUIRE_FALSE(token.hasAlarmed());
}
TEST_CASE("Token::parse_monitor_link", "[MonitorLink]") {
unsigned int monitor_id = 0, zone_id = 0;
REQUIRE(Token::parse_monitor_link("3", monitor_id, zone_id));
REQUIRE(monitor_id == 3);
REQUIRE(zone_id == 0);
REQUIRE(Token::parse_monitor_link("3:7", monitor_id, zone_id));
REQUIRE(monitor_id == 3);
REQUIRE(zone_id == 7);
REQUIRE(Token::parse_monitor_link("4294967295", monitor_id, zone_id));
REQUIRE(monitor_id == 4294967295u);
// Fit an unsigned long but not an unsigned int: truncated, they named some
// other monitor or zone.
REQUIRE_FALSE(Token::parse_monitor_link("4294967296", monitor_id, zone_id));
REQUIRE_FALSE(Token::parse_monitor_link("99999999999", monitor_id, zone_id));
REQUIRE_FALSE(Token::parse_monitor_link("1:99999999999", monitor_id, zone_id));
REQUIRE_FALSE(Token::parse_monitor_link("abc", monitor_id, zone_id));
REQUIRE_FALSE(Token::parse_monitor_link("1:x", monitor_id, zone_id));
}