class Test_1_AddressTestSetters(unittest.TestCase):
    def setUp(self):
        testlog.debug('Instantiate null address, address.setter list')
        self._address = Address(user_text)
        self._address_setters = [
            i for i in dict(
                inspect.getmembers(Address, predicate=inspect.ismethod))
            if i[:3] == 'set'
        ]
        #self._address_setters.remove('setAddressPositions')

    def tearDown(self):
        testlog.debug('Destroy null address')
        self._address = None
        self._address_setters = None

    def test10_instSetters(self):
        '''Tests that all the setters set a matching attribute i.e. setAttribute("X") -> self._Attribute = "X"'''
        #this no longer works since changing to full path attribute names eg _components_roadName
        return
        testlog.debug('Test_1.10 Instantiate all setters')
        for asttr in self._address_setters:
            aval = self._generateAttrVal(asttr)
            aname = self._generateAttrName(asttr)
            getattr(self._address, asttr)(aval)
            self.assertEqual(
                getattr(self._address, aname), aval,
                'set* : Setter {} not setting correct attribute value {}'.
                format(asttr, aval))

    #@unittest.skip("Test skipped awaiting finalisation of Address Class structure")
    def test30_checkPopulatedAddressChangeDict(self):
        '''Tests whether JSON object gets created correctly'''
        #this function has moved to addressfactory
        testlog.debug(
            'Test_1.30 Attributes set to match JSON sample and compare')
        #return True

        for asm in self._address_setters:
            if asm == 'setAddressPositions':
                getattr(self._address, asm)([
                    Position(),
                ])
                continue
            aval = self._generateAttrVal(asm)
            getattr(self._address, asm)(aval)
        self._address.setVersion(100)
        for at in (ActionType.ADD, ActionType.RETIRE, ActionType.UPDATE):
            jresult = AddressChangeFactory().convertAddress(self._address, at)
            self.assertEqual(
                jresult, getTestData(at),
                'JSON Address constructed incorrectly {}'.format(jresult))

    def test31_checkAddressDictNullRemoval(self):
        '''check whether JSON output is truncated correctly on null inputs'''
        pass

    def test32_checkAddressDictErrorRaisedOnNull(self):
        '''Check error raised if attempt to create JSON output on null address array'''
        pass


#------------------------------------------------------------------------------

    def _generateAttrVal(self, setmthd):
        s = self._special(setmthd)
        if s: return s
        setmthd = re.match('set_*(.*)', setmthd).group(1)
        return setmthd[:1].upper() + ''.join(
            [s for s in setmthd[1:] if ord(s) > 64 and ord(s) < 91])

    def _generateAttrName(self, setmthd):
        setmthd = re.match('set_*(.*)', setmthd).group(1)
        return '_' + setmthd[:1].lower() + setmthd[1:]

    def _special(self, meth):
        if meth == 'setObjectType': return 'Parcel'
        if meth == 'setAddressType': return 'Road'
        if meth == 'setLifecycle': return 'Current'
        return
class Test_1_AddressTestSetters(unittest.TestCase):
    
    def setUp(self): 
        testlog.debug('Instantiate null address, address.setter list')
        self._address = Address(user_text)
        self._address_setters = [i for i in dict(inspect.getmembers(Address, predicate=inspect.ismethod)) if i[:3]=='set']
        #self._address_setters.remove('setAddressPositions')

        
    def tearDown(self):
        testlog.debug('Destroy null address')
        self._address = None
        self._address_setters = None
        
        
    def test10_instSetters(self):
        '''Tests that all the setters set a matching attribute i.e. setAttribute("X") -> self._Attribute = "X"'''
        #this no longer works since changing to full path attribute names eg _components_roadName
        return
        testlog.debug('Test_1.10 Instantiate all setters')
        for asttr in self._address_setters:
            aval = self._generateAttrVal(asttr)
            aname = self._generateAttrName(asttr)
            getattr(self._address, asttr)(aval)
            self.assertEqual(getattr(self._address, aname), aval, 'set* : Setter {} not setting correct attribute value {}'.format(asttr,aval))
            

    #@unittest.skip("Test skipped awaiting finalisation of Address Class structure")
    def test30_checkPopulatedAddressChangeDict(self):
        '''Tests whether JSON object gets created correctly'''
        #this function has moved to addressfactory
        testlog.debug('Test_1.30 Attributes set to match JSON sample and compare')
        #return True

        for asm in self._address_setters:
            if asm == 'setAddressPositions':
                getattr(self._address, asm)([Position(),])
                continue
            aval = self._generateAttrVal(asm)
            getattr(self._address, asm)(aval)
        self._address.setVersion(100)
        for at in (ActionType.ADD,ActionType.RETIRE,ActionType.UPDATE):
            jresult = AddressChangeFactory().convertAddress(self._address,at)
            self.assertEqual(jresult, getTestData(at), 'JSON Address constructed incorrectly {}'.format(jresult))
        
    def test31_checkAddressDictNullRemoval(self):
        '''check whether JSON output is truncated correctly on null inputs'''
        pass
    
    def test32_checkAddressDictErrorRaisedOnNull(self):
        '''Check error raised if attempt to create JSON output on null address array'''
        pass
        
#------------------------------------------------------------------------------    
    def _generateAttrVal(self,setmthd):
        s = self._special(setmthd)
        if s: return s
        setmthd = re.match('set_*(.*)',setmthd).group(1)
        return setmthd[:1].upper()+''.join([s for s in setmthd[1:] if ord(s)>64 and ord(s)<91])
    
    def _generateAttrName(self,setmthd):
        setmthd = re.match('set_*(.*)',setmthd).group(1)
        return '_'+setmthd[:1].lower()+setmthd[1:]
    
    def _special(self,meth):
        if meth == 'setObjectType':return 'Parcel'
        if meth == 'setAddressType':return 'Road' 
        if meth == 'setLifecycle':return 'Current'
        return