text: # Unit test predict_interval ForecasterAutoregCustom
  # ==============================================================================
  import numpy as np
  import pandas as pd
  from skforecast.ForecasterAutoregCustom import ForecasterAutoregCustom
  from sklearn.linear_model import LinearRegression
  
  
  def create_predictors(y):
      '''
      Create first 5 lags of a time series.
      '''
      
      lags = y[-1:-6:-1]
      
      return lags 
      
  
  def test_predict_interval_output_when_forecaster_is_LinearRegression_steps_is_1_in_sample_residuals_is_True():
      '''
      Test output when regressor is LinearRegression and one step ahead is predicted
      using in sample residuals.
      '''
      forecaster = ForecasterAutoregCustom(
                          regressor      = LinearRegression(),
                          fun_predictors = create_predictors,
                          window_size    = 5
                   )
      forecaster.fit(y=pd.Series(np.arange(10)))
      forecaster.in_sample_residuals = np.full_like(forecaster.in_sample_residuals, fill_value=10)
      expected = pd.DataFrame(
                     np.array([[10., 20., 20.]]),
                     columns = ['pred', 'lower_bound', 'upper_bound'],
                     index = pd.RangeIndex(start=10, stop=11, step=1)
                 )
      results = forecaster.predict_interval(steps=1, in_sample_residuals=True, n_boot=2)  
      pd.testing.assert_frame_equal(results, expected)
  
  
  def test_predict_interval_output_when_forecaster_is_LinearRegression_steps_is_2_in_sample_residuals_is_True():
      '''
      Test output when regressor is LinearRegression and two step ahead is predicted
      using in sample residuals.
      '''
      forecaster = ForecasterAutoregCustom(
                          regressor      = LinearRegression(),
                          fun_predictors = create_predictors,
                          window_size    = 5
                      )    
      forecaster.fit(y=pd.Series(np.arange(10)))
      forecaster.in_sample_residuals = np.full_like(forecaster.in_sample_residuals, fill_value=10)
      expected = pd.DataFrame(
                     np.array([[10., 20., 20.],
                           [11., 23., 23.]]),
                     columns = ['pred', 'lower_bound', 'upper_bound'],
                     index = pd.RangeIndex(start=10, stop=12, step=1)
                 )
      results = forecaster.predict_interval(steps=2, in_sample_residuals=True, n_boot=2)  
      pd.testing.assert_frame_equal(results, expected)
      
      
  def test_predict_interval_output_when_forecaster_is_LinearRegression_steps_is_1_in_sample_residuals_is_False():
      '''
      Test output when regressor is LinearRegression and one step ahead is predicted
      using out sample residuals.
      '''
      forecaster = ForecasterAutoregCustom(
                          regressor      = LinearRegression(),
                          fun_predictors = create_predictors,
                          window_size    = 5
                      )
      forecaster.fit(y=pd.Series(np.arange(10)))
      forecaster.out_sample_residuals = np.full_like(forecaster.in_sample_residuals, fill_value=10)
      expected = pd.DataFrame(
                     np.array([[10., 20., 20.]]),
                     columns = ['pred', 'lower_bound', 'upper_bound'],
                     index = pd.RangeIndex(start=10, stop=11, step=1)
                 )
      results = forecaster.predict_interval(steps=1, in_sample_residuals=False, n_boot=2)  
      pd.testing.assert_frame_equal(results, expected)
  
      
  def test_predict_interval_output_when_forecaster_is_LinearRegression_steps_is_2_in_sample_residuals_is_False():
      '''
      Test output when regressor is LinearRegression and two step ahead is predicted
      using out sample residuals.
      '''
      forecaster = ForecasterAutoregCustom(
                          regressor      = LinearRegression(),
                          fun_predictors = create_predictors,
                          window_size    = 5
                      )
      forecaster.fit(y=pd.Series(np.arange(10)))
      forecaster.out_sample_residuals = np.full_like(forecaster.in_sample_residuals, fill_value=10)
      expected = pd.DataFrame(
                     np.array([[10., 20., 20.],
                           [11., 23., 23.]]),
                     columns = ['pred', 'lower_bound', 'upper_bound'],
                     index = pd.RangeIndex(start=10, stop=12, step=1)
                 )
      results = forecaster.predict_interval(steps=2, in_sample_residuals=False)  
      pd.testing.assert_frame_equal(results, expected)