code: def test_plan_incoherent_state(
      processing_graph: ProcessingGraph,
      initial: list[str],
      up_to_date: list[str],
      is_empty: list[str],
      unknown: list[str],
  ) -> None:
      for artifact in initial:
          if artifact == ARTIFACT_SA_1_1:
              put_cache(
                  step=STEP_SA,
                  dataset=DATASET_NAME,
                  revision=REVISION_NAME,
                  config=CONFIG_NAME_1,
                  split=SPLIT_NAME_1,
              )
          elif artifact == ARTIFACT_CA_1:
              put_cache(
                  step=STEP_CA,
                  dataset=DATASET_NAME,
                  revision=REVISION_NAME,
                  config=CONFIG_NAME_1,
              )
          elif artifact == ARTIFACT_DA:
              put_cache(
                  step=STEP_DA,
                  dataset=DATASET_NAME,
                  revision=REVISION_NAME,
              )
          elif artifact == ARTIFACT_DD:
              put_cache(
                  step=STEP_DD,
                  dataset=DATASET_NAME,
                  revision=REVISION_NAME,
              )
          elif artifact == ARTIFACT_DI:
              put_cache(
                  step=STEP_DI,
                  dataset=DATASET_NAME,
                  revision=REVISION_NAME,
              )
          else:
              raise NotImplementedError()
  
      dataset_backfill_plan = get_dataset_backfill_plan(
          processing_graph=processing_graph
      )
      assert_dataset_backfill_plan(
          dataset_backfill_plan=dataset_backfill_plan,
          cache_status={
              "cache_has_different_git_revision": [],
              "cache_is_outdated_by_parent": [],
              "cache_is_empty": is_empty,
              "cache_is_error_to_retry": [],
              "cache_is_job_runner_obsolete": [],
              "up_to_date": up_to_date,
          },
          queue_status={"in_process": []},
          tasks=[f"CreateJobs,{len(is_empty)}"],
      )
  
      compute_all(processing_graph=processing_graph)
  
      dataset_backfill_plan = get_dataset_backfill_plan(
          processing_graph=processing_graph
      )
      assert_dataset_backfill_plan(
          dataset_backfill_plan=dataset_backfill_plan,
          cache_status={
              "cache_has_different_git_revision": [],
              "cache_is_outdated_by_parent": [],
              "cache_is_empty": [],
              "cache_is_error_to_retry": [],
              "cache_is_job_runner_obsolete": [],
              "up_to_date": sorted(up_to_date + is_empty + unknown),
          },
          queue_status={"in_process": []},
          tasks=[],
      )
  
imports: from datetime import datetime
  from typing import Optional
  from unittest.mock import patch
  import pytest
  from libcommon.constants import ERROR_CODES_TO_RETRY
  from libcommon.processing_graph import ProcessingGraph
  from libcommon.queue import Queue
  from libcommon.resources import CacheMongoResource, QueueMongoResource
  from libcommon.utils import Priority, Status
  from .utils import ARTIFACT_CA_1, ARTIFACT_CA_2, ARTIFACT_CB_1, ARTIFACT_CB_2, ARTIFACT_DA, ARTIFACT_DA_OTHER_REVISION, ARTIFACT_DB, ARTIFACT_DC, ARTIFACT_DD, ARTIFACT_DE, ARTIFACT_DF, ARTIFACT_DG, ARTIFACT_DH, ARTIFACT_DI, ARTIFACT_SA_1_1, ARTIFACT_SA_1_2, ARTIFACT_SA_2_1, ARTIFACT_SA_2_2, CONFIG_NAME_1, CONFIG_NAMES, DATASET_NAME, DIFFICULTY, OTHER_REVISION_NAME, PROCESSING_GRAPH_FAN_IN_OUT, PROCESSING_GRAPH_GENEALOGY, PROCESSING_GRAPH_ONE_STEP, PROCESSING_GRAPH_PARALLEL, REVISION_NAME, SPLIT_NAME_1, SPLIT_NAMES, STEP_CA, STEP_DA, STEP_DD, STEP_DI, STEP_SA, assert_dataset_backfill_plan, compute_all, get_dataset_backfill_plan, process_all_jobs, process_next_job, put_cache
label_desc: Use image node_id 15 for calling a global function with example usage: test_plan_incoherent_state(processing_graph, initial, up_to_date, is_empty, unknown) without return types