From: <je...@us...> - 2008-07-18 23:31:48
|
Revision: 10680 http://swig.svn.sourceforge.net/swig/?rev=10680&view=rev Author: jezabek Date: 2008-07-18 23:31:46 +0000 (Fri, 18 Jul 2008) Log Message: ----------- Actually add the test suite. Added Paths: ----------- branches/gsoc2008-jezabek/Examples/com/ branches/gsoc2008-jezabek/Examples/com/check.list branches/gsoc2008-jezabek/Examples/test-suite/com/ branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in branches/gsoc2008-jezabek/Examples/test-suite/com/README branches/gsoc2008-jezabek/Examples/test-suite/com/sizet_runme.c Added: branches/gsoc2008-jezabek/Examples/com/check.list =================================================================== --- branches/gsoc2008-jezabek/Examples/com/check.list (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/check.list 2008-07-18 23:31:46 UTC (rev 10680) @@ -0,0 +1 @@ +# see top-level Makefile.in Added: branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in (rev 0) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-07-18 23:31:46 UTC (rev 10680) @@ -0,0 +1,84 @@ +####################################################################### +# Makefile for C# test-suite +####################################################################### + +LANGUAGE = com +SCRIPTSUFFIX = _runme.c +COM_CYGPATH_W = @COM_CYGPATH_W@ +COM_EXEC_SUFFIX = @COM_EXEC_SUFFIX@ +COM_RUNTOOL = @COM_RUNTOOL@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@/.. +top_builddir = @top_builddir@/.. + +CPP_TEST_CASES = + +include $(srcdir)/../common.mk + +# Overridden variables here +# SWIGOPT += -namespace $*Namespace $(SWIGOPTSPECIAL) + +# Rules for the different types of tests +%.cpptest: + $(setup) + +(cd $* && $(swig_and_compile_cpp)) + +(cd $* && $(register_component)) + +$(run_testcase) + +(cd $* && $(unregister_component)) + +%.ctest: + $(setup) + +(cd $* && $(swig_and_compile_c)) + +(cd $* && $(register_component)) + +$(run_testcase) + +(cd $* && $(unregister_component)) + +%.multicpptest: + $(setup) + +(cd $* && $(swig_and_compile_multi_cpp)) + +(cd $* && $(register_component)) + +$(run_testcase) + +(cd $* && $(unregister_component)) + +# Makes a directory for the testcase if it does not exist +setup = \ + if [ -f $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ + echo "$(ACTION)ing testcase $* (with run test) under $(LANGUAGE)" ; \ + else \ + echo "$(ACTION)ing testcase $* under $(LANGUAGE)" ; \ + fi; \ + if [ ! -d $* ]; then \ + mkdir $*; \ + fi; + +# Calls Dll[Un]RegisterServer on created component +register_component = \ + regsvr32 $*.dll$(COM_EXEC_SUFFIX); + +unregister_component = \ + regsvr32 /u $*.dll$(COM_EXEC_SUFFIX); + +# Compiles COM files then runs the testcase. A testcase is only run if +# a file is found which has _runme.c appended after the testcase name. +run_testcase = \ + if [ -f $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then ( \ + $(MAKE) -f $*/$(top_builddir)/$(EXAMPLES)/Makefile \ + TARGET='$*_runme.exe' \ + COMSRCS=`$(COM_CYGPATH_W) $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX)` \ + com_compile && \ + $(RUNTOOL) $(COM_RUNTOOL) $*_runme.exe$(COM_EXEC_SUFFIX); ) \ + else ( \ + cd $* && \ + $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile \ + TARGET='$*.dll' \ + COMSRCS='*.c' com_compile; ); \ + fi; + +# Clean: remove testcase directories +%.clean: + @if [ -d $* ]; then \ + rm -rf $*; \ + fi; + +clean: + @rm -f *.exe$(COM_EXEC_SUFFIX) *.dll$(COM_EXEC_SUFFIX) Added: branches/gsoc2008-jezabek/Examples/test-suite/com/README =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/README (rev 0) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/README 2008-07-18 23:31:46 UTC (rev 10680) @@ -0,0 +1,42 @@ +SWIG testsuite README file +-------------------------- + +This testsuite is here to ensure SWIG can handle a wide range of c/c++ +syntax. The testsuite comprises many testcases in this directory. Each +test case is tested under each of the language modules thereby +thoroughly testing all of SWIG. It ensures that each of the language +modules are at a similar standard. + +Those modules that support shadow classes run the tests producing +shadow classes to test the full language module functionality. + +Some test cases need a runtime test. These need implementing in each +of the language modules. The language modules look for a file in the +language specific test-suite directory which has _runme appended after +the testcase name. If one is found it will be run as part of the test. + +Some language modules add to this common set of test cases for +language specific tests. These can be found in the appropriate +language test-suite directory. There is also a README in each of the +language module directories. + +For each testcase a message showing which testcase is being tested is +displayed. Nothing else is printed unless the test fails. + + +Some Developer Guidelines +------------------------- + +Note that the whole test suite need not be run each time a testcase is +modified. An individual testcase may be run by going to the language +module test-suite directory and using make testcasename.xxx where xxx +is the type of test (eg cpptest). See common.mk. make -s doesn't print +any junk on the screen and is useful for emulating the way make check +works from the SWIG root directory. + +If there are runtime tests needed, don't print anything unless there +is an error in which case stderr is suggested. + +Please set the name of the module to the same name as the testcase, +otherwise modules will not be found. + Added: branches/gsoc2008-jezabek/Examples/test-suite/com/sizet_runme.c =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/sizet_runme.c (rev 0) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/sizet_runme.c 2008-07-18 23:31:46 UTC (rev 10680) @@ -0,0 +1,8 @@ +#include <stdio.h> +#include <windows.h> + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + printf("Hello!\n"); + + return 0; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-07-31 20:30:13
|
Revision: 10723 http://swig.svn.sourceforge.net/swig/?rev=10723&view=rev Author: wsfulton Date: 2008-07-31 20:30:09 +0000 (Thu, 31 Jul 2008) Log Message: ----------- fixes for 'make partialcheck-com-test-suite' Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/Makefile.in branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in Modified: branches/gsoc2008-jezabek/Examples/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/Makefile.in 2008-07-31 17:06:37 UTC (rev 10722) +++ branches/gsoc2008-jezabek/Examples/Makefile.in 2008-07-31 20:30:09 UTC (rev 10723) @@ -1117,16 +1117,16 @@ com: $(SRCS) $(SWIG) -com $(SWIGOPT) $(INTERFACE) - $(COM_IDL) $(COM_IDL_SWITCHES) $(COM_IDL_FILE) - $(COM_RC) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COM_RC_OUT_SWITCHES) $(COM_RES_FILE) - $(COM_CC) $(COM_CC_SHARED_SWITCHES) $(COM_CC_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(ISRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) + $(COMPILETOOL) $(COM_IDL) $(COM_IDL_SWITCHES) $(COM_IDL_FILE) + $(COMPILETOOL) $(COM_RC) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COM_RC_OUT_SWITCHES) $(COM_RES_FILE) + $(COMPILETOOL) $(COM_CC) $(COM_CC_SHARED_SWITCHES) $(COM_CC_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(ISRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) com_cpp: $(SRCS) $(SWIG) -com -c++ $(SWIGOPT) $(INTERFACE) - $(COM_IDL) $(COM_IDL_SWITCHES) $(COM_IDL_FILE) - $(COM_RC) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COM_RC_OUT_SWITCHES) $(COM_RES_FILE) - $(COM_CXX) $(COM_CXX_SHARED_SWITCHES) $(COM_CXX_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) + $(COMPILETOOL) $(COM_IDL) $(COM_IDL_SWITCHES) $(COM_IDL_FILE) + $(COMPILETOOL) $(COM_RC) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COM_RC_OUT_SWITCHES) $(COM_RES_FILE) + $(COMPILETOOL) $(COM_CXX) $(COM_CXX_SHARED_SWITCHES) $(COM_CXX_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) com_compile: $(SRCS) - $(COM_CC) $(COM_CC_SWITCHES) $(COM_CC_OUT_SWITCHES) $(TARGET)$(COM_EXEC_SUFFIX) $(COMSRCS) $(COM_LIBS) + $(COMPILETOOL) $(COM_CC) $(COM_CC_SWITCHES) $(COM_CC_OUT_SWITCHES) $(TARGET)$(COM_EXEC_SUFFIX) $(COMSRCS) $(COM_LIBS) Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-07-31 17:06:37 UTC (rev 10722) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-07-31 20:30:09 UTC (rev 10723) @@ -58,14 +58,14 @@ # Calls Dll[Un]RegisterServer on created component register_component = \ - regsvr32 $*.dll$(COM_EXEC_SUFFIX); + $(RUNTOOL) regsvr32 $*.dll$(COM_EXEC_SUFFIX); unregister_component = \ - regsvr32 /u $*.dll$(COM_EXEC_SUFFIX); + $(RUNTOOL) regsvr32 /u $*.dll$(COM_EXEC_SUFFIX); # Generates headers from the IDL file generate_headers = \ - $(COM_IDL) $(COM_IDL_HEADER_SWITCHES) $*.h $*/$*.idl; + $(COMPILETOOL) $(COM_IDL) $(COM_IDL_HEADER_SWITCHES) $*.h $*/$*.idl; # Compiles COM files then runs the testcase. A testcase is only run if # a file is found which has _runme.c appended after the testcase name. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-16 12:48:54
|
Revision: 10768 http://swig.svn.sourceforge.net/swig/?rev=10768&view=rev Author: jezabek Date: 2008-08-16 12:48:49 +0000 (Sat, 16 Aug 2008) Log Message: ----------- Added a VBS run-test. Added 'class' example. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/Makefile.in branches/gsoc2008-jezabek/Examples/com/check.list Added Paths: ----------- branches/gsoc2008-jezabek/Examples/com/class/ branches/gsoc2008-jezabek/Examples/com/class/Makefile branches/gsoc2008-jezabek/Examples/com/class/example.cxx branches/gsoc2008-jezabek/Examples/com/class/example.h branches/gsoc2008-jezabek/Examples/com/class/example.i branches/gsoc2008-jezabek/Examples/com/class/index.html branches/gsoc2008-jezabek/Examples/com/class/runme.vbs branches/gsoc2008-jezabek/Examples/test-suite/com/aggregate_runme.vbs Modified: branches/gsoc2008-jezabek/Examples/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/Makefile.in 2008-08-16 07:31:05 UTC (rev 10767) +++ branches/gsoc2008-jezabek/Examples/Makefile.in 2008-08-16 12:48:49 UTC (rev 10768) @@ -1132,3 +1132,6 @@ com_compile: $(SRCS) $(COMPILETOOL) $(COM_CC) $(COM_CC_SWITCHES) $(COM_CC_OUT_SWITCHES)$(TARGET)$(COM_EXEC_SUFFIX) $(COMSRCS) $(COM_LIBS) +com_clean: + rm -f *_wrap* *.idl *.def *_rc.* *.o *.obj *.map *.lib *.tlb *.exp *.dll$(COM_EXEC_SUFFIX) *~ + Modified: branches/gsoc2008-jezabek/Examples/com/check.list =================================================================== --- branches/gsoc2008-jezabek/Examples/com/check.list 2008-08-16 07:31:05 UTC (rev 10767) +++ branches/gsoc2008-jezabek/Examples/com/check.list 2008-08-16 12:48:49 UTC (rev 10768) @@ -1 +1,2 @@ # see top-level Makefile.in +class Added: branches/gsoc2008-jezabek/Examples/com/class/Makefile =================================================================== --- branches/gsoc2008-jezabek/Examples/com/class/Makefile (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/class/Makefile 2008-08-16 12:48:49 UTC (rev 10768) @@ -0,0 +1,17 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = example.cxx +TARGET = example +INTERFACE = example.i +SWIGOPT = + +all:: com + +com:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' com_cpp + +clean:: + $(MAKE) -f $(TOP)/Makefile com_clean + +check: all Added: branches/gsoc2008-jezabek/Examples/com/class/example.cxx =================================================================== --- branches/gsoc2008-jezabek/Examples/com/class/example.cxx (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/class/example.cxx 2008-08-16 12:48:49 UTC (rev 10768) @@ -0,0 +1,28 @@ +/* File : example.c */ + +#include "example.h" +#define M_PI 3.14159265358979323846 + +/* Move the shape to a new location */ +void Shape::move(double dx, double dy) { + x += dx; + y += dy; +} + +int Shape::nshapes = 0; + +double Circle::area(void) { + return M_PI*radius*radius; +} + +double Circle::perimeter(void) { + return 2*M_PI*radius; +} + +double Square::area(void) { + return width*width; +} + +double Square::perimeter(void) { + return 4*width; +} Added: branches/gsoc2008-jezabek/Examples/com/class/example.h =================================================================== --- branches/gsoc2008-jezabek/Examples/com/class/example.h (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/class/example.h 2008-08-16 12:48:49 UTC (rev 10768) @@ -0,0 +1,39 @@ +/* File : example.h */ + +class Shape { +public: + Shape() { + nshapes++; + } + virtual ~Shape() { + nshapes--; + }; + double x, y; + void move(double dx, double dy); + virtual double area(void) = 0; + virtual double perimeter(void) = 0; + static int nshapes; +}; + +class Circle : public Shape { +private: + double radius; +public: + Circle(double r) : radius(r) { }; + virtual double area(void); + virtual double perimeter(void); +}; + +class Square : public Shape { +private: + double width; +public: + Square(double w) : width(w) { }; + virtual double area(void); + virtual double perimeter(void); +}; + + + + + Added: branches/gsoc2008-jezabek/Examples/com/class/example.i =================================================================== --- branches/gsoc2008-jezabek/Examples/com/class/example.i (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/class/example.i 2008-08-16 12:48:49 UTC (rev 10768) @@ -0,0 +1,10 @@ +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +/* Let's just grab the original header file here */ +%include "example.h" + Added: branches/gsoc2008-jezabek/Examples/com/class/index.html =================================================================== --- branches/gsoc2008-jezabek/Examples/com/class/index.html (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/class/index.html 2008-08-16 12:48:49 UTC (rev 10768) @@ -0,0 +1,207 @@ +<html> +<head> +<title>SWIG:Examples:com:class</title> +</head> + +<body bgcolor="#ffffff"> + + +<tt>SWIG/Examples/com/class/</tt> +<hr> + +<H2>Wrapping a simple C++ class</H2> + +<p> +This example illustrates the high level form of C++ class wrapping performed +by SWIG. In this case, a C++ class has a proxy COM class, which +provides access to C++ class members. + +<h2>The C++ Code</h2> + +Suppose you have some C++ classes described by the following (and admittedly lame) +header file: + +<blockquote> +<pre> +/* File : example.h */ + +class Shape { +public: + Shape() { + nshapes++; + } + virtual ~Shape() { + nshapes--; + }; + double x, y; + void move(double dx, double dy); + virtual double area() = 0; + virtual double perimeter() = 0; + static int nshapes; +}; + +class Circle : public Shape { +private: + double radius; +public: + Circle(double r) : radius(r) { }; + virtual double area(); + virtual double perimeter(); +}; + +class Square : public Shape { +private: + double width; +public: + Square(double w) : width(w) { }; + virtual double area(); + virtual double perimeter(); +}; +</pre> +</blockquote> + +<h2>The SWIG interface</h2> + +A simple SWIG interface for this can be built by simply grabbing the header file +like this: + +<blockquote> +<pre> +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +/* Let's just grab the original header file here */ +%include "example.h" +</pre> +</blockquote> + +Note: when creating a C++ extension, you must run SWIG with the <tt>-c++</tt> option like this: +<blockquote> +<pre> +% swig -c++ -com example.i +</pre> +</blockquote> + +<h2>A sample VBScript program</h2> + +Click <a href="runme.vbs">here</a> to see a VBScript program that calls the C++ functions using COM. Please note that you will need to compile your C/C++ +module and the wrapper to a DLL and then register it using <tt>regsvr32</tt> +before your module can be used from VBScript. +Further details are available in the SWIG manual. + +<h2>Key points</h2> + +<ul> +<li>Usually you'll want to create an object of the module class: + +<blockquote> +<pre> +Dim example +Set example = CreateObject("example.example") +</pre> +</blockquote> + +<p> +<li>To create a new object, you call a constructor like this: + +<blockquote> +<pre> +Dim c +Set c = example.Circle.new_Circle(10) +</pre> +</blockquote> + +<p> +<li>If your class has a default constructor you can use an alternative +way of creating the object (note that this will not work with the +interface presented above): + +<blockquote> +<pre> +Dim c +Set c = CreateObject("example.Circle") +</pre> +</blockquote> + +<p> +<li>You can access member data using COM properties, which means that +the syntax is very similar to C/C++. For example: + +<blockquote> +<pre> +Rem Set member data +c.x = 15 +Rem Get member data +x = c.x +</pre> +</blockquote> + +<p> +<li>To invoke a member function, you simply do this + +<blockquote> +<pre> +WScript.Echo "The area is " & c.area() +</pre> +</blockquote> + +<p> +<li>If you want to destroy an object you will need to destroy all +references to it, e.g.: + +<blockquote> +<pre> +c = empty +</pre> +</blockquote> + +<p> +<li>Static member variables are wrapped as properties of the 'class object' which can be accessed from the module class object. For example: + +<blockquote> +<pre> +n = example.Shape.nshapes +example.Shape.nshapes = 13 +</pre> +</blockquote> + +</ul> + +<h2>General Comments</h2> + +<ul> +<li>A limitation of SWIG's COM module is that it supports only single +inheritance. This might change in the future. + +<p> +<li>A wide variety of C++ features are not currently supported by SWIG. Here is the +short and incomplete list: + +<p> +<ul> +<li>Overloaded methods and functions. COM does not support name overloading +so you must give an alternative name to any overloaded method name using the +%rename directive like this: + +<blockquote> +<pre> +void foo(int a); +%rename(foo2) void foo(double a, double b); +</pre> +</blockquote> + +<p> +<li>Namespaces. The namespace syntax is understood by SWIG, but namespace +declarations are ignored. You can specify a prefix for the IDispatch +names of your objects using the <tt>-namespace</tt> command line option. + +</ul> +</ul> + +<hr> +</body> +</html> Added: branches/gsoc2008-jezabek/Examples/com/class/runme.vbs =================================================================== --- branches/gsoc2008-jezabek/Examples/com/class/runme.vbs (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/class/runme.vbs 2008-08-16 12:48:49 UTC (rev 10768) @@ -0,0 +1,69 @@ +Rem This example illustrates how C++ classes can be used from COM using SWIG. +Rem The COM objects get mapped onto the C++ objects + +Rem ----- Create an object of the module class ----- + +Dim example +Set example = CreateObject("example.example") + +Rem ----- Object creation ----- + +Dim c, s +WScript.Echo "Creating some objects:" +Set c = example.Circle.new_Circle(10) +WScript.Echo " Created circle" +Set s = example.Square.new_Square(10) +WScript.Echo " Created square" + +Rem ----- Access a static member ----- + +WScript.Echo "" +WScript.Echo "A total of " & example.Shape.nshapes & " shapes were created" + +Rem ----- Member data access ----- + +c.x = 20 +c.y = 30 + +s.x = -10 +s.y = 5 + +WScript.Echo "" +WScript.Echo "Here is their current position:" +WScript.Echo " Circle = (" & c.x & " " & c.y & ")" +WScript.Echo " Square = (" & s.x & " " & s.y & ")" + +Rem ----- Call some methods ----- + +WScript.Echo "" +WScript.Echo "Here are some properties of the shapes:" + +Dim shapes(2), names(2) +Set shapes(1) = c +names(1) = "Circle" +Set shapes(2) = s +names(2) = "Square" + +For i = 1 to 2 + WScript.Echo " " & names(i) + WScript.Echo " area = " & shapes(i).area() + WScript.Echo " perimeter = " & shapes(i).perimeter() +Next + +Rem Notice how the area() and perimeter() functions really +Rem invoke the appropriate virtual method on each object. + +Rem ----- Delete everything ----- + +WScript.Echo "" +WScript.Echo "Guess I'll clean up now" + +Rem Note: this decreases the objects' reference count +Rem You could leave this to the script host's garbage collector +c = empty +s = empty +shapes(1) = empty +shapes(2) = empty + +WScript.Echo example.Shape.nshapes & " shapes remain" +WScript.Echo "Goodbye" Added: branches/gsoc2008-jezabek/Examples/test-suite/com/aggregate_runme.vbs =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/aggregate_runme.vbs (rev 0) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/aggregate_runme.vbs 2008-08-16 12:48:49 UTC (rev 10768) @@ -0,0 +1,44 @@ +Dim aggregate, result + +Set aggregate = CreateObject("aggregate.aggregate") + +result = aggregate.move(aggregate.UP) + +If result <> aggregate.UP Then + WScript.Echo "UP failed" + WScript.Quit 1 +End If + +result = aggregate.move(aggregate.DOWN) + +If result <> aggregate.DOWN Then + WScript.Echo "DOWN failed" + WScript.Quit 1 +End If + +result = aggregate.move(aggregate.LEFT) + +If result <> aggregate.LEFT Then + WScript.Echo "LEFT failed" + WScript.Quit 1 +End If + +result = aggregate.move(aggregate.RIGHT) + +If result <> aggregate.RIGHT Then + WScript.Echo "RIGHT failed" + WScript.Quit 1 +End If + +Rem Confirm that move() raises an exception when the contract is violated + +On Error Resume Next +result = 99 +result = aggregate.move(0) + +Rem Second assignment to result should not have been done + +If result <> 99 Then + WScript.Echo "0 test failed" + WScript.Quit 1 +End If This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-16 15:38:25
|
Revision: 10769 http://swig.svn.sourceforge.net/swig/?rev=10769&view=rev Author: jezabek Date: 2008-08-16 15:38:22 +0000 (Sat, 16 Aug 2008) Log Message: ----------- Added 'simple' example. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/Makefile.in branches/gsoc2008-jezabek/Examples/com/check.list Added Paths: ----------- branches/gsoc2008-jezabek/Examples/com/simple/ branches/gsoc2008-jezabek/Examples/com/simple/Makefile branches/gsoc2008-jezabek/Examples/com/simple/example.c branches/gsoc2008-jezabek/Examples/com/simple/example.i branches/gsoc2008-jezabek/Examples/com/simple/index.html branches/gsoc2008-jezabek/Examples/com/simple/runme.vbs Modified: branches/gsoc2008-jezabek/Examples/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/Makefile.in 2008-08-16 12:48:49 UTC (rev 10768) +++ branches/gsoc2008-jezabek/Examples/Makefile.in 2008-08-16 15:38:22 UTC (rev 10769) @@ -1123,13 +1123,13 @@ $(COMPILETOOL) $(COM_RC) $(COM_RC_OUT_SWITCHES)$(COM_RES_FILE) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COMPILETOOL) $(COM_CC) $(COM_CC_SHARED_SWITCHES) $(COM_CC_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(ISRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) $(INCLUDES) -com_cpp: $(SRCS) +com_cpp: $(SRCS) $(CXXSRCS) $(SWIG) -com -c++ $(SWIGOPT) $(INTERFACE) $(COMPILETOOL) $(COM_IDL) $(COM_IDL_COMMON_SWITCHES) $(COM_IDL_TLB_SWITCHES) $(COM_TLB_FILE) $(COM_IDL_FILE) $(COMPILETOOL) $(COM_RC) $(COM_RC_OUT_SWITCHES)$(COM_RES_FILE) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COMPILETOOL) $(COM_CXX) $(COM_CXX_SHARED_SWITCHES) $(COM_CXX_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) $(INCLUDES) -com_compile: $(SRCS) +com_compile: $(COMSRCS) $(COMPILETOOL) $(COM_CC) $(COM_CC_SWITCHES) $(COM_CC_OUT_SWITCHES)$(TARGET)$(COM_EXEC_SUFFIX) $(COMSRCS) $(COM_LIBS) com_clean: Modified: branches/gsoc2008-jezabek/Examples/com/check.list =================================================================== --- branches/gsoc2008-jezabek/Examples/com/check.list 2008-08-16 12:48:49 UTC (rev 10768) +++ branches/gsoc2008-jezabek/Examples/com/check.list 2008-08-16 15:38:22 UTC (rev 10769) @@ -1,2 +1,3 @@ # see top-level Makefile.in class +simple Added: branches/gsoc2008-jezabek/Examples/com/simple/Makefile =================================================================== --- branches/gsoc2008-jezabek/Examples/com/simple/Makefile (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/simple/Makefile 2008-08-16 15:38:22 UTC (rev 10769) @@ -0,0 +1,17 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +SRCS = example.c +TARGET = example +INTERFACE = example.i +SWIGOPT = + +all:: com + +com:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' com + +clean:: + $(MAKE) -f $(TOP)/Makefile com_clean + +check: all Added: branches/gsoc2008-jezabek/Examples/com/simple/example.c =================================================================== --- branches/gsoc2008-jezabek/Examples/com/simple/example.c (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/simple/example.c 2008-08-16 15:38:22 UTC (rev 10769) @@ -0,0 +1,18 @@ +/* File : example.c */ + +/* A global variable */ +double Foo = 3.0; + +/* Compute the greatest common divisor of positive integers */ +int gcd(int x, int y) { + int g; + g = y; + while (x > 0) { + g = x; + x = y % x; + y = g; + } + return g; +} + + Added: branches/gsoc2008-jezabek/Examples/com/simple/example.i =================================================================== --- branches/gsoc2008-jezabek/Examples/com/simple/example.i (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/simple/example.i 2008-08-16 15:38:22 UTC (rev 10769) @@ -0,0 +1,7 @@ +/* File : example.i */ +%module example + +%inline %{ +extern int gcd(int x, int y); +extern double Foo; +%} Added: branches/gsoc2008-jezabek/Examples/com/simple/index.html =================================================================== --- branches/gsoc2008-jezabek/Examples/com/simple/index.html (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/simple/index.html 2008-08-16 15:38:22 UTC (rev 10769) @@ -0,0 +1,126 @@ +<html> +<head> +<title>SWIG:Examples:com:simple</title> +</head> + +<body bgcolor="#ffffff"> + + +<tt>SWIG/Examples/com/simple/</tt> +<hr> + +<H2>Simple COM Example</H2> + +<p> +This example illustrates how you can hook a COM client to a very simple C program containing +a function and a global variable. + +<h2>The C Code</h2> + +Suppose you have the following C code: + +<blockquote> +<pre> +/* File : example.c */ + +/* A global variable */ +double Foo = 3.0; + +/* Compute the greatest common divisor of positive integers */ +int gcd(int x, int y) { + int g; + g = y; + while (x > 0) { + g = x; + x = y % x; + y = g; + } + return g; +} +</pre> +</blockquote> + +<h2>The SWIG interface</h2> + +Here is a simple SWIG interface file: + +<blockquote> +<pre> +/* File: example.i */ +%module example + +extern int gcd(int x, int y); +extern double Foo; +</pre> +</blockquote> + +<h2>Compilation</h2> + +<ol> +<li><tt>swig -com <a href="example.i">example.i</a></tt> +<p> +<li>To create the COM DLL you will need to compile the <tt>example.idl</tt> +file using an IDL compiler, then compile the resource file +<tt>example_rc.rc</tt> and finally create a DLL from +<tt>example_wrap.c</tt>, <tt><a href="example.c">example.c</a></tt>, +<tt>example.def</tt> and <tt>example_rc.res</tt>. In Visual C++ this +is accomplished by executing the following commands: + +<blockquote> +<pre> +midl example.idl +rc example_rc.rc +cl /LD example.c example_wrap.c example.def example_rc.res ole32.lib uuid.lib advapi32.lib oleaut32.lib +</pre> +</blockquote> + +Before using the COM DLL you will also need to register it using +<tt>regsvr32</tt> + +<blockquote> +<pre> +regsvr32 example.dll +</pre> +</blockquote> + +Please consult the SWIG documentation for further details. +</ol> + +<h2>Using the extension</h2> + +Click <a href="runme.vbs">here</a> to see a program that calls our C functions from VBScript using COM. + +<h2>Key points</h2> + +<ul> +<li>To access global variables and functions you need to create an object +of the module class. In VBScript this is done in the following way: + +<blockquote> +<pre> +Dim example +Set example = CreateObject("example.example") +</pre> +</blockquote> + +<li>C functions are mapped to member functions of the module class. For example: +<blockquote> +<pre> +Dim g +g = example.gcd(42,105) +</pre> +</blockquote> + +<li>C global variables are accessed as properties of the module class. For example: +<blockquote> +<pre> +Dim a +a = example.foo +example.foo = 20.0 +</pre> +</blockquote> +</ul> + +<hr> +</body> +</html> Added: branches/gsoc2008-jezabek/Examples/com/simple/runme.vbs =================================================================== --- branches/gsoc2008-jezabek/Examples/com/simple/runme.vbs (rev 0) +++ branches/gsoc2008-jezabek/Examples/com/simple/runme.vbs 2008-08-16 15:38:22 UTC (rev 10769) @@ -0,0 +1,23 @@ +Dim example, x, y, g + +Rem Get an instance of the module class +Set example = CreateObject("example.example") + +Rem Call our gcd() function +x = 42 +y = 105 +g = example.gcd(x,y) + +WScript.Echo "The gcd of " & x & " and " & y & " is " & g + +Rem Manipulate the Foo global variable + +Rem Output its current value +WScript.Echo "Foo = " & example.foo + +Rem Change its value +example.foo = 3.1415926 + +Rem See if the change took effect +WScript.Echo "Foo = " & example.foo + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |