Newer
Older
Warehouse / tests / Domain.UnitTests / Common / ValueObjects / Money / MoneyTests.cs
@Derek Comartin Derek Comartin on 22 Aug 2023 2 KB Init
using MyWarehouse.Domain.Common.ValueObjects.Money;
using NUnit.Framework;
using System;

namespace MyWarehouse.Domain.UnitTests.Common.ValueObjects.MoneyTests
{
    public class MoneyTests
    {
        private Random _rnd = new Random();

        [Test]
        public void Instantiation_WithNegativeValue_ShouldThrow()
        {
            Assert.Throws<ArgumentException>(() => new Money(-100, Currency.EUR));
        }

        [Test]
        public void Add_WithMixedCurrencies_ShouldThrow()
        {
            Assert.Throws<InvalidOperationException>(() =>
                _ = new Money(100, Currency.EUR) + new Money(100, Currency.USD));
        }

        [Test, Repeat(10)]
        public void Add_WithSameCurrencies_ShouldReturnExpectedValue()
        {
            var m1 = new Money(_rnd.Next() / 1000, Currency.USD);
            var m2 = new Money(_rnd.Next() / 1000, Currency.USD);

            var result = m1 + m2;

            Assert.AreEqual(m1.Amount + m2.Amount, result.Amount);
            Assert.AreEqual(m1.Currency, result.Currency);
        }

        [Test]
        public void Multiply_WithMixedCurrencies_ShouldThrow()
        {
            Assert.Throws<InvalidOperationException>(() =>
                _ = new Money(100, Currency.EUR) * new Money(100, Currency.USD));
        }

        [Test, Repeat(10)]
        public void Multiply_WithSameCurrencies_ShouldReturnExpectedValue()
        {
            var m1 = new Money(_rnd.Next() / 1000, Currency.USD);
            var m2 = new Money(_rnd.Next() / 1000, Currency.USD);

            var result = m1 * m2;

            Assert.AreEqual(m1.Amount * m2.Amount, result.Amount);
            Assert.AreEqual(m1.Currency, result.Currency);
        }

        [Test]
        public void Subtract_WithMixedCurrencies_ShouldThrow()
        {
            Assert.Throws<InvalidOperationException>(() =>
                _ = new Money(100, Currency.EUR) - new Money(100, Currency.USD));
        }

        [Test, Repeat(10)]
        public void Subtract_WithSameCurrencies_ShouldReturnExpectedValue()
        {
            var m1 = new Money(_rnd.Next(1, 100000), Currency.USD);
            var m2 = new Money(_rnd.Next(1, (int)m1.Amount), Currency.USD);

            var result = m1 - m2;

            Assert.AreEqual(m1.Amount - m2.Amount, result.Amount);
            Assert.AreEqual(m1.Currency, result.Currency);
        }
    }
}