@@ -123,6 +123,10 @@ enum Subcommand {
123123 /// `implementation-status`es that changes should be applied to.
124124 #[ clap( value_enum, long, default_value = "backlog" ) ]
125125 implementation_status : Vec < ImplementationStatus > ,
126+ /// Assumptions about report coverage that affect cases where tests are present in
127+ /// metadata, but not in reports.
128+ #[ clap( flatten) ]
129+ on_missing : Option < OnMissing > ,
126130 /// What do when only `SKIP` outcomes are found for tests and subtests.
127131 #[ clap( value_enum, long, default_value_t = OnSkipOnly :: Reconcile ) ]
128132 on_skip_only : OnSkipOnly ,
@@ -205,6 +209,32 @@ impl From<UpdateExpectedPreset> for process_reports::ReportProcessingPreset {
205209 }
206210}
207211
212+ /// See [`Subcommand::UpdateExpected::on_missing`].
213+ #[ derive( Clone , Debug , Parser ) ]
214+ pub ( crate ) struct OnMissing {
215+ #[ clap( long = "on-missing-log-level" ) ]
216+ log_level : Option < log:: Level > ,
217+ #[ clap( long = "on-missing-delete-because" ) ]
218+ delete_because : Option < String > ,
219+ }
220+
221+ impl From < OnMissing > for process_reports:: OnMissing {
222+ fn from ( value : OnMissing ) -> Self {
223+ let OnMissing {
224+ log_level,
225+ delete_because,
226+ } = value;
227+
228+ let delete_because = delete_because. map ( |s| & * s. leak ( ) ) ;
229+
230+ // OPT: big hack, oh goodness
231+ Self {
232+ log_level,
233+ delete_because,
234+ }
235+ }
236+ }
237+
208238/// See [`Subcommand::UpdateExpected::on_skip_only`].
209239#[ derive( Clone , Copy , Debug , ValueEnum ) ]
210240pub ( crate ) enum OnSkipOnly {
@@ -290,6 +320,10 @@ fn run(cli: Cli) -> ExitCode {
290320 exec_report_spec,
291321 process_reports:: ReportProcessingPreset :: MigrateTestStructure ,
292322 & mut should_update_expected:: NeverUpdateExpected ,
323+ process_reports:: OnMissing {
324+ log_level : Some ( log:: Level :: Info ) ,
325+ delete_because : None ,
326+ } ,
293327 OnSkipOnly :: Ignore . into ( ) ,
294328 ) {
295329 Ok ( ( ) ) => ExitCode :: SUCCESS ,
@@ -299,6 +333,7 @@ fn run(cli: Cli) -> ExitCode {
299333 exec_report_spec,
300334 preset,
301335 implementation_status,
336+ on_missing,
302337 on_skip_only,
303338 } => {
304339 assert ! (
@@ -309,6 +344,20 @@ fn run(cli: Cli) -> ExitCode {
309344 )
310345 ) ;
311346 let allowed_implementation_statuses = EnumSet :: from_iter ( implementation_status) ;
347+
348+ let on_missing = on_missing. map ( Into :: into) . unwrap_or_else ( || match preset {
349+ UpdateExpectedPreset :: Merge => process_reports:: OnMissing {
350+ log_level : Some ( log:: Level :: Warn ) ,
351+ delete_because : None ,
352+ } ,
353+ UpdateExpectedPreset :: ResetAll | UpdateExpectedPreset :: ResetContradictory => {
354+ process_reports:: OnMissing {
355+ log_level : Some ( log:: Level :: Warn ) ,
356+ delete_because : Some ( "expecting full test coverage" ) ,
357+ }
358+ }
359+ } ) ;
360+
312361 match process_reports (
313362 browser,
314363 & checkout,
@@ -317,6 +366,7 @@ fn run(cli: Cli) -> ExitCode {
317366 & mut should_update_expected:: ImplementationStatusFilter {
318367 allowed : allowed_implementation_statuses,
319368 } ,
369+ on_missing,
320370 on_skip_only. into ( ) ,
321371 ) {
322372 Ok ( ( ) ) => ExitCode :: SUCCESS ,
@@ -1372,6 +1422,7 @@ fn process_reports(
13721422 exec_report_spec : ExecReportSpec ,
13731423 preset : process_reports:: ReportProcessingPreset ,
13741424 should_update_expected : & mut dyn ShouldUpdateExpected ,
1425+ on_missing : process_reports:: OnMissing ,
13751426 on_skip_only : process_reports:: OnSkipOnly ,
13761427) -> Result < ( ) , AlreadyReportedToCommandline > {
13771428 let exec_report_paths = exec_report_spec. paths ( ) ?;
@@ -1386,6 +1437,7 @@ fn process_reports(
13861437 preset,
13871438 should_update_expected,
13881439 meta_files_by_path,
1440+ on_missing,
13891441 on_skip_only,
13901442 } ) ?;
13911443
0 commit comments