summaryrefslogtreecommitdiffstats
path: root/cppu
diff options
context:
space:
mode:
authorDaniel Boelzle <dbo@openoffice.org>2001-10-17 11:40:31 +0000
committerDaniel Boelzle <dbo@openoffice.org>2001-10-17 11:40:31 +0000
commit866f0e76d0d7317076cbb3fc1c7d128c4c54af3a (patch)
tree34789eee05052249c5b354f2db67b1403ddf9026 /cppu
parent#93291# TableFormula service (diff)
downloadcore-866f0e76d0d7317076cbb3fc1c7d128c4c54af3a.tar.gz
core-866f0e76d0d7317076cbb3fc1c7d128c4c54af3a.zip
#92951# added comprehensive type test
Diffstat (limited to 'cppu')
-rw-r--r--cppu/test/alignment/diagnose.h101
-rw-r--r--cppu/test/alignment/makefile.mk115
-rw-r--r--cppu/test/alignment/pass1.cxx266
3 files changed, 482 insertions, 0 deletions
diff --git a/cppu/test/alignment/diagnose.h b/cppu/test/alignment/diagnose.h
new file mode 100644
index 000000000000..d03f6a5011d1
--- /dev/null
+++ b/cppu/test/alignment/diagnose.h
@@ -0,0 +1,101 @@
+/*************************************************************************
+ *
+ * $RCSfile: diagnose.h,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: dbo $ $Date: 2001-10-17 12:40:31 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#ifndef __SHARE_H__
+#define __SHARE_H__
+
+#include <sal/types.h>
+#include <stdio.h>
+
+#if defined(__GNUC__) && defined(LINUX) && defined(INTEL)
+#define __ALIGNMENT__(s, n) __alignof__ (s)
+#else
+#define __ALIGNMENT__(s, n) n
+#endif
+
+#define OFFSET_OF( s, m ) ((sal_Size)((char *)&((s *)16)->m -16))
+
+#define BINTEST_VERIFY( c ) \
+ if (! (c)) { fprintf( stderr, "### binary compatibility test failed: " #c " [line %d]!!!\n", __LINE__ ); abort(); }
+
+#ifdef DEBUG
+
+#define BINTEST_VERIFYOFFSET( s, m, n ) \
+ fprintf( stderr, "> OFFSET_OF(" #s ", " #m ") = %d\n", OFFSET_OF(s, m) ); \
+ if (OFFSET_OF(s, m) != n) { fprintf( stderr, "### OFFSET_OF(" #s ", " #m ") = %d instead of expected %d!!!\n", OFFSET_OF(s, m), n ); abort(); }
+#define BINTEST_VERIFYSIZE( s, n ) \
+ fprintf( stderr, "> sizeof (" #s ") = %d\n", sizeof(s) ); \
+ if (sizeof(s) != n) { fprintf( stderr, "### sizeof(" #s ") = %d instead of expected %d!!!\n", sizeof(s), n ); abort(); }
+#define BINTEST_VERIFYALIGNMENT( s, n ) \
+ fprintf( stderr, "> alignment of " #s " = %d\n", __ALIGNMENT__(s, n) ); \
+ if (__ALIGNMENT__(s, n) != n) { fprintf( stderr, "### alignment of " #s " = %d instead of expected %d!!!\n", __ALIGNMENT__(s, n), n ); abort(); }
+
+#else
+
+#define BINTEST_VERIFYOFFSET( s, m, n ) \
+ if (OFFSET_OF(s, m) != n) { fprintf( stderr, "### OFFSET_OF(" #s ", " #m ") = %d instead of expected %d!!!\n", OFFSET_OF(s, m), n ); abort(); }
+#define BINTEST_VERIFYSIZE( s, n ) \
+ if (sizeof(s) != n) { fprintf( stderr, "### sizeof(" #s ") = %d instead of expected %d!!!\n", sizeof(s), n ); abort(); }
+#define BINTEST_VERIFYALIGNMENT( s, n ) \
+ if (__ALIGNMENT__(s, n) != n) { fprintf( stderr, "### alignment of " #s " = %d instead of expected %d!!!\n", __ALIGNMENT__(s, n), n ); abort(); }
+
+#endif
+
+#endif
diff --git a/cppu/test/alignment/makefile.mk b/cppu/test/alignment/makefile.mk
new file mode 100644
index 000000000000..c0ec48c96072
--- /dev/null
+++ b/cppu/test/alignment/makefile.mk
@@ -0,0 +1,115 @@
+#*************************************************************************
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.1 $
+#
+# last change: $Author: dbo $ $Date: 2001-10-17 12:40:31 $
+#
+# The Contents of this file are made available subject to the terms of
+# either of the following licenses
+#
+# - GNU Lesser General Public License Version 2.1
+# - Sun Industry Standards Source License Version 1.1
+#
+# Sun Microsystems Inc., October, 2000
+#
+# GNU Lesser General Public License Version 2.1
+# =============================================
+# Copyright 2000 by Sun Microsystems, Inc.
+# 901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1, as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+#
+# Sun Industry Standards Source License Version 1.1
+# =================================================
+# The contents of this file are subject to the Sun Industry Standards
+# Source License Version 1.1 (the "License"); You may not use this file
+# except in compliance with the License. You may obtain a copy of the
+# License at http://www.openoffice.org/license.html.
+#
+# Software provided under this License is provided on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+# See the License for the specific provisions governing your rights and
+# obligations concerning the Software.
+#
+# The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+#
+# Copyright: 2000 by Sun Microsystems, Inc.
+#
+# All Rights Reserved.
+#
+# Contributor(s): _______________________________________
+#
+#
+#
+#*************************************************************************
+
+#
+# build /test first, then /test/alignment_tests
+#
+
+PRJ=..$/..
+PRJNAME=cppu
+TARGET=alignment
+LIBTARGET=NO
+TARGETTYPE=CUI
+ENABLE_EXCEPTIONS=TRUE
+NO_BSYMBOLIC=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : svpre.mk
+.INCLUDE : settings.mk
+.INCLUDE : sv.mk
+
+# --- Files --------------------------------------------------------
+
+UNOUCRDEP=$(BIN)$/testcppu.rdb
+UNOUCRRDB=$(BIN)$/testcppu.rdb
+UNOUCROUT=$(INCCOM)$/test$/alignment
+INCPRE+=$(INCCOM)$/test -I$(INCCOM)$/test$/alignment -I$(PRJ)$/test$/alignment
+
+DEPOBJFILES= \
+ $(OBJ)$/pass1.obj \
+ $(OBJ)$/pass2.obj
+
+APP1OBJS = $(OBJ)$/pass1.obj
+APP1STDLIBS += $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB)
+APP1TARGET = pass1
+
+APP2OBJS = $(OBJ)$/pass2.obj
+#APP2STDLIBS += $(CPPUHELPERLIB) $(CPPULIB) $(SALLIB)
+APP2TARGET = pass2
+
+# --- Targets ------------------------------------------------------
+
+.IF "$(depend)" == ""
+ALLTAR: execute_pass2
+.ELSE
+ALL: ALLDEP
+.ENDIF
+
+.INCLUDE : target.mk
+
+$(MISC)$/pass2.cxx: $(APP1TARGETN)
+ +cppumaker @$(mktmp $(CPPUMAKERFLAGS) -BUCR -O$(UNOUCROUT) $(foreach,c,$(shell $(APP1TARGETN) -env:UNO_TYPES={$(subst,\,\\ $(UNOUCRRDB))} $(subst,\,\\ $(MISC)$/pass2.cxx) dump_types) -T$c) $(UNOUCRRDB))
+
+execute_pass2: $(APP2TARGETN)
+ $(APP2TARGETN)
+
diff --git a/cppu/test/alignment/pass1.cxx b/cppu/test/alignment/pass1.cxx
new file mode 100644
index 000000000000..d277d125ecfc
--- /dev/null
+++ b/cppu/test/alignment/pass1.cxx
@@ -0,0 +1,266 @@
+/*************************************************************************
+ *
+ * $RCSfile: pass1.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: dbo $ $Date: 2001-10-17 12:40:31 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#include <stdio.h>
+#include <vector>
+
+#include <rtl/string.hxx>
+#include <rtl/strbuf.hxx>
+#include <rtl/bootstrap.hxx>
+#include <rtl/process.h>
+
+#include <registry/reflread.hxx>
+
+// starting the executable:
+// -env:UNO_CFG_URL=local;<absolute_path>..\\..\\test\\cfg_data;<absolute_path>\\cfg_update
+// -env:UNO_TYPES=cpputest.rdb
+
+#include <cppuhelper/bootstrap.hxx>
+
+#include <com/sun/star/lang/XComponent.hpp>
+
+#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
+#define OSTR(x) ::rtl::OUStringToOString( x, RTL_TEXTENCODING_ASCII_US )
+
+
+using namespace ::cppu;
+using namespace ::rtl;
+using namespace ::osl;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+
+static void find_all_structs(
+ Reference< registry::XRegistryKey > const & xKey,
+ ::std::vector< OUString > * pNames )
+{
+ static RegistryTypeReaderLoader s_loader;
+ OSL_VERIFY( s_loader.isLoaded() );
+
+ if (xKey.is() && xKey->isValid())
+ {
+ if (xKey->getValueType() == registry::RegistryValueType_BINARY)
+ {
+ Sequence< sal_Int8 > aBytes( xKey->getBinaryValue() );
+ RegistryTypeReader aReader(
+ s_loader, (const sal_uInt8 *)aBytes.getConstArray(),
+ aBytes.getLength(), sal_False );
+
+ switch (aReader.getTypeClass())
+ {
+ case RT_TYPE_EXCEPTION:
+ case RT_TYPE_STRUCT:
+ pNames->push_back( aReader.getTypeName().replace( '/', '.' ) );
+ break;
+ }
+ }
+
+ Sequence< Reference< registry::XRegistryKey > > keys( xKey->openKeys() );
+ Reference< registry::XRegistryKey > const * pKeys = keys.getConstArray();
+ for ( sal_Int32 nPos = keys.getLength(); nPos--; )
+ {
+ find_all_structs( pKeys[ nPos ], pNames );
+ }
+ }
+}
+
+static OString makeIncludeName( OUString const & name ) SAL_THROW( () )
+{
+ return OSTR(name.replace( '.', '/' ));
+}
+static OString makeCppName( OUString const & name ) SAL_THROW( () )
+{
+ OStringBuffer buf( 64 );
+ OString str( OSTR(name) );
+ sal_Int32 n = 0;
+ do
+ {
+ buf.append( str.getToken( 0, '.', n ) );
+ if (n >= 0)
+ buf.append( "::" );
+ }
+ while (n >= 0);
+ return buf.makeStringAndClear();
+}
+
+//==================================================================================================
+int SAL_CALL main( int, char const ** )
+{
+ sal_Int32 argc = rtl_getAppCommandArgCount();
+ if (argc < 1)
+ {
+ fprintf( stderr, "usage: pass1 pass2_source [typelist_to_stdout]\n" );
+ return 1;
+ }
+
+ try
+ {
+ // determine types rdb
+ OUString rdb_name;
+ Bootstrap bootstrap;
+ if (!bootstrap.getFrom( OUSTR("UNO_TYPES"), rdb_name ) || !rdb_name.getLength())
+ {
+ fprintf(
+ stderr,
+ "### no UNO_TYPES registry found!!!\n\n"
+ "usage: pass1 pass2_source [typelist_to_stdout]\n" );
+ return 1;
+ }
+
+ Reference< XComponentContext > xContext( defaultBootstrap_InitialComponentContext() );
+
+ // read out all struct names from given registry
+ Reference< registry::XSimpleRegistry > xSimReg( createSimpleRegistry() );
+ OSL_ASSERT( xSimReg.is() );
+ xSimReg->open( rdb_name, sal_True, sal_False );
+ OSL_ASSERT( xSimReg->isValid() );
+ Reference< registry::XRegistryKey > xKey( xSimReg->getRootKey() );
+ OSL_ASSERT( xKey.is() && xKey->isValid() );
+
+ ::std::vector< OUString > names;
+ names.reserve( 128 );
+ find_all_structs( xKey->openKey( OUSTR("UCR") ), &names );
+
+ OUString fileName;
+ OSL_VERIFY( osl_Process_E_None == rtl_getAppCommandArg( 0, &fileName.pData ) );
+ bool bDumpStdOut = (argc > 1);
+
+ // generate pass2 output file [and type list]
+ OString str( OSTR(fileName) );
+ FILE * hPass2 = fopen( str.getStr(), "w" );
+ OSL_ASSERT( hPass2 );
+
+ size_t nPos;
+ for ( nPos = names.size(); nPos--; )
+ {
+ OUString const & name = names[ nPos ];
+ if (bDumpStdOut)
+ {
+ // type name on stdout
+ OString str( OSTR(name) );
+ fprintf( stdout, "%s\n", str.getStr() );
+ }
+ // all includes
+ OString includeName( makeIncludeName( name ) );
+ fprintf( hPass2, "#include <%s.hdl>\n", includeName.getStr() );
+ }
+ // include diagnose.h
+ fprintf(
+ hPass2,
+ "\n#include <diagnose.h>\n\n"
+ "int SAL_CALL main( int argc, char const * argv[] )\n{\n" );
+ // generate all type checks
+ for ( nPos = names.size(); nPos--; )
+ {
+ OUString const & name = names[ nPos ];
+ typelib_TypeDescription * pTD = 0;
+ typelib_typedescription_getByName( &pTD, name.pData );
+ if (pTD)
+ {
+ if (! pTD->bComplete)
+ {
+ typelib_typedescription_complete( &pTD );
+ }
+ typelib_CompoundTypeDescription * pCTD = (typelib_CompoundTypeDescription *)pTD;
+
+ OString cppName( makeCppName( name ) );
+ fprintf(
+ hPass2, "\tBINTEST_VERIFYSIZE( %s, %d );\n",
+ cppName.getStr(), pTD->nSize );
+ fprintf(
+ hPass2, "\tBINTEST_VERIFYALIGNMENT( %s, %d );\n",
+ cppName.getStr(), pTD->nAlignment );
+ // offset checks
+ for ( sal_Int32 nPos = pCTD->nMembers; nPos--; )
+ {
+ OString memberName( OSTR(pCTD->ppMemberNames[ nPos ]) );
+ fprintf(
+ hPass2, "\tBINTEST_VERIFYOFFSET( %s, %s, %d );\n",
+ cppName.getStr(), memberName.getStr(), pCTD->pMemberOffsets[ nPos ] );
+ }
+ typelib_typedescription_release( pTD );
+ }
+ else
+ {
+ OString str( OSTR(name) );
+ fprintf( stderr, "### cannot dump type %s!!!\n", str.getStr() );
+ }
+ }
+ fprintf(
+ hPass2,
+ "\n\tfprintf( stdout, \"> alignment test succeeded.\\n\" );\n"
+ "\treturn 0;\n}\n\n" );
+ fclose( hPass2 );
+
+ Reference< lang::XComponent > xComp( xContext, UNO_QUERY );
+ if (xComp.is())
+ {
+ xComp->dispose();
+ }
+ return 0;
+ }
+ catch (Exception & exc)
+ {
+ OString str( OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US ) );
+ ::fprintf( stderr, "# caught exception: %s\n", str.getStr() );
+ return 1;
+ }
+}