Skip to content

Commit f84766f

Browse files
committed
+ some very basic tests
1 parent 6b7b1c9 commit f84766f

1 file changed

Lines changed: 120 additions & 0 deletions

File tree

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
using System;
2+
using System.IO;
3+
using System.Linq;
4+
using System.Management.Automation;
5+
using FluentAssertions;
6+
using PSGraph.Model;
7+
using PSGraph.DesignStructureMatrix;
8+
using PSGraph.Cmdlets; // reference to locate assembly
9+
using Xunit;
10+
11+
namespace PSGraph.Tests;
12+
13+
public class DsmCmdletsBasicTests : IDisposable
14+
{
15+
private readonly PowerShell _ps;
16+
17+
public DsmCmdletsBasicTests()
18+
{
19+
_ps = PowerShell.Create();
20+
// Import module by assembly to expose cmdlets
21+
_ps.AddCommand("Import-Module").AddParameter("Assembly", typeof(NewDSMCmdlet).Assembly);
22+
_ps.Invoke();
23+
_ps.Commands.Clear();
24+
}
25+
26+
public void Dispose() => _ps.Dispose();
27+
28+
private PsBidirectionalGraph BuildGraph(params (string from,string to)[] edges)
29+
{
30+
var g = new PsBidirectionalGraph();
31+
foreach (var (f,t) in edges)
32+
{
33+
var vs = g.Vertices.FirstOrDefault(v=>v.Label==f) ?? new PSVertex(f);
34+
var vt = g.Vertices.FirstOrDefault(v=>v.Label==t) ?? new PSVertex(t);
35+
g.AddEdge(new PSEdge(vs, vt));
36+
}
37+
return g;
38+
}
39+
40+
[Fact]
41+
public void NewDSMCmdlet_BuildsDsmFromGraph()
42+
{
43+
var g = BuildGraph(("A","B"),("B","C"));
44+
_ps.AddCommand("New-DSM").AddParameter("Graph", g);
45+
var result = _ps.Invoke();
46+
result.Should().HaveCount(1);
47+
var dsm = result[0].BaseObject as IDsm;
48+
dsm.Should().NotBeNull();
49+
dsm!.RowIndex.Count.Should().Be(3);
50+
// A->B, B->C edges should have weight 1
51+
var a = g.Vertices.First(v=>v.Label=="A");
52+
var b = g.Vertices.First(v=>v.Label=="B");
53+
var c = g.Vertices.First(v=>v.Label=="C");
54+
dsm[a,b].Should().Be(1);
55+
dsm[b,c].Should().Be(1);
56+
}
57+
58+
[Fact]
59+
public void ExportDSMCmdlet_TextFormat_ReturnsStringAndWritesFile()
60+
{
61+
var g = BuildGraph(("X","Y"),("Y","Z"));
62+
var dsm = new DsmClassic(g);
63+
64+
// Direct string (no Path)
65+
_ps.AddCommand("Export-DSM").AddParameter("Dsm", dsm).AddParameter("Format", DSMExportTypes.TEXT);
66+
var r1 = _ps.Invoke();
67+
r1.Should().HaveCount(1);
68+
var text = r1[0].BaseObject as string;
69+
text.Should().NotBeNull();
70+
// Text export is a plain adjacency matrix (no labels), ensure size (3 lines) and contains a '1'
71+
var lines = text!.Trim().Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
72+
lines.Length.Should().Be(3);
73+
text.Should().Contain("1");
74+
_ps.Commands.Clear();
75+
76+
// With Path
77+
var tmp = Path.Combine(Path.GetTempPath(), $"psgraph_dsm_{Guid.NewGuid():N}.txt");
78+
_ps.AddCommand("Export-DSM")
79+
.AddParameter("Dsm", dsm)
80+
.AddParameter("Format", DSMExportTypes.TEXT)
81+
.AddParameter("Path", tmp);
82+
var r2 = _ps.Invoke();
83+
r2.Should().BeEmpty(); // output redirected to file
84+
File.Exists(tmp).Should().BeTrue();
85+
var fileContent = File.ReadAllText(tmp);
86+
var fileLines = fileContent.Trim().Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
87+
fileLines.Length.Should().Be(3);
88+
fileContent.Should().Contain("1");
89+
File.Delete(tmp);
90+
}
91+
92+
[Theory]
93+
[InlineData(ClusteringAlgorithmOptions.Classic)]
94+
[InlineData(ClusteringAlgorithmOptions.GraphBased)]
95+
public void StartDSMClusteringCmdlet_ReturnsPartitioningResult(ClusteringAlgorithmOptions algo)
96+
{
97+
// Small graph with a simple cycle to exercise clustering
98+
var g = BuildGraph(("A","B"),("B","A"),("B","C"),("C","D"));
99+
var dsm = new DsmClassic(g);
100+
_ps.AddCommand("Start-DSMClustering")
101+
.AddParameter("Dsm", dsm)
102+
.AddParameter("ClusteringAlgorithm", algo);
103+
var r = _ps.Invoke();
104+
r.Should().HaveCount(1);
105+
var pr = r[0].BaseObject as PartitioningResult;
106+
pr.Should().NotBeNull();
107+
pr!.Dsm.Should().NotBeNull();
108+
pr.Algorithm.Should().NotBeNull();
109+
_ps.Commands.Clear();
110+
111+
// Detailed variant
112+
_ps.AddCommand("Start-DSMClustering")
113+
.AddParameter("Dsm", dsm)
114+
.AddParameter("ClusteringAlgorithm", algo)
115+
.AddParameter("Detailed", true);
116+
var rDetail = _ps.Invoke();
117+
rDetail.Should().HaveCount(1);
118+
rDetail[0].BaseObject.Should().NotBeNull(); // extended result object
119+
}
120+
}

0 commit comments

Comments
 (0)