/**
* 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 );
}
}