def test_two_payments_involved(self): o1 = Person.objects.create(name=u'Owner 1', owner=True) o2 = Person.objects.create(name=u'Owner 2', owner=True) ex = Expense.objects.create(date=date(2011, 11, 12)) ex.payment_set.create(ammount=900, paid_by=o1) ex.payment_set.create(ammount=100, paid_by=o2) ex.responsibility_set.create(ammount=300, owner=o1) ex.responsibility_set.create(ammount=700, owner=o2) ex = Expense.objects.create(date=date(2011, 11, 12)) ex.payment_set.create(ammount=2000, paid_by=o2) ex.responsibility_set.create(ammount=1000, owner=o1) ex.responsibility_set.create(ammount=1000, owner=o2) payments = calculate_interpayments() self.assertEquals(len(payments), 1) self.assertEquals(payments[0], (o1, o2, 400)) Interpayment.objects.create(date=date(2011, 11, 13), by=o1, to=o2, ammount=300) payments = calculate_interpayments() self.assertEquals(len(payments), 1) self.assertEquals(payments[0], (o1, o2, 100)) Interpayment.objects.create(date=date(2011, 11, 13), by=o1, to=o2, ammount=100) payments = calculate_interpayments() self.assertEquals(len(payments), 0)
def test_two_payments_involved(self): o1 = Person.objects.create(name=u'Owner 1', owner=True) o2 = Person.objects.create(name=u'Owner 2', owner=True) p1 = Person.objects.create(name=u'Pilot') ex = Expense.objects.create(date=date(2011, 11, 12)) ex.payment_set.create(ammount=900, paid_by=o1) ex.payment_set.create(ammount=100, paid_by=o2) ex.responsibility_set.create(ammount=300, owner=o1) ex.responsibility_set.create(ammount=700, owner=o2) ex = Expense.objects.create(date=date(2011, 11, 12)) ex.payment_set.create(ammount=100, paid_by=p1) ex.responsibility_set.create(ammount=50, owner=o1) ex.responsibility_set.create(ammount=50, owner=o2) payments = calculate_interpayments() self.assertEquals(len(payments), 2) self.assertTrue((o2, o1, 550) in payments) self.assertTrue((o2, p1, 100) in payments) # pilot is paid by o1 instead of 02 Interpayment.objects.create(date=date(2011, 11, 13), by=o1, to=p1, ammount=100) payments = calculate_interpayments() self.assertEquals(len(payments), 1) self.assertEquals(payments[0], (o2, o1, 650)) Interpayment.objects.create(date=date(2011, 11, 13), by=o2, to=o1, ammount=650) payments = calculate_interpayments() self.assertEquals(len(payments), 0)
def test_cents_and_float_precision(self): o1 = Person.objects.create(name=u'Owner 1', owner=True) o2 = Person.objects.create(name=u'Owner 2', owner=True) p1 = Person.objects.create(name=u'Pilot') ex = Expense.objects.create(date=date(2011, 11, 12)) ex.payment_set.create(ammount=900, paid_by=o1) ex.payment_set.create(ammount=100, paid_by=o2) ex.responsibility_set.create(ammount=300, owner=o1) ex.responsibility_set.create(ammount=700, owner=o2) ex = Expense.objects.create(date=date(2011, 11, 12)) ex.payment_set.create(ammount=100.01, paid_by=p1) ex.responsibility_set.create(ammount=50, owner=o1) ex.responsibility_set.create(ammount=50.01, owner=o2) payments = calculate_interpayments() self.assertEquals(len(payments), 2) self.assertTrue((o2, o1, 550) in payments) self.assertTrue((o2, p1, 100.01) in payments) # pilot is paid by o1 instead of 02 Interpayment.objects.create(date=date(2011, 11, 13), by=o1, to=p1, ammount=100) payments = calculate_interpayments() self.assertEquals(len(payments), 2) self.assertTrue((o2, o1, 650) in payments) self.assertTrue((o2, p1, .01) in payments) Interpayment.objects.create(date=date(2011, 11, 13), by=o2, to=o1, ammount=650) Interpayment.objects.create(date=date(2011, 11, 13), by=o2, to=p1, ammount=.01) payments = calculate_interpayments() self.assertEquals(len(payments), 0)
def test_one_owes_all_to_other(self): o1 = Person.objects.create(name=u'Owner 1', owner=True) o2 = Person.objects.create(name=u'Owner 2', owner=True) ex = Expense.objects.create(date=date(2011, 11, 13)) ex.payment_set.create(ammount=1000, paid_by=o2) ex.responsibility_set.create(ammount=1000, owner=o1) payments = calculate_interpayments() self.assertEquals(len(payments), 1) self.assertEquals(payments[0], (o1, o2, 1000))
def test_no_interpayments_are_required_when_there_are_no_debts(self): o1 = Person.objects.create(name=u'Owner 1', owner=True) o2 = Person.objects.create(name=u'Owner 2', owner=True) ex = Expense.objects.create(date=date(2011, 11, 13)) ex.payment_set.create(ammount=500, paid_by=o1) ex.payment_set.create(ammount=500, paid_by=o2) ex.responsibility_set.create(ammount=500, owner=o1) ex.responsibility_set.create(ammount=500, owner=o2) self.assertEquals(len(calculate_interpayments()), 0)
def test_mixed_still_one_payment(self): o1 = Person.objects.create(name=u'Owner 1', owner=True) o2 = Person.objects.create(name=u'Owner 2', owner=True) ex = Expense.objects.create(date=date(2011, 11, 13)) ex.payment_set.create(ammount=900, paid_by=o1) ex.payment_set.create(ammount=100, paid_by=o2) ex.responsibility_set.create(ammount=300, owner=o1) ex.responsibility_set.create(ammount=700, owner=o2) payments = calculate_interpayments() self.assertEquals(len(payments), 1) self.assertEquals(payments[0], (o2, o1, 600))
def test_previous_interpayments_are_considered_in_calculation(self): o1 = Person.objects.create(name=u'Owner 1', owner=True) o2 = Person.objects.create(name=u'Owner 2', owner=True) ex = Expense.objects.create(date=date(2011, 11, 12)) ex.payment_set.create(ammount=900, paid_by=o1) ex.payment_set.create(ammount=100, paid_by=o2) ex.responsibility_set.create(ammount=300, owner=o1) ex.responsibility_set.create(ammount=700, owner=o2) Interpayment.objects.create(date=date(2011, 11, 13), by=o2, to=o1, ammount=300) payments = calculate_interpayments() self.assertEquals(len(payments), 1) self.assertEquals(payments[0], (o2, o1, 300))