def create_from_dict(futuresContract, futures_contract_dict):
        """

        :param futures_contract_dict: The result of running .as_dict on a futuresContract.
        :return: futuresContract object
        """

        contract_date_dict = futures_contract_dict["contract_date_dict"]
        instrument_dict = futures_contract_dict["instrument_dict"]
        contract_params_dict = futures_contract_dict["contract_params"]

        contract_date_object = contractDate.create_from_dict(contract_date_dict)
        instrument_object = futuresInstrument.create_from_dict(instrument_dict)
        parameter_object = parametersForFuturesContract.from_dict(contract_params_dict)

        return futuresContract(
            instrument_object, contract_date_object, parameter_object=parameter_object
        )
    def test_contractDate(self):

        contract_date201801 = contractDate("201801")
        contract_date20180115 = contractDate("20180115")

        contract_date20180100 = contractDate("20180100")
        self.assertEqual(contract_date20180100.date_str, "20180100")

        # dictionary
        contract_date_dict_201801 = contract_date201801.as_dict()
        self.assertEqual(
            contract_date_dict_201801,
            dict(expiry_date=(2018, 1, 1),
                 contract_date="201801",
                 approx_expiry_offset=0),
        )

        contract_date_dict_20180115 = contract_date20180115.as_dict()
        self.assertEqual(
            contract_date_dict_20180115,
            dict(
                expiry_date=(2018, 1, 15),
                contract_date="20180115",
                approx_expiry_offset=0,
            ),
        )

        new_contractdate20801 = contractDate.create_from_dict(
            contract_date_dict_201801)
        self.assertEqual(contract_date201801.date_str,
                         new_contractdate20801.date_str)
        self.assertEqual(contract_date201801.expiry_date.year,
                         new_contractdate20801.expiry_date.year)

        # basic functionality
        self.assertEqual(contract_date201801.date_str, "20180100")
        self.assertEqual(contract_date20180115.date_str, "20180115")

        self.assertEqual(contract_date201801.year(), 2018)
        self.assertEqual(contract_date201801.month(), 1)
        self.assertEqual(contract_date201801.only_has_month, True)

        self.assertEqual(contract_date20180115.day(), 15)

        self.assertEqual(contract_date201801.letter_month(), "F")
        self.assertEqual(contract_date201801._as_date(),
                         datetime.datetime(2018, 1, 1))
        self.assertEqual(contract_date20180115._as_date(),
                         datetime.datetime(2018, 1, 15))

        # check date comparision
        self.assertEqual(
            contract_date201801.check_if_expiry_after_date(
                datetime.datetime(2018, 2, 1)),
            False,
        )
        self.assertEqual(
            contract_date201801.check_if_expiry_after_date(
                datetime.datetime(2017, 12, 31)),
            True,
        )

        # alternative method to define contracts
        contract_date201801b = contractDate.contract_date_from_numbers(2018, 1)
        contract_date20180115b = contractDate.contract_date_from_numbers(
            2018, 1, 15)

        self.assertEqual(contract_date201801b.date_str, "20180100")
        self.assertEqual(contract_date20180115b.date_str, "20180115")

        # check expiry dates
        contract_date201803_withexpiry = contractDate("201803",
                                                      expiry_date=(2008, 3,
                                                                   15))
        contract_date201801b_withexpiry = contractDate.contract_date_from_numbers(
            2018, 1, expiry_date=(2008, 1, 16))

        self.assertEqual(contract_date201803_withexpiry.expiry_date,
                         datetime.datetime(2008, 3, 15))
        self.assertEqual(contract_date201801b_withexpiry.expiry_date,
                         datetime.datetime(2008, 1, 16))

        # check expiry dates with contract offset
        contract_date201803_withexpiry_offset = contractDate(
            "201803", approx_expiry_offset=40)
        contract_date201801b_withexpiry_offset = (
            contractDate.contract_date_from_numbers(2018,
                                                    1,
                                                    approx_expiry_offset=-20))

        self.assertEqual(
            contract_date201803_withexpiry_offset.expiry_date,
            datetime.datetime(2018, 4, 10),
        )
        self.assertEqual(
            contract_date201801b_withexpiry_offset.expiry_date,
            datetime.datetime(2017, 12, 12),
        )