From 921e86cfb22486a03ba3a8937b4d679789af93b1 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Wed, 10 Jun 2015 06:08:11 -0400 Subject: [PATCH 15/35] Add selftests to vec.c Jeff approved an earlier version of this (as unittests/test-vec.c): https://gcc.gnu.org/ml/gcc-patches/2015-10/msg03308.html > OK if/when prereqs are approved. Minor twiddling if we end up > moving it elsewhere or standardizing/reducing header files is > pre-approved. This version puts the tests at the end of vec.c. gcc/ChangeLog: * vec.c: Include "selftest.h". (class vec_test): New test subclass. (vec_test, quick_push): New selftest. (vec_test, safe_push): New selftest. (vec_test, truncate): New selftest. (vec_test, safe_grow_cleared): New selftest. (vec_test, pop): New selftest. (vec_test, safe_insert): New selftest. (vec_test, ordered_remove): New selftest. (vec_test, unordered_remove): New selftest. (vec_test, block_remove): New selftest. (reverse_cmp): New function. (vec_test, qsort): New selftest. --- gcc/vec.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/gcc/vec.c b/gcc/vec.c index a483d5b..20fed31 100644 --- a/gcc/vec.c +++ b/gcc/vec.c @@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "hash-table.h" +#include "selftest.h" /* vNULL is an empty type with a template cast operation that returns a zero-initialized vec instance. Use this when you want @@ -188,3 +189,144 @@ dump_vec_loc_statistics (void) { vec_mem_desc.dump (VEC_ORIGIN); } + +#ifndef GENERATOR_FILE +#if CHECKING_P + +namespace { + +class vec_test : public ::selftest::test +{ + protected: + /* Add the range [START..LIMIT) to V. */ + void + safe_push_range (vec &v, int start, int limit) + { + for (int i = start; i < limit; i++) + v.safe_push (i); + } +}; + +TEST_F (vec_test, quick_push) +{ + auto_vec v; + EXPECT_EQ (0, v.length ()); + v.reserve (3); + EXPECT_EQ (0, v.length ()); + EXPECT_TRUE (v.space (3)); + v.quick_push (5); + v.quick_push (6); + v.quick_push (7); + EXPECT_EQ (3, v.length ()); + EXPECT_EQ (5, v[0]); + EXPECT_EQ (6, v[1]); + EXPECT_EQ (7, v[2]); +} + +TEST_F (vec_test, safe_push) +{ + auto_vec v; + EXPECT_EQ (0, v.length ()); + v.safe_push (5); + v.safe_push (6); + v.safe_push (7); + EXPECT_EQ (3, v.length ()); + EXPECT_EQ (5, v[0]); + EXPECT_EQ (6, v[1]); + EXPECT_EQ (7, v[2]); +} + +TEST_F (vec_test, truncate) +{ + auto_vec v; + EXPECT_EQ (0, v.length ()); + safe_push_range (v, 0, 10); + EXPECT_EQ (10, v.length ()); + + v.truncate (5); + EXPECT_EQ (5, v.length ()); +} + +TEST_F (vec_test, safe_grow_cleared) +{ + auto_vec v; + EXPECT_EQ (0, v.length ()); + v.safe_grow_cleared (50); + EXPECT_EQ (50, v.length ()); + EXPECT_EQ (0, v[0]); + EXPECT_EQ (0, v[49]); +} + +TEST_F (vec_test, pop) +{ + auto_vec v; + safe_push_range (v, 5, 20); + EXPECT_EQ (15, v.length ()); + + int last = v.pop (); + EXPECT_EQ (19, last); + EXPECT_EQ (14, v.length ()); +} + +TEST_F (vec_test, safe_insert) +{ + auto_vec v; + safe_push_range (v, 0, 10); + v.safe_insert (5, 42); + EXPECT_EQ (4, v[4]); + EXPECT_EQ (42, v[5]); + EXPECT_EQ (5, v[6]); + EXPECT_EQ (11, v.length ()); +} + +TEST_F (vec_test, ordered_remove) +{ + auto_vec v; + safe_push_range (v, 0, 10); + v.ordered_remove (5); + EXPECT_EQ (4, v[4]); + EXPECT_EQ (6, v[5]); + EXPECT_EQ (9, v.length ()); +} + +TEST_F (vec_test, unordered_remove) +{ + auto_vec v; + safe_push_range (v, 0, 10); + v.unordered_remove (5); + EXPECT_EQ (9, v.length ()); +} + +TEST_F (vec_test, block_remove) +{ + auto_vec v; + safe_push_range (v, 0, 10); + v.block_remove (5, 3); + EXPECT_EQ (3, v[3]); + EXPECT_EQ (4, v[4]); + EXPECT_EQ (8, v[5]); + EXPECT_EQ (9, v[6]); + EXPECT_EQ (7, v.length ()); +} + +static int reverse_cmp (const void *p_i, const void *p_j) +{ + return *(const int *)p_j - *(const int *)p_i; +} + +TEST_F (vec_test, qsort) +{ + auto_vec v; + safe_push_range (v, 0, 10); + v.qsort (reverse_cmp); + EXPECT_EQ (9, v[0]); + EXPECT_EQ (8, v[1]); + EXPECT_EQ (1, v[8]); + EXPECT_EQ (0, v[9]); + EXPECT_EQ (10, v.length ()); +} + +} // anon namespace + +#endif /* #if CHECKING_P */ +#endif /* #ifndef GENERATOR_FILE */ -- 1.8.5.3