分錢的方法 - 單元測試

摘要:分錢的方法 - 單元測試

[TestMethod]
public void TestEasy()
{
    BaseDivider divider = new MyDivider1();
    // 比例隨機建立,100人, 分100000, 最小單位0.1
    randomFactorsTest(divider, 100, 100000, 1);
    // 比例隨機建立,3人, 分100000000, 最小單位1
    randomFactorsTest(divider, 3, 100000000, 1);
    // 比例隨機建立,3人, 分100.01, 最小單位1
    randomFactorsTest(divider, 3, 100.01M, 1);
    // 比例隨機建立,1000000人, 分10, 最小單位1
    randomFactorsTest(divider, 1000000, 10, 1);
}

[TestMethod]
public void TestStrongSmall()
{
    BaseDivider divider = new MyDivider1();
    Random rnd = new Random();
    // 比例隨機建立,1~100000人, 分0~10, 最小單位0~0.1^10, 1000次
    for (int i = 0; i < 1000; i++)
        randomFactorsTest(divider, rnd.Next(1, 100000), rnd.Next(0, 10), rnd.Next(10));
}

[TestMethod]
public void TestStrongBig()
{
    BaseDivider divider = new MyDivider1();
    Random rnd = new Random();
    // 比例隨機建立, 1~100000人, 分100000~int.MaxValue, 最小單位0~0.1^10, 1000次
    for (int i = 0; i < 1000; i++)
        randomFactorsTest(divider, 
            rnd.Next(1, 100000), rnd.Next(100000, int.MaxValue), rnd.Next(10));
}

private void randomFactorsTest(BaseDivider divider, int count, decimal totalValue, int digits)
{
    decimal[] factors = getFactors(count);
    decimal[] values = divider.Divide(factors, totalValue, digits);

    roleTest(factors, values, totalValue, digits);
}

private static void roleTest(decimal[] factors,decimal[] values, decimal totalValue, int digits)
{
    decimal vUnit = totalValue / factors.Sum(); // (Vs / Fs)
    decimal minUnit = (decimal)Math.Pow(0.1, digits);
    // 限制3: 總共分配的的值必須要是最小單位的最大整數倍
    Assert.AreEqual(values.Sum(), Math.Truncate(totalValue / minUnit) * minUnit);
    // 限制1: 每筆的誤差不能大於最小單位
    for (int i = 0; i < factors.Length; i++)
        Assert.IsTrue(Math.Abs(factors[i] * vUnit - values[i]) < minUnit);
}

private decimal[] getFactors(int count)
{
    Random rnd = new Random();
    decimal[] factors = new decimal[count];
    for (int i = 0; i < count; i++)
        factors[i] = rnd.Next(100000);
    return factors;
}