From c0e92a92581d3a64e7c7354ae4a7f221b160b258 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 24 Aug 2024 07:56:21 +0200 Subject: [PATCH] net8 (#31) * net8 * Increment version * Update dependencies * update benchmark * move to src folder * fix folder case * fix folder case * fix images * fix images * fix readme * add perf tests --- .github/workflows/project-build.yml | 12 +- BenchResults/Benchmark.xlsx | Bin 18209 -> 0 bytes BenchResults/both.html | 55 ------ CodeAnalysis.ruleset | 6 + Directory.Build.props | 2 +- Directory.Packages.props | 21 ++- Images/Both.png | Bin 90830 -> 0 bytes Images/Graph.png | Bin 17870 -> 0 bytes Images/Table.png | Bin 19810 -> 0 bytes .../Helpers/FormulaModelFactory.cs | 29 ---- .../Models/FormulaModel.cs | 30 ---- NoStringEvaluating.sln | 10 +- .../Exceptions/NoStringFunctionException.cs | 15 -- .../Exceptions/VariableNotFoundException.cs | 21 --- .../Nodes/Base/BaseFormulaNode.cs | 20 --- .../Nodes/Common/FormulaNodes.cs | 33 ---- README.md | 12 +- benchResults/Benchmark.xlsx | Bin 0 -> 18261 bytes benchResults/Both.html | 55 ++++++ images/Both.png | Bin 0 -> 97614 bytes images/Graph.png | Bin 0 -> 12687 bytes images/Table.png | Bin 0 -> 14769 bytes .../ConsoleApp}/Benchmark/Base/BenchBase.cs | 14 +- .../ConsoleApp}/Benchmark/BenchNumbers.cs | 0 .../ConsoleApp}/Benchmark/BenchParallel.cs | 0 .../ConsoleApp}/ConsoleApp.csproj | 0 .../ConsoleApp}/NoStringNinjectModule.cs | 0 {ConsoleApp => src/ConsoleApp}/Program.cs | 0 ...Microsoft.DependencyInjection.Tests.csproj | 0 .../NoStringEvaluatorExtensionsTests.cs | 0 ...sions.Microsoft.DependencyInjection.csproj | 0 ...tensions.Microsoft.DependencyInjection.xml | 0 .../NoStringEvaluatorExtensions.cs | 0 .../logo.png | Bin .../NoStringEvaluating.Tests.csproj | 4 + .../PerfTests/PerformanceTests.cs | 115 +++++++++++++ .../PerfTests/Report/ReportContainer.cs | 11 ++ .../PerfTests/Report/ReportExtensions.cs | 37 +++++ .../PerfTests/Report/ReportItem.cs | 6 + .../PerfTests/Report/ReportWriter.cs | 36 ++++ .../Properties/AssemblyInfo.cs | 0 .../NoStringEvaluating.Tests}/Suite.cs | 0 .../UnitTests}/Data/CheckFormula.cs | 6 +- .../UnitTests}/Data/EvaluateBoolean.cs | 6 +- .../UnitTests}/Data/EvaluateDateTime.cs | 6 +- .../UnitTests}/Data/EvaluateNumber.cs | 6 +- .../UnitTests}/Data/EvaluateNumberList.cs | 6 +- .../UnitTests}/Data/EvaluateWord.cs | 6 +- .../UnitTests}/Data/EvaluateWordList.cs | 6 +- .../UnitTests}/Data/ParseFormula.cs | 6 +- .../Functions/Excel/CountFunctionTests.cs | 2 +- .../Excel/Date/AddHoursFunctionTests.cs | 2 +- .../Excel/Date/AddMinutesFunctionTests.cs | 2 +- .../Excel/Date/AddSecondsFunctionTests.cs | 2 +- .../Excel/Date/DateDifFunctionTests.cs | 2 +- .../Excel/Date/DateFormatFunctionTests.cs | 2 +- .../Functions/Excel/Date/DayFunctionTests.cs | 2 +- .../Excel/Date/MonthFunctionTests.cs | 2 +- .../Functions/Excel/Date/NowFunctionTests.cs | 2 +- .../Excel/Date/TimeDifFunctionTests.cs | 4 +- .../Excel/Date/ToDateTimeFunctionTests.cs | 2 +- .../Excel/Date/TodayFunctionTests.cs | 2 +- .../Excel/Date/WeekDayFunctionTests.cs | 2 +- .../Functions/Excel/Date/YearFunctionTests.cs | 2 +- .../Functions/Excel/IsErrorFunctionTests.cs | 2 +- .../Functions/Excel/IsMemberFunctionTests.cs | 2 +- .../Functions/Excel/IsNumberFunctionTests.cs | 2 +- .../Functions/Excel/LenFunctionTests.cs | 2 +- .../Functions/Excel/SortFunctionTests.cs | 2 +- .../Functions/Excel/ToNumberFunctionTests.cs | 2 +- .../Excel/Word/ConcatFunctionTests.cs | 2 +- .../Excel/Word/ExplodeFunctionTests.cs | 2 +- .../Excel/Word/ImplodeFunctionTests.cs | 2 +- .../Excel/Word/IsTextFunctionTests.cs | 2 +- .../Functions/Excel/Word/LeftFunctionTests.cs | 2 +- .../Excel/Word/LowerFunctionTests.cs | 2 +- .../Excel/Word/MiddleFunctionTests.cs | 2 +- .../Excel/Word/ProperFunctionTests.cs | 2 +- .../Excel/Word/ReplaceFunctionTests.cs | 2 +- .../Excel/Word/RightFunctionTests.cs | 2 +- .../Functions/Excel/Word/TextFunctionTests.cs | 2 +- .../Excel/Word/UniqueFunctionTests.cs | 2 +- .../Excel/Word/UpperFunctionTests.cs | 2 +- .../Functions/FunctionIntegrationTests.cs | 2 +- .../UnitTests}/Functions/FunctionTests.cs | 4 +- .../Functions/Logic/AndFunctionTests.cs | 2 +- .../Functions/Logic/IfFunctionTests.cs | 2 +- .../Functions/Logic/IffFunctionTests.cs | 2 +- .../Functions/Logic/IsNanFunctionTests.cs | 2 +- .../Functions/Logic/NotAliasFunctionTests.cs | 2 +- .../Functions/Logic/NotFunctionTests.cs | 2 +- .../Functions/Logic/OrFunctionTests.cs | 2 +- .../Functions/Math/AbsFunctionTests.cs | 4 +- .../Functions/Math/AddFunctionTests.cs | 4 +- .../Functions/Math/CeilFunctionTests.cs | 4 +- .../Functions/Math/FactFunctionTests.cs | 4 +- .../Functions/Math/FibFunctionTests.cs | 4 +- .../Functions/Math/FloorFunctionTests.cs | 4 +- .../Functions/Math/GcdFunctionTests.cs | 4 +- .../Functions/Math/LcmFunctionTests.cs | 4 +- .../Functions/Math/LnFunctionTests.cs | 4 +- .../Functions/Math/Log10FunctionTests.cs | 4 +- .../Functions/Math/Log2FunctionTests.cs | 4 +- .../Functions/Math/LogFunctionTests.cs | 4 +- .../Functions/Math/MaxFunctionTests.cs | 4 +- .../Functions/Math/MeanFunctionTests.cs | 4 +- .../Functions/Math/MinFunctionTests.cs | 4 +- .../Functions/Math/ModFunctionTests.cs | 4 +- .../Functions/Math/MultiFunctionTests.cs | 4 +- .../Functions/Math/RoundFunctionTests.cs | 4 +- .../Functions/Math/SgnFunctionTests.cs | 4 +- .../Functions/Math/SignFunctionTests.cs | 4 +- .../Functions/Math/SqrtFunctionTests.cs | 4 +- .../Trigonometry/Cos/AcosFunctionTests.cs | 4 +- .../Trigonometry/Cos/AcoshFunctionTests.cs | 4 +- .../Trigonometry/Cos/ArccosFunctionTests.cs | 4 +- .../Trigonometry/Cos/ArccoshFunctionTests.cs | 4 +- .../Trigonometry/Cos/ArcosFunctionTests.cs | 4 +- .../Trigonometry/Cos/ArcoshFunctionTests.cs | 4 +- .../Math/Trigonometry/Cos/CosFunctionTests.cs | 4 +- .../Trigonometry/Cos/CoshFunctionTests.cs | 4 +- .../Cosec/AcosechFunctionTests.cs | 4 +- .../Trigonometry/Cosec/AcschFunctionTests.cs | 4 +- .../Cosec/ArccschFunctionTests.cs | 4 +- .../Cosec/ArcosechFunctionTests.cs | 4 +- .../Trigonometry/Cosec/ArcschFunctionTests.cs | 4 +- .../Trigonometry/Cosec/CosecFunctionTests.cs | 4 +- .../Trigonometry/Cosec/CosechFunctionTests.cs | 4 +- .../Trigonometry/Cosec/CscFunctionTests.cs | 4 +- .../Trigonometry/Cosec/CschFunctionTests.cs | 4 +- .../Trigonometry/Cotan/AcotFunctionTests.cs | 4 +- .../Trigonometry/Cotan/AcothFunctionTests.cs | 4 +- .../Trigonometry/Cotan/ActanFunctionTests.cs | 4 +- .../Trigonometry/Cotan/ActanhFunctionTests.cs | 4 +- .../Trigonometry/Cotan/ActgFunctionTests.cs | 4 +- .../Trigonometry/Cotan/ActghFunctionTests.cs | 4 +- .../Trigonometry/Cotan/ArccotFunctionTests.cs | 4 +- .../Cotan/ArccothFunctionTests.cs | 4 +- .../Cotan/ArcctanFunctionTests.cs | 4 +- .../Cotan/ArcctanhFunctionTests.cs | 4 +- .../Trigonometry/Cotan/ArcctgFunctionTests.cs | 4 +- .../Cotan/ArcctghFunctionTests.cs | 4 +- .../Trigonometry/Cotan/CotFunctionTests.cs | 4 +- .../Trigonometry/Cotan/CothFunctionTests.cs | 4 +- .../Trigonometry/Cotan/CtanFunctionTests.cs | 4 +- .../Trigonometry/Cotan/CtanhFunctionTests.cs | 4 +- .../Trigonometry/Cotan/CtgFunctionTests.cs | 4 +- .../Trigonometry/Cotan/CtghFunctionTests.cs | 4 +- .../Math/Trigonometry/DegFunctionTests.cs | 4 +- .../Math/Trigonometry/ExpFunctionTests.cs | 4 +- .../Math/Trigonometry/RadFunctionTests.cs | 4 +- .../Trigonometry/Sec/ArcsecFunctionTests.cs | 4 +- .../Trigonometry/Sec/ArcsechFunctionTests.cs | 4 +- .../Trigonometry/Sec/ArsechFunctionTests.cs | 4 +- .../Trigonometry/Sec/AsechFunctionTests.cs | 4 +- .../Math/Trigonometry/Sec/SecFunctionTests.cs | 4 +- .../Trigonometry/Sec/SechFunctionTests.cs | 4 +- .../Trigonometry/Sin/ArcsinFunctionTests.cs | 4 +- .../Trigonometry/Sin/ArcsinhFunctionTests.cs | 4 +- .../Trigonometry/Sin/ArsinFunctionTests.cs | 4 +- .../Trigonometry/Sin/ArsinhFunctionTests.cs | 4 +- .../Trigonometry/Sin/AsinFunctionTests.cs | 4 +- .../Trigonometry/Sin/AsinhFunctionTests.cs | 4 +- .../Math/Trigonometry/Sin/SinFunctionTests.cs | 4 +- .../Trigonometry/Sin/SinhFunctionTests.cs | 4 +- .../Trigonometry/Tan/ArctanFunctionTests.cs | 4 +- .../Trigonometry/Tan/ArctanhFunctionTests.cs | 4 +- .../Trigonometry/Tan/ArctgFunctionTests.cs | 4 +- .../Trigonometry/Tan/ArctghFunctionTests.cs | 4 +- .../Trigonometry/Tan/AtanFunctionTests.cs | 4 +- .../Trigonometry/Tan/AtanhFunctionTests.cs | 4 +- .../Math/Trigonometry/Tan/AtgFunctionTests.cs | 4 +- .../Trigonometry/Tan/AtghFunctionTests.cs | 4 +- .../Math/Trigonometry/Tan/TanFunctionTests.cs | 4 +- .../Trigonometry/Tan/TanhFunctionTests.cs | 4 +- .../Math/Trigonometry/Tan/TgFunctionTests.cs | 4 +- .../Math/Trigonometry/Tan/TghFunctionTests.cs | 4 +- .../Functions/Null/IfNullFunctionTests.cs | 2 +- .../Functions/Null/IsNullFunctionTests.cs | 2 +- .../Functions/Null/NullIfFunctionTests.cs | 2 +- .../Helpers/EvaluatorFacadeFactory.cs | 2 +- .../UnitTests}/Helpers/Extensions.cs | 2 +- .../UnitTests/Helpers/FormulaModelFactory.cs | 28 ++++ .../Helpers/InternalValueFactory.cs | 2 +- .../UnitTests}/Helpers/VariablesContainer.cs | 2 +- .../UnitTests/Models/FormulaModel.cs | 21 +++ .../Models/Values/EvaluatorValueTests.cs | 2 +- .../Values/InternalEvaluatorValueTests.cs | 2 +- .../NoStringEvaluatorNullableTests.cs | 4 +- .../UnitTests}/NoStringEvaluatorTests.cs | 25 +-- .../Services/Checking/FormulaCheckerTests.cs | 9 +- .../Services/OperationProcessorTests.cs | 2 +- .../Services/Parsing/FormulaParserTests.cs | 9 +- .../Services/Value/WordFormatterTests.cs | 2 +- .../Contract/IFormulaCache.cs | 0 .../Contract/IFormulaChecker.cs | 0 .../Contract/IFormulaParser.cs | 0 .../Contract/IFunctionReader.cs | 0 .../Contract/INoStringEvaluator.cs | 0 .../Contract/INoStringEvaluatorNullable.cs | 0 .../Contract/Variables/IVariable.cs | 0 .../Contract/Variables/IVariablesContainer.cs | 0 .../Exceptions/NoStringFunctionException.cs | 8 + .../Exceptions/VariableNotFoundException.cs | 12 ++ .../Extensions/InternalExtensions.cs | 0 .../Extensions/NoStringEvaluatorExtensions.cs | 0 .../Extensions/NumberExtensions.cs | 0 .../Factories/BooleanFactory.cs | 0 .../Factories/DateTimeFactory.cs | 0 .../Factories/NumberListFactory.cs | 0 .../Factories/ObjectFactory.cs | 0 .../Factories/ValueFactory.cs | 0 .../Factories/WordFactory.cs | 0 .../Factories/WordListFactory.cs | 0 .../Functions/Base/IFunction.cs | 0 .../Functions/Excel/CountFunction.cs | 0 .../Functions/Excel/Date/AddHoursFunction.cs | 0 .../Excel/Date/AddMinutesFunction.cs | 0 .../Excel/Date/AddSecondsFunction.cs | 0 .../Functions/Excel/Date/DateDifFunction.cs | 0 .../Excel/Date/DateFormatFunction.cs | 0 .../Functions/Excel/Date/DayFunction.cs | 0 .../Functions/Excel/Date/MonthFunction.cs | 0 .../Functions/Excel/Date/NowFunction.cs | 0 .../Functions/Excel/Date/TimeDifFunction.cs | 0 .../Excel/Date/ToDateTimeFunction.cs | 0 .../Functions/Excel/Date/TodayFunction.cs | 0 .../Functions/Excel/Date/WeekDayFunction.cs | 0 .../Functions/Excel/Date/YearFunction.cs | 0 .../Functions/Excel/IsErrorFunction.cs | 0 .../Functions/Excel/IsMemberFunction.cs | 0 .../Functions/Excel/IsNumberFunction.cs | 0 .../Functions/Excel/LenFunction.cs | 0 .../Functions/Excel/SortFunction.cs | 0 .../Functions/Excel/ToNumberFunction.cs | 0 .../Functions/Excel/Word/ConcatFunction.cs | 0 .../Functions/Excel/Word/ExplodeFunction.cs | 0 .../Functions/Excel/Word/ImplodeFunction.cs | 0 .../Functions/Excel/Word/IsTextFunction.cs | 0 .../Functions/Excel/Word/LeftFunction.cs | 0 .../Functions/Excel/Word/LowerFunction.cs | 0 .../Functions/Excel/Word/MiddleFunction.cs | 0 .../Functions/Excel/Word/ProperFunction.cs | 0 .../Functions/Excel/Word/ReplaceFunction.cs | 0 .../Functions/Excel/Word/RightFunction.cs | 0 .../Functions/Excel/Word/TextFunction.cs | 0 .../Functions/Excel/Word/UniqueFunction.cs | 0 .../Functions/Excel/Word/UpperFunction.cs | 0 .../Functions/Logic/AndFunction.cs | 0 .../Functions/Logic/IfFunction.cs | 0 .../Functions/Logic/IffFunction.cs | 0 .../Functions/Logic/IsnanFunction.cs | 0 .../Functions/Logic/NotAliasFunction.cs | 0 .../Functions/Logic/NotFunction.cs | 0 .../Functions/Logic/OrFunction.cs | 0 .../Functions/Math/AbsFunction.cs | 0 .../Functions/Math/AddFunction.cs | 0 .../Functions/Math/CeilFunction.cs | 0 .../Functions/Math/FactFunction.cs | 0 .../Functions/Math/FibFunction.cs | 0 .../Functions/Math/FloorFunction.cs | 0 .../Functions/Math/GcdFunction.cs | 0 .../Functions/Math/LcmFunction.cs | 0 .../Functions/Math/LnFunction.cs | 0 .../Functions/Math/Log10Function.cs | 0 .../Functions/Math/Log2Function.cs | 0 .../Functions/Math/LogFunction.cs | 0 .../Functions/Math/MaxFunction.cs | 0 .../Functions/Math/MeanFunction.cs | 0 .../Functions/Math/MinFunction.cs | 0 .../Functions/Math/ModFunction.cs | 0 .../Functions/Math/MultiFunction.cs | 0 .../Functions/Math/RoundFunction.cs | 0 .../Functions/Math/SgnFunction.cs | 0 .../Functions/Math/SignFunction.cs | 0 .../Functions/Math/SqrtFunction.cs | 0 .../Math/Trigonometry/Cos/AcosFunction.cs | 0 .../Math/Trigonometry/Cos/AcoshFunction.cs | 0 .../Math/Trigonometry/Cos/ArccosFunction.cs | 0 .../Math/Trigonometry/Cos/ArccoshFunction.cs | 0 .../Math/Trigonometry/Cos/ArcosFunction.cs | 0 .../Math/Trigonometry/Cos/ArcoshFunction.cs | 0 .../Math/Trigonometry/Cos/CosFunction.cs | 0 .../Math/Trigonometry/Cos/CoshFunction.cs | 0 .../Trigonometry/Cosec/AcosechFunction.cs | 0 .../Math/Trigonometry/Cosec/AcschFunction.cs | 0 .../Trigonometry/Cosec/ArccschFunction.cs | 0 .../Trigonometry/Cosec/ArcosechFunction.cs | 0 .../Math/Trigonometry/Cosec/ArcschFunction.cs | 0 .../Math/Trigonometry/Cosec/CosecFunction.cs | 0 .../Math/Trigonometry/Cosec/CosechFunction.cs | 0 .../Math/Trigonometry/Cosec/CscFunction.cs | 0 .../Math/Trigonometry/Cosec/CschFunction.cs | 0 .../Math/Trigonometry/Cotan/AcotFunction.cs | 0 .../Math/Trigonometry/Cotan/AcothFunction.cs | 0 .../Math/Trigonometry/Cotan/ActanFunction.cs | 0 .../Math/Trigonometry/Cotan/ActanhFunction.cs | 0 .../Math/Trigonometry/Cotan/ActgFunction.cs | 0 .../Math/Trigonometry/Cotan/ActghFunction.cs | 0 .../Math/Trigonometry/Cotan/ArccotFunction.cs | 0 .../Trigonometry/Cotan/ArccothFunction.cs | 0 .../Trigonometry/Cotan/ArcctanFunction.cs | 0 .../Trigonometry/Cotan/ArcctanhFunction.cs | 0 .../Math/Trigonometry/Cotan/ArcctgFunction.cs | 0 .../Trigonometry/Cotan/ArcctghFunction.cs | 0 .../Math/Trigonometry/Cotan/CotFunction.cs | 0 .../Math/Trigonometry/Cotan/CothFunction.cs | 0 .../Math/Trigonometry/Cotan/CtanFunction.cs | 0 .../Math/Trigonometry/Cotan/CtanhFunction.cs | 0 .../Math/Trigonometry/Cotan/CtgFunction.cs | 0 .../Math/Trigonometry/Cotan/CtghFunction.cs | 0 .../Math/Trigonometry/DegFunction.cs | 0 .../Math/Trigonometry/ExpFunction.cs | 0 .../Math/Trigonometry/RadFunction.cs | 0 .../Math/Trigonometry/Sec/ArcsecFunction.cs | 0 .../Math/Trigonometry/Sec/ArcsechFunction.cs | 0 .../Math/Trigonometry/Sec/ArsechFunction.cs | 0 .../Math/Trigonometry/Sec/AsechFunction.cs | 0 .../Math/Trigonometry/Sec/SecFunction.cs | 0 .../Math/Trigonometry/Sec/SechFunction.cs | 0 .../Math/Trigonometry/Sin/ArcsinFunction.cs | 0 .../Math/Trigonometry/Sin/ArcsinhFunction.cs | 0 .../Math/Trigonometry/Sin/ArsinFunction.cs | 0 .../Math/Trigonometry/Sin/ArsinhFunction.cs | 0 .../Math/Trigonometry/Sin/AsinFunction.cs | 0 .../Math/Trigonometry/Sin/AsinhFunction.cs | 0 .../Math/Trigonometry/Sin/SinFunction.cs | 0 .../Math/Trigonometry/Sin/SinhFunction.cs | 0 .../Math/Trigonometry/Tan/ArctanFunction.cs | 0 .../Math/Trigonometry/Tan/ArctanhFunction.cs | 0 .../Math/Trigonometry/Tan/ArctgFunction.cs | 0 .../Math/Trigonometry/Tan/ArctghFunction.cs | 0 .../Math/Trigonometry/Tan/AtanFunction.cs | 0 .../Math/Trigonometry/Tan/AtanhFunction.cs | 0 .../Math/Trigonometry/Tan/AtgFunction.cs | 0 .../Math/Trigonometry/Tan/AtghFunction.cs | 0 .../Math/Trigonometry/Tan/TanFunction.cs | 0 .../Math/Trigonometry/Tan/TanhFunction.cs | 0 .../Math/Trigonometry/Tan/TgFunction.cs | 0 .../Math/Trigonometry/Tan/TghFunction.cs | 0 .../Functions/Null/IfNullFunction.cs | 0 .../Functions/Null/IsNullFunction.cs | 0 .../Functions/Null/NullIfFunction.cs | 0 .../NoStringEvaluating}/GlobalOptions.cs | 4 +- .../NoStringEvaluating}/Models/Bracket.cs | 0 .../Models/FloatingPointSymbol.cs | 0 .../FormulaChecker/CheckFormulaResult.cs | 17 +- .../FormulaCheckerMistakeType.cs | 0 .../FormulaChecker/FormulaCheckerModel.cs | 20 +-- .../Models/FunctionChar.cs | 0 .../NoStringEvaluating}/Models/Operator.cs | 0 .../Models/Values/EvaluatorValue.cs | 0 .../Models/Values/InternalEvaluatorValue.cs | 0 .../Models/Values/ValueKeeper.cs | 0 .../Models/Values/ValueKeeperContainer.cs | 2 +- .../Values/ValueKeeperContainerReleaser.cs | 9 +- .../Models/Values/ValueTypeKey.cs | 0 .../NoStringEvaluating.csproj | 5 +- .../NoStringEvaluating.xml | 156 +++++++++--------- .../NoStringEvaluating}/NoStringEvaluator.cs | 29 +--- .../NoStringEvaluatorNullable.cs | 37 +---- .../NoStringEvaluatorOptions.cs | 6 +- .../Nodes/Base/BaseFormulaNode.cs | 12 ++ .../Nodes/Base/NodeTypeEnum.cs | 0 .../NoStringEvaluating}/Nodes/BooleanNode.cs | 13 +- .../NoStringEvaluating}/Nodes/BracketNode.cs | 13 +- .../Nodes/Common/FormulaNodes.cs | 22 +++ .../Nodes/FunctionCharNode.cs | 13 +- .../NoStringEvaluating}/Nodes/FunctionNode.cs | 19 +-- .../Nodes/FunctionWrapperNode.cs | 16 +- .../NoStringEvaluating}/Nodes/NullNode.cs | 0 .../Nodes/NumberListNode.cs | 13 +- .../NoStringEvaluating}/Nodes/NumberNode.cs | 13 +- .../NoStringEvaluating}/Nodes/OperatorNode.cs | 0 .../NoStringEvaluating}/Nodes/VariableNode.cs | 19 +-- .../NoStringEvaluating}/Nodes/WordListNode.cs | 13 +- .../NoStringEvaluating}/Nodes/WordNode.cs | 13 +- .../Properties/AssemblyInfo.cs | 0 .../Services/BorderCounter.cs | 15 +- .../Services/BracketCounters.cs | 2 +- .../Services/Cache/FormulaCache.cs | 19 +-- .../Services/Checking/FormulaChecker.cs | 12 +- .../Services/IndexWatcher.cs | 0 .../Services/NameBuilder.cs | 17 +- .../Services/OperationProcessor.cs | 0 .../Services/Parsing/FormulaParser.cs | 12 +- .../Parsing/NodeReaders/BracketReader.cs | 0 .../Parsing/NodeReaders/FunctionCharReader.cs | 0 .../Parsing/NodeReaders/FunctionReader.cs | 4 +- .../Parsing/NodeReaders/ListReader.cs | 0 .../Parsing/NodeReaders/NegationReader.cs | 0 .../Parsing/NodeReaders/NumberReader.cs | 0 .../Parsing/NodeReaders/OperatorReader.cs | 2 +- .../Parsing/NodeReaders/UnaryMinusReader.cs | 0 .../Parsing/NodeReaders/VariableReader.cs | 0 .../Parsing/NodeReaders/WordReader.cs | 2 +- .../Services/Parsing/PolishNotationService.cs | 0 .../Services/Value/WordFormatter.cs | 0 .../Services/Variables/KnownVariables.cs | 0 .../Services/Variables/VariablesSource.cs | 0 .../NoStringEvaluating}/logo.png | Bin 401 files changed, 842 insertions(+), 865 deletions(-) delete mode 100644 BenchResults/Benchmark.xlsx delete mode 100644 BenchResults/both.html delete mode 100644 Images/Both.png delete mode 100644 Images/Graph.png delete mode 100644 Images/Table.png delete mode 100644 NoStringEvaluating.Tests/Helpers/FormulaModelFactory.cs delete mode 100644 NoStringEvaluating.Tests/Models/FormulaModel.cs delete mode 100644 NoStringEvaluating/Exceptions/NoStringFunctionException.cs delete mode 100644 NoStringEvaluating/Exceptions/VariableNotFoundException.cs delete mode 100644 NoStringEvaluating/Nodes/Base/BaseFormulaNode.cs delete mode 100644 NoStringEvaluating/Nodes/Common/FormulaNodes.cs create mode 100644 benchResults/Benchmark.xlsx create mode 100644 benchResults/Both.html create mode 100644 images/Both.png create mode 100644 images/Graph.png create mode 100644 images/Table.png rename {ConsoleApp => src/ConsoleApp}/Benchmark/Base/BenchBase.cs (96%) rename {ConsoleApp => src/ConsoleApp}/Benchmark/BenchNumbers.cs (100%) rename {ConsoleApp => src/ConsoleApp}/Benchmark/BenchParallel.cs (100%) rename {ConsoleApp => src/ConsoleApp}/ConsoleApp.csproj (100%) rename {ConsoleApp => src/ConsoleApp}/NoStringNinjectModule.cs (100%) rename {ConsoleApp => src/ConsoleApp}/Program.cs (100%) rename {NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests => src/NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests}/NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests.csproj (100%) rename {NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests => src/NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests}/NoStringEvaluatorExtensionsTests.cs (100%) rename {NoStringEvaluating.Extensions.Microsoft.DependencyInjection => src/NoStringEvaluating.Extensions.Microsoft.DependencyInjection}/NoStringEvaluating.Extensions.Microsoft.DependencyInjection.csproj (100%) rename {NoStringEvaluating.Extensions.Microsoft.DependencyInjection => src/NoStringEvaluating.Extensions.Microsoft.DependencyInjection}/NoStringEvaluating.Extensions.Microsoft.DependencyInjection.xml (100%) rename {NoStringEvaluating.Extensions.Microsoft.DependencyInjection => src/NoStringEvaluating.Extensions.Microsoft.DependencyInjection}/NoStringEvaluatorExtensions.cs (100%) rename {NoStringEvaluating.Extensions.Microsoft.DependencyInjection => src/NoStringEvaluating.Extensions.Microsoft.DependencyInjection}/logo.png (100%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests}/NoStringEvaluating.Tests.csproj (77%) create mode 100644 src/NoStringEvaluating.Tests/PerfTests/PerformanceTests.cs create mode 100644 src/NoStringEvaluating.Tests/PerfTests/Report/ReportContainer.cs create mode 100644 src/NoStringEvaluating.Tests/PerfTests/Report/ReportExtensions.cs create mode 100644 src/NoStringEvaluating.Tests/PerfTests/Report/ReportItem.cs create mode 100644 src/NoStringEvaluating.Tests/PerfTests/Report/ReportWriter.cs rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests}/Properties/AssemblyInfo.cs (100%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests}/Suite.cs (100%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Data/CheckFormula.cs (93%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Data/EvaluateBoolean.cs (96%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Data/EvaluateDateTime.cs (82%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Data/EvaluateNumber.cs (98%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Data/EvaluateNumberList.cs (72%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Data/EvaluateWord.cs (96%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Data/EvaluateWordList.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Data/ParseFormula.cs (91%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/CountFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/AddHoursFunctionTests.cs (87%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/AddMinutesFunctionTests.cs (88%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/AddSecondsFunctionTests.cs (88%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/DateDifFunctionTests.cs (96%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/DateFormatFunctionTests.cs (92%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/DayFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/MonthFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/NowFunctionTests.cs (89%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/TimeDifFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/ToDateTimeFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/TodayFunctionTests.cs (88%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/WeekDayFunctionTests.cs (92%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Date/YearFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/IsErrorFunctionTests.cs (89%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/IsMemberFunctionTests.cs (96%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/IsNumberFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/LenFunctionTests.cs (89%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/SortFunctionTests.cs (96%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/ToNumberFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/ConcatFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/ExplodeFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/ImplodeFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/IsTextFunctionTests.cs (93%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/LeftFunctionTests.cs (97%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/LowerFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/MiddleFunctionTests.cs (97%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/ProperFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/ReplaceFunctionTests.cs (95%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/RightFunctionTests.cs (97%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/TextFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/UniqueFunctionTests.cs (95%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Excel/Word/UpperFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/FunctionIntegrationTests.cs (88%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/FunctionTests.cs (88%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Logic/AndFunctionTests.cs (90%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Logic/IfFunctionTests.cs (90%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Logic/IffFunctionTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Logic/IsNanFunctionTests.cs (89%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Logic/NotAliasFunctionTests.cs (91%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Logic/NotFunctionTests.cs (89%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Logic/OrFunctionTests.cs (90%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/AbsFunctionTests.cs (81%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/AddFunctionTests.cs (83%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/CeilFunctionTests.cs (81%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/FactFunctionTests.cs (84%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/FibFunctionTests.cs (84%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/FloorFunctionTests.cs (81%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/GcdFunctionTests.cs (91%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/LcmFunctionTests.cs (88%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/LnFunctionTests.cs (81%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Log10FunctionTests.cs (81%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Log2FunctionTests.cs (81%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/LogFunctionTests.cs (82%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/MaxFunctionTests.cs (83%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/MeanFunctionTests.cs (84%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/MinFunctionTests.cs (83%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/ModFunctionTests.cs (81%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/MultiFunctionTests.cs (84%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/RoundFunctionTests.cs (82%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/SgnFunctionTests.cs (82%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/SignFunctionTests.cs (82%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/SqrtFunctionTests.cs (82%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cos/AcosFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cos/AcoshFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cos/ArccosFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cos/ArccoshFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cos/ArcosFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cos/ArcoshFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cos/CosFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cos/CoshFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/AcosechFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/AcschFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/ArccschFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/ArcosechFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/ArcschFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/CosecFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/CosechFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/CscFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cosec/CschFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/AcotFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/AcothFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ActanFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ActanhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ActgFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ActghFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ArccotFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ArccothFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ArcctanFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ArcctanhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ArcctgFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/ArcctghFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/CotFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/CothFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/CtanFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/CtanhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/CtgFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Cotan/CtghFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/DegFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/ExpFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/RadFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sec/ArcsecFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sec/ArcsechFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sec/ArsechFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sec/AsechFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sec/SecFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sec/SechFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sin/ArcsinFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sin/ArcsinhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sin/ArsinFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sin/ArsinhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sin/AsinFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sin/AsinhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sin/SinFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Sin/SinhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/ArctanFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/ArctanhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/ArctgFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/ArctghFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/AtanFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/AtanhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/AtgFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/AtghFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/TanFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/TanhFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/TgFunctionTests.cs (79%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Math/Trigonometry/Tan/TghFunctionTests.cs (80%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Null/IfNullFunctionTests.cs (92%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Null/IsNullFunctionTests.cs (92%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Functions/Null/NullIfFunctionTests.cs (92%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Helpers/EvaluatorFacadeFactory.cs (96%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Helpers/Extensions.cs (89%) create mode 100644 src/NoStringEvaluating.Tests/UnitTests/Helpers/FormulaModelFactory.cs rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Helpers/InternalValueFactory.cs (90%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Helpers/VariablesContainer.cs (94%) create mode 100644 src/NoStringEvaluating.Tests/UnitTests/Models/FormulaModel.cs rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Models/Values/EvaluatorValueTests.cs (88%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Models/Values/InternalEvaluatorValueTests.cs (88%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/NoStringEvaluatorNullableTests.cs (95%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/NoStringEvaluatorTests.cs (94%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Services/Checking/FormulaCheckerTests.cs (71%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Services/OperationProcessorTests.cs (99%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Services/Parsing/FormulaParserTests.cs (69%) rename {NoStringEvaluating.Tests => src/NoStringEvaluating.Tests/UnitTests}/Services/Value/WordFormatterTests.cs (96%) rename {NoStringEvaluating => src/NoStringEvaluating}/Contract/IFormulaCache.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Contract/IFormulaChecker.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Contract/IFormulaParser.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Contract/IFunctionReader.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Contract/INoStringEvaluator.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Contract/INoStringEvaluatorNullable.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Contract/Variables/IVariable.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Contract/Variables/IVariablesContainer.cs (100%) create mode 100644 src/NoStringEvaluating/Exceptions/NoStringFunctionException.cs create mode 100644 src/NoStringEvaluating/Exceptions/VariableNotFoundException.cs rename {NoStringEvaluating => src/NoStringEvaluating}/Extensions/InternalExtensions.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Extensions/NoStringEvaluatorExtensions.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Extensions/NumberExtensions.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Factories/BooleanFactory.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Factories/DateTimeFactory.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Factories/NumberListFactory.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Factories/ObjectFactory.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Factories/ValueFactory.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Factories/WordFactory.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Factories/WordListFactory.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Base/IFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/CountFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/AddHoursFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/AddMinutesFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/AddSecondsFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/DateDifFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/DateFormatFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/DayFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/MonthFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/NowFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/TimeDifFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/ToDateTimeFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/TodayFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/WeekDayFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Date/YearFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/IsErrorFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/IsMemberFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/IsNumberFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/LenFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/SortFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/ToNumberFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/ConcatFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/ExplodeFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/ImplodeFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/IsTextFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/LeftFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/LowerFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/MiddleFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/ProperFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/ReplaceFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/RightFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/TextFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/UniqueFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Excel/Word/UpperFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Logic/AndFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Logic/IfFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Logic/IffFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Logic/IsnanFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Logic/NotAliasFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Logic/NotFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Logic/OrFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/AbsFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/AddFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/CeilFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/FactFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/FibFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/FloorFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/GcdFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/LcmFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/LnFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Log10Function.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Log2Function.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/LogFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/MaxFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/MeanFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/MinFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/ModFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/MultiFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/RoundFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/SgnFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/SignFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/SqrtFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cos/AcosFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cos/AcoshFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cos/ArccosFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cos/ArccoshFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cos/ArcosFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cos/ArcoshFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cos/CosFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cos/CoshFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/AcosechFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/AcschFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/ArccschFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/ArcosechFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/ArcschFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/CosecFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/CosechFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/CscFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cosec/CschFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/AcotFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/AcothFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ActanFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ActanhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ActgFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ActghFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ArccotFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ArccothFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ArcctanFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ArcctanhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ArcctgFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/ArcctghFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/CotFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/CothFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/CtanFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/CtanhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/CtgFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Cotan/CtghFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/DegFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/ExpFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/RadFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sec/ArcsecFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sec/ArcsechFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sec/ArsechFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sec/AsechFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sec/SecFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sec/SechFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sin/ArcsinFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sin/ArcsinhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sin/ArsinFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sin/ArsinhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sin/AsinFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sin/AsinhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sin/SinFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Sin/SinhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/ArctanFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/ArctanhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/ArctgFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/ArctghFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/AtanFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/AtanhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/AtgFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/AtghFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/TanFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/TanhFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/TgFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Math/Trigonometry/Tan/TghFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Null/IfNullFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Null/IsNullFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Functions/Null/NullIfFunction.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/GlobalOptions.cs (96%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/Bracket.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/FloatingPointSymbol.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/FormulaChecker/CheckFormulaResult.cs (61%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/FormulaChecker/FormulaCheckerMistakeType.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/FormulaChecker/FormulaCheckerModel.cs (61%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/FunctionChar.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/Operator.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/Values/EvaluatorValue.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/Values/InternalEvaluatorValue.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/Values/ValueKeeper.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/Values/ValueKeeperContainer.cs (95%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/Values/ValueKeeperContainerReleaser.cs (64%) rename {NoStringEvaluating => src/NoStringEvaluating}/Models/Values/ValueTypeKey.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/NoStringEvaluating.csproj (92%) rename {NoStringEvaluating => src/NoStringEvaluating}/NoStringEvaluating.xml (99%) rename {NoStringEvaluating => src/NoStringEvaluating}/NoStringEvaluator.cs (97%) rename {NoStringEvaluating => src/NoStringEvaluating}/NoStringEvaluatorNullable.cs (94%) rename {NoStringEvaluating => src/NoStringEvaluating}/NoStringEvaluatorOptions.cs (96%) create mode 100644 src/NoStringEvaluating/Nodes/Base/BaseFormulaNode.cs rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/Base/NodeTypeEnum.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/BooleanNode.cs (60%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/BracketNode.cs (70%) create mode 100644 src/NoStringEvaluating/Nodes/Common/FormulaNodes.cs rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/FunctionCharNode.cs (68%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/FunctionNode.cs (52%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/FunctionWrapperNode.cs (60%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/NullNode.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/NumberListNode.cs (53%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/NumberNode.cs (60%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/OperatorNode.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/VariableNode.cs (51%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/WordListNode.cs (54%) rename {NoStringEvaluating => src/NoStringEvaluating}/Nodes/WordNode.cs (56%) rename {NoStringEvaluating => src/NoStringEvaluating}/Properties/AssemblyInfo.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/BorderCounter.cs (61%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/BracketCounters.cs (93%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Cache/FormulaCache.cs (65%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Checking/FormulaChecker.cs (97%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/IndexWatcher.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/NameBuilder.cs (69%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/OperationProcessor.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/FormulaParser.cs (90%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/BracketReader.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/FunctionCharReader.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/FunctionReader.cs (97%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/ListReader.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/NegationReader.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/NumberReader.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/OperatorReader.cs (95%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/UnaryMinusReader.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/VariableReader.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/NodeReaders/WordReader.cs (96%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Parsing/PolishNotationService.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Value/WordFormatter.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Variables/KnownVariables.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/Services/Variables/VariablesSource.cs (100%) rename {NoStringEvaluating => src/NoStringEvaluating}/logo.png (100%) diff --git a/.github/workflows/project-build.yml b/.github/workflows/project-build.yml index a70d8cb..959aa4c 100644 --- a/.github/workflows/project-build.yml +++ b/.github/workflows/project-build.yml @@ -17,9 +17,12 @@ jobs: - name: Build run: dotnet build -c Release --no-restore - - name: Test + - name: Unit tests run: dotnet test -c Release --no-restore --no-build -v=normal --collect:"XPlat Code Coverage" + - name: Performance tests + run: dotnet test -c Release --no-restore --no-build -v=normal --filter TestCategory="PerfTests" + - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4.0.1 with: @@ -39,3 +42,10 @@ jobs: path: bin/NoStringEvaluating.Extensions.Microsoft.DependencyInjection/Release/*.nupkg retention-days: 1 + - name: Upload performance tests artifacts + uses: actions/upload-artifact@v4 + with: + name: performance-tests + path: bin/NoStringEvaluating.Tests/Release/PerformanceTestsResults/PerformanceTests.txt + retention-days: 90 + diff --git a/BenchResults/Benchmark.xlsx b/BenchResults/Benchmark.xlsx deleted file mode 100644 index 7d3eadadb86c1cd5d080a91940fd39c910d10cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18209 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 K@GS7h+5Z8C4Imo; diff --git a/BenchResults/both.html b/BenchResults/both.html deleted file mode 100644 index 4855b89..0000000 --- a/BenchResults/both.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - -ConsoleApp.Benchmark.BenchNumbers-20230209-135445 - - - - -

-BenchmarkDotNet=v0.13.4, OS=Windows 10 (10.0.19044.2486/21H2/November2021Update)
-11th Gen Intel Core i7-1185G7 3.00GHz, 1 CPU, 8 logical and 4 physical cores
-.NET SDK=7.0.101
-  [Host]     : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
-  Job-MQTNJN : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
-
-
InvocationCount=3  IterationCount=10  RunStrategy=Monitoring  
-UnrollFactor=1  WarmupCount=2  
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method MeanErrorStdDev Gen0 Gen1Gen2Allocated
Empty_NoString24.74 ms0.829 ms0.548 ms---3.22 KB
NumberOnly_NoString38.10 ms1.113 ms0.736 ms---3.61 KB
Formula1_NoString45.39 ms2.245 ms1.485 ms---3.74 KB
Formula2_NoString88.92 ms4.535 ms2.999 ms---4.6 KB
Formula3_NoString85.46 ms1.402 ms0.927 ms---5.08 KB
Formula4_NoString286.13 ms14.831 ms9.810 ms---9.84 KB
Formula5_NoString135.77 ms2.910 ms1.925 ms---4.98 KB
Formula6_NoString322.18 ms1.654 ms1.094 ms---8.26 KB
Formula7_NoString128.52 ms1.588 ms1.050 ms---4.8 KB
Formula8_NoString258.23 ms5.151 ms3.407 ms---6.59 KB
Formula9_NoString553.44 ms9.307 ms6.156 ms---10.96 KB
Formula10_NoString226.04 ms4.389 ms2.903 ms---5.65 KB
Empty_MxParser97.18 ms1.172 ms0.775 ms66000.0000--406250.95 KB
NumberOnly_MxParser88.39 ms2.043 ms1.351 ms24000.0000--148515.88 KB
Formula1_MxParser134.85 ms1.794 ms1.186 ms44333.3333--273523.88 KB
Formula2_MxParser455.16 ms4.682 ms3.097 ms184666.6667333.3333-1133048.41 KB
Formula3_MxParser580.63 ms7.148 ms4.728 ms270333.33331000.0000-1656536.5 KB
Formula4_MxParser2,519.84 ms55.817 ms36.920 ms1135000.000022666.6667-6954199.7 KB
Formula5_MxParser350.81 ms11.546 ms7.637 ms99333.3333--609594.48 KB
Formula6_MxParser1,331.11 ms22.133 ms14.640 ms539333.33334000.0000-3305395.58 KB
Formula7_MxParser321.38 ms9.344 ms6.180 ms131333.3333--804816.88 KB
Formula8_MxParser694.13 ms20.828 ms13.777 ms341666.66671333.3333-2094014.2 KB
Formula9_MxParser8,540.56 ms67.741 ms44.807 ms1447666.6667366000.00005666.66679360871.28 KB
Formula10_MxParser684.27 ms22.928 ms15.165 ms247333.3333666.6667-1515846.02 KB
- - diff --git a/CodeAnalysis.ruleset b/CodeAnalysis.ruleset index ced4c68..8f8d4e3 100644 --- a/CodeAnalysis.ruleset +++ b/CodeAnalysis.ruleset @@ -1,5 +1,11 @@  + + + + + + diff --git a/Directory.Build.props b/Directory.Build.props index 29919a8..267fdbd 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - net7.0 + net8 enable $(MSBuildThisFileDirectory) diff --git a/Directory.Packages.props b/Directory.Packages.props index aff5818..5cae333 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,19 +1,18 @@ - - + + + - - - - + + + - - - - - + + + + \ No newline at end of file diff --git a/Images/Both.png b/Images/Both.png deleted file mode 100644 index 608322b9acf2d4080a167e72b438aeaa871f58cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90830 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 O$Tqr8N8drw~w5FZ8!H8K&@t*BcvgoCvvlV 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 diff --git a/Images/Table.png b/Images/Table.png deleted file mode 100644 index 9f488640d3770e3339491891dcdeb28810767a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19810 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 B+&2IK diff --git a/NoStringEvaluating.Tests/Helpers/FormulaModelFactory.cs b/NoStringEvaluating.Tests/Helpers/FormulaModelFactory.cs deleted file mode 100644 index dcd5d0e..0000000 --- a/NoStringEvaluating.Tests/Helpers/FormulaModelFactory.cs +++ /dev/null @@ -1,29 +0,0 @@ -using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Models; - -namespace NoStringEvaluating.Tests.Helpers; - -internal static class FormulaModelFactory -{ - public static FormulaModel CreateTestModelToCheck(string formula, bool expectedOkresult) - { - var model = new FormulaModel(formula, "NULL", double.NaN, expectedOkresult); - return model; - } - - public static FormulaModel CreateTestModel(string formula, EvaluatorValue result, params (string, EvaluatorValue)[] arguments) - { - return CreateTestModel(formula, "NULL", result, arguments); - } - - public static FormulaModel CreateTestModel(string formula, string parsedFormula, EvaluatorValue result, params (string, EvaluatorValue)[] arguments) - { - var model = new FormulaModel(formula, parsedFormula, result); - foreach (var argument in arguments) - { - model.Arguments[argument.Item1] = argument.Item2; - } - - return model; - } -} diff --git a/NoStringEvaluating.Tests/Models/FormulaModel.cs b/NoStringEvaluating.Tests/Models/FormulaModel.cs deleted file mode 100644 index 2ee3425..0000000 --- a/NoStringEvaluating.Tests/Models/FormulaModel.cs +++ /dev/null @@ -1,30 +0,0 @@ -using NoStringEvaluating.Models.Values; - -namespace NoStringEvaluating.Tests.Models; - -public class FormulaModel -{ - public string Formula { get; } - - public string ParsedFormula { get; } - - public EvaluatorValue Result { get; } - - public bool ExpectedOkResult { get; } - - public Dictionary Arguments { get; } - - public FormulaModel(string formula, string parsedFormula, EvaluatorValue result, bool expectedOkResult = true) - { - Formula = formula; - ParsedFormula = parsedFormula; - Result = result; - ExpectedOkResult = expectedOkResult; - Arguments = new Dictionary(); - } - - public override string ToString() - { - return Formula; - } -} diff --git a/NoStringEvaluating.sln b/NoStringEvaluating.sln index a043bd3..43235c9 100644 --- a/NoStringEvaluating.sln +++ b/NoStringEvaluating.sln @@ -3,13 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.3.32611.2 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoStringEvaluating", "NoStringEvaluating\NoStringEvaluating.csproj", "{40AB411F-6002-4A69-A73F-17C5B7FC1508}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoStringEvaluating", "src\NoStringEvaluating\NoStringEvaluating.csproj", "{40AB411F-6002-4A69-A73F-17C5B7FC1508}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoStringEvaluating.Tests", "NoStringEvaluating.Tests\NoStringEvaluating.Tests.csproj", "{48E04BE8-5BA6-409A-964E-13206F95BC8D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoStringEvaluating.Tests", "src\NoStringEvaluating.Tests\NoStringEvaluating.Tests.csproj", "{48E04BE8-5BA6-409A-964E-13206F95BC8D}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{EA941063-94B8-4F97-A507-B5A7FD6A0B79}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{6A870F87-7BD9-4DB3-ACA2-0F2EFF9FB1D3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "src\ConsoleApp\ConsoleApp.csproj", "{6A870F87-7BD9-4DB3-ACA2-0F2EFF9FB1D3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{88F0773E-1AA1-4C00-A8D8-F09B76A70BE9}" ProjectSection(SolutionItems) = preProject @@ -17,9 +17,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution README.md = README.md EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoStringEvaluating.Extensions.Microsoft.DependencyInjection", "NoStringEvaluating.Extensions.Microsoft.DependencyInjection\NoStringEvaluating.Extensions.Microsoft.DependencyInjection.csproj", "{03E4E4C4-C186-4865-AC39-8E5E192D7F14}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoStringEvaluating.Extensions.Microsoft.DependencyInjection", "src\NoStringEvaluating.Extensions.Microsoft.DependencyInjection\NoStringEvaluating.Extensions.Microsoft.DependencyInjection.csproj", "{03E4E4C4-C186-4865-AC39-8E5E192D7F14}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests", "NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests\NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests.csproj", "{95AC9D45-49F2-41A2-88BC-E800F932C356}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests", "src\NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests\NoStringEvaluating.Extensions.Microsoft.DependencyInjection.Tests.csproj", "{95AC9D45-49F2-41A2-88BC-E800F932C356}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Ci", "Ci", "{F2A9F436-5A49-486D-B4E1-B1B38924F61B}" ProjectSection(SolutionItems) = preProject diff --git a/NoStringEvaluating/Exceptions/NoStringFunctionException.cs b/NoStringEvaluating/Exceptions/NoStringFunctionException.cs deleted file mode 100644 index 53afe07..0000000 --- a/NoStringEvaluating/Exceptions/NoStringFunctionException.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace NoStringEvaluating.Exceptions; - -/// -/// Raises when function exception -/// -public class NoStringFunctionException : Exception -{ - /// - /// Raises when function exception - /// - public NoStringFunctionException(string funcName) - : base($"Function \"{funcName}\" has already added") - { - } -} diff --git a/NoStringEvaluating/Exceptions/VariableNotFoundException.cs b/NoStringEvaluating/Exceptions/VariableNotFoundException.cs deleted file mode 100644 index e3cbcd6..0000000 --- a/NoStringEvaluating/Exceptions/VariableNotFoundException.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace NoStringEvaluating.Exceptions; - -/// -/// Raises when can't find a variable -/// -public class VariableNotFoundException : Exception -{ - /// - /// VariableName - /// - public string VariableName { get; set; } - - /// - /// Raises when can't find a variable - /// - public VariableNotFoundException(string variableName, string message) - : base(message) - { - VariableName = variableName; - } -} diff --git a/NoStringEvaluating/Nodes/Base/BaseFormulaNode.cs b/NoStringEvaluating/Nodes/Base/BaseFormulaNode.cs deleted file mode 100644 index 3d3597a..0000000 --- a/NoStringEvaluating/Nodes/Base/BaseFormulaNode.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace NoStringEvaluating.Nodes.Base; - -/// -/// Formula node -/// -public abstract class BaseFormulaNode -{ - /// - /// Type key - /// - public NodeTypeEnum TypeKey { get; } - - /// - /// Formula node - /// - protected BaseFormulaNode(NodeTypeEnum typeKey) - { - TypeKey = typeKey; - } -} diff --git a/NoStringEvaluating/Nodes/Common/FormulaNodes.cs b/NoStringEvaluating/Nodes/Common/FormulaNodes.cs deleted file mode 100644 index da71839..0000000 --- a/NoStringEvaluating/Nodes/Common/FormulaNodes.cs +++ /dev/null @@ -1,33 +0,0 @@ -using NoStringEvaluating.Nodes.Base; - -namespace NoStringEvaluating.Nodes.Common; - -/// -/// Formula nodes -/// -public class FormulaNodes -{ - /// - /// Nodes - /// - public List Nodes { get; } - - /// - /// Formula nodes - /// - public FormulaNodes(List nodes) - { - // I've removed ".AsReadOnly()" owing to the fact that it turned out to be slower then List ¯\_(ツ)_/¯ - // It was tested with Benchmark.One and Benchmark.Formula4. With AsReadOnly I got 300ms where as with List I got 200ms - // Okay, if someone change collection it will be his mistake, let it be! - Nodes = nodes; - } - - /// - /// ToString - /// - public override string ToString() - { - return string.Join(" ", Nodes); - } -} diff --git a/README.md b/README.md index 05ccfc8..42215ce 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ Compared with a good solution [mXparser](https://github.com/mariuszgromada/MathP | 3 | 3 \* (9 / 456 \* (32 + 12)) / 17 - 3 | | 4 | (2 + 6 - (13 \* 24 + 5 / (123 - 364 + 23))) - (2 + 6 - (13 \* 24 + 5 / (123 - 364 + 23))) + (2 + 6 - (13 \* 24 + 5 / (123 - 364 + 23))) \* 345 \* ((897 - 323)/ 23) | | 5 | Arg1 \* Arg2 + Arg3 - Arg4 | -| 6 | Arg1 \* (Arg2 + Arg3) - Arg4 / (Arg5 - Arg6) + 45 \* Arg7 + ((Arg8 \* 56 + (12 + Arg9))) - Arg10 | +| 6 | Arg1 \* (Arg2 + Arg3) - Arg4 / (Arg5 - Arg6 + 1) + 45 \* Arg7 + ((Arg8 \* 56 + (12 + Arg9))) - Arg10 | | 7 | add(1; 2; 3) | | 8 | add(add(5; 1) - add(5; 2; 3)) | | 9 | if(Arg1 > 0; add(56 + 9 / 12 \* 123.596; or(78; 9; 5; 2; 4; 5; 8; 7); 45;5); 9) \* 24 + 52 -33 | @@ -84,18 +84,18 @@ Compared with a good solution [mXparser](https://github.com/mariuszgromada/MathP ### 1 000 000 calculations Less is better -![image graph](Images/Graph.png) -![image table](Images/Table.png) +![image graph](images/Graph.png) +![image table](images/Table.png) ### Benchmark results -![Both](Images/Both.png) +![Both](images/Both.png) ### Conclusion As you can see this solution is faster in all cases, furthermore there isn't any garbage collection. -Benchmark code - [ConsoleApp/Benchmark/BenchmarkNumberService.cs](ConsoleApp/Benchmark/BenchmarkNumberService.cs "ConsoleApp/Benchmark/BenchmarkNumberService.cs") +Benchmark code - [src/ConsoleApp/Benchmark/BenchNumbers.cs](src/ConsoleApp/Benchmark/BenchNumbers.cs "src/ConsoleApp/Benchmark/BenchNumbers.cs") -Benchmark excel - [BenchResults/Benchmark.xlsx](BenchResults/Benchmark.xlsx "BenchResults/Benchmark.xlsx") +Benchmark excel - [benchResults/Benchmark.xlsx](benchResults/Benchmark.xlsx "benchResults/Benchmark.xlsx") ## Quick start ### Initialization diff --git a/benchResults/Benchmark.xlsx b/benchResults/Benchmark.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9187ce0be66a728871dd4973807e37dd395a3700 GIT binary patch literal 18261 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 + + + +ConsoleApp.Benchmark.BenchNumbers-20240817-115246 + + + + +

+BenchmarkDotNet v0.14.0, Windows 10 (10.0.19045.4780/22H2/2022Update)
+11th Gen Intel Core i7-1185G7 3.00GHz, 1 CPU, 8 logical and 4 physical cores
+.NET SDK 8.0.200
+  [Host]     : .NET 8.0.2 (8.0.224.6711), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+  Job-JNKMUS : .NET 8.0.2 (8.0.224.6711), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
InvocationCount=3  IterationCount=10  RunStrategy=Monitoring  
+UnrollFactor=1  WarmupCount=2  
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Mean ErrorStdDevGen0 Gen1 Gen2Allocated
Empty_NoString34.55 ms1.465 ms0.969 ms---5.51 KB
NumberOnly_NoString47.08 ms1.901 ms1.257 ms---5.9 KB
Formula1_NoString51.46 ms2.871 ms1.899 ms---6.03 KB
Formula2_NoString98.33 ms9.107 ms6.024 ms---6.89 KB
Formula3_NoString76.44 ms1.671 ms1.105 ms---7.38 KB
Formula4_NoString263.56 ms2.482 ms1.642 ms---12.13 KB
Formula5_NoString145.10 ms12.141 ms8.031 ms---7.27 KB
Formula6_NoString302.92 ms30.212 ms19.983 ms---10.55 KB
Formula7_NoString145.03 ms6.809 ms4.504 ms---7.1 KB
Formula8_NoString291.57 ms12.880 ms8.519 ms---8.89 KB
Formula9_NoString551.50 ms10.342 ms6.841 ms---13.25 KB
Formula10_NoString216.98 ms16.591 ms10.974 ms---7.94 KB
Empty_MxParser93.31 ms9.150 ms6.052 ms66000.0000--406250.92 KB
NumberOnly_MxParser90.66 ms3.553 ms2.350 ms24000.0000--148515.66 KB
Formula1_MxParser137.42 ms2.914 ms1.928 ms44333.3333--273522.6 KB
Formula2_MxParser433.20 ms42.304 ms27.982 ms184666.6667333.3333-1133044.61 KB
Formula3_MxParser588.55 ms34.226 ms22.639 ms270333.33331000.0000-1656532.77 KB
Formula4_MxParser2,367.88 ms155.146 ms102.619 ms1135000.000022333.3333-6954188.17 KB
Formula5_MxParser276.39 ms6.087 ms4.026 ms99333.3333--609582.25 KB
Formula6_MxParser1,104.95 ms68.355 ms45.213 ms539333.33334333.3333-3305396.21 KB
Formula7_MxParser279.89 ms3.204 ms2.119 ms131333.3333--804815.08 KB
Formula8_MxParser617.36 ms12.880 ms8.519 ms341666.66671666.6667-2094008.94 KB
Formula9_MxParser7,669.47 ms98.175 ms64.937 ms1447666.6667366000.00005666.66679360854.98 KB
Formula10_MxParser626.87 ms7.463 ms4.937 ms247333.3333666.6667-1515840.71 KB
+ + diff --git a/images/Both.png b/images/Both.png new file mode 100644 index 0000000000000000000000000000000000000000..1c19e635f3e349db653a55305b0c7eeb5cb5f0a9 GIT binary patch literal 97614 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%0DHwG!2 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 z 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 + + + +
diff --git a/src/NoStringEvaluating.Tests/PerfTests/PerformanceTests.cs b/src/NoStringEvaluating.Tests/PerfTests/PerformanceTests.cs new file mode 100644 index 0000000..486fcc2 --- /dev/null +++ b/src/NoStringEvaluating.Tests/PerfTests/PerformanceTests.cs @@ -0,0 +1,115 @@ +using System.Diagnostics; +using NoStringEvaluating.Factories; +using NoStringEvaluating.Functions.Base; +using NoStringEvaluating.Functions.Logic; +using NoStringEvaluating.Functions.Math; +using NoStringEvaluating.Models.Values; +using NoStringEvaluating.Tests.PerfTests.Report; +using NUnit.Framework; + +namespace NoStringEvaluating.Tests.PerfTests; + +[NonParallelizable] +[Category("PerfTests")] +[Explicit("These tests are only run when explicitly specified")] +internal class PerformanceTests +{ + private NoStringEvaluator.Facade _serviceFacade; + private ReportContainer _report; + + [OneTimeSetUp] + public void GlobalSetup() + { + _report = new(); + } + + [OneTimeTearDown] + public void GlobalTeardown() + { + ReportWriter.Write(_report); + } + + [SetUp] + public void Setup() + { + var functions = new IFunction[] + { + new AddFunction(), + new IfFunction(), + new OrFunction(), + new Func_kov(), + new Func_kovt(), + }; + + _serviceFacade = NoStringEvaluator.CreateFacade(cfg => cfg.WithoutDefaultFunctions().WithFunctions(functions)); + } + + [TestCaseSource(nameof(RunSource))] + public void RunFormula(string formulaName, string formula, IDictionary args, long targetElapsedMilliseconds) + { + // arrange + var n = 1_000_000; + + var nodes = _serviceFacade.FormulaCache.GetFormulaNodes(formula); + + // act, assert + var res = _serviceFacade.Evaluator.CalcNumber(nodes, args); + + var ela = Stopwatch.StartNew(); + for (var i = 0; i < n; i++) + { + _ = _serviceFacade.Evaluator.Calc(nodes, args); + } + + ela.Stop(); + + _report.Append(formulaName, res, ela.ElapsedMilliseconds, targetElapsedMilliseconds); + } + + private static IEnumerable RunSource() + { + var args = Enumerable.Range(1, 10).ToDictionary(i => $"Arg{i}", _ => (EvaluatorValue)1.7); + + yield return new object[] { "Formula 1", "3 * 9", args, 300 }; + yield return new object[] { "Formula 2", "3 * 9 / 456 * 32 + 12 / 17 - 3", args, 250 }; + yield return new object[] { "Formula 3", "3 * (9 / 456 * (32 + 12)) / 17 - 3", args, 250 }; + yield return new object[] { "Formula 4", "(2 + 6 - (13 * 24 + 5 / (123 - 364 + 23))) - (2 + 6 - (13 * 24 + 5 / (123 - 364 + 23))) + (2 + 6 - (13 * 24 + 5 / (123 - 364 + 23))) * 345 * ((897 - 323)/ 23)", args, 500 }; + yield return new object[] { "Formula 5", "Arg1 * Arg2 + Arg3 - Arg4", args, 400 }; + yield return new object[] { "Formula 6", "Arg1 * (Arg2 + Arg3) - Arg4 / (Arg5 - Arg6 + 1) + 45 * Arg7 + ((Arg8 * 56 + (12 + Arg9))) - Arg10", args, 600 }; + yield return new object[] { "Formula 7", "add(1; 2; 3)", args, 400 }; + yield return new object[] { "Formula 8", "add(add(5; 1) - add(5; 2; 3))", args, 400 }; + yield return new object[] { "Formula 9", "if(Arg1 > 0; add(56 + 9 / 12 * 123.596; or(78; 9; 5; 2; 4; 5; 8; 7); 45;5); 9) * 24 + 52 -33", args, 900 }; + yield return new object[] { "Formula 10", "kov(1; 2; 3) - kovt(8; 9)", args, 400 }; + } + + public class Func_kov : IFunction + { + public string Name { get; } = "kov"; + + public bool CanHandleNullArguments { get; } + + public InternalEvaluatorValue Execute(List args, ValueFactory factory) + { + var res = 1d; + + for (int i = 0; i < args.Count; i++) + { + res *= args[i]; + } + + return res; + } + } + + public class Func_kovt : IFunction + { + public string Name { get; } = "kovt"; + + public bool CanHandleNullArguments { get; } + + public InternalEvaluatorValue Execute(List args, ValueFactory factory) + { + return args[0] - args[1]; + } + } +} diff --git a/src/NoStringEvaluating.Tests/PerfTests/Report/ReportContainer.cs b/src/NoStringEvaluating.Tests/PerfTests/Report/ReportContainer.cs new file mode 100644 index 0000000..cc87531 --- /dev/null +++ b/src/NoStringEvaluating.Tests/PerfTests/Report/ReportContainer.cs @@ -0,0 +1,11 @@ +namespace NoStringEvaluating.Tests.PerfTests.Report; + +internal class ReportContainer +{ + public List Items = []; + + public void Append(string formula, double result, long elapsedMilliseconds, long targetElapsedMilliseconds) + { + Items.Add(new ReportItem(formula, result, elapsedMilliseconds, targetElapsedMilliseconds)); + } +} diff --git a/src/NoStringEvaluating.Tests/PerfTests/Report/ReportExtensions.cs b/src/NoStringEvaluating.Tests/PerfTests/Report/ReportExtensions.cs new file mode 100644 index 0000000..8398912 --- /dev/null +++ b/src/NoStringEvaluating.Tests/PerfTests/Report/ReportExtensions.cs @@ -0,0 +1,37 @@ +using System.Globalization; +using Spectre.Console; + +namespace NoStringEvaluating.Tests.PerfTests.Report; + +internal static class ReportExtensions +{ + public static Table AddRows(this Table table, IEnumerable items) + { + foreach (var item in items) + { + table.AddRow(item); + } + + return table; + } + + public static void AddRow(this Table table, ReportItem value) + { + table.AddRow( + value.Formula.ToText(), + value.Result.ToText(), + value.ElapsedMilliseconds.ToString().ToText(), + value.TargetElapsedMilliseconds.ToString().ToText(), + value.Attention ? "!".ToText() : string.Empty.ToText()); + } + + public static Text ToText(this double value) + { + return value.ToString("0.00", CultureInfo.InvariantCulture).ToText(); + } + + public static Text ToText(this string value) + { + return new Text(value); + } +} diff --git a/src/NoStringEvaluating.Tests/PerfTests/Report/ReportItem.cs b/src/NoStringEvaluating.Tests/PerfTests/Report/ReportItem.cs new file mode 100644 index 0000000..0d9c7cd --- /dev/null +++ b/src/NoStringEvaluating.Tests/PerfTests/Report/ReportItem.cs @@ -0,0 +1,6 @@ +namespace NoStringEvaluating.Tests.PerfTests.Report; + +internal record ReportItem(string Formula, double Result, long ElapsedMilliseconds, long TargetElapsedMilliseconds) +{ + public bool Attention => ElapsedMilliseconds > TargetElapsedMilliseconds; +} diff --git a/src/NoStringEvaluating.Tests/PerfTests/Report/ReportWriter.cs b/src/NoStringEvaluating.Tests/PerfTests/Report/ReportWriter.cs new file mode 100644 index 0000000..5195f6b --- /dev/null +++ b/src/NoStringEvaluating.Tests/PerfTests/Report/ReportWriter.cs @@ -0,0 +1,36 @@ +using NUnit.Framework; +using Spectre.Console; + +namespace NoStringEvaluating.Tests.PerfTests.Report; + +internal class ReportWriter +{ + private const string DIRECTORY = "PerformanceTestsResults"; + private const string FILE_PATH = $"{DIRECTORY}/PerformanceTests.txt"; + + public static void Write(ReportContainer resultsContainer) + { + if (!Directory.Exists(DIRECTORY)) + { + Directory.CreateDirectory(DIRECTORY); + } + + using var streamWriter = new StreamWriter(FILE_PATH); + + var table = new Table() + .SquareBorder() + .AddColumns("Formula", "Result", "Elapsed time, ms", "Threshold, ms") + .AddColumn(new TableColumn($"Attention").Centered()) + .AddRows(resultsContainer.Items); + + AnsiConsole.Console.Profile.Width = 100; + + AnsiConsole.Record(); + AnsiConsole.Write(table); + + var text = AnsiConsole.ExportText(); + + TestContext.Progress.WriteLine(text); + streamWriter.WriteLine(text); + } +} diff --git a/NoStringEvaluating.Tests/Properties/AssemblyInfo.cs b/src/NoStringEvaluating.Tests/Properties/AssemblyInfo.cs similarity index 100% rename from NoStringEvaluating.Tests/Properties/AssemblyInfo.cs rename to src/NoStringEvaluating.Tests/Properties/AssemblyInfo.cs diff --git a/NoStringEvaluating.Tests/Suite.cs b/src/NoStringEvaluating.Tests/Suite.cs similarity index 100% rename from NoStringEvaluating.Tests/Suite.cs rename to src/NoStringEvaluating.Tests/Suite.cs diff --git a/NoStringEvaluating.Tests/Data/CheckFormula.cs b/src/NoStringEvaluating.Tests/UnitTests/Data/CheckFormula.cs similarity index 93% rename from NoStringEvaluating.Tests/Data/CheckFormula.cs rename to src/NoStringEvaluating.Tests/UnitTests/Data/CheckFormula.cs index 4845998..6baad5c 100644 --- a/NoStringEvaluating.Tests/Data/CheckFormula.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Data/CheckFormula.cs @@ -1,7 +1,7 @@ -using NoStringEvaluating.Tests.Models; -using static NoStringEvaluating.Tests.Helpers.FormulaModelFactory; +using NoStringEvaluating.Tests.UnitTests.Models; +using static NoStringEvaluating.Tests.UnitTests.Helpers.FormulaModelFactory; -namespace NoStringEvaluating.Tests.Data; +namespace NoStringEvaluating.Tests.UnitTests.Data; internal static class CheckFormula { diff --git a/NoStringEvaluating.Tests/Data/EvaluateBoolean.cs b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateBoolean.cs similarity index 96% rename from NoStringEvaluating.Tests/Data/EvaluateBoolean.cs rename to src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateBoolean.cs index 2faa373..ee67a0c 100644 --- a/NoStringEvaluating.Tests/Data/EvaluateBoolean.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateBoolean.cs @@ -1,7 +1,7 @@ -using NoStringEvaluating.Tests.Models; -using static NoStringEvaluating.Tests.Helpers.FormulaModelFactory; +using NoStringEvaluating.Tests.UnitTests.Models; +using static NoStringEvaluating.Tests.UnitTests.Helpers.FormulaModelFactory; -namespace NoStringEvaluating.Tests.Data; +namespace NoStringEvaluating.Tests.UnitTests.Data; internal static class EvaluateBoolean { diff --git a/NoStringEvaluating.Tests/Data/EvaluateDateTime.cs b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateDateTime.cs similarity index 82% rename from NoStringEvaluating.Tests/Data/EvaluateDateTime.cs rename to src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateDateTime.cs index 4c681f3..f5ae94f 100644 --- a/NoStringEvaluating.Tests/Data/EvaluateDateTime.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateDateTime.cs @@ -1,8 +1,8 @@ using System.Globalization; -using NoStringEvaluating.Tests.Models; -using static NoStringEvaluating.Tests.Helpers.FormulaModelFactory; +using NoStringEvaluating.Tests.UnitTests.Models; +using static NoStringEvaluating.Tests.UnitTests.Helpers.FormulaModelFactory; -namespace NoStringEvaluating.Tests.Data; +namespace NoStringEvaluating.Tests.UnitTests.Data; internal static class EvaluateDateTime { diff --git a/NoStringEvaluating.Tests/Data/EvaluateNumber.cs b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateNumber.cs similarity index 98% rename from NoStringEvaluating.Tests/Data/EvaluateNumber.cs rename to src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateNumber.cs index 5f392a7..36d57ed 100644 --- a/NoStringEvaluating.Tests/Data/EvaluateNumber.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateNumber.cs @@ -1,8 +1,8 @@ using System.Globalization; -using NoStringEvaluating.Tests.Models; -using static NoStringEvaluating.Tests.Helpers.FormulaModelFactory; +using NoStringEvaluating.Tests.UnitTests.Models; +using static NoStringEvaluating.Tests.UnitTests.Helpers.FormulaModelFactory; -namespace NoStringEvaluating.Tests.Data; +namespace NoStringEvaluating.Tests.UnitTests.Data; internal static class EvaluateNumber { diff --git a/NoStringEvaluating.Tests/Data/EvaluateNumberList.cs b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateNumberList.cs similarity index 72% rename from NoStringEvaluating.Tests/Data/EvaluateNumberList.cs rename to src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateNumberList.cs index 748aed0..ace9a6d 100644 --- a/NoStringEvaluating.Tests/Data/EvaluateNumberList.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateNumberList.cs @@ -1,7 +1,7 @@ -using NoStringEvaluating.Tests.Models; -using static NoStringEvaluating.Tests.Helpers.FormulaModelFactory; +using NoStringEvaluating.Tests.UnitTests.Models; +using static NoStringEvaluating.Tests.UnitTests.Helpers.FormulaModelFactory; -namespace NoStringEvaluating.Tests.Data; +namespace NoStringEvaluating.Tests.UnitTests.Data; internal static class EvaluateNumberList { diff --git a/NoStringEvaluating.Tests/Data/EvaluateWord.cs b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateWord.cs similarity index 96% rename from NoStringEvaluating.Tests/Data/EvaluateWord.cs rename to src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateWord.cs index a3b8c04..a94f9b3 100644 --- a/NoStringEvaluating.Tests/Data/EvaluateWord.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateWord.cs @@ -1,8 +1,8 @@ using System.Globalization; -using NoStringEvaluating.Tests.Models; -using static NoStringEvaluating.Tests.Helpers.FormulaModelFactory; +using NoStringEvaluating.Tests.UnitTests.Models; +using static NoStringEvaluating.Tests.UnitTests.Helpers.FormulaModelFactory; -namespace NoStringEvaluating.Tests.Data; +namespace NoStringEvaluating.Tests.UnitTests.Data; internal static class EvaluateWord { diff --git a/NoStringEvaluating.Tests/Data/EvaluateWordList.cs b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateWordList.cs similarity index 94% rename from NoStringEvaluating.Tests/Data/EvaluateWordList.cs rename to src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateWordList.cs index e14e787..ad142cb 100644 --- a/NoStringEvaluating.Tests/Data/EvaluateWordList.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Data/EvaluateWordList.cs @@ -1,7 +1,7 @@ -using NoStringEvaluating.Tests.Models; -using static NoStringEvaluating.Tests.Helpers.FormulaModelFactory; +using NoStringEvaluating.Tests.UnitTests.Models; +using static NoStringEvaluating.Tests.UnitTests.Helpers.FormulaModelFactory; -namespace NoStringEvaluating.Tests.Data; +namespace NoStringEvaluating.Tests.UnitTests.Data; internal static class EvaluateWordList { diff --git a/NoStringEvaluating.Tests/Data/ParseFormula.cs b/src/NoStringEvaluating.Tests/UnitTests/Data/ParseFormula.cs similarity index 91% rename from NoStringEvaluating.Tests/Data/ParseFormula.cs rename to src/NoStringEvaluating.Tests/UnitTests/Data/ParseFormula.cs index 73f39d3..4bd0020 100644 --- a/NoStringEvaluating.Tests/Data/ParseFormula.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Data/ParseFormula.cs @@ -1,7 +1,7 @@ -using NoStringEvaluating.Tests.Models; -using static NoStringEvaluating.Tests.Helpers.FormulaModelFactory; +using NoStringEvaluating.Tests.UnitTests.Models; +using static NoStringEvaluating.Tests.UnitTests.Helpers.FormulaModelFactory; -namespace NoStringEvaluating.Tests.Data; +namespace NoStringEvaluating.Tests.UnitTests.Data; internal static class ParseFormula { diff --git a/NoStringEvaluating.Tests/Functions/Excel/CountFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/CountFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/CountFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/CountFunctionTests.cs index 67e12bb..53b204e 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/CountFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/CountFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel; internal class CountFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/AddHoursFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddHoursFunctionTests.cs similarity index 87% rename from NoStringEvaluating.Tests/Functions/Excel/Date/AddHoursFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddHoursFunctionTests.cs index 2f28f91..ab9b33d 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/AddHoursFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddHoursFunctionTests.cs @@ -2,7 +2,7 @@ using NoStringEvaluating.Functions.Excel.Date; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class AddHoursFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/AddMinutesFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddMinutesFunctionTests.cs similarity index 88% rename from NoStringEvaluating.Tests/Functions/Excel/Date/AddMinutesFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddMinutesFunctionTests.cs index f96ef2c..937f609 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/AddMinutesFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddMinutesFunctionTests.cs @@ -2,7 +2,7 @@ using NoStringEvaluating.Functions.Excel.Date; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class AddMinutesFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/AddSecondsFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddSecondsFunctionTests.cs similarity index 88% rename from NoStringEvaluating.Tests/Functions/Excel/Date/AddSecondsFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddSecondsFunctionTests.cs index 535fc97..03091ef 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/AddSecondsFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/AddSecondsFunctionTests.cs @@ -2,7 +2,7 @@ using NoStringEvaluating.Functions.Excel.Date; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class AddSecondsFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/DateDifFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DateDifFunctionTests.cs similarity index 96% rename from NoStringEvaluating.Tests/Functions/Excel/Date/DateDifFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DateDifFunctionTests.cs index 48f9a01..924f5dd 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/DateDifFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DateDifFunctionTests.cs @@ -4,7 +4,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class DateDifFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/DateFormatFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DateFormatFunctionTests.cs similarity index 92% rename from NoStringEvaluating.Tests/Functions/Excel/Date/DateFormatFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DateFormatFunctionTests.cs index 48c462f..8a17864 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/DateFormatFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DateFormatFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class DateFormatFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/DayFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DayFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Date/DayFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DayFunctionTests.cs index 3896428..88d53f2 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/DayFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/DayFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class DayFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/MonthFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/MonthFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Date/MonthFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/MonthFunctionTests.cs index 3999760..05cf4b1 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/MonthFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/MonthFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class MonthFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/NowFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/NowFunctionTests.cs similarity index 89% rename from NoStringEvaluating.Tests/Functions/Excel/Date/NowFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/NowFunctionTests.cs index 9427dad..016183b 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/NowFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/NowFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class NowFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/TimeDifFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/TimeDifFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Date/TimeDifFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/TimeDifFunctionTests.cs index c73834a..57bc8e6 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/TimeDifFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/TimeDifFunctionTests.cs @@ -2,10 +2,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Excel.Date; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class TimeDifFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/ToDateTimeFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/ToDateTimeFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Date/ToDateTimeFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/ToDateTimeFunctionTests.cs index 84abd9d..dc870d3 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/ToDateTimeFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/ToDateTimeFunctionTests.cs @@ -5,7 +5,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class ToDateTimeFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/TodayFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/TodayFunctionTests.cs similarity index 88% rename from NoStringEvaluating.Tests/Functions/Excel/Date/TodayFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/TodayFunctionTests.cs index 3c7b1dd..07bf207 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/TodayFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/TodayFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class TodayFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/WeekDayFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/WeekDayFunctionTests.cs similarity index 92% rename from NoStringEvaluating.Tests/Functions/Excel/Date/WeekDayFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/WeekDayFunctionTests.cs index e0c56a5..e90e091 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/WeekDayFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/WeekDayFunctionTests.cs @@ -2,7 +2,7 @@ using NoStringEvaluating.Functions.Excel.Date; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class WeekDayFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Date/YearFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/YearFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Date/YearFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/YearFunctionTests.cs index 8ffb3e6..c05a0ed 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Date/YearFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Date/YearFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Date; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Date; internal class YearFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/IsErrorFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsErrorFunctionTests.cs similarity index 89% rename from NoStringEvaluating.Tests/Functions/Excel/IsErrorFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsErrorFunctionTests.cs index d620be3..fb4a460 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/IsErrorFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsErrorFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel; internal class IsErrorFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/IsMemberFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsMemberFunctionTests.cs similarity index 96% rename from NoStringEvaluating.Tests/Functions/Excel/IsMemberFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsMemberFunctionTests.cs index d479950..28d2f12 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/IsMemberFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsMemberFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel; internal class IsMemberFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/IsNumberFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsNumberFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/IsNumberFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsNumberFunctionTests.cs index 5468fbf..9d9affe 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/IsNumberFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/IsNumberFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel; internal class IsNumberFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/LenFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/LenFunctionTests.cs similarity index 89% rename from NoStringEvaluating.Tests/Functions/Excel/LenFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/LenFunctionTests.cs index 65af2a3..62c10f9 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/LenFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/LenFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel; internal class LenFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/SortFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/SortFunctionTests.cs similarity index 96% rename from NoStringEvaluating.Tests/Functions/Excel/SortFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/SortFunctionTests.cs index 621a430..a827bdf 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/SortFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/SortFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel; internal class SortFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/ToNumberFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/ToNumberFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/ToNumberFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/ToNumberFunctionTests.cs index feee167..9a3e505 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/ToNumberFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/ToNumberFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel; internal class ToNumberFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/ConcatFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ConcatFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Word/ConcatFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ConcatFunctionTests.cs index 8bd0f34..884ded1 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/ConcatFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ConcatFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class ConcatFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/ExplodeFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ExplodeFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Word/ExplodeFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ExplodeFunctionTests.cs index 51cfbb3..3ba0358 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/ExplodeFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ExplodeFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class ExplodeFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/ImplodeFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ImplodeFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Word/ImplodeFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ImplodeFunctionTests.cs index 94e41f0..2f765fc 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/ImplodeFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ImplodeFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class ImplodeFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/IsTextFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/IsTextFunctionTests.cs similarity index 93% rename from NoStringEvaluating.Tests/Functions/Excel/Word/IsTextFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/IsTextFunctionTests.cs index cfbe96a..69b2973 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/IsTextFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/IsTextFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class IsTextFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/LeftFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/LeftFunctionTests.cs similarity index 97% rename from NoStringEvaluating.Tests/Functions/Excel/Word/LeftFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/LeftFunctionTests.cs index 2e28c9c..3f4e454 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/LeftFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/LeftFunctionTests.cs @@ -4,7 +4,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class LeftFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/LowerFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/LowerFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Word/LowerFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/LowerFunctionTests.cs index 39fe6de..6d52159 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/LowerFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/LowerFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class LowerFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/MiddleFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/MiddleFunctionTests.cs similarity index 97% rename from NoStringEvaluating.Tests/Functions/Excel/Word/MiddleFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/MiddleFunctionTests.cs index 83dc824..dc14269 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/MiddleFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/MiddleFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class MiddleFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/ProperFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ProperFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Word/ProperFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ProperFunctionTests.cs index f11502b..edba742 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/ProperFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ProperFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class ProperFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/ReplaceFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ReplaceFunctionTests.cs similarity index 95% rename from NoStringEvaluating.Tests/Functions/Excel/Word/ReplaceFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ReplaceFunctionTests.cs index d8573e6..e311938 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/ReplaceFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/ReplaceFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class ReplaceFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/RightFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/RightFunctionTests.cs similarity index 97% rename from NoStringEvaluating.Tests/Functions/Excel/Word/RightFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/RightFunctionTests.cs index d389b1d..91cf2a0 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/RightFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/RightFunctionTests.cs @@ -4,7 +4,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class RightFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/TextFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/TextFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Word/TextFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/TextFunctionTests.cs index 8b63381..5248340 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/TextFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/TextFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class TextFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/UniqueFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/UniqueFunctionTests.cs similarity index 95% rename from NoStringEvaluating.Tests/Functions/Excel/Word/UniqueFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/UniqueFunctionTests.cs index 145e94e..32def88 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/UniqueFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/UniqueFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class UniqueFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Excel/Word/UpperFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/UpperFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Excel/Word/UpperFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/UpperFunctionTests.cs index 3189fd1..98bd519 100644 --- a/NoStringEvaluating.Tests/Functions/Excel/Word/UpperFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Excel/Word/UpperFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Excel.Word; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Excel.Word; internal class UpperFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/FunctionIntegrationTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/FunctionIntegrationTests.cs similarity index 88% rename from NoStringEvaluating.Tests/Functions/FunctionIntegrationTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/FunctionIntegrationTests.cs index 082cad3..4b66408 100644 --- a/NoStringEvaluating.Tests/Functions/FunctionIntegrationTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/FunctionIntegrationTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Functions.Base; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions; +namespace NoStringEvaluating.Tests.UnitTests.Functions; internal class FunctionIntegrationTests { diff --git a/NoStringEvaluating.Tests/Functions/FunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/FunctionTests.cs similarity index 88% rename from NoStringEvaluating.Tests/Functions/FunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/FunctionTests.cs index 6847c93..4515ddc 100644 --- a/NoStringEvaluating.Tests/Functions/FunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/FunctionTests.cs @@ -2,10 +2,10 @@ using AutoFixture; using NoStringEvaluating.Functions.Base; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions; +namespace NoStringEvaluating.Tests.UnitTests.Functions; internal abstract class FunctionTests where TFunction : IFunction, new() diff --git a/NoStringEvaluating.Tests/Functions/Logic/AndFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/AndFunctionTests.cs similarity index 90% rename from NoStringEvaluating.Tests/Functions/Logic/AndFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/AndFunctionTests.cs index 47df27a..f318d9e 100644 --- a/NoStringEvaluating.Tests/Functions/Logic/AndFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/AndFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Logic; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Logic; internal class AndFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Logic/IfFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IfFunctionTests.cs similarity index 90% rename from NoStringEvaluating.Tests/Functions/Logic/IfFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IfFunctionTests.cs index 46731e4..cf45b2d 100644 --- a/NoStringEvaluating.Tests/Functions/Logic/IfFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IfFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Logic; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Logic; internal class IfFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Logic/IffFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IffFunctionTests.cs similarity index 94% rename from NoStringEvaluating.Tests/Functions/Logic/IffFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IffFunctionTests.cs index 72e2814..cf7a51e 100644 --- a/NoStringEvaluating.Tests/Functions/Logic/IffFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IffFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Logic; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Logic; internal class IffFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Logic/IsNanFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IsNanFunctionTests.cs similarity index 89% rename from NoStringEvaluating.Tests/Functions/Logic/IsNanFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IsNanFunctionTests.cs index 744bfb5..c1d1c72 100644 --- a/NoStringEvaluating.Tests/Functions/Logic/IsNanFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/IsNanFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Logic; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Logic; internal class IsNanFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Logic/NotAliasFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/NotAliasFunctionTests.cs similarity index 91% rename from NoStringEvaluating.Tests/Functions/Logic/NotAliasFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/NotAliasFunctionTests.cs index 58ed779..f874936 100644 --- a/NoStringEvaluating.Tests/Functions/Logic/NotAliasFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/NotAliasFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Logic; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Logic; internal class NotAliasFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Logic/NotFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/NotFunctionTests.cs similarity index 89% rename from NoStringEvaluating.Tests/Functions/Logic/NotFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/NotFunctionTests.cs index 344402b..a37c963 100644 --- a/NoStringEvaluating.Tests/Functions/Logic/NotFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/NotFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Logic; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Logic; internal class NotFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Logic/OrFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/OrFunctionTests.cs similarity index 90% rename from NoStringEvaluating.Tests/Functions/Logic/OrFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/OrFunctionTests.cs index 821d4c0..ce525b9 100644 --- a/NoStringEvaluating.Tests/Functions/Logic/OrFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Logic/OrFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Logic; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Logic; internal class OrFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/AbsFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/AbsFunctionTests.cs similarity index 81% rename from NoStringEvaluating.Tests/Functions/Math/AbsFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/AbsFunctionTests.cs index 0201bb6..7f5afee 100644 --- a/NoStringEvaluating.Tests/Functions/Math/AbsFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/AbsFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class AbsFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/AddFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/AddFunctionTests.cs similarity index 83% rename from NoStringEvaluating.Tests/Functions/Math/AddFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/AddFunctionTests.cs index adefcac..a148f04 100644 --- a/NoStringEvaluating.Tests/Functions/Math/AddFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/AddFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class AddFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/CeilFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/CeilFunctionTests.cs similarity index 81% rename from NoStringEvaluating.Tests/Functions/Math/CeilFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/CeilFunctionTests.cs index 3e1e4c6..8f1d17f 100644 --- a/NoStringEvaluating.Tests/Functions/Math/CeilFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/CeilFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class CeilFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/FactFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FactFunctionTests.cs similarity index 84% rename from NoStringEvaluating.Tests/Functions/Math/FactFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FactFunctionTests.cs index b76f650..6036e84 100644 --- a/NoStringEvaluating.Tests/Functions/Math/FactFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FactFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class FactFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/FibFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FibFunctionTests.cs similarity index 84% rename from NoStringEvaluating.Tests/Functions/Math/FibFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FibFunctionTests.cs index 61082e7..0ce297e 100644 --- a/NoStringEvaluating.Tests/Functions/Math/FibFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FibFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class FibFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/FloorFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FloorFunctionTests.cs similarity index 81% rename from NoStringEvaluating.Tests/Functions/Math/FloorFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FloorFunctionTests.cs index ebc784a..74e7ace 100644 --- a/NoStringEvaluating.Tests/Functions/Math/FloorFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/FloorFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class FloorFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/GcdFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/GcdFunctionTests.cs similarity index 91% rename from NoStringEvaluating.Tests/Functions/Math/GcdFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/GcdFunctionTests.cs index 4bd4607..fcabc8f 100644 --- a/NoStringEvaluating.Tests/Functions/Math/GcdFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/GcdFunctionTests.cs @@ -2,10 +2,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class GcdFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/LcmFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LcmFunctionTests.cs similarity index 88% rename from NoStringEvaluating.Tests/Functions/Math/LcmFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LcmFunctionTests.cs index dcd97d9..70e8d34 100644 --- a/NoStringEvaluating.Tests/Functions/Math/LcmFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LcmFunctionTests.cs @@ -2,10 +2,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class LcmFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/LnFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LnFunctionTests.cs similarity index 81% rename from NoStringEvaluating.Tests/Functions/Math/LnFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LnFunctionTests.cs index c5bf1f9..6c70e2f 100644 --- a/NoStringEvaluating.Tests/Functions/Math/LnFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LnFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class LnFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Log10FunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Log10FunctionTests.cs similarity index 81% rename from NoStringEvaluating.Tests/Functions/Math/Log10FunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Log10FunctionTests.cs index f1b6831..f370e81 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Log10FunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Log10FunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class Log10FunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Log2FunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Log2FunctionTests.cs similarity index 81% rename from NoStringEvaluating.Tests/Functions/Math/Log2FunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Log2FunctionTests.cs index ba846e1..33f6106 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Log2FunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Log2FunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class Log2FunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/LogFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LogFunctionTests.cs similarity index 82% rename from NoStringEvaluating.Tests/Functions/Math/LogFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LogFunctionTests.cs index 498f1ed..34a22ec 100644 --- a/NoStringEvaluating.Tests/Functions/Math/LogFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/LogFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class LogFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/MaxFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MaxFunctionTests.cs similarity index 83% rename from NoStringEvaluating.Tests/Functions/Math/MaxFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MaxFunctionTests.cs index b570f35..363c26b 100644 --- a/NoStringEvaluating.Tests/Functions/Math/MaxFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MaxFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class MaxFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/MeanFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MeanFunctionTests.cs similarity index 84% rename from NoStringEvaluating.Tests/Functions/Math/MeanFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MeanFunctionTests.cs index 8dbef88..6786382 100644 --- a/NoStringEvaluating.Tests/Functions/Math/MeanFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MeanFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class MeanFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/MinFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MinFunctionTests.cs similarity index 83% rename from NoStringEvaluating.Tests/Functions/Math/MinFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MinFunctionTests.cs index 368211c..40d6bd2 100644 --- a/NoStringEvaluating.Tests/Functions/Math/MinFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MinFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class MinFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/ModFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/ModFunctionTests.cs similarity index 81% rename from NoStringEvaluating.Tests/Functions/Math/ModFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/ModFunctionTests.cs index 3306908..32d75b9 100644 --- a/NoStringEvaluating.Tests/Functions/Math/ModFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/ModFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class ModFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/MultiFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MultiFunctionTests.cs similarity index 84% rename from NoStringEvaluating.Tests/Functions/Math/MultiFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MultiFunctionTests.cs index 91c9e93..f99e977 100644 --- a/NoStringEvaluating.Tests/Functions/Math/MultiFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/MultiFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class MultiFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/RoundFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/RoundFunctionTests.cs similarity index 82% rename from NoStringEvaluating.Tests/Functions/Math/RoundFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/RoundFunctionTests.cs index 9ab9ed8..69ce846 100644 --- a/NoStringEvaluating.Tests/Functions/Math/RoundFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/RoundFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class RoundFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/SgnFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SgnFunctionTests.cs similarity index 82% rename from NoStringEvaluating.Tests/Functions/Math/SgnFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SgnFunctionTests.cs index 8675b31..541c187 100644 --- a/NoStringEvaluating.Tests/Functions/Math/SgnFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SgnFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class SgnFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/SignFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SignFunctionTests.cs similarity index 82% rename from NoStringEvaluating.Tests/Functions/Math/SignFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SignFunctionTests.cs index 60b3228..bb6bc9f 100644 --- a/NoStringEvaluating.Tests/Functions/Math/SignFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SignFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class SignFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/SqrtFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SqrtFunctionTests.cs similarity index 82% rename from NoStringEvaluating.Tests/Functions/Math/SqrtFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SqrtFunctionTests.cs index b242484..54df05a 100644 --- a/NoStringEvaluating.Tests/Functions/Math/SqrtFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/SqrtFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math; internal class SqrtFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/AcosFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/AcosFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/AcosFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/AcosFunctionTests.cs index 0a714b8..d4bd968 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/AcosFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/AcosFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cos; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cos; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cos; internal class AcosFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/AcoshFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/AcoshFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/AcoshFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/AcoshFunctionTests.cs index 7bab40e..ccfbee7 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/AcoshFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/AcoshFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cos; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cos; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cos; internal class AcoshFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArccosFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArccosFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArccosFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArccosFunctionTests.cs index 94e8f35..ebd8152 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArccosFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArccosFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cos; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cos; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cos; internal class ArccosFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArccoshFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArccoshFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArccoshFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArccoshFunctionTests.cs index 969099d..01fe439 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArccoshFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArccoshFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cos; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cos; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cos; internal class ArccoshFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArcosFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArcosFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArcosFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArcosFunctionTests.cs index 303a610..322bc49 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArcosFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArcosFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cos; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cos; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cos; internal class ArcosFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArcoshFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArcoshFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArcoshFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArcoshFunctionTests.cs index 3c6d51d..516b25b 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/ArcoshFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/ArcoshFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cos; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cos; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cos; internal class ArcoshFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/CosFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/CosFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/CosFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/CosFunctionTests.cs index 1b927db..62f5615 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/CosFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/CosFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cos; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cos; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cos; internal class CosFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/CoshFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/CoshFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/CoshFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/CoshFunctionTests.cs index 1e3a615..778a5ba 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cos/CoshFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cos/CoshFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cos; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cos; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cos; internal class CoshFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/AcosechFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/AcosechFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/AcosechFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/AcosechFunctionTests.cs index 8702c8f..09a26a2 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/AcosechFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/AcosechFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class AcosechFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/AcschFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/AcschFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/AcschFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/AcschFunctionTests.cs index 1b7ee36..a970bc4 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/AcschFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/AcschFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class AcschFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArccschFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArccschFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArccschFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArccschFunctionTests.cs index 8a0a8b9..0b5b56d 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArccschFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArccschFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class ArccschFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArcosechFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArcosechFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArcosechFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArcosechFunctionTests.cs index b7f5b22..ff4e6da 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArcosechFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArcosechFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class ArcosechFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArcschFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArcschFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArcschFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArcschFunctionTests.cs index 7c4a6a8..f0d894f 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/ArcschFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/ArcschFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class ArcschFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CosecFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CosecFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CosecFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CosecFunctionTests.cs index c04a8bf..8e8320d 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CosecFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CosecFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class CosecFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CosechFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CosechFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CosechFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CosechFunctionTests.cs index 99b718d..4675783 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CosechFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CosechFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class CosechFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CscFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CscFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CscFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CscFunctionTests.cs index 1cbd0bf..83d4367 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CscFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CscFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class CscFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CschFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CschFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CschFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CschFunctionTests.cs index b5b4aa3..eb37795 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cosec/CschFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cosec/CschFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cosec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cosec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cosec; internal class CschFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/AcotFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/AcotFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/AcotFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/AcotFunctionTests.cs index a75029e..494e541 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/AcotFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/AcotFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class AcotFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/AcothFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/AcothFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/AcothFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/AcothFunctionTests.cs index 10d10b1..faf5ed3 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/AcothFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/AcothFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class AcothFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActanFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActanFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActanFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActanFunctionTests.cs index 4cfea49..4af077e 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActanFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActanFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ActanFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActanhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActanhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActanhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActanhFunctionTests.cs index cb2c9b4..7948377 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActanhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActanhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ActanhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActgFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActgFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActgFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActgFunctionTests.cs index 7931dda..67d0eab 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActgFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActgFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ActgFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActghFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActghFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActghFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActghFunctionTests.cs index be990c5..21f647f 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ActghFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ActghFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ActghFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArccotFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArccotFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArccotFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArccotFunctionTests.cs index 26b883b..363aaa2 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArccotFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArccotFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ArccotFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArccothFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArccothFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArccothFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArccothFunctionTests.cs index fb34fc7..5c55431 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArccothFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArccothFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ArccothFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctanFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctanFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctanFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctanFunctionTests.cs index de6c9aa..a292f8f 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctanFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctanFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ArcctanFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctanhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctanhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctanhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctanhFunctionTests.cs index ee86540..5181665 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctanhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctanhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ArcctanhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctgFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctgFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctgFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctgFunctionTests.cs index a0d9446..2ace3a1 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctgFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctgFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ArcctgFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctghFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctghFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctghFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctghFunctionTests.cs index 27fab59..470987b 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/ArcctghFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/ArcctghFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class ArcctghFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CotFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CotFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CotFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CotFunctionTests.cs index aa012a2..2960d1f 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CotFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CotFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class CotFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CothFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CothFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CothFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CothFunctionTests.cs index a00f3b3..b30f2dd 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CothFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CothFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class CothFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtanFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtanFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtanFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtanFunctionTests.cs index e14271f..c65d824 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtanFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtanFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class CtanFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtanhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtanhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtanhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtanhFunctionTests.cs index e469da9..5942b97 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtanhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtanhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class CtanhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtgFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtgFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtgFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtgFunctionTests.cs index 417daa8..96b85e9 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtgFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtgFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class CtgFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtghFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtghFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtghFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtghFunctionTests.cs index 5945ade..eea1dd7 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Cotan/CtghFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Cotan/CtghFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Cotan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Cotan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Cotan; internal class CtghFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/DegFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/DegFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/DegFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/DegFunctionTests.cs index f928299..b5ec7ac 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/DegFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/DegFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry; internal class DegFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/ExpFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/ExpFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/ExpFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/ExpFunctionTests.cs index ef82614..46c303b 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/ExpFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/ExpFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry; internal class ExpFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/RadFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/RadFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/RadFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/RadFunctionTests.cs index f89e511..4300ce4 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/RadFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/RadFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry; internal class RadFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArcsecFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArcsecFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArcsecFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArcsecFunctionTests.cs index 26e065e..c2f8d36 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArcsecFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArcsecFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sec; internal class ArcsecFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArcsechFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArcsechFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArcsechFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArcsechFunctionTests.cs index 8f802dc..5bb9c69 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArcsechFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArcsechFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sec; internal class ArcsechFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArsechFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArsechFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArsechFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArsechFunctionTests.cs index b82810e..71a5c7c 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/ArsechFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/ArsechFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sec; internal class ArsechFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/AsechFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/AsechFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/AsechFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/AsechFunctionTests.cs index 712c2a2..4ea0b13 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/AsechFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/AsechFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sec; internal class AsechFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/SecFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/SecFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/SecFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/SecFunctionTests.cs index 1fc8771..2cedd25 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/SecFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/SecFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sec; internal class SecFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/SechFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/SechFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/SechFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/SechFunctionTests.cs index cb797f7..e087553 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sec/SechFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sec/SechFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sec; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sec; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sec; internal class SechFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArcsinFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArcsinFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArcsinFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArcsinFunctionTests.cs index c3f8f5d..190679a 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArcsinFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArcsinFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sin; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sin; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sin; internal class ArcsinFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArcsinhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArcsinhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArcsinhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArcsinhFunctionTests.cs index 4b86cac..21a70a8 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArcsinhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArcsinhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sin; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sin; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sin; internal class ArcsinhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArsinFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArsinFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArsinFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArsinFunctionTests.cs index 6cae791..ffa993e 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArsinFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArsinFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sin; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sin; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sin; internal class ArsinFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArsinhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArsinhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArsinhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArsinhFunctionTests.cs index e99c830..ccb38c1 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/ArsinhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/ArsinhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sin; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sin; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sin; internal class ArsinhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/AsinFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/AsinFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/AsinFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/AsinFunctionTests.cs index ba4559e..6e5ebd7 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/AsinFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/AsinFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sin; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sin; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sin; internal class AsinFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/AsinhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/AsinhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/AsinhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/AsinhFunctionTests.cs index ab29c0e..33229e8 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/AsinhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/AsinhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sin; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sin; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sin; internal class AsinhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/SinFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/SinFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/SinFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/SinFunctionTests.cs index a812593..bf71068 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/SinFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/SinFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sin; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sin; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sin; internal class SinFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/SinhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/SinhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/SinhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/SinhFunctionTests.cs index 81bd75e..1724c62 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Sin/SinhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Sin/SinhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Sin; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Sin; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Sin; internal class SinhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctanFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctanFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctanFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctanFunctionTests.cs index 4c37b23..4cb0c1c 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctanFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctanFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class ArctanFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctanhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctanhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctanhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctanhFunctionTests.cs index 0c44c6a..376e4a1 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctanhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctanhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class ArctanhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctgFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctgFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctgFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctgFunctionTests.cs index 99d69cf..8612edc 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctgFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctgFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class ArctgFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctghFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctghFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctghFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctghFunctionTests.cs index 0e66ee8..f766764 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/ArctghFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/ArctghFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class ArctghFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtanFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtanFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtanFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtanFunctionTests.cs index b9f466d..00f56e5 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtanFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtanFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class AtanFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtanhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtanhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtanhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtanhFunctionTests.cs index 3e37c4e..fe42cc2 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtanhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtanhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class AtanhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtgFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtgFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtgFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtgFunctionTests.cs index f9b5135..481a435 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtgFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtgFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class AtgFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtghFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtghFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtghFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtghFunctionTests.cs index 02b7b03..6618ffe 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/AtghFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/AtghFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class AtghFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TanFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TanFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TanFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TanFunctionTests.cs index 4b3735a..29c9494 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TanFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TanFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class TanFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TanhFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TanhFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TanhFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TanhFunctionTests.cs index 1d34205..aca6d10 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TanhFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TanhFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class TanhFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TgFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TgFunctionTests.cs similarity index 79% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TgFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TgFunctionTests.cs index fc2bc23..268c237 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TgFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TgFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class TgFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TghFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TghFunctionTests.cs similarity index 80% rename from NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TghFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TghFunctionTests.cs index 3607010..e4d1971 100644 --- a/NoStringEvaluating.Tests/Functions/Math/Trigonometry/Tan/TghFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Math/Trigonometry/Tan/TghFunctionTests.cs @@ -1,10 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Functions.Math.Trigonometry.Tan; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Math.Trigonometry.Tan; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Math.Trigonometry.Tan; internal class TghFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Null/IfNullFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Null/IfNullFunctionTests.cs similarity index 92% rename from NoStringEvaluating.Tests/Functions/Null/IfNullFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Null/IfNullFunctionTests.cs index 5725d3b..4137c2a 100644 --- a/NoStringEvaluating.Tests/Functions/Null/IfNullFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Null/IfNullFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Null; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Null; internal class IfNullFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Null/IsNullFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Null/IsNullFunctionTests.cs similarity index 92% rename from NoStringEvaluating.Tests/Functions/Null/IsNullFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Null/IsNullFunctionTests.cs index b90311f..00fd328 100644 --- a/NoStringEvaluating.Tests/Functions/Null/IsNullFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Null/IsNullFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Null; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Null; internal class IsNullFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Functions/Null/NullIfFunctionTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Functions/Null/NullIfFunctionTests.cs similarity index 92% rename from NoStringEvaluating.Tests/Functions/Null/NullIfFunctionTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Functions/Null/NullIfFunctionTests.cs index 88f2c17..723aa98 100644 --- a/NoStringEvaluating.Tests/Functions/Null/NullIfFunctionTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Functions/Null/NullIfFunctionTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Functions.Null; +namespace NoStringEvaluating.Tests.UnitTests.Functions.Null; internal class NullIfFunctionTests : FunctionTests { diff --git a/NoStringEvaluating.Tests/Helpers/EvaluatorFacadeFactory.cs b/src/NoStringEvaluating.Tests/UnitTests/Helpers/EvaluatorFacadeFactory.cs similarity index 96% rename from NoStringEvaluating.Tests/Helpers/EvaluatorFacadeFactory.cs rename to src/NoStringEvaluating.Tests/UnitTests/Helpers/EvaluatorFacadeFactory.cs index b603cd4..0355b7d 100644 --- a/NoStringEvaluating.Tests/Helpers/EvaluatorFacadeFactory.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Helpers/EvaluatorFacadeFactory.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Models; using NoStringEvaluating.Models.Values; -namespace NoStringEvaluating.Tests.Helpers; +namespace NoStringEvaluating.Tests.UnitTests.Helpers; internal static class EvaluatorFacadeFactory { diff --git a/NoStringEvaluating.Tests/Helpers/Extensions.cs b/src/NoStringEvaluating.Tests/UnitTests/Helpers/Extensions.cs similarity index 89% rename from NoStringEvaluating.Tests/Helpers/Extensions.cs rename to src/NoStringEvaluating.Tests/UnitTests/Helpers/Extensions.cs index eeebb81..891e056 100644 --- a/NoStringEvaluating.Tests/Helpers/Extensions.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Helpers/Extensions.cs @@ -1,7 +1,7 @@ using FluentAssertions; using FluentAssertions.Numeric; -namespace NoStringEvaluating.Tests.Helpers; +namespace NoStringEvaluating.Tests.UnitTests.Helpers; internal static class Extensions { diff --git a/src/NoStringEvaluating.Tests/UnitTests/Helpers/FormulaModelFactory.cs b/src/NoStringEvaluating.Tests/UnitTests/Helpers/FormulaModelFactory.cs new file mode 100644 index 0000000..fa1a0d0 --- /dev/null +++ b/src/NoStringEvaluating.Tests/UnitTests/Helpers/FormulaModelFactory.cs @@ -0,0 +1,28 @@ +using NoStringEvaluating.Models.Values; + +namespace NoStringEvaluating.Tests.UnitTests.Helpers; + +internal static class FormulaModelFactory +{ + public static Models.FormulaModel CreateTestModelToCheck(string formula, bool expectedOkresult) + { + var model = new Models.FormulaModel(formula, "NULL", double.NaN, expectedOkresult); + return model; + } + + public static Models.FormulaModel CreateTestModel(string formula, EvaluatorValue result, params (string, EvaluatorValue)[] arguments) + { + return CreateTestModel(formula, "NULL", result, arguments); + } + + public static Models.FormulaModel CreateTestModel(string formula, string parsedFormula, EvaluatorValue result, params (string, EvaluatorValue)[] arguments) + { + var model = new Models.FormulaModel(formula, parsedFormula, result); + foreach (var argument in arguments) + { + model.Arguments[argument.Item1] = argument.Item2; + } + + return model; + } +} diff --git a/NoStringEvaluating.Tests/Helpers/InternalValueFactory.cs b/src/NoStringEvaluating.Tests/UnitTests/Helpers/InternalValueFactory.cs similarity index 90% rename from NoStringEvaluating.Tests/Helpers/InternalValueFactory.cs rename to src/NoStringEvaluating.Tests/UnitTests/Helpers/InternalValueFactory.cs index 50b7cbe..ad7309c 100644 --- a/NoStringEvaluating.Tests/Helpers/InternalValueFactory.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Helpers/InternalValueFactory.cs @@ -1,7 +1,7 @@ using NoStringEvaluating.Factories; using NoStringEvaluating.Models.Values; -namespace NoStringEvaluating.Tests.Helpers; +namespace NoStringEvaluating.Tests.UnitTests.Helpers; internal class InternalValueFactory { diff --git a/NoStringEvaluating.Tests/Helpers/VariablesContainer.cs b/src/NoStringEvaluating.Tests/UnitTests/Helpers/VariablesContainer.cs similarity index 94% rename from NoStringEvaluating.Tests/Helpers/VariablesContainer.cs rename to src/NoStringEvaluating.Tests/UnitTests/Helpers/VariablesContainer.cs index 40e94f2..b6b97c1 100644 --- a/NoStringEvaluating.Tests/Helpers/VariablesContainer.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Helpers/VariablesContainer.cs @@ -2,7 +2,7 @@ using NoStringEvaluating.Contract.Variables; using NoStringEvaluating.Models.Values; -namespace NoStringEvaluating.Tests.Helpers; +namespace NoStringEvaluating.Tests.UnitTests.Helpers; internal class VariablesContainer : IVariablesContainer { diff --git a/src/NoStringEvaluating.Tests/UnitTests/Models/FormulaModel.cs b/src/NoStringEvaluating.Tests/UnitTests/Models/FormulaModel.cs new file mode 100644 index 0000000..77ce343 --- /dev/null +++ b/src/NoStringEvaluating.Tests/UnitTests/Models/FormulaModel.cs @@ -0,0 +1,21 @@ +using NoStringEvaluating.Models.Values; + +namespace NoStringEvaluating.Tests.UnitTests.Models; + +public class FormulaModel(string formula, string parsedFormula, EvaluatorValue result, bool expectedOkResult = true) +{ + public string Formula { get; } = formula; + + public string ParsedFormula { get; } = parsedFormula; + + public EvaluatorValue Result { get; } = result; + + public bool ExpectedOkResult { get; } = expectedOkResult; + + public Dictionary Arguments { get; } = []; + + public override string ToString() + { + return Formula; + } +} diff --git a/NoStringEvaluating.Tests/Models/Values/EvaluatorValueTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Models/Values/EvaluatorValueTests.cs similarity index 88% rename from NoStringEvaluating.Tests/Models/Values/EvaluatorValueTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Models/Values/EvaluatorValueTests.cs index 60c1c88..13393f2 100644 --- a/NoStringEvaluating.Tests/Models/Values/EvaluatorValueTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Models/Values/EvaluatorValueTests.cs @@ -2,7 +2,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Models.Values; +namespace NoStringEvaluating.Tests.UnitTests.Models.Values; internal class EvaluatorValueTests { diff --git a/NoStringEvaluating.Tests/Models/Values/InternalEvaluatorValueTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Models/Values/InternalEvaluatorValueTests.cs similarity index 88% rename from NoStringEvaluating.Tests/Models/Values/InternalEvaluatorValueTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Models/Values/InternalEvaluatorValueTests.cs index b3eb360..a81c59a 100644 --- a/NoStringEvaluating.Tests/Models/Values/InternalEvaluatorValueTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Models/Values/InternalEvaluatorValueTests.cs @@ -2,7 +2,7 @@ using NoStringEvaluating.Models.Values; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Models.Values; +namespace NoStringEvaluating.Tests.UnitTests.Models.Values; internal class InternalEvaluatorValueTests { diff --git a/NoStringEvaluating.Tests/NoStringEvaluatorNullableTests.cs b/src/NoStringEvaluating.Tests/UnitTests/NoStringEvaluatorNullableTests.cs similarity index 95% rename from NoStringEvaluating.Tests/NoStringEvaluatorNullableTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/NoStringEvaluatorNullableTests.cs index 4a41b31..9609c78 100644 --- a/NoStringEvaluating.Tests/NoStringEvaluatorNullableTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/NoStringEvaluatorNullableTests.cs @@ -1,10 +1,10 @@ using AutoFixture; using FluentAssertions; using NoStringEvaluating.Models.Values; -using NoStringEvaluating.Tests.Helpers; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests; +namespace NoStringEvaluating.Tests.UnitTests; internal class NoStringEvaluatorNullableTests { diff --git a/NoStringEvaluating.Tests/NoStringEvaluatorTests.cs b/src/NoStringEvaluating.Tests/UnitTests/NoStringEvaluatorTests.cs similarity index 94% rename from NoStringEvaluating.Tests/NoStringEvaluatorTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/NoStringEvaluatorTests.cs index 951b63a..fa3fa79 100644 --- a/NoStringEvaluating.Tests/NoStringEvaluatorTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/NoStringEvaluatorTests.cs @@ -6,17 +6,17 @@ using NoStringEvaluating.Functions.Base; using NoStringEvaluating.Models.Values; using NoStringEvaluating.Services.Parsing; -using NoStringEvaluating.Tests.Data; -using NoStringEvaluating.Tests.Helpers; -using NoStringEvaluating.Tests.Models; +using NoStringEvaluating.Tests.UnitTests.Data; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests; +namespace NoStringEvaluating.Tests.UnitTests; +[UnconditionalSuppressMessage("Style", "IDE0059:Unnecessary assignment of a value")] internal class NoStringEvaluatorTests { [TestCaseSource(typeof(EvaluateNumber), nameof(EvaluateNumber.Get))] - public void Should_Evaluate_Number(FormulaModel model) + public void Should_Evaluate_Number(Models.FormulaModel model) { // arrange, act var actual = CreateService().CalcNumber(model.Formula, model.Arguments); @@ -26,7 +26,7 @@ public void Should_Evaluate_Number(FormulaModel model) } [TestCaseSource(typeof(EvaluateWord), nameof(EvaluateWord.Get))] - public void Should_Evaluate_Word(FormulaModel model) + public void Should_Evaluate_Word(Models.FormulaModel model) { // arrange, act var actual = CreateService().CalcWord(model.Formula, model.Arguments); @@ -36,7 +36,7 @@ public void Should_Evaluate_Word(FormulaModel model) } [TestCaseSource(typeof(EvaluateDateTime), nameof(EvaluateDateTime.Get))] - public void Should_Evaluate_DateTime(FormulaModel model) + public void Should_Evaluate_DateTime(Models.FormulaModel model) { // arrange, act var actual = CreateService().CalcDateTime(model.Formula, model.Arguments); @@ -46,7 +46,7 @@ public void Should_Evaluate_DateTime(FormulaModel model) } [TestCaseSource(typeof(EvaluateWordList), nameof(EvaluateWordList.Get))] - public void Should_Evaluate_WordList(FormulaModel model) + public void Should_Evaluate_WordList(Models.FormulaModel model) { // arrange, act var actual = CreateService().CalcWordList(model.Formula, model.Arguments); @@ -56,7 +56,7 @@ public void Should_Evaluate_WordList(FormulaModel model) } [TestCaseSource(typeof(EvaluateNumberList), nameof(EvaluateNumberList.Get))] - public void Should_Evaluate_NumberList(FormulaModel model) + public void Should_Evaluate_NumberList(Models.FormulaModel model) { // arrange, act var actual = CreateService().CalcNumberList(model.Formula, model.Arguments); @@ -66,7 +66,7 @@ public void Should_Evaluate_NumberList(FormulaModel model) } [TestCaseSource(typeof(EvaluateBoolean), nameof(EvaluateBoolean.Get))] - public void Should_Evaluate_Boolean(FormulaModel model) + public void Should_Evaluate_Boolean(Models.FormulaModel model) { // arrange, act var actual = CreateService().CalcBoolean(model.Formula, model.Arguments); @@ -248,6 +248,7 @@ public void Should_Return_DateTime() } [Test] + [UnconditionalSuppressMessage("Performance", "CA1861:Avoid constant arrays as arguments")] public void Should_Return_WordList() { // arrange @@ -451,7 +452,7 @@ private static void TestNodes(string formula, ValueTypeKey expectedValueType) res.TypeKey.Should().Be(expectedValueType); } - private static IVariablesContainer CreateVariablesContainer(params (string, EvaluatorValue)[] variables) + private static VariablesContainer CreateVariablesContainer(params (string, EvaluatorValue)[] variables) { var variableContainer = new VariablesContainer(); @@ -463,7 +464,7 @@ private static IVariablesContainer CreateVariablesContainer(params (string, Eval return variableContainer; } - private static IDictionary CreateVariablesDictionary(params (string, EvaluatorValue)[] variables) + private static Dictionary CreateVariablesDictionary(params (string, EvaluatorValue)[] variables) { return variables.ToDictionary(key => key.Item1, val => val.Item2); } diff --git a/NoStringEvaluating.Tests/Services/Checking/FormulaCheckerTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Services/Checking/FormulaCheckerTests.cs similarity index 71% rename from NoStringEvaluating.Tests/Services/Checking/FormulaCheckerTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Services/Checking/FormulaCheckerTests.cs index 5d3389d..36731da 100644 --- a/NoStringEvaluating.Tests/Services/Checking/FormulaCheckerTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Services/Checking/FormulaCheckerTests.cs @@ -1,11 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Services.Checking; -using NoStringEvaluating.Tests.Data; -using NoStringEvaluating.Tests.Helpers; -using NoStringEvaluating.Tests.Models; +using NoStringEvaluating.Tests.UnitTests.Data; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Services.Checking; +namespace NoStringEvaluating.Tests.UnitTests.Services.Checking; internal class FormulaCheckerTests { @@ -18,7 +17,7 @@ public void Setup() } [TestCaseSource(typeof(CheckFormula), nameof(CheckFormula.Get))] - public void Should_Check_Syntax(FormulaModel model) + public void Should_Check_Syntax(Models.FormulaModel model) { // arrange, act var actual = _service.CheckSyntax(model.Formula); diff --git a/NoStringEvaluating.Tests/Services/OperationProcessorTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Services/OperationProcessorTests.cs similarity index 99% rename from NoStringEvaluating.Tests/Services/OperationProcessorTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Services/OperationProcessorTests.cs index 6d88254..f59cdf7 100644 --- a/NoStringEvaluating.Tests/Services/OperationProcessorTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Services/OperationProcessorTests.cs @@ -4,7 +4,7 @@ using NoStringEvaluating.Services; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Services; +namespace NoStringEvaluating.Tests.UnitTests.Services; internal class OperationProcessorTests { diff --git a/NoStringEvaluating.Tests/Services/Parsing/FormulaParserTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Services/Parsing/FormulaParserTests.cs similarity index 69% rename from NoStringEvaluating.Tests/Services/Parsing/FormulaParserTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Services/Parsing/FormulaParserTests.cs index a8c2393..cad32b4 100644 --- a/NoStringEvaluating.Tests/Services/Parsing/FormulaParserTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Services/Parsing/FormulaParserTests.cs @@ -1,11 +1,10 @@ using FluentAssertions; using NoStringEvaluating.Services.Parsing; -using NoStringEvaluating.Tests.Data; -using NoStringEvaluating.Tests.Helpers; -using NoStringEvaluating.Tests.Models; +using NoStringEvaluating.Tests.UnitTests.Data; +using NoStringEvaluating.Tests.UnitTests.Helpers; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Services.Parsing; +namespace NoStringEvaluating.Tests.UnitTests.Services.Parsing; internal class FormulaParserTests { @@ -18,7 +17,7 @@ public void Setup() } [TestCaseSource(typeof(ParseFormula), nameof(ParseFormula.Get))] - public void Should_Parse_Formula(FormulaModel model) + public void Should_Parse_Formula(Models.FormulaModel model) { // arrange, act var actual = _service.Parse(model.Formula); diff --git a/NoStringEvaluating.Tests/Services/Value/WordFormatterTests.cs b/src/NoStringEvaluating.Tests/UnitTests/Services/Value/WordFormatterTests.cs similarity index 96% rename from NoStringEvaluating.Tests/Services/Value/WordFormatterTests.cs rename to src/NoStringEvaluating.Tests/UnitTests/Services/Value/WordFormatterTests.cs index 024a587..6c9c42f 100644 --- a/NoStringEvaluating.Tests/Services/Value/WordFormatterTests.cs +++ b/src/NoStringEvaluating.Tests/UnitTests/Services/Value/WordFormatterTests.cs @@ -3,7 +3,7 @@ using NoStringEvaluating.Services.Value; using NUnit.Framework; -namespace NoStringEvaluating.Tests.Services.Value; +namespace NoStringEvaluating.Tests.UnitTests.Services.Value; internal class WordFormatterTests { diff --git a/NoStringEvaluating/Contract/IFormulaCache.cs b/src/NoStringEvaluating/Contract/IFormulaCache.cs similarity index 100% rename from NoStringEvaluating/Contract/IFormulaCache.cs rename to src/NoStringEvaluating/Contract/IFormulaCache.cs diff --git a/NoStringEvaluating/Contract/IFormulaChecker.cs b/src/NoStringEvaluating/Contract/IFormulaChecker.cs similarity index 100% rename from NoStringEvaluating/Contract/IFormulaChecker.cs rename to src/NoStringEvaluating/Contract/IFormulaChecker.cs diff --git a/NoStringEvaluating/Contract/IFormulaParser.cs b/src/NoStringEvaluating/Contract/IFormulaParser.cs similarity index 100% rename from NoStringEvaluating/Contract/IFormulaParser.cs rename to src/NoStringEvaluating/Contract/IFormulaParser.cs diff --git a/NoStringEvaluating/Contract/IFunctionReader.cs b/src/NoStringEvaluating/Contract/IFunctionReader.cs similarity index 100% rename from NoStringEvaluating/Contract/IFunctionReader.cs rename to src/NoStringEvaluating/Contract/IFunctionReader.cs diff --git a/NoStringEvaluating/Contract/INoStringEvaluator.cs b/src/NoStringEvaluating/Contract/INoStringEvaluator.cs similarity index 100% rename from NoStringEvaluating/Contract/INoStringEvaluator.cs rename to src/NoStringEvaluating/Contract/INoStringEvaluator.cs diff --git a/NoStringEvaluating/Contract/INoStringEvaluatorNullable.cs b/src/NoStringEvaluating/Contract/INoStringEvaluatorNullable.cs similarity index 100% rename from NoStringEvaluating/Contract/INoStringEvaluatorNullable.cs rename to src/NoStringEvaluating/Contract/INoStringEvaluatorNullable.cs diff --git a/NoStringEvaluating/Contract/Variables/IVariable.cs b/src/NoStringEvaluating/Contract/Variables/IVariable.cs similarity index 100% rename from NoStringEvaluating/Contract/Variables/IVariable.cs rename to src/NoStringEvaluating/Contract/Variables/IVariable.cs diff --git a/NoStringEvaluating/Contract/Variables/IVariablesContainer.cs b/src/NoStringEvaluating/Contract/Variables/IVariablesContainer.cs similarity index 100% rename from NoStringEvaluating/Contract/Variables/IVariablesContainer.cs rename to src/NoStringEvaluating/Contract/Variables/IVariablesContainer.cs diff --git a/src/NoStringEvaluating/Exceptions/NoStringFunctionException.cs b/src/NoStringEvaluating/Exceptions/NoStringFunctionException.cs new file mode 100644 index 0000000..7e4b08b --- /dev/null +++ b/src/NoStringEvaluating/Exceptions/NoStringFunctionException.cs @@ -0,0 +1,8 @@ +namespace NoStringEvaluating.Exceptions; + +/// +/// Raises when function exception +/// +public class NoStringFunctionException(string funcName) : Exception($"Function \"{funcName}\" has already added") +{ +} diff --git a/src/NoStringEvaluating/Exceptions/VariableNotFoundException.cs b/src/NoStringEvaluating/Exceptions/VariableNotFoundException.cs new file mode 100644 index 0000000..7c728e7 --- /dev/null +++ b/src/NoStringEvaluating/Exceptions/VariableNotFoundException.cs @@ -0,0 +1,12 @@ +namespace NoStringEvaluating.Exceptions; + +/// +/// Raises when can't find a variable +/// +public class VariableNotFoundException(string variableName, string message) : Exception(message) +{ + /// + /// VariableName + /// + public string VariableName { get; set; } = variableName; +} diff --git a/NoStringEvaluating/Extensions/InternalExtensions.cs b/src/NoStringEvaluating/Extensions/InternalExtensions.cs similarity index 100% rename from NoStringEvaluating/Extensions/InternalExtensions.cs rename to src/NoStringEvaluating/Extensions/InternalExtensions.cs diff --git a/NoStringEvaluating/Extensions/NoStringEvaluatorExtensions.cs b/src/NoStringEvaluating/Extensions/NoStringEvaluatorExtensions.cs similarity index 100% rename from NoStringEvaluating/Extensions/NoStringEvaluatorExtensions.cs rename to src/NoStringEvaluating/Extensions/NoStringEvaluatorExtensions.cs diff --git a/NoStringEvaluating/Extensions/NumberExtensions.cs b/src/NoStringEvaluating/Extensions/NumberExtensions.cs similarity index 100% rename from NoStringEvaluating/Extensions/NumberExtensions.cs rename to src/NoStringEvaluating/Extensions/NumberExtensions.cs diff --git a/NoStringEvaluating/Factories/BooleanFactory.cs b/src/NoStringEvaluating/Factories/BooleanFactory.cs similarity index 100% rename from NoStringEvaluating/Factories/BooleanFactory.cs rename to src/NoStringEvaluating/Factories/BooleanFactory.cs diff --git a/NoStringEvaluating/Factories/DateTimeFactory.cs b/src/NoStringEvaluating/Factories/DateTimeFactory.cs similarity index 100% rename from NoStringEvaluating/Factories/DateTimeFactory.cs rename to src/NoStringEvaluating/Factories/DateTimeFactory.cs diff --git a/NoStringEvaluating/Factories/NumberListFactory.cs b/src/NoStringEvaluating/Factories/NumberListFactory.cs similarity index 100% rename from NoStringEvaluating/Factories/NumberListFactory.cs rename to src/NoStringEvaluating/Factories/NumberListFactory.cs diff --git a/NoStringEvaluating/Factories/ObjectFactory.cs b/src/NoStringEvaluating/Factories/ObjectFactory.cs similarity index 100% rename from NoStringEvaluating/Factories/ObjectFactory.cs rename to src/NoStringEvaluating/Factories/ObjectFactory.cs diff --git a/NoStringEvaluating/Factories/ValueFactory.cs b/src/NoStringEvaluating/Factories/ValueFactory.cs similarity index 100% rename from NoStringEvaluating/Factories/ValueFactory.cs rename to src/NoStringEvaluating/Factories/ValueFactory.cs diff --git a/NoStringEvaluating/Factories/WordFactory.cs b/src/NoStringEvaluating/Factories/WordFactory.cs similarity index 100% rename from NoStringEvaluating/Factories/WordFactory.cs rename to src/NoStringEvaluating/Factories/WordFactory.cs diff --git a/NoStringEvaluating/Factories/WordListFactory.cs b/src/NoStringEvaluating/Factories/WordListFactory.cs similarity index 100% rename from NoStringEvaluating/Factories/WordListFactory.cs rename to src/NoStringEvaluating/Factories/WordListFactory.cs diff --git a/NoStringEvaluating/Functions/Base/IFunction.cs b/src/NoStringEvaluating/Functions/Base/IFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Base/IFunction.cs rename to src/NoStringEvaluating/Functions/Base/IFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/CountFunction.cs b/src/NoStringEvaluating/Functions/Excel/CountFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/CountFunction.cs rename to src/NoStringEvaluating/Functions/Excel/CountFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/AddHoursFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/AddHoursFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/AddHoursFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/AddHoursFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/AddMinutesFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/AddMinutesFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/AddMinutesFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/AddMinutesFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/AddSecondsFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/AddSecondsFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/AddSecondsFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/AddSecondsFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/DateDifFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/DateDifFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/DateDifFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/DateDifFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/DateFormatFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/DateFormatFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/DateFormatFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/DateFormatFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/DayFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/DayFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/DayFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/DayFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/MonthFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/MonthFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/MonthFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/MonthFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/NowFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/NowFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/NowFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/NowFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/TimeDifFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/TimeDifFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/TimeDifFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/TimeDifFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/ToDateTimeFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/ToDateTimeFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/ToDateTimeFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/ToDateTimeFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/TodayFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/TodayFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/TodayFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/TodayFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/WeekDayFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/WeekDayFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/WeekDayFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/WeekDayFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Date/YearFunction.cs b/src/NoStringEvaluating/Functions/Excel/Date/YearFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Date/YearFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Date/YearFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/IsErrorFunction.cs b/src/NoStringEvaluating/Functions/Excel/IsErrorFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/IsErrorFunction.cs rename to src/NoStringEvaluating/Functions/Excel/IsErrorFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/IsMemberFunction.cs b/src/NoStringEvaluating/Functions/Excel/IsMemberFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/IsMemberFunction.cs rename to src/NoStringEvaluating/Functions/Excel/IsMemberFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/IsNumberFunction.cs b/src/NoStringEvaluating/Functions/Excel/IsNumberFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/IsNumberFunction.cs rename to src/NoStringEvaluating/Functions/Excel/IsNumberFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/LenFunction.cs b/src/NoStringEvaluating/Functions/Excel/LenFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/LenFunction.cs rename to src/NoStringEvaluating/Functions/Excel/LenFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/SortFunction.cs b/src/NoStringEvaluating/Functions/Excel/SortFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/SortFunction.cs rename to src/NoStringEvaluating/Functions/Excel/SortFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/ToNumberFunction.cs b/src/NoStringEvaluating/Functions/Excel/ToNumberFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/ToNumberFunction.cs rename to src/NoStringEvaluating/Functions/Excel/ToNumberFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/ConcatFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/ConcatFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/ConcatFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/ConcatFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/ExplodeFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/ExplodeFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/ExplodeFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/ExplodeFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/ImplodeFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/ImplodeFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/ImplodeFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/ImplodeFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/IsTextFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/IsTextFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/IsTextFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/IsTextFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/LeftFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/LeftFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/LeftFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/LeftFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/LowerFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/LowerFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/LowerFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/LowerFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/MiddleFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/MiddleFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/MiddleFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/MiddleFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/ProperFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/ProperFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/ProperFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/ProperFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/ReplaceFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/ReplaceFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/ReplaceFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/ReplaceFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/RightFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/RightFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/RightFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/RightFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/TextFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/TextFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/TextFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/TextFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/UniqueFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/UniqueFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/UniqueFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/UniqueFunction.cs diff --git a/NoStringEvaluating/Functions/Excel/Word/UpperFunction.cs b/src/NoStringEvaluating/Functions/Excel/Word/UpperFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Excel/Word/UpperFunction.cs rename to src/NoStringEvaluating/Functions/Excel/Word/UpperFunction.cs diff --git a/NoStringEvaluating/Functions/Logic/AndFunction.cs b/src/NoStringEvaluating/Functions/Logic/AndFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Logic/AndFunction.cs rename to src/NoStringEvaluating/Functions/Logic/AndFunction.cs diff --git a/NoStringEvaluating/Functions/Logic/IfFunction.cs b/src/NoStringEvaluating/Functions/Logic/IfFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Logic/IfFunction.cs rename to src/NoStringEvaluating/Functions/Logic/IfFunction.cs diff --git a/NoStringEvaluating/Functions/Logic/IffFunction.cs b/src/NoStringEvaluating/Functions/Logic/IffFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Logic/IffFunction.cs rename to src/NoStringEvaluating/Functions/Logic/IffFunction.cs diff --git a/NoStringEvaluating/Functions/Logic/IsnanFunction.cs b/src/NoStringEvaluating/Functions/Logic/IsnanFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Logic/IsnanFunction.cs rename to src/NoStringEvaluating/Functions/Logic/IsnanFunction.cs diff --git a/NoStringEvaluating/Functions/Logic/NotAliasFunction.cs b/src/NoStringEvaluating/Functions/Logic/NotAliasFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Logic/NotAliasFunction.cs rename to src/NoStringEvaluating/Functions/Logic/NotAliasFunction.cs diff --git a/NoStringEvaluating/Functions/Logic/NotFunction.cs b/src/NoStringEvaluating/Functions/Logic/NotFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Logic/NotFunction.cs rename to src/NoStringEvaluating/Functions/Logic/NotFunction.cs diff --git a/NoStringEvaluating/Functions/Logic/OrFunction.cs b/src/NoStringEvaluating/Functions/Logic/OrFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Logic/OrFunction.cs rename to src/NoStringEvaluating/Functions/Logic/OrFunction.cs diff --git a/NoStringEvaluating/Functions/Math/AbsFunction.cs b/src/NoStringEvaluating/Functions/Math/AbsFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/AbsFunction.cs rename to src/NoStringEvaluating/Functions/Math/AbsFunction.cs diff --git a/NoStringEvaluating/Functions/Math/AddFunction.cs b/src/NoStringEvaluating/Functions/Math/AddFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/AddFunction.cs rename to src/NoStringEvaluating/Functions/Math/AddFunction.cs diff --git a/NoStringEvaluating/Functions/Math/CeilFunction.cs b/src/NoStringEvaluating/Functions/Math/CeilFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/CeilFunction.cs rename to src/NoStringEvaluating/Functions/Math/CeilFunction.cs diff --git a/NoStringEvaluating/Functions/Math/FactFunction.cs b/src/NoStringEvaluating/Functions/Math/FactFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/FactFunction.cs rename to src/NoStringEvaluating/Functions/Math/FactFunction.cs diff --git a/NoStringEvaluating/Functions/Math/FibFunction.cs b/src/NoStringEvaluating/Functions/Math/FibFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/FibFunction.cs rename to src/NoStringEvaluating/Functions/Math/FibFunction.cs diff --git a/NoStringEvaluating/Functions/Math/FloorFunction.cs b/src/NoStringEvaluating/Functions/Math/FloorFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/FloorFunction.cs rename to src/NoStringEvaluating/Functions/Math/FloorFunction.cs diff --git a/NoStringEvaluating/Functions/Math/GcdFunction.cs b/src/NoStringEvaluating/Functions/Math/GcdFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/GcdFunction.cs rename to src/NoStringEvaluating/Functions/Math/GcdFunction.cs diff --git a/NoStringEvaluating/Functions/Math/LcmFunction.cs b/src/NoStringEvaluating/Functions/Math/LcmFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/LcmFunction.cs rename to src/NoStringEvaluating/Functions/Math/LcmFunction.cs diff --git a/NoStringEvaluating/Functions/Math/LnFunction.cs b/src/NoStringEvaluating/Functions/Math/LnFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/LnFunction.cs rename to src/NoStringEvaluating/Functions/Math/LnFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Log10Function.cs b/src/NoStringEvaluating/Functions/Math/Log10Function.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Log10Function.cs rename to src/NoStringEvaluating/Functions/Math/Log10Function.cs diff --git a/NoStringEvaluating/Functions/Math/Log2Function.cs b/src/NoStringEvaluating/Functions/Math/Log2Function.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Log2Function.cs rename to src/NoStringEvaluating/Functions/Math/Log2Function.cs diff --git a/NoStringEvaluating/Functions/Math/LogFunction.cs b/src/NoStringEvaluating/Functions/Math/LogFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/LogFunction.cs rename to src/NoStringEvaluating/Functions/Math/LogFunction.cs diff --git a/NoStringEvaluating/Functions/Math/MaxFunction.cs b/src/NoStringEvaluating/Functions/Math/MaxFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/MaxFunction.cs rename to src/NoStringEvaluating/Functions/Math/MaxFunction.cs diff --git a/NoStringEvaluating/Functions/Math/MeanFunction.cs b/src/NoStringEvaluating/Functions/Math/MeanFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/MeanFunction.cs rename to src/NoStringEvaluating/Functions/Math/MeanFunction.cs diff --git a/NoStringEvaluating/Functions/Math/MinFunction.cs b/src/NoStringEvaluating/Functions/Math/MinFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/MinFunction.cs rename to src/NoStringEvaluating/Functions/Math/MinFunction.cs diff --git a/NoStringEvaluating/Functions/Math/ModFunction.cs b/src/NoStringEvaluating/Functions/Math/ModFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/ModFunction.cs rename to src/NoStringEvaluating/Functions/Math/ModFunction.cs diff --git a/NoStringEvaluating/Functions/Math/MultiFunction.cs b/src/NoStringEvaluating/Functions/Math/MultiFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/MultiFunction.cs rename to src/NoStringEvaluating/Functions/Math/MultiFunction.cs diff --git a/NoStringEvaluating/Functions/Math/RoundFunction.cs b/src/NoStringEvaluating/Functions/Math/RoundFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/RoundFunction.cs rename to src/NoStringEvaluating/Functions/Math/RoundFunction.cs diff --git a/NoStringEvaluating/Functions/Math/SgnFunction.cs b/src/NoStringEvaluating/Functions/Math/SgnFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/SgnFunction.cs rename to src/NoStringEvaluating/Functions/Math/SgnFunction.cs diff --git a/NoStringEvaluating/Functions/Math/SignFunction.cs b/src/NoStringEvaluating/Functions/Math/SignFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/SignFunction.cs rename to src/NoStringEvaluating/Functions/Math/SignFunction.cs diff --git a/NoStringEvaluating/Functions/Math/SqrtFunction.cs b/src/NoStringEvaluating/Functions/Math/SqrtFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/SqrtFunction.cs rename to src/NoStringEvaluating/Functions/Math/SqrtFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cos/AcosFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/AcosFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cos/AcosFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/AcosFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cos/AcoshFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/AcoshFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cos/AcoshFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/AcoshFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArccosFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArccosFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArccosFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArccosFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArccoshFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArccoshFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArccoshFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArccoshFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArcosFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArcosFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArcosFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArcosFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArcoshFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArcoshFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArcoshFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/ArcoshFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cos/CosFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/CosFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cos/CosFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/CosFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cos/CoshFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/CoshFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cos/CoshFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cos/CoshFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/AcosechFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/AcosechFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/AcosechFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/AcosechFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/AcschFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/AcschFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/AcschFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/AcschFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArccschFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArccschFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArccschFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArccschFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArcosechFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArcosechFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArcosechFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArcosechFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArcschFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArcschFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArcschFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/ArcschFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CosecFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CosecFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CosecFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CosecFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CosechFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CosechFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CosechFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CosechFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CscFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CscFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CscFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CscFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CschFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CschFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CschFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cosec/CschFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/AcotFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/AcotFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/AcotFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/AcotFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/AcothFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/AcothFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/AcothFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/AcothFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActanFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActanFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActanFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActanFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActanhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActanhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActanhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActanhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActgFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActgFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActgFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActgFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActghFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActghFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActghFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ActghFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArccotFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArccotFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArccotFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArccotFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArccothFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArccothFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArccothFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArccothFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctanFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctanFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctanFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctanFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctanhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctanhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctanhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctanhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctgFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctgFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctgFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctgFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctghFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctghFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctghFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/ArcctghFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CotFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CotFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CotFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CotFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CothFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CothFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CothFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CothFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtanFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtanFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtanFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtanFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtanhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtanhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtanhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtanhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtgFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtgFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtgFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtgFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtghFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtghFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtghFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Cotan/CtghFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/DegFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/DegFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/DegFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/DegFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/ExpFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/ExpFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/ExpFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/ExpFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/RadFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/RadFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/RadFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/RadFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArcsecFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArcsecFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArcsecFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArcsecFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArcsechFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArcsechFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArcsechFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArcsechFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArsechFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArsechFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArsechFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/ArsechFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sec/AsechFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/AsechFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sec/AsechFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/AsechFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sec/SecFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/SecFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sec/SecFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/SecFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sec/SechFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/SechFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sec/SechFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sec/SechFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArcsinFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArcsinFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArcsinFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArcsinFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArcsinhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArcsinhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArcsinhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArcsinhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArsinFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArsinFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArsinFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArsinFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArsinhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArsinhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArsinhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/ArsinhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sin/AsinFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/AsinFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sin/AsinFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/AsinFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sin/AsinhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/AsinhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sin/AsinhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/AsinhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sin/SinFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/SinFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sin/SinFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/SinFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Sin/SinhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/SinhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Sin/SinhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Sin/SinhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctanFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctanFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctanFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctanFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctanhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctanhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctanhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctanhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctgFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctgFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctgFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctgFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctghFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctghFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctghFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/ArctghFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtanFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtanFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtanFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtanFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtanhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtanhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtanhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtanhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtgFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtgFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtgFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtgFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtghFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtghFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtghFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/AtghFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TanFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TanFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/TanFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TanFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TanhFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TanhFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/TanhFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TanhFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TgFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TgFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/TgFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TgFunction.cs diff --git a/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TghFunction.cs b/src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TghFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Math/Trigonometry/Tan/TghFunction.cs rename to src/NoStringEvaluating/Functions/Math/Trigonometry/Tan/TghFunction.cs diff --git a/NoStringEvaluating/Functions/Null/IfNullFunction.cs b/src/NoStringEvaluating/Functions/Null/IfNullFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Null/IfNullFunction.cs rename to src/NoStringEvaluating/Functions/Null/IfNullFunction.cs diff --git a/NoStringEvaluating/Functions/Null/IsNullFunction.cs b/src/NoStringEvaluating/Functions/Null/IsNullFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Null/IsNullFunction.cs rename to src/NoStringEvaluating/Functions/Null/IsNullFunction.cs diff --git a/NoStringEvaluating/Functions/Null/NullIfFunction.cs b/src/NoStringEvaluating/Functions/Null/NullIfFunction.cs similarity index 100% rename from NoStringEvaluating/Functions/Null/NullIfFunction.cs rename to src/NoStringEvaluating/Functions/Null/NullIfFunction.cs diff --git a/NoStringEvaluating/GlobalOptions.cs b/src/NoStringEvaluating/GlobalOptions.cs similarity index 96% rename from NoStringEvaluating/GlobalOptions.cs rename to src/NoStringEvaluating/GlobalOptions.cs index 26d029e..c8bb779 100644 --- a/NoStringEvaluating/GlobalOptions.cs +++ b/src/NoStringEvaluating/GlobalOptions.cs @@ -39,12 +39,12 @@ public static class GlobalOptions /// /// Assemblies with functions /// - public static HashSet FunctionsAssemblies { get; } = new(); + public static HashSet FunctionsAssemblies { get; } = []; /// /// Functions /// - public static HashSet Functions { get; } = new(); + public static HashSet Functions { get; } = []; /// /// Global options diff --git a/NoStringEvaluating/Models/Bracket.cs b/src/NoStringEvaluating/Models/Bracket.cs similarity index 100% rename from NoStringEvaluating/Models/Bracket.cs rename to src/NoStringEvaluating/Models/Bracket.cs diff --git a/NoStringEvaluating/Models/FloatingPointSymbol.cs b/src/NoStringEvaluating/Models/FloatingPointSymbol.cs similarity index 100% rename from NoStringEvaluating/Models/FloatingPointSymbol.cs rename to src/NoStringEvaluating/Models/FloatingPointSymbol.cs diff --git a/NoStringEvaluating/Models/FormulaChecker/CheckFormulaResult.cs b/src/NoStringEvaluating/Models/FormulaChecker/CheckFormulaResult.cs similarity index 61% rename from NoStringEvaluating/Models/FormulaChecker/CheckFormulaResult.cs rename to src/NoStringEvaluating/Models/FormulaChecker/CheckFormulaResult.cs index f988565..937fc88 100644 --- a/NoStringEvaluating/Models/FormulaChecker/CheckFormulaResult.cs +++ b/src/NoStringEvaluating/Models/FormulaChecker/CheckFormulaResult.cs @@ -3,28 +3,17 @@ /// /// Syntax checking result /// -public class CheckFormulaResult +public class CheckFormulaResult(List mistakes) { /// /// Mistakes /// - public List Mistakes { get; } + public List Mistakes { get; } = mistakes; /// /// Is checking OK /// - public bool Ok - { - get => Mistakes.Count is 0; - } - - /// - /// Syntax checking result - /// - public CheckFormulaResult(List mistakes) - { - Mistakes = mistakes; - } + public bool Ok => Mistakes.Count is 0; /// /// ToString diff --git a/NoStringEvaluating/Models/FormulaChecker/FormulaCheckerMistakeType.cs b/src/NoStringEvaluating/Models/FormulaChecker/FormulaCheckerMistakeType.cs similarity index 100% rename from NoStringEvaluating/Models/FormulaChecker/FormulaCheckerMistakeType.cs rename to src/NoStringEvaluating/Models/FormulaChecker/FormulaCheckerMistakeType.cs diff --git a/NoStringEvaluating/Models/FormulaChecker/FormulaCheckerModel.cs b/src/NoStringEvaluating/Models/FormulaChecker/FormulaCheckerModel.cs similarity index 61% rename from NoStringEvaluating/Models/FormulaChecker/FormulaCheckerModel.cs rename to src/NoStringEvaluating/Models/FormulaChecker/FormulaCheckerModel.cs index e629d06..97f16c6 100644 --- a/NoStringEvaluating/Models/FormulaChecker/FormulaCheckerModel.cs +++ b/src/NoStringEvaluating/Models/FormulaChecker/FormulaCheckerModel.cs @@ -3,38 +3,28 @@ /// /// Formula checker result item /// -public class FormulaCheckerModel +public class FormulaCheckerModel(FormulaCheckerMistakeType type, string message, string[] messageParts) { /// /// Mistake's type /// - public FormulaCheckerMistakeType MistakeType { get; } + public FormulaCheckerMistakeType MistakeType { get; } = type; /// /// Message /// - public string Message { get; } + public string Message { get; } = message; /// /// Important message parts /// - public string[] MessageParts { get; } - - /// - /// Formula checker result item - /// - public FormulaCheckerModel(FormulaCheckerMistakeType type, string message, string[] messageParts) - { - MistakeType = type; - Message = message; - MessageParts = messageParts; - } + public string[] MessageParts { get; } = messageParts; /// /// Formula checker result item /// public FormulaCheckerModel(FormulaCheckerMistakeType type, string message) - : this(type, message, Array.Empty()) + : this(type, message, []) { } diff --git a/NoStringEvaluating/Models/FunctionChar.cs b/src/NoStringEvaluating/Models/FunctionChar.cs similarity index 100% rename from NoStringEvaluating/Models/FunctionChar.cs rename to src/NoStringEvaluating/Models/FunctionChar.cs diff --git a/NoStringEvaluating/Models/Operator.cs b/src/NoStringEvaluating/Models/Operator.cs similarity index 100% rename from NoStringEvaluating/Models/Operator.cs rename to src/NoStringEvaluating/Models/Operator.cs diff --git a/NoStringEvaluating/Models/Values/EvaluatorValue.cs b/src/NoStringEvaluating/Models/Values/EvaluatorValue.cs similarity index 100% rename from NoStringEvaluating/Models/Values/EvaluatorValue.cs rename to src/NoStringEvaluating/Models/Values/EvaluatorValue.cs diff --git a/NoStringEvaluating/Models/Values/InternalEvaluatorValue.cs b/src/NoStringEvaluating/Models/Values/InternalEvaluatorValue.cs similarity index 100% rename from NoStringEvaluating/Models/Values/InternalEvaluatorValue.cs rename to src/NoStringEvaluating/Models/Values/InternalEvaluatorValue.cs diff --git a/NoStringEvaluating/Models/Values/ValueKeeper.cs b/src/NoStringEvaluating/Models/Values/ValueKeeper.cs similarity index 100% rename from NoStringEvaluating/Models/Values/ValueKeeper.cs rename to src/NoStringEvaluating/Models/Values/ValueKeeper.cs diff --git a/NoStringEvaluating/Models/Values/ValueKeeperContainer.cs b/src/NoStringEvaluating/Models/Values/ValueKeeperContainer.cs similarity index 95% rename from NoStringEvaluating/Models/Values/ValueKeeperContainer.cs rename to src/NoStringEvaluating/Models/Values/ValueKeeperContainer.cs index 1174989..6043e8e 100644 --- a/NoStringEvaluating/Models/Values/ValueKeeperContainer.cs +++ b/src/NoStringEvaluating/Models/Values/ValueKeeperContainer.cs @@ -7,7 +7,7 @@ namespace NoStringEvaluating.Models.Values; /// public sealed class ValueKeeperContainer : IDisposable { - private readonly List _valueKeeperList = new(); + private readonly List _valueKeeperList = []; private ObjectPool _pool; private int _index; diff --git a/NoStringEvaluating/Models/Values/ValueKeeperContainerReleaser.cs b/src/NoStringEvaluating/Models/Values/ValueKeeperContainerReleaser.cs similarity index 64% rename from NoStringEvaluating/Models/Values/ValueKeeperContainerReleaser.cs rename to src/NoStringEvaluating/Models/Values/ValueKeeperContainerReleaser.cs index 9297ed0..016ccb5 100644 --- a/NoStringEvaluating/Models/Values/ValueKeeperContainerReleaser.cs +++ b/src/NoStringEvaluating/Models/Values/ValueKeeperContainerReleaser.cs @@ -1,13 +1,8 @@ namespace NoStringEvaluating.Models.Values; -internal readonly struct ValueKeeperContainerReleaser : IDisposable +internal readonly struct ValueKeeperContainerReleaser(ValueKeeperContainer container) : IDisposable { - public ValueKeeperContainer Container { get; } - - public ValueKeeperContainerReleaser(ValueKeeperContainer container) - { - Container = container; - } + public ValueKeeperContainer Container { get; } = container; public void Dispose() { diff --git a/NoStringEvaluating/Models/Values/ValueTypeKey.cs b/src/NoStringEvaluating/Models/Values/ValueTypeKey.cs similarity index 100% rename from NoStringEvaluating/Models/Values/ValueTypeKey.cs rename to src/NoStringEvaluating/Models/Values/ValueTypeKey.cs diff --git a/NoStringEvaluating/NoStringEvaluating.csproj b/src/NoStringEvaluating/NoStringEvaluating.csproj similarity index 92% rename from NoStringEvaluating/NoStringEvaluating.csproj rename to src/NoStringEvaluating/NoStringEvaluating.csproj index 1404d41..2f04001 100644 --- a/NoStringEvaluating/NoStringEvaluating.csproj +++ b/src/NoStringEvaluating/NoStringEvaluating.csproj @@ -8,13 +8,12 @@ Fast low memory consuming mathematical evaluation without endless string parsing! Parses string formula once and uses its object sequence in each evaluation. MIT logo.png - 1) Add scientific notation -2) Add cases in formula checker + .NET 8 Math, Mathematics, Mathematical-Expression, Expressions, Parser, Formula, Evaluator, Calculator, Solve, Calculation, Logic, Condition, Custom, Function, Math-Parser, Expression-Evaluator, Formula-Parser, Object-Pooling, NoString, RPN https://github.com/KovtunV/NoStringEvaluating https://github.com/KovtunV/NoStringEvaluating git - 2.5.3 + 2.6.0 diff --git a/NoStringEvaluating/NoStringEvaluating.xml b/src/NoStringEvaluating/NoStringEvaluating.xml similarity index 99% rename from NoStringEvaluating/NoStringEvaluating.xml rename to src/NoStringEvaluating/NoStringEvaluating.xml index f2f6503..29b78cb 100644 --- a/NoStringEvaluating/NoStringEvaluating.xml +++ b/src/NoStringEvaluating/NoStringEvaluating.xml @@ -723,14 +723,14 @@ Raises when can't find a variable - + - VariableName + Raises when can't find a variable - + - Raises when can't find a variable + VariableName @@ -3613,6 +3613,11 @@ Syntax checking result + + + Syntax checking result + + Mistakes @@ -3623,11 +3628,6 @@ Is checking OK - - - Syntax checking result - - ToString @@ -3698,6 +3698,11 @@ Formula checker result item + + + Formula checker result item + + Mistake's type @@ -3713,11 +3718,6 @@ Important message parts - - - Formula checker result item - - Formula checker result item @@ -4293,14 +4293,14 @@ Formula node - + - Type key + Formula node - + - Formula node + Type key @@ -4373,14 +4373,14 @@ Formula node - Boolean - + - Boolean + Formula node - Boolean - + - Formula node - Boolean + Boolean @@ -4393,14 +4393,14 @@ Formula node - Bracket - + - Bracket + Formula node - Bracket - + - Formula node - bracket + Bracket @@ -4413,14 +4413,14 @@ Formula nodes - + - Nodes + Formula nodes - + - Formula nodes + Nodes @@ -4433,14 +4433,14 @@ Formula node - FunctionChar - + - FunctionChar + Formula node - FunctionChar - + - Formula node - FunctionChar + FunctionChar @@ -4453,6 +4453,11 @@ Formula node - Function + + + Formula node - Function + + Function @@ -4468,11 +4473,6 @@ Has negation in boolean - - - Formula node - Function - - ToString @@ -4483,6 +4483,11 @@ Formula node - Function wrapper + + + Formula node - Function wrapper + + Function node @@ -4493,11 +4498,6 @@ Function arguments - - - Formula node - Function wrapper - - ToString @@ -4523,14 +4523,14 @@ Formula node - NumberList - + - NumberList + Formula node - NumberList - + - Formula node - NumberList + NumberList @@ -4543,14 +4543,14 @@ Formula node - Number - + - Number + Formula node - Number - + - Formula node - Number + Number @@ -4588,6 +4588,11 @@ Formula node - Variable + + + Formula node - Variable + + Name @@ -4603,11 +4608,6 @@ Has negation in boolean - - - Formula node - Variable - - ToString @@ -4618,14 +4618,14 @@ Formula node - WordList - + - WordList + Formula node - WordList - + - Formula node - WordList + WordList @@ -4638,14 +4638,14 @@ Formula node - Word - + - Word + Formula node - Word - + - Formula node - Word + Word @@ -5441,14 +5441,14 @@ Border counter - + - Border count + Border counter - + - Border counter + Border count @@ -5541,6 +5541,11 @@ Name builder + + + Name builder + + Expected name @@ -5556,11 +5561,6 @@ Is finished - - - Name builder - - Try remembed char @@ -5576,14 +5576,14 @@ Parser from string to object sequence - + - Function reader + Parser from string to object sequence - + - Parser from string to object sequence + Function reader diff --git a/NoStringEvaluating/NoStringEvaluator.cs b/src/NoStringEvaluating/NoStringEvaluator.cs similarity index 97% rename from NoStringEvaluating/NoStringEvaluator.cs rename to src/NoStringEvaluating/NoStringEvaluator.cs index 3c06d6d..4237904 100644 --- a/NoStringEvaluating/NoStringEvaluator.cs +++ b/src/NoStringEvaluating/NoStringEvaluator.cs @@ -22,27 +22,16 @@ namespace NoStringEvaluating; /// /// Expression evaluator /// -public class NoStringEvaluator : INoStringEvaluator +public class NoStringEvaluator( + ObjectPool> stackPool, + ObjectPool> argsPool, + ObjectPool valueKeeperContainerPool, + IFormulaCache formulaCache) : INoStringEvaluator { - private readonly ObjectPool> _stackPool; - private readonly ObjectPool> _argsPool; - private readonly ObjectPool _valueKeeperContainerPool; - private readonly IFormulaCache _formulaCache; - - /// - /// Expression evaluator - /// - public NoStringEvaluator( - ObjectPool> stackPool, - ObjectPool> argsPool, - ObjectPool valueKeeperContainerPool, - IFormulaCache formulaCache) - { - _stackPool = stackPool; - _argsPool = argsPool; - _valueKeeperContainerPool = valueKeeperContainerPool; - _formulaCache = formulaCache; - } + private readonly ObjectPool> _stackPool = stackPool; + private readonly ObjectPool> _argsPool = argsPool; + private readonly ObjectPool _valueKeeperContainerPool = valueKeeperContainerPool; + private readonly IFormulaCache _formulaCache = formulaCache; #region Endpoints diff --git a/NoStringEvaluating/NoStringEvaluatorNullable.cs b/src/NoStringEvaluating/NoStringEvaluatorNullable.cs similarity index 94% rename from NoStringEvaluating/NoStringEvaluatorNullable.cs rename to src/NoStringEvaluating/NoStringEvaluatorNullable.cs index 18d35fb..6df80b1 100644 --- a/NoStringEvaluating/NoStringEvaluatorNullable.cs +++ b/src/NoStringEvaluating/NoStringEvaluatorNullable.cs @@ -15,17 +15,9 @@ namespace NoStringEvaluating; /// Expression evaluator with nullable result /// [ExcludeFromCodeCoverage] -public class NoStringEvaluatorNullable : INoStringEvaluatorNullable +public class NoStringEvaluatorNullable(INoStringEvaluator evaluator) : INoStringEvaluatorNullable { - private readonly INoStringEvaluator _evaluator; - - /// - /// Expression evaluator with nullable result - /// - public NoStringEvaluatorNullable(INoStringEvaluator evaluator) - { - _evaluator = evaluator; - } + private readonly INoStringEvaluator _evaluator = evaluator; #region NumberEndpoints @@ -505,44 +497,31 @@ public static Facade CreateFacade(Action options = nul /// /// Facade /// - public class Facade + public class Facade(NoStringEvaluator.Facade facade) { - /// - /// Facade - /// - public Facade(NoStringEvaluator.Facade facade) - { - Evaluator = new(facade.Evaluator); - - FunctionReader = facade.FunctionReader; - FormulaParser = facade.FormulaParser; - FormulaCache = facade.FormulaCache; - FormulaChecker = facade.FormulaChecker; - } - /// /// Evaluator /// - public NoStringEvaluatorNullable Evaluator { get; } + public NoStringEvaluatorNullable Evaluator { get; } = new(facade.Evaluator); /// /// FunctionReader /// - public FunctionReader FunctionReader { get; } + public FunctionReader FunctionReader { get; } = facade.FunctionReader; /// /// FormulaParser /// - public FormulaParser FormulaParser { get; } + public FormulaParser FormulaParser { get; } = facade.FormulaParser; /// /// FormulaCache /// - public FormulaCache FormulaCache { get; } + public FormulaCache FormulaCache { get; } = facade.FormulaCache; /// /// FormulaChecker /// - public FormulaChecker FormulaChecker { get; } + public FormulaChecker FormulaChecker { get; } = facade.FormulaChecker; } } diff --git a/NoStringEvaluating/NoStringEvaluatorOptions.cs b/src/NoStringEvaluating/NoStringEvaluatorOptions.cs similarity index 96% rename from NoStringEvaluating/NoStringEvaluatorOptions.cs rename to src/NoStringEvaluating/NoStringEvaluatorOptions.cs index a49c73e..f97d329 100644 --- a/NoStringEvaluating/NoStringEvaluatorOptions.cs +++ b/src/NoStringEvaluating/NoStringEvaluatorOptions.cs @@ -38,12 +38,12 @@ public class NoStringEvaluatorOptions /// /// Assemblies with functions /// - public HashSet FunctionsAssemblies { get; } = new(); + public HashSet FunctionsAssemblies { get; } = []; /// /// Functions /// - public HashSet Functions { get; } = new(); + public HashSet Functions { get; } = []; /// /// Options @@ -139,7 +139,7 @@ public NoStringEvaluatorOptions WithoutDefaultFunctions(bool withoutDefaultFunct /// public NoStringEvaluatorOptions WithFunctions(params IFunction[] functions) { - functions ??= Array.Empty(); + functions ??= []; functions.ForEach(x => Functions.Add(x)); return this; } diff --git a/src/NoStringEvaluating/Nodes/Base/BaseFormulaNode.cs b/src/NoStringEvaluating/Nodes/Base/BaseFormulaNode.cs new file mode 100644 index 0000000..da100e5 --- /dev/null +++ b/src/NoStringEvaluating/Nodes/Base/BaseFormulaNode.cs @@ -0,0 +1,12 @@ +namespace NoStringEvaluating.Nodes.Base; + +/// +/// Formula node +/// +public abstract class BaseFormulaNode(NodeTypeEnum typeKey) +{ + /// + /// Type key + /// + public NodeTypeEnum TypeKey { get; } = typeKey; +} diff --git a/NoStringEvaluating/Nodes/Base/NodeTypeEnum.cs b/src/NoStringEvaluating/Nodes/Base/NodeTypeEnum.cs similarity index 100% rename from NoStringEvaluating/Nodes/Base/NodeTypeEnum.cs rename to src/NoStringEvaluating/Nodes/Base/NodeTypeEnum.cs diff --git a/NoStringEvaluating/Nodes/BooleanNode.cs b/src/NoStringEvaluating/Nodes/BooleanNode.cs similarity index 60% rename from NoStringEvaluating/Nodes/BooleanNode.cs rename to src/NoStringEvaluating/Nodes/BooleanNode.cs index 31ad545..8f84708 100644 --- a/NoStringEvaluating/Nodes/BooleanNode.cs +++ b/src/NoStringEvaluating/Nodes/BooleanNode.cs @@ -6,21 +6,12 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - Boolean /// -public class BooleanNode : BaseFormulaNode +public class BooleanNode(bool value) : BaseFormulaNode(NodeTypeEnum.Boolean) { /// /// Boolean /// - public bool Value { get; } - - /// - /// Formula node - Boolean - /// - public BooleanNode(bool value) - : base(NodeTypeEnum.Boolean) - { - Value = value; - } + public bool Value { get; } = value; /// /// ToString diff --git a/NoStringEvaluating/Nodes/BracketNode.cs b/src/NoStringEvaluating/Nodes/BracketNode.cs similarity index 70% rename from NoStringEvaluating/Nodes/BracketNode.cs rename to src/NoStringEvaluating/Nodes/BracketNode.cs index dffd2c8..02bf2b4 100644 --- a/NoStringEvaluating/Nodes/BracketNode.cs +++ b/src/NoStringEvaluating/Nodes/BracketNode.cs @@ -6,21 +6,12 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - Bracket /// -public class BracketNode : BaseFormulaNode +public class BracketNode(Bracket bracket) : BaseFormulaNode(NodeTypeEnum.Bracket) { /// /// Bracket /// - public Bracket Bracket { get; } - - /// - /// Formula node - bracket - /// - public BracketNode(Bracket bracket) - : base(NodeTypeEnum.Bracket) - { - Bracket = bracket; - } + public Bracket Bracket { get; } = bracket; /// /// ToString diff --git a/src/NoStringEvaluating/Nodes/Common/FormulaNodes.cs b/src/NoStringEvaluating/Nodes/Common/FormulaNodes.cs new file mode 100644 index 0000000..8430cec --- /dev/null +++ b/src/NoStringEvaluating/Nodes/Common/FormulaNodes.cs @@ -0,0 +1,22 @@ +using NoStringEvaluating.Nodes.Base; + +namespace NoStringEvaluating.Nodes.Common; + +/// +/// Formula nodes +/// +public class FormulaNodes(List nodes) +{ + /// + /// Nodes + /// + public List Nodes { get; } = nodes; + + /// + /// ToString + /// + public override string ToString() + { + return string.Join(" ", Nodes); + } +} diff --git a/NoStringEvaluating/Nodes/FunctionCharNode.cs b/src/NoStringEvaluating/Nodes/FunctionCharNode.cs similarity index 68% rename from NoStringEvaluating/Nodes/FunctionCharNode.cs rename to src/NoStringEvaluating/Nodes/FunctionCharNode.cs index 809b685..6391836 100644 --- a/NoStringEvaluating/Nodes/FunctionCharNode.cs +++ b/src/NoStringEvaluating/Nodes/FunctionCharNode.cs @@ -6,21 +6,12 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - FunctionChar /// -public class FunctionCharNode : BaseFormulaNode +public class FunctionCharNode(FunctionChar functionChar) : BaseFormulaNode(NodeTypeEnum.FunctionChar) { /// /// FunctionChar /// - public FunctionChar FunctionChar { get; } - - /// - /// Formula node - FunctionChar - /// - public FunctionCharNode(FunctionChar functionChar) - : base(NodeTypeEnum.FunctionChar) - { - FunctionChar = functionChar; - } + public FunctionChar FunctionChar { get; } = functionChar; /// /// ToString diff --git a/NoStringEvaluating/Nodes/FunctionNode.cs b/src/NoStringEvaluating/Nodes/FunctionNode.cs similarity index 52% rename from NoStringEvaluating/Nodes/FunctionNode.cs rename to src/NoStringEvaluating/Nodes/FunctionNode.cs index cc97038..499dac1 100644 --- a/NoStringEvaluating/Nodes/FunctionNode.cs +++ b/src/NoStringEvaluating/Nodes/FunctionNode.cs @@ -6,33 +6,22 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - Function /// -public class FunctionNode : BaseFormulaNode +public class FunctionNode(IFunction function, bool isNegative, bool isNegation) : BaseFormulaNode(NodeTypeEnum.Function) { /// /// Function /// - public IFunction Function { get; } + public IFunction Function { get; } = function; /// /// Has unary minus /// - public bool IsNegative { get; } + public bool IsNegative { get; } = isNegative; /// /// Has negation in boolean /// - public bool IsNegation { get; } - - /// - /// Formula node - Function - /// - public FunctionNode(IFunction function, bool isNegative, bool isNegation) - : base(NodeTypeEnum.Function) - { - Function = function; - IsNegative = isNegative; - IsNegation = isNegation; - } + public bool IsNegation { get; } = isNegation; /// /// ToString diff --git a/NoStringEvaluating/Nodes/FunctionWrapperNode.cs b/src/NoStringEvaluating/Nodes/FunctionWrapperNode.cs similarity index 60% rename from NoStringEvaluating/Nodes/FunctionWrapperNode.cs rename to src/NoStringEvaluating/Nodes/FunctionWrapperNode.cs index ad6d724..3a50143 100644 --- a/NoStringEvaluating/Nodes/FunctionWrapperNode.cs +++ b/src/NoStringEvaluating/Nodes/FunctionWrapperNode.cs @@ -5,27 +5,17 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - Function wrapper /// -public class FunctionWrapperNode : BaseFormulaNode +public class FunctionWrapperNode(FunctionNode functionNode) : BaseFormulaNode(NodeTypeEnum.FunctionWrapper) { /// /// Function node /// - public FunctionNode FunctionNode { get; } + public FunctionNode FunctionNode { get; } = functionNode; /// /// Function arguments /// - public List> FunctionArgumentNodes { get; } - - /// - /// Formula node - Function wrapper - /// - public FunctionWrapperNode(FunctionNode functionNode) - : base(NodeTypeEnum.FunctionWrapper) - { - FunctionNode = functionNode; - FunctionArgumentNodes = new List>(); - } + public List> FunctionArgumentNodes { get; } = []; /// /// ToString diff --git a/NoStringEvaluating/Nodes/NullNode.cs b/src/NoStringEvaluating/Nodes/NullNode.cs similarity index 100% rename from NoStringEvaluating/Nodes/NullNode.cs rename to src/NoStringEvaluating/Nodes/NullNode.cs diff --git a/NoStringEvaluating/Nodes/NumberListNode.cs b/src/NoStringEvaluating/Nodes/NumberListNode.cs similarity index 53% rename from NoStringEvaluating/Nodes/NumberListNode.cs rename to src/NoStringEvaluating/Nodes/NumberListNode.cs index 098a022..dfdca31 100644 --- a/NoStringEvaluating/Nodes/NumberListNode.cs +++ b/src/NoStringEvaluating/Nodes/NumberListNode.cs @@ -5,21 +5,12 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - NumberList /// -public class NumberListNode : BaseFormulaNode +public class NumberListNode(List numberList) : BaseFormulaNode(NodeTypeEnum.NumberList) { /// /// NumberList /// - public List NumberList { get; } - - /// - /// Formula node - NumberList - /// - public NumberListNode(List numberList) - : base(NodeTypeEnum.NumberList) - { - NumberList = numberList; - } + public List NumberList { get; } = numberList; /// /// ToString diff --git a/NoStringEvaluating/Nodes/NumberNode.cs b/src/NoStringEvaluating/Nodes/NumberNode.cs similarity index 60% rename from NoStringEvaluating/Nodes/NumberNode.cs rename to src/NoStringEvaluating/Nodes/NumberNode.cs index 4a424d4..8e056a5 100644 --- a/NoStringEvaluating/Nodes/NumberNode.cs +++ b/src/NoStringEvaluating/Nodes/NumberNode.cs @@ -6,21 +6,12 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - Number /// -public class NumberNode : BaseFormulaNode +public class NumberNode(double number) : BaseFormulaNode(NodeTypeEnum.Number) { /// /// Number /// - public double Number { get; } - - /// - /// Formula node - Number - /// - public NumberNode(double number) - : base(NodeTypeEnum.Number) - { - Number = number; - } + public double Number { get; } = number; /// /// ToString diff --git a/NoStringEvaluating/Nodes/OperatorNode.cs b/src/NoStringEvaluating/Nodes/OperatorNode.cs similarity index 100% rename from NoStringEvaluating/Nodes/OperatorNode.cs rename to src/NoStringEvaluating/Nodes/OperatorNode.cs diff --git a/NoStringEvaluating/Nodes/VariableNode.cs b/src/NoStringEvaluating/Nodes/VariableNode.cs similarity index 51% rename from NoStringEvaluating/Nodes/VariableNode.cs rename to src/NoStringEvaluating/Nodes/VariableNode.cs index 12fdad9..55247bc 100644 --- a/NoStringEvaluating/Nodes/VariableNode.cs +++ b/src/NoStringEvaluating/Nodes/VariableNode.cs @@ -5,33 +5,22 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - Variable /// -public class VariableNode : BaseFormulaNode +public class VariableNode(string name, bool isNegative, bool isNegation) : BaseFormulaNode(NodeTypeEnum.Variable) { /// /// Name /// - public string Name { get; } + public string Name { get; } = name; /// /// Has unary minus /// - public bool IsNegative { get; } + public bool IsNegative { get; } = isNegative; /// /// Has negation in boolean /// - public bool IsNegation { get; } - - /// - /// Formula node - Variable - /// - public VariableNode(string name, bool isNegative, bool isNegation) - : base(NodeTypeEnum.Variable) - { - Name = name; - IsNegative = isNegative; - IsNegation = isNegation; - } + public bool IsNegation { get; } = isNegation; /// /// ToString diff --git a/NoStringEvaluating/Nodes/WordListNode.cs b/src/NoStringEvaluating/Nodes/WordListNode.cs similarity index 54% rename from NoStringEvaluating/Nodes/WordListNode.cs rename to src/NoStringEvaluating/Nodes/WordListNode.cs index 2abf2c6..9761b51 100644 --- a/NoStringEvaluating/Nodes/WordListNode.cs +++ b/src/NoStringEvaluating/Nodes/WordListNode.cs @@ -5,21 +5,12 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - WordList /// -public class WordListNode : BaseFormulaNode +public class WordListNode(List wordList) : BaseFormulaNode(NodeTypeEnum.WordList) { /// /// WordList /// - public List WordList { get; } - - /// - /// Formula node - WordList - /// - public WordListNode(List wordList) - : base(NodeTypeEnum.WordList) - { - WordList = wordList; - } + public List WordList { get; } = wordList; /// /// ToString diff --git a/NoStringEvaluating/Nodes/WordNode.cs b/src/NoStringEvaluating/Nodes/WordNode.cs similarity index 56% rename from NoStringEvaluating/Nodes/WordNode.cs rename to src/NoStringEvaluating/Nodes/WordNode.cs index 81f92bc..88c4c27 100644 --- a/NoStringEvaluating/Nodes/WordNode.cs +++ b/src/NoStringEvaluating/Nodes/WordNode.cs @@ -5,21 +5,12 @@ namespace NoStringEvaluating.Nodes; /// /// Formula node - Word /// -public class WordNode : BaseFormulaNode +public class WordNode(string word) : BaseFormulaNode(NodeTypeEnum.Word) { /// /// Word /// - public string Word { get; } - - /// - /// Formula node - Word - /// - public WordNode(string word) - : base(NodeTypeEnum.Word) - { - Word = word; - } + public string Word { get; } = word; /// /// ToString diff --git a/NoStringEvaluating/Properties/AssemblyInfo.cs b/src/NoStringEvaluating/Properties/AssemblyInfo.cs similarity index 100% rename from NoStringEvaluating/Properties/AssemblyInfo.cs rename to src/NoStringEvaluating/Properties/AssemblyInfo.cs diff --git a/NoStringEvaluating/Services/BorderCounter.cs b/src/NoStringEvaluating/Services/BorderCounter.cs similarity index 61% rename from NoStringEvaluating/Services/BorderCounter.cs rename to src/NoStringEvaluating/Services/BorderCounter.cs index ee9c0b3..8607640 100644 --- a/NoStringEvaluating/Services/BorderCounter.cs +++ b/src/NoStringEvaluating/Services/BorderCounter.cs @@ -5,24 +5,15 @@ namespace NoStringEvaluating.Services; /// /// Border counter /// -public class BorderCounter +public class BorderCounter(Func countFunc) where TNode : BaseFormulaNode { - private readonly Func _countFunc; + private readonly Func _countFunc = countFunc; /// /// Border count /// - public int Count { get; private set; } - - /// - /// Border counter - /// - public BorderCounter(Func countFunc) - { - _countFunc = countFunc; - Count = 1; - } + public int Count { get; private set; } = 1; /// /// Proceed border diff --git a/NoStringEvaluating/Services/BracketCounters.cs b/src/NoStringEvaluating/Services/BracketCounters.cs similarity index 93% rename from NoStringEvaluating/Services/BracketCounters.cs rename to src/NoStringEvaluating/Services/BracketCounters.cs index 2713a26..5f65eef 100644 --- a/NoStringEvaluating/Services/BracketCounters.cs +++ b/src/NoStringEvaluating/Services/BracketCounters.cs @@ -15,7 +15,7 @@ public class BracketCounters /// public BracketCounters() { - _borderCounters = new List>(); + _borderCounters = []; } /// diff --git a/NoStringEvaluating/Services/Cache/FormulaCache.cs b/src/NoStringEvaluating/Services/Cache/FormulaCache.cs similarity index 65% rename from NoStringEvaluating/Services/Cache/FormulaCache.cs rename to src/NoStringEvaluating/Services/Cache/FormulaCache.cs index 374d9a5..cfd387c 100644 --- a/NoStringEvaluating/Services/Cache/FormulaCache.cs +++ b/src/NoStringEvaluating/Services/Cache/FormulaCache.cs @@ -6,22 +6,11 @@ namespace NoStringEvaluating.Services.Cache; /// /// Parsed formula cache /// -public class FormulaCache : IFormulaCache +public class FormulaCache(IFormulaParser formulaParser) : IFormulaCache { - private readonly object _locker; - private readonly Dictionary _formulaNodes; - private readonly IFormulaParser _formulaParser; - - /// - /// Parsed formula cache - /// - public FormulaCache(IFormulaParser formulaParser) - { - _formulaNodes = new(); - _locker = new(); - - _formulaParser = formulaParser; - } + private readonly object _locker = new(); + private readonly Dictionary _formulaNodes = []; + private readonly IFormulaParser _formulaParser = formulaParser; /// /// Return cached formula nodes diff --git a/NoStringEvaluating/Services/Checking/FormulaChecker.cs b/src/NoStringEvaluating/Services/Checking/FormulaChecker.cs similarity index 97% rename from NoStringEvaluating/Services/Checking/FormulaChecker.cs rename to src/NoStringEvaluating/Services/Checking/FormulaChecker.cs index bffa5a5..380e1a0 100644 --- a/NoStringEvaluating/Services/Checking/FormulaChecker.cs +++ b/src/NoStringEvaluating/Services/Checking/FormulaChecker.cs @@ -9,17 +9,9 @@ namespace NoStringEvaluating.Services.Checking; /// /// Syntax checker /// -public class FormulaChecker : IFormulaChecker +public class FormulaChecker(IFormulaParser formulaParser) : IFormulaChecker { - private readonly IFormulaParser _formulaParser; - - /// - /// Syntax checker - /// - public FormulaChecker(IFormulaParser formulaParser) - { - _formulaParser = formulaParser; - } + private readonly IFormulaParser _formulaParser = formulaParser; /// /// Check syntax diff --git a/NoStringEvaluating/Services/IndexWatcher.cs b/src/NoStringEvaluating/Services/IndexWatcher.cs similarity index 100% rename from NoStringEvaluating/Services/IndexWatcher.cs rename to src/NoStringEvaluating/Services/IndexWatcher.cs diff --git a/NoStringEvaluating/Services/NameBuilder.cs b/src/NoStringEvaluating/Services/NameBuilder.cs similarity index 69% rename from NoStringEvaluating/Services/NameBuilder.cs rename to src/NoStringEvaluating/Services/NameBuilder.cs index 83b3cfa..73a0841 100644 --- a/NoStringEvaluating/Services/NameBuilder.cs +++ b/src/NoStringEvaluating/Services/NameBuilder.cs @@ -3,31 +3,22 @@ /// /// Name builder /// -public struct NameBuilder +public struct NameBuilder(string expectedName) { /// /// Expected name /// - public string ExpectedName { get; private set; } + public string ExpectedName { get; private set; } = expectedName; /// /// Length /// - public int Length { get; private set; } + public int Length { get; private set; } = 0; /// /// Is finished /// - public bool IsFinished => Length == ExpectedName.Length; - - /// - /// Name builder - /// - public NameBuilder(string expectedName) - { - ExpectedName = expectedName; - Length = 0; - } + public readonly bool IsFinished => Length == ExpectedName.Length; /// /// Try remembed char diff --git a/NoStringEvaluating/Services/OperationProcessor.cs b/src/NoStringEvaluating/Services/OperationProcessor.cs similarity index 100% rename from NoStringEvaluating/Services/OperationProcessor.cs rename to src/NoStringEvaluating/Services/OperationProcessor.cs diff --git a/NoStringEvaluating/Services/Parsing/FormulaParser.cs b/src/NoStringEvaluating/Services/Parsing/FormulaParser.cs similarity index 90% rename from NoStringEvaluating/Services/Parsing/FormulaParser.cs rename to src/NoStringEvaluating/Services/Parsing/FormulaParser.cs index 32d9664..b2d03f7 100644 --- a/NoStringEvaluating/Services/Parsing/FormulaParser.cs +++ b/src/NoStringEvaluating/Services/Parsing/FormulaParser.cs @@ -9,20 +9,12 @@ namespace NoStringEvaluating.Services.Parsing; /// /// Parser from string to object sequence /// -public class FormulaParser : IFormulaParser +public class FormulaParser(IFunctionReader functionReader) : IFormulaParser { /// /// Function reader /// - public IFunctionReader FunctionsReader { get; } - - /// - /// Parser from string to object sequence - /// - public FormulaParser(IFunctionReader functionReader) - { - FunctionsReader = functionReader; - } + public IFunctionReader FunctionsReader { get; } = functionReader; /// /// Return parsed formula nodes diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/BracketReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/BracketReader.cs similarity index 100% rename from NoStringEvaluating/Services/Parsing/NodeReaders/BracketReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/BracketReader.cs diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/FunctionCharReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/FunctionCharReader.cs similarity index 100% rename from NoStringEvaluating/Services/Parsing/NodeReaders/FunctionCharReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/FunctionCharReader.cs diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/FunctionReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/FunctionReader.cs similarity index 97% rename from NoStringEvaluating/Services/Parsing/NodeReaders/FunctionReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/FunctionReader.cs index 02be7ce..e74d411 100644 --- a/NoStringEvaluating/Services/Parsing/NodeReaders/FunctionReader.cs +++ b/src/NoStringEvaluating/Services/Parsing/NodeReaders/FunctionReader.cs @@ -12,15 +12,13 @@ namespace NoStringEvaluating.Services.Parsing.NodeReaders; /// public class FunctionReader : IFunctionReader { - private readonly List _functions; + private readonly List _functions = []; /// /// Function reader /// public FunctionReader() { - _functions = new List(); - GlobalOptions.FunctionsAssemblies .CreateInstances() .ForEach(x => AddFunction(x, replace: true)); diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/ListReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/ListReader.cs similarity index 100% rename from NoStringEvaluating/Services/Parsing/NodeReaders/ListReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/ListReader.cs diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/NegationReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/NegationReader.cs similarity index 100% rename from NoStringEvaluating/Services/Parsing/NodeReaders/NegationReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/NegationReader.cs diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/NumberReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/NumberReader.cs similarity index 100% rename from NoStringEvaluating/Services/Parsing/NodeReaders/NumberReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/NumberReader.cs diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/OperatorReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/OperatorReader.cs similarity index 95% rename from NoStringEvaluating/Services/Parsing/NodeReaders/OperatorReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/OperatorReader.cs index 84c4c0d..3b516cf 100644 --- a/NoStringEvaluating/Services/Parsing/NodeReaders/OperatorReader.cs +++ b/src/NoStringEvaluating/Services/Parsing/NodeReaders/OperatorReader.cs @@ -14,7 +14,7 @@ public static class OperatorReader static OperatorReader() { // Pay attention and sort operators :) - _operators = new[] { "+", "-", "*", "/", "^", "<>", "<=", "<", ">=", ">", "==", "=", "!=", "&&", "||" }; + _operators = ["+", "-", "*", "/", "^", "<>", "<=", "<", ">=", ">", "==", "=", "!=", "&&", "||"]; } /// diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/UnaryMinusReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/UnaryMinusReader.cs similarity index 100% rename from NoStringEvaluating/Services/Parsing/NodeReaders/UnaryMinusReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/UnaryMinusReader.cs diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/VariableReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/VariableReader.cs similarity index 100% rename from NoStringEvaluating/Services/Parsing/NodeReaders/VariableReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/VariableReader.cs diff --git a/NoStringEvaluating/Services/Parsing/NodeReaders/WordReader.cs b/src/NoStringEvaluating/Services/Parsing/NodeReaders/WordReader.cs similarity index 96% rename from NoStringEvaluating/Services/Parsing/NodeReaders/WordReader.cs rename to src/NoStringEvaluating/Services/Parsing/NodeReaders/WordReader.cs index a38054c..43543a8 100644 --- a/NoStringEvaluating/Services/Parsing/NodeReaders/WordReader.cs +++ b/src/NoStringEvaluating/Services/Parsing/NodeReaders/WordReader.cs @@ -12,7 +12,7 @@ public static class WordReader static WordReader() { - Quotes = new[] { '\'', '"' }.ToHashSet(); + Quotes = ['\'', '"']; } /// diff --git a/NoStringEvaluating/Services/Parsing/PolishNotationService.cs b/src/NoStringEvaluating/Services/Parsing/PolishNotationService.cs similarity index 100% rename from NoStringEvaluating/Services/Parsing/PolishNotationService.cs rename to src/NoStringEvaluating/Services/Parsing/PolishNotationService.cs diff --git a/NoStringEvaluating/Services/Value/WordFormatter.cs b/src/NoStringEvaluating/Services/Value/WordFormatter.cs similarity index 100% rename from NoStringEvaluating/Services/Value/WordFormatter.cs rename to src/NoStringEvaluating/Services/Value/WordFormatter.cs diff --git a/NoStringEvaluating/Services/Variables/KnownVariables.cs b/src/NoStringEvaluating/Services/Variables/KnownVariables.cs similarity index 100% rename from NoStringEvaluating/Services/Variables/KnownVariables.cs rename to src/NoStringEvaluating/Services/Variables/KnownVariables.cs diff --git a/NoStringEvaluating/Services/Variables/VariablesSource.cs b/src/NoStringEvaluating/Services/Variables/VariablesSource.cs similarity index 100% rename from NoStringEvaluating/Services/Variables/VariablesSource.cs rename to src/NoStringEvaluating/Services/Variables/VariablesSource.cs diff --git a/NoStringEvaluating/logo.png b/src/NoStringEvaluating/logo.png similarity index 100% rename from NoStringEvaluating/logo.png rename to src/NoStringEvaluating/logo.png