--- /dev/null
+set client_min_messages to WARNING;
+
+SELECT topology.CreateTopology('sqlmm_topology') > 0;
+
+-- Put some points in
+INSERT INTO sqlmm_topology.node (containing_face, geom) VALUES
+ (0, 'POINT(0 0)') RETURNING 'N' || node_id; -- 1
+INSERT INTO sqlmm_topology.node (containing_face, geom) VALUES
+ (0, 'POINT(10 0)') RETURNING 'N' || node_id; -- 2
+INSERT INTO sqlmm_topology.node (containing_face, geom) VALUES
+ (0, 'POINT(5 0)') RETURNING 'N' || node_id; -- 3
+INSERT INTO sqlmm_topology.node (containing_face, geom) VALUES
+ (0, 'POINT(5 10)') RETURNING 'N' || node_id; -- 4
+INSERT INTO sqlmm_topology.node (containing_face, geom) VALUES
+ (0, 'POINT(10 10)') RETURNING 'N' || node_id; -- 5
+INSERT INTO sqlmm_topology.node (containing_face, geom) VALUES
+ (0, 'POINT(20 10)') RETURNING 'N' || node_id; -- 6
+
+-- null input
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, 2, NULL);
+SELECT topology.ST_AddIsoEdge(NULL, 1, 2, 'LINESTRING(0 0, 1 1)');
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, NULL, 'LINESTRING(0 0, 1 1)');
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', NULL, 2, 'LINESTRING(0 0, 1 1)');
+
+-- invalid curve
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, 2, 'POINT(0 0)');
+
+-- non-simple curve
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, 2, 'LINESTRING(0 0, 10 0, 5 5, 5 -5)');
+
+-- non-existing nodes
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 10000, 2, 'LINESTRING(0 0, 1 1)');
+
+-- Curve endpoints mismatch
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, 2, 'LINESTRING(0 0, 1 1)');
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, 2, 'LINESTRING(0 1, 10 0)');
+
+-- Node crossing
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, 2, 'LINESTRING(0 0, 10 0)');
+
+-- Good ones
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 4, 5, 'LINESTRING(5 10, 5 9, 10 10)');
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, 2, 'LINESTRING(0 0, 2 1, 10 5, 10 0)');
+
+-- Not isolated edge (shares endpoint with previous)
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 4, 6, 'LINESTRING(5 10, 10 9, 20 10)');
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 5, 6, 'LINESTRING(10 10, 20 10)');
+
+-- Edge intersection (geometry intersects an edge)
+SELECT topology.ST_AddIsoEdge('sqlmm_topology', 1, 2, 'LINESTRING(0 0, 2 20, 10 0)');
+
+-- on different faces (TODO req. nodes contained in face)
+
+SELECT topology.DropTopology('sqlmm_topology');
--- /dev/null
+t
+N1
+N2
+N3
+N4
+N5
+N6
+ERROR: SQL/MM Spatial exception - null argument
+ERROR: SQL/MM Spatial exception - null argument
+ERROR: SQL/MM Spatial exception - null argument
+ERROR: SQL/MM Spatial exception - null argument
+ERROR: SQL/MM Spatial exception - invalid curve
+ERROR: SQL/MM Spatial exception - curve not simple
+ERROR: SQL/MM Spatial exception - non-existent node
+ERROR: SQL/MM Spatial exception - end node not geometry end point.
+ERROR: SQL/MM Spatial exception - start node not geometry start point.
+ERROR: SQL/MM Spatial exception - geometry crosses a node
+1
+2
+ERROR: SQL/MM Spatial exception - not isolated node
+ERROR: SQL/MM Spatial exception - not isolated node
+ERROR: SQL/MM Spatial exception - not isolated node
+Topology 'sqlmm_topology' dropped