diff --git a/CodeToXMI.sln.DotSettings.user b/CodeToXMI.sln.DotSettings.user index f74312a70119a758c55863fd7229eeafb0d33c38..e63276796f74fd719f9bdb12a5dd92323822f04c 100644 --- a/CodeToXMI.sln.DotSettings.user +++ b/CodeToXMI.sln.DotSettings.user @@ -2,9 +2,44 @@ <s:String x:Key="/Default/Environment/Hierarchy/Build/BuildTool/CustomBuildToolPath/@EntryValue">/usr/local/share/dotnet/sdk/7.0.404/MSBuild.dll</s:String> <s:Int64 x:Key="/Default/Environment/Hierarchy/Build/BuildTool/MsbuildVersion/@EntryValue">1114112</s:Int64> <s:String x:Key="/Default/Environment/Highlighting/HighlightingSourceSnapshotLocation/@EntryValue">/Users/jakubkonvicka/Library/Caches/JetBrains/Rider2023.3/resharper-host/temp/Rider/vAny/CoverageData/_CodeToXMI.401400098/Snapshot/snapshot.utdcvr</s:String> - <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ea6b864b_002D2fca_002D4192_002D9701_002D8b0ec6a1f0b5/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" IsActive="True" Name="ClassDiagramTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=1172169d_002D8cd5_002D4c97_002D94b5_002D78b35c14dd26/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #2" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions</TestId> + </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=33cb20c1_002D7095_002D4c53_002Daff8_002Dbc67f6869c16/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions</TestId> + </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=447f0ad2_002D3982_002D4c13_002D8562_002D18748dcc27d7/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #4" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions</TestId> + </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=89ec26b2_002Dc3eb_002D4d79_002D97c5_002D0b5722ace381/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #3" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions</TestId> + </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=9cd5065d_002Da7a4_002D4689_002Db1fe_002Df606c9e9e91d/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisions" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisions</TestId> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions</TestId> + </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=d5334459_002D70ab_002D4733_002D874a_002D3629f29a0297/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" IsActive="True" Name="BuildActivityDiagramWithDecisionsAndActions #5" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests</TestId> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ClassDiagramTests</TestId> + </TestAncestor> +</SessionState></s:String> + <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ea6b864b_002D2fca_002D4192_002D9701_002D8b0ec6a1f0b5/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" Name="ClassDiagramTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <TestAncestor> <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ClassDiagramTests</TestId> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildEmptyActivityDiagram</TestId> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithNActivity</TestId> + <TestId>NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisions</TestId> </TestAncestor> </SessionState></s:String> diff --git a/DiagramBuilder/Activity/Diagram/DecisionBuilder.cs b/DiagramBuilder/Activity/Diagram/DecisionBuilder.cs index bca28cc537ba95915e72df7345b925febb3a0ec8..2bba65347fb1a50ce6c4fff8bd9d42a798e98bee 100644 --- a/DiagramBuilder/Activity/Diagram/DecisionBuilder.cs +++ b/DiagramBuilder/Activity/Diagram/DecisionBuilder.cs @@ -14,13 +14,14 @@ namespace DiagramBuilder.Activity.Diagram private List<Dictionary<BranchType, XmiElement>> _lastAddedEdge { get; set; } = new(); private List<Dictionary<BranchType, XmiElement>> _loopElements { get; set; } = new(); private List<Dictionary<BranchType, XmiElement>> _lastAddedNode { get; set; } = new(); - + IDiagramBuilder _diagramBuilder { get; set; } private List<BranchType> _lastBranchTypeForDecision { get; set; } = new(); - + private long _actualDecisionId { get; set; } = 0; - public DecisionBuilder(string? name, XmiActivityDiagramUmlBuilder xmiActivityDiagramUmlBuilder, XmiElement trueBranchEdge, XmiElement lastAddedNode, IDiagramBuilder _diagramBuilder) + public DecisionBuilder(string? name, XmiActivityDiagramUmlBuilder xmiActivityDiagramUmlBuilder, + XmiElement trueBranchEdge, XmiElement lastAddedNode, IDiagramBuilder _diagramBuilder) { this._diagramBuilder = _diagramBuilder; _xmiActivityDiagramUmlBuilder = xmiActivityDiagramUmlBuilder; @@ -29,8 +30,8 @@ namespace DiagramBuilder.Activity.Diagram _lastBranchTypeForDecision.Add(BranchType.True); _lastAddedEdge[^1].Add(BranchType.True, trueBranchEdge); - _lastAddedEdge[^1].Add(BranchType.True, lastAddedNode); - _lastAddedEdge[^1].Add(BranchType.False, lastAddedNode); + _lastAddedNode[^1].Add(BranchType.True, lastAddedNode); + _lastAddedNode[^1].Add(BranchType.False, lastAddedNode); } public string? BuildDiagram() @@ -47,35 +48,39 @@ namespace DiagramBuilder.Activity.Diagram { node = _xmiActivityDiagramUmlBuilder.AddAction( _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode[^1][type]); + _lastAddedEdge[^1].Add(type, _xmiActivityDiagramUmlBuilder.LatestEdge); } else { node = _xmiActivityDiagramUmlBuilder.AddAction( - _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]); + _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, + new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]); } _lastAddedNode[^1][type] = node; return this; } - public IDecisionBuilder AddMerge(string? name) + public (IDecisionBuilder, IDiagramBuilder) AddMerge(string? name) { var mergeNode = _xmiActivityDiagramUmlBuilder.AddMerge( _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, _lastAddedNode[^1][BranchType.True], _lastAddedNode[^1][BranchType.False]); - _lastAddedEdge.Remove(_lastAddedEdge[^1]); - _lastAddedNode.Remove(_lastAddedNode[^1]); - + _lastAddedEdge.Remove(_lastAddedEdge.Last()); + _lastAddedNode.Remove(_lastAddedNode.Last()); + this._diagramBuilder.LastActivity = mergeNode; - + if (_lastAddedNode.Count == 0) - return this; - - _lastAddedNode[^1][_lastBranchTypeForDecision[^1]] = mergeNode; - _lastBranchTypeForDecision.RemoveAt(_lastBranchTypeForDecision.Count-1); - - return this; + { + return (null, this._diagramBuilder); + } + + _lastAddedNode.Last()[_lastBranchTypeForDecision.Last()] = mergeNode; + _lastBranchTypeForDecision.RemoveAt(_lastBranchTypeForDecision.Count - 1); + + return (this, null); } public IDecisionBuilder AddDecision(string name, string trueCondition, string falseCondition, BranchType type) @@ -84,17 +89,31 @@ namespace DiagramBuilder.Activity.Diagram _lastAddedEdge.Add(new Dictionary<BranchType, XmiElement>()); _lastAddedNode.Add(new Dictionary<BranchType, XmiElement>()); XmiElement node; - if (!_lastAddedNode[_lastAddedNode.Count-2].TryGetValue(type, out _)) + + if (_lastAddedNode.Count < 2) { node = _xmiActivityDiagramUmlBuilder.AddDecision( - _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode[_lastAddedNode.Count-2][type]); - _lastAddedEdge[^1][type] = _xmiActivityDiagramUmlBuilder.LatestEdge; + _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, + new List<XmiElement> { this._xmiActivityDiagramUmlBuilder.LatestEdge }, null, + this._diagramBuilder.LastActivity); + } else { - node = _xmiActivityDiagramUmlBuilder.AddDecision( - _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, - new List<XmiElement> { _lastAddedNode[_lastAddedNode.Count-2][type] }, null, _lastAddedNode[_lastAddedNode.Count-2][type]); + if (!_lastAddedNode[_lastAddedNode.Count - 2].TryGetValue(type, out _)) + { + node = _xmiActivityDiagramUmlBuilder.AddDecision( + _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, + _lastAddedNode[_lastAddedNode.Count - 2][type]); + _lastAddedEdge[^1][type] = _xmiActivityDiagramUmlBuilder.LatestEdge; + } + else + { + node = _xmiActivityDiagramUmlBuilder.AddDecision( + _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, + new List<XmiElement> { _lastAddedNode[_lastAddedNode.Count - 2][type] }, null, + _lastAddedNode[_lastAddedNode.Count - 2][type]); + } } node.Type = XmiType.UmlDecisionNode; @@ -104,8 +123,7 @@ namespace DiagramBuilder.Activity.Diagram } public IDecisionBuilder AddLoop(string name, string condition, BranchType type) - { - + { if (!_lastAddedEdge[^1].TryGetValue(type, out var edge)) { _lastAddedNode[^1][type] = _xmiActivityDiagramUmlBuilder.AddDecision( @@ -115,10 +133,11 @@ namespace DiagramBuilder.Activity.Diagram else { _lastAddedNode[^1][type] = _xmiActivityDiagramUmlBuilder.AddDecision( - _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]); + _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, + new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]); } - - + + _loopElements.Add(new Dictionary<BranchType, XmiElement>()); _loopElements[^1].Add(type, _lastAddedNode[^1][type]); return this; @@ -126,7 +145,8 @@ namespace DiagramBuilder.Activity.Diagram public IDecisionBuilder CloseLoop(string name, BranchType type) { - _xmiActivityDiagramUmlBuilder.AddDirectedEdge(_xmiActivityDiagramUmlBuilder.ActivityDiagram, _lastAddedNode[^1][type], + _xmiActivityDiagramUmlBuilder.AddDirectedEdge(_xmiActivityDiagramUmlBuilder.ActivityDiagram, + _lastAddedNode[^1][type], _loopElements[^1][type]); _lastAddedNode[^1][type] = _loopElements[^1][type]; _loopElements.Remove(_loopElements[^1]); @@ -139,4 +159,4 @@ namespace DiagramBuilder.Activity.Diagram return this._diagramBuilder; } } -} +} \ No newline at end of file diff --git a/DiagramBuilder/Activity/Interface/IDecisionBuilder.cs b/DiagramBuilder/Activity/Interface/IDecisionBuilder.cs index 65786551c597b058805c01678284926f455ed919..fff56319657c56be4e6cf60abc6c97542d21753d 100644 --- a/DiagramBuilder/Activity/Interface/IDecisionBuilder.cs +++ b/DiagramBuilder/Activity/Interface/IDecisionBuilder.cs @@ -5,7 +5,7 @@ namespace DiagramBuilder.Activity.Interface; public interface IDecisionBuilder { public IDecisionBuilder AddAction(string name, BranchType type); - public IDecisionBuilder AddMerge(string? name); + public (IDecisionBuilder, IDiagramBuilder) AddMerge(string? name); public IDecisionBuilder AddDecision(string name, string trueCondition, string falseCondition, BranchType type); public IDecisionBuilder AddLoop(string name, string condition, BranchType type); public IDecisionBuilder CloseLoop(string name, BranchType type); diff --git a/UnitTest/ActivityDiagramTests.cs b/UnitTest/ActivityDiagramTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..84d1292dce15ca57cac1591881444d43739ed850 --- /dev/null +++ b/UnitTest/ActivityDiagramTests.cs @@ -0,0 +1,297 @@ +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Schema; +using DiagramBuilder.Activity.Diagram.Enum; +using DiagramBuilder.Activity.Interface; +using DiagramBuilder.ConcreteCreator; + +namespace UnitTest; + +public class ActivityDiagramTests +{ + ActivityDiagramBuilderCreatorFactory ActivityDiagramBuilderCreatorFactory { get; set; } + IDiagramBuilder ActivityDiagramBuilder { get; set; } + + private string generatedFileName { get; set; } = string.Empty; + + static List<(string, string)> _errors = new List<(string, string)>(); + + [SetUp] + public void Setup() + { + RemoveGeneratedFile(); + ActivityDiagramBuilderCreatorFactory = new ActivityDiagramBuilderCreatorFactory(); + ActivityDiagramBuilder = ActivityDiagramBuilderCreatorFactory.FactoryMethod("Test"); + generatedFileName = $"ActivityDiagram-{DateTime.UtcNow.ToString("yyyy-M-d_hh-mm-ss")}.xml"; + } + + private void RemoveGeneratedFile() + { + if (File.Exists(generatedFileName)) + { + File.Delete(generatedFileName); + } + } + + [Test] + public void BuildEmptyActivityDiagram() + { + string xmi = ActivityDiagramBuilder.BuildDiagram(); + AssertCommonAssertions(xmi); + RemoveGeneratedFile(); + } + + [Test] + [TestCase(0)] + [TestCase(1)] + [TestCase(10)] + [TestCase(100)] + public void BuildActivityDiagramWithNActivity(int numberOfActivities) + { + for (int i = 0; i < numberOfActivities; i++) + { + ActivityDiagramBuilder = ActivityDiagramBuilder.AddAction($"Activity{i}"); + } + + string xmi = ActivityDiagramBuilder.BuildDiagram(); + AssertCommonAssertions(xmi); + //test if number of activitises added to xmi <node name="Activity + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(xmi); + XmlNodeList nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Activity')]"); + Assert.IsTrue(nodes.Count == numberOfActivities, + $"Number of activities added to XMI should be {numberOfActivities}"); + RemoveGeneratedFile(); + } + + [Test] + [TestCase(0)] + [TestCase(1)] + [TestCase(10)] + [TestCase(100)] + public void BuildActivityDiagramWithDecisions(int decisionCount) + { + if (decisionCount > 0) + { + IDecisionBuilder decisionBuilder; + decisionBuilder = ActivityDiagramBuilder.AddDecision($"Decision{0}", "Yes", "No"); + for (int i = 1; i < decisionCount; i++) + { + _ = decisionBuilder.AddDecision($"Decision{i}T", "Yes", "No", BranchType.True); + decisionBuilder = decisionBuilder.AddDecision($"Decision{i}F", "Yes", "No", BranchType.False); + } + + string xmi = ActivityDiagramBuilder.BuildDiagram(); + AssertCommonAssertions(xmi); + //test if number of decisions added to xmi <node name="Decision + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(xmi); + XmlNodeList nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Decision')]"); + Assert.IsTrue(nodes.Count == decisionCount * 2 - 1, + $"Number of decisions added to XMI should be {decisionCount * 2 - 1}"); + RemoveGeneratedFile(); + } + } + + [Test] + [TestCase(2, 1, true)] + [TestCase(10, 10, false)] + [TestCase(10, 10, true)] + [TestCase(0, 0, false)] + [TestCase(0, 0, true)] + [TestCase(0, 1, false)] + [TestCase(0, 1, true)] + [TestCase(1, 1, false)] + [TestCase(10, 10, false)] + [TestCase(10, 10, true)] + [TestCase(10, 0, false)] + [TestCase(10, 0, true)] + [TestCase(0, 10, false)] + [TestCase(0, 10, true)] + [TestCase(100, 100, false)] + [TestCase(100, 100, true)] + [TestCase(100, 0, false)] + [TestCase(100, 0, true)] + [TestCase(0, 100, false)] + [TestCase(0, 100, true)] + public void BuildActivityDiagramWithDecisionsAndActions(int decisionCount, int actionsCount, bool addMerge) + { + if (decisionCount > 0) + { + IDecisionBuilder decisionBuilder; + IDiagramBuilder diagramBuilder = null; + decisionBuilder = ActivityDiagramBuilder.AddDecision($"Decision{0}", "Yes", "No"); + for (int i = 0; i < decisionCount; i++) + { + //add actions + for (int j = 0; j < actionsCount; j++) + { + if (decisionBuilder != null) + { + var branchType = j % 2 == 0 ? BranchType.True : BranchType.False; + decisionBuilder = decisionBuilder.AddAction($"Activity{i}T{j}", branchType); + } + else if(diagramBuilder != null) + { + diagramBuilder = diagramBuilder.AddAction($"Activity{i}B{j}"); + } + } + + if (addMerge && decisionBuilder != null) + { + (decisionBuilder, diagramBuilder) = decisionBuilder.AddMerge($"Merge{i}"); + } + + if (i != 0) + { + //add decision + if (decisionBuilder != null) + { + var branchType = i % 2 == 0 ? BranchType.True : BranchType.False; + decisionBuilder = decisionBuilder.AddDecision($"Decision{i}T", "Yes", "No", branchType); + } + else if (diagramBuilder != null) + { + decisionBuilder = diagramBuilder.AddDecision($"Decision{i}B", "Yes", "No"); + } + } + + } + + + string xmi = ActivityDiagramBuilder.BuildDiagram(); + AssertCommonAssertions(xmi); + //test if number of decisions added to xmi <node name="Decision + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(xmi); + XmlNodeList nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Decision')]"); + Assert.IsTrue(nodes.Count == decisionCount, $"Number of decisions added to XMI should be {decisionCount}"); + //test if number of activitises added to xmi <node name="Activity + nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Activity')]"); + Assert.IsTrue(nodes.Count == decisionCount * actionsCount, + $"Number of activities added to XMI should be {decisionCount * actionsCount}"); + if (addMerge) + { + nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Merge')]"); + Assert.IsTrue(nodes.Count == decisionCount-1, $"Number of merges added to XMI should be {decisionCount}"); + } + + RemoveGeneratedFile(); + } + } + + [Test] + public void BuildLoops() + { + IDecisionBuilder decisionBuilder; + IDiagramBuilder diagramBuilder = null; + decisionBuilder = ActivityDiagramBuilder.AddDecision($"Decision{0}", "Yes", "No"); + for (int i = 0; i < 10; i++) + { + //add actions + for (int j = 0; j < 10; j++) + { + if (decisionBuilder != null) + { + var branchType = j % 2 == 0 ? BranchType.True : BranchType.False; + decisionBuilder = decisionBuilder.AddAction($"Activity{i}T{j}", branchType); + } + else if(diagramBuilder != null) + { + diagramBuilder = diagramBuilder.AddAction($"Activity{i}B{j}"); + } + } + + if (decisionBuilder != null) + { + decisionBuilder = decisionBuilder.AddLoop($"Loop{i}", "Yes", BranchType.True); + } + else if (diagramBuilder != null) + { + diagramBuilder = diagramBuilder.AddLoop($"Loop{i}", "Yes"); + } + + if (i != 0) + { + //add decision + if (decisionBuilder != null) + { + var branchType = i % 2 == 0 ? BranchType.True : BranchType.False; + decisionBuilder = decisionBuilder.AddDecision($"Decision{i}T", "Yes", "No", branchType); + } + else if (diagramBuilder != null) + { + decisionBuilder = diagramBuilder.AddDecision($"Decision{i}B", "Yes", "No"); + } + } + + } + + string xmi = ActivityDiagramBuilder.BuildDiagram(); + AssertCommonAssertions(xmi); + //test if number of decisions added to xmi <node name="Decision + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(xmi); + XmlNodeList nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Decision')]"); + Assert.IsTrue(nodes.Count == 10, $"Number of decisions added to XMI should be 10"); + //test if number of activitises added to xmi <node name="Activity + nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Activity')]"); + Assert.IsTrue(nodes.Count == 100, $"Number of activities added to XMI should be 100"); + nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Loop')]"); + Assert.IsTrue(nodes.Count == 10, $"Number of loops added to XMI should be 10"); + } + + void ValidateSchema() + { + // Path to your XSD file + string xsdFilePath = "../../../Schema/XMI.xsd"; + + // Create XmlReaderSettings + XmlReaderSettings settings = new XmlReaderSettings(); + settings.ValidationType = ValidationType.Schema; + + // Load XSD file and set it as the schema + XmlSchemaSet schemas = new XmlSchemaSet(); + schemas.Add(null, xsdFilePath); + settings.Schemas = schemas; + + // Set the validation event handler + settings.ValidationEventHandler += ValidationCallback; + + // Create XmlReader with the XMI file and settings + using (XmlReader reader = XmlReader.Create(generatedFileName, settings)) + { + // Read through the XML document + reader.Read(); + } + + // Assert that there are no errors + Assert.IsTrue(_errors.Count == 0, "There should be no errors in the XMI file"); + foreach ((string severity, string message) in _errors) + { + Console.WriteLine($"{severity}: {message}"); + } + } + + static void ValidationCallback(object sender, ValidationEventArgs e) + { + if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning) + { + _errors.Add((e.Severity.ToString(), e.Message)); + } + } + + private void AssertCommonAssertions(string xmi) + { + Assert.IsFalse(string.IsNullOrEmpty(xmi), "XMI should not be null or empty"); + Assert.IsTrue(xmi.Contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"), "XMI should contain the XML header"); + // Add more assertions based on the expected structure of your XMI + + if (!string.IsNullOrEmpty(generatedFileName)) + { + File.WriteAllText(generatedFileName, xmi); + ValidateSchema(); + RemoveGeneratedFile(); + } + } +} \ No newline at end of file diff --git a/UnitTest/ClassDiagramTests.cs b/UnitTest/ClassDiagramTests.cs index 4541dbf54ab8917496b6721216e1a0398ea4bc50..9a75601215b20fac4360f5fad6320c9497dc1439 100644 --- a/UnitTest/ClassDiagramTests.cs +++ b/UnitTest/ClassDiagramTests.cs @@ -445,7 +445,7 @@ public class ClassDiagramTests - void ValidateSchema() + void ValidateSchema() { // Path to your XSD file string xsdFilePath = "../../../Schema/XMI.xsd";