diff --git a/dumpAst/src/main/jastadd/GenerationBackend.jadd b/dumpAst/src/main/jastadd/GenerationBackend.jadd index c59d1cc444f46b65ba76f6e9161138ee1f991780..06be2080f4539fbdcecbcd1762c79ce28f93d73f 100644 --- a/dumpAst/src/main/jastadd/GenerationBackend.jadd +++ b/dumpAst/src/main/jastadd/GenerationBackend.jadd @@ -270,31 +270,124 @@ aspect GenerationBackend { } // TODO: add new attributes for: {token,child,relation,attribute,nta}Enabled(String parentType, String name). 1) just move implementation into this attribute. 2) add include/exclude on type-level to it. + + // --- isTypeEnabled --- syn boolean DumpAst.isTypeEnabled(String typeName) { return !matches(getBuildConfig().typeIgnorePattern(), typeName); } + // --- isTokenEnabled --- syn boolean DumpAst.isTokenEnabled(String parentType, String tokenName) { - return !matches(getBuildConfig().getGlobalPatternCollection().tokenIgnorePattern(), tokenName); + // level 4: excluded for type? -> return no + PatternCollection excludeOnType = getBuildConfig().matchExcludePatternCollection(parentType); + if (excludeOnType != null && matches(excludeOnType.tokenPattern(), tokenName)) { + return false; + } + // level 3: included for type? -> return yes + PatternCollection includeOnType = getBuildConfig().matchIncludePatternCollection(parentType); + if (includeOnType != null && matches(includeOnType.tokenPattern(), tokenName)) { + return true; + } + // level 2: globally excluded? -> return no + // level 1: otherwise return yes + return !matches(getBuildConfig().getGlobalPatternCollection().tokenPattern(), tokenName); } + + // --- isChildEnabled --- syn boolean DumpAst.isChildEnabled(String parentType, String childName) { - return !matches(getBuildConfig().getGlobalPatternCollection().childIgnorePattern(), childName); + // level 4: excluded for type? -> return no + PatternCollection excludeOnType = getBuildConfig().matchExcludePatternCollection(parentType); + if (excludeOnType != null && matches(excludeOnType.childPattern(), childName)) { + return false; + } + // level 3: included for type? -> return yes + PatternCollection includeOnType = getBuildConfig().matchIncludePatternCollection(parentType); + if (includeOnType != null && matches(includeOnType.childPattern(), childName)) { + return true; + } + // level 2: globally excluded? -> return no + // level 1: otherwise return yes + return !matches(getBuildConfig().getGlobalPatternCollection().childPattern(), childName); } + + // --- isRelationEnabled --- syn boolean DumpAst.isRelationEnabled(String parentType, String relationName) { - return !matches(getBuildConfig().getGlobalPatternCollection().relationIgnorePattern(), relationName); + // level 4: excluded for type? -> return no + PatternCollection excludeOnType = getBuildConfig().matchExcludePatternCollection(parentType); + if (excludeOnType != null && matches(excludeOnType.relationPattern(), relationName)) { + return false; + } + // level 3: included for type? -> return yes + PatternCollection includeOnType = getBuildConfig().matchIncludePatternCollection(parentType); + if (includeOnType != null && matches(includeOnType.relationPattern(), relationName)) { + return true; + } + // level 2: globally excluded? -> return no + // level 1: otherwise return yes + return !matches(getBuildConfig().getGlobalPatternCollection().relationPattern(), relationName); } + + // --- isAttributeEnabled --- syn boolean DumpAst.isAttributeEnabled(String parentType, String attributeName) { - return matches(getBuildConfig().getGlobalPatternCollection().attributeIncludePattern(), attributeName); + // level 4: included for type? -> return yes + PatternCollection includeOnType = getBuildConfig().matchIncludePatternCollection(parentType); + if (includeOnType != null && matches(includeOnType.attributePattern(), attributeName)) { + return true; + } + // level 3: excluded for type? -> return no + PatternCollection excludeOnType = getBuildConfig().matchExcludePatternCollection(parentType); + if (excludeOnType != null && matches(excludeOnType.attributePattern(), attributeName)) { + return false; + } + // level 2: globally included? -> return yes + // level 1: otherwise return no + return matches(getBuildConfig().getGlobalPatternCollection().attributePattern(), attributeName); } + + // --- isNonterminalAttributeEnabled --- syn boolean DumpAst.isNonterminalAttributeEnabled(String parentType, String ntaName) { - return matches(getBuildConfig().getGlobalPatternCollection().ntaIncludePattern(), ntaName); + // level 4: included for type? -> return yes + PatternCollection includeOnType = getBuildConfig().matchIncludePatternCollection(parentType); + if (includeOnType != null && matches(includeOnType.ntaPattern(), ntaName)) { + return true; + } + // level 3: excluded for type? -> return no + PatternCollection excludeOnType = getBuildConfig().matchExcludePatternCollection(parentType); + if (excludeOnType != null && matches(excludeOnType.ntaPattern(), ntaName)) { + return false; + } + // level 2: globally included? -> return yes + // level 1: otherwise return no + return matches(getBuildConfig().getGlobalPatternCollection().ntaPattern(), ntaName); } + // --- match{In,Ex}cludePatternCollection --- + syn PatternCollection BuildConfig.matchIncludePatternCollection(String typeName) { + for (TypePatternCollectionMapping mapping : getIncludeTypePatternList()) { + if (matches(mapping.typePattern(), typeName)) { + return mapping.getPatternCollection(); + } + } + return null; + } + syn PatternCollection BuildConfig.matchExcludePatternCollection(String typeName) { + for (TypePatternCollectionMapping mapping : getExcludeTypePatternList()) { + if (matches(mapping.typePattern(), typeName)) { + return mapping.getPatternCollection(); + } + } + return null; + } + + // --- {typeIgnore,child,token,relation,attribute,nta}Pattern --- syn java.util.regex.Pattern BuildConfig.typeIgnorePattern() = java.util.regex.Pattern.compile(getTypeIgnorePattern()); - syn java.util.regex.Pattern PatternCollection.childIgnorePattern() = java.util.regex.Pattern.compile(getChildPattern()); - syn java.util.regex.Pattern PatternCollection.tokenIgnorePattern() = java.util.regex.Pattern.compile(getTokenPattern()); - syn java.util.regex.Pattern PatternCollection.attributeIncludePattern() = java.util.regex.Pattern.compile(getAttributePattern()); - syn java.util.regex.Pattern PatternCollection.ntaIncludePattern() = java.util.regex.Pattern.compile(getNonterminalAttributePattern()); - syn java.util.regex.Pattern PatternCollection.relationIgnorePattern() = java.util.regex.Pattern.compile(getRelationPattern()); + syn java.util.regex.Pattern PatternCollection.childPattern() = java.util.regex.Pattern.compile(getChildPattern()); + syn java.util.regex.Pattern PatternCollection.tokenPattern() = java.util.regex.Pattern.compile(getTokenPattern()); + syn java.util.regex.Pattern PatternCollection.relationPattern() = java.util.regex.Pattern.compile(getRelationPattern()); + syn java.util.regex.Pattern PatternCollection.attributePattern() = java.util.regex.Pattern.compile(getAttributePattern()); + syn java.util.regex.Pattern PatternCollection.ntaPattern() = java.util.regex.Pattern.compile(getNonterminalAttributePattern()); + syn java.util.regex.Pattern TypePatternCollectionMapping.typePattern() = java.util.regex.Pattern.compile(getTypeRegex()); + + // --- matches --- static boolean ASTNode.matches(java.util.regex.Pattern p, String input) { return p.matcher(input).matches(); } diff --git a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestTypeLevel3.java b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestTypeLevel3.java index 023ffdb2977ff034acc712a8ef8d00c54dbfec99..3d37a56a6e25751f38d1bd96daa48b4ec8f16db2 100644 --- a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestTypeLevel3.java +++ b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestTypeLevel3.java @@ -33,7 +33,7 @@ public class TestTypeLevel3 { assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); for (String name : Tx_NAMES) { DumpNode actualTx = TestUtils.findByName(nodes, name); - assertThat(valueTokens(actualTx)).containsExactly(entry("Name", name)); + assertThat(valueTokens(actualTx)).containsOnly(entry("Name", name)); } } @@ -47,27 +47,27 @@ public class TestTypeLevel3 { dp -> dp.excludeTokens("Unwanted") .includeTokensFor("T2", "Unwanted")); assertThat(nodesT2).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); - assertThat(valueTokens(TestUtils.findByName(nodesT2, T1_NAME))).containsExactly( + assertThat(valueTokens(TestUtils.findByName(nodesT2, T1_NAME))).containsOnly( entry("Name", T1_NAME)); - assertThat(valueTokens(TestUtils.findByName(nodesT2, T2_NAME))).containsExactly( + assertThat(valueTokens(TestUtils.findByName(nodesT2, T2_NAME))).containsOnly( entry("Name", T2_NAME), entry("Unwanted", 5)); - assertThat(valueTokens(TestUtils.findByName(nodesT2, T3_NAME))).containsExactly( + assertThat(valueTokens(TestUtils.findByName(nodesT2, T3_NAME))).containsOnly( entry("Name", T3_NAME)); List<DumpNode> nodesT2T3 = TestUtils.dumpModel(root, dp -> dp.excludeTokens("Unwanted") .includeTokensFor("T2|T3", "Unwanted")); assertThat(nodesT2T3).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); - assertThat(valueTokens(TestUtils.findByName(nodesT2T3, T1_NAME))).containsExactly( + assertThat(valueTokens(TestUtils.findByName(nodesT2T3, T1_NAME))).containsOnly( entry("Name", T1_NAME)); - assertThat(valueTokens(TestUtils.findByName(nodesT2T3, T2_NAME))).containsExactly( + assertThat(valueTokens(TestUtils.findByName(nodesT2T3, T2_NAME))).containsOnly( entry("Name", T2_NAME), entry("Unwanted", 5)); - assertThat(valueTokens(TestUtils.findByName(nodesT2T3, T3_NAME))).containsExactly( + assertThat(valueTokens(TestUtils.findByName(nodesT2T3, T3_NAME))).containsOnly( entry("Name", T3_NAME), entry("Unwanted", 5)); } @Test - public void testChildLevel2Excluded() { + public void testNormalChildLevel2Excluded() { Consumer<AbstractT> setB = t -> t.setB(createB(t.getName() + B_NAME)); TRoot root = createTRoot(createA(A_NAME), createT1(setB), createT2(setB), createT3(setB)); Assertions.assertEquals(T2_NAME + B_NAME, root.getT2().getB().getName()); @@ -76,12 +76,12 @@ public class TestTypeLevel3 { assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); for (String name : Tx_NAMES) { DumpNode actualTx = TestUtils.findByName(nodes, name); - assertThat(listChildren(actualTx)).isEmpty(); + assertThat(normalChildren(actualTx)).isEmpty(); } } @Test - public void testChildLevel3SomeIncluded() { + public void testNormalChildLevel3SomeIncluded() { Consumer<AbstractT> setB = t -> t.setB(createB(t.getName() + B_NAME)); TRoot root = createTRoot(createA(A_NAME), createT1(setB), createT2(setB), createT3(setB)); Assertions.assertEquals(T2_NAME + B_NAME, root.getT2().getB().getName()); @@ -89,9 +89,39 @@ public class TestTypeLevel3 { List<DumpNode> nodes = TestUtils.dumpModel(root, dp -> dp.excludeChildren("B") .includeChildrenFor("T2", "B")); + assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME, T2_NAME + B_NAME); + assertThat(normalChildren(TestUtils.findByName(nodes, T1_NAME))).isEmpty(); + assertThatMapOf(normalChildren(TestUtils.findByName(nodes, T2_NAME))).containsOnly( + tuple("B", T2_NAME + B_NAME)); + assertThat(normalChildren(TestUtils.findByName(nodes, T3_NAME))).isEmpty(); + } + + @Test + public void testListChildLevel2Excluded() { + Consumer<AbstractT> addBee = t -> t.addBee(createB(t.getName() + B_NAME)); + TRoot root = createTRoot(createA(A_NAME), createT1(addBee), createT2(addBee), createT3(addBee)); + Assertions.assertEquals(T2_NAME + B_NAME, root.getT2().getBee(0).getName()); + + List<DumpNode> nodes = TestUtils.dumpModel(root, + dp -> dp.excludeChildren("Bee")); assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); + for (String name : Tx_NAMES) { + assertThat(listChildren(TestUtils.findByName(nodes, name))).isEmpty(); + } + } + + @Test + public void testListChildLevel3SomeIncluded() { + Consumer<AbstractT> addBee = t -> t.addBee(createB(t.getName() + B_NAME)); + TRoot root = createTRoot(createA(A_NAME), createT1(addBee), createT2(addBee), createT3(addBee)); + Assertions.assertEquals(T2_NAME + B_NAME, root.getT2().getBee(0).getName()); + + List<DumpNode> nodes = TestUtils.dumpModel(root, + dp -> dp.excludeChildren("Bee") + .includeChildrenFor("T2", "Bee")); + assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME, T2_NAME + B_NAME); assertThat(listChildren(TestUtils.findByName(nodes, T1_NAME))).isEmpty(); - assertThatMapOf(listChildren(TestUtils.findByName(nodes, T2_NAME)), "B").containsExactly( + assertThatMapOf(listChildren(TestUtils.findByName(nodes, T2_NAME)), "Bee").containsOnly( T2_NAME + B_NAME); assertThat(listChildren(TestUtils.findByName(nodes, T3_NAME))).isEmpty(); } @@ -123,7 +153,7 @@ public class TestTypeLevel3 { .includeRelationsFor("T2", "OneA")); assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); assertThat(normalRelationChildren(TestUtils.findByName(nodes, T1_NAME))).isEmpty(); - assertThatMapOf(normalRelationChildren(TestUtils.findByName(nodes, T2_NAME))).containsExactly( + assertThatMapOf(normalRelationChildren(TestUtils.findByName(nodes, T2_NAME))).containsOnly( tuple("OneA", A_NAME)); assertThat(normalRelationChildren(TestUtils.findByName(nodes, T3_NAME))).isEmpty(); } @@ -137,7 +167,10 @@ public class TestTypeLevel3 { assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); for (String name : Tx_NAMES) { DumpNode actualTx = findByName(nodes, name); - assertThat(valueTokens(actualTx)).containsExactly(entry("Name", name), entry("simpleAttr", 43)); + assertThat(valueTokens(actualTx)).containsOnly( + entry("Name", name), + entry(TOKEN_LABEL_UNWANTED, 0), + entry("simpleAttr", 43)); } } @@ -149,12 +182,12 @@ public class TestTypeLevel3 { dp -> dp.includeAttributes("simpleAttr") .excludeAttributesFor("T2", "simpleAttr")); assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); - assertThat(valueTokens(findByName(nodes, T1_NAME))).containsExactly( - entry("Name", T1_NAME), entry("simpleAttr", 43)); - assertThat(valueTokens(findByName(nodes, T2_NAME))).containsExactly( - entry("Name", T2_NAME)); - assertThat(valueTokens(findByName(nodes, T3_NAME))).containsExactly( - entry("Name", T3_NAME), entry("simpleAttr", 43)); + assertThat(valueTokens(findByName(nodes, T1_NAME))).containsOnly( + entry("Name", T1_NAME), entry(TOKEN_LABEL_UNWANTED, 0), entry("simpleAttr", 43)); + assertThat(valueTokens(findByName(nodes, T2_NAME))).containsOnly( + entry("Name", T2_NAME), entry(TOKEN_LABEL_UNWANTED, 0)); + assertThat(valueTokens(findByName(nodes, T3_NAME))).containsOnly( + entry("Name", T3_NAME), entry(TOKEN_LABEL_UNWANTED, 0), entry("simpleAttr", 43)); } @Test @@ -166,7 +199,7 @@ public class TestTypeLevel3 { assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME, "Calculated-" + T1_NAME, "Calculated-" + T2_NAME, "Calculated-" + T3_NAME); for (String name : Tx_NAMES) { assertThatMapOf(normalChildren(findByName(nodes, name))).containsOnly( - tuple("Calculated", "Calculated-" + T3_NAME)); + tuple("Calculated", "Calculated-" + name)); } } diff --git a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestTypeLevel4.java b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestTypeLevel4.java index 95679b86aa37af97c200bc0f4bb959de28d1e558..489a296a2777cca1c42dda7a391ae5921ea939df 100644 --- a/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestTypeLevel4.java +++ b/testDumper/src/test/java/de/tudresden/inf/st/jastadd/testDumper/TestTypeLevel4.java @@ -38,7 +38,7 @@ public class TestTypeLevel4 { DumpNode actualTx = findByName(nodes, name); assertThat(valueTokens(actualTx)).containsOnly(entry("Name", name), entry(TOKEN_LABEL_UNWANTED, 5)); } - assertThat(valueTokens(findByName(nodes, C_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodes, C_NAME))).containsOnly( entry("Name", C_NAME)); } @@ -55,13 +55,13 @@ public class TestTypeLevel4 { .excludeTokensFor("T3", TOKEN_LABEL_UNWANTED)); assertThat(nodesT2).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder( ROOT_NAME, A_NAME, C_NAME, T1_NAME, T2_NAME, T3_NAME); - assertThat(valueTokens(findByName(nodesT2, T1_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodesT2, T1_NAME))).containsOnly( entry("Name", T1_NAME), entry(TOKEN_LABEL_UNWANTED, 5)); - assertThat(valueTokens(findByName(nodesT2, T2_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodesT2, T2_NAME))).containsOnly( entry("Name", T2_NAME), entry(TOKEN_LABEL_UNWANTED, 5)); - assertThat(valueTokens(findByName(nodesT2, T3_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodesT2, T3_NAME))).containsOnly( entry("Name", T3_NAME)); - assertThat(valueTokens(findByName(nodesT2, C_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodesT2, C_NAME))).containsOnly( entry("Name", C_NAME)); List<DumpNode> nodesT2T3 = dumpModel(root, @@ -70,18 +70,18 @@ public class TestTypeLevel4 { .excludeTokensFor("T2|T3", TOKEN_LABEL_UNWANTED)); assertThat(nodesT2T3).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder( ROOT_NAME, A_NAME, C_NAME, T1_NAME, T2_NAME, T3_NAME); - assertThat(valueTokens(findByName(nodesT2T3, T1_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodesT2T3, T1_NAME))).containsOnly( entry("Name", T1_NAME), entry(TOKEN_LABEL_UNWANTED, 5)); - assertThat(valueTokens(findByName(nodesT2T3, T2_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodesT2T3, T2_NAME))).containsOnly( entry("Name", T2_NAME)); - assertThat(valueTokens(findByName(nodesT2T3, T3_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodesT2T3, T3_NAME))).containsOnly( entry("Name", T3_NAME)); - assertThat(valueTokens(findByName(nodesT2T3, C_NAME))).containsExactly( + assertThat(valueTokens(findByName(nodesT2T3, C_NAME))).containsOnly( entry("Name", C_NAME)); } @Test - public void testChildLevel3Included() { + public void testNormalChildLevel3Included() { Consumer<AbstractT> setB = t -> t.setB(createB(t.getName() + B_NAME)); TRoot root = createTRoot(createA(A_NAME), createT1(setB), createT2(setB), createT3(setB)); Assertions.assertEquals(T2_NAME + B_NAME, root.getT2().getB().getName()); @@ -91,13 +91,13 @@ public class TestTypeLevel4 { .includeChildrenFor("T.", "B")); assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME, T1_NAME + B_NAME, T2_NAME + B_NAME, T3_NAME + B_NAME); for (String name : Tx_NAMES) { - assertThatMapOf(listChildren(findByName(nodes, name)), "B").containsExactly( - name + B_NAME); + assertThatMapOf(normalChildren(findByName(nodes, name))).containsOnly( + tuple("B", name + B_NAME)); } } @Test - public void testChildLevel4SomeExcluded() { + public void testNormalChildLevel4SomeExcluded() { Consumer<AbstractT> setB = t -> t.setB(createB(t.getName() + B_NAME)); TRoot root = createTRoot(createA(A_NAME), createT1(setB), createT2(setB), createT3(setB)); Assertions.assertEquals(T2_NAME + B_NAME, root.getT2().getB().getName()); @@ -107,9 +107,43 @@ public class TestTypeLevel4 { .includeChildrenFor("T.", "B") .excludeChildrenFor("T3", "B")); assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME, T1_NAME + B_NAME, T2_NAME + B_NAME); - assertThatMapOf(listChildren(findByName(nodes, T1_NAME)), "B").containsExactly( + assertThatMapOf(normalChildren(findByName(nodes, T1_NAME))).containsOnly( + tuple("B", T1_NAME + B_NAME)); + assertThatMapOf(normalChildren(findByName(nodes, T2_NAME))).containsOnly( + tuple("B", T2_NAME + B_NAME)); + assertThat(normalChildren(findByName(nodes, T3_NAME))).isEmpty(); + } + + @Test + public void testListChildLevel3Included() { + Consumer<AbstractT> addBee = t -> t.addBee(createB(t.getName() + B_NAME)); + TRoot root = createTRoot(createA(A_NAME), createT1(addBee), createT2(addBee), createT3(addBee)); + Assertions.assertEquals(T3_NAME + B_NAME, root.getT3().getBee(0).getName()); + + List<DumpNode> nodes = dumpModel(root, + dp -> dp.excludeChildren("Bee") + .includeChildrenFor("T.", "Bee")); + assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME, T1_NAME + B_NAME, T2_NAME + B_NAME, T3_NAME + B_NAME); + for (String name : Tx_NAMES) { + assertThatMapOf(listChildren(findByName(nodes, name)), "Bee").containsOnly( + name + B_NAME); + } + } + + @Test + public void testListChildLevel4SomeExcluded() { + Consumer<AbstractT> addBee = t -> t.addBee(createB(t.getName() + B_NAME)); + TRoot root = createTRoot(createA(A_NAME), createT1(addBee), createT2(addBee), createT3(addBee)); + Assertions.assertEquals(T3_NAME + B_NAME, root.getT3().getBee(0).getName()); + + List<DumpNode> nodes = dumpModel(root, + dp -> dp.excludeChildren("Bee") + .includeChildrenFor("T.", "Bee") + .excludeChildrenFor("T3", "Bee")); + assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME, T1_NAME + B_NAME, T2_NAME + B_NAME); + assertThatMapOf(listChildren(findByName(nodes, T1_NAME)), "Bee").containsOnly( T1_NAME + B_NAME); - assertThatMapOf(listChildren(findByName(nodes, T2_NAME)), "B").containsExactly( + assertThatMapOf(listChildren(findByName(nodes, T2_NAME)), "Bee").containsOnly( T2_NAME + B_NAME); assertThat(listChildren(findByName(nodes, T3_NAME))).isEmpty(); } @@ -126,7 +160,7 @@ public class TestTypeLevel4 { .includeRelationsFor("T2", "OneA")); assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); assertThat(normalRelationChildren(findByName(nodes, T1_NAME))).isEmpty(); - assertThatMapOf(normalRelationChildren(findByName(nodes, T2_NAME))).containsExactly( + assertThatMapOf(normalRelationChildren(findByName(nodes, T2_NAME))).containsOnly( tuple("OneA", A_NAME)); assertThat(normalRelationChildren(findByName(nodes, T3_NAME))).isEmpty(); } @@ -143,9 +177,9 @@ public class TestTypeLevel4 { .includeRelationsFor("T.", "OneA") .excludeRelationsFor("T3", "OneA")); assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); - assertThatMapOf(normalRelationChildren(findByName(nodes, T1_NAME))).containsExactly( + assertThatMapOf(normalRelationChildren(findByName(nodes, T1_NAME))).containsOnly( tuple("OneA", A_NAME)); - assertThatMapOf(normalRelationChildren(findByName(nodes, T2_NAME))).containsExactly( + assertThatMapOf(normalRelationChildren(findByName(nodes, T2_NAME))).containsOnly( tuple("OneA", A_NAME)); assertThat(normalRelationChildren(findByName(nodes, T3_NAME))).isEmpty(); } @@ -160,7 +194,8 @@ public class TestTypeLevel4 { assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); for (String name : Tx_NAMES) { DumpNode actualTx = TestUtils.findByName(nodes, name); - assertThat(valueTokens(actualTx)).containsExactly(entry("Name", name)); + assertThat(valueTokens(actualTx)).containsOnly( + entry("Name", name), entry(TOKEN_LABEL_UNWANTED, 0)); } } @@ -173,12 +208,12 @@ public class TestTypeLevel4 { .excludeAttributesFor("T.", "simpleAttr") .includeAttributesFor("T3", "simpleAttr")); assertThat(nodes).flatExtracting(NAME_EXTRACTOR).containsExactlyInAnyOrder(ROOT_NAME, A_NAME, T1_NAME, T2_NAME, T3_NAME); - assertThat(valueTokens(TestUtils.findByName(nodes, T1_NAME))).containsExactly( - entry("Name", T1_NAME)); - assertThat(valueTokens(TestUtils.findByName(nodes, T2_NAME))).containsExactly( - entry("Name", T2_NAME)); - assertThat(valueTokens(TestUtils.findByName(nodes, T3_NAME))).containsExactly( - entry("Name", T3_NAME), entry("simpleAttr", 43)); + assertThat(valueTokens(TestUtils.findByName(nodes, T1_NAME))).containsOnly( + entry("Name", T1_NAME), entry(TOKEN_LABEL_UNWANTED, 0)); + assertThat(valueTokens(TestUtils.findByName(nodes, T2_NAME))).containsOnly( + entry("Name", T2_NAME), entry(TOKEN_LABEL_UNWANTED, 0)); + assertThat(valueTokens(TestUtils.findByName(nodes, T3_NAME))).containsOnly( + entry("Name", T3_NAME), entry(TOKEN_LABEL_UNWANTED, 0), entry("simpleAttr", 43)); } @Test