main
John Lauer Publish 0.1.94 bca797f
"""The same child repeated inside one parent must never be flattened onto one placement."""
import unittest
from step_text import Step

HEADER="ISO-10303-21; HEADER; ENDSEC; DATA;\n"
TAIL="\nENDSEC; END-ISO-10303-21;"

def fixture(two=True, other_parent=False):
    s="""
#1=CARTESIAN_POINT('',(0.,0.,0.));
#2=DIRECTION('',(0.,0.,1.));
#3=DIRECTION('',(1.,0.,0.));
#4=AXIS2_PLACEMENT_3D('',#1,#2,#3);
#5=CARTESIAN_POINT('',(-2.,0.,0.));
#6=AXIS2_PLACEMENT_3D('',#5,#2,#3);
#7=CARTESIAN_POINT('',(2.,0.,0.));
#8=AXIS2_PLACEMENT_3D('',#7,#2,#3);
#9=CARTESIAN_POINT('',(0.,1.,0.));
#10=SHAPE_REPRESENTATION('',(#4,#9),#99);
#11=SHAPE_REPRESENTATION('',(#4,#6,#8),#99);
#12=ITEM_DEFINED_TRANSFORMATION('','',#4,#6);
#13=(REPRESENTATION_RELATIONSHIP('','',#10,#11) REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#12) SHAPE_REPRESENTATION_RELATIONSHIP());
#99=GEOMETRIC_REPRESENTATION_CONTEXT(3);
"""
    if two:
        s+="""
#14=ITEM_DEFINED_TRANSFORMATION('','',#4,#8);
#15=(REPRESENTATION_RELATIONSHIP('','',#10,#PARENT) REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#14) SHAPE_REPRESENTATION_RELATIONSHIP());
""".replace('#PARENT','#16' if other_parent else '#11')
        if other_parent:s+="#16=SHAPE_REPRESENTATION('',(#4,#8),#99);"
    return Step(HEADER+s+TAIL)

class Instances(unittest.TestCase):
    def test_same_parent_occurrences_fail_without_mutation(self):
        s=fixture();before=s.text
        with self.assertRaisesRegex(SystemExit,'instanced'):s.flatten()
        self.assertEqual(before,s.text)
    def test_different_parent_occurrences_fail_without_mutation(self):
        s=fixture(other_parent=True);before=s.text
        with self.assertRaisesRegex(SystemExit,'instanced'):s.flatten()
        self.assertEqual(before,s.text)
    def test_single_occurrence_still_bakes_placement(self):
        s=fixture(two=False);s.flatten()
        self.assertEqual(s.coords(9),[-2.,1.,0.])
        before=s.text;s.flatten();self.assertEqual(s.coords(9),[-2.,1.,0.])

if __name__=='__main__':unittest.main()