using System;
using NUnit.Framework;
using UWash.CSPC.VPS.Util;
using UWash.CSPC.VPS.Business;
using UWash.CAA.Util;
namespace VPSTest
{
[TestFixture]
public class TestMoney
{
[Test (Description = "Test parsing of strings")]
public void TestParse()
{
Money m;
try
{
m = new Money("123.45");
Assert.AreEqual(123, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(45, m.Cents, "Failed to parse from string: Cents value incorrect");
Assert.AreEqual("123.45", m.ToString(), "Failed to parse from string: ToString() incorrect");
}
catch (FormatException e)
{
Assert.Fail("Failed: " + e.Message);
}
try
{
m = (Money) 12345;
Assert.AreEqual(123, m.Dollars, "Failed to cast from int: Dollars value incorrect");
Assert.AreEqual(45, m.Cents, "Failed to cast from int: Cents value incorrect");
Assert.AreEqual("123.45", m.ToString(), "Failed to cast from int: ToString() incorrect");
}
catch (FormatException e)
{
Assert.Fail("Failed: " + e.Message);
}
try
{
m = new Money("-543.02");
Assert.IsTrue(m.IsNegative, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(-543, m.Dollars);
Assert.AreEqual(-2, m.Cents);
Assert.AreEqual("-543.02", m.ToString());
}
catch (FormatException e)
{
Assert.Fail("Failed: " + e.Message);
}
try
{
m = new Money("123.45678");
Assert.Fail("Failed to parse from string: 123.45678 is not a legal amount.");
}
catch (FormatException)
{
// Passed
}
try
{
m = new Money(".45678");
Assert.Fail("Failed to parse from string: .45678 is not a legal amount.");
}
catch (FormatException)
{
// Passed
}
try
{
m = new Money(".1");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(10, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("+.1");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(10, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("-.1");
Assert.IsTrue(m.IsNegative, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(-10, m.Cents, "Failed to parse from string: Cents value incorrect");
}
catch (FormatException e)
{
Assert.Fail("Failed: " + e.Message);
}
try
{
m = new Money("1");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(1, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(0, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("+1");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(1, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(0, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("-1");
Assert.IsTrue(m.IsNegative, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(-1, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(0, m.Cents, "Failed to parse from string: Cents value incorrect");
}
catch (FormatException e)
{
Assert.Fail("Failed: " + e.Message);
}
try
{
m = new Money("1.");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(1, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(0, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("+1.");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(1, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(0, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("-1.");
Assert.IsTrue(m.IsNegative, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(-1, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(0, m.Cents, "Failed to parse from string: Cents value incorrect");
}
catch (FormatException e)
{
Assert.Fail("Failed: " + e.Message);
}
try
{
m = new Money(".45");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(45, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("+.45");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(45, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("-.45");
Assert.IsTrue(m.IsNegative, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(-45, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("0.45");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(45, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("+0.45");
Assert.IsTrue(m.IsPositive, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(45, m.Cents, "Failed to parse from string: Cents value incorrect");
m = new Money("-0.45");
Assert.IsTrue(m.IsNegative, "Failed to parse from string: Amount sign is incorrect");
Assert.AreEqual(0, m.Dollars, "Failed to parse from string: Dollars value incorrect");
Assert.AreEqual(-45, m.Cents, "Failed to parse from string: Cents value incorrect");
}
catch (FormatException e)
{
Assert.Fail("Failed: " + e.Message);
}
}
[Test (Description="ToString")]
public void TestStringification()
{
Money m = (Money) 145;
Assert.AreEqual("1.45", m.ToString(), "Positive amount: string represenation incorrect");
m = (Money) 45;
Assert.AreEqual("0.45", m.ToString(), "Positive amount less than $1: string represenation incorrect");
m = (Money) (int) -145;
Assert.AreEqual("-1.45", m.ToString(), "Negative amount: string represenation incorrect");
m = (Money) (int) -45;
Assert.AreEqual("-0.45", m.ToString(), "Negative amount less than $1: string representation incorrect");
}
[Test (Description="Comparisons")]
public void TestCompare()
{
Money m11 = (Money) 11100;
Money m12 = new Money("111.00");
Money m21 = (Money) 22200;
Money m22 = m11 * 2;
Assert.IsTrue(m11 == m12, "== Operator: Equivalent objects not equal");
Assert.IsTrue(m21 == m22, "== Operator: Equivalent objects not equal");
Assert.IsFalse(m11 == m21, "== Operator: Non Equivalent objects are equal");
Assert.IsFalse(m11 == m22, "== Operator: Non Equivalent objects are equal");
Assert.IsFalse(m12 == m21, "== Operator: Non Equivalent objects are equal");
Assert.IsFalse(m12 == m22, "== Operator: Non Equivalent objects are equal");
Assert.IsTrue(m11 != m21, "!= Operator: Non-equivalent objects are equal");
Assert.IsTrue(m12 != m21, "!= Operator: Non-equivalent objects are equal");
Assert.IsTrue( m11 < m21, "< Operator: smaller object not less than larger object");
Assert.IsFalse(m21 < m11, "< Operator: larger object is less than smaller object");
}
[Test (Description="Math Tests")]
public void TestMath()
{
Money m0 = (Money) 0;
Money m1 = (Money) 11100;
Money m2 = (Money) 11;
Money m4 = (Money) 12300;
Money m3 = m1 + m2;
Money m5 = m1 - m4;
Assert.AreEqual("111.11", m3.ToString());
Assert.AreEqual("111.00", ((Money)(m3 - m2)).ToString());
Assert.AreEqual("333.00", ((Money)(m1 * 3)).ToString());
Assert.IsTrue((Money) 1 == m4.percent(33.33f, Money.Round.Up) - m4.percent(33.33f, Money.Round.Down));
Assert.IsTrue(m4 == m4.percent(50.0f, Money.Round.NearestCent) * 2);
Assert.IsTrue(m1.IsPositive);
Assert.IsFalse(m5.IsPositive);
Assert.IsTrue(m5.IsNegative);
Assert.IsFalse(m1.IsNegative);
Assert.IsTrue(m0.IsZero);
Assert.IsFalse(m5.IsZero);
Assert.IsFalse(m1.IsZero);
}
public static void Main()
{
new TestMoney().RunAllTests();
}
public void RunAllTests()
{
TestParse();
TestCompare();
TestMath();
}
}
}