def test_constructor(self):
        """
        Test constructor with different parameters to ensure
        that symbols and symbol directories are handled correctly.
        """
        ## get number of symbols in symbols directory
        symbols = set()
        for dummy, dummy, filenames in os.walk('upconvert/library/geda'):
            for filename in filenames:
                if filename.endswith('.sym'):
                    symbols.add(filename)

        geda_parser = GEDA()
        self.assertEquals(len(geda_parser.known_symbols), len(symbols))

        geda_parser = GEDA([
            './test/geda/simple_example/symbols',
            '/invalid/dir/gEDA',
        ])

        self.assertEquals(len(geda_parser.known_symbols), len(symbols))
        self.assertEquals(geda_parser.known_symbols['opamp'],
                          './test/geda/simple_example/symbols/opamp.sym')

        geda_parser = GEDA([
            'test/geda/simple_example/symbols',
            '/invalid/dir/gEDA',
        ])

        self.assertTrue('title-B' in geda_parser.known_symbols)

        geda_parser = GEDA()
        self.assertTrue('title-B' in geda_parser.known_symbols)
    def test_adding_license_text(self):
        """ Test adding license text to design from GEDAText """
        geda_text = GEDAText('BSD', attribute='use_license')
        parser = GEDA()
        design = upconvert.core.design.Design()
        parser.add_text_to_design(design, geda_text)

        self.assertEquals(design.design_attributes.metadata.license, 'BSD')
    def test_adding_attribute_to_design(self):
        """ Add regular attribute to design from GEDAText """
        geda_text = GEDAText('some text', attribute='test_attr')
        parser = GEDA()
        design = upconvert.core.design.Design()
        parser.add_text_to_design(design, geda_text)

        self.assertEquals(design.design_attributes.attributes['test_attr'],
                          'some text')
 def setUp(self):
     """
     Set up a new GEDA parser with simplified setting for easier
     testing. The scale factor is 10 and the origin is set to 
     (0, 0) for easier calculation of correct/converted values.
     """
     self.geda_parser = GEDA()
     ## for easier validation
     self.geda_parser.SCALE_FACTOR = 10
     self.geda_parser.set_offset(upconvert.core.shape.Point(0, 0))
    def test_parse_full(self):
        """
        Test parsing a complete schematic file generating OpenJSON.
        """
        self.geda_parser = GEDA([
            './test/geda/simple_example/symbols',
        ])
        design = self.geda_parser.parse(
            'test/geda/simple_example/simple_example.sch')
        self.assertEquals(len(design.nets), 2)

        net_names = [net.net_id for net in design.nets]
        self.assertEquals(
            sorted(net_names),
            sorted(['+_1', '-_In+']),
        )
    def test_parse_component_data(self):
        """ Tests parsing component data from symbol files and embedded
            sections.
        """
        self.geda_parser = GEDA([
            './test/geda/simple_example/symbols',
        ])

        fpath = open('test/geda/path.sch')
        component = self.geda_parser.parse_component_data(
            fpath, {
                'basename': 'test.sym',
            })
        fpath.close()

        self.assertEquals(component.name, 'test')
        self.assertEquals(len(component.symbols), 1)
        self.assertEquals(len(component.symbols[0].bodies), 1)
        self.assertEquals(len(component.symbols[0].bodies[0].shapes), 9)
 def test_create_new_geda_parser(self):
     """ Test creating an empty parser. """
     parser = GEDA()
     assert parser != None
    def test_parse_title_frame(self):
        """ Test parsing title frame components """
        title_frames = {
            'title-E': (44000, 34000),
            'title-bordered-E': (44000, 34000),
            'title-bordered-D': (34000, 22000),
            'title-bordered-A': (11000, 8500),
            'title-bordered-C': (22000, 17000),
            'title-bordered-B': (17000, 11000),
            'title-A0': (46800, 33100),
            'title-A1': (33100, 23300),
            'title-A2': (23300, 16500),
            'title-A3': (16500, 11600),
            'title-A4': (11600, 8200),
            'title-A0-2': (46800, 33100),
            'title-A1-2': (33100, 23300),
            'title-A2-2': (23300, 16500),
            'title-A3-2': (16500, 11600),
            'title-A4-2': (11600, 8200),
            'title-D': (34000, 22000),
            'title-B': (17000, 11000),
            'title-C': (22000, 17000),
            'title-A': (11000, 8500),
            'title-bordered-A4': (11600, 8200),
            'title-bordered-A1': (33100, 23300),
            'title-bordered-A0': (46800, 33100),
            'title-bordered-A3': (16500, 11600),
            'title-bordered-A2': (23300, 16500),
            'title-dg-1': (17000, 11000),
            'title-small-square': (7600, 6900),
            'titleblock': (7500, 1800),
            'titleblock1': (11000, 8500),
            'titleblock2': (22000, 17000),
            'titleblock3': (33000, 25500),
            'titleblock4': (44000, 34000),
            'title-B-nameOnEdge': (26600, 17000),
            'title-B-cibolo': (26600, 17000),
            'title-block': (7500, 1800),
        }

        params = {
            'x': 3200,
            'y': 3109,
        }

        geda_parser = GEDA()
        for name, filename in geda_parser.known_symbols.items():
            if name.startswith('title'):
                params['basename'] = name

                ## reset geda parser
                geda_parser.frame_width = 0
                geda_parser.frame_height = 0

                geda_parser.design = upconvert.core.design.Design()
                geda_parser._parse_title_frame(params)

                self.assertEquals(geda_parser.offset.x, params['x'])
                self.assertEquals(geda_parser.offset.y, params['y'])

                self.assertEquals(geda_parser.frame_width,
                                  title_frames[name][0])
                self.assertEquals(geda_parser.frame_height,
                                  title_frames[name][1])

        ## check that method does not break when invalid file is passed
        params['basename'] = 'invalid_symbol.sym'

        geda_parser = GEDA()
        geda_parser._parse_title_frame(params)

        self.assertEquals(geda_parser.offset.x, params['x'])
        self.assertEquals(geda_parser.offset.y, params['y'])

        ## check if default is set correctly
        self.assertEquals(geda_parser.frame_width, 46800)
        self.assertEquals(geda_parser.frame_height, 34000)
    def test_parse(self):
        """ Tests parsing valid and invalid schematic files. """
        self.geda_parser = GEDA([
            'test/geda/simple_example/symbols',
        ])

        invalid_sch = open('/tmp/invalid.sch', 'w')
        invalid_sch.write('C 18600 21500 1 0 0 EMBEDDED555-1')
        invalid_sch.close()
        self.assertRaises(GEDAError, self.geda_parser.parse,
                          '/tmp/invalid.sch')

        ## testing EMBEDDED component
        design = self.geda_parser.parse('./test/geda/embedded_component.sch')

        components = design.components.components  #test components dictionary
        self.assertEquals(components.keys(), ['EMBEDDEDbattery-1'])

        component = components['EMBEDDEDbattery-1']
        self.assertEquals(component.name, 'EMBEDDEDbattery-1')

        keys = ['p1x', 'p1y', 'p2x', 'p2y', 'num', 'seq', 'label', 'type']
        expected_pins = [
            dict(zip(keys, [0, 200, 200, 200, '1', 1, '+', 'pwr'])),
            dict(zip(keys, [700, 200, 500, 200, '2', 2, '-', 'pwr'])),
        ]
        for pin, expected_pin in zip(component.symbols[0].bodies[0].pins,
                                     expected_pins):
            self.assertEquals(pin.label.text, expected_pin['label'])
            ## test reversed pin order due to different handling in direction
            self.assertEquals(
                pin.p1.x, expected_pin['p2x'] / self.geda_parser.SCALE_FACTOR)
            self.assertEquals(
                pin.p1.y, expected_pin['p2y'] / self.geda_parser.SCALE_FACTOR)
            self.assertEquals(
                pin.p2.x, expected_pin['p1x'] / self.geda_parser.SCALE_FACTOR)
            self.assertEquals(
                pin.p2.y, expected_pin['p1y'] / self.geda_parser.SCALE_FACTOR)
            self.assertEquals(pin.pin_number, expected_pin['num'])

        ## testing referenced component
        design = self.geda_parser.parse('test/geda/component.sch')

        components = design.components.components  #test components dictionary
        self.assertEquals(components.keys(), ['battery-1'])

        component = components['battery-1']
        self.assertEquals(component.name, 'battery-1')

        keys = ['p1x', 'p1y', 'p2x', 'p2y', 'num', 'seq', 'label', 'type']
        expected_pins = [
            dict(zip(keys, [0, 200, 200, 200, '1', 1, '+', 'pwr'])),
            dict(zip(keys, [700, 200, 500, 200, '2', 2, '-', 'pwr'])),
        ]
        for pin, expected_pin in zip(component.symbols[0].bodies[0].pins,
                                     expected_pins):
            self.assertEquals(pin.label.text, expected_pin['label'])
            ## test reversed pin order due to different handling in direction
            self.assertEquals(
                pin.p1.x, expected_pin['p2x'] / self.geda_parser.SCALE_FACTOR)
            self.assertEquals(
                pin.p1.y, expected_pin['p2y'] / self.geda_parser.SCALE_FACTOR)
            self.assertEquals(
                pin.p2.x, expected_pin['p1x'] / self.geda_parser.SCALE_FACTOR)
            self.assertEquals(
                pin.p2.y, expected_pin['p1y'] / self.geda_parser.SCALE_FACTOR)
            self.assertEquals(pin.pin_number, expected_pin['num'])