co-maps/libs/indexer/indexer_tests/feature_charge_sockets_test.cpp
2025-11-22 13:58:55 +01:00

254 lines
11 KiB
C++

#include "indexer/feature_charge_sockets.hpp"
#include "testing/testing.hpp"
namespace feature_charge_sockets_test
{
ChargeSocketsHelper FromKVs(OSMKeyValues const & kvs)
{
ChargeSocketsHelper helper;
for (auto const & kv : kvs)
helper.AggregateChargeSocketKey(kv.first, kv.second);
return helper;
}
UNIT_TEST(ChargeSockets_Processing)
{
///////////////////////////////////////////////////////////
// Internal model consistency
// valid socket lists
TEST_EQUAL(ChargeSocketsHelper("type2||").GetSockets().size(), 1, ());
TEST_EQUAL(ChargeSocketsHelper("type2|1|50;type2|2|43").GetSockets().size(), 2, ());
TEST_EQUAL(ChargeSocketsHelper("type2|1|50;type2|2|43;type1||").GetSockets().size(), 3, ());
TEST_EQUAL(ChargeSocketsHelper("type2||;type2_cable||;type2_combo||;type1||;nacs||;chademo||").GetSockets().size(), 6,
());
TEST_EQUAL(ChargeSocketsHelper("unknown|2|150").GetSockets().size(), 1, ());
TEST_EQUAL(ChargeSocketsHelper("||").GetSockets().size(), 1, ());
// invalid/partially valid socket lists
TEST_EQUAL(ChargeSocketsHelper("type2|").GetSockets().size(), 0, ());
TEST_EQUAL(ChargeSocketsHelper("type2|;|;|||;|45||").GetSockets().size(), 0, ());
TEST_EQUAL(ChargeSocketsHelper("type2|;type2_cable|1|50").GetSockets().size(), 1, ());
TEST(ChargeSocketsHelper("type2||").ToString() != "", ("ChargeSocketsHelper::ToString returned an empty string!"));
TEST_EQUAL(ChargeSocketsHelper("||").ToString(), "unknown||", ());
TEST_EQUAL(ChargeSocketsHelper("this_type_does_not_exist||").ToString(), "unknown||", ());
TEST_EQUAL(ChargeSocketsHelper("type2||").ToString(), "type2||", ());
TEST_EQUAL(ChargeSocketsHelper("type2|0|0").ToString(), "type2||", ());
TEST_EQUAL(ChargeSocketsHelper("type2||50").ToString(), "type2||50", ());
TEST_EQUAL(ChargeSocketsHelper("type2||7.4").ToString(), "type2||7.4", ());
TEST_EQUAL(ChargeSocketsHelper("type2|0|50").ToString(), "type2||50", ());
TEST_EQUAL(ChargeSocketsHelper("type2|1|50").ToString(), "type2|1|50", ());
TEST_EQUAL(ChargeSocketsHelper("unknown||").ToString(), "unknown||", ());
TEST_EQUAL(ChargeSocketsHelper("unknown||150").ToString(), "unknown||150", ());
TEST_EQUAL(ChargeSocketsHelper("type2|;type2_cable|1|50").ToString(), "type2_cable|1|50", ());
// sorting
TEST_EQUAL(ChargeSocketsHelper("type2||;type2_cable|1|50").ToString(), "type2_cable|1|50;type2||", ());
TEST_EQUAL(ChargeSocketsHelper("type2||;type2_cable||;||;type2_combo||").ToString(),
"type2_combo||;type2_cable||;type2||;unknown||", ());
// multiple sockets of same type, but different power
TEST_EQUAL(ChargeSocketsHelper("type2|1|50;type2|2|43").ToString(), "type2|1|50;type2|2|43", ());
// TEST_EQUAL(ChargeSocketsHelper("type2|1|43;type2|2|50").ToString(), "type2|1|50;type2|2|43", ());
///////////////////////////////////////////////////////////
// OSM key parsing
OSMKeyValues kvs;
kvs = {{"socket:type2", "2"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|", ());
kvs = {{"socket:type2", "yes"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2||", ());
kvs = {{"socket:type2", "malformed"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "", ());
kvs = {{"socket:type2:output", "22"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2||22", ());
kvs = {{"socket:type2:malformed", "22"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "", ());
kvs = {{"socket:type2", "malformed"}, {"socket:type2:output", "22 kW"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2||22", ());
kvs = {{"socket:type2", "2"}, {"socket:type2:output", "22 kW"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|22", ());
kvs = {{"socket:type2", "2"}, {"socket:type2:output", "22kW"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|22", ());
kvs = {{"socket:type2", "2"}, {"socket:type2:output", "22KW"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|22", ());
kvs = {{"socket:type2", "2"}, {"socket:type2:output", "22"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|22", ());
kvs = {{"socket:chademo", "2"}, {"socket:chademo:output", "50"},
{"socket:type2_combo", "10"}, {"socket:type2_combo:output", "200"},
{"socket:type2_cable", "2"}, {"socket:type2_cable:output", "50"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo|10|200;chademo|2|50;type2_cable|2|50", ());
// unit conversion
kvs = {{"socket:type2:output", "7400W"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2||7.4", ());
kvs = {{"socket:type2_combo:output", "150 kw"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ());
kvs = {{"socket:type2_combo:output", "150 KW"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ());
kvs = {{"socket:type2_combo:output", " 150kw"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ());
kvs = {{"socket:type2_combo:output", "150kva"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ());
kvs = {{"socket:type2_combo:output", "0.150MW"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ());
kvs = {{"socket:type2_combo:output", ".150MW"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo||150", ());
// invalid
kvs = {{"socket:type2", "-1"}};
TEST_EQUAL(FromKVs(kvs).GetSockets().size(), 0, ());
kvs = {{"socket:type2", "-2"}};
TEST_EQUAL(FromKVs(kvs).GetSockets().size(), 0, ());
kvs = {{"socket:type2", "-2"}, {"socket:type2:output", "-50"}};
TEST_EQUAL(FromKVs(kvs).GetSockets().size(), 0, ());
// count ignored (because invalid), but power valid
kvs = {{"socket:type2", "-2"}, {"socket:type2:output", "50"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2||50", ());
// normalization
kvs = {{"socket:tesla_supercharger", "2"}, {"socket:tesla_supercharger:output", "150"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "nacs|2|150", ());
kvs = {{"socket:ccs", "2"}, {"socket:ccs:output", "150"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2_combo|2|150", ());
// multiple socket of same type
kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "50;43"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2|3|43", ());
kvs = {{"socket:type2:output", "50;43"}, {"socket:type2", "2;3"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2|3|43", ());
kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "43;50"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|3|50;type2|2|43", ());
kvs = {{"socket:type2", "2;3;5"}, {"socket:type2:output", "43;50;7.4"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|3|50;type2|2|43;type2|5|7.4", ());
kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "50 kW; 43 kw"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2|3|43", ());
// unbalanced multiple sockets
kvs = {{"socket:type2", "2"}, {"socket:type2:output", "50 kW; 43 kw"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2||43", ());
kvs = {{"socket:type2", "2;"}, {"socket:type2:output", "50 kW; 43 kw"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2||43", ());
kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "50 kW"}};
TEST_EQUAL(FromKVs(kvs).ToString(), "type2|2|50;type2|3|", ());
///////////////////////////////////////////////////////////
// OSM key generation
kvs = {{"socket:type2", "2"}};
TEST_EQUAL(ChargeSocketsHelper("type2|2|").GetOSMKeyValues(), kvs, ());
TEST_EQUAL(ChargeSocketsHelper("type2|2|0").GetOSMKeyValues(), kvs, ());
kvs = {{"socket:type2", "yes"}};
TEST_EQUAL(ChargeSocketsHelper("type2||").GetOSMKeyValues(), kvs, ());
TEST_EQUAL(ChargeSocketsHelper("type2|0|").GetOSMKeyValues(), kvs, ());
kvs = {{"socket:type2", "yes"}, {"socket:type2:output", "150"}};
TEST_EQUAL(ChargeSocketsHelper("type2||150").GetOSMKeyValues(), kvs, ());
// the order should always be the same, as the sockets are sorted
kvs = {{"socket:type2_combo", "10"}, {"socket:type2_combo:output", "200"}, {"socket:chademo", "2"},
{"socket:chademo:output", "50"}, {"socket:type2_cable", "2"}, {"socket:type2_cable:output", "50"}};
TEST_EQUAL(ChargeSocketsHelper("type2_combo|10|200;chademo|2|50;type2_cable|2|50").GetOSMKeyValues(), kvs, ());
TEST_EQUAL(ChargeSocketsHelper("chademo|2|50;type2_cable|2|50;type2_combo|10|200").GetOSMKeyValues(), kvs, ());
// multiple socket of same type
// (should always be ordered from higher power to lower)
kvs = {{"socket:type2", "2;3"}, {"socket:type2:output", "50;43"}};
TEST_EQUAL(ChargeSocketsHelper("type2|2|50;type2|3|43").GetOSMKeyValues(), kvs, ());
kvs = {{"socket:type2", "3;2"}, {"socket:type2:output", "50;43"}};
TEST_EQUAL(ChargeSocketsHelper("type2|2|43;type2|3|50").GetOSMKeyValues(), kvs, ());
kvs = {{"socket:type2", "2;3;5"}, {"socket:type2:output", "50;43;7.4"}};
TEST_EQUAL(ChargeSocketsHelper("type2|3|43;type2|5|7.4;type2|2|50").GetOSMKeyValues(), kvs, ());
kvs = {{"socket:type2_combo", "10;2"},
{"socket:type2_combo:output", "250;100"},
{"socket:type2", "2;3;5"},
{"socket:type2:output", "50;43;7.4"}};
TEST_EQUAL(
ChargeSocketsHelper("type2|3|43;type2|5|7.4;type2_combo|10|250;type2|2|50;type2_combo|2|100").GetOSMKeyValues(),
kvs, ());
///////////////////////////////////////////////////////////
// OSM attribute diff
OSMKeyValues kvs_old, kvs_new;
KeyValueDiffSet diff;
kvs_old = {{"socket:type2", "2"}};
kvs_new = {{"socket:type2", "2"}};
diff = {};
TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ());
kvs_old = {{"socket:type2", "3"}};
kvs_new = {{"socket:type2", "2"}};
diff = {{"socket:type2", "3", "2"}};
TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ());
kvs_old = {{"socket:type2", "2"}};
kvs_new = {{"socket:type2", "3"}};
diff = {{"socket:type2", "2", "3"}};
TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ());
kvs_old = {};
kvs_new = {{"socket:type2", "2"}};
diff = {{"socket:type2", "", "2"}};
TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ());
kvs_old = {{"socket:type2", "2"}};
kvs_new = {};
diff = {{"socket:type2", "2", ""}};
TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ());
kvs_old = {{"socket:type2_combo", "10;2"},
{"socket:type2_combo:output", "250;100"},
{"socket:type1", "5"},
{"socket:type2", "2;3;5"},
{"socket:type2:output", "50;43;7.4"}};
kvs_new = {{"socket:type2_combo", "10;2"},
{"socket:type2_combo:output", "250;100"},
{"socket:chademo", "2"},
{"socket:type2", "2;3"},
{"socket:type2:output", "50;43"}};
diff = {{"socket:type1", "5", ""},
{"socket:type2", "2;3;5", "2;3"},
{"socket:type2:output", "50;43;7.4", "50;43"},
{"socket:chademo", "", "2"}};
TEST_EQUAL(FromKVs(kvs_new).Diff(FromKVs(kvs_old).GetSockets()), diff, ());
}
} // namespace feature_charge_sockets_test