public void SuccessfullyCalculateTangentOfPositiveAngle() { var value = 60; var function = new TangentFunction(); var phase = function.Calculate(); Assert.NotNull(phase); Assert.Equal("Specify Argument", phase.Name); Assert.Equal("Specify angle to find the tangent of.", phase.Description); Assert.Collection(phase.Inputs, i => { Assert.Equal("Angle", i.Info.Name); Assert.Null(i.Info.Description); Assert.Equal(new RadianUnit(), i.Info.Unit); }); phase.Inputs[0].Value = value; Assert.Null(function.Calculate(phase)); Assert.Collection(function.CurrentResult, i => { Assert.Equal(typeof(double), i.ValueType); Assert.Equal(Math.Tan(value), TypeConverter.ToObject <double>(i.Value)); }); }
public void SuccessfullySetFunctionInfo() { var function = new TangentFunction(); Assert.NotNull(function.FunctionInfo); Assert.Equal("Tangent", function.FunctionInfo.Name); Assert.Equal(new Version("1.0.0"), function.FunctionInfo.Version); Assert.Equal("Find the tangent of an angle.", function.FunctionInfo.Description); Assert.Collection(function.FunctionInfo.Tags, i => Assert.Equal("tangent", i), i => Assert.Equal("tan", i)); }
public void SuccessfullyCalculateTangentWithNoAngleSpecified() { var function = new TangentFunction(); var phase = function.Calculate(); Assert.NotNull(phase); Assert.Null(function.Calculate(phase)); Assert.Collection(function.CurrentResult, i => { Assert.Equal(typeof(double), function.CurrentResult[0].ValueType); Assert.Equal(Math.Tan(0.0), TypeConverter.ToObject <double>(function.CurrentResult[0].Value)); }); }
public void SuccessfullyCalculateTangentOfNegativeAngle() { var value = -54; var function = new TangentFunction(); var phase = function.Calculate(); Assert.NotNull(phase); phase.Inputs[0].Value = value; Assert.Null(function.Calculate(phase)); Assert.Collection(function.CurrentResult, i => { Assert.Equal(typeof(double), i.ValueType); Assert.Equal(Math.Tan(value), TypeConverter.ToObject <double>(i.Value)); }); }
/// <summary> /// Tries to create an Leviathan Function expression if the function Uri correseponds to a supported Leviathan Function /// </summary> /// <param name="u">Function Uri</param> /// <param name="args">Function Arguments</param> /// <param name="scalarArgs">Scalar Arguments</param> /// <param name="expr">Generated Expression</param> /// <returns>Whether an expression was successfully generated</returns> public bool TryCreateExpression(Uri u, List <ISparqlExpression> args, Dictionary <String, ISparqlExpression> scalarArgs, out ISparqlExpression expr) { // If any Scalar Arguments are present then can't possibly be a Leviathan Function if (scalarArgs.Count > 0) { expr = null; return(false); } String func = u.ToString(); if (func.StartsWith(LeviathanFunctionsNamespace)) { func = func.Substring(LeviathanFunctionsNamespace.Length); ISparqlExpression lvnFunc = null; switch (func) { case All: if (args.Count == 1) { lvnFunc = new AggregateTerm(new AllAggregate(args.First())); } else if (args.Count == 2 && args.First() is DistinctModifier) { lvnFunc = new AggregateTerm(new AllAggregate(args.Last(), true)); } else { throw new RdfParseException("Incorrect number of arguments for Leviathan all() aggregate"); } break; case Any: if (args.Count == 1) { lvnFunc = new AggregateTerm(new AnyAggregate(args.First())); } else if (args.Count == 2 && args.First() is DistinctModifier) { lvnFunc = new AggregateTerm(new AnyAggregate(args.Last(), true)); } else { throw new RdfParseException("Incorrect number of arguments for Leviathan any() aggregate"); } break; case Cartesian: if (args.Count == 4) { lvnFunc = new CartesianFunction(args[0], args[1], args[2], args[3]); } else if (args.Count == 6) { lvnFunc = new CartesianFunction(args[0], args[1], args[2], args[3], args[4], args[5]); } else { throw new RdfParseException("Incorrect number of arguments for Leviathan cartesian() function"); } break; case Cube: if (args.Count == 1) { lvnFunc = new CubeFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan cube() function"); } break; case DegreesToRadians: if (args.Count == 1) { lvnFunc = new DegreesToRadiansFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan degrees-to-radians() function"); } break; case E: if (args.Count == 1) { lvnFunc = new EFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan e() function"); } break; case Factorial: if (args.Count == 1) { lvnFunc = new FactorialFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan factorial() function"); } break; case Ln: if (args.Count == 1) { lvnFunc = new LeviathanNaturalLogFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan ln() function"); } break; case Log: if (args.Count == 1) { lvnFunc = new LogFunction(args.First()); } else if (args.Count == 2) { lvnFunc = new LogFunction(args.First(), args.Last()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan log() function"); } break; case MD5Hash: if (args.Count == 1) { lvnFunc = new MD5HashFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan md5hash() function"); } break; case Median: if (args.Count == 1) { lvnFunc = new AggregateTerm(new MedianAggregate(args.First())); } else if (args.Count == 2 && args.First() is DistinctModifier) { lvnFunc = new AggregateTerm(new MedianAggregate(args.Last(), true)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan median() aggregate"); } break; case Mode: if (args.Count == 1) { lvnFunc = new AggregateTerm(new ModeAggregate(args.First())); } else if (args.Count == 2 && args.First() is DistinctModifier) { lvnFunc = new AggregateTerm(new ModeAggregate(args.Last(), true)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan mode() aggregate"); } break; case None: if (args.Count == 1) { lvnFunc = new AggregateTerm(new NoneAggregate(args.First())); } else if (args.Count == 2 && args.First() is DistinctModifier) { lvnFunc = new AggregateTerm(new NoneAggregate(args.Last(), true)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan none() aggregate"); } break; case NumericMax: if (args.Count == 1) { lvnFunc = new AggregateTerm(new NumericMaxAggregate(args.First())); } else if (args.Count == 2 && args.First() is DistinctModifier) { lvnFunc = new AggregateTerm(new NumericMaxAggregate(args.Last(), true)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan nmax() aggregate"); } break; case NumericMin: if (args.Count == 1) { lvnFunc = new AggregateTerm(new NumericMinAggregate(args.First())); } else if (args.Count == 2 && args.First() is DistinctModifier) { lvnFunc = new AggregateTerm(new NumericMinAggregate(args.Last(), true)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan nmin() aggregate"); } break; case Power: if (args.Count == 1) { lvnFunc = new SquareFunction(args.First()); } else if (args.Count == 2) { lvnFunc = new PowerFunction(args.First(), args.Last()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan pow() function"); } break; case Pythagoras: if (args.Count == 2) { lvnFunc = new PythagoreanDistanceFunction(args.First(), args.Last()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan pythagoras() function"); } break; case RadiansToDegrees: if (args.Count == 1) { lvnFunc = new RadiansToDegreesFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan radians-to-degrees() function"); } break; case Random: if (args.Count == 0) { lvnFunc = new RandomFunction(); } else if (args.Count == 1) { lvnFunc = new RandomFunction(args.First()); } else if (args.Count == 2) { lvnFunc = new RandomFunction(args.First(), args.Last()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan rnd() function"); } break; case Reciprocal: if (args.Count == 1) { lvnFunc = new ReciprocalFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan reciprocal() function"); } break; case Root: if (args.Count == 1) { lvnFunc = new SquareRootFunction(args.First()); } else if (args.Count == 2) { lvnFunc = new RootFunction(args.First(), args.Last()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan root() function"); } break; case Sha256Hash: if (args.Count == 1) { lvnFunc = new Sha256HashFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan sha256hash() function"); } break; case Square: if (args.Count == 1) { lvnFunc = new SquareFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan sq() function"); } break; case SquareRoot: if (args.Count == 1) { lvnFunc = new SquareRootFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan sqrt() function"); } break; case Ten: if (args.Count == 1) { lvnFunc = new TenFunction(args.First()); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan ten() function"); } break; case TrigCos: case TrigCosInv: if (args.Count == 1) { lvnFunc = new CosineFunction(args.First(), func.Equals(TrigCosInv)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan " + func + "() function"); } break; case TrigCosec: case TrigCosecInv: if (args.Count == 1) { lvnFunc = new CosecantFunction(args.First(), func.Equals(TrigCosecInv)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan " + func + "() function"); } break; case TrigCotan: case TrigCotanInv: if (args.Count == 1) { lvnFunc = new CotangentFunction(args.First(), func.Equals(TrigCotanInv)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan " + func + "() function"); } break; case TrigSec: case TrigSecInv: if (args.Count == 1) { lvnFunc = new SecantFunction(args.First(), func.Equals(TrigSecInv)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan " + func + "() function"); } break; case TrigSin: case TrigSinInv: if (args.Count == 1) { lvnFunc = new SineFunction(args.First(), func.Equals(TrigSinInv)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan " + func + "() function"); } break; case TrigTan: case TrigTanInv: if (args.Count == 1) { lvnFunc = new TangentFunction(args.First(), func.Equals(TrigTanInv)); } else { throw new RdfParseException("Incorrect number of arguments for the Leviathan " + func + "() function"); } break; } if (lvnFunc != null) { expr = lvnFunc; return(true); } } expr = null; return(false); }