code: def test_assert_equal_forecast_config():
      """Tests `assert_equal_forecast_config`."""
      forecast_config_default = FORECAST_CONFIG_JSON_DEFAULT.get(
          "forecast_config"
      )
      assert_equal_forecast_config(
          forecast_config_default, forecast_config_default
      )
  
      forecast_config_complete = FORECAST_CONFIG_JSON_COMPLETE.get(
          "forecast_config"
      )
      assert_equal_forecast_config(
          forecast_config_complete, forecast_config_complete
      )
  
      # Raises error when the `ForecastConfig`s do not match
      with pytest.raises(
          AssertionError, match="Actual should be a dict, found None."
      ):
          assert_equal_forecast_config(
              forecast_config_default, forecast_config_complete
          )
  
      # Raises error when anomaly dataframe is different, this is not captured by dataclass equality check
      with pytest.raises(
          AssertionError,
          match='\\(column name="start"\\) values are different',
      ):
          anomaly_df = pd.DataFrame(
              {
                  "start": ["2020-01-01", "2020-02-02"],
                  "end": ["2020-01-10", "2020-02-05"],
              }
          )
          config1 = deepcopy(forecast_config_complete)
          config1.metadata_param.anomaly_info = {
              "value_col": "value",
              "anomaly_df": anomaly_df,
          }
  
          anomaly_df = pd.DataFrame(
              {
                  "start": ["2020-01-05", "2020-02-02"],
                  "end": ["2020-01-10", "2020-02-10"],
              }
          )
          config2 = deepcopy(forecast_config_complete)
          config2.metadata_param.anomaly_info = {
              "value_col": "value",
              "anomaly_df": anomaly_df,
          }
          assert_equal_forecast_config(config1, config2)
  
      # Raises error when one of the input is not an `ADConfig`
      with pytest.raises(
          ValueError, match="is not a member of 'ForecastConfig' class."
      ):
          assert_equal_forecast_config(forecast_config_default, 4)
  
imports: import json
  from copy import deepcopy
  from typing import Optional
  import pandas
  import pytest
  from pytest import fail
  from greykite.common.constants import TIME_COL
  from greykite.common.constants import VALUE_COL
  from greykite.common.evaluation import EvaluationMetricEnum
  from greykite.framework.constants import COMPUTATION_N_JOBS
  from greykite.framework.constants import COMPUTATION_VERBOSE
  from greykite.framework.constants import CV_REPORT_METRICS_ALL
  from greykite.framework.constants import EVALUATION_PERIOD_CV_MAX_SPLITS
  from greykite.framework.templates.autogen.forecast_config import ComputationParam
  from greykite.framework.templates.autogen.forecast_config import EvaluationMetricParam
  from greykite.framework.templates.autogen.forecast_config import EvaluationPeriodParam
  from greykite.framework.templates.autogen.forecast_config import ForecastConfig
  from greykite.framework.templates.autogen.forecast_config import MetadataParam
  from greykite.framework.templates.autogen.forecast_config import ModelComponentsParam
  from greykite.framework.templates.autogen.forecast_config import assert_equal_forecast_config
  from greykite.framework.templates.autogen.forecast_config import forecast_config_from_dict
  from greykite.framework.templates.autogen.forecast_config import from_list_dict
  from greykite.framework.templates.autogen.forecast_config import from_list_dict_or_none
  from greykite.framework.templates.autogen.forecast_config_utils import FORECAST_CONFIG_JSON_COMPLETE
  from greykite.framework.templates.autogen.forecast_config_utils import FORECAST_CONFIG_JSON_DEFAULT
  from greykite.framework.templates.forecast_config_defaults import ForecastConfigDefaults
  from greykite.framework.templates.model_templates import ModelTemplateEnum
label_desc: Use image node_id 16 for calling a global function with example usage: test_assert_equal_forecast_config() without return types