diff --git a/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/CMakeLists.txt b/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/CMakeLists.txt
new file mode 100644
index 000000000..f88390f7b
--- /dev/null
+++ b/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/CMakeLists.txt
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2021 Technical University of Munich
+# Chair of Computational Modeling and Simulation.
+#
+# TUM Open Infra Platform is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License Version 3
+# as published by the Free Software Foundation.
+#
+# TUM Open Infra Platform is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+
+include(CreateUnitTests)
+
+CreateIfcFileVisualUnitTestForSchema(sectioned-solid-horizontal IFC4X1)
diff --git a/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/Data/sectioned-solid-horizontal.ifc b/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/Data/sectioned-solid-horizontal.ifc
new file mode 100644
index 000000000..469454fa3
--- /dev/null
+++ b/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/Data/sectioned-solid-horizontal.ifc
@@ -0,0 +1,311 @@
+ISO-10303-21;
+HEADER;
+FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
+FILE_NAME('PGSuperExport.ifc','2021-06-18T10:23:00',('Richard Brice, PE'),('WSDOT'),'IfcOpenShell 0.6.0b0','BridgeLink:PGSuper Version 6.2.0.0','');
+FILE_SCHEMA(('IFC4X1'));
+ENDSEC;
+DATA;
+#1=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
+#2=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
+#3=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
+#4=IFCUNITASSIGNMENT((#2,#3));
+#5=IFCPROJECT('0jKRhrenn0oAY4vPuEW$IC',$,'My Bridge Project',$,$,$,$,(#18),#4);
+#6=IFCPERSON($,$,'',$,$,$,$,$);
+#7=IFCORGANIZATION('Washington State Department of Transportation, Bridge and Structures Office','Richard Brice, PE',$,$,$);
+#8=IFCPERSONANDORGANIZATION(#6,#7,$);
+#9=IFCAPPLICATION(#7,'6.2.0.0','BridgeLink:PGSuper','PGSuper');
+#10=IFCOWNERHISTORY(#8,#9,$,.ADDED.,1624036980,#8,#9,1624036980);
+#11=IFCDIRECTION((1.,0.,0.));
+#12=IFCDIRECTION((0.,0.,1.));
+#13=IFCCARTESIANPOINT((0.,0.,0.));
+#14=IFCAXIS2PLACEMENT3D(#13,#12,#11);
+#15=IFCLOCALPLACEMENT($,#14);
+#16=IFCSITE('1vEqF9vcD4DxuQ3IUQeCq5',#10,'My Bridge Project',$,$,#15,$,$,.ELEMENT.,$,$,$,$,$);
+#17=IFCRELAGGREGATES('0$Hjd1_Af7URKUcYE$t6rw',#10,$,$,#5,(#16));
+#18=IFCGEOMETRICREPRESENTATIONCONTEXT('3D','Model',3,$,$,$);
+#19=IFCCARTESIANPOINT((-39.624,0.));
+#20=IFCLINESEGMENT2D(#19,0.,139.624);
+#21=IFCALIGNMENT2DHORIZONTALSEGMENT($,$,$,#20);
+#22=IFCALIGNMENT2DHORIZONTAL(-39.624,(#21));
+#23=IFCALIGNMENT2DVERSEGLINE($,$,$,0.,139.624,0.,0.);
+#24=IFCALIGNMENT2DVERTICAL((#23));
+#25=IFCALIGNMENTCURVE(#22,#24,$);
+#26=IFCALIGNMENT('2aViFhKAf778GNenSrKZWZ',#10,'My Alignment',$,$,$,$,#25,$);
+#27=IFCDIRECTION((1.,0.,0.));
+#28=IFCDIRECTION((0.,0.,1.));
+#29=IFCCARTESIANPOINT((0.,0.,0.));
+#30=IFCAXIS2PLACEMENT3D(#29,#28,#27);
+#31=IFCLOCALPLACEMENT(#15,#30);
+#32=IFCBUILDING('0r471Jxq1EqRfiLLjL$6Ig',#10,'My Bridge',$,$,#31,$,$,.ELEMENT.,$,$,$);
+#33=IFCRELAGGREGATES('0fBW$l8SD0P9PxWJIDvdba',#10,$,$,#16,(#32));
+#34=IFCELEMENTASSEMBLY('01aq5vCiD4MPZcc8mZZqHT',#10,'Span 1, Girder A',$,$,$,$,$,.FACTORY.,.GIRDER.);
+#35=IFCCARTESIANPOINT((0.3048,3.6576));
+#36=IFCLINESEGMENT2D(#35,0.,39.0144);
+#37=IFCALIGNMENT2DHORIZONTALSEGMENT($,$,$,#36);
+#38=IFCALIGNMENT2DHORIZONTAL(0.,(#37));
+#39=IFCALIGNMENT2DVERSEGLINE($,$,$,0.,39.0144,-0.352552,0.);
+#40=IFCALIGNMENT2DVERTICAL((#39));
+#41=IFCALIGNMENTCURVE(#38,#40,$);
+#42=IFCCARTESIANPOINT((-0.,0.));
+#43=IFCCARTESIANPOINT((0.6223,0.));
+#44=IFCCARTESIANPOINT((0.6223,-0.0762));
+#45=IFCCARTESIANPOINT((0.6223,-0.0762));
+#46=IFCCARTESIANPOINT((0.1539875,-0.1524));
+#47=IFCCARTESIANPOINT((0.0777875,-0.2286));
+#48=IFCCARTESIANPOINT((0.0777875,-1.355725));
+#49=IFCCARTESIANPOINT((0.1539875,-1.431925));
+#50=IFCCARTESIANPOINT((0.4873625,-1.546225));
+#51=IFCCARTESIANPOINT((0.4873625,-1.651));
+#52=IFCCARTESIANPOINT((0.4619625,-1.6764));
+#53=IFCCARTESIANPOINT((-0.,-1.6764));
+#54=IFCCARTESIANPOINT((-0.4619625,-1.6764));
+#55=IFCCARTESIANPOINT((-0.4873625,-1.651));
+#56=IFCCARTESIANPOINT((-0.4873625,-1.546225));
+#57=IFCCARTESIANPOINT((-0.1539875,-1.431925));
+#58=IFCCARTESIANPOINT((-0.0777875,-1.355725));
+#59=IFCCARTESIANPOINT((-0.0777875,-0.2286));
+#60=IFCCARTESIANPOINT((-0.1539875,-0.1524));
+#61=IFCCARTESIANPOINT((-0.6223,-0.0762));
+#62=IFCCARTESIANPOINT((-0.6223,-0.0762));
+#63=IFCCARTESIANPOINT((-0.6223,0.));
+#64=IFCCARTESIANPOINT((-0.,0.));
+#65=IFCPOLYLINE((#42,#43,#44,#45,#46,#47,#48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,#64));
+#66=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'CrossSectionProfile',#65);
+#67=IFCDISTANCEEXPRESSION(0.,$,$,$,$);
+#68=IFCDISTANCEEXPRESSION(39.0144,$,$,$,$);
+#69=IFCSECTIONEDSOLIDHORIZONTAL(#41,(#66,#66),(#67,#68),.F.);
+#70=IFCSHAPEREPRESENTATION(#18,'Body','AdvancedSweptSolid',(#69));
+#71=IFCPRODUCTDEFINITIONSHAPE($,$,(#70));
+#72=IFCBEAM('0fg5kAfRHFQw0QzcEJKQYF',#10,'Span 1, Girder A',$,$,$,#71,$,.NOTDEFINED.);
+#73=IFCRELAGGREGATES('06R7lMyTr0tRQbrq0FqiMU',#10,'AggGirderSegments',$,#34,(#72));
+#74=IFCELEMENTASSEMBLY('3GKdXi8_P9XQPkAl0LVC7T',#10,'Span 1, Girder B',$,$,$,$,$,.FACTORY.,.GIRDER.);
+#75=IFCCARTESIANPOINT((0.3048,1.8288));
+#76=IFCLINESEGMENT2D(#75,0.,39.0144);
+#77=IFCALIGNMENT2DHORIZONTALSEGMENT($,$,$,#76);
+#78=IFCALIGNMENT2DHORIZONTAL(0.,(#77));
+#79=IFCALIGNMENT2DVERSEGLINE($,$,$,0.,39.0144,-0.315976,0.);
+#80=IFCALIGNMENT2DVERTICAL((#79));
+#81=IFCALIGNMENTCURVE(#78,#80,$);
+#82=IFCCARTESIANPOINT((-0.,0.));
+#83=IFCCARTESIANPOINT((0.6223,0.));
+#84=IFCCARTESIANPOINT((0.6223,-0.0762));
+#85=IFCCARTESIANPOINT((0.6223,-0.0762));
+#86=IFCCARTESIANPOINT((0.1539875,-0.1524));
+#87=IFCCARTESIANPOINT((0.0777875,-0.2286));
+#88=IFCCARTESIANPOINT((0.0777875,-1.355725));
+#89=IFCCARTESIANPOINT((0.1539875,-1.431925));
+#90=IFCCARTESIANPOINT((0.4873625,-1.546225));
+#91=IFCCARTESIANPOINT((0.4873625,-1.651));
+#92=IFCCARTESIANPOINT((0.4619625,-1.6764));
+#93=IFCCARTESIANPOINT((-0.,-1.6764));
+#94=IFCCARTESIANPOINT((-0.4619625,-1.6764));
+#95=IFCCARTESIANPOINT((-0.4873625,-1.651));
+#96=IFCCARTESIANPOINT((-0.4873625,-1.546225));
+#97=IFCCARTESIANPOINT((-0.1539875,-1.431925));
+#98=IFCCARTESIANPOINT((-0.0777875,-1.355725));
+#99=IFCCARTESIANPOINT((-0.0777875,-0.2286));
+#100=IFCCARTESIANPOINT((-0.1539875,-0.1524));
+#101=IFCCARTESIANPOINT((-0.6223,-0.0762));
+#102=IFCCARTESIANPOINT((-0.6223,-0.0762));
+#103=IFCCARTESIANPOINT((-0.6223,0.));
+#104=IFCCARTESIANPOINT((-0.,0.));
+#105=IFCPOLYLINE((#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,#96,#97,#98,#99,#100,#101,#102,#103,#104));
+#106=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'CrossSectionProfile',#105);
+#107=IFCDISTANCEEXPRESSION(0.,$,$,$,$);
+#108=IFCDISTANCEEXPRESSION(39.0144,$,$,$,$);
+#109=IFCSECTIONEDSOLIDHORIZONTAL(#81,(#106,#106),(#107,#108),.F.);
+#110=IFCSHAPEREPRESENTATION(#18,'Body','AdvancedSweptSolid',(#109));
+#111=IFCPRODUCTDEFINITIONSHAPE($,$,(#110));
+#112=IFCBEAM('2RO80KTODD0gJpL996nVdJ',#10,'Span 1, Girder B',$,$,$,#111,$,.NOTDEFINED.);
+#113=IFCRELAGGREGATES('3Zmz87j2H6DBOwE7hYxwl3',#10,'AggGirderSegments',$,#74,(#112));
+#114=IFCELEMENTASSEMBLY('3yjxssw4r88ghLsvDvetW3',#10,'Span 1, Girder C',$,$,$,$,$,.FACTORY.,.GIRDER.);
+#115=IFCCARTESIANPOINT((0.3048,0.));
+#116=IFCLINESEGMENT2D(#115,0.,39.0144);
+#117=IFCALIGNMENT2DHORIZONTALSEGMENT($,$,$,#116);
+#118=IFCALIGNMENT2DHORIZONTAL(0.,(#117));
+#119=IFCALIGNMENT2DVERSEGLINE($,$,$,0.,39.0144,-0.2794,0.);
+#120=IFCALIGNMENT2DVERTICAL((#119));
+#121=IFCALIGNMENTCURVE(#118,#120,$);
+#122=IFCCARTESIANPOINT((-0.,2.22044604925031E-16));
+#123=IFCCARTESIANPOINT((0.6223,2.22044604925031E-16));
+#124=IFCCARTESIANPOINT((0.6223,-0.0761999999999998));
+#125=IFCCARTESIANPOINT((0.6223,-0.0761999999999998));
+#126=IFCCARTESIANPOINT((0.1539875,-0.1524));
+#127=IFCCARTESIANPOINT((0.0777875,-0.2286));
+#128=IFCCARTESIANPOINT((0.0777875,-1.355725));
+#129=IFCCARTESIANPOINT((0.1539875,-1.431925));
+#130=IFCCARTESIANPOINT((0.4873625,-1.546225));
+#131=IFCCARTESIANPOINT((0.4873625,-1.651));
+#132=IFCCARTESIANPOINT((0.4619625,-1.6764));
+#133=IFCCARTESIANPOINT((-0.,-1.6764));
+#134=IFCCARTESIANPOINT((-0.4619625,-1.6764));
+#135=IFCCARTESIANPOINT((-0.4873625,-1.651));
+#136=IFCCARTESIANPOINT((-0.4873625,-1.546225));
+#137=IFCCARTESIANPOINT((-0.1539875,-1.431925));
+#138=IFCCARTESIANPOINT((-0.0777875,-1.355725));
+#139=IFCCARTESIANPOINT((-0.0777875,-0.2286));
+#140=IFCCARTESIANPOINT((-0.1539875,-0.1524));
+#141=IFCCARTESIANPOINT((-0.6223,-0.0761999999999998));
+#142=IFCCARTESIANPOINT((-0.6223,-0.0761999999999998));
+#143=IFCCARTESIANPOINT((-0.6223,2.22044604925031E-16));
+#144=IFCCARTESIANPOINT((-0.,2.22044604925031E-16));
+#145=IFCPOLYLINE((#122,#123,#124,#125,#126,#127,#128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#138,#139,#140,#141,#142,#143,#144));
+#146=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'CrossSectionProfile',#145);
+#147=IFCDISTANCEEXPRESSION(0.,$,$,$,$);
+#148=IFCDISTANCEEXPRESSION(39.0144,$,$,$,$);
+#149=IFCSECTIONEDSOLIDHORIZONTAL(#121,(#146,#146),(#147,#148),.F.);
+#150=IFCSHAPEREPRESENTATION(#18,'Body','AdvancedSweptSolid',(#149));
+#151=IFCPRODUCTDEFINITIONSHAPE($,$,(#150));
+#152=IFCBEAM('3jW$v1IcX2_gqTMy3_lqgH',#10,'Span 1, Girder C',$,$,$,#151,$,.NOTDEFINED.);
+#153=IFCRELAGGREGATES('2w4ceKIeX4Lupdza8R_Mfl',#10,'AggGirderSegments',$,#114,(#152));
+#154=IFCELEMENTASSEMBLY('1YUTCgCN19xR4vy5bl$LGM',#10,'Span 1, Girder D',$,$,$,$,$,.FACTORY.,.GIRDER.);
+#155=IFCCARTESIANPOINT((0.3048,-1.8288));
+#156=IFCLINESEGMENT2D(#155,0.,39.0144);
+#157=IFCALIGNMENT2DHORIZONTALSEGMENT($,$,$,#156);
+#158=IFCALIGNMENT2DHORIZONTAL(0.,(#157));
+#159=IFCALIGNMENT2DVERSEGLINE($,$,$,0.,39.0144,-0.315976,0.);
+#160=IFCALIGNMENT2DVERTICAL((#159));
+#161=IFCALIGNMENTCURVE(#158,#160,$);
+#162=IFCCARTESIANPOINT((-0.,0.));
+#163=IFCCARTESIANPOINT((0.6223,0.));
+#164=IFCCARTESIANPOINT((0.6223,-0.0762));
+#165=IFCCARTESIANPOINT((0.6223,-0.0762));
+#166=IFCCARTESIANPOINT((0.1539875,-0.1524));
+#167=IFCCARTESIANPOINT((0.0777875,-0.2286));
+#168=IFCCARTESIANPOINT((0.0777875,-1.355725));
+#169=IFCCARTESIANPOINT((0.1539875,-1.431925));
+#170=IFCCARTESIANPOINT((0.4873625,-1.546225));
+#171=IFCCARTESIANPOINT((0.4873625,-1.651));
+#172=IFCCARTESIANPOINT((0.4619625,-1.6764));
+#173=IFCCARTESIANPOINT((-0.,-1.6764));
+#174=IFCCARTESIANPOINT((-0.4619625,-1.6764));
+#175=IFCCARTESIANPOINT((-0.4873625,-1.651));
+#176=IFCCARTESIANPOINT((-0.4873625,-1.546225));
+#177=IFCCARTESIANPOINT((-0.1539875,-1.431925));
+#178=IFCCARTESIANPOINT((-0.0777875,-1.355725));
+#179=IFCCARTESIANPOINT((-0.0777875,-0.2286));
+#180=IFCCARTESIANPOINT((-0.1539875,-0.1524));
+#181=IFCCARTESIANPOINT((-0.6223,-0.0762));
+#182=IFCCARTESIANPOINT((-0.6223,-0.0762));
+#183=IFCCARTESIANPOINT((-0.6223,0.));
+#184=IFCCARTESIANPOINT((-0.,0.));
+#185=IFCPOLYLINE((#162,#163,#164,#165,#166,#167,#168,#169,#170,#171,#172,#173,#174,#175,#176,#177,#178,#179,#180,#181,#182,#183,#184));
+#186=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'CrossSectionProfile',#185);
+#187=IFCDISTANCEEXPRESSION(0.,$,$,$,$);
+#188=IFCDISTANCEEXPRESSION(39.0144,$,$,$,$);
+#189=IFCSECTIONEDSOLIDHORIZONTAL(#161,(#186,#186),(#187,#188),.F.);
+#190=IFCSHAPEREPRESENTATION(#18,'Body','AdvancedSweptSolid',(#189));
+#191=IFCPRODUCTDEFINITIONSHAPE($,$,(#190));
+#192=IFCBEAM('1pSC2RNyn4iP3CH07jc3LD',#10,'Span 1, Girder D',$,$,$,#191,$,.NOTDEFINED.);
+#193=IFCRELAGGREGATES('0um5yy57j4PhysrTknSmm6',#10,'AggGirderSegments',$,#154,(#192));
+#194=IFCELEMENTASSEMBLY('1DSx9xAkb08g67R04K02CY',#10,'Span 1, Girder E',$,$,$,$,$,.FACTORY.,.GIRDER.);
+#195=IFCCARTESIANPOINT((0.3048,-3.6576));
+#196=IFCLINESEGMENT2D(#195,0.,39.0144);
+#197=IFCALIGNMENT2DHORIZONTALSEGMENT($,$,$,#196);
+#198=IFCALIGNMENT2DHORIZONTAL(0.,(#197));
+#199=IFCALIGNMENT2DVERSEGLINE($,$,$,0.,39.0144,-0.352552,0.);
+#200=IFCALIGNMENT2DVERTICAL((#199));
+#201=IFCALIGNMENTCURVE(#198,#200,$);
+#202=IFCCARTESIANPOINT((-0.,0.));
+#203=IFCCARTESIANPOINT((0.6223,0.));
+#204=IFCCARTESIANPOINT((0.6223,-0.0762));
+#205=IFCCARTESIANPOINT((0.6223,-0.0762));
+#206=IFCCARTESIANPOINT((0.1539875,-0.1524));
+#207=IFCCARTESIANPOINT((0.0777875,-0.2286));
+#208=IFCCARTESIANPOINT((0.0777875,-1.355725));
+#209=IFCCARTESIANPOINT((0.1539875,-1.431925));
+#210=IFCCARTESIANPOINT((0.4873625,-1.546225));
+#211=IFCCARTESIANPOINT((0.4873625,-1.651));
+#212=IFCCARTESIANPOINT((0.4619625,-1.6764));
+#213=IFCCARTESIANPOINT((-0.,-1.6764));
+#214=IFCCARTESIANPOINT((-0.4619625,-1.6764));
+#215=IFCCARTESIANPOINT((-0.4873625,-1.651));
+#216=IFCCARTESIANPOINT((-0.4873625,-1.546225));
+#217=IFCCARTESIANPOINT((-0.1539875,-1.431925));
+#218=IFCCARTESIANPOINT((-0.0777875,-1.355725));
+#219=IFCCARTESIANPOINT((-0.0777875,-0.2286));
+#220=IFCCARTESIANPOINT((-0.1539875,-0.1524));
+#221=IFCCARTESIANPOINT((-0.6223,-0.0762));
+#222=IFCCARTESIANPOINT((-0.6223,-0.0762));
+#223=IFCCARTESIANPOINT((-0.6223,0.));
+#224=IFCCARTESIANPOINT((-0.,0.));
+#225=IFCPOLYLINE((#202,#203,#204,#205,#206,#207,#208,#209,#210,#211,#212,#213,#214,#215,#216,#217,#218,#219,#220,#221,#222,#223,#224));
+#226=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'CrossSectionProfile',#225);
+#227=IFCDISTANCEEXPRESSION(0.,$,$,$,$);
+#228=IFCDISTANCEEXPRESSION(39.0144,$,$,$,$);
+#229=IFCSECTIONEDSOLIDHORIZONTAL(#201,(#226,#226),(#227,#228),.F.);
+#230=IFCSHAPEREPRESENTATION(#18,'Body','AdvancedSweptSolid',(#229));
+#231=IFCPRODUCTDEFINITIONSHAPE($,$,(#230));
+#232=IFCBEAM('121DhMx0D67fAd$jWZRlAl',#10,'Span 1, Girder E',$,$,$,#231,$,.NOTDEFINED.);
+#233=IFCRELAGGREGATES('2Z0cXG5wb6xPAm3LAJdTLN',#10,'AggGirderSegments',$,#194,(#232));
+#234=IFCCARTESIANPOINT((-4.572,-0.26924));
+#235=IFCCARTESIANPOINT((-4.572,-0.09144));
+#236=IFCCARTESIANPOINT((-0.,0.));
+#237=IFCCARTESIANPOINT((4.572,-0.09144));
+#238=IFCCARTESIANPOINT((4.572,-0.26924));
+#239=IFCCARTESIANPOINT((4.2799,-0.352552));
+#240=IFCCARTESIANPOINT((3.0353,-0.352552));
+#241=IFCCARTESIANPOINT((3.0353,-0.270256));
+#242=IFCCARTESIANPOINT((3.01625,-0.251206));
+#243=IFCCARTESIANPOINT((2.47015,-0.239522));
+#244=IFCCARTESIANPOINT((2.4511,-0.258572));
+#245=IFCCARTESIANPOINT((2.4511,-0.315976));
+#246=IFCCARTESIANPOINT((1.2065,-0.315976));
+#247=IFCCARTESIANPOINT((1.2065,-0.23368));
+#248=IFCCARTESIANPOINT((1.18745,-0.21463));
+#249=IFCCARTESIANPOINT((0.64135,-0.202946));
+#250=IFCCARTESIANPOINT((0.6223,-0.221996));
+#251=IFCCARTESIANPOINT((0.6223,-0.2794));
+#252=IFCCARTESIANPOINT((-0.6223,-0.2794));
+#253=IFCCARTESIANPOINT((-0.6223,-0.221996));
+#254=IFCCARTESIANPOINT((-0.64135,-0.202946));
+#255=IFCCARTESIANPOINT((-1.18745,-0.21463));
+#256=IFCCARTESIANPOINT((-1.2065,-0.23368));
+#257=IFCCARTESIANPOINT((-1.2065,-0.315976));
+#258=IFCCARTESIANPOINT((-2.4511,-0.315976));
+#259=IFCCARTESIANPOINT((-2.4511,-0.258572));
+#260=IFCCARTESIANPOINT((-2.47015,-0.239522));
+#261=IFCCARTESIANPOINT((-3.01625,-0.251206));
+#262=IFCCARTESIANPOINT((-3.0353,-0.270256));
+#263=IFCCARTESIANPOINT((-3.0353,-0.352552));
+#264=IFCCARTESIANPOINT((-4.2799,-0.352552));
+#265=IFCPOLYLINE((#234,#235,#236,#237,#238,#239,#240,#241,#242,#243,#244,#245,#246,#247,#248,#249,#250,#251,#252,#253,#254,#255,#256,#257,#258,#259,#260,#261,#262,#263,#264));
+#266=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#265);
+#267=IFCDISTANCEEXPRESSION(40.4495,$,$,$,$);
+#268=IFCDISTANCEEXPRESSION(78.4225,$,$,$,$);
+#269=IFCSECTIONEDSOLIDHORIZONTAL(#25,(#266,#266),(#267,#268),.T.);
+#270=IFCSHAPEREPRESENTATION(#18,'Body','AdvancedSweptSolid',(#269));
+#271=IFCPRODUCTDEFINITIONSHAPE($,$,(#270));
+#272=IFCSLAB('2bQooQLX1AEP5yRc7j6Gy4',#10,'MyDeck',$,$,$,#271,$,.NOTDEFINED.);
+#273=IFCCARTESIANPOINT((4.572,-0.09144));
+#274=IFCCARTESIANPOINT((4.2418660201946,-0.084837320403892));
+#275=IFCCARTESIANPOINT((4.46635712646227,0.977686196139021));
+#276=IFCCARTESIANPOINT((4.72030634169719,0.972607211834322));
+#277=IFCCARTESIANPOINT((4.69541931860417,-0.271743942816794));
+#278=IFCCARTESIANPOINT((4.56844471098671,-0.269204450664445));
+#279=IFCPOLYLINE((#273,#274,#275,#276,#277,#278));
+#280=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#279);
+#281=IFCDISTANCEEXPRESSION(40.4495,$,$,$,$);
+#282=IFCDISTANCEEXPRESSION(78.4225,$,$,$,$);
+#283=IFCSECTIONEDSOLIDHORIZONTAL(#25,(#280,#280),(#281,#282),.T.);
+#284=IFCSHAPEREPRESENTATION(#18,'Body','AdvancedSweptSolid',(#283));
+#285=IFCPRODUCTDEFINITIONSHAPE($,$,(#284));
+#286=IFCRAILING('20_WHeJDP1ywaQC34sfoB4',#10,'Left Barrier',$,$,$,#285,$,.GUARDRAIL.);
+#287=IFCCARTESIANPOINT((-4.56844471098671,-0.269204450664445));
+#288=IFCCARTESIANPOINT((-4.69541931860417,-0.271743942816794));
+#289=IFCCARTESIANPOINT((-4.72030634169719,0.972607211834322));
+#290=IFCCARTESIANPOINT((-4.46635712646227,0.977686196139021));
+#291=IFCCARTESIANPOINT((-4.2418660201946,-0.084837320403892));
+#292=IFCCARTESIANPOINT((-4.572,-0.09144));
+#293=IFCPOLYLINE((#287,#288,#289,#290,#291,#292));
+#294=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#293);
+#295=IFCDISTANCEEXPRESSION(40.4495,$,$,$,$);
+#296=IFCDISTANCEEXPRESSION(78.4225,$,$,$,$);
+#297=IFCSECTIONEDSOLIDHORIZONTAL(#25,(#294,#294),(#295,#296),.T.);
+#298=IFCSHAPEREPRESENTATION(#18,'Body','AdvancedSweptSolid',(#297));
+#299=IFCPRODUCTDEFINITIONSHAPE($,$,(#298));
+#300=IFCRAILING('3yIDZdE51Ef9gzuBJZB02F',#10,'Right Barrier',$,$,$,#299,$,.GUARDRAIL.);
+#301=IFCRELCONTAINEDINSPATIALSTRUCTURE('0kJz0gd4zEt9_j7BGnOHCJ',#10,$,$,(#34,#74,#114,#154,#194,#272,#286,#300),#32);
+#302=IFCRELCONTAINEDINSPATIALSTRUCTURE('3IP4lb2IfCb8OojqvCJFcc',#10,$,$,(#26),#32);
+ENDSEC;
+END-ISO-10303-21;
diff --git a/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/src/sectioned-solid-horizontal.cpp b/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/src/sectioned-solid-horizontal.cpp
new file mode 100644
index 000000000..c82e41d7c
--- /dev/null
+++ b/UnitTests/Schemas/IFC4X1/sectioned-solid-horizontal/src/sectioned-solid-horizontal.cpp
@@ -0,0 +1,211 @@
+/*
+ Copyright (c) 2021 Technical University of Munich
+ Chair of Computational Modeling and Simulation.
+
+ TUM Open Infra Platform is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License Version 3
+ as published by the Free Software Foundation.
+
+ TUM Open Infra Platform is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#include
+#include
+
+#include
+
+#include
+#include
+#include
+
+using namespace testing;
+
+
+class SectionedSolidHorizontal : public IfcVisualTest {
+protected:
+
+ // Test standard values
+ buw::Image4b _background = buw::Image4b(0, 0);
+
+ virtual void SetUp() override {
+ IfcVisualTest::SetUp();
+
+ express_model = OpenInfraPlatform::IFC4X1::IFC4X1Reader::FromFile(filename.string());
+
+ importer = buw::makeReferenceCounted>();
+ auto model = importer->collectData(express_model);
+
+ _background = rendererIfc->captureImage();
+ rendererIfc->setModel(model[0]);
+ }
+
+ virtual void TearDown() override {
+ express_model.reset();
+ IfcVisualTest::TearDown();
+ }
+
+ virtual std::string TestName() const { return "sectioned-solid-horizontal"; }
+ virtual std::string Schema() const { return "IFC4x1"; }
+
+ const boost::filesystem::path filename = dataPath("sectioned-solid-horizontal.ifc");
+
+ std::shared_ptr express_model = nullptr;
+ buw::ReferenceCounted> importer = nullptr;
+};
+
+TEST_F(SectionedSolidHorizontal, AllEntitiesAreRead) {
+ EXPECT_THAT(express_model->entities.size(), Eq(302));
+}
+
+TEST_F(SectionedSolidHorizontal, IFCHasAnEssentialEntity) {
+ auto result1 = std::find_if(express_model->entities.begin(), express_model->entities.end(), [](auto &pair) -> bool { return pair.second->classname() == "IFCSECTIONEDSOLIDHORIZONTAL"; });
+ //auto result2 = std::find_if(express_model->entities.begin(), express_model->entities.end(), [](auto &pair) -> bool { return pair.second->classname() == "IFCARBITRARYCLOSEDPROFILEDEF"; });
+ //auto result3 = std::find_if(express_model->entities.begin(), express_model->entities.end(), [](auto &pair) -> bool { return pair.second->classname() == "IFCINDEXEDPOLYCURVE"; });
+ //auto result4 = std::find_if(express_model->entities.begin(), express_model->entities.end(), [](auto &pair) -> bool { return pair.second->classname() == "IFCPOLYLINE"; });
+ //auto result5 = std::find_if(express_model->entities.begin(), express_model->entities.end(), [](auto &pair) -> bool { return pair.second->classname() == "IFCALIGNMENTCURVE"; });
+
+ EXPECT_NE(result1, express_model->entities.end());
+ //EXPECT_NE(result2, express_model->entities.end());
+ //EXPECT_NE(result3, express_model->entities.end());
+ //EXPECT_NE(result4, express_model->entities.end());
+ //EXPECT_NE(result5, express_model->entities.end());
+}
+/*
+TEST_F(SectionedSolidHorizontal, CountEssentialEntities) {
+ auto result1 = std::count_if(express_model->entities.begin(), express_model->entities.end(), [](auto &pair) -> bool { return pair.second->classname() == "IFCSECTIONEDSOLIDHORIZONTAL"; });
+ auto result2 = std::count_if(express_model->entities.begin(), express_model->entities.end(), [](auto &pair) -> bool { return pair.second->classname() == "IFCARBITRARYCLOSEDPROFILEDEF"; });
+ auto result3 = std::count_if(express_model->entities.begin(), express_model->entities.end(), [](auto &pair) -> bool { return pair.second->classname() == "IFCINDEXEDPOLYCURVE"; });
+
+ EXPECT_EQ(result1, 16);
+ EXPECT_EQ(result2, 49);
+ EXPECT_EQ(result3, 49);
+}
+*/
+
+TEST_F(SectionedSolidHorizontal, ImageIsSaved)
+{
+ // Arrange
+ buw::Image4b image = rendererIfc->captureImage();
+
+ // Act
+ buw::storeImage(testPath("sectioned-solid-horizontal.png").string(), image);
+
+ // Assert
+ EXPECT_NO_THROW(buw::loadImage4b(testPath("sectioned-solid-horizontal.png").string()));
+}
+
+TEST_F(SectionedSolidHorizontal, PlaneSurfaceViews)
+{
+ // Arrange
+ const auto expected_front = buw::loadImage4b(dataPath("sectioned-solid-horizontal_front.png").string());
+ const auto expected_top = buw::loadImage4b(dataPath("sectioned-solid-horizontal_top.png").string());
+ const auto expected_bottom = buw::loadImage4b(dataPath("sectioned-solid-horizontal_bottom.png").string());
+ const auto expected_left = buw::loadImage4b(dataPath("sectioned-solid-horizontal_left.png").string());
+ const auto expected_right = buw::loadImage4b(dataPath("sectioned-solid-horizontal_right.png").string());
+ const auto expected_back = buw::loadImage4b(dataPath("sectioned-solid-horizontal_back.png").string());
+
+ // Act (Front)
+ rendererIfc->setViewDirection(buw::eViewDirection::Front);
+ buw::Image4b image_front = CaptureImage();
+ // Act (Top)
+ rendererIfc->setViewDirection(buw::eViewDirection::Top);
+ buw::Image4b image_top = CaptureImage();
+ // Act (Bottom)
+ rendererIfc->setViewDirection(buw::eViewDirection::Bottom);
+ buw::Image4b image_bottom = CaptureImage();
+ // Act (Left)
+ rendererIfc->setViewDirection(buw::eViewDirection::Left);
+ buw::Image4b image_left = CaptureImage();
+ // Act (Right)
+ rendererIfc->setViewDirection(buw::eViewDirection::Right);
+ buw::Image4b image_right = CaptureImage();
+ // Act (Back)
+ rendererIfc->setViewDirection(buw::eViewDirection::Back);
+ buw::Image4b image_back = CaptureImage();
+
+ // uncomment following lines to also save the screen shot
+ /*
+ buw::storeImage(testPath("sectioned-solid-horizontal_front.png").string(), image_front);
+ buw::storeImage(testPath("sectioned-solid-horizontal_top.png").string(), image_top);
+ buw::storeImage(testPath("sectioned-solid-horizontal_bottom.png").string(), image_bottom);
+ buw::storeImage(testPath("sectioned-solid-horizontal_left.png").string(), image_left);
+ buw::storeImage(testPath("sectioned-solid-horizontal_right.png").string(), image_right);
+ buw::storeImage(testPath("sectioned-solid-horizontal_back.png").string(), image_back);
+ */
+
+ // Assert
+ EXPECT_EQ(image_front, expected_front);
+ EXPECT_EQ(image_top, expected_top);
+ EXPECT_EQ(image_bottom, expected_bottom);
+ EXPECT_EQ(image_left, expected_left);
+ EXPECT_EQ(image_right, expected_right);
+ EXPECT_EQ(image_back, expected_back);
+}
+
+TEST_F(SectionedSolidHorizontal, VertexViews)
+{
+ // Arrange
+ const auto expected_front_left_bottom = buw::loadImage4b(dataPath("sectioned-solid-horizontal_front_left_bottom.png").string());
+ const auto expected_front_right_bottom = buw::loadImage4b(dataPath("sectioned-solid-horizontal_front_right_bottom.png").string());
+ const auto expected_top_left_front = buw::loadImage4b(dataPath("sectioned-solid-horizontal_top_left_front.png").string());
+ const auto expected_top_front_right = buw::loadImage4b(dataPath("sectioned-solid-horizontal_top_front_right.png").string());
+ const auto expected_top_left_back = buw::loadImage4b(dataPath("sectioned-solid-horizontal_top_left_back.png").string());
+ const auto expected_top_right_back = buw::loadImage4b(dataPath("sectioned-solid-horizontal_top_right_back.png").string());
+ const auto expected_back_left_bottom = buw::loadImage4b(dataPath("sectioned-solid-horizontal_back_left_bottom.png").string());
+ const auto expected_right_bottom_back = buw::loadImage4b(dataPath("sectioned-solid-horizontal_right_bottom_back.png").string());
+
+ // Act (FrontLeftBottom)
+ rendererIfc->setViewDirection(buw::eViewDirection::FrontLeftBottom);
+ buw::Image4b image_front_left_bottom = CaptureImage();
+ // Act (FrontRightBottom)
+ rendererIfc->setViewDirection(buw::eViewDirection::FrontRightBottom);
+ buw::Image4b image_front_right_bottom = CaptureImage();
+ // Act (TopLeftFront)
+ rendererIfc->setViewDirection(buw::eViewDirection::TopLeftFront);
+ buw::Image4b image_top_left_front = CaptureImage();
+ // Act (TopFrontRight)
+ rendererIfc->setViewDirection(buw::eViewDirection::TopFrontRight);
+ buw::Image4b image_top_front_right = CaptureImage();
+ // Act (TopLeftBack)
+ rendererIfc->setViewDirection(buw::eViewDirection::TopLeftBack);
+ buw::Image4b image_top_left_back = CaptureImage();
+ // Act (TopRightBack)
+ rendererIfc->setViewDirection(buw::eViewDirection::TopRightBack);
+ buw::Image4b image_top_right_back = CaptureImage();
+ // Act (BackLeftBottom)
+ rendererIfc->setViewDirection(buw::eViewDirection::BackLeftBottom);
+ buw::Image4b image_back_left_bottom = CaptureImage();
+ // Act (RightBottomBack)
+ rendererIfc->setViewDirection(buw::eViewDirection::RightBottomBack);
+ buw::Image4b image_right_bottom_back = CaptureImage();
+
+ // uncomment following lines to also save the screen shot
+ /*
+ buw::storeImage(testPath("sectioned-solid-horizontal_front_left_bottom.png").string(), image_front_left_bottom);
+ buw::storeImage(testPath("sectioned-solid-horizontal_front_right_bottom.png").string(), image_front_right_bottom);
+ buw::storeImage(testPath("sectioned-solid-horizontal_top_left_front.png").string(), image_top_left_front);
+ buw::storeImage(testPath("sectioned-solid-horizontal_top_front_right.png").string(), image_top_front_right);
+ buw::storeImage(testPath("sectioned-solid-horizontal_top_left_back.png").string(), image_top_left_back);
+ buw::storeImage(testPath("sectioned-solid-horizontal_top_right_back.png").string(), image_top_right_back);
+ buw::storeImage(testPath("sectioned-solid-horizontal_back_left_bottom.png").string(), image_back_left_bottom);
+ buw::storeImage(testPath("sectioned-solid-horizontal_right_bottom_back.png").string(), image_right_bottom_back);
+ */
+
+ // Assert
+ EXPECT_EQ(image_front_left_bottom, expected_front_left_bottom);
+ EXPECT_EQ(image_front_right_bottom, expected_front_right_bottom);
+ EXPECT_EQ(image_top_left_front, expected_top_left_front);
+ EXPECT_EQ(image_top_front_right, expected_top_front_right);
+ EXPECT_EQ(image_top_left_back, expected_top_left_back);
+ EXPECT_EQ(image_top_right_back, expected_top_right_back);
+ EXPECT_EQ(image_back_left_bottom, expected_back_left_bottom);
+ EXPECT_EQ(image_right_bottom_back, expected_right_bottom_back);
+}
+
+