summaryrefslogtreecommitdiff
path: root/Examples/contract
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2009-08-18 20:56:02 +0000
committerLorry <lorry@roadtrain.codethink.co.uk>2012-09-25 16:59:08 +0000
commit9f8a09ed743cedd9547bf0661d518647966ab114 (patch)
tree9c7803d3b27a8ec22e91792ac7f7932efa128b20 /Examples/contract
downloadswig-tarball-master.tar.gz
Imported from /srv/lorry/lorry-area/swig-tarball/swig-1.3.40.tar.gz.HEADswig-1.3.40master
Diffstat (limited to 'Examples/contract')
-rw-r--r--Examples/contract/simple_c/example.c11
-rw-r--r--Examples/contract/simple_c/example.i19
-rw-r--r--Examples/contract/simple_c/runme1.py17
-rw-r--r--Examples/contract/simple_c/runme2.py20
-rw-r--r--Examples/contract/simple_cxx/example.cxx30
-rw-r--r--Examples/contract/simple_cxx/example.h34
-rw-r--r--Examples/contract/simple_cxx/example.i28
-rw-r--r--Examples/contract/simple_cxx/runme1.py33
-rw-r--r--Examples/contract/simple_cxx/runme2.py44
-rw-r--r--Examples/contract/simple_cxx/runme3.py57
10 files changed, 293 insertions, 0 deletions
diff --git a/Examples/contract/simple_c/example.c b/Examples/contract/simple_c/example.c
new file mode 100644
index 0000000..85a3e14
--- /dev/null
+++ b/Examples/contract/simple_c/example.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+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 0000000..49df09a
--- /dev/null
+++ b/Examples/contract/simple_c/example.i
@@ -0,0 +1,19 @@
+/* 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;
+}
+
+%inline %{
+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 0000000..abd8df6
--- /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 0000000..48d4a3f
--- /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 0000000..e3dd2ca
--- /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 0000000..64b7684
--- /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 0000000..9b47409
--- /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 0000000..9028d02
--- /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 0000000..5f9c0df
--- /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 0000000..a663732
--- /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)