Mercurial > hg > xemacs-beta
diff src/tests.c @ 489:4a8bb4aa9740
[xemacs-hg @ 2001-04-30 08:49:24 by martinb]
hash table mapping
author | martinb |
---|---|
date | Mon, 30 Apr 2001 08:49:26 +0000 |
parents | 74fd4e045ea6 |
children | b39c14581166 |
line wrap: on
line diff
--- a/src/tests.c Sat Apr 28 21:04:50 2001 +0000 +++ b/src/tests.c Mon Apr 30 08:49:26 2001 +0000 @@ -29,6 +29,7 @@ #include "lisp.h" #include "buffer.h" #include "lstream.h" +#include "elhash.h" #include "opaque.h" static Lisp_Object Vtest_function_list; @@ -409,6 +410,86 @@ } +/* Hash Table testing */ + +typedef struct +{ + Lisp_Object hash_table; + EMACS_INT sum; +} test_hash_tables_data; + + +static int +test_hash_tables_mapper (Lisp_Object key, Lisp_Object value, + void *extra_arg) +{ + test_hash_tables_data *p = (test_hash_tables_data *) extra_arg; + p->sum += XINT (value); + return 0; +} + +static int +test_hash_tables_modifying_mapper (Lisp_Object key, Lisp_Object value, + void *extra_arg) +{ + test_hash_tables_data *p = (test_hash_tables_data *) extra_arg; + Fputhash (make_int (- XINT (key)), + make_int (2 * XINT (value)), + p->hash_table); + p->sum += XINT (value); + return 0; +} + +static int +test_hash_tables_predicate (Lisp_Object key, Lisp_Object value, + void *extra_arg) +{ + return XINT (key) < 0; +} + + +DEFUN ("test-hash-tables", Ftest_hash_tables, 0, 0, "", /* +Test C interface to hash tables. +*/ + ()) +{ + test_hash_tables_data data; + data.hash_table = make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, + HASH_TABLE_EQUAL); + + Fputhash (make_int (1), make_int (2), data.hash_table); + Fputhash (make_int (3), make_int (4), data.hash_table); + + data.sum = 0; + elisp_maphash_unsafe (test_hash_tables_mapper, + data.hash_table, (void *) &data); + assert (data.sum == 2 + 4); + + data.sum = 0; + elisp_maphash (test_hash_tables_modifying_mapper, + data.hash_table, (void *) &data); + assert (data.sum == 2 + 4); + + /* hash table now contains: (1, 2) (3, 4) (-1, 2*2) (-3, 2*4) */ + + data.sum = 0; + elisp_maphash_unsafe (test_hash_tables_mapper, + data.hash_table, (void *) &data); + assert (data.sum == 3 * (2 + 4)); + + /* Remove entries with negative keys, added by modifying mapper */ + elisp_map_remhash (test_hash_tables_predicate, + data.hash_table, 0); + + data.sum = 0; + elisp_maphash_unsafe (test_hash_tables_mapper, + data.hash_table, (void *) &data); + assert (data.sum == 2 + 4); + + return intern ("PASS"); +} + + #define TESTS_DEFSUBR(Fname) do { \ DEFSUBR (Fname); \ @@ -423,6 +504,7 @@ Vtest_function_list = Qnil; TESTS_DEFSUBR (Ftest_data_format_conversion); + TESTS_DEFSUBR (Ftest_hash_tables); /* Add other test functions here with TESTS_DEFSUBR */ }