namespace FurnitureExporter.Tests { public class PanelFaceSemanticResolverTests { [Fact] public void ResolveSurfaceFaces_ForThroughHole_ReturnsOppositeFaces() { var faces = PanelFaceSemanticResolver.ResolveSurfaceFaces( new BoundingBox3D { Min = new[] { 0.0, 0.0, 0.0 }, Max = new[] { 18.0, 560.0, 720.0 }, }, new[] { 9.0, 280.0, 360.0 }, new[] { 1.0, 0.0, 0.0 }, 18.0); Assert.Contains("left", faces); Assert.Contains("right", faces); } [Fact] public void ResolveSurfaceFaces_ForBlindHole_ReturnsSingleExteriorFace() { var faces = PanelFaceSemanticResolver.ResolveSurfaceFaces( new BoundingBox3D { Min = new[] { 0.0, 0.0, 0.0 }, Max = new[] { 18.0, 560.0, 720.0 }, }, new[] { 4.0, 280.0, 360.0 }, new[] { 1.0, 0.0, 0.0 }, 8.0); Assert.Single(faces); Assert.Equal("left", faces[0]); } [Fact] public void ResolveSurfaceFaces_ForTopBottomThroughHole_ReturnsTopAndBottom() { var faces = PanelFaceSemanticResolver.ResolveSurfaceFaces( new BoundingBox3D { Min = new[] { 0.0, 0.0, 0.0 }, Max = new[] { 600.0, 720.0, 18.0 }, }, new[] { 300.0, 360.0, 9.0 }, new[] { 0.0, 0.0, 1.0 }, 18.0); Assert.Contains("top", faces); Assert.Contains("bottom", faces); } [Fact] public void ResolveSurfaceFaces_ForSideBlindHole_PrefersSingleSideFace() { var faces = PanelFaceSemanticResolver.ResolveSurfaceFaces( new BoundingBox3D { Min = new[] { 0.0, 0.0, 0.0 }, Max = new[] { 600.0, 18.0, 720.0 }, }, new[] { 300.0, 4.0, 360.0 }, new[] { 0.0, 1.0, 0.0 }, 8.0); Assert.Single(faces); Assert.Equal("front", faces[0]); } } }