/* KLayout Layout Viewer Copyright (C) 2006-2017 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 "layLayerProperties.h" #include "layLayoutView.h" #include "layMainWindow.h" #include "layApplication.h" #include "tlXMLParser.h" #include "dbLayout.h" #include #include #include size_t size (const lay::LayerPropertiesList &list) { size_t n = 0; for (lay::LayerPropertiesConstIterator i = list.begin_const_recursive (); !i.at_end (); ++i) { ++n; } return n; } bool compare_real (const lay::LayerPropertiesList &a, const lay::LayerPropertiesList &b) { bool debug = true; lay::LayerPropertiesConstIterator i = a.begin_const_recursive (); lay::LayerPropertiesConstIterator j = b.begin_const_recursive (); unsigned int n = 0; while (true) { while (! i.at_end () && i->has_children ()) { ++i; } while (! j.at_end () && j->has_children ()) { ++j; } if (! i.at_end () && ! j.at_end ()) { if (i->frame_color (true) != j->frame_color (true)) { if (debug) printf ("Difference in frame color at element %d\n", n); return false; } if (i->fill_color (true) != j->fill_color (true)) { if (debug) printf ("Difference in fill color at element %d\n", n); return false; } if (i->frame_brightness (true) != j->frame_brightness (true)) { if (debug) printf ("Difference in frame brightness at element %d\n", n); return false; } if (i->fill_brightness (true) != j->fill_brightness (true)) { if (debug) printf ("Difference in fill brightness at element %d\n", n); return false; } if (i->dither_pattern (true) != j->dither_pattern (true)) { if (debug) printf ("Difference in dither pattern at element %d\n", n); return false; } if (i->visible (true) != j->visible (true)) { if (debug) printf ("Difference in visibility at element %d\n", n); return false; } if (i->transparent (true) != j->transparent (true)) { if (debug) printf ("Difference in transparency at element %d\n", n); return false; } if (i->width (true) != j->width (true)) { if (debug) printf ("Difference in transparency at element %d\n", n); return false; } if (i->marked (true) != j->marked (true)) { if (debug) printf ("Difference in marked state at element %d\n", n); return false; } if (i->animation (true) != j->animation (true)) { if (debug) printf ("Difference in animation mode at element %d\n", n); return false; } if (i->source (true) != j->source (true)) { if (debug) printf ("Difference in source at element %d\n", n); return false; } } else if (i.at_end () && j.at_end ()) { return true; } else { if (debug) printf ("Length differs\n"); return false; } ++i; ++j; ++n; } } TEST (1) { tl::XMLStringSource s ( "\n" "\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); list = lay::LayerPropertiesList (); tl::XMLStringSource s2 (os.string ()); list.load (s2); const char *res = "\n" "\n" " \n" " \n" " \n" " 0\n" " 0\n" " \n" " \n" " true\n" " true\n" " false\n" " \n" " false\n" " false\n" " 0\n" " \n" " */*@*\n" " \n" " \n" "\n"; tl::OutputStringStream os2; tl::OutputStream oss2 (os2); list.save (oss2); std::string os2_str (os2.string ()); EXPECT_EQ (os2_str, res); } TEST (2a) { tl::XMLStringSource s ( "\n" "\n" " \n" " #aabbcc\n" " \n" " #010203\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " \n" " #102030\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); list = lay::LayerPropertiesList (); std::string s2_str (os.string ()); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " #aabbcc\n" " \n" " \n" " #aabbcc\n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " #102030\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), true); } TEST (2b) { tl::XMLStringSource s ( "\n" "\n" " \n" " #aabbcc\n" " \n" " #010203\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " \n" " #102030\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); list = lay::LayerPropertiesList (); std::string s2_str (os.string ()); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " #aabbcc\n" " \n" " \n" " #aabbcc\n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " #102031\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), false); } TEST (2c) { tl::XMLStringSource s ( "\n" "\n" " \n" " #aabbcc\n" " \n" " #010203\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " \n" " #102030\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); list = lay::LayerPropertiesList (); std::string s2_str (os.string ()); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " #aabbcc\n" " \n" " \n" " #aabbcc\n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " #102030\n" " \n" " \n" " #102030\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), false); } TEST (2d) { tl::XMLStringSource s ( "\n" "\n" " \n" " #aabbcc\n" " \n" " #010203\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " \n" " #102030\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); list = lay::LayerPropertiesList (); std::string s2_str (os.string ()); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " #aabbcc\n" " \n" " \n" " #aabbcc\n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), false); } TEST (3) { tl::XMLStringSource s ( "\n" "\n" " \n" " #aabbcc\n" " \n" " #010203\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " \n" " #102030\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); std::string s2_str (os.string ()); list = lay::LayerPropertiesList (); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " #aabbcc\n" " \n" " \n" " #aabbcc\n" " \n" " \n" " #020304\n" " \n" " \n" " #030405\n" " \n" " \n" " #102030\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), true); } TEST (4) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 2\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " 12\n" " \n" " \n" " \n" " 14\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); std::string s2_str (os.string ()); list = lay::LayerPropertiesList (); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " 1\n" " \n" " \n" " 1\n" " \n" " \n" " \n" " \n" " \n" " 12\n" " \n" " \n" " 14\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), true); } TEST (5) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 1\n" " \n" " \n" " \n" " \n" " \n" " 0\n" " \n" " \n" " 0\n" " \n" " \n" " 1\n" " \n" " \n" " \n" " 0\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); std::string s2_str (os.string ()); list = lay::LayerPropertiesList (); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " 1\n" " \n" " \n" " 1\n" " \n" " \n" " 0\n" " \n" " \n" " 0\n" " \n" " \n" " 0\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), true); } TEST (6) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 0\n" " \n" " \n" " \n" " \n" " \n" " 0\n" " \n" " \n" " 0\n" " \n" " \n" " 1\n" " \n" " \n" " \n" " 0\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); std::string s2_str (os.string ()); list = lay::LayerPropertiesList (); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " 1\n" " \n" " \n" " 1\n" " \n" " \n" " 0\n" " \n" " \n" " 1\n" " \n" " \n" " 0\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), true); } TEST (7) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 0\n" " \n" " \n" " \n" " \n" " \n" " 0\n" " \n" " \n" " 0\n" " \n" " \n" " 1\n" " \n" " \n" " \n" " 0\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); std::string s2_str (os.string ()); list = lay::LayerPropertiesList (); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " 1\n" " \n" " \n" " 1\n" " \n" " \n" " 0\n" " \n" " \n" " 1\n" " \n" " \n" " 0\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), true); } TEST (8) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 0\n" " \n" " \n" " \n" " \n" " \n" " 0\n" " \n" " \n" " 0\n" " \n" " \n" " 1\n" " \n" " \n" " \n" " 0\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); std::string s2_str (os.string ()); list = lay::LayerPropertiesList (); tl::XMLStringSource s2 (s2_str); list.load (s2); const char *ref = "\n" "\n" " \n" " 1\n" " \n" " \n" " 1\n" " \n" " \n" " 0\n" " \n" " \n" " 1\n" " \n" " \n" " 0\n" " \n" "\n"; lay::LayerPropertiesList flat_ref; tl::XMLStringSource s3 (ref); flat_ref.load (s3); EXPECT_EQ (compare_real (flat_ref, list), true); } TEST (9) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 0\n" " \n" " \n" " \n" " \n" " \n" " 0\n" " \n" " \n" " 0\n" " \n" " \n" " 1\n" " \n" " \n" " \n" " 0\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); EXPECT_EQ (size (list), 8); size_t n, nn; lay::LayerPropertiesIterator end = list.begin_recursive (); while (! end.at_end ()) { ++end; } nn = size (list); n = 0; for (lay::LayerPropertiesIterator iter = list.begin_recursive (); ! iter.at_end (); ++iter, ++n) { lay::LayerPropertiesIterator iter2 = list.begin_recursive (); for (unsigned int i = 0; i < n; ++i) { EXPECT_EQ (iter2 < iter, true); EXPECT_EQ (iter < iter2, false); ++iter2; } EXPECT_EQ (*iter2 == *iter, true); lay::LayerPropertiesIterator iter3 = iter2; if (n < nn) { for (unsigned int i = 0; i < nn - n; ++i) { ++iter3; EXPECT_EQ (iter2 < iter3, true); EXPECT_EQ (iter3 < iter2, false); } } EXPECT_EQ (iter3 == end, true); } EXPECT_EQ (n, 8); } TEST (10) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 2\n" " \n" " \n" " \n" " \n" " \n" " 4\n" " \n" " \n" " 5\n" " \n" " \n" " 6\n" " \n" " \n" " \n" " 7\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); lay::LayerPropertiesList org_list = list; EXPECT_EQ (size (list), 8); std::vector nodes; std::vector positions; while (size (list) > 0) { lay::LayerPropertiesIterator iter = list.begin_recursive (); for (unsigned int i = 0; i < size(list) - 1; ++i) { ++iter; } nodes.push_back (*iter); positions.push_back (iter.uint ()); list.erase (iter); } EXPECT_EQ (nodes.size (), 8); for (unsigned int i = 0; i < 8; ++i) { lay::LayerPropertiesIterator iter (list, positions.back ()); list.insert (iter, nodes.back ()); nodes.pop_back (); positions.pop_back (); } EXPECT_EQ (list == org_list, true); while (size (list) > 0) { lay::LayerPropertiesIterator iter = list.begin_recursive (); nodes.push_back (*iter); positions.push_back (iter.uint ()); list.erase (iter); } EXPECT_EQ (nodes.size (), 2); for (unsigned int i = 0; i < 2; ++i) { lay::LayerPropertiesIterator iter (list, positions.back ()); list.insert (iter, nodes.back ()); nodes.pop_back (); positions.pop_back (); } EXPECT_EQ (list == org_list, true); } void build_list (lay::LayerPropertiesConstIterator &iter, lay::LayerPropertiesList &list, lay::LayerPropertiesNode *node) { while (! iter.at_end ()) { lay::LayerProperties props (*iter); if (node) { node->add_child (lay::LayerPropertiesNode (props)); if (iter->has_children ()) { iter.down_first_child (); build_list (iter, list, &node->last_child ()); iter.up (); } } else { list.push_back (lay::LayerPropertiesNode (props)); if (iter->has_children ()) { iter.down_first_child (); build_list (iter, list, &list.back ()); iter.up (); } } iter.next_sibling (); } } TEST (11) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 2\n" " \n" " \n" " \n" " \n" " \n" " 4\n" " \n" " \n" " 5\n" " \n" " \n" " 6\n" " \n" " \n" " \n" " 7\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); lay::LayerPropertiesList new_list; lay::LayerPropertiesConstIterator iter (list.begin_recursive ()); build_list (iter, new_list, 0); EXPECT_EQ (size (new_list), size (list)); EXPECT_EQ (iter.at_end (), true); EXPECT_EQ (list == new_list, true); } void test_list (ut::TestBase *_this, lay::LayerPropertiesConstIterator &iter) { lay::LayerPropertiesConstIterator i0 (iter); size_t nc = 0; while (! iter.at_end ()) { lay::LayerProperties props (*iter); if (iter->has_children ()) { iter.down_first_child (); test_list (_this, iter); iter.up (); } EXPECT_EQ (iter.child_index (), nc); iter.next_sibling (); ++nc; } i0.next_sibling (nc); EXPECT_EQ (iter == i0, true); } TEST (12) { tl::XMLStringSource s ( "\n" "\n" " \n" " 1\n" " \n" " 2\n" " \n" " \n" " \n" " \n" " \n" " 4\n" " \n" " \n" " 5\n" " \n" " \n" " 6\n" " \n" " \n" " \n" " 7\n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); lay::LayerPropertiesConstIterator iter (list.begin_recursive ()); test_list (_this, iter); } TEST (13) { tl::XMLStringSource s ( "\n" "\n" " \n" " #112233\n" " #aabbcc\n" " -20\n" " 16\n" " 5\n" " 0\n" " 1\n" " 3\n" " 1\n" " 2\n" " 1\n" " 3/2@1\n" " \n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); lay::LayerPropertiesConstIterator iter (list.begin_recursive ()); ++iter; EXPECT_EQ (iter->has_children (), false); const lay::LayerPropertiesNode &node = *iter; lay::LayerProperties flat = node.flat (); EXPECT_EQ (node.animation (false /*local*/), 0); EXPECT_EQ (node.animation (true /*real*/), 2); EXPECT_EQ (flat.animation (false /*local*/), 2); EXPECT_EQ (flat.animation (true /*real*/), 2); EXPECT_EQ (flat.eff_fill_color (true) == node.eff_fill_color (true), true); EXPECT_EQ (flat.eff_fill_color (false) == node.eff_fill_color (true), true); EXPECT_EQ (flat.eff_fill_color (false) == node.eff_fill_color (false), false); EXPECT_EQ (flat.eff_frame_color (true) == node.eff_frame_color (true), true); EXPECT_EQ (flat.eff_frame_color (false) == node.eff_frame_color (true), true); EXPECT_EQ (flat.eff_frame_color (false) == node.eff_frame_color (false), false); EXPECT_EQ (flat.frame_brightness (true) == node.frame_brightness (true), true); EXPECT_EQ (flat.frame_brightness (false) == node.frame_brightness (true), true); EXPECT_EQ (flat.frame_brightness (false) == node.frame_brightness (false), false); EXPECT_EQ (flat.fill_brightness (true) == node.fill_brightness (true), true); EXPECT_EQ (flat.fill_brightness (false) == node.fill_brightness (true), true); EXPECT_EQ (flat.fill_brightness (false) == node.fill_brightness (false), false); EXPECT_EQ (flat.dither_pattern (true) == node.dither_pattern (true), true); EXPECT_EQ (flat.dither_pattern (false) == node.dither_pattern (true), true); EXPECT_EQ (flat.dither_pattern (false) == node.dither_pattern (false), false); EXPECT_EQ (flat.visible (true) == node.visible (true), true); EXPECT_EQ (flat.visible (false) == node.visible (true), true); EXPECT_EQ (flat.visible (false) == node.visible (false), false); EXPECT_EQ (flat.transparent (true) == node.transparent (true), true); EXPECT_EQ (flat.transparent (false) == node.transparent (true), true); EXPECT_EQ (flat.transparent (false) == node.transparent (false), false); EXPECT_EQ (flat.marked (true) == node.marked (true), true); EXPECT_EQ (flat.marked (false) == node.marked (true), true); EXPECT_EQ (flat.marked (false) == node.marked (false), false); EXPECT_EQ (flat.width (true) == node.width (true), true); EXPECT_EQ (flat.width (false) == node.width (true), true); EXPECT_EQ (flat.width (false) == node.width (false), false); EXPECT_EQ (flat.animation (true) == node.animation (true), true); EXPECT_EQ (flat.animation (false) == node.animation (true), true); EXPECT_EQ (flat.animation (false) == node.animation (false), false); EXPECT_EQ (flat.source (true) == node.source (true), true); EXPECT_EQ (flat.source (false) == node.source (true), true); EXPECT_EQ (flat.source (false) == node.source (false), false); } TEST (14) { tl::XMLStringSource s ( "\n" "\n" " \n" " #112233\n" " #aabbcc\n" " -20\n" " 16\n" " 5\n" " 0\n" " 1\n" " 3\n" " 1\n" " 2\n" " 1\n" " 3/2@1\n" " \n" " \n" " \n" "\n"); lay::LayerPropertiesList list; list.load (s); lay::LayerPropertiesConstIterator iter (list.begin_recursive ()); ++iter; EXPECT_EQ (iter->has_children (), false); const lay::LayerPropertiesNode &node = *iter; EXPECT_EQ (node.animation (false /*local*/), 0); EXPECT_EQ (node.animation (true /*real*/), 2); lay::LayerProperties f = node.flat (); lay::LayerProperties flat (f); EXPECT_EQ (flat.animation (false /*local*/), 2); EXPECT_EQ (flat.animation (true /*real*/), 2); EXPECT_EQ (flat.eff_fill_color (true) == node.eff_fill_color (true), true); EXPECT_EQ (flat.eff_fill_color (false) == node.eff_fill_color (true), true); EXPECT_EQ (flat.eff_fill_color (false) == node.eff_fill_color (false), false); EXPECT_EQ (flat.eff_frame_color (true) == node.eff_frame_color (true), true); EXPECT_EQ (flat.eff_frame_color (false) == node.eff_frame_color (true), true); EXPECT_EQ (flat.eff_frame_color (false) == node.eff_frame_color (false), false); EXPECT_EQ (flat.frame_brightness (true) == node.frame_brightness (true), true); EXPECT_EQ (flat.frame_brightness (false) == node.frame_brightness (true), true); EXPECT_EQ (flat.frame_brightness (false) == node.frame_brightness (false), false); EXPECT_EQ (flat.fill_brightness (true) == node.fill_brightness (true), true); EXPECT_EQ (flat.fill_brightness (false) == node.fill_brightness (true), true); EXPECT_EQ (flat.fill_brightness (false) == node.fill_brightness (false), false); EXPECT_EQ (flat.dither_pattern (true) == node.dither_pattern (true), true); EXPECT_EQ (flat.dither_pattern (false) == node.dither_pattern (true), true); EXPECT_EQ (flat.dither_pattern (false) == node.dither_pattern (false), false); EXPECT_EQ (flat.visible (true) == node.visible (true), true); EXPECT_EQ (flat.visible (false) == node.visible (true), true); EXPECT_EQ (flat.visible (false) == node.visible (false), false); EXPECT_EQ (flat.transparent (true) == node.transparent (true), true); EXPECT_EQ (flat.transparent (false) == node.transparent (true), true); EXPECT_EQ (flat.transparent (false) == node.transparent (false), false); EXPECT_EQ (flat.marked (true) == node.marked (true), true); EXPECT_EQ (flat.marked (false) == node.marked (true), true); EXPECT_EQ (flat.marked (false) == node.marked (false), false); EXPECT_EQ (flat.width (true) == node.width (true), true); EXPECT_EQ (flat.width (false) == node.width (true), true); EXPECT_EQ (flat.width (false) == node.width (false), false); EXPECT_EQ (flat.animation (true) == node.animation (true), true); EXPECT_EQ (flat.animation (false) == node.animation (true), true); EXPECT_EQ (flat.animation (false) == node.animation (false), false); EXPECT_EQ (flat.source (true) == node.source (true), true); EXPECT_EQ (flat.source (false) == node.source (true), true); EXPECT_EQ (flat.source (false) == node.source (false), false); } TEST (15) { lay::LayerPropertiesList list; list.push_back (lay::LayerPropertiesNode ()); unsigned int id = list.back ().id (); lay::LayerPropertiesNode n = list.back (); EXPECT_EQ (n.id (), id); lay::LayerPropertiesNode nn; EXPECT_EQ (nn.id () == id, false); list.push_back (nn); EXPECT_EQ (list.back ().id (), nn.id ()); lay::LayerPropertiesNode n2; EXPECT_EQ (n2.id () == id, false); EXPECT_EQ (n2.id () == nn.id (), false); lay::LayerPropertiesIterator iter = list.begin_recursive (); ++iter; list.insert (iter, n2); EXPECT_EQ (list.begin ()[0].id (), id); EXPECT_EQ (list.begin ()[1].id (), n2.id ()); EXPECT_EQ (list.begin ()[2].id (), nn.id ()); } TEST (16) { lay::LayerPropertiesList list; db::Manager mgr; lay::LayoutView view (&mgr, lay::Application::instance ()->is_editable (), lay::MainWindow::instance ()); list.attach_view (&view, 0); int cv1 = view.create_layout ("", true, false); db::Layout &ly1 = view.cellview (cv1)->layout (); ly1.insert_layer (db::LayerProperties (1, 0)); ly1.insert_layer (db::LayerProperties (2, 0)); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("1/0@1"); std::map cvmap; cvmap.insert (std::make_pair (cv1, cv1)); list.expand (cvmap, false); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); tl::XMLStringSource s ( "\n" "\n" " \n" " #ff80a8\n" " #ff80a8\n" " 0\n" " 0\n" " I9\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " 1/0@1\n" " \n" " \n" "\n" ); lay::LayerPropertiesList ref; ref.load (s); EXPECT_EQ (compare_real (ref, list), true); } TEST (17) { lay::LayerPropertiesList list; db::Manager mgr; lay::LayoutView view (&mgr, lay::Application::instance ()->is_editable (), lay::MainWindow::instance ()); list.attach_view (&view, 0); int cv1 = view.create_layout ("", true, false); db::Layout &ly1 = view.cellview (cv1)->layout (); ly1.insert_layer (db::LayerProperties (1, 0)); ly1.insert_layer (db::LayerProperties (2, 0)); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("1/0@1"); std::map cvmap; cvmap.insert (std::make_pair (cv1, cv1)); list.expand (cvmap, true); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); tl::XMLStringSource s ( "\n" "\n" " \n" " #ff80a8\n" " #ff80a8\n" " 0\n" " 0\n" " I9\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " 1/0@1\n" " \n" " \n" " #c080ff\n" " #c080ff\n" " 0\n" " 0\n" " I5\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " 2/0@1\n" " \n" " \n" "\n" ); lay::LayerPropertiesList ref; ref.load (s); EXPECT_EQ (compare_real (ref, list), true); } TEST (18) { lay::LayerPropertiesList list; db::Manager mgr; lay::LayoutView view (&mgr, lay::Application::instance ()->is_editable (), lay::MainWindow::instance ()); list.attach_view (&view, 0); int cv1 = view.create_layout ("", true, false); db::Layout &ly1 = view.cellview (cv1)->layout (); ly1.insert_layer (db::LayerProperties (1, 0)); ly1.insert_layer (db::LayerProperties (2, 0)); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("1/0@1"); list.push_back (lay::LayerPropertiesNode ()); std::map cvmap; cvmap.insert (std::make_pair (cv1, cv1)); list.expand (cvmap, false); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); tl::XMLStringSource s ( "\n" "\n" " \n" " #ff80a8\n" " #ff80a8\n" " 0\n" " 0\n" " I9\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " 1/0@1\n" " \n" " \n" " #c080ff\n" " #c080ff\n" " 0\n" " 0\n" " I5\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " 2/0@1\n" " \n" " \n" "\n" ); lay::LayerPropertiesList ref; ref.load (s); EXPECT_EQ (compare_real (ref, list), true); } TEST (19) { lay::LayerPropertiesList list; db::Manager mgr; lay::LayoutView view (&mgr, lay::Application::instance ()->is_editable (), lay::MainWindow::instance ()); list.attach_view (&view, 0); int cv1 = view.create_layout ("", true, false); db::Layout &ly1 = view.cellview (cv1)->layout (); ly1.insert_layer (db::LayerProperties (1, 0, "L01")); ly1.insert_layer (db::LayerProperties (2, 0, "L02")); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("1/0@1"); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("*/*@* (r90)"); std::map cvmap; cvmap.insert (std::make_pair (cv1, cv1)); list.expand (cvmap, false); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); tl::XMLStringSource s ( "\n" "\n" " \n" " #ff80a8\n" " #ff80a8\n" " 0\n" " 0\n" " I9\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " 1/0@1\n" " \n" " \n" " #c080ff\n" " #c080ff\n" " 0\n" " 0\n" " I5\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " L02 2/0@1 (r90 *1 0,0)\n" " \n" " \n" "\n" ); lay::LayerPropertiesList ref; ref.load (s); EXPECT_EQ (compare_real (ref, list), true); } TEST (20) { lay::LayerPropertiesList list; db::Manager mgr; lay::LayoutView view (&mgr, lay::Application::instance ()->is_editable (), lay::MainWindow::instance ()); list.attach_view (&view, 0); int cv1 = view.create_layout ("", true, false); db::Layout &ly1 = view.cellview (cv1)->layout (); ly1.insert_layer (db::LayerProperties (1, 0, "L01")); ly1.insert_layer (db::LayerProperties (2, 0, "L02")); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("1/0@1"); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("*/*@* (r90)"); list.back ().set_frame_color (0x123456); list.back ().set_fill_color (0x654321); list.back ().set_visible (false); std::map cvmap; cvmap.insert (std::make_pair (cv1, cv1)); list.expand (cvmap, false); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); tl::XMLStringSource s ( "\n" "\n" " \n" " #ff80a8\n" " #ff80a8\n" " 0\n" " 0\n" " I9\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " 1/0@1\n" " \n" " \n" " #123456\n" " #654321\n" " 0\n" " 0\n" " I5\n" " true\n" " false\n" " false\n" " \n" " false\n" " 0\n" " \n" " L02 2/0@1 (r90 *1 0,0)\n" " \n" " \n" "\n" ); lay::LayerPropertiesList ref; ref.load (s); EXPECT_EQ (compare_real (ref, list), true); } TEST (21) { lay::LayerPropertiesList list; db::Manager mgr; lay::LayoutView view (&mgr, lay::Application::instance ()->is_editable (), lay::MainWindow::instance ()); list.attach_view (&view, 0); int cv1 = view.create_layout ("", true, false); db::Layout &ly1 = view.cellview (cv1)->layout (); ly1.insert_layer (db::LayerProperties (2, 0, "L02")); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("1/0@1"); list.push_back (lay::LayerPropertiesNode ()); list.back ().set_source ("*/*@* (r90)"); list.back ().set_frame_color (0x123456); list.back ().set_fill_color (0x654321); list.back ().set_visible (false); std::map cvmap; cvmap.insert (std::make_pair (cv1, cv1)); list.expand (cvmap, false); tl::OutputStringStream os; tl::OutputStream oss (os); list.save (oss); tl::XMLStringSource s ( "\n" "\n" " \n" " #ff80a8\n" " #ff80a8\n" " 0\n" " 0\n" " I9\n" " true\n" " true\n" " false\n" " \n" " false\n" " 0\n" " \n" " 1/0@1\n" " \n" " \n" " #123456\n" " #654321\n" " 0\n" " 0\n" " I5\n" " true\n" " false\n" " false\n" " \n" " false\n" " 0\n" " \n" " L02 2/0@1 (r90 *1 0,0)\n" " \n" " \n" "\n" ); lay::LayerPropertiesList ref; ref.load (s); EXPECT_EQ (compare_real (ref, list), true); }