1+ #pragma once
2+
3+ #include < interval-tree/interval_tree.hpp>
4+ #include < interval-tree/dot_graph.hpp>
5+
6+ class DotDrawTests : public ::testing::Test
7+ {
8+ public:
9+
10+ protected:
11+ };
12+
13+ TEST_F (DotDrawTests, WillDrawEmptyTree)
14+ {
15+ lib_interval_tree::interval_tree_t <int > tree;
16+ std::stringstream ss;
17+ lib_interval_tree::draw_dot_graph (ss, tree);
18+ EXPECT_EQ (ss.str (), " digraph G {\n }" );
19+ }
20+
21+ TEST_F (DotDrawTests, DrawsSingleNode)
22+ {
23+ lib_interval_tree::interval_tree_t <int > tree;
24+ tree.insert ({0 , 10 });
25+ std::stringstream ss;
26+ lib_interval_tree::draw_dot_graph (ss, tree);
27+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0,10]\" ];\n }" );
28+ }
29+
30+ TEST_F (DotDrawTests, DrawsNodesWithEdge)
31+ {
32+ lib_interval_tree::interval_tree_t <int > tree;
33+ tree.insert ({0 , 10 });
34+ tree.insert ({10 , 20 });
35+ std::stringstream ss;
36+ lib_interval_tree::draw_dot_graph (ss, tree);
37+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0,10]\" ];\n\t b [label=\" [10,20]\" ];\n\t a -> b;\n }" );
38+ }
39+
40+ TEST_F (DotDrawTests, SpaceAfterCommaIsSetIfEnabled)
41+ {
42+ lib_interval_tree::interval_tree_t <int > tree;
43+ tree.insert ({0 , 10 });
44+ std::stringstream ss;
45+ lib_interval_tree::dot_graph_draw_settings settings;
46+ settings.space_after_comma = true ;
47+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
48+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0, 10]\" ];\n }" );
49+ }
50+
51+ TEST_F (DotDrawTests, GraphIsUndirectedIfSpecifiedAsSuch)
52+ {
53+ lib_interval_tree::interval_tree_t <int > tree;
54+ tree.insert ({0 , 10 });
55+ tree.insert ({10 , 20 });
56+ std::stringstream ss;
57+ lib_interval_tree::dot_graph_draw_settings settings;
58+ settings.digraph = false ;
59+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
60+ EXPECT_EQ (ss.str (), " graph G {\n\t a [label=\" [0,10]\" ];\n\t b [label=\" [10,20]\" ];\n\t a -- b;\n }" );
61+ }
62+
63+ TEST_F (DotDrawTests, CanSpecifyExtraNodeAttributes)
64+ {
65+ lib_interval_tree::interval_tree_t <int > tree;
66+ tree.insert ({0 , 10 });
67+ std::stringstream ss;
68+ lib_interval_tree::dot_graph_draw_settings settings;
69+ settings.extra_node_attributes = {" color=red" };
70+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
71+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0,10]\" , color=red];\n }" );
72+ }
73+
74+ TEST_F (DotDrawTests, GraphNameIsSet)
75+ {
76+ lib_interval_tree::interval_tree_t <int > tree;
77+ tree.insert ({0 , 10 });
78+ std::stringstream ss;
79+ lib_interval_tree::dot_graph_draw_settings settings;
80+ settings.name = " MyGraph" ;
81+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
82+ EXPECT_EQ (ss.str (), " digraph MyGraph {\n\t a [label=\" [0,10]\" ];\n }" );
83+ }
84+
85+ TEST_F (DotDrawTests, CanOverrideLeftBrace)
86+ {
87+ lib_interval_tree::interval_tree_t <int > tree;
88+ tree.insert ({0 , 10 });
89+ std::stringstream ss;
90+ lib_interval_tree::dot_graph_draw_settings settings;
91+ settings.left_brace = ' (' ;
92+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
93+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" (0,10]\" ];\n }" );
94+ }
95+
96+ TEST_F (DotDrawTests, CanOverrideRightBrace)
97+ {
98+ lib_interval_tree::interval_tree_t <int > tree;
99+ tree.insert ({0 , 10 });
100+ std::stringstream ss;
101+ lib_interval_tree::dot_graph_draw_settings settings;
102+ settings.right_brace = ' )' ;
103+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
104+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0,10)\" ];\n }" );
105+ }
106+
107+ TEST_F (DotDrawTests, CanSpecifyExtraStatements)
108+ {
109+ lib_interval_tree::interval_tree_t <int > tree;
110+ tree.insert ({0 , 10 });
111+ std::stringstream ss;
112+ lib_interval_tree::dot_graph_draw_settings settings;
113+ settings.extra_statements = {" rankdir=LR" };
114+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
115+ EXPECT_EQ (ss.str (), " digraph G {\n\t rankdir=LR;\n\t a [label=\" [0,10]\" ];\n }" );
116+ }
117+
118+ TEST_F (DotDrawTests, CanSpecifyExtraEdgeAttributes)
119+ {
120+ lib_interval_tree::interval_tree_t <int > tree;
121+ tree.insert ({0 , 10 });
122+ tree.insert ({10 , 20 });
123+ std::stringstream ss;
124+ lib_interval_tree::dot_graph_draw_settings settings;
125+ settings.edge_attributes = {" color=blue" };
126+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
127+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0,10]\" ];\n\t b [label=\" [10,20]\" ];\n\t a -> b [color=blue];\n }" );
128+ }
129+
130+ TEST_F (DotDrawTests, IndentIsSet)
131+ {
132+ lib_interval_tree::interval_tree_t <int > tree;
133+ tree.insert ({0 , 10 });
134+ std::stringstream ss;
135+ lib_interval_tree::dot_graph_draw_settings settings;
136+ settings.indent = " XXX" ;
137+ lib_interval_tree::draw_dot_graph (ss, tree, settings);
138+ EXPECT_EQ (ss.str (), " digraph G {\n XXXa [label=\" [0,10]\" ];\n }" );
139+ }
140+
141+ TEST_F (DotDrawTests, CanDrawTreeWithOpenIntervalType)
142+ {
143+ lib_interval_tree::interval_tree<lib_interval_tree::interval<int , lib_interval_tree::open>> tree;
144+ tree.insert ({0 , 10 });
145+ tree.insert ({10 , 20 });
146+ std::stringstream ss;
147+ lib_interval_tree::draw_dot_graph (ss, tree);
148+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" (0,10)\" ];\n\t b [label=\" (10,20)\" ];\n\t a -> b;\n }" );
149+ }
150+
151+ TEST_F (DotDrawTests, CanDrawTreeWithLeftOpenIntervalType)
152+ {
153+ lib_interval_tree::interval_tree<lib_interval_tree::interval<int , lib_interval_tree::left_open>> tree;
154+ tree.insert ({0 , 10 });
155+ tree.insert ({10 , 20 });
156+ std::stringstream ss;
157+ lib_interval_tree::draw_dot_graph (ss, tree);
158+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" (0,10]\" ];\n\t b [label=\" (10,20]\" ];\n\t a -> b;\n }" );
159+ }
160+
161+ TEST_F (DotDrawTests, CanDrawTreeWithRightOpenIntervalType)
162+ {
163+ lib_interval_tree::interval_tree<lib_interval_tree::interval<int , lib_interval_tree::right_open>> tree;
164+ tree.insert ({0 , 10 });
165+ tree.insert ({10 , 20 });
166+ std::stringstream ss;
167+ lib_interval_tree::draw_dot_graph (ss, tree);
168+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0,10)\" ];\n\t b [label=\" [10,20)\" ];\n\t a -> b;\n }" );
169+ }
170+
171+ TEST_F (DotDrawTests, CanDrawTreeWithClosedAdjacentIntervalType)
172+ {
173+ lib_interval_tree::interval_tree<lib_interval_tree::interval<int , lib_interval_tree::closed_adjacent>> tree;
174+ tree.insert ({0 , 10 });
175+ tree.insert ({10 , 20 });
176+ std::stringstream ss;
177+ lib_interval_tree::draw_dot_graph (ss, tree);
178+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0,10]\" ];\n\t b [label=\" [10,20]\" ];\n\t a -> b;\n }" );
179+ }
180+
181+ #if __cplusplus >= 201703L
182+ TEST_F (DotDrawTests, CanDrawTreeWithDynamicIntervalType)
183+ {
184+ lib_interval_tree::interval_tree<lib_interval_tree::interval<int , lib_interval_tree::dynamic>> tree;
185+ tree.insert ({0 , 10 , lib_interval_tree::interval_border::closed, lib_interval_tree::interval_border::open});
186+ tree.insert ({10 , 20 , lib_interval_tree::interval_border::open, lib_interval_tree::interval_border::closed_adjacent}
187+ );
188+ std::stringstream ss;
189+ lib_interval_tree::draw_dot_graph (ss, tree);
190+ EXPECT_EQ (ss.str (), " digraph G {\n\t a [label=\" [0,10)\" ];\n\t b [label=\" (10,20]\" ];\n\t a -> b;\n }" );
191+ }
192+ #endif
193+
194+ TEST_F (DotDrawTests, CanDrawLargerTree)
195+ {
196+ using namespace lib_interval_tree ;
197+ interval_tree_t <int > tree;
198+
199+ tree.insert (make_safe_interval<int >(21 , 16 )); // make_safe_interval swaps low and high if not in right order.
200+ tree.insert ({8 , 9 });
201+ tree.insert ({25 , 30 });
202+ tree.insert ({5 , 8 });
203+ tree.insert ({15 , 23 });
204+ tree.insert ({17 , 19 });
205+ tree.insert ({26 , 26 });
206+ tree.insert ({0 , 3 });
207+ tree.insert ({6 , 10 });
208+ tree.insert ({19 , 20 });
209+
210+ std::stringstream ss;
211+
212+ lib_interval_tree::dot_graph_draw_settings settings;
213+ settings.indent = " " ;
214+
215+ draw_dot_graph (ss, tree, settings);
216+ EXPECT_EQ (
217+ ss.str (),
218+ R"( digraph G {
219+ a [label="[16,21]"];
220+ b [label="[8,9]"];
221+ c [label="[5,8]"];
222+ d [label="[0,3]"];
223+ e [label="[6,10]"];
224+ f [label="[15,23]"];
225+ g [label="[25,30]"];
226+ h [label="[17,19]"];
227+ i [label="[19,20]"];
228+ j [label="[26,26]"];
229+ a -> b;
230+ b -> c;
231+ c -> d;
232+ c -> e;
233+ b -> f;
234+ a -> g;
235+ g -> h;
236+ h -> i;
237+ g -> j;
238+ })"
239+ );
240+ }
0 commit comments