Quellcode durchsuchen

don't perform int<float in progress bar drawing

Comparing floating numbers is always fun and in this instance a 9 < 9.0
is "somehow" true on hurd-i386 letting the tests fail by reporting that
too much progress achieved. A bit mysterious, but with some rework we
can use code which avoids dealing with the floats in this way entirely
and make our testcases happy.
David Kalnischkies vor 10 Jahren
Ursprung
Commit
1cb047079a
2 geänderte Dateien mit 14 neuen und 13 gelöschten Zeilen
  1. 8 12
      apt-pkg/install-progress.cc
  2. 6 1
      test/libapt/install_progress_test.cc

+ 8 - 12
apt-pkg/install-progress.cc

@@ -14,6 +14,7 @@
 #include <algorithm>
 #include <stdio.h>
 #include <sstream>
+#include <cmath>
 
 #include <apti18n.h>
 
@@ -321,19 +322,14 @@ std::string
 PackageManagerFancy::GetTextProgressStr(float Percent, int OutputSize)
 {
    std::string output;
-   int i;
-   
-   // should we raise a exception here instead?
-   if (Percent < 0.0 || Percent > 1.0 || OutputSize < 3)
+   if (unlikely(OutputSize < 3))
       return output;
-   
-   int BarSize = OutputSize - 2; // bar without the leading "[" and trailing "]"
-   output += "[";
-   for(i=0; i < BarSize*Percent; i++)
-      output += "#";
-   for (/*nothing*/; i < BarSize; i++)
-      output += ".";
-   output += "]";
+
+   int const BarSize = OutputSize - 2; // bar without the leading "[" and trailing "]"
+   int const BarDone = std::max(0, std::min(BarSize, static_cast<int>(std::floor(Percent * BarSize))));
+   output.append("[");
+   std::fill_n(std::fill_n(std::back_inserter(output), BarDone, '#'), BarSize - BarDone, '.');
+   output.append("]");
    return output;
 }
 

+ 6 - 1
test/libapt/install_progress_test.cc

@@ -12,9 +12,14 @@ TEST(InstallProgressTest, FancyGetTextProgressStr)
 
    EXPECT_EQ(60, p.GetTextProgressStr(0.5, 60).size());
    EXPECT_EQ("[#.]", p.GetTextProgressStr(0.5, 4));
+   EXPECT_EQ("[..........]", p.GetTextProgressStr(0.0, 12));
    EXPECT_EQ("[#.........]", p.GetTextProgressStr(0.1, 12));
+   EXPECT_EQ("[####......]", p.GetTextProgressStr(0.4999, 12));
+   EXPECT_EQ("[#####.....]", p.GetTextProgressStr(0.5001, 12));
    EXPECT_EQ("[#########.]", p.GetTextProgressStr(0.9, 12));
+   EXPECT_EQ("[##########]", p.GetTextProgressStr(1.0, 12));
 
    // deal with incorrect inputs gracefully (or should we die instead?)
-   EXPECT_EQ("", p.GetTextProgressStr(-999, 12));
+   EXPECT_EQ("[..........]", p.GetTextProgressStr(-1.0, 12));
+   EXPECT_EQ("[##########]", p.GetTextProgressStr(2.0, 12));
 }