def setUp(self):
        unittest.TestCase.setUp(self)

        self.h = HorizontalLayersXMLHandler()

        self.obj1 = HorizontalLayers(Material.pure(29), None, 1.1, 2.2)
        self.obj1.add_layer(Material.pure(30), 123.456)
        self.obj1.add_layer(Material.pure(31), 456.789)

        self.obj2 = HorizontalLayers()
        self.obj2.add_layer(Material.pure(30), 123.456)
        self.obj2.add_layer(VACUUM, 50.0)
        self.obj2.add_layer(Material.pure(31), 456.789)

        etree.register_namespace('mc', 'http://pymontecarlo.sf.net')
        source = BytesIO(b'<mc:horizontalLayers xmlns:mc="http://pymontecarlo.sf.net" rotation="2.2" tilt="1.1"><materials><mc:material _index="1" density="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></composition></mc:material><mc:material _index="2" density="5910.0" name="Gallium"><composition><element weightFraction="1.0" z="31" /></composition></mc:material><mc:material _index="3" density="8960.0" name="Copper"><composition><element weightFraction="1.0" z="29" /></composition></mc:material></materials><substrate material="3" /><layers><layer material="1" thickness="123.456" /><layer material="2" thickness="456.789" /></layers></mc:horizontalLayers>')
        self.element1 = etree.parse(source).getroot()

        etree.register_namespace('mc', 'http://pymontecarlo.sf.net')
        source = BytesIO(b'<mc:horizontalLayers xmlns:mc="http://pymontecarlo.sf.net" rotation="0.0" tilt="0.0"><materials><mc:material _index="1" density="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></composition></mc:material><mc:material _index="2" density="5910.0" name="Gallium"><composition><element weightFraction="1.0" z="31" /></composition></mc:material></materials><layers><layer material="1" thickness="123.456" /><layer material="0" thickness="50.0" /><layer material="2" thickness="456.789" /></layers></mc:horizontalLayers>')
        self.element2 = etree.parse(source).getroot()
class TestHorizontalLayersXMLHandler(unittest.TestCase):

    def setUp(self):
        unittest.TestCase.setUp(self)

        self.h = HorizontalLayersXMLHandler()

        self.obj1 = HorizontalLayers(Material.pure(29), None, 1.1, 2.2)
        self.obj1.add_layer(Material.pure(30), 123.456)
        self.obj1.add_layer(Material.pure(31), 456.789)

        self.obj2 = HorizontalLayers()
        self.obj2.add_layer(Material.pure(30), 123.456)
        self.obj2.add_layer(VACUUM, 50.0)
        self.obj2.add_layer(Material.pure(31), 456.789)

        etree.register_namespace('mc', 'http://pymontecarlo.sf.net')
        source = BytesIO(b'<mc:horizontalLayers xmlns:mc="http://pymontecarlo.sf.net" rotation="2.2" tilt="1.1"><materials><mc:material _index="1" density="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></composition></mc:material><mc:material _index="2" density="5910.0" name="Gallium"><composition><element weightFraction="1.0" z="31" /></composition></mc:material><mc:material _index="3" density="8960.0" name="Copper"><composition><element weightFraction="1.0" z="29" /></composition></mc:material></materials><substrate material="3" /><layers><layer material="1" thickness="123.456" /><layer material="2" thickness="456.789" /></layers></mc:horizontalLayers>')
        self.element1 = etree.parse(source).getroot()

        etree.register_namespace('mc', 'http://pymontecarlo.sf.net')
        source = BytesIO(b'<mc:horizontalLayers xmlns:mc="http://pymontecarlo.sf.net" rotation="0.0" tilt="0.0"><materials><mc:material _index="1" density="7140.0" name="Zinc"><composition><element weightFraction="1.0" z="30" /></composition></mc:material><mc:material _index="2" density="5910.0" name="Gallium"><composition><element weightFraction="1.0" z="31" /></composition></mc:material></materials><layers><layer material="1" thickness="123.456" /><layer material="0" thickness="50.0" /><layer material="2" thickness="456.789" /></layers></mc:horizontalLayers>')
        self.element2 = etree.parse(source).getroot()

    def tearDown(self):
        unittest.TestCase.tearDown(self)

    def testcan_parse(self):
        self.assertTrue(self.h.can_parse(self.element1))
        self.assertTrue(self.h.can_parse(self.element2))

    def testparse(self):
        # Horizontal layers 1
        obj = self.h.parse(self.element1)

        self.assertTrue(obj.has_substrate())
        self.assertEqual('Copper', str(obj.substrate.material))

        self.assertEqual(2, len(obj.layers))
        self.assertEqual('Zinc', str(obj.layers[0].material))
        self.assertAlmostEqual(123.456, obj.layers[0].thickness_m)
        self.assertEqual('Gallium', str(obj.layers[1].material))
        self.assertAlmostEqual(456.789, obj.layers[1].thickness_m)

        self.assertAlmostEqual(1.1, obj.tilt_rad, 4)
        self.assertAlmostEqual(2.2, obj.rotation_rad, 4)

        # Horizontal layers 2
        obj = self.h.parse(self.element2)

        self.assertFalse(obj.has_substrate())

        self.assertEqual(3, len(obj.layers))
        self.assertEqual('Zinc', str(obj.layers[0].material))
        self.assertAlmostEqual(123.456, obj.layers[0].thickness_m)
        self.assertEqual('Vacuum', str(obj.layers[1].material))
        self.assertAlmostEqual(50.0, obj.layers[1].thickness_m)
        self.assertEqual('Gallium', str(obj.layers[2].material))
        self.assertAlmostEqual(456.789, obj.layers[2].thickness_m)

        self.assertAlmostEqual(0.0, obj.tilt_rad, 4)
        self.assertAlmostEqual(0.0, obj.rotation_rad, 4)

    def testcan_convert(self):
        self.assertTrue(self.h.can_convert(self.obj1))
        self.assertTrue(self.h.can_convert(self.obj2))

    def testconvert(self):
        # Horizontal layers 1
        element = self.h.convert(self.obj1)

        self.assertAlmostEqual(1.1, float(element.get('tilt')), 4)
        self.assertAlmostEqual(2.2, float(element.get('rotation')), 4)
        self.assertEqual(3, len(list(element.find('materials'))))
        self.assertEqual(2, len(list(element.find('layers'))))

        # Horizontal layers 2
        element = self.h.convert(self.obj2)

        self.assertAlmostEqual(0.0, float(element.get('tilt')), 4)
        self.assertAlmostEqual(0.0, float(element.get('rotation')), 4)
        self.assertEqual(2, len(list(element.find('materials'))))
        self.assertEqual(3, len(list(element.find('layers'))))