Browse Source

tally: invert histograms so maximum is on top.

Rusty Russell 15 years ago
parent
commit
60b47bf5e0
2 changed files with 14 additions and 20 deletions
  1. 8 5
      ccan/tally/tally.c
  2. 6 15
      ccan/tally/test/run-histogram.c

+ 8 - 5
ccan/tally/tally.c

@@ -455,14 +455,17 @@ char *tally_histogram(const struct tally *tally,
 	}
 
 	for (i = 0; i < height; i++) {
-		unsigned covered = 1;
-		count = (double)tally->counts[i] / largest_bucket * (width-1)+1;
+		unsigned covered = 1, row;
 
-		if (i == 0)
+		/* People expect minimum at the bottom. */
+		row = height - i - 1;
+		count = (double)tally->counts[row] / largest_bucket * (width-1)+1;
+
+		if (row == 0)
 			covered = snprintf(p, width, "%zi", tally->min);
-		else if (i == height - 1)
+		else if (row == height - 1)
 			covered = snprintf(p, width, "%zi", tally->max);
-		else if (i == bucket_of(tally->min, tally->step_bits, 0))
+		else if (row == bucket_of(tally->min, tally->step_bits, 0))
 			*p = '+';
 		else
 			*p = '|';

+ 6 - 15
ccan/tally/test/run-histogram.c

@@ -6,7 +6,6 @@ int main(void)
 	int i;
 	struct tally *tally;
 	char *graph, *p;
-	bool trunc;
 
 	plan_tests(100 + 1 + 10 + 1 + 100 + 1 + 10 + 1 + 10 * 2 + 1);
 
@@ -28,21 +27,13 @@ int main(void)
 	free(graph);
 
 	/* Reduced height. */
-	trunc = false;
 	graph = p = tally_histogram(tally, 20, 10);
 	for (i = 0; i < 10; i++) {
 		char *eol = strchr(p, '\n');
 
-		/* Last once can be truncated (bucket aliasing) */
+		/* First once can be truncated (bucket aliasing) */
 		if (eol) {
-			if (eol - p < 20) {
-				ok1(!trunc);
-				trunc = true;
-			} else if (eol - p == 20) {
-				ok1(!trunc);
-			} else {
-				fail("Overwidth line %s", p);
-			}
+			ok1(eol - p == 20 || (eol - p < 20 && i == 0));
 		} else
 			/* We should, at worst, half-fill graph */
 			ok1(i > 5);
@@ -76,7 +67,7 @@ int main(void)
 	graph = p = tally_histogram(tally, 10, 10);
 	for (i = 0; i < 10; i++) {
 		char *eol = strchr(p, '\n');
-		ok1(eol - p == i+1);
+		ok1(eol - p == 10 - i);
 		p = eol + 1;
 	}
 	ok1(!*p);
@@ -99,10 +90,10 @@ int main(void)
 
 		/* Check min/max labels. */
 		if (i == 0)
-			ok1(strncmp(p, "-5*", 3) == 0);
-		else if (i == 9)
 			ok1(strncmp(p, "4*", 2) == 0);
-		else if (i == 5)
+		else if (i == 9)
+			ok1(strncmp(p, "-5*", 3) == 0);
+		else if (i == 4)
 			ok1(p[0] == '+'); /* 0 marker */
 		else
 			ok1(p[0] == '|');