def run_projection(db): """Run projection showing total contribution of challenge scenario""" while True: factor = input("\nChallenge factor ('q' to quit): ") if factor in ('q', 'quit'): return min_filter = input("Minimum donation to challenge (<return> for none, 'q' to quit): ") if min_filter in ('q', 'quit'): return max_filter = input("Maximum donation to challenge (<return> for none, 'q' to quit): ") if max_filter in ('q', 'quit'): return try: scenario = Donors.challenge(db, float(factor), float(min_filter) if min_filter else None, float(max_filter) if max_filter else None) except ValueError: print('Invalid inputs, try again') else: break print() for d in scenario.values(): print(f" {d.name}: ${sum(d.donations):,.2f} = {factor} * " f"("+' + '.join(list(map(lambda x: f"${x:,.2f}", d.donations)))+')') print(f"\n Total contribution required: ${scenario.total_value():,.2f}\n")
def test_challenge(): donors = Donors() d1 = Donor("Mark", 50) d1.add_donation(90) d1.add_donation(110) d2 = Donor("Mary", 80) d2.add_donation(95) d2.add_donation(115) donors.add_donor(d1) donors.add_donor(d2) copy = donors.challenge(3, min_amt=85, max_amt=100) assert copy.get_donor("Mark").donations == (270, ) assert copy.get_donor("Mary").donations == (285, )
def test_donors_challenge_max_donation(): db = Donors({"A Name": [1, 2, 3], "B Name": [4, 5, 6]}) db2 = Donors.challenge(db, 2, max_donation=4) assert db2["A Name"].donations == [2, 4, 6] assert db2["B Name"].donations == [8]
def test_donors_challenge_min_and_max_donation(): db = Donors({"A Name": [1, 2, 3], "B Name": [4, 5, 6]}) db2 = Donors.challenge(db, 2, min_donation=2, max_donation=5) assert db2["A Name"].donations == [4, 6] assert db2["B Name"].donations == [8, 10]
def test_donors_challenge_min_donation(): db = Donors({"A Name": [1, 2, 3], "B Name": [4, 5, 6]}) db2 = Donors.challenge(db, 2, min_donation=4) assert not db2.get("A Name") assert db2["B Name"].donations == [8, 10, 12]