static fromMonthlyIncomeFormModel (monthlyIncome: MonthlyIncome): IncomeExpenseSources {
    if (!monthlyIncome) {
      return undefined
    }

    const incomeExpenseSources = []

    if (monthlyIncome.salarySource && monthlyIncome.salarySource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.salarySource))
    }

    if (monthlyIncome.universalCreditSource && monthlyIncome.universalCreditSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.universalCreditSource))
    }

    if (monthlyIncome.jobseekerAllowanceIncomeSource && monthlyIncome.jobseekerAllowanceIncomeSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.jobseekerAllowanceIncomeSource))
    }

    if (monthlyIncome.jobseekerAllowanceContributionSource && monthlyIncome.jobseekerAllowanceContributionSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.jobseekerAllowanceContributionSource))
    }

    if (monthlyIncome.incomeSupportSource && monthlyIncome.incomeSupportSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.incomeSupportSource))
    }

    if (monthlyIncome.workingTaxCreditSource && monthlyIncome.workingTaxCreditSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.workingTaxCreditSource))
    }

    if (monthlyIncome.childTaxCreditSource && monthlyIncome.childTaxCreditSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.childTaxCreditSource))
    }

    if (monthlyIncome.childBenefitSource && monthlyIncome.childBenefitSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.childBenefitSource))
    }

    if (monthlyIncome.councilTaxSupportSource && monthlyIncome.councilTaxSupportSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.councilTaxSupportSource))
    }

    if (monthlyIncome.pensionSource && monthlyIncome.pensionSource.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormIncomeSource(monthlyIncome.pensionSource))
    }

    if (monthlyIncome.anyOtherIncomePopulated) {
      incomeExpenseSources.push(...monthlyIncome.otherSources
        .filter(source => source.populated)
        .map(source => IncomeExpenseSource.fromFormIncomeSource(source)))
    }
    return new IncomeExpenseSources(incomeExpenseSources)
  }
 it('should return a new instance initialised with set fields from object parameter provided', () => {
   const monthlyExpense = new FormExpenseSource(MonthlyIncomeType.JOB.displayValue, 100, FormIncomeExpenseSchedule.MONTH)
   expect(IncomeExpenseSource.fromFormExpenseSource(monthlyExpense)).to.deep.equal({
     'amount': 100,
     'schedule': IncomeExpenseSchedule.MONTH
   })
 })
 it('should return a new instance initialised with set fields from object parameter provided', () => {
   expect(IncomeExpenseSource.fromObject(SAMPLE_INCOME_EXPENSE_SOURCE_FROM_OBJECT)).to.deep.equal(
     new IncomeExpenseSource(
       100,
       IncomeExpenseSchedule.MONTH
     )
   )
 })
 it('should return a new instance with defaults when amount and schedule are invalid', () => {
   expect(IncomeExpenseSource.fromObject({
     'amount': 'INVALID',
     'schedule': 'UNKNOWN'
   })).to.deep.equal(new IncomeExpenseSource(
     undefined,
     undefined
   ))
 })
 it('should return a new instance initialised with set fields from object parameter provided', () => {
   const income = {
     amount: 200,
     frequency: IncomeExpenseSchedule.WEEK.value,
     type: MonthlyExpenseType.COUNCIL_TAX.displayValue
   } as Income
   expect(IncomeExpenseSource.fromClaimIncome(income)).to.deep.equal({
     amount: 200,
     schedule: {
       value: 'WEEK',
       valueInMonths: 4.333333333333333
     }
   })
 })
 it('should return a new instance initialised with set fields from object parameter provided', () => {
   const expense = {
     amount: 200,
     frequency: IncomeExpenseSchedule.MONTH.value,
     type: MonthlyExpenseType.MORTGAGE.displayValue
   } as Expense
   expect(IncomeExpenseSource.fromClaimExpense(expense)).to.deep.equal({
     amount: 200,
     schedule: {
       value: 'MONTH',
       valueInMonths: 1
     }
   })
 })
  static fromPriorityDebtModel (priorityDebt: PriorityDebt): IncomeExpenseSources {
    if (!priorityDebt) {
      return undefined
    }

    const incomeExpenseSources = []

    if (priorityDebt.mortgage && priorityDebt.mortgage.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormExpenseSource(priorityDebt.mortgage))
    }

    if (priorityDebt.rent && priorityDebt.rent.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormExpenseSource(priorityDebt.rent))
    }

    if (priorityDebt.councilTax && priorityDebt.councilTax.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormExpenseSource(priorityDebt.councilTax))
    }

    if (priorityDebt.gas && priorityDebt.gas.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormExpenseSource(priorityDebt.gas))
    }

    if (priorityDebt.electricity && priorityDebt.electricity.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormExpenseSource(priorityDebt.electricity))
    }

    if (priorityDebt.water && priorityDebt.water.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormExpenseSource(priorityDebt.water))
    }

    if (priorityDebt.maintenance && priorityDebt.maintenance.populated) {
      incomeExpenseSources.push(IncomeExpenseSource.fromFormExpenseSource(priorityDebt.maintenance))
    }

    return new IncomeExpenseSources(incomeExpenseSources)
  }
 it('should return undefined when undefined provided as object parameter', () => {
   expect(IncomeExpenseSource.fromClaimIncome(undefined)).to.equal(undefined)
 })
 it('should return a new instance initialised with defaults when an empty object parameter is provided', () => {
   expect(IncomeExpenseSource.fromObject({})).to.deep.equal(new IncomeExpenseSource(
     undefined,
     undefined
   ))
 })
 it('should return undefined when no object parameter provided', () => {
   expect(IncomeExpenseSource.fromObject()).to.deep.equal(undefined)
 })