using Elwig.Helpers;

namespace Tests {
    [TestFixture]
    public class HelpersUtilsTest {

        private static readonly double[,] Gradation = new double[,] {
            { 14.0,  68.0 },
            { 15.0,  73.0 },
            { 17.1,  84.0 },
            { 19.0,  94.0 },
            { 21.0, 105.0 },
            { 25.0, 127.0 },
            { 27.1, 139.0 },
            { 30.0, 156.0 },
        };

        [Test]
        public void Test_KmwToOe() {
            Assert.Multiple(() => {
                for (int i = 0; i < Gradation.GetLength(0); i++) {
                    Assert.That(Utils.KmwToOe(Gradation[i, 0]), Is.EqualTo(Gradation[i, 1]));
                }
            });
        }

        [Test]
        public void Test_OeToKmw() {
            Assert.Multiple(() => {
                for (int i = 0; i < Gradation.GetLength(0); i++) {
                    Assert.That(Utils.OeToKmw(Gradation[i, 1]), Is.EqualTo(Gradation[i, 0]));
                }
            });
        }

        [Test]
        public void Test_DecFromDb() {
            Assert.Multiple(() => {
                Assert.That(Utils.DecFromDb(10670, 3), Is.EqualTo(10.67M));
                Assert.That(Utils.DecFromDb(-1009999, 4), Is.EqualTo(-100.9999M));
                Assert.That(Utils.DecFromDb(1, 2), Is.EqualTo(0.01M));
            });
        }

        [Test]
        public void Test_DecToDb() {
            Assert.Multiple(() => {
                Assert.That(Utils.DecToDb(219.48M, 2), Is.EqualTo(21948));
                Assert.That(Utils.DecToDb(-1.2345M, 4), Is.EqualTo(-12345));
                Assert.That(Utils.DecToDb(99190, 0), Is.EqualTo(99190));
                Assert.That(Utils.DecToDb(817.9099M, 3), Is.EqualTo(817910));
                Assert.That(Utils.DecToDb(-5618.944M, 2), Is.EqualTo(-561894));
            });
        }

        [Test]
        public void Test_Modulo() {
            Assert.Multiple(() => {
                Assert.That(Utils.Modulo("1", 2), Is.EqualTo(1));
                Assert.That(Utils.Modulo("12", 11), Is.EqualTo(1));
                Assert.That(Utils.Modulo("65", 16), Is.EqualTo(1));
                Assert.That(Utils.Modulo("91746381048364", 10), Is.EqualTo(4));
                Assert.That(Utils.Modulo("210501700012345678131468", 97), Is.EqualTo(1));
                Assert.Throws<ArgumentException>(() => Utils.Modulo("", 4));
                Assert.Throws<ArgumentException>(() => Utils.Modulo("1ab", 5));
                Assert.Throws<ArgumentException>(() => Utils.Modulo("123", 1));
                Assert.Throws<ArgumentException>(() => Utils.Modulo("456", 0));
                Assert.Throws<ArgumentException>(() => Utils.Modulo("789", -1));
            });
        }
    }
}