namespace BudgetApp.Tests.Domain; using BudgetApp.Domain.Models; using Xunit; public class MoneyTests { [Fact] public void Constructor_WithValidAmount_CreatesMoney() { // Arrange & Act var money = new Money(100.50m, "USD"); // Assert Assert.Equal(100.50m, money.Amount); Assert.Equal("USD", money.Currency); } [Fact] public void Constructor_WithNegativeAmount_ThrowsException() { // Arrange, Act & Assert Assert.Throws(() => new Money(-100m, "USD")); } [Fact] public void Constructor_WithNullCurrency_ThrowsException() { // Arrange, Act & Assert Assert.Throws(() => new Money(100m, null!)); Assert.Throws(() => new Money(100m, "")); } [Fact] public void Add_WithSameCurrency_ReturnsSum() { // Arrange var money1 = new Money(100m, "USD"); var money2 = new Money(50m, "USD"); // Act var result = money1.Add(money2); // Assert Assert.Equal(150m, result.Amount); Assert.Equal("USD", result.Currency); } [Fact] public void Add_WithDifferentCurrencies_ThrowsException() { // Arrange var money1 = new Money(100m, "USD"); var money2 = new Money(50m, "EUR"); // Act & Assert Assert.Throws(() => money1.Add(money2)); } [Fact] public void Subtract_WithSameCurrency_ReturnsDifference() { // Arrange var money1 = new Money(100m, "USD"); var money2 = new Money(50m, "USD"); // Act var result = money1.Subtract(money2); // Assert Assert.Equal(50m, result.Amount); } [Fact] public void Subtract_ResultingInNegative_ThrowsException() { // Arrange var money1 = new Money(50m, "USD"); var money2 = new Money(100m, "USD"); // Act & Assert Assert.Throws(() => money1.Subtract(money2)); } [Fact] public void Equals_WithSameAmountAndCurrency_ReturnsTrue() { // Arrange var money1 = new Money(100m, "USD"); var money2 = new Money(100m, "USD"); // Act & Assert Assert.True(money1.Equals(money2)); Assert.True(money1 == money2); } [Fact] public void Equals_WithDifferentAmount_ReturnsFalse() { // Arrange var money1 = new Money(100m, "USD"); var money2 = new Money(50m, "USD"); // Act & Assert Assert.False(money1.Equals(money2)); Assert.True(money1 != money2); } [Fact] public void OperatorAdd_WithSameCurrency_ReturnsSum() { // Arrange var money1 = new Money(100m, "USD"); var money2 = new Money(50m, "USD"); // Act var result = money1 + money2; // Assert Assert.Equal(150m, result.Amount); } }