klayout/src/db/unit_tests/dbPropertiesRepositoryTests.cc

336 lines
11 KiB
C++
Raw Normal View History

/*
KLayout Layout Viewer
2024-01-01 17:06:23 +01:00
Copyright (C) 2006-2024 Matthias Koefferlein
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, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "dbPropertiesRepository.h"
#include "dbTestSupport.h"
#include "tlString.h"
#include "tlUnitTest.h"
2024-12-24 11:19:21 +01:00
namespace {
/**
* @brief Installs a temporary repository instance for testing
*
* By using a temp instance, we do not disturb other tests.
*/
class TempPropertiesRepository
{
2024-12-24 11:19:21 +01:00
public:
TempPropertiesRepository ()
{
db::PropertiesRepository::replace_instance_temporarily (&m_temp);
}
~TempPropertiesRepository ()
{
db::PropertiesRepository::replace_instance_temporarily (0);
}
private:
db::PropertiesRepository m_temp;
};
}
2024-12-24 11:19:21 +01:00
TEST(BasicNames)
{
db::PropertiesRepository rep;
tl::Variant n1 ("Hallo");
tl::Variant n2 ("AAA");
2024-12-24 11:19:21 +01:00
db::property_names_id_type id1 = rep.prop_name_id (n1);
db::property_names_id_type id2 = rep.prop_name_id (n2);
db::property_names_id_type id1_copy = id1, id2_copy = id2;
id2 = rep.prop_name_id (n2);
id1 = rep.prop_name_id (n1);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (id1, id1_copy);
EXPECT_EQ (id2, id2_copy);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::property_name (id1) == n1, true);
EXPECT_EQ (db::property_name (id2) == n2, true);
}
2024-12-24 11:19:21 +01:00
TEST(BasicValues)
{
db::PropertiesRepository rep;
2024-12-24 11:19:21 +01:00
tl::Variant v1 ("X");
tl::Variant v2 (17);
2024-12-24 11:19:21 +01:00
db::property_values_id_type id1 = rep.prop_value_id (v1);
db::property_values_id_type id2 = rep.prop_value_id (v2);
db::property_values_id_type id1_copy = id1, id2_copy = id2;
2024-12-24 11:19:21 +01:00
id2 = rep.prop_value_id (v2);
id1 = rep.prop_value_id (v1);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (id1, id1_copy);
EXPECT_EQ (id2, id2_copy);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::property_value (id1) == v1, true);
EXPECT_EQ (db::property_value (id2) == v2, true);
}
2024-12-24 11:19:21 +01:00
TEST(BasicPropertySetsInRepository)
{
2024-12-24 11:19:21 +01:00
db::PropertiesSet set1;
db::PropertiesSet set2;
2024-12-24 11:19:21 +01:00
set1.insert_by_id (0, 1);
set1.insert (10, 2);
2024-12-24 11:19:21 +01:00
set2.insert (0, 1);
set2.insert (9, 3);
set2.insert (2, 5);
db::PropertiesRepository rep;
2024-12-24 11:19:21 +01:00
db::properties_id_type id1 = rep.properties_id (set1);
db::properties_id_type id2 = rep.properties_id (set2);
db::properties_id_type id1_copy = id1, id2_copy = id2;
id2 = rep.properties_id (set2);
id1 = rep.properties_id (set1);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (id1, id1_copy);
EXPECT_EQ (id2, id2_copy);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::properties (id1) == set1, true);
EXPECT_EQ (db::properties (id2) == set2, true);
}
2024-12-24 11:19:21 +01:00
TEST(PropertySets)
{
2024-12-24 11:19:21 +01:00
TempPropertiesRepository tmp_repo;
db::PropertiesSet ps1;
db::PropertiesSet ps2;
EXPECT_EQ (ps1.empty (), true);
EXPECT_EQ (ps1.size (), size_t (0));
EXPECT_EQ (ps1.value (tl::Variant (17)).is_nil (), true);
EXPECT_EQ (ps1 == ps2, true);
EXPECT_EQ (ps1 != ps2, false);
EXPECT_EQ (ps1 < ps2, false);
EXPECT_EQ (ps2 < ps1, false);
ps1.insert (tl::Variant (17), tl::Variant ("value"));
EXPECT_EQ (ps1.empty (), false);
EXPECT_EQ (ps1.size (), size_t (1));
EXPECT_EQ (ps1.has_value (tl::Variant (17)), true);
EXPECT_EQ (ps1.has_value (tl::Variant ()), false);
EXPECT_EQ (ps1.has_value (tl::Variant ("x")), false);
EXPECT_EQ (ps1.value (tl::Variant (17)).to_string (), "value");
EXPECT_EQ (ps1.value (tl::Variant ("x")).is_nil (), true);
EXPECT_EQ (ps1.value (db::property_names_id (17)).to_string (), "value");
EXPECT_EQ (ps1.value (db::property_names_id ("x")).is_nil (), true);
EXPECT_EQ (ps1 [tl::Variant (17)].to_string (), "value");
EXPECT_EQ (ps1 [tl::Variant ("x")].is_nil (), true);
EXPECT_EQ (ps1 == ps2, false);
EXPECT_EQ (ps1 != ps2, true);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (ps1 < ps2, false);
EXPECT_EQ (ps2 < ps1, true);
2024-12-24 11:19:21 +01:00
ps2.swap (ps1);
EXPECT_EQ (ps1.value (tl::Variant (17)).is_nil (), true);
EXPECT_EQ (ps2.value (tl::Variant (17)).to_string (), "value");
2024-12-24 11:45:16 +01:00
ps1 = ps2;
2024-12-24 11:19:21 +01:00
EXPECT_EQ (ps1.value (tl::Variant (17)).to_string (), "value");
EXPECT_EQ (ps1.value (tl::Variant ("x")).is_nil (), true);
EXPECT_EQ (ps1 == ps2, true);
EXPECT_EQ (ps1 != ps2, false);
EXPECT_EQ (ps1 < ps2, false);
EXPECT_EQ (ps2 < ps1, false);
ps2.erase (tl::Variant (17));
EXPECT_EQ (ps2.value (tl::Variant (17)).is_nil (), true);
EXPECT_EQ (ps2.has_value (tl::Variant (17)), false);
EXPECT_EQ (ps2.size (), size_t (0));
EXPECT_EQ (ps2.empty (), true);
ps1.clear ();
EXPECT_EQ (ps1.size (), size_t (0));
EXPECT_EQ (ps1.empty (), true);
}
2024-12-24 11:19:21 +01:00
TEST(PropertySetsMerge)
{
2024-12-24 11:19:21 +01:00
TempPropertiesRepository tmp_repo;
2024-12-24 11:19:21 +01:00
db::PropertiesSet ps1, ps2;
ps1.insert (tl::Variant (17), tl::Variant ("value"));
ps2.insert (tl::Variant ("x"), tl::Variant (42));
2024-12-24 11:19:21 +01:00
ps1.merge (ps2);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (ps1.to_dict_var ().to_string (), "17=>value,x=>42");
2024-12-24 11:19:21 +01:00
}
2024-12-24 11:19:21 +01:00
TEST(PropertySetsConversions)
{
TempPropertiesRepository tmp_repo;
2024-12-24 11:19:21 +01:00
db::PropertiesSet ps1;
ps1.insert (tl::Variant (17), tl::Variant ("value"));
ps1.insert (tl::Variant ("x"), tl::Variant (42));
2024-12-24 11:45:16 +01:00
EXPECT_EQ (ps1.to_dict_var ().to_string (), "17=>value,x=>42");
EXPECT_EQ (ps1.to_list_var ().to_string (), "17,value,x,42");
2024-12-24 11:19:21 +01:00
auto ps1_map = ps1.to_map ();
EXPECT_EQ (ps1_map.size (), size_t (2));
EXPECT_EQ (ps1_map.find (tl::Variant (17))->second.to_string (), "value");
EXPECT_EQ (ps1_map.find (tl::Variant ("x"))->second.to_string (), "42");
EXPECT_EQ (ps1_map.find (tl::Variant (42)) == ps1_map.end (), true);
}
2024-12-24 11:19:21 +01:00
TEST(PropertiesTranslator)
{
EXPECT_EQ (db::PropertiesTranslator ().is_null (), true);
EXPECT_EQ (db::PropertiesTranslator ().is_pass (), true);
EXPECT_EQ (db::PropertiesTranslator ().is_empty (), false);
EXPECT_EQ (db::PropertiesTranslator::make_pass_all ().is_null (), false);
EXPECT_EQ (db::PropertiesTranslator::make_pass_all ().is_pass (), true);
EXPECT_EQ (db::PropertiesTranslator::make_pass_all ().is_empty (), false);
EXPECT_EQ (db::PropertiesTranslator::make_remove_all ().is_null (), false);
EXPECT_EQ (db::PropertiesTranslator::make_remove_all ().is_pass (), false);
EXPECT_EQ (db::PropertiesTranslator::make_remove_all ().is_empty (), true);
db::PropertiesRepository rp;
db::property_names_id_type key1 = rp.prop_name_id (1);
db::property_names_id_type key2 = rp.prop_name_id (2);
db::property_names_id_type key3 = rp.prop_name_id (3);
2024-12-24 11:19:21 +01:00
db::PropertiesSet ps;
ps.insert (key1, 100);
ps.insert (key2, 101);
db::properties_id_type prop1a = rp.properties_id (ps);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (prop1a), "1=>100,2=>101");
ps.clear ();
2024-12-24 11:19:21 +01:00
ps.insert (key1, 0);
ps.insert (key2, 101);
db::properties_id_type prop1b = rp.properties_id (ps);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (prop1b), "1=>0,2=>101");
ps.clear ();
2024-12-24 11:19:21 +01:00
ps.insert (key1, 100);
ps.insert (key3, 102);
db::properties_id_type prop2 = rp.properties_id (ps);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (prop2), "1=>100,3=>102");
ps.clear ();
2024-12-24 11:19:21 +01:00
ps.insert (key1, 100);
db::properties_id_type prop3 = rp.properties_id (ps);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (prop3), "1=>100");
db::PropertiesTranslator t;
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100,2=>101");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0,2=>101");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
t = db::PropertiesTranslator::make_pass_all ();
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100,2=>101");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0,2=>101");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
t = db::PropertiesTranslator::make_remove_all ();
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "");
EXPECT_EQ (db::prop2string (t (prop1b)), "");
EXPECT_EQ (db::prop2string (t (prop2)), "");
EXPECT_EQ (db::prop2string (t (prop3)), "");
std::set<tl::Variant> kf;
kf.insert (1);
2024-12-24 11:19:21 +01:00
t = db::PropertiesTranslator::make_filter (kf, rp);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100");
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
kf.insert (3);
2024-12-24 11:19:21 +01:00
t = db::PropertiesTranslator::make_filter (kf, rp);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
std::map<tl::Variant, tl::Variant> km;
km[1] = 4;
km[3] = 1;
2024-12-24 11:19:21 +01:00
t = db::PropertiesTranslator::make_key_mapper (km, rp);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "4=>100");
EXPECT_EQ (db::prop2string (t (prop1b)), "4=>0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>102,4=>100");
EXPECT_EQ (db::prop2string (t (prop3)), "4=>100");
kf.clear ();
kf.insert (4);
2024-12-24 11:19:21 +01:00
t = db::PropertiesTranslator::make_filter (kf, rp) * db::PropertiesTranslator::make_key_mapper (km, rp);
EXPECT_EQ (t.is_empty (), false);
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "4=>100");
EXPECT_EQ (db::prop2string (t (prop1b)), "4=>0");
EXPECT_EQ (db::prop2string (t (prop2)), "4=>100");
EXPECT_EQ (db::prop2string (t (prop3)), "4=>100");
kf.clear ();
kf.insert (3);
2024-12-24 11:19:21 +01:00
t = db::PropertiesTranslator::make_filter (kf, rp) * db::PropertiesTranslator::make_key_mapper (km, rp);
EXPECT_EQ (t.is_empty (), true);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "");
EXPECT_EQ (db::prop2string (t (prop1b)), "");
EXPECT_EQ (db::prop2string (t (prop2)), "");
EXPECT_EQ (db::prop2string (t (prop3)), "");
2024-12-24 11:19:21 +01:00
t = db::PropertiesTranslator::make_key_mapper (km, rp) * db::PropertiesTranslator::make_filter (kf, rp);
EXPECT_EQ (t.is_empty (), false);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "");
EXPECT_EQ (db::prop2string (t (prop1b)), "");
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (t (prop2)), "1=>102");
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::prop2string (t (prop3)), "");
2024-12-24 11:19:21 +01:00
t = db::PropertiesTranslator::make_key_mapper (km, rp);
t = db::PropertiesTranslator::make_filter (kf, rp) * t;
EXPECT_EQ (t.is_empty (), true);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "");
EXPECT_EQ (db::prop2string (t (prop1b)), "");
EXPECT_EQ (db::prop2string (t (prop2)), "");
EXPECT_EQ (db::prop2string (t (prop3)), "");
2024-12-24 11:19:21 +01:00
t = db::PropertiesTranslator::make_filter (kf, rp);
t = db::PropertiesTranslator::make_key_mapper (km, rp) * t;
EXPECT_EQ (t.is_empty (), false);
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::prop2string (t (prop1a)), "");
EXPECT_EQ (db::prop2string (t (prop1b)), "");
2024-12-24 11:45:16 +01:00
EXPECT_EQ (db::prop2string (t (prop2)), "1=>102");
2024-12-24 11:19:21 +01:00
EXPECT_EQ (db::prop2string (t (prop3)), "");
}