From 3d3b82331bec86e0f31e37bbbf8d9927e3a62d18 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Mon, 29 Jul 2024 17:05:38 +0200 Subject: [PATCH] tests with multiple common friends --- .../arebac/data/graph_pattern/GPGraph.java | 5 +- .../MultipleCommonFriendsWeavingTest.java | 89 +++++++++++++++++++ .../MultiplePatternsReturnSameNodeTest.java | 35 ++++++++ 3 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 src/test/java/io/github/danthe1st/arebac/tests/weaving/MultipleCommonFriendsWeavingTest.java create mode 100644 src/test/java/io/github/danthe1st/arebac/tests/weaving/MultiplePatternsReturnSameNodeTest.java diff --git a/src/main/java/io/github/danthe1st/arebac/data/graph_pattern/GPGraph.java b/src/main/java/io/github/danthe1st/arebac/data/graph_pattern/GPGraph.java index 5427787..82cafcf 100644 --- a/src/main/java/io/github/danthe1st/arebac/data/graph_pattern/GPGraph.java +++ b/src/main/java/io/github/danthe1st/arebac/data/graph_pattern/GPGraph.java @@ -1,5 +1,6 @@ package io.github.danthe1st.arebac.data.graph_pattern; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -22,8 +23,8 @@ public record GPGraph(Map nodes, public GPGraph(List nodes, List edges) { this( nodes.stream().collect(Collectors.toMap(GPNode::id, Function.identity())), - edges.stream().collect(Collectors.groupingBy(GPEdge::source)), - edges.stream().collect(Collectors.groupingBy(GPEdge::target)) + edges.stream().collect(Collectors.groupingBy(GPEdge::source, LinkedHashMap::new, Collectors.toList())), + edges.stream().collect(Collectors.groupingBy(GPEdge::target, LinkedHashMap::new, Collectors.toList())) ); } diff --git a/src/test/java/io/github/danthe1st/arebac/tests/weaving/MultipleCommonFriendsWeavingTest.java b/src/test/java/io/github/danthe1st/arebac/tests/weaving/MultipleCommonFriendsWeavingTest.java new file mode 100644 index 0000000..785bf9c --- /dev/null +++ b/src/test/java/io/github/danthe1st/arebac/tests/weaving/MultipleCommonFriendsWeavingTest.java @@ -0,0 +1,89 @@ +package io.github.danthe1st.arebac.tests.weaving; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; +import java.util.Map; + +import io.github.danthe1st.arebac.data.graph_pattern.GPEdge; +import io.github.danthe1st.arebac.data.graph_pattern.GPGraph; +import io.github.danthe1st.arebac.data.graph_pattern.GPNode; +import io.github.danthe1st.arebac.data.graph_pattern.GraphPattern; +import io.github.danthe1st.arebac.data.graph_pattern.constraints.MutualExclusionConstraint; +import io.github.danthe1st.arebac.weaving.Weaving; +import org.junit.jupiter.api.Test; + +class MultipleCommonFriendsWeavingTest { + private static final String FRIEND_EDGE_TYPE = "friend"; + private static final String USER_NODE_TYPE = "user"; + + @Test + void testCombineFriendsOfFriendsWithNotSelf() { + GraphPattern combined = Weaving.combinePatterns(List.of(createCommonFriendsPattern(), createRequestorNotTargetPattern())); + assertEquals(createExpectedCombinedFriendsOfFriendsButNotSelfPattern(), combined); + } + + private GraphPattern createExpectedCombinedFriendsOfFriendsButNotSelfPattern() { + GPNode requestor = new GPNode("p0,requestor", USER_NODE_TYPE); + GPNode target = new GPNode("p0,target", USER_NODE_TYPE); + GPNode firstFriend = new GPNode("p0,f1", USER_NODE_TYPE); + GPNode secondFriend = new GPNode("p0,f2", USER_NODE_TYPE); + + return new GraphPattern( + new GPGraph( + List.of(requestor, target, firstFriend, secondFriend), + List.of( + new GPEdge(requestor, firstFriend, "p0,req->f1", FRIEND_EDGE_TYPE), + new GPEdge(requestor, secondFriend, "p0,req->f2", FRIEND_EDGE_TYPE), + new GPEdge(firstFriend, target, "p0,f1->target", FRIEND_EDGE_TYPE), + new GPEdge(secondFriend, target, "p0,f2->target", FRIEND_EDGE_TYPE) + ) + ), + List.of( + new MutualExclusionConstraint(firstFriend, secondFriend), + new MutualExclusionConstraint(requestor, target) + ), + Map.of(), + Map.of(), + List.of(target), + Map.of("requestor", requestor, "target", target) + ); + } + + private GraphPattern createRequestorNotTargetPattern() { + GPNode requestor = new GPNode("requestor", USER_NODE_TYPE); + GPNode target = new GPNode("target", USER_NODE_TYPE); + + return new GraphPattern( + new GPGraph(List.of(requestor, target), List.of()), + List.of(new MutualExclusionConstraint(requestor, target)), + Map.of(), + Map.of(), + List.of(), + Map.of("requestor", requestor, "target", target) + ); + } + + private GraphPattern createCommonFriendsPattern() { + GPNode requestor = new GPNode("requestor", USER_NODE_TYPE); + GPNode target = new GPNode("target", USER_NODE_TYPE); + GPNode firstFriend = new GPNode("f1", USER_NODE_TYPE); + GPNode secondFriend = new GPNode("f2", USER_NODE_TYPE); + + return new GraphPattern( + new GPGraph( + List.of(requestor, target, firstFriend, secondFriend), + List.of( + new GPEdge(requestor, firstFriend, "req->f1", FRIEND_EDGE_TYPE), + new GPEdge(requestor, secondFriend, "req->f2", FRIEND_EDGE_TYPE), + new GPEdge(firstFriend, target, "f1->target", FRIEND_EDGE_TYPE), + new GPEdge(secondFriend, target, "f2->target", FRIEND_EDGE_TYPE) + ) + ), List.of(new MutualExclusionConstraint(firstFriend, secondFriend)), + Map.of(), + Map.of(), + List.of(target), + Map.of("requestor", requestor, "target", target) + ); + } +} diff --git a/src/test/java/io/github/danthe1st/arebac/tests/weaving/MultiplePatternsReturnSameNodeTest.java b/src/test/java/io/github/danthe1st/arebac/tests/weaving/MultiplePatternsReturnSameNodeTest.java new file mode 100644 index 0000000..385519a --- /dev/null +++ b/src/test/java/io/github/danthe1st/arebac/tests/weaving/MultiplePatternsReturnSameNodeTest.java @@ -0,0 +1,35 @@ +package io.github.danthe1st.arebac.tests.weaving; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; +import java.util.Map; + +import io.github.danthe1st.arebac.data.graph_pattern.GPGraph; +import io.github.danthe1st.arebac.data.graph_pattern.GPNode; +import io.github.danthe1st.arebac.data.graph_pattern.GraphPattern; +import io.github.danthe1st.arebac.weaving.Weaving; +import org.junit.jupiter.api.Test; + +class MultiplePatternsReturnSameNodeTest { + @Test + void testMeregPatternsReturnSameResult() { + GPNode singleNode = new GPNode("someNode", "user"); + GraphPattern simplePattern = new GraphPattern( + new GPGraph(List.of(singleNode), List.of()), + List.of(), Map.of(), Map.of(), + List.of(singleNode), + Map.of("relevantNode", singleNode) + ); + GraphPattern combinedWithItself = Weaving.combinePatterns(List.of(simplePattern, simplePattern)); + + GPNode nodeInResult = new GPNode("p0,someNode", "user"); + GraphPattern expectedPattern = new GraphPattern( + new GPGraph(List.of(nodeInResult), List.of()), + List.of(), Map.of(), Map.of(), + List.of(nodeInResult, nodeInResult), + Map.of("relevantNode", nodeInResult) + ); + assertEquals(expectedPattern, combinedWithItself); + } +}