Example #1
0
        public void ParseUnitTest()
        {
            UnitsCore uc  = new UnitsCore();
            var       cm  = new Unit("cm", Dimensions.Length, 0.01);
            var       ft  = new Unit("ft", Dimensions.Length, 0.3048);
            var       min = new Unit("min", Dimensions.Time, 60.0);
            var       s   = new Unit("s", Dimensions.Time, 1.0);
            var       cfm = new Unit("CFM", ft.Pow(3) / min);

            uc.RegisterUnit(cm);
            uc.RegisterUnit(s);
            var u1 = uc.ParseUnit("cm");

            Assert.IsTrue(u1 == cm);
            var u2 = uc.ParseUnit("cm*cm");

            Assert.IsTrue(u2 == cm * cm);
            var u3 = uc.ParseUnit("cm^2");

            Assert.IsTrue(u3 == cm * cm);
            var u4 = uc.ParseUnit("cm^2.5/cm^1.5");

            Assert.IsTrue(u4 == cm);
            //flow over area -> speed
            var u5 = uc.ParseUnit("cm^3*s^-1/cm^2");

            Assert.IsTrue(u5 == cm / s);
        }
        public void BuildTest()
        {
            UnitsCore uc = new UnitsCore();

            uc.RegisterUnit(new Unit("Pa", Dimensions.Pressure, 1));
            var tokenizer = new TokenReader();
            var tokens    = tokenizer.Read("-1+2-3[Pa]^2*33.21+1e-8");
            var ast       = new AstBuilder(null).Build(tokens, uc);
        }
Example #3
0
        public void ParseNumberTest()
        {
            UnitsCore uc  = new UnitsCore();
            var       kPa = new Unit("kPa", Dimensions.Pressure, 1000);

            uc.RegisterUnit(kPa);
            var un = uc.ParseNumber("101.325[kPa]");

            Assert.AreEqual(un.Number, 101.325, 1e-8);
            Assert.IsTrue(un.Unit == kPa);
        }
Example #4
0
        public void CalculateTest()
        {
            UnitsCore uc   = new UnitsCore();
            var       inch = new Unit("in", Dimensions.Length, 0.0254);
            var       foot = new Unit("ft", 12 * inch);
            var       sec  = new Unit("s", Dimensions.Time, 1.0);
            var       min  = new Unit("min", Dimensions.Time, 60);
            var       cfm  = new Unit("CFM", foot.Pow(3) / min);

            uc.RegisterUnit(cfm);
            uc.RegisterUnit(inch);
            uc.RegisterUnit(foot);
            uc.RegisterUnit(sec);
            var oneFoot = new UnitNumber(1, foot);
            var ce      = new CalculationEngine(uc);
            var vars    = new Dictionary <string, ExecutionResult>();

            vars.Add("A", new ExecutionResult(1));
            vars.Add("B", new ExecutionResult(oneFoot));
            ExecutionResult result;

            //A number
            result = ce.Calculate("1.515");
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, 1.515, 1e-8);
            //A number with unit
            result = ce.Calculate("1.0[ft]");
            Assert.AreEqual(result.DataType, DataType.UnitNumber);
            Assert.IsTrue((UnitNumber)result.Value == oneFoot);
            result = ce.Calculate("-1.0[ft]");
            Assert.AreEqual(result.DataType, DataType.UnitNumber);
            Assert.IsTrue((UnitNumber)result.Value == -oneFoot);
            //Unitless calculations
            result = ce.Calculate("1+0.515");
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, 1.515, 1e-8);
            //Calculations with unit
            result = ce.Calculate("0.5[ft]+6[in]");
            Assert.AreEqual(result.DataType, DataType.UnitNumber);
            Assert.IsTrue((UnitNumber)result.Value == oneFoot);
            //Constant
            result = ce.Calculate("pi");
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, Math.PI, 1e-8);
            result = ce.Calculate("-pi");
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, -Math.PI, 1e-8);
            result = ce.Calculate("1-pi");
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, 1 - Math.PI, 1e-8);
            //Variable
            result = ce.Calculate("B", vars);
            Assert.AreEqual(result.DataType, DataType.UnitNumber);
            Assert.IsTrue((UnitNumber)result.Value == oneFoot);
            result = ce.Calculate("-B", vars);
            Assert.AreEqual(result.DataType, DataType.UnitNumber);
            Assert.IsTrue((UnitNumber)result.Value == -oneFoot);
            result = ce.Calculate("1[ft]-B", vars);
            Assert.AreEqual(result.DataType, DataType.UnitNumber);
            Assert.IsTrue((UnitNumber)result.Value == oneFoot - oneFoot);
            //Function with number
            result = ce.Calculate("sin(3.1415926535897932384626433832795)", vars);
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, Math.Sin(Math.PI), 1e-8);
            result = ce.Calculate("sin(3.1415926535897932384626433832795/3)", vars);
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, Math.Sin(Math.PI / 3), 1e-8);
            //Function with constant
            result = ce.Calculate("sin(pi)", vars);
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, Math.Sin(Math.PI), 1e-8);
            result = ce.Calculate("sin(pi/3)", vars);
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, Math.Sin(Math.PI / 3), 1e-8);
            //Function with variable
            result = ce.Calculate("sin(A)", vars);
            Assert.AreEqual(result.DataType, DataType.Number);
            Assert.AreEqual((double)result.Value, Math.Sin(1.0), 1e-8);
        }