]> granicus.if.org Git - vim/commitdiff
Add missing files for patch 7.3.143. v7.3.143
authorBram Moolenaar <Bram@vim.org>
Tue, 22 Mar 2011 19:52:37 +0000 (20:52 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 22 Mar 2011 19:52:37 +0000 (20:52 +0100)
src/memfile_test.c [new file with mode: 0644]
src/testdir/test77.in [new file with mode: 0644]
src/testdir/test77.ok [new file with mode: 0644]

diff --git a/src/memfile_test.c b/src/memfile_test.c
new file mode 100644 (file)
index 0000000..e9f32b3
--- /dev/null
@@ -0,0 +1,145 @@
+/* vi:set ts=8 sts=4 sw=4:
+ *
+ * VIM - Vi IMproved   by Bram Moolenaar
+ *
+ * Do ":help uganda"  in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ * See README.txt for an overview of the Vim source code.
+ */
+
+/*
+ * memfile_test.c: Unittests for memfile.c
+ * Mostly by Ivan Krasilnikov.
+ */
+
+#undef NDEBUG
+#include <assert.h>
+
+/* Must include main.c because it contains much more than just main() */
+#define NO_VIM_MAIN
+#include "main.c"
+
+/* This file has to be included because the tested functions are static */
+#include "memfile.c"
+
+#define index_to_key(i) ((i) ^ 15167)
+#define TEST_COUNT 50000
+
+static void test_mf_hash __ARGS((void));
+
+/*
+ * Test mf_hash_*() functions.
+ */
+    static void
+test_mf_hash()
+{
+    mf_hashtab_T   ht;
+    mf_hashitem_T  *item;
+    blocknr_T      key;
+    long_u        i;
+    long_u        num_buckets;
+
+    mf_hash_init(&ht);
+
+    /* insert some items and check invariants */
+    for (i = 0; i < TEST_COUNT; i++)
+    {
+       assert(ht.mht_count == i);
+
+       /* check that number of buckets is a power of 2 */
+       num_buckets = ht.mht_mask + 1;
+       assert(num_buckets > 0 && (num_buckets & (num_buckets - 1)) == 0);
+
+       /* check load factor */
+       assert(ht.mht_count <= (num_buckets << MHT_LOG_LOAD_FACTOR));
+
+       if (i < (MHT_INIT_SIZE << MHT_LOG_LOAD_FACTOR))
+       {
+           /* first expansion shouldn't have occurred yet */
+           assert(num_buckets == MHT_INIT_SIZE);
+           assert(ht.mht_buckets == ht.mht_small_buckets);
+       }
+       else
+       {
+           assert(num_buckets > MHT_INIT_SIZE);
+           assert(ht.mht_buckets != ht.mht_small_buckets);
+       }
+
+       key = index_to_key(i);
+       assert(mf_hash_find(&ht, key) == NULL);
+
+       /* allocate and add new item */
+       item = (mf_hashitem_T *)lalloc_clear(sizeof(mf_hashtab_T), FALSE);
+       assert(item != NULL);
+       item->mhi_key = key;
+       mf_hash_add_item(&ht, item);
+
+       assert(mf_hash_find(&ht, key) == item);
+
+       if (ht.mht_mask + 1 != num_buckets)
+       {
+           /* hash table was expanded */
+           assert(ht.mht_mask + 1 == num_buckets * MHT_GROWTH_FACTOR);
+           assert(i + 1 == (num_buckets << MHT_LOG_LOAD_FACTOR));
+       }
+    }
+
+    /* check presence of inserted items */
+    for (i = 0; i < TEST_COUNT; i++)
+    {
+       key = index_to_key(i);
+       item = mf_hash_find(&ht, key);
+       assert(item != NULL);
+       assert(item->mhi_key == key);
+    }
+
+    /* delete some items */
+    for (i = 0; i < TEST_COUNT; i++)
+    {
+       if (i % 100 < 70)
+       {
+           key = index_to_key(i);
+           item = mf_hash_find(&ht, key);
+           assert(item != NULL);
+           assert(item->mhi_key == key);
+
+           mf_hash_rem_item(&ht, item);
+           assert(mf_hash_find(&ht, key) == NULL);
+
+           mf_hash_add_item(&ht, item);
+           assert(mf_hash_find(&ht, key) == item);
+
+           mf_hash_rem_item(&ht, item);
+           assert(mf_hash_find(&ht, key) == NULL);
+
+           vim_free(item);
+       }
+    }
+
+    /* check again */
+    for (i = 0; i < TEST_COUNT; i++)
+    {
+       key = index_to_key(i);
+       item = mf_hash_find(&ht, key);
+
+       if (i % 100 < 70)
+       {
+           assert(item == NULL);
+       }
+       else
+       {
+           assert(item != NULL);
+           assert(item->mhi_key == key);
+       }
+    }
+
+    /* free hash table and all remaining items */
+    mf_hash_free_all(&ht);
+}
+
+    int
+main()
+{
+    test_mf_hash();
+    return 0;
+}
diff --git a/src/testdir/test77.in b/src/testdir/test77.in
new file mode 100644 (file)
index 0000000..441845c
--- /dev/null
@@ -0,0 +1,27 @@
+Inserts 2 million lines with consecutive integers starting from 1
+(essentially, the output of GNU's seq 1 2000000), writes them to Xtest
+and writes its cksum to test.out.
+
+We need 2 million lines to trigger a call to mf_hash_grow().  If it would mess
+up the lines the checksum would differ.
+
+cksum is part of POSIX and so should be available on most Unixes.
+If it isn't available then the test will be skipped.
+
+STARTTEST
+:so small.vim
+:if !executable("cksum")
+: e! test.ok
+: w! test.out
+: qa!
+:endif
+:set fileformat=unix undolevels=-1
+ggdG
+:let i = 1
+:while i <= 2000000 | call append(i, range(i, i + 99)) | let i += 100 | endwhile
+ggdd
+:w! Xtest
+:!cksum Xtest > test.out
+:qa!
+ENDTEST
+
diff --git a/src/testdir/test77.ok b/src/testdir/test77.ok
new file mode 100644 (file)
index 0000000..11f148c
--- /dev/null
@@ -0,0 +1 @@
+3678979763 14888896 Xtest