# I might be doing something wrong in the Budget App project, because the code is just fine

Tell us what’s happening:

The code seems to be doing what it’s supposed to do regarding outputs. However (as you’ll check with the code snippet below) there is a small nuance regarding a specific part. On the very first test case scenario, “Business” shows with 0% on expected, while my code has 10%. On my calculations, this is also right because Business equals 16% of the total. I don’t know where I did something wrong, I need some guidance here.

Here’s the whole thing:
Here’s the part that only interests us. I took some parts from test_module.py. It prints 2 outputs: mine, and expected.

``````class Category:
def __init__(self, name):
self.ledger = list()
self.name = name
self.balance = 0
self.withdrawals = 0

def __str__(self):
output = ""

output = output + "*************Food*************\n"
for x in self.ledger:
output = output + '%-23.23s' % (f'{x}')
output = output

return output

def deposit(self, amount, description=""):
self.ledger.append({"amount": amount, "description": description})
self.balance = self.balance + amount

def withdraw(self, amount=0, description=""):
if (self.balance - amount) >= 0:
self.ledger.append({
"amount": (-abs(amount)),
"description": description
})
self.balance = self.balance - amount
self.withdrawals = self.withdrawals + amount

return True

else:
return False

def get_balance(self):
return self.balance

def transfer(self, amount, destinationcategory):
if (self.balance - amount) >= 0:
self.withdraw(amount, f"Transfer to {destinationcategory.name}")
destinationcategory.deposit(amount, f"Transfer from {self.name}")
return True
else:
return False

def check_funds(self, amount):
if amount > self.balance:
return False

else:
return True

def create_spend_chart(categories):

output = "Percentage spent by category\n"

# \/ Percentages

category_spent = list()
total = 0
for x in categories:
total = total + x.withdrawals
category_spent.append(x.withdrawals)

base10 = lambda number: int(10 * round(float(number) / 10))  # rounds to base 10
for x in range(len(category_spent)):  # % of total  of each category
category_spent[x] = base10((category_spent[x] * 100) / total)

# adds the o if the category has that percentage
logic = lambda number: "o" if (number >= x) else " "
for x in range(100, -10, -10):
if x == 0:
output = output + "  "  # 0
elif x != 100:
output = output + " "  # 90-10

output = output + f"{x}|"  # All

z = True

for y in category_spent:
if z:  # First number, single space instead of two
z = False
output = output + " "

else:
output = output + "  "

output = output + f"{logic(y)}"

output = output + "  \n"

# \/ ----------
output = output + "    "
total = 4
z = True
for x in categories:
if z:  # First category
z = False
output = output + "--"
total = total + 2
continue

output = output + "---"
total = total + 3

output = output + "--\n"

# \/ Category names

for x in range(len(categories)):
categories[x] = list(categories[x].name)

for x in range(len(max(categories, key=len))):

output = output + "     "

for y in categories:
y = list(y)

try:
output = output + y[x]
except:
output = output + " "

output = output + "  "

output = output + "\n"

return output

food = Category("Food")
entertainment = Category("Entertainment")

# Test
food.deposit(900, "deposit")
entertainment.deposit(900, "deposit")
food.withdraw(105.55)
entertainment.withdraw(33.40)

expected = "Percentage spent by category\n100|          \n 90|          \n 80|          \n 70|    o     \n 60|    o     \n 50|    o     \n 40|    o     \n 30|    o     \n 20|    o  o  \n 10|    o  o  \n  0| o  o  o  \n    ----------\n     B  F  E  \n     u  o  n  \n     s  o  t  \n     i  d  e  \n     n     r  \n     e     t  \n     s     a  \n     s     i  \n           n  \n           m  \n           e  \n           n  \n           t  "
#self.assertEqual(actual, expected, 'Expected different chart representation. Check that all spacing is exact.')

print("\nExpected: \n\n", expected)
``````

User Agent is: `Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0`.