using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using AsystentZakupów;

namespace TestyJednostkowe_AsystentZakupów
{
    [TestClass]
    public class TestyJednostkowe_Model
    {
        const decimal limit = 1000M;
        const decimal sumaPoczątkowa = 100M;

        [TestMethod]
        public void TestKonstruktoraIWłasności()
        {
            Model model = new Model(limit, sumaPoczątkowa);

            Assert.AreEqual(sumaPoczątkowa, model.Suma);
        }

        [TestMethod]
        public void TestKonstruktora()
        {
            Model model = new Model(limit, sumaPoczątkowa);
            PrivateObject poModel = new PrivateObject(model);

            Assert.AreEqual(sumaPoczątkowa, (decimal)poModel.GetField("suma"));
            Assert.AreEqual(limit, (decimal)poModel.GetField("limit"));
        }

        [TestMethod]
        public void TestMetodyDodaj()
        {
            //arrange
            Model model = new Model(limit, sumaPoczątkowa);
            decimal kwota = 20;

            //act
            model.Dodaj(kwota);

            //assert
            Assert.AreEqual(sumaPoczątkowa + kwota, model.Suma);
        }

        [TestMethod]
        [ExpectedException(typeof(Exception))]
        public void TestMetodyDodajDlaUjemnejKwoty()
        {
            Model model = new Model(limit, sumaPoczątkowa);
            decimal kwota = 20;

            model.Dodaj(-kwota);
        }

        [TestMethod]
        [ExpectedException(typeof(Exception))]
        public void TestMetodyDodajDlaKwotyPrzekraczającejLimit()
        {
            Model model = new Model(limit, sumaPoczątkowa);
            decimal kwota = limit + 20;

            model.Dodaj(kwota);
        }

        [TestMethod]
        public void TestMetodySprawdźKwotę()
        {
            Model model = new Model(limit, sumaPoczątkowa);
            PrivateObject poModel = new PrivateObject(model);
            decimal kwota = 20;

            bool wynik = (bool)poModel.Invoke("sprawdźKwotę", kwota);
            Assert.IsTrue(wynik);

            wynik = (bool)poModel.Invoke("sprawdźKwotę", -kwota);
            Assert.IsFalse(wynik);

            wynik = (bool)poModel.Invoke("sprawdźKwotę", limit + kwota);
            Assert.IsFalse(wynik);
        }
    }
}
