From f7babc08a2bfe2bb448244427ed77ea0ad5cedbd Mon Sep 17 00:00:00 2001 From: Tiger Feng Date: Fri, 5 Sep 2003 19:07:01 +0000 Subject: [PATCH] Contract simple examples git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5078 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/contract/simple_c/example.c | 11 +++++ Examples/contract/simple_c/example.i | 17 +++++++ Examples/contract/simple_c/runme1.py | 17 +++++++ Examples/contract/simple_c/runme2.py | 20 +++++++++ Examples/contract/simple_cxx/example.cxx | 30 +++++++++++++ Examples/contract/simple_cxx/example.h | 34 ++++++++++++++ Examples/contract/simple_cxx/example.i | 28 ++++++++++++ Examples/contract/simple_cxx/runme1.py | 33 ++++++++++++++ Examples/contract/simple_cxx/runme2.py | 44 ++++++++++++++++++ Examples/contract/simple_cxx/runme3.py | 57 ++++++++++++++++++++++++ 10 files changed, 291 insertions(+) create mode 100644 Examples/contract/simple_c/example.c create mode 100644 Examples/contract/simple_c/example.i create mode 100644 Examples/contract/simple_c/runme1.py create mode 100644 Examples/contract/simple_c/runme2.py create mode 100644 Examples/contract/simple_cxx/example.cxx create mode 100644 Examples/contract/simple_cxx/example.h create mode 100644 Examples/contract/simple_cxx/example.i create mode 100644 Examples/contract/simple_cxx/runme1.py create mode 100644 Examples/contract/simple_cxx/runme2.py create mode 100644 Examples/contract/simple_cxx/runme3.py diff --git a/Examples/contract/simple_c/example.c b/Examples/contract/simple_c/example.c new file mode 100644 index 000000000..85a3e1417 --- /dev/null +++ b/Examples/contract/simple_c/example.c @@ -0,0 +1,11 @@ +#include + +int Circle (int x, int y, int radius) { + /* Draw Circle */ + printf("Drawing the circle...\n"); + /* Return -1 to test contract post assertion */ + if (radius == 2) + return -1; + else + return 1; +} diff --git a/Examples/contract/simple_c/example.i b/Examples/contract/simple_c/example.i new file mode 100644 index 000000000..c044a7d11 --- /dev/null +++ b/Examples/contract/simple_c/example.i @@ -0,0 +1,17 @@ +/* File : example.i */ + +/* Basic C example for swig contract */ +/* Tiger, University of Chicago, 2003 */ + +%module example + +%contract Circle (int x, int y, int radius) { +require: + x >= 0; + y >= 0; + radius > x; +ensure: + Circle >= 0; +} + +extern int Circle (int x, int y, int radius); diff --git a/Examples/contract/simple_c/runme1.py b/Examples/contract/simple_c/runme1.py new file mode 100644 index 000000000..abd8df62f --- /dev/null +++ b/Examples/contract/simple_c/runme1.py @@ -0,0 +1,17 @@ +import example +# Call the Circle() function correctly + +x = 1; +y = 1; +r = 3; + +c = example.Circle(x, y, r) + +# test post-assertion +x = 1; +y = 1; +r = 2; + +c = example.Circle(x, y, r) + +print "The return value of Circle(%d, %d, %d) is %d" % (x,y,r,c) diff --git a/Examples/contract/simple_c/runme2.py b/Examples/contract/simple_c/runme2.py new file mode 100644 index 000000000..48d4a3f10 --- /dev/null +++ b/Examples/contract/simple_c/runme2.py @@ -0,0 +1,20 @@ +import example + +# Call the Circle() function correctly + +x = 1; +y = 1; +r = 3; + +c = example.Circle(x, y, r) + +print "The return value of Circle(%d, %d, %d) is %d" % (x,y,r,c) + +# test pre-assertion +x = 1; +y = -1; +r = 3; + +c = example.Circle(x, y, r) + +print "The return value of Circle(%d, %d, %d) is %d" % (x,y,r,c) diff --git a/Examples/contract/simple_cxx/example.cxx b/Examples/contract/simple_cxx/example.cxx new file mode 100644 index 000000000..e3dd2ca7a --- /dev/null +++ b/Examples/contract/simple_cxx/example.cxx @@ -0,0 +1,30 @@ +#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 -1 is to test post-assertion */ + if (radius == 1) + return -1; + 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; +} diff --git a/Examples/contract/simple_cxx/example.h b/Examples/contract/simple_cxx/example.h new file mode 100644 index 000000000..64b7684fa --- /dev/null +++ b/Examples/contract/simple_cxx/example.h @@ -0,0 +1,34 @@ +/* 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); +}; diff --git a/Examples/contract/simple_cxx/example.i b/Examples/contract/simple_cxx/example.i new file mode 100644 index 000000000..9b47409d0 --- /dev/null +++ b/Examples/contract/simple_cxx/example.i @@ -0,0 +1,28 @@ +%module example + +%contract Circle::Circle(double radius) { +require: + radius > 0; +} + +%contract Circle::area(void) { +ensure: + area > 0; +} + +%contract Shape::move(double dx, double dy) { +require: + dx > 0; +} + +/* should be no effect, since there is no move() for class Circle */ +%contract Circle::move(double dx, double dy) { +require: + dy > 1; +} + +# include must be after contracts +%{ +#include "example.h" +%} +%include "example.h" diff --git a/Examples/contract/simple_cxx/runme1.py b/Examples/contract/simple_cxx/runme1.py new file mode 100644 index 000000000..9028d02d9 --- /dev/null +++ b/Examples/contract/simple_cxx/runme1.py @@ -0,0 +1,33 @@ +import example + +# Create the Circle object + +r = 2; +print " Creating circle (radium: %d) :" % r +c = example.Circle(r) + +# Set the location of the object + +c.x = 20 +c.y = 30 +print " Here is its current position:" +print " Circle = (%f, %f)" % (c.x,c.y) + +# ----- Call some methods ----- + +print "\n Here are some properties of the Circle:" +print " area = ", c.area() +print " perimeter = ", c.perimeter() +dx = 1; +dy = 1; +print " Moving with (%d, %d)..." % (dx, dy) +c.move(dx, dy) + +del c + +print "===================================" + +# test construction */ +r = -1; +print " Creating circle (radium: %d) :" % r +c = example.Circle(r) diff --git a/Examples/contract/simple_cxx/runme2.py b/Examples/contract/simple_cxx/runme2.py new file mode 100644 index 000000000..5f9c0df5b --- /dev/null +++ b/Examples/contract/simple_cxx/runme2.py @@ -0,0 +1,44 @@ +import example + +# Create the Circle object + +r = 2; +print " Creating circle (radium: %d) :" % r +c = example.Circle(r) + +# Set the location of the object + +c.x = 20 +c.y = 30 +print " Here is its current position:" +print " Circle = (%f, %f)" % (c.x,c.y) + +# ----- Call some methods ----- + +print "\n Here are some properties of the Circle:" +print " area = ", c.area() +print " perimeter = ", c.perimeter() +dx = 1; +dy = 1; +print " Moving with (%d, %d)..." % (dx, dy) +c.move(dx, dy) + +del c + +print "===================================" + +# test area function */ +r = 1; +print " Creating circle (radium: %d) :" % r +c = example.Circle(r) +# Set the location of the object + +c.x = 20 +c.y = 30 +print " Here is its current position:" +print " Circle = (%f, %f)" % (c.x,c.y) + +# ----- Call some methods ----- + +print "\n Here are some properties of the Circle:" +print " area = ", c.area() diff --git a/Examples/contract/simple_cxx/runme3.py b/Examples/contract/simple_cxx/runme3.py new file mode 100644 index 000000000..a663732b1 --- /dev/null +++ b/Examples/contract/simple_cxx/runme3.py @@ -0,0 +1,57 @@ +import example + +# Create the Circle object + +r = 2; +print " Creating circle (radium: %d) :" % r +c = example.Circle(r) + +# Set the location of the object + +c.x = 20 +c.y = 30 +print " Here is its current position:" +print " Circle = (%f, %f)" % (c.x,c.y) + +# ----- Call some methods ----- + +print "\n Here are some properties of the Circle:" +print " area = ", c.area() +print " perimeter = ", c.perimeter() +dx = 1; +dy = 1; +print " Moving with (%d, %d)..." % (dx, dy) +c.move(dx, dy) + +del c + +print "===================================" + +# test move function */ +r = 2; +print " Creating circle (radium: %d) :" % r +c = example.Circle(r) +# Set the location of the object + +c.x = 20 +c.y = 30 +print " Here is its current position:" +print " Circle = (%f, %f)" % (c.x,c.y) + +# ----- Call some methods ----- + +print "\n Here are some properties of the Circle:" +print " area = ", c.area() +print " perimeter = ", c.perimeter() + +# no error for Circle's pre-assertion +dx = 1; +dy = -1; +print " Moving with (%d, %d)..." % (dx, dy) +c.move(dx, dy) + +# error with Shape's pre-assertion +dx = -1; +dy = 1; +print " Moving with (%d, %d)..." % (dx, dy) +c.move(dx, dy)