Преглед изворни кода

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 пре 10 година
родитељ
комит
1cb047079a
2 измењених фајлова са 14 додато и 13 уклоњено
  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));
 }