[pygccxml-commit] SF.net SVN: pygccxml: [164] pygccxml_dev/unittests
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-05-25 08:05:21
|
Revision: 164 Author: roman_yakovenko Date: 2006-05-25 01:05:00 -0700 (Thu, 25 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=164&view=rev Log Message: ----------- fixing critical bug with unnamed enums. If you have 2 unnamed enums within same scope, only one enum is reported Modified Paths: -------------- pygccxml_dev/pygccxml/parser/project_reader.py pygccxml_dev/unittests/data/core_cache.hpp pygccxml_dev/unittests/test_all.py Added Paths: ----------- pygccxml_dev/unittests/data/unnamed_enums_bug1.hpp pygccxml_dev/unittests/data/unnamed_enums_bug2.hpp pygccxml_dev/unittests/unnamed_enums_bug_tester.py Modified: pygccxml_dev/pygccxml/parser/project_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/project_reader.py 2006-05-25 06:54:11 UTC (rev 163) +++ pygccxml_dev/pygccxml/parser/project_reader.py 2006-05-25 08:05:00 UTC (rev 164) @@ -324,7 +324,8 @@ def _join_namespaces( self, nsref ): assert isinstance( nsref, pygccxml.declarations.namespace_t ) ddhash = {} # decl.__class__ : { decl.name : [decls] } double declaration hash - decls = [] + decls = [] + for decl in nsref.declarations: if not ddhash.has_key( decl.__class__ ): ddhash[ decl.__class__ ] = { decl._name : [ decl ] } @@ -339,7 +340,12 @@ if decl not in joined_decls[decl._name]: #functions has overloading decls.append( decl ) - joined_decls[decl._name].append( decl ) + joined_decls[decl._name].append( decl ) + elif isinstance( decl, pygccxml.declarations.enumeration_t ): + #unnamed enums + if not decl.name and decl not in joined_decls[decl._name]: + decls.append( decl ) + joined_decls[decl._name].append( decl ) else: assert 1 == len( joined_decls[ decl._name ] ) if isinstance( decl, pygccxml.declarations.namespace_t ): Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2006-05-25 06:54:11 UTC (rev 163) +++ pygccxml_dev/unittests/data/core_cache.hpp 2006-05-25 08:05:00 UTC (rev 164) @@ -22,3 +22,4 @@ #endif//__core_cache_hpp__ +//touch \ No newline at end of file Added: pygccxml_dev/unittests/data/unnamed_enums_bug1.hpp =================================================================== --- pygccxml_dev/unittests/data/unnamed_enums_bug1.hpp (rev 0) +++ pygccxml_dev/unittests/data/unnamed_enums_bug1.hpp 2006-05-25 08:05:00 UTC (rev 164) @@ -0,0 +1,13 @@ +// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __unnamed_enums_bug1_hpp__ +#define __unnamed_enums_bug1_hpp__ + +enum{ x1, x2 }; +enum{ y1, y2 }; + + +#endif//__unnamed_enums_bug1_hpp__ Added: pygccxml_dev/unittests/data/unnamed_enums_bug2.hpp =================================================================== --- pygccxml_dev/unittests/data/unnamed_enums_bug2.hpp (rev 0) +++ pygccxml_dev/unittests/data/unnamed_enums_bug2.hpp 2006-05-25 08:05:00 UTC (rev 164) @@ -0,0 +1,11 @@ +// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __unnamed_enums_bug2_hpp__ +#define __unnamed_enums_bug2_hpp__ + +enum{ z1, z2 }; + +#endif//__unnamed_enums_bug2_hpp__ \ No newline at end of file Modified: pygccxml_dev/unittests/test_all.py =================================================================== --- pygccxml_dev/unittests/test_all.py 2006-05-25 06:54:11 UTC (rev 163) +++ pygccxml_dev/unittests/test_all.py 2006-05-25 08:05:00 UTC (rev 164) @@ -32,7 +32,8 @@ import cache_enums_tester import decl_printer_tester import typedefs_tester -import demangled_tester +import demangled_tester +import unnamed_enums_bug_tester def create_suite(): testers = [ @@ -64,7 +65,8 @@ , cache_enums_tester , decl_printer_tester , typedefs_tester - , demangled_tester + , demangled_tester + , unnamed_enums_bug_tester ] main_suite = unittest.TestSuite() Added: pygccxml_dev/unittests/unnamed_enums_bug_tester.py =================================================================== --- pygccxml_dev/unittests/unnamed_enums_bug_tester.py (rev 0) +++ pygccxml_dev/unittests/unnamed_enums_bug_tester.py 2006-05-25 08:05:00 UTC (rev 164) @@ -0,0 +1,95 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import unittest +import autoconfig +import parser_test_case + +from pygccxml import utils +from pygccxml import parser +from pygccxml import declarations + +class source_reader_tester_t( parser_test_case.parser_test_case_t ): + def __init__(self, *args ): + parser_test_case.parser_test_case_t.__init__( self, *args ) + self.header = 'unnamed_enums_bug1.hpp' + self.global_ns = None + + def setUp(self): + if not self.global_ns: + reader = parser.source_reader_t( self.config ) + decls = reader.read_file( self.header ) + self.global_ns = declarations.get_global_namespace( decls ) + self.global_ns.init_optimizer() + + def test( self ): + names = [] + enums = self.global_ns.enums() + map( lambda enum: names.extend( enum.values.keys() ), enums ) + self.failUnless( len( names ) == 4 ) + self.failUnless( 'x1' in names ) + self.failUnless( 'x2' in names ) + self.failUnless( 'y1' in names ) + self.failUnless( 'y2' in names ) + +class project_reader_1_tester_t( parser_test_case.parser_test_case_t ): + def __init__(self, *args ): + parser_test_case.parser_test_case_t.__init__( self, *args ) + self.header = 'unnamed_enums_bug1.hpp' + self.global_ns = None + + def setUp(self): + if not self.global_ns: + decls = parser.parse( [self.header], self.config ) + self.global_ns = declarations.get_global_namespace( decls ) + self.global_ns.init_optimizer() + + def test( self ): + names = [] + enums = self.global_ns.enums() + map( lambda enum: names.extend( enum.values.keys() ), enums ) + self.failUnless( len( names ) == 4 ) + self.failUnless( 'x1' in names ) + self.failUnless( 'x2' in names ) + self.failUnless( 'y1' in names ) + self.failUnless( 'y2' in names ) + +class project_reader_3_tester_t( parser_test_case.parser_test_case_t ): + def __init__(self, *args ): + parser_test_case.parser_test_case_t.__init__( self, *args ) + self.headers = ['unnamed_enums_bug1.hpp', 'unnamed_enums_bug2.hpp', 'unnamed_enums_bug1.hpp' ] + self.global_ns = None + + def setUp(self): + if not self.global_ns: + decls = parser.parse( self.headers, self.config ) + self.global_ns = declarations.get_global_namespace( decls ) + self.global_ns.init_optimizer() + + def test( self ): + names = [] + enums = self.global_ns.enums() + map( lambda enum: names.extend( enum.values.keys() ), enums ) + self.failUnless( len( names ) == 6 ) + self.failUnless( 'x1' in names ) + self.failUnless( 'x2' in names ) + self.failUnless( 'y1' in names ) + self.failUnless( 'y2' in names ) + self.failUnless( 'z1' in names ) + self.failUnless( 'z2' in names ) + + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(source_reader_tester_t)) + suite.addTest( unittest.makeSuite(project_reader_1_tester_t)) + suite.addTest( unittest.makeSuite(project_reader_3_tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |