Skip to content

Commit 3b6f6d7

Browse files
committed
Add direction command
1 parent 31b9ded commit 3b6f6d7

File tree

6 files changed

+179
-0
lines changed

6 files changed

+179
-0
lines changed

docs/commands.md

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ Following the PlantUML source code.
3131
| endlegend | no | |
3232
| skinparam \<NAME> \<VALUE> | yes | `SkinParam` |
3333
| skinparam \<PREFIX> { | no | |
34+
| left to right direction | yes | `Direction` |
35+
| top to bottom direction | yes | `Direction` |
3436

3537
## Activity Diagrams
3638

src/PlantUml.Builder/Constant.cs

+6
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,12 @@ public static class Words
6464
public const string Alt = "alt";
6565
public const string As = "as";
6666
public const string Auto = "auto";
67+
public const string Bottom = "bottom";
6768
public const string Box = "box";
6869
public const string Create = "create";
6970
public const string Deactivate = "deactivate";
7071
public const string Destroy = "destroy";
72+
public const string Direction = "direction";
7173
public const string Else = "else";
7274
public const string Empty = "empty";
7375
public const string End = "end";
@@ -79,6 +81,7 @@ public static class Words
7981
public const string Hide = "hide";
8082
public const string Implements = "implements";
8183
public const string Increase = "inc";
84+
public const string Left = "left";
8285
public const string Loop = "loop";
8386
public const string Map = "map";
8487
public const string Mixing = "mixing";
@@ -96,6 +99,7 @@ public static class Words
9699
public const string Ref = "ref";
97100
public const string Resume = "resume";
98101
public const string Return = "return";
102+
public const string Right = "right";
99103
public const string Separator = "separator";
100104
public const string Set = "set";
101105
public const string Show = "show";
@@ -104,6 +108,8 @@ public static class Words
104108
public const string Static = "static";
105109
public const string Stop = "stop";
106110
public const string Title = "title";
111+
public const string To = "to";
112+
public const string Top = "top";
107113
public const string Unlinked = "unlinked";
108114
public const string Uml = "uml";
109115
}
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace PlantUml.Builder
2+
{
3+
/// <summary>
4+
/// Represents different directions of the UML diagram.
5+
/// </summary>
6+
public enum DiagramDirection
7+
: byte
8+
{
9+
/// <summary>
10+
/// Represents a left to right direction.
11+
/// </summary>
12+
LeftToRight = 0,
13+
14+
/// <summary>
15+
/// Represents a top to bottom direction.
16+
/// </summary>
17+
TopToBottom,
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
namespace PlantUml.Builder;
2+
3+
public static partial class StringBuilderExtensions
4+
{
5+
/// <summary>
6+
/// Set the direction of the diagram
7+
/// </summary>
8+
/// <exception cref="ArgumentNullException">Thrown when <paramref name="stringBuilder"/> is <see langword="null"/>.</exception>
9+
public static void Direction(this StringBuilder stringBuilder, DiagramDirection direction)
10+
{
11+
ArgumentNullException.ThrowIfNull(stringBuilder);
12+
if (!Enum.IsDefined(direction)) throw new ArgumentOutOfRangeException(nameof(direction), "A defined enum value should be provided");
13+
14+
switch (direction)
15+
{
16+
case DiagramDirection.LeftToRight:
17+
stringBuilder.Append(Constant.Words.Left);
18+
stringBuilder.Append(Constant.Symbols.Space);
19+
stringBuilder.Append(Constant.Words.To);
20+
stringBuilder.Append(Constant.Symbols.Space);
21+
stringBuilder.Append(Constant.Words.Right);
22+
break;
23+
24+
case DiagramDirection.TopToBottom:
25+
stringBuilder.Append(Constant.Words.Top);
26+
stringBuilder.Append(Constant.Symbols.Space);
27+
stringBuilder.Append(Constant.Words.To);
28+
stringBuilder.Append(Constant.Symbols.Space);
29+
stringBuilder.Append(Constant.Words.Bottom);
30+
break;
31+
}
32+
33+
stringBuilder.Append(Constant.Symbols.Space);
34+
stringBuilder.Append(Constant.Words.Direction);
35+
stringBuilder.AppendNewLine();
36+
}
37+
}

tests/PlantUml.Builder.Examples/ObjectDiagramExampleTests.cs

+80
Original file line numberDiff line numberDiff line change
@@ -405,4 +405,84 @@ object Baz
405405
// Assert
406406
stringBuilder.ToString().Should().Be(example.Replace("\r", ""));
407407
}
408+
409+
/// <seealso href="https://plantuml.com/object-diagram#d1f08bf69f3d9b45"/>
410+
[TestMethod]
411+
public void ProgramEvaluationAndReviewTechniqueWithMap()
412+
{
413+
// Arrange
414+
var example =
415+
"""
416+
@startuml PERT
417+
left to right direction
418+
' Horizontal lines: -->, <--, <-->
419+
' Vertical lines: ->, <-, <->
420+
title PERT: Project Name
421+
422+
map Kick.Off {
423+
}
424+
map task.1 {
425+
Start => End
426+
}
427+
map task.2 {
428+
Start => End
429+
}
430+
map task.3 {
431+
Start => End
432+
}
433+
map task.4 {
434+
Start => End
435+
}
436+
map task.5 {
437+
Start => End
438+
}
439+
Kick.Off --> task.1 : Label 1
440+
Kick.Off --> task.2 : Label 2
441+
Kick.Off --> task.3 : Label 3
442+
task.1 --> task.4
443+
task.2 --> task.4
444+
task.3 --> task.4
445+
task.4 --> task.5 : Label 4
446+
@enduml
447+
448+
""";
449+
450+
var stringBuilder = new StringBuilder();
451+
452+
// Act
453+
stringBuilder.UmlDiagramStart("PERT");
454+
stringBuilder.Direction(DiagramDirection.LeftToRight);
455+
stringBuilder.Comment("Horizontal lines: -->, <--, <-->");
456+
stringBuilder.Comment("Vertical lines: ->, <-, <->");
457+
stringBuilder.Title("PERT: Project Name");
458+
stringBuilder.AppendNewLine();
459+
stringBuilder.MapStart("Kick.Off");
460+
stringBuilder.MapEnd();
461+
stringBuilder.MapStart("task.1");
462+
stringBuilder.InlineClassMember("Start => End");
463+
stringBuilder.MapEnd();
464+
stringBuilder.MapStart("task.2");
465+
stringBuilder.InlineClassMember("Start => End");
466+
stringBuilder.MapEnd();
467+
stringBuilder.MapStart("task.3");
468+
stringBuilder.InlineClassMember("Start => End");
469+
stringBuilder.MapEnd();
470+
stringBuilder.MapStart("task.4");
471+
stringBuilder.InlineClassMember("Start => End");
472+
stringBuilder.MapEnd();
473+
stringBuilder.MapStart("task.5");
474+
stringBuilder.InlineClassMember("Start => End");
475+
stringBuilder.MapEnd();
476+
stringBuilder.Relationship("Kick.Off", "-->", "task.1", "Label 1");
477+
stringBuilder.Relationship("Kick.Off", "-->", "task.2", "Label 2");
478+
stringBuilder.Relationship("Kick.Off", "-->", "task.3", "Label 3");
479+
stringBuilder.Relationship("task.1", "-->", "task.4");
480+
stringBuilder.Relationship("task.2", "-->", "task.4");
481+
stringBuilder.Relationship("task.3", "-->", "task.4");
482+
stringBuilder.Relationship("task.4", "-->", "task.5", "Label 4");
483+
stringBuilder.UmlDiagramEnd();
484+
485+
// Assert
486+
stringBuilder.ToString().Should().Be(example.Replace("\r", ""));
487+
}
408488
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
namespace PlantUml.Builder.Tests;
2+
3+
[TestClass]
4+
public class DirectionTests
5+
{
6+
[TestMethod]
7+
public void AutoActivateEnumerationValueShouldExist()
8+
{
9+
// Arrange
10+
var stringBuilder = new StringBuilder();
11+
12+
// Act
13+
Action action = () => stringBuilder.Direction((DiagramDirection)byte.MaxValue);
14+
15+
// Assert
16+
action.Should().ThrowExactly<ArgumentOutOfRangeException>()
17+
.WithMessage("A defined enum value should be provided*")
18+
.WithParameterName("direction");
19+
}
20+
21+
[DataRow(DiagramDirection.LeftToRight, "left to right direction", DisplayName = "Direction - With LeftToRight parameter")]
22+
[DataRow(DiagramDirection.TopToBottom, "top to bottom direction", DisplayName = "Direction - With TopToBottom parameter")]
23+
[TestMethod]
24+
public void AutoActivateIsRenderedCorrectly(DiagramDirection direction, string expected)
25+
{
26+
// Arrange
27+
var stringBuilder = new StringBuilder();
28+
29+
// Act
30+
stringBuilder.Direction(direction);
31+
32+
// Assert
33+
stringBuilder.ToString().Should().Be($"{expected}\n");
34+
}
35+
}

0 commit comments

Comments
 (0)