portability fixes
[rrq/rrqmisc.git] / tests / relationtests.c
index 127e23a8c46bdca5db14962d95ee4c4306452c80..b9d40dce83015d81a8dd65fbba8cb5029a54030e 100644 (file)
@@ -1,13 +1,13 @@
 /**
- * This is a collection of tests of the relation functions.
+ * This is a collection of tests of the Relation functions.
  */
 #include <stdlib.h>
 #include <stringitem.h>
-#include <relation.h>
+#include <Relation.h>
 
 #define SIZE(x) (sizeof(x)/sizeof(void*))
 
-static char *tuple2string(relation *r,tuple *t) {
+static char *tuple2string(Relation *r,Tuple *t) {
     #define LIMIT 10000
     static char tmp[10][ LIMIT ];
     static int i = 0;
@@ -24,76 +24,102 @@ static char *tuple2string(relation *r,tuple *t) {
     return tmp[i++];
 }
 
-static void query_report(relation *r,tuple *query) {
-    vector_index i;
+static void query_report(Relation *r,Tuple *query) {
+    VectorIndex i;
     for ( i = 0; i < r->content.table.size; i++ ) {
-       tuple *t = hashvector_next( &r->content, &i, query );
+       Tuple *t = Relation_next( r, &i, query );
        fprintf( stderr, "check %s\n", tuple2string( r, t ) );
     }
 }
 
-// Report any knocked out tuples from relation_add or relation_delete
-// This will also clear and free the result vector.
-static void knockout_report(relation *r,vector *v) {
-    vector_index i;
+static void query_report_all(Relation *r,Tuple *query[]) {
+    int j;
+    for ( j = 0; query[j]; j++ ) {
+       fprintf( stderr, "query %s\n", tuple2string( r, query[j] ) );
+       query_report( r, query[j] );
+    }
+}
+
+// Report any knocked out tuples from Relation_add or Relation_delete
+// This will also clear and free the result Vector.
+static void knockout_report(Relation *r,Vector *v) {
+    VectorIndex i;
     if ( v ) {
        for ( i = 0; i < v->size; i++ ) {
-           tuple **t = (tuple **) vector_next_used( v, &i );
+           Tuple **t = (Tuple **) Vector_next_used( v, &i );
            fprintf( stderr, "knock %s\n", tuple2string( r, t? *t : 0 ) );
        }
-       vector_resize( v, 0, vector_clear_any, 0 );
+       Vector_resize( v, 0, Vector_clear_any, 0 );
        free( v );
     }
 }
 
 // Test addition with several tuples, terminated by 0                          
-static void test_relation_add(relation *r,tuple *query[]) {
+static void test_Relation_add(Relation *r,Tuple *query[]) {
     int j;
     for ( j = 0; query[j]; j++ ) {
        fprintf( stderr, "add %s\n", tuple2string( r, query[j] ) );
-       knockout_report( r, relation_add( r, query[j] ) );
+       knockout_report( r, Relation_add( r, query[j] ) );
     }
 }
 
 // Test deletion with several queries, terminated by 0
-static void test_relation_delete(relation *r,tuple *query[]) {
+static void test_Relation_delete(Relation *r,Tuple *query[]) {
     int j;
     for ( j = 0; query[j]; j++ ) {
        fprintf( stderr, "delete %s\n", tuple2string( r, query[j] ) );
-       knockout_report( r, relation_delete( r, query[j] ) );
+       knockout_report( r, Relation_delete( r, query[j] ) );
     }
 }
 
 int main(int argc,char **argv) {
-    tuple *data2[] = {
+
+    // AxB
+    Tuple *data2[] = {
        TUPLE( "a", "b" ),
        TUPLE( "a", "c" ),
        TUPLE( "a", "d" ),
        TUPLE( "b", "d" ),
        0
     };
-    tuple *query2[] = {
+    Tuple *query2[] = {
        TUPLE( "a", 0 ),
        TUPLE( 0, "d" ),
        0
     };
-    int j;
-    // AxB
-    relation rel2 = RELATION( &stringitem, &stringitem );
-    test_relation_add( &rel2, data2 );
+    Relation rel2 = RELATION( &stringitem, &stringitem );
+
+    test_Relation_add( &rel2, data2 );
     query_report( &rel2, 0 );
-    for ( j = 0; query2[j]; j++ ) {
-       fprintf( stderr, "query %s\n", tuple2string( &rel2, query2[j] ) );
-       query_report( &rel2, query2[j] );
-    }
-    test_relation_delete( &rel2, query2 );
+    query_report_all( &rel2, query2 );
+    test_Relation_delete( &rel2, query2 );
     
     // AxBxC
-    relation rel3 = RELATION( &stringitem, &stringitem, &stringitem );
-    // AxB -> C
-    relation_add_constraint( &rel3, 1, 1, 0 );
-    // AxC -> B
-    relation_add_constraint( &rel3, 1, 0, 1 );
+    Tuple *data3[] = {
+       TUPLE( "a", "b", "c" ), // <a,b,?> <a,?,c> ***
+       TUPLE( "a", "c", "d" ), // <a,c,?> <a,?,d> ***
+       TUPLE( "a", "b", "e" ), // <a,b,?> <a,?,e> => -<a,b,c>
+       TUPLE( "b", "d", "d" ), // <b,d,?> <b,?,d>
+       TUPLE( "a", "d", "d" ), // <a,d,?> <a,?,d> => -<a,c,d>
+       TUPLE( "e", "c", "a" ), // <e,c,?> <e,?,a>
+       TUPLE( "f", "b", "d" ), // <f,b,?> <f,?,c>
+       0
+    };
+    Tuple *query3[] = {
+       TUPLE( "a", 0, "d" ),
+       TUPLE( 0, 0, "d" ),
+       TUPLE( 0, "c", 0 ),
+       TUPLE( "f", "b", "d" ),
+       0
+    };
+    Relation rel3 = RELATION( &stringitem, &stringitem, &stringitem );
+    Relation_add_constraint( &rel3, 1, 1, 0 ); // AxB -> C
+    Relation_add_constraint( &rel3, 1, 0, 1 ); // AxC -> B
+
+    test_Relation_add( &rel3, data3 );
+    query_report( &rel3, 0 );
+    query_report_all( &rel3, query3 );
+    test_Relation_delete( &rel3, query3 );
 
     return 0;
 }