diff --git a/FabWorks.Tests/FabWorks.Tests.csproj b/FabWorks.Tests/FabWorks.Tests.csproj
index 354f1fb..12e226c 100644
--- a/FabWorks.Tests/FabWorks.Tests.csproj
+++ b/FabWorks.Tests/FabWorks.Tests.csproj
@@ -22,6 +22,7 @@
+
diff --git a/FabWorks.Tests/FormProgramServiceTests.cs b/FabWorks.Tests/FormProgramServiceTests.cs
new file mode 100644
index 0000000..146355c
--- /dev/null
+++ b/FabWorks.Tests/FormProgramServiceTests.cs
@@ -0,0 +1,53 @@
+using FabWorks.Api.Services;
+using Xunit;
+
+namespace FabWorks.Tests
+{
+ public class FormProgramServiceTests
+ {
+ [Fact]
+ public void ParseFromFile_SamplePgm_PopulatesMaterialType()
+ {
+ var service = new FormProgramService();
+ var fp = service.ParseFromFile("TestData/sample.pgm");
+
+ // ProgName is empty in the sample file, so verify MaterialType instead
+ Assert.False(string.IsNullOrEmpty(fp.MaterialType));
+ }
+
+ [Fact]
+ public void ParseFromFile_SamplePgm_PopulatesThickness()
+ {
+ var service = new FormProgramService();
+ var fp = service.ParseFromFile("TestData/sample.pgm");
+ Assert.NotNull(fp.Thickness);
+ Assert.True(fp.Thickness > 0);
+ }
+
+ [Fact]
+ public void ParseFromFile_SamplePgm_PopulatesBendCount()
+ {
+ var service = new FormProgramService();
+ var fp = service.ParseFromFile("TestData/sample.pgm");
+ Assert.True(fp.BendCount > 0);
+ }
+
+ [Fact]
+ public void ParseFromFile_SamplePgm_PopulatesToolNames()
+ {
+ var service = new FormProgramService();
+ var fp = service.ParseFromFile("TestData/sample.pgm");
+ Assert.False(string.IsNullOrEmpty(fp.UpperToolNames));
+ Assert.False(string.IsNullOrEmpty(fp.LowerToolNames));
+ }
+
+ [Fact]
+ public void ParseFromFile_SamplePgm_ComputesContentHash()
+ {
+ var service = new FormProgramService();
+ var fp = service.ParseFromFile("TestData/sample.pgm");
+ Assert.NotNull(fp.ContentHash);
+ Assert.Equal(64, fp.ContentHash.Length); // SHA256 hex = 64 chars
+ }
+ }
+}