20#define BOOST_TEST_NO_MAIN
21#include <boost/test/unit_test.hpp>
38 BOOST_CHECK( k.
primary == wxT(
"VALUE" ) );
47 BOOST_CHECK( k.
primary == wxT(
"U1" ) );
48 BOOST_CHECK( k.
secondary == wxT(
"VALUE" ) );
57 BOOST_CHECK( k.
primary == wxT(
":VALUE" ) );
65 BOOST_CHECK( k.
primary == wxT(
"U1:" ) );
73 BOOST_CHECK( k.
primary == wxT(
"PROJECTNAME" ) );
87 BOOST_CHECK( k.
primary == wxT(
"SHEETNAME" ) );
98 BOOST_CHECK( port.
primary == wxT(
"OP" ) );
99 BOOST_CHECK( port.
secondary == wxT(
"1" ) );
115 BOOST_CHECK( a == b );
116 BOOST_CHECK( !( a == c ) );
117 BOOST_CHECK( !( a == d ) );
127 plain.
primary = wxT(
"U1:VALUE" );
136 BOOST_CHECK_NE( hasher( plain ), hasher( cross ) );
150 BOOST_REQUIRE_EQUAL( refs.size(), 1u );
152 BOOST_CHECK( refs[0].primary == wxT(
"VALUE" ) );
159 BOOST_REQUIRE_EQUAL( refs.size(), 1u );
161 BOOST_CHECK( refs[0].primary == wxT(
"U1" ) );
162 BOOST_CHECK( refs[0].secondary == wxT(
"VALUE" ) );
169 BOOST_REQUIRE_EQUAL( refs.size(), 3u );
173 return std::any_of( refs.begin(), refs.end(),
175 { return ref.kind == k && ref.primary == p && ref.secondary == s; } );
200 bool hasBar = std::any_of( refs.begin(), refs.end(),
202 { return k.primary == wxT(
"BAR" ); } );
204 BOOST_CHECK( hasBar );
214 bool hasBar = std::any_of( refs.begin(), refs.end(),
216 { return k.primary == wxT(
"BAR" ); } );
217 bool hasOuter = std::any_of( refs.begin(), refs.end(),
219 { return k.primary.Contains( wxT(
"FOO_" ) ); } );
221 BOOST_CHECK( hasBar );
222 BOOST_CHECK( hasOuter );
234 BOOST_REQUIRE_EQUAL( refs.size(), 1u );
235 BOOST_CHECK( refs[0].primary == wxT(
"ERC_WARNING something" ) );
246 bool hasRow = std::any_of( refs.begin(), refs.end(),
248 { return k.primary == wxT(
"ROW" ); } );
249 bool hasOuter = std::any_of( refs.begin(), refs.end(),
251 { return k.kind == TEXT_VAR_REF_KEY::KIND::CROSS_REF
252 && k.primary == wxT(
"U1" ); } );
254 BOOST_CHECK( hasRow );
255 BOOST_CHECK( hasOuter );
265 bool hasX = std::any_of( refs.begin(), refs.end(),
267 { return k.primary == wxT(
"X" ); } );
290 std::vector<TEXT_VAR_REF_KEY> keys = {
295 index.Register( itemPtr, keys );
301 std::vector<EDA_ITEM*> found;
302 index.ForEachDependent( keys[0], [&](
EDA_ITEM* i ) { found.push_back( i ); } );
304 BOOST_REQUIRE_EQUAL( found.size(), 1u );
318 index.Register( itemPtr, { oldKey } );
321 index.Register( itemPtr, { newKey } );
335 index.Register( itemPtr, { key } );
338 index.Unregister( itemPtr );
343 index.Unregister( itemPtr );
361 index.Register( aPtr, { shared } );
362 index.Register( bPtr, { shared, other } );
363 index.Register( cPtr, { other } );
370 index.Unregister( aPtr );
373 std::vector<EDA_ITEM*> remaining;
374 index.ForEachDependent( shared, [&](
EDA_ITEM* i ) { remaining.push_back( i ); } );
375 BOOST_REQUIRE_EQUAL( remaining.size(), 1u );
391 index.Register( aPtr, { k1 } );
392 index.Register( bPtr, { k2 } );
410 index.Register( itemPtr, { key } );
414 index.Register( itemPtr, {} );
432 FakeItem unrelated{ 3 };
445 std::vector<EDA_ITEM*> hit;
452 BOOST_CHECK( std::find( hit.begin(), hit.end(), aPtr ) != hit.end() );
453 BOOST_CHECK( std::find( hit.begin(), hit.end(), bPtr ) != hit.end() );
454 BOOST_CHECK( std::find( hit.begin(), hit.end(), unrelatedPtr ) == hit.end() );
461 FakeItem dependent{ 1 };
462 FakeItem source{ 2 };
471 [&](
EDA_ITEM* item ) -> std::vector<TEXT_VAR_REF_KEY>
473 if( item == sourcePtr )
479 std::vector<std::pair<EDA_ITEM*, TEXT_VAR_REF_KEY>> invalidations;
482 { invalidations.emplace_back( item, key ); } );
488 BOOST_REQUIRE_EQUAL( invalidations.size(), 1u );
490 BOOST_CHECK( invalidations[0].second == crossRef );
512 FakeItem crossDep{ 1 };
513 FakeItem localDep{ 2 };
514 FakeItem titleDep{ 3 };
524 std::vector<EDA_ITEM*> hit;
533 BOOST_CHECK( std::find( hit.begin(), hit.end(), crossPtr ) != hit.end() );
534 BOOST_CHECK( std::find( hit.begin(), hit.end(), localPtr ) != hit.end() );
535 BOOST_CHECK( std::find( hit.begin(), hit.end(), titlePtr ) == hit.end() );
542 FakeItem titleDep{ 1 };
543 FakeItem crossDep{ 2 };
551 std::vector<EDA_ITEM*> hit;
560 BOOST_REQUIRE_EQUAL( hit.size(), 1u );
578 index.Register( aPtr, { k1, k2 } );
579 index.Register( bPtr, { k2, k3 } );
581 std::vector<TEXT_VAR_REF_KEY> keys =
index.GetRegisteredKeys();
A base class for most all the KiCad significant classes used in schematics and boards.
Bidirectional index mapping TEXT_VAR_REF_KEY → dependent items and item → keys.
std::size_t ItemCount() const
void Register(EDA_ITEM *aItem, const std::vector< TEXT_VAR_REF_KEY > &aKeys)
Replace the key set for aItem with aKeys.
Coordinates the dependency index with change notifications.
void HandleItemChanged(EDA_ITEM *aItem, const std::vector< TEXT_VAR_REF_KEY > &aUpdatedKeys)
Handle a composite change for aItem: register its updated keys and fan out invalidation for every key...
void InvalidateVariantScoped()
Invalidate every source whose resolved value can differ between variants: CROSS_REF (footprint/symbol...
void SetSourceKeyExtractor(SourceKeyExtractor aExtractor)
ListenerHandle AddInvalidateListener(InvalidateCallback aCallback)
Register a listener that fires for every invalidation.
void InvalidateByKind(std::initializer_list< TEXT_VAR_REF_KEY::KIND > aKinds)
Fan out invalidation for every registered key whose KIND is one of the supplied set.
TEXT_VAR_DEPENDENCY_INDEX & Index()
void InvalidateKey(const TEXT_VAR_REF_KEY &aKey)
Fan out invalidation for a single explicit key — used when a non-item source changes (e....
std::vector< TEXT_VAR_REF_KEY > ExtractTextVarReferences(const wxString &aSource)
Lex-scan aSource and return every ${...} reference that appears, without resolving.
Identifies a single resolvable source that a text item's ${...} reference depends on.
static TEXT_VAR_REF_KEY FromToken(const wxString &aToken)
Parse a raw token (the text between ${ and }) into a key using lexical classification only — no looku...
KIND
Categorizes a reference by the source that will produce its value.
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_AUTO_TEST_SUITE_END()
BOOST_CHECK_EQUAL(result, "25.4")
BOOST_AUTO_TEST_CASE(KeyFromToken_Plain)