/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ package org.squale.squalix.util.parser; import org.squale.squalecommon.SqualeTestCase; import org.squale.squalecommon.enterpriselayer.businessobject.component.ClassBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.MethodBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO; import org.squale.squalecommon.enterpriselayer.businessobject.component.PackageBO; /** * Test de parser Cpp */ public class CppParserTest extends SqualeTestCase { /** * Test de l'obtention du nom de la classe Les test comportent des noms de classe qualifi�es ou non qualifi�es ainsi * que l'usage de templates */ public void testgetClassName() { ProjectBO project = new ProjectBO( "projetTest" ); CppParser parser = new CppParser( project ); String className; StringBuffer context = new StringBuffer(); className = parser.geRelativeElementName( "vector<bool,allocator<bool>>::reference", context ); assertEquals( "reference", className ); assertEquals( "vector<bool,allocator<bool>>", context.toString() ); className = parser.geRelativeElementName( "locale::facet", context ); assertEquals( "facet", className ); assertEquals( "locale", context.toString() ); className = parser.geRelativeElementName( "char_traits<char>", context ); assertEquals( "char_traits<char>", className ); assertEquals( "", context.toString() ); className = parser.geRelativeElementName( "__rwstd::rw_traits<char,char_traits<char>>", context ); assertEquals( "rw_traits<char,char_traits<char>>", className ); assertEquals( "__rwstd", context.toString() ); className = parser.geRelativeElementName( "__rwstd::__string_ref<wchar_t,char_traits<wchar_t>,allocator<wchar_t>>", context ); assertEquals( "__string_ref<wchar_t,char_traits<wchar_t>,allocator<wchar_t>>", className ); assertEquals( "__rwstd", context.toString() ); className = parser.geRelativeElementName( "__rwstd::__rw_basis<wchar_t_*,basic_string<wchar_t,char_traits<wchar_t>,allocator<wchar_t>>::allocator_type>", context ); assertEquals( "__rw_basis<wchar_t_*,basic_string<wchar_t,char_traits<wchar_t>,allocator<wchar_t>>::allocator_type>", className ); assertEquals( "__rwstd", context.toString() ); } /** * Test de d�composition de classe */ public void testGetClass() { ProjectBO project = new ProjectBO( "projetTest" ); CppParser parser = new CppParser( project ); // Test sans namespace ClassBO cls = parser.getClass( "class" ); assertEquals( PackageBO.class, cls.getParent().getClass() ); assertEquals( ProjectBO.class, cls.getParent().getParent().getClass() ); // Test avec classe imbriqu�e parser.addKnownClass( "class" ); cls = parser.getClass( "class::nestedclass" ); assertEquals( ClassBO.class, cls.getParent().getClass() ); assertEquals( PackageBO.class, cls.getParent().getParent().getClass() ); assertEquals( ProjectBO.class, cls.getParent().getParent().getParent().getClass() ); // Test avec namespace cls = parser.getClass( "pkg::class" ); assertEquals( PackageBO.class, cls.getParent().getClass() ); assertEquals( ProjectBO.class, cls.getParent().getParent().getClass() ); } /** * Test de la m�thode getMethodName */ public void testGetMethodName() { ProjectBO project = new ProjectBO( "projetTest" ); CppParser parser = new CppParser( project ); String methodName; // M�thode simple methodName = parser.getMethodName( "length_error::length_error(const_string_&)" ); assertEquals( "length_error(const_string_&)", methodName ); // M�thode avec namespace methodName = parser.getMethodName( "namespace::length_error::length_error(const_string_&)" ); assertEquals( "length_error(const_string_&)", methodName ); // M�thode avec template methodName = parser.getMethodName( "char_traits<wchar_t>::compare(const_char_traits<wchar_t>::char_type_*,const_char_traits<wchar_t>::char_type_*,size_t)" ); assertEquals( "compare(const_char_traits<wchar_t>::char_type_*,const_char_traits<wchar_t>::char_type_*,size_t)", methodName ); } /** * Test de d�composition de m�thode */ public void testGetMethod() { ProjectBO project = new ProjectBO( "projetTest" ); CppParser parser = new CppParser( project ); // Test sans namespace MethodBO method = parser.getMethod( "class::method(int arg1, int arg2)", "file.C" ); assertEquals( ClassBO.class, method.getParent().getClass() ); assertEquals( PackageBO.class, method.getParent().getParent().getClass() ); assertEquals( ProjectBO.class, method.getParent().getParent().getParent().getClass() ); // Test d'une fonction method = parser.getMethod( "function(int arg1, int arg2)", "file.C" ); assertEquals( ClassBO.class, method.getParent().getClass() ); assertEquals( PackageBO.class, method.getParent().getParent().getClass() ); assertEquals( ProjectBO.class, method.getParent().getParent().getParent().getClass() ); // Test avec classe imbriqu�e parser.addKnownClass( "class" ); method = parser.getMethod( "class::nestedclass::method(int arg1, int arg2)", "file.C" ); assertEquals( ClassBO.class, method.getParent().getClass() ); assertEquals( ClassBO.class, method.getParent().getParent().getClass() ); assertEquals( PackageBO.class, method.getParent().getParent().getParent().getClass() ); assertEquals( ProjectBO.class, method.getParent().getParent().getParent().getParent().getClass() ); // Test avec namespace method = parser.getMethod( "pkg::class::method(int arg1, int arg2)", "file.C" ); assertEquals( ClassBO.class, method.getParent().getClass() ); assertEquals( PackageBO.class, method.getParent().getParent().getClass() ); assertEquals( ProjectBO.class, method.getParent().getParent().getParent().getClass() ); // Test avec un nom de m�thode mal form� method = parser.getMethod( "pkg::class::method#int arg1, int arg2)", "file.C" ); assertEquals( null, method ); } }