6 #include <gtest/gtest.h>
16 return haystack.find(needle) != std::string::npos;
19 TEST(GraphWriterTests, TestGraphElement)
28 EXPECT_EQ(graph.GetLabel(),
"Test");
29 EXPECT_TRUE(graph.HasLabel());
31 EXPECT_FALSE(graph.HasLabel());
32 EXPECT_EQ(graph.GetLabelOr(
"default"), std::string(
"default"));
35 graph.AppendToLabel(
"Text");
36 EXPECT_EQ(graph.GetLabel(),
"Text");
37 graph.AppendToLabel(
"Text2",
"\n");
38 EXPECT_EQ(graph.GetLabel(),
"Text\nText2");
42 graph.SetProgramObject(myInt);
43 EXPECT_EQ(graph.GetProgramObject(),
reinterpret_cast<uintptr_t
>(&myInt));
46 graph.SetAttribute(
"color",
"\"dark\nbrown\"");
47 graph.SetAttribute(
"taste",
"sweet");
48 graph.SetAttributeGraphElement(
"graph", graph);
49 graph.SetAttributeObject(
"another graph", myInt);
52 EXPECT_TRUE(graph.HasAttribute(
"taste"));
53 EXPECT_EQ(graph.GetAttributeString(
"taste"),
"sweet");
54 EXPECT_FALSE(graph.GetAttributeString(
"not-an-attribute"));
55 EXPECT_EQ(graph.GetAttributeGraphElement(
"graph"), &graph);
56 EXPECT_EQ(graph.GetAttributeObject(
"another graph"),
reinterpret_cast<uintptr_t
>(&myInt));
58 EXPECT_EQ(graph.GetAttributeGraphElement(
"another graph"), &graph);
61 EXPECT_TRUE(graph.RemoveAttribute(
"taste"));
62 EXPECT_FALSE(graph.HasAttribute(
"taste"));
64 EXPECT_FALSE(graph.RemoveAttribute(
"taste"));
67 EXPECT_FALSE(graph.IsFinalized());
69 EXPECT_TRUE(graph.IsFinalized());
70 EXPECT_EQ(graph.GetUniqueIdSuffix(), 0u);
71 EXPECT_EQ(graph.GetFullId(),
"graph0");
74 std::ostringstream out;
76 auto attributes = out.str();
77 EXPECT_TRUE(
StringContains(attributes,
"color=\"\\\"dark\\nbrown\\\"\""));
79 EXPECT_TRUE(
StringContains(attributes,
"\"another graph\"=graph0"));
82 out = std::ostringstream();
84 attributes = out.str();
85 EXPECT_TRUE(
StringContains(attributes,
"color=\""dark\nbrown"\""));
86 EXPECT_TRUE(
StringContains(attributes,
"another-graph=\"graph0\""));
89 TEST(GraphWriterTests, TestNode)
97 EXPECT_EQ(&node.GetNode(), &node);
98 EXPECT_EQ(&node.GetGraph(), &graph);
100 node.SetLabel(
"MyNode");
103 EXPECT_TRUE(node.HasAttribute(
"shape"));
108 std::ostringstream out;
109 node.OutputASCII(out, 0);
110 auto string = out.str();
114 std::ostringstream out2;
115 node.OutputDot(out2, 0);
116 auto string2 = out2.str();
121 std::ostringstream jsonOut;
122 node.outputJson(jsonOut, 0);
123 auto jsonString = jsonOut.str();
125 EXPECT_TRUE(
StringContains(jsonString,
"\"attr\": {\"shape\":\"rect\"}"));
128 TEST(GraphWriterTests, TestASCIIEdges)
136 auto & node1 = graph.CreateNode();
137 auto & node2 = graph.CreateNode();
140 node1.SetLabel(
"NODE1");
141 node2.SetLabel(
"NODE2");
143 graph.CreateDirectedEdge(node0, node1);
144 graph.CreateDirectedEdge(node0, node2);
145 graph.CreateDirectedEdge(node1, node2);
149 std::ostringstream out;
150 node0.OutputASCII(out, 0);
151 node1.OutputASCII(out, 0);
152 node2.OutputASCII(out, 0);
154 auto string = out.str();
160 TEST(GraphWriterTests, TestInOutNode)
168 EXPECT_EQ(node.NumInputPorts(), 2u);
169 EXPECT_EQ(node.NumOutputPorts(), 3u);
171 node.SetLabel(
"My\nInOutNode");
173 graph.CreateDirectedEdge(node.GetOutputPort(2), node.GetInputPort(0));
176 auto & subgraph = node.CreateSubgraph();
177 EXPECT_EQ(node.NumSubgraphs(), 1u);
178 EXPECT_EQ(&node.GetSubgraph(0), &subgraph);
179 auto & argumentNode = subgraph.CreateArgumentNode();
180 argumentNode.SetLabel(
"CTX");
181 argumentNode.SetOutsideSource(node.GetInputPort(0));
182 auto & resultNode = subgraph.CreateResultNode();
183 resultNode.SetLabel(
"RETURN");
184 resultNode.SetOutsideDestination(node.GetOutputPort(0));
186 subgraph.CreateDirectedEdge(argumentNode, resultNode);
190 EXPECT_TRUE(node.IsFinalized());
191 EXPECT_TRUE(subgraph.IsFinalized());
193 std::ostringstream out;
194 node.OutputASCII(out, 0);
195 auto string = out.str();
196 EXPECT_TRUE(
StringContains(
string,
"out0, out1, out2 := \"My\\nInOutNode\" out2, []"));
203 std::ostringstream out2;
204 node.OutputDot(out2, 0);
205 auto string0 = out2.str();
209 std::ostringstream jsonOut;
210 node.outputJson(jsonOut, 0);
211 auto jsonString = jsonOut.str();
212 EXPECT_TRUE(
StringContains(jsonString,
"\"label\": \"My\\nInOutNode\""));
215 EXPECT_TRUE(
StringContains(jsonString,
strfmt(
'"', node.GetInputPort(0).GetFullId(),
"\": {")));
216 EXPECT_TRUE(
StringContains(jsonString,
strfmt(
'"', node.GetInputPort(1).GetFullId(),
"\": {")));
217 EXPECT_TRUE(
StringContains(jsonString,
strfmt(
'"', node.GetOutputPort(0).GetFullId(),
"\": {")));
218 EXPECT_TRUE(
StringContains(jsonString,
strfmt(
'"', node.GetOutputPort(1).GetFullId(),
"\": {")));
219 EXPECT_TRUE(
StringContains(jsonString,
strfmt(
'"', node.GetOutputPort(2).GetFullId(),
"\": {")));
225 TEST(GraphWriterTests, TestEdge)
233 auto & node1 = graph.CreateNode();
234 auto & node2 = graph.CreateNode();
236 auto & edge0 = graph.CreateDirectedEdge(node0, node1);
237 auto & edge1 = graph.CreateUndirectedEdge(node1, node2);
239 EXPECT_EQ(&edge0.GetFrom(), &node0);
240 EXPECT_EQ(&edge0.GetTo(), &node1);
241 EXPECT_TRUE(edge0.IsDirected());
242 EXPECT_EQ(&edge1.GetFrom(), &node1);
243 EXPECT_EQ(&edge1.GetTo(), &node2);
244 EXPECT_TRUE(!edge1.IsDirected());
246 EXPECT_EQ(&edge0.GetOtherEnd(node0), &node1);
247 EXPECT_EQ(&edge0.GetOtherEnd(node1), &node0);
249 EXPECT_EQ(graph.NumEdges(), 2u);
250 EXPECT_EQ(&graph.GetEdge(0), &edge0);
252 EXPECT_EQ(graph.GetEdgeBetween(node0, node1), &edge0);
253 EXPECT_EQ(graph.GetEdgeBetween(node1, node2), &edge1);
254 EXPECT_EQ(graph.GetEdgeBetween(node2, node0),
nullptr);
258 auto & edge2 = graph.CreateUndirectedEdge(node2, node0);
259 edge2.SetArrowHead(
"odot");
260 edge2.SetArrowTail(
"normal");
265 std::ostringstream out0;
266 edge0.OutputDot(out0, 0);
267 auto string0 = out0.str();
272 std::ostringstream out1;
273 edge1.OutputDot(out1, 0);
274 auto string1 = out1.str();
278 std::ostringstream out2;
279 edge2.OutputDot(out2, 0);
280 auto string2 = out2.str();
287 TEST(GraphWriterTests, TestGraphCreateNodes)
295 EXPECT_EQ(graph.NumNodes(), 0u);
296 auto & node = graph.CreateNode();
297 EXPECT_EQ(graph.NumNodes(), 1u);
298 EXPECT_EQ(&graph.GetNode(0), &node);
301 auto & inOutNode = graph.CreateInOutNode(1, 1);
302 EXPECT_EQ(graph.NumNodes(), 2u);
303 EXPECT_EQ(&graph.GetNode(1), &inOutNode);
306 EXPECT_EQ(graph.NumArgumentNodes(), 0u);
307 auto & argumentNode = graph.CreateArgumentNode();
308 EXPECT_EQ(graph.NumArgumentNodes(), 1u);
309 EXPECT_EQ(&graph.GetArgumentNode(0), &argumentNode);
312 EXPECT_EQ(graph.NumResultNodes(), 0u);
313 auto & resultNode = graph.CreateResultNode();
314 EXPECT_EQ(graph.NumResultNodes(), 1u);
315 EXPECT_EQ(&graph.GetResultNode(0), &resultNode);
319 EXPECT_TRUE(node.IsFinalized());
320 EXPECT_TRUE(argumentNode.IsFinalized());
321 EXPECT_TRUE(resultNode.IsFinalized());
322 EXPECT_TRUE(inOutNode.IsFinalized());
325 TEST(GraphWriterTests, TestGraphAttributes)
333 EXPECT_EQ(&graph.GetWriter(), &writer);
334 auto & node = graph.CreateNode();
338 node.SetProgramObject(myInt);
339 EXPECT_EQ(&graph.GetFromProgramObject<
Node>(myInt), &node);
342 graph.SetAttributeObject(
"friend", myInt);
343 graph.SetAttributeGraphElement(
"foe", graph);
348 std::ostringstream out;
350 auto string = out.str();
357 std::ostringstream jsonOut;
359 auto jsonString = jsonOut.str();
361 EXPECT_TRUE(
StringContains(jsonString,
"\"label\": \"My Graph\""));
370 TEST(GraphWriterTests, TestGraphWriterClass)
379 EXPECT_EQ(&writer.
GetGraph(0), &graph0);
381 auto & node0 = graph0.CreateNode();
382 auto & node1 = graph1.CreateNode();
386 node1.SetProgramObject(myInt);
390 node0.SetAttributeObject(
"friend", myInt);
393 std::ostringstream out;
395 auto string = out.str();
397 EXPECT_TRUE(graph0.IsFinalized());
398 EXPECT_TRUE(graph1.IsFinalized());
400 EXPECT_EQ(node0.GetFullId(),
"node0");
401 EXPECT_EQ(node1.GetFullId(),
"node1");
TEST(GraphWriterTests, TestGraphElement)
static bool StringContains(const std::string &haystack, const std::string &needle)
void SetLabel(std::string label)
InOutNode & CreateInOutNode(size_t inputPorts, size_t outputPorts)
GraphElement * GetElementFromProgramObject(uintptr_t object) const
size_t NumGraphs() const noexcept
void outputAllGraphs(std::ostream &out, OutputFormat format)
Graph & GetGraph(size_t index)
static std::string strfmt(Args... args)
static const char *const Tapered
static const char *const Rectangle