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); }
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); }
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); }