Skip to content

Commit

Permalink
fix: fixed serialization of attribute requirement facet cardinality (#16
Browse files Browse the repository at this point in the history
)
  • Loading branch information
martin1cerny authored May 20, 2024
1 parent d8037ff commit ec30788
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 2 deletions.
44 changes: 44 additions & 0 deletions Xbim.InformationSpecifications.NewTests/IoTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
using Microsoft.Extensions.Logging;
using NSubstitute;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
Expand Down Expand Up @@ -417,6 +420,47 @@ public void CanRoundTripCardinalityInXml(CardinalityEnum cardinality)
}
}

[Theory]
[MemberData(nameof(TestFacets))]
public void CanRoundTripFacetRequirementCardinality(IFacet facet, RequirementCardinalityOptions.Cardinality cardinality)
{
var x = new Xids();
var newspec = x.PrepareSpecification(IfcSchemaVersion.IFC2X3);
newspec.Applicability.Facets.Add(new IfcTypeFacet() { IfcType = "IFCWALL" });
newspec.Requirement!.Facets.Add(facet);
newspec.Requirement!.RequirementOptions = new ObservableCollection<RequirementCardinalityOptions> { new(facet, cardinality) };

var filename = Path.ChangeExtension(Path.GetTempFileName(), "ids");
x.ExportBuildingSmartIDS(filename, GetXunitLogger());

var newXids = Xids.LoadBuildingSmartIDS(filename);
var newRequirement = newXids!.SpecificationsGroups.First().Specifications.First().Requirement;
var newCardinality = newRequirement?.RequirementOptions?.FirstOrDefault()?.RelatedFacetCardinality;
newCardinality.Should().Be(cardinality);
}

[Fact]
public void EvaluatesAllFacetTypes()
{
var expectedTypes = typeof(AttributeFacet).Assembly.GetTypes()
.Where(t => !t.IsInterface && !t.IsAbstract && t.IsAssignableTo(typeof(IFacet)) && !t.IsAssignableTo(typeof(IfcTypeFacet)));
var testTypes = TestFacets.Select(f => f.FirstOrDefault() as IFacet).Select(f => f!.GetType());
expectedTypes.Should().Contain(testTypes);
}

// combination of all types of facets and cardinalities
private static readonly RequirementCardinalityOptions.Cardinality[] cardinalities = new RequirementCardinalityOptions.Cardinality[] {
RequirementCardinalityOptions.Cardinality.Optional, RequirementCardinalityOptions.Cardinality.Prohibited, RequirementCardinalityOptions.Cardinality.Expected};
public static IEnumerable<object[]> TestFacets => new IFacet[] {
// new IfcTypeFacet { IfcType = "IfcWall" },
new AttributeFacet{ AttributeName = "Name"},
new IfcClassificationFacet { ClassificationSystem = "NRM"},
new IfcPropertyFacet { PropertyName = "Name" },
new MaterialFacet { Value = "Concrete" },
new PartOfFacet { EntityRelation = PartOfFacet.PartOfRelation.IfcRelNests.ToString(), EntityType = new IfcTypeFacet { IfcType = "IfcBuildingElementPart"} }
}
.SelectMany(f => cardinalities.Select(c => new object[] { f!, c }));

[InlineData(CardinalityEnum.Required)]
[InlineData(CardinalityEnum.Optional)]
[InlineData(CardinalityEnum.Prohibited)]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Xbim.InformationSpecifications.Helpers;
using Xbim.InformationSpecifications.Facets.buildingSMART;

namespace Xbim.InformationSpecifications
{

/// <summary>
/// Constrain model parts on the ground of class attributes.
/// </summary>
public partial class AttributeFacet : FacetBase, IEquatable<AttributeFacet>, IFacet
public partial class AttributeFacet : FacetBase, IEquatable<AttributeFacet>, IFacet, IBuilsingSmartCardinality
{
/// <summary>
/// Constraint that is applied to the value of the attribute (required).
Expand Down

0 comments on commit ec30788

Please sign in to comment.