changeset 15907:db0ada89b81a

seq_range_array_add(): Fixed handling sequence ranges that contain zeros.
author Timo Sirainen <tss@iki.fi>
date Sun, 24 Feb 2013 11:54:00 +0200
parents 11858b3dbd84
children 573682b34a76
files src/lib/seq-range-array.c src/lib/test-seq-range-array.c
diffstat 2 files changed, 48 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/seq-range-array.c	Sun Feb 24 10:50:35 2013 +0200
+++ b/src/lib/seq-range-array.c	Sun Feb 24 11:54:00 2013 +0200
@@ -48,22 +48,22 @@
 	}
 
 	/* quick checks */
-	if (data[count-1].seq2 == seq-1) {
-		/* grow last range */
-		data[count-1].seq2 = seq;
-		return FALSE;
-	}
 	if (data[count-1].seq2 < seq) {
-		array_append(array, &value, 1);
-		return FALSE;
-	}
-	if (data[0].seq1 == seq+1) {
-		/* grow down first range */
-		data[0].seq1 = seq;
+		if (data[count-1].seq2 == seq-1) {
+			/* grow last range */
+			data[count-1].seq2 = seq;
+		} else {
+			array_append(array, &value, 1);
+		}
 		return FALSE;
 	}
 	if (data[0].seq1 > seq) {
-		array_insert(array, 0, &value, 1);
+		if (data[0].seq1-1 == seq) {
+			/* grow down first range */
+			data[0].seq1 = seq;
+		} else {
+			array_insert(array, 0, &value, 1);
+		}
 		return FALSE;
 	}
 
--- a/src/lib/test-seq-range-array.c	Sun Feb 24 10:50:35 2013 +0200
+++ b/src/lib/test-seq-range-array.c	Sun Feb 24 11:54:00 2013 +0200
@@ -6,6 +6,41 @@
 
 #include <stdlib.h>
 
+static void
+boundaries_permute(uint32_t *input, unsigned int i, unsigned int count)
+{
+	ARRAY_TYPE(seq_range) range;
+	const struct seq_range *seqs;
+	unsigned int seqs_count;
+	uint32_t tmp;
+	unsigned int j;
+
+	if (i+1 < count) {
+		for (j = i; j < count; j++) {
+			tmp = input[i]; input[i] = input[j]; input[j] = tmp;
+			boundaries_permute(input, i+1, count);
+			tmp = input[i]; input[i] = input[j]; input[j] = tmp;
+		}
+		return;
+	}
+	t_array_init(&range, 4);
+	for (i = 0; i < count; i++)
+		seq_range_array_add(&range, input[i]);
+	seqs = array_get(&range, &seqs_count);
+	test_assert(seqs_count == 2);
+	test_assert(seqs[0].seq1 == 0);
+	test_assert(seqs[0].seq2 == 1);
+	test_assert(seqs[1].seq1 == (uint32_t)-2);
+	test_assert(seqs[1].seq2 == (uint32_t)-1);
+}
+
+static void test_seq_range_array_add_boundaries(void)
+{
+	static uint32_t input[] = { 0, 1, (uint32_t)-2, (uint32_t)-1 };
+
+	boundaries_permute(input, 0, N_ELEMENTS(input));
+}
+
 static void test_seq_range_array_add_merge(void)
 {
 	ARRAY_TYPE(seq_range) range;
@@ -169,6 +204,7 @@
 
 void test_seq_range_array(void)
 {
+	test_seq_range_array_add_boundaries();
 	test_seq_range_array_add_merge();
 	test_seq_range_array_invert();
 	test_seq_range_array_have_common();