code: def test_hourly_cron_trigger_catchup_next_info(
      last_automated_data_interval: DataInterval | None,
      earliest: pendulum.DateTime | None,
      expected: DagRunInfo | None,
  ) -> None:
      next_info = HOURLY_CRON_TRIGGER_TIMETABLE.next_dagrun_info(
          last_automated_data_interval=last_automated_data_interval,
          restriction=TimeRestriction(
              earliest=earliest, latest=None, catchup=True
          ),
      )
      assert next_info == expected
  
file_path: airflow/tests/timetables/test_trigger_timetable.py
imports: from __future__ import annotations
  import datetime
  import typing
  import dateutil.relativedelta
  import pendulum
  import pytest
  import time_machine
  from airflow.exceptions import AirflowTimetableInvalid
  from airflow.timetables.base import DagRunInfo, DataInterval, TimeRestriction
  from airflow.timetables.trigger import CronTriggerTimetable
  from airflow.utils.timezone import utc
label_desc: Use image node_id 3 for calling a global function with example usage: test_hourly_cron_trigger_catchup_next_info(last_automated_data_interval, earliest, expected) without return types