@@ -133,6 +133,81 @@ TEST_F(ProgressReportTest, TestReportCreation) {
133133 EXPECT_EQ (data->GetMessage (), " Progress report 1: Starting report 1" );
134134}
135135
136+ TEST_F (ProgressReportTest, TestReportDestructionWithPartialProgress) {
137+ ListenerSP listener_sp = CreateListenerFor (lldb::eBroadcastBitProgress);
138+ EventSP event_sp;
139+ const ProgressEventData *data;
140+
141+ // Create a finite progress report and only increment to a non-completed
142+ // state before destruction.
143+ {
144+ Progress progress (" Finite progress" , " Report 1" , 100 );
145+ progress.Increment (3 );
146+ }
147+
148+ // Verify that the progress in the events are:
149+ // 1. At construction: 0 out of 100
150+ // 2. At increment: 3 out of 100
151+ // 3. At destruction: 100 out of 100
152+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
153+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
154+ EXPECT_EQ (data->GetDetails (), " Report 1" );
155+ EXPECT_TRUE (data->IsFinite ());
156+ EXPECT_EQ (data->GetCompleted (), (uint64_t )0 );
157+ EXPECT_EQ (data->GetTotal (), (uint64_t )100 );
158+ EXPECT_EQ (data->GetMessage (), " Finite progress: Report 1" );
159+
160+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
161+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
162+ EXPECT_EQ (data->GetDetails (), " Report 1" );
163+ EXPECT_TRUE (data->IsFinite ());
164+ EXPECT_EQ (data->GetCompleted (), (uint64_t )3 );
165+ EXPECT_EQ (data->GetTotal (), (uint64_t )100 );
166+ EXPECT_EQ (data->GetMessage (), " Finite progress: Report 1" );
167+
168+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
169+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
170+ EXPECT_EQ (data->GetDetails (), " Report 1" );
171+ EXPECT_TRUE (data->IsFinite ());
172+ EXPECT_EQ (data->GetCompleted (), (uint64_t )100 );
173+ EXPECT_EQ (data->GetTotal (), (uint64_t )100 );
174+ EXPECT_EQ (data->GetMessage (), " Finite progress: Report 1" );
175+
176+ // Create an infinite progress report and increment by some amount.
177+ {
178+ Progress progress (" Infinite progress" , " Report 2" );
179+ progress.Increment (3 );
180+ }
181+
182+ // Verify that the progress in the events are:
183+ // 1. At construction: 0
184+ // 2. At increment: 3
185+ // 3. At destruction: Progress::kNonDeterministicTotal
186+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
187+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
188+ EXPECT_EQ (data->GetDetails (), " Report 2" );
189+ EXPECT_FALSE (data->IsFinite ());
190+ EXPECT_EQ (data->GetCompleted (), (uint64_t )0 );
191+ EXPECT_EQ (data->GetTotal (), Progress::kNonDeterministicTotal );
192+ EXPECT_EQ (data->GetMessage (), " Infinite progress: Report 2" );
193+
194+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
195+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
196+ EXPECT_EQ (data->GetDetails (), " Report 2" );
197+ EXPECT_FALSE (data->IsFinite ());
198+ EXPECT_EQ (data->GetCompleted (), (uint64_t )3 );
199+ EXPECT_EQ (data->GetTotal (), Progress::kNonDeterministicTotal );
200+ EXPECT_EQ (data->GetMessage (), " Infinite progress: Report 2" );
201+
202+ ASSERT_TRUE (listener_sp->GetEvent (event_sp, TIMEOUT));
203+ data = ProgressEventData::GetEventDataFromEvent (event_sp.get ());
204+ EXPECT_EQ (data->GetDetails (), " Report 2" );
205+ EXPECT_FALSE (data->IsFinite ());
206+ EXPECT_EQ (data->GetCompleted (), Progress::kNonDeterministicTotal );
207+ EXPECT_EQ (data->GetTotal (), Progress::kNonDeterministicTotal );
208+ EXPECT_EQ (data->GetMessage (), " Infinite progress: Report 2" );
209+ }
210+
136211TEST_F (ProgressReportTest, TestProgressManager) {
137212 ListenerSP listener_sp =
138213 CreateListenerFor (lldb::eBroadcastBitProgressCategory);
0 commit comments