diff options
| -rw-r--r-- | doc/en/aptitude.xml | 25 | ||||
| -rw-r--r-- | src/cmdline/cmdline_progress_display.cc | 100 | ||||
| -rw-r--r-- | src/cmdline/cmdline_progress_display.h | 24 | ||||
| -rw-r--r-- | src/cmdline/cmdline_search_progress.cc | 6 | ||||
| -rw-r--r-- | src/cmdline/mocks/cmdline_progress_display.h | 2 | ||||
| -rw-r--r-- | tests/Makefile.am | 1 | ||||
| -rw-r--r-- | tests/test_cmdline_progress_display.cc | 492 | ||||
| -rw-r--r-- | tests/test_cmdline_search_progress.cc | 17 |
8 files changed, 596 insertions, 71 deletions
diff --git a/doc/en/aptitude.xml b/doc/en/aptitude.xml index 68cdb0ee..89a2404b 100644 --- a/doc/en/aptitude.xml +++ b/doc/en/aptitude.xml @@ -10754,6 +10754,31 @@ e: Examine !: Apply .: Next ,: Previous</screen> </seg> </seglistitem> + <seglistitem id='configCmdLine-Progress-Percent-On-Right'> + <seg><literal>Aptitude::CmdLine::Progress::Percent-On-Right</literal></seg> + <seg><literal>false</literal></seg> + <seg> + This option controls whether command-line progress + indicators display the percentage on the left-hand + side of the screen, in the same style as &apt-get;, or + on the right-hand side (the default). This option + does not affect download progress indicators. + </seg> + </seglistitem> + + <seglistitem id='configCmdLine-Progress-Retain-Completed'> + <seg><literal>Aptitude::CmdLine::Progress::Retain-Completed</literal></seg> + <seg><literal>false</literal></seg> + <seg> + If this value is <literal>false</literal>, then + command-line progress indicators will be deleted and + overwritten once the task they represent is completed. + If it is <literal>true</literal>, then they will be + left on the terminal. This option does not affect + download progress indicators. + </seg> + </seglistitem> + <seglistitem id='configCmdLine-Request-Strictness'> <seg><literal>Aptitude::CmdLine::Request-Strictness</literal></seg> <seg><literal>10000</literal></seg> diff --git a/src/cmdline/cmdline_progress_display.cc b/src/cmdline/cmdline_progress_display.cc index 106053a8..6485d682 100644 --- a/src/cmdline/cmdline_progress_display.cc +++ b/src/cmdline/cmdline_progress_display.cc @@ -22,8 +22,14 @@ #include "transient_message.h" -#include <generic/util/progress_info.h> +#include <aptitude.h> +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <generic/apt/apt.h> +#include <generic/apt/config_signal.h> +#include <generic/util/progress_info.h> // System includes: #include <boost/format.hpp> @@ -53,25 +59,41 @@ namespace aptitude class progress_display_impl : public progress_display { + // Set to "true" when done() is called, and to "false" when + // any other method is called. Used to suppress calls to + // done() when a "Done" message is already being displayed. + bool is_done; + // The last progress that was displayed; we always update the // display if the mode or the message changed. progress_info last_progress; shared_ptr<transient_message> message; + bool old_style_percentage; + bool retain_completed; + // Using the current time and the progress information to // display, determine if an update is required. bool should_update(const progress_info &progress) const; public: - progress_display_impl(const shared_ptr<transient_message> &_message); + progress_display_impl(const shared_ptr<transient_message> &_message, + bool _old_style_percentage, + bool _retain_completed); void set_progress(const progress_info &progress); + void done(); }; - progress_display_impl::progress_display_impl(const shared_ptr<transient_message> &_message) - : last_progress(progress_info::none()), - message(_message) + progress_display_impl::progress_display_impl(const shared_ptr<transient_message> &_message, + bool _old_style_percentage, + bool _retain_completed) + : is_done(false), + last_progress(progress_info::none()), + message(_message), + old_style_percentage(_old_style_percentage), + retain_completed(_retain_completed) { } @@ -101,14 +123,23 @@ namespace aptitude break; case progress_type_pulse: - message->set_text( (wformat(L"[----] %s") - % transcode(progress.get_progress_status())).str() ); + if(old_style_percentage) + message->set_text( (wformat(L"%s...") + % transcode(progress.get_progress_status())).str() ); + else + message->set_text( (wformat(L"[----] %s") + % transcode(progress.get_progress_status())).str() ); break; case progress_type_bar: - message->set_text( (wformat(L"[%3d%%] %s") - % progress.get_progress_percent_int() - % transcode(progress.get_progress_status())).str() ); + if(old_style_percentage) + message->set_text( (wformat(L"%s... %d%%") + % transcode(progress.get_progress_status()) + % progress.get_progress_percent_int()).str() ); + else + message->set_text( (wformat(L"[%3d%%] %s") + % progress.get_progress_percent_int() + % transcode(progress.get_progress_status())).str() ); break; default: @@ -116,9 +147,40 @@ namespace aptitude break; } + is_done = false; last_progress = progress; } } + + void progress_display_impl::done() + { + if(last_progress.get_type() != progress_type_none && + !is_done) + { + if(retain_completed) + { + const std::wstring msg = + transcode(last_progress.get_progress_status()); + if(old_style_percentage) + message->set_text( (wformat(L"%s... %s") + % msg + % transcode(_("Done"))).str() ); + else + // ForTranslators: the string replacing "DONE" will + // be truncated or padded to 4 characters. + message->set_text( (wformat(L"[%4s] %s") + % transcode(_("DONE")) + % msg).str() ); + + message->preserve_and_advance(); + } + else + message->set_text(L""); + + last_progress = progress_info::none(); + is_done = true; + } + } } progress_display::~progress_display() @@ -126,9 +188,13 @@ namespace aptitude } shared_ptr<progress_display> - create_progress_display(const shared_ptr<transient_message> &message) + create_progress_display(const shared_ptr<transient_message> &message, + bool old_style_percentage, + bool retain_completed) { - return make_shared<progress_display_impl>(message); + return make_shared<progress_display_impl>(message, + old_style_percentage, + retain_completed); } shared_ptr<progress_display> @@ -138,7 +204,15 @@ namespace aptitude const shared_ptr<transient_message> message = create_transient_message(term, term_locale); - return create_progress_display(message); + const bool old_style_percentage = + aptcfg->FindB(PACKAGE "::CmdLine::Progress::Percent-On-Right", false); + + const bool retain_completed = + aptcfg->FindB(PACKAGE "::CmdLine::Progress::Retain-Completed", false); + + return create_progress_display(message, + old_style_percentage, + retain_completed); } } } diff --git a/src/cmdline/cmdline_progress_display.h b/src/cmdline/cmdline_progress_display.h index 370b08b2..74339af4 100644 --- a/src/cmdline/cmdline_progress_display.h +++ b/src/cmdline/cmdline_progress_display.h @@ -55,11 +55,31 @@ namespace aptitude * \param progress The new progress information to display. */ virtual void set_progress(const aptitude::util::progress_info &progress) = 0; + + /** \brief Mark the currently displayed progress as done. + * + * Depending on the current configuration, this will either + * blank the output line or display a "done" message and + * advance to the next line. + */ + virtual void done() = 0; }; - /** \brief Create a blank progress display. */ + /** \brief Create a blank progress display. + * + * \param message The message object used to display the progress + * message. + * + * \param old_style_percentage The output mode. Either "[NNN%] msg" + * (new) or "msg... NNN%" (old). + * + * \param retain_completed If \b true, completed messages will be + * retained instead of being deleted. + */ boost::shared_ptr<progress_display> - create_progress_display(const boost::shared_ptr<transient_message> &message); + create_progress_display(const boost::shared_ptr<transient_message> &message, + bool old_style_percentage, + bool retain_completed); /** \brief Create a blank progress display. * diff --git a/src/cmdline/cmdline_search_progress.cc b/src/cmdline/cmdline_search_progress.cc index 6765262f..d53b0b66 100644 --- a/src/cmdline/cmdline_search_progress.cc +++ b/src/cmdline/cmdline_search_progress.cc @@ -64,6 +64,7 @@ namespace aptitude } void set_progress(const progress_info &info); + void done(); }; void search_progress::set_progress(const progress_info &info) @@ -100,6 +101,11 @@ namespace aptitude throttle->reset_timer(); } + + void search_progress::done() + { + display->done(); + } } shared_ptr<progress_display> diff --git a/src/cmdline/mocks/cmdline_progress_display.h b/src/cmdline/mocks/cmdline_progress_display.h index e7087e43..3bc769b3 100644 --- a/src/cmdline/mocks/cmdline_progress_display.h +++ b/src/cmdline/mocks/cmdline_progress_display.h @@ -38,6 +38,8 @@ namespace aptitude { public: MOCK_METHOD1(set_progress, void(const aptitude::util::progress_info &)); + + MOCK_METHOD0(done, void()); }; } } diff --git a/tests/Makefile.am b/tests/Makefile.am index 28d501bf..d3ff647c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -8,6 +8,7 @@ LDADD = $(top_builddir)/src/loggers.o \ $(top_builddir)/src/gtk/controllers/libgtk-controllers.a \ $(top_builddir)/src/gtk/views/libgtk-views.a \ $(top_builddir)/src/generic/apt/matching/libgeneric-matching.a \ +$(top_builddir)/src/cmdline/libcmdline.a \ $(top_builddir)/src/generic/apt/libgeneric-apt.a \ $(top_builddir)/src/generic/apt/matching/libgeneric-matching.a \ $(top_builddir)/src/generic/problemresolver/libgeneric-problemresolver.a \ diff --git a/tests/test_cmdline_progress_display.cc b/tests/test_cmdline_progress_display.cc index d3c2cf16..682f834b 100644 --- a/tests/test_cmdline_progress_display.cc +++ b/tests/test_cmdline_progress_display.cc @@ -38,26 +38,80 @@ using aptitude::cmdline::progress_display; using aptitude::util::progress_info; using boost::make_shared; using boost::shared_ptr; +using testing::AnyNumber; +using testing::AtMost; +using testing::Expectation; +using testing::HasSubstr; using testing::StrEq; using testing::StrNe; -using testing::Test; +using testing::TestWithParam; +using testing::Values; using testing::_; namespace mocks = aptitude::cmdline::mocks; namespace { - struct CmdlineProgressDisplayTest : public Test + class CmdlineProgressDisplayParams + { + bool old_style_percentage; + bool retain_completed; + + public: + CmdlineProgressDisplayParams(bool _old_style_percentage, + bool _retain_completed) + : old_style_percentage(_old_style_percentage), + retain_completed(_retain_completed) + { + } + + bool get_old_style_percentage() const { return old_style_percentage; } + bool get_retain_completed() const { return retain_completed; } + }; + + std::ostream &operator<<(std::ostream &out, + const CmdlineProgressDisplayParams ¶ms) + { + return out << "(" + << "old_style_percentage = " + << (params.get_old_style_percentage() ? "true" : "false") + << ", " + << "retain_completed = " + << (params.get_retain_completed() ? "true" : "false") + << ")"; + } + + struct CmdlineProgressDisplayTest + : public TestWithParam<CmdlineProgressDisplayParams> { shared_ptr<mocks::transient_message> msg; shared_ptr<progress_display> progress; + bool get_old_style_percentage() const + { + return GetParam().get_old_style_percentage(); + } + + bool get_retain_completed() const + { + return GetParam().get_retain_completed(); + } + CmdlineProgressDisplayTest() - : msg(make_shared<mocks::transient_message>()), - progress(create_progress_display(msg)) + : msg(make_shared<mocks::transient_message>()) { } + // It's not documented anywhere, but from the examples and my + // intuition about how TEST_P is probably implemented, I bet that + // we can't access GetParm() until SetUp: + void SetUp() + { + progress = create_progress_display(msg, + get_old_style_percentage(), + get_retain_completed()); + } + // Define shorter names for the progress_info constructors. progress_info none() { @@ -76,16 +130,30 @@ namespace }; } -TEST_F(CmdlineProgressDisplayTest, InitialShowNoneHasNoEffect) +#define EXPECT_NO_RETAIN_COMPLETED() \ + EXPECT_CALL(*msg, preserve_and_advance()).Times(0) + +#define MAYBE_EXPECT_RETAIN_COMPLETED() \ + EXPECT_CALL(*msg, preserve_and_advance()) \ + .Times(get_retain_completed() ? 1 : 0) + +#define MAYBE_EXPECT_CLEAR_COMPLETED() \ + EXPECT_CALL(*msg, set_text(StrEq(L""))) \ + .Times(get_retain_completed() ? 0 : 1) + +TEST_P(CmdlineProgressDisplayTest, InitialShowNoneHasNoEffect) { EXPECT_CALL(*msg, set_text(_)) .Times(0); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(none()); } -TEST_F(CmdlineProgressDisplayTest, ShowNoneAfterPulse) +TEST_P(CmdlineProgressDisplayTest, ShowNoneAfterPulse) { + EXPECT_NO_RETAIN_COMPLETED(); + EXPECT_CALL(*msg, set_text(StrNe(L""))); EXPECT_CALL(*msg, set_text(StrEq(L""))); @@ -93,188 +161,500 @@ TEST_F(CmdlineProgressDisplayTest, ShowNoneAfterPulse) progress->set_progress(none()); } -TEST_F(CmdlineProgressDisplayTest, ShowPulse) +TEST_P(CmdlineProgressDisplayTest, ShowPulse) { - EXPECT_CALL(*msg, set_text(StrEq(L"[----] Hello world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Hello world..."))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[----] Hello world"))); + + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(pulse("Hello world")); } -TEST_F(CmdlineProgressDisplayTest, ShowBarNegative) +TEST_P(CmdlineProgressDisplayTest, ShowBarNegative) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] Before the beginning of the world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Before the beginning of the world... 0%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] Before the beginning of the world"))); + + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(-1, "Before the beginning of the world")); } -TEST_F(CmdlineProgressDisplayTest, ShowBarZero) +TEST_P(CmdlineProgressDisplayTest, ShowBarZero) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] Beginning world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Beginning world... 0%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] Beginning world"))); + + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0, "Beginning world")); } -TEST_F(CmdlineProgressDisplayTest, ShowBarRoundUp) +TEST_P(CmdlineProgressDisplayTest, ShowBarRoundUp) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 50%] Almost middle world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Almost middle world... 50%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 50%] Almost middle world"))); + + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.499, "Almost middle world")); } -TEST_F(CmdlineProgressDisplayTest, ShowBarRoundUpInMiddle) +TEST_P(CmdlineProgressDisplayTest, ShowBarRoundUpInMiddle) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 50%] Almost middle world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Almost middle world... 50%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 50%] Almost middle world"))); + + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.495, "Almost middle world")); } -TEST_F(CmdlineProgressDisplayTest, ShowBarMiddleExact) +TEST_P(CmdlineProgressDisplayTest, ShowBarMiddleExact) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 50%] Middle world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Middle world... 50%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 50%] Middle world"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.50, "Middle world")); } -TEST_F(CmdlineProgressDisplayTest, ShowBarRoundDown) +TEST_P(CmdlineProgressDisplayTest, ShowBarRoundDown) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 50%] Just past middle world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Just past middle world... 50%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 50%] Just past middle world"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.501, "Just past middle world")); } -TEST_F(CmdlineProgressDisplayTest, ShowBarComplete) +TEST_P(CmdlineProgressDisplayTest, ShowBarComplete) { - EXPECT_CALL(*msg, set_text(StrEq(L"[100%] Finished world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Finished world... 100%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[100%] Finished world"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(1, "Finished world")); } -TEST_F(CmdlineProgressDisplayTest, FractionTooLarge) +TEST_P(CmdlineProgressDisplayTest, FractionTooLarge) { - EXPECT_CALL(*msg, set_text(StrEq(L"[100%] Past the end of the world"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Past the end of the world... 100%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[100%] Past the end of the world"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(100, "Past the end of the world")); } -TEST_F(CmdlineProgressDisplayTest, SuppressDuplicateNones) +TEST_P(CmdlineProgressDisplayTest, SuppressDuplicateNones) { EXPECT_CALL(*msg, set_text(StrNe(L""))); EXPECT_CALL(*msg, set_text(StrEq(L""))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(pulse("Irrelevant data")); progress->set_progress(none()); progress->set_progress(none()); } -TEST_F(CmdlineProgressDisplayTest, PulseSuppressesDuplicateMessage) +TEST_P(CmdlineProgressDisplayTest, PulseSuppressesDuplicateMessage) { - EXPECT_CALL(*msg, set_text(StrEq(L"[----] Some message"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Some message..."))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[----] Some message"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(pulse("Some message")); progress->set_progress(pulse("Some message")); } -TEST_F(CmdlineProgressDisplayTest, BarSuppressesDuplicateSettings) +TEST_P(CmdlineProgressDisplayTest, BarSuppressesDuplicateSettings) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 66%] Some message"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Some message... 66%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 66%] Some message"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.66, "Some message")); progress->set_progress(bar(0.66, "Some message")); } -TEST_F(CmdlineProgressDisplayTest, BarSuppressesAlmostDuplicateSettings) +TEST_P(CmdlineProgressDisplayTest, BarSuppressesAlmostDuplicateSettings) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 66%] Some message"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Some message... 66%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 66%] Some message"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.661, "Some message")); progress->set_progress(bar(0.662, "Some message")); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromNoneToPulse) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromNoneToPulse) { - EXPECT_CALL(*msg, set_text(StrEq(L"[----] Pulse"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Pulse..."))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[----] Pulse"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(none()); progress->set_progress(pulse("Pulse")); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromNoneToEmptyBar) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromNoneToEmptyBar) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] "))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"... 0%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] "))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(none()); progress->set_progress(bar(0, "")); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromNoneToNonEmptyBar) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromNoneToNonEmptyBar) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 33%] Pelagic argosy"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Pelagic argosy... 33%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 33%] Pelagic argosy"))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(none()); progress->set_progress(bar(0.33, "Pelagic argosy")); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromPulseToNone) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromPulseToNone) { - EXPECT_CALL(*msg, set_text(StrEq(L"[----] Beware the leopard"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Beware the leopard..."))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[----] Beware the leopard"))); EXPECT_CALL(*msg, set_text(StrEq(L""))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(pulse("Beware the leopard")); progress->set_progress(none()); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromPulseToZeroBar) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromPulseToZeroBar) { // Check that it doesn't get confused and think that the second // setting is identical to the first. - EXPECT_CALL(*msg, set_text(StrEq(L"[----] Wobbly Weasel"))); // Future Ubuntu codename? - EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] Wobbly Weasel"))); + if(get_old_style_percentage()) + { + EXPECT_CALL(*msg, set_text(StrEq(L"Wobbly Weasel..."))); + EXPECT_CALL(*msg, set_text(StrEq(L"Wobbly Weasel... 0%"))); + } + else + { + EXPECT_CALL(*msg, set_text(StrEq(L"[----] Wobbly Weasel"))); + EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] Wobbly Weasel"))); + } + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(pulse("Wobbly Weasel")); progress->set_progress(bar(0, "Wobbly Weasel")); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromZeroBarToNone) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromZeroBarToNone) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] Bar None"))); - EXPECT_CALL(*msg, set_text(StrEq(L""))); + if(get_old_style_percentage()) + { + EXPECT_CALL(*msg, set_text(StrEq(L"Bar None... 0%"))); + EXPECT_CALL(*msg, set_text(StrEq(L""))); + } + else + { + EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] Bar None"))); + EXPECT_CALL(*msg, set_text(StrEq(L""))); + } + + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0, "Bar None")); progress->set_progress(none()); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromNonZeroBarToNone) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromNonZeroBarToNone) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 21%] Albatross"))); + if(get_old_style_percentage()) + EXPECT_CALL(*msg, set_text(StrEq(L"Albatross... 21%"))); + else + EXPECT_CALL(*msg, set_text(StrEq(L"[ 21%] Albatross"))); + EXPECT_CALL(*msg, set_text(StrEq(L""))); + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.21, "Albatross")); progress->set_progress(none()); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromZeroBarToPulse) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromZeroBarToPulse) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] All I've got is this bloody albatross"))); - EXPECT_CALL(*msg, set_text(StrEq(L"[----] All I've got is this bloody albatross"))); + if(get_old_style_percentage()) + { + EXPECT_CALL(*msg, set_text(StrEq(L"All I've got is this bloody albatross... 0%"))); + EXPECT_CALL(*msg, set_text(StrEq(L"All I've got is this bloody albatross..."))); + } + else + { + EXPECT_CALL(*msg, set_text(StrEq(L"[ 0%] All I've got is this bloody albatross"))); + EXPECT_CALL(*msg, set_text(StrEq(L"[----] All I've got is this bloody albatross"))); + } + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0, "All I've got is this bloody albatross")); progress->set_progress(pulse("All I've got is this bloody albatross")); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromNonZeroBarToPulse) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromNonZeroBarToPulse) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 11%] Bop"))); - EXPECT_CALL(*msg, set_text(StrEq(L"[----] Bop"))); + if(get_old_style_percentage()) + { + EXPECT_CALL(*msg, set_text(StrEq(L"Bop... 11%"))); + EXPECT_CALL(*msg, set_text(StrEq(L"Bop..."))); + } + else + { + EXPECT_CALL(*msg, set_text(StrEq(L"[ 11%] Bop"))); + EXPECT_CALL(*msg, set_text(StrEq(L"[----] Bop"))); + } + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.11, "Bop")); progress->set_progress(pulse("Bop")); } -TEST_F(CmdlineProgressDisplayTest, CanSwitchFromNonZeroBarToDifferentPulse) +TEST_P(CmdlineProgressDisplayTest, CanSwitchFromNonZeroBarToDifferentPulse) { - EXPECT_CALL(*msg, set_text(StrEq(L"[ 11%] Zip"))); - EXPECT_CALL(*msg, set_text(StrEq(L"[----] Bop"))); + if(get_old_style_percentage()) + { + EXPECT_CALL(*msg, set_text(StrEq(L"Zip... 11%"))); + EXPECT_CALL(*msg, set_text(StrEq(L"Bop..."))); + } + else + { + EXPECT_CALL(*msg, set_text(StrEq(L"[ 11%] Zip"))); + EXPECT_CALL(*msg, set_text(StrEq(L"[----] Bop"))); + } + EXPECT_NO_RETAIN_COMPLETED(); progress->set_progress(bar(0.11, "Zip")); progress->set_progress(pulse("Bop")); } + +TEST_P(CmdlineProgressDisplayTest, DoneAfterNoneHasNoEffect) +{ + // This behavior is tested elsewhere: + EXPECT_CALL(*msg, set_text(StrEq(L""))) + .Times(AtMost(1)); + + EXPECT_NO_RETAIN_COMPLETED(); + + progress->set_progress(none()); + progress->done(); + // Test multiple done()s too. + progress->done(); + progress->done(); +} + +TEST_P(CmdlineProgressDisplayTest, DoneAfterPulse) +{ + // Expect one call to set_text() up-front, to set up the pre-done + // display. + Expectation text_set; + if(get_old_style_percentage()) + text_set = EXPECT_CALL(*msg, set_text(StrEq(L"Marvelous Monkey..."))); + else + text_set = EXPECT_CALL(*msg, set_text(StrEq(L"[----] Marvelous Monkey"))); + + Expectation maybe_done = text_set; + + // First, we should get a Done if we're retaining completed tasks. + if(get_retain_completed()) + { + if(get_old_style_percentage()) + maybe_done = + EXPECT_CALL(*msg, set_text(StrEq(L"Marvelous Monkey... Done"))) + .After(text_set); + else + maybe_done = + EXPECT_CALL(*msg, set_text(StrEq(L"[DONE] Marvelous Monkey"))) + .After(text_set); + } + + // Next, we should get a call to preserve_and_advance(), or a call + // to clear the message if that's disabled. + MAYBE_EXPECT_RETAIN_COMPLETED() + .After(text_set); + MAYBE_EXPECT_CLEAR_COMPLETED() + .After(text_set); + + progress->set_progress(pulse("Marvelous Monkey")); + progress->done(); +} + +TEST_P(CmdlineProgressDisplayTest, DoneAfterBar) +{ + // Expect one call to set_text() up-front, to set up the pre-done display. + Expectation text_set; + + if(get_old_style_percentage()) + text_set = EXPECT_CALL(*msg, set_text(StrEq(L"Ack... 98%"))); + else + text_set = EXPECT_CALL(*msg, set_text(StrEq(L"[ 98%] Ack"))); + + Expectation maybe_done = text_set; + + // First, we should get a Done if we're retaining completed tasks. + if(get_retain_completed()) + { + if(get_old_style_percentage()) + maybe_done = + EXPECT_CALL(*msg, set_text(StrEq(L"Ack... Done"))) + .After(text_set); + else + maybe_done = + EXPECT_CALL(*msg, set_text(StrEq(L"[DONE] Ack"))) + .After(text_set); + } + + // Next, we should get a call to preserve_and_advance(), or a call + // to clear the message if that's disabled. + MAYBE_EXPECT_RETAIN_COMPLETED() + .After(maybe_done); + MAYBE_EXPECT_CLEAR_COMPLETED() + .After(maybe_done); + + progress->set_progress(bar(0.98, "Ack")); + progress->done(); +} + +TEST_P(CmdlineProgressDisplayTest, DoneAfterDone) +{ + // This test is exactly identical to the pulse() test, except that + // we invoke done() twice. The point is that the second done() has + // no effect. + + + // Expect one call to set_text() up-front, to set up the pre-done + // display. + Expectation text_set; + if(get_old_style_percentage()) + text_set = EXPECT_CALL(*msg, set_text(StrEq(L"Marvelous Monkey..."))); + else + text_set = EXPECT_CALL(*msg, set_text(StrEq(L"[----] Marvelous Monkey"))); + + Expectation maybe_done = text_set; + + // First, we should get a Done if we're retaining completed tasks. + if(get_retain_completed()) + { + if(get_old_style_percentage()) + maybe_done = + EXPECT_CALL(*msg, set_text(StrEq(L"Marvelous Monkey... Done"))) + .After(text_set); + else + maybe_done = + EXPECT_CALL(*msg, set_text(StrEq(L"[DONE] Marvelous Monkey"))) + .After(text_set); + } + + // Next, we should get a call to preserve_and_advance(), or a call + // to clear the message if that's disabled. + MAYBE_EXPECT_RETAIN_COMPLETED() + .After(text_set); + MAYBE_EXPECT_CLEAR_COMPLETED() + .After(text_set); + + progress->set_progress(pulse("Marvelous Monkey")); + progress->done(); + progress->done(); +} + +TEST_P(CmdlineProgressDisplayTest, NoneAfterDone) +{ + // This test is exactly identical to the pulse() test, except that + // we send none() after invoking done(). The point is that the + // none() has no effect even though the previously set progress + // value was not none(). + + + // Expect one call to set_text() up-front, to set up the pre-done + // display. + Expectation text_set; + if(get_old_style_percentage()) + text_set = EXPECT_CALL(*msg, set_text(StrEq(L"Marvelous Monkey..."))); + else + text_set = EXPECT_CALL(*msg, set_text(StrEq(L"[----] Marvelous Monkey"))); + + Expectation maybe_done = text_set; + + // First, we should get a Done if we're retaining completed tasks. + if(get_retain_completed()) + { + if(get_old_style_percentage()) + maybe_done = + EXPECT_CALL(*msg, set_text(StrEq(L"Marvelous Monkey... Done"))) + .After(text_set); + else + maybe_done = + EXPECT_CALL(*msg, set_text(StrEq(L"[DONE] Marvelous Monkey"))) + .After(text_set); + } + + // Next, we should get a call to preserve_and_advance(), or a call + // to clear the message if that's disabled. + MAYBE_EXPECT_RETAIN_COMPLETED() + .After(text_set); + MAYBE_EXPECT_CLEAR_COMPLETED() + .After(text_set); + + progress->set_progress(pulse("Marvelous Monkey")); + progress->done(); + progress->set_progress(none()); + // See what happens if a few more none()s are set. + progress->set_progress(none()); + progress->set_progress(none()); +} + +INSTANTIATE_TEST_CASE_P(CmdlineProgressDisplayTestOldStyleAndRetainCompleted, + CmdlineProgressDisplayTest, + Values(CmdlineProgressDisplayParams(true, true))); + +INSTANTIATE_TEST_CASE_P(CmdlineProgressDisplayTestOldStyleAndNoRetainCompleted, + CmdlineProgressDisplayTest, + Values(CmdlineProgressDisplayParams(true, false))); + +INSTANTIATE_TEST_CASE_P(CmdlineProgressDisplayTestNewStyleAndRetainCompleted, + CmdlineProgressDisplayTest, + Values(CmdlineProgressDisplayParams(false, true))); + +INSTANTIATE_TEST_CASE_P(CmdlineProgressDisplayTestNewStyleAndNoRetainCompleted, + CmdlineProgressDisplayTest, + Values(CmdlineProgressDisplayParams(false, false))); diff --git a/tests/test_cmdline_search_progress.cc b/tests/test_cmdline_search_progress.cc index 24749e35..0f868e5b 100644 --- a/tests/test_cmdline_search_progress.cc +++ b/tests/test_cmdline_search_progress.cc @@ -216,3 +216,20 @@ TEST_F(CmdlineSearchProgressTest, ThrottledProgressBar) search_progress->set_progress(info); } + +TEST_F(CmdlineSearchProgressTest, Done) +{ + never_throttle(); + EXPECT_CALL(*progress_display, done()); + + search_progress->done(); +} + +// Test that Done ignores throttling. +TEST_F(CmdlineSearchProgressTest, DoneThrottled) +{ + always_throttle(); + EXPECT_CALL(*progress_display, done()); + + search_progress->done(); +} |
