瀏覽代碼

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));
 }