test_digraph_views.sa
Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
---------------------------> Sather 1.1 source file <--------------------------
-- Author: Benedict A. Gomes <gomes@samosa.ICSI.Berkeley.EDU>
-- Copyright (C) 1995, International Computer Science Institute
-- $Id: test_digraph_views.sa,v 1.6 1996/07/13 05:42:07 gomes Exp $
--
-- COPYRIGHT NOTICE: This code is provided WITHOUT ANY WARRANTY
-- and is subject to the terms of the SATHER LIBRARY GENERAL PUBLIC
-- LICENSE contained in the file: Sather/Doc/License of the
-- Sather distribution. The license is also available from ICSI,
-- 1947 Center St., Suite 600, Berkeley CA 94704, USA.
class TEST_DIGRAPH_VIEWS
class TEST_DIGRAPH_VIEWS is
-- Testing various graph views
include TEST;
indi(s,d: INT): DIEDGE{INT} is return #DIEDGE{INT}(s,d) end;
main is
class_name("DIGRAPH_VIEWS");
g2 ::= #DIGRAPH{INT};
g2.add_node(1); g2.add_node(2); g2.add_node(3); g2.add_node(4);
g2.add_node(5);
g2.connect(1,2); g2.connect(2,4); g2.connect(2,5); g2.connect(1,3);
-- 1
-- /\
-- 2 3
-- / \
--4 5
-- Testing node view
g2nv ::= #DIGRAPH_NODE_SET_VIEW{INT}(g2);
test("num nodes",g2nv.size,5);
test("nodes:"+g2nv.str,
g2nv.equals(#SET{INT}(#ARRAY{INT}(|1,2,3,4,5|))),true);
-- Testing edge view
g2ev ::= #DIGRAPH_EDGE_SET_VIEW{INT}(g2);
test("num edges",g2ev.size,4);
es ::= SET{DIEDGE{INT}}::create_from(|indi(1,2),indi(1,3),indi(2,4),indi(2,5)|);
test("edges:"+g2ev.str,g2ev.equals(es),true);
-- Testing reverse digraph view
g2rev: DIGRAPH_REV_DIGRAPH_VIEW{INT};
g2rev := #(g2);
#OUT+"Reversed graph:"+g2rev.str+"\n";
g2revev ::= #DIGRAPH_EDGE_SET_VIEW{INT}(g2rev);
reves ::= SET{DIEDGE{INT}}::create_from(|indi(2,1),indi(3,1),indi(4,2),indi(5,2)|);
test("reveedges:"+g2revev.str,reves.equals(g2revev),true);
rev_nodes ::= #SET{INT}(#ARRAY{INT}(|1,2,3,4,5|));
g2revnv ::= #DIGRAPH_NODE_SET_VIEW{INT}(g2rev);
test("revnodes:"+g2revnv.str,rev_nodes.equals(g2revnv),true);
-- Filter graph view
g ::= #DIGRAPH{INT};
g.add_node(1);g.add_node(2);g.add_node(3);g.add_node(4);
g.add_node(5);g.add_node(0);g.connect(3,0);
g.connect(1,2).connect(2,4).connect(2,5).connect(1,3);
-- 1
-- /\
-- 2 3
-- / \ \
--4 5 0
-- Specify a node filter
node_filter:ROUT{INT}:BOOL := bind(_.is_lt(5));
-- Specify an edge filter
edge_filter:ROUT{DIEDGE{INT}}:BOOL := bind(my_edge_filter(_));
-- Create the filter view
fg:FILTERGRAPH_DIGRAPH_VIEW{INT};
fg := #(g,node_filter,edge_filter);
#OUT+fg.str+"\n";
-- Get the filtered edges
fg_ev: DIGRAPH_EDGE_SET_VIEW{INT};
fg_ev := #(fg);
fg_evres ::= #SET{DIEDGE{INT}}(#ARRAY{DIEDGE{INT}}(|indi(1,2),indi(1,3),indi(2,4)|));
test("filter edges:"+fg_ev.str,fg_ev.equals(fg_evres),true);
-- fv is now of the form
-- 1
-- /\
-- 2 3
-- / <- pruned by edge_filter
--4 0
-- Testing supergraph
-- gsup: SUPERGRAPH_DIGRAPH_VIEW{INT};
-- gsup := #(g2);
-- gsup.add_node(7).add_node(10).connect(3,7).connect(7,10);
-- Edge view of a supergraph
-- gsupev:DIGRAPH_EDGE_SET_VIEW{INT};
-- gsupev := #(gsup);
-- supeds ::= #SET{DIEDGE{INT}}(|indi(1,2),indi(1,3),indi(2,4),
-- indi(2,5),indi(3,7),indi(7,10)|);
-- test("supeds:"+gsupev,supeds=gsupev,true);
finish;
end;
my_edge_filter(e: DIEDGE{INT}): BOOL is
-- A filter that only returns edges starting at 1 or 2
return e.first <= 2;
end;
end; -- class TEST_DIGRAPH_VIEW