code: def make_futures_info(self):
      fo_frame = DataFrame(
          {
              "symbol": [
                  "FOF16",
                  "FOG16",
                  "FOH16",
                  "FOJ16",
                  "FOK16",
                  "FOF22",
                  "FOG22",
              ],
              "sid": range(0, 7),
              "root_symbol": ["FO"] * 7,
              "asset_name": ["Foo"] * 7,
              "start_date": [
                  Timestamp("2015-01-05", tz="UTC"),
                  Timestamp("2015-02-05", tz="UTC"),
                  Timestamp("2015-03-05", tz="UTC"),
                  Timestamp("2015-04-05", tz="UTC"),
                  Timestamp("2015-05-05", tz="UTC"),
                  Timestamp("2021-01-05", tz="UTC"),
                  Timestamp("2015-01-05", tz="UTC"),
              ],
              "end_date": [
                  Timestamp("2016-08-19", tz="UTC"),
                  Timestamp("2016-09-19", tz="UTC"),
                  Timestamp("2016-10-19", tz="UTC"),
                  Timestamp("2016-11-19", tz="UTC"),
                  Timestamp("2022-08-19", tz="UTC"),
                  Timestamp("2022-09-19", tz="UTC"),
                  # Set the last contract's end date (which is the last
                  # date for which there is data to a value that is
                  # within the range of the dates being tested.  This
                  # models real life scenarios where the end date of the
                  # furthest out contract is not necessarily the
                  # greatest end date all contracts in the chain.
                  Timestamp("2015-02-05", tz="UTC"),
              ],
              "notice_date": [
                  Timestamp("2016-01-27", tz="UTC"),
                  Timestamp("2016-02-26", tz="UTC"),
                  Timestamp("2016-03-24", tz="UTC"),
                  Timestamp("2016-04-26", tz="UTC"),
                  Timestamp("2016-05-26", tz="UTC"),
                  Timestamp("2022-01-26", tz="UTC"),
                  Timestamp("2022-02-26", tz="UTC"),
              ],
              "expiration_date": [
                  Timestamp("2016-01-27", tz="UTC"),
                  Timestamp("2016-02-26", tz="UTC"),
                  Timestamp("2016-03-24", tz="UTC"),
                  Timestamp("2016-04-26", tz="UTC"),
                  Timestamp("2016-05-26", tz="UTC"),
                  Timestamp("2022-01-26", tz="UTC"),
                  Timestamp("2022-02-26", tz="UTC"),
              ],
              "auto_close_date": [
                  Timestamp("2016-01-27", tz="UTC"),
                  Timestamp("2016-02-26", tz="UTC"),
                  Timestamp("2016-03-24", tz="UTC"),
                  Timestamp("2016-04-26", tz="UTC"),
                  Timestamp("2016-05-26", tz="UTC"),
                  Timestamp("2022-01-26", tz="UTC"),
                  Timestamp("2022-02-26", tz="UTC"),
              ],
              "tick_size": [0.001] * 7,
              "multiplier": [1000.0] * 7,
              "exchange": ["CMES"] * 7,
          }
      )
  
      # BZ is set up to test chain predicates, for futures such as PL which
      # only use a subset of contracts for the roll chain.
      bz_frame = DataFrame(
          {
              "symbol": ["BZF16", "BZG16", "BZH16"],
              "root_symbol": ["BZ"] * 3,
              "asset_name": ["Baz"] * 3,
              "sid": range(10, 13),
              "start_date": [
                  Timestamp("2005-01-01", tz="UTC"),
                  Timestamp("2005-01-21", tz="UTC"),
                  Timestamp("2005-01-21", tz="UTC"),
              ],
              "end_date": [
                  Timestamp("2016-08-19", tz="UTC"),
                  Timestamp("2016-11-21", tz="UTC"),
                  Timestamp("2016-10-19", tz="UTC"),
              ],
              "notice_date": [
                  Timestamp("2016-01-11", tz="UTC"),
                  Timestamp("2016-02-08", tz="UTC"),
                  Timestamp("2016-03-09", tz="UTC"),
              ],
              "expiration_date": [
                  Timestamp("2016-01-11", tz="UTC"),
                  Timestamp("2016-02-08", tz="UTC"),
                  Timestamp("2016-03-09", tz="UTC"),
              ],
              "auto_close_date": [
                  Timestamp("2016-01-11", tz="UTC"),
                  Timestamp("2016-02-08", tz="UTC"),
                  Timestamp("2016-03-09", tz="UTC"),
              ],
              "tick_size": [0.001] * 3,
              "multiplier": [1000.0] * 3,
              "exchange": ["CMES"] * 3,
          }
      )
  
      # MA is set up to test a contract which is has no active volume.
      ma_frame = DataFrame(
          {
              "symbol": ["MAG16", "MAH16", "MAJ16"],
              "root_symbol": ["MA"] * 3,
              "asset_name": ["Most Active"] * 3,
              "sid": range(14, 17),
              "start_date": [
                  Timestamp("2005-01-01", tz="UTC"),
                  Timestamp("2005-01-21", tz="UTC"),
                  Timestamp("2005-01-21", tz="UTC"),
              ],
              "end_date": [
                  Timestamp("2016-08-19", tz="UTC"),
                  Timestamp("2016-11-21", tz="UTC"),
                  Timestamp("2016-10-19", tz="UTC"),
              ],
              "notice_date": [
                  Timestamp("2016-02-17", tz="UTC"),
                  Timestamp("2016-03-16", tz="UTC"),
                  Timestamp("2016-04-13", tz="UTC"),
              ],
              "expiration_date": [
                  Timestamp("2016-02-17", tz="UTC"),
                  Timestamp("2016-03-16", tz="UTC"),
                  Timestamp("2016-04-13", tz="UTC"),
              ],
              "auto_close_date": [
                  Timestamp("2016-02-17", tz="UTC"),
                  Timestamp("2016-03-16", tz="UTC"),
                  Timestamp("2016-04-13", tz="UTC"),
              ],
              "tick_size": [0.001] * 3,
              "multiplier": [1000.0] * 3,
              "exchange": ["CMES"] * 3,
          }
      )
  
      # DF is set up to have a double volume flip between the 'F' and 'G'
      # contracts, and then a really early temporary volume flip between the
      # 'G' and 'H' contracts.
      df_frame = DataFrame(
          {
              "symbol": ["DFF16", "DFG16", "DFH16"],
              "root_symbol": ["DF"] * 3,
              "asset_name": ["Double Flip"] * 3,
              "sid": range(17, 20),
              "start_date": [
                  Timestamp("2005-01-01", tz="UTC"),
                  Timestamp("2005-02-01", tz="UTC"),
                  Timestamp("2005-03-01", tz="UTC"),
              ],
              "end_date": [
                  Timestamp("2016-08-19", tz="UTC"),
                  Timestamp("2016-09-19", tz="UTC"),
                  Timestamp("2016-10-19", tz="UTC"),
              ],
              "notice_date": [
                  Timestamp("2016-02-19", tz="UTC"),
                  Timestamp("2016-03-18", tz="UTC"),
                  Timestamp("2016-04-22", tz="UTC"),
              ],
              "expiration_date": [
                  Timestamp("2016-02-19", tz="UTC"),
                  Timestamp("2016-03-18", tz="UTC"),
                  Timestamp("2016-04-22", tz="UTC"),
              ],
              "auto_close_date": [
                  Timestamp("2016-02-17", tz="UTC"),
                  Timestamp("2016-03-16", tz="UTC"),
                  Timestamp("2016-04-20", tz="UTC"),
              ],
              "tick_size": [0.001] * 3,
              "multiplier": [1000.0] * 3,
              "exchange": ["CMES"] * 3,
          }
      )
  
      return pd.concat([fo_frame, bz_frame, ma_frame, df_frame])
  
imports: from collections import deque
  from functools import partial
  from textwrap import dedent
  from numpy import arange, array, int64, full, repeat, tile
  from numpy.testing import assert_almost_equal
  import pandas
  from pandas import Timestamp, DataFrame
  from zipline.assets.continuous_futures import OrderedContracts, delivery_predicate
  from zipline.assets.roll_finder import ROLL_DAYS_FOR_CURRENT_CONTRACT, VolumeRollFinder
  from zipline.data.minute_bars import FUTURES_MINUTES_PER_DAY
  from zipline.errors import SymbolNotFound
  import zipline.testing.fixtures
label_desc: Use image node_id 2 for calling the ContinuousFuturesTestCase obj's underlying member method code with example usage: obj.make_futures_info() and returns: pd