I may have taken this further than necessary, but it's a sufficient example of how I divide up responsibilities and test my code.
The UI is more functional than beautiful, as I was advised to keep it simple. There's a lot more to be done like input validation and exception handling but I didn't feel that was expected as part of this exercise.
Looking forward to discussing further!