DryChem 1.0.0
A generic, compile-time C++ toolbox with no dependencies for the modern computational chemistry project.
Loading...
Searching...
No Matches
testBasicMathFunctions.hpp
Go to the documentation of this file.
1// Copyright (c) 2020-2025 Cody R. Drisko. All rights reserved.
2// Licensed under the MIT License. See the LICENSE file in the project root for more information.
3//
4// Name: testBasicMathFunctions.hpp
5// Author: crdrisko
6// Date: 08/25/2020-20:34:50
7// Description: Provides ~100% unit test coverage over all basic mathematical functions in the CppUnits library
8
9#ifndef DRYCHEM_CPP_UNITS_TESTS_TESTMATHFUNCTIONS_TESTBASICMATHFUNCTIONS_HPP
10#define DRYCHEM_CPP_UNITS_TESTS_TESTMATHFUNCTIONS_TESTBASICMATHFUNCTIONS_HPP
11
12#include <cmath>
13
14#include <common-utils/math.hpp>
15#include <gtest/gtest.h>
16
18
19using namespace CppUnits;
20using namespace CppUnits::Literals;
21
22GTEST_TEST(testBasicMathFunctions, absoluteValueReturnsPositiveValueOfPhysicalQuantity)
23{
24 constexpr Length positiveLength = 1.0_m;
25 constexpr Length negativeLength = -1.0_m;
26
27 ASSERT_TRUE(Math::abs(positiveLength) == Math::abs(negativeLength));
28 ASSERT_FALSE(Math::abs(negativeLength) == negativeLength);
29}
30
31GTEST_TEST(testBasicMathFunctions, exponentialFunctionOverloadsAreEquivalentToTheirCorrespondingCmathFunctions)
32{
33 constexpr Length length = 2.0_m;
34
35 ASSERT_DOUBLE_EQ(std::exp(length.getMagnitude()), Math::exp(length).getMagnitude());
36 ASSERT_DOUBLE_EQ(std::exp2(length.getMagnitude()), Math::exp2(length).getMagnitude());
37 ASSERT_DOUBLE_EQ(std::log(length.getMagnitude()), Math::log(length).getMagnitude());
38 ASSERT_DOUBLE_EQ(std::log2(length.getMagnitude()), Math::log2(length).getMagnitude());
39 ASSERT_DOUBLE_EQ(std::log10(length.getMagnitude()), Math::log10(length).getMagnitude());
40}
41
42GTEST_TEST(testBasicMathFunctions, powerFunctionOverloadsAreEquivalentToTheirCorrespondingCmathFunctions)
43{
44 constexpr Length length1 = 5.0_m;
45 constexpr WaveNumber waveNumber = Math::pow<-1>(length1);
46 constexpr DimensionlessQuantity dimless = Math::pow<0>(length1);
47
48 ASSERT_DOUBLE_EQ(0.2, waveNumber.getMagnitude());
49 ASSERT_DOUBLE_EQ(1.0, dimless.getMagnitude());
50
51 ASSERT_DOUBLE_EQ(25.0, Math::pow<2>(length1).getMagnitude());
52 ASSERT_TRUE(length1 * length1 == Math::pow<2>(length1));
53
54 ASSERT_DOUBLE_EQ(125.0, Math::pow<3>(length1).getMagnitude());
55 ASSERT_TRUE(length1 * length1 * length1 == Math::pow<3>(length1));
56
57 constexpr Area area = 64.0_m2;
58 constexpr Volume volume = 64.0_m3;
59
60 ASSERT_EQ(8.0_m, Math::sqrt(area));
61 ASSERT_EQ(4.0_m, Math::cbrt(volume));
62}
63
64GTEST_TEST(testBasicMathFunctions, trigonometricFunctionOverloadsAreEquivalentToTheirCorrespondingCmathFunctions)
65{
66 constexpr Angle angle = 2.0_rad * Constants::pi;
67
68 ASSERT_DOUBLE_EQ(std::sin(angle.getMagnitude()), Math::sin(angle).getMagnitude());
69 ASSERT_DOUBLE_EQ(std::cos(angle.getMagnitude()), Math::cos(angle).getMagnitude());
70 ASSERT_DOUBLE_EQ(std::tan(angle.getMagnitude()), Math::tan(angle).getMagnitude());
71 ASSERT_DOUBLE_EQ(std::tanh(angle.getMagnitude()), Math::tanh(angle).getMagnitude());
72
73 ASSERT_TRUE(std::isnan(Math::asin(angle).getMagnitude()));
74 ASSERT_TRUE(std::isnan(Math::acos(angle).getMagnitude()));
75}
76
77GTEST_TEST(testBasicMathFunctions, hyperbolicFunctionOverloadsAreEquivalentToTheirCorrespondingCmathFunctions)
78{
79 constexpr Angle angle = 2.0_rad * Constants::pi;
80
81 ASSERT_DOUBLE_EQ(std::sinh(angle.getMagnitude()), Math::sinh(angle).getMagnitude());
82 ASSERT_DOUBLE_EQ(std::cosh(angle.getMagnitude()), Math::cosh(angle).getMagnitude());
83 ASSERT_DOUBLE_EQ(std::tanh(angle.getMagnitude()), Math::tanh(angle).getMagnitude());
84 ASSERT_DOUBLE_EQ(std::asinh(angle.getMagnitude()), Math::asinh(angle).getMagnitude());
85 ASSERT_DOUBLE_EQ(std::acosh(angle.getMagnitude()), Math::acosh(angle).getMagnitude());
86 ASSERT_DOUBLE_EQ(std::acosh(angle.getMagnitude()), Math::acosh(angle).getMagnitude());
87}
88
89#endif
constexpr long double getMagnitude() const noexcept
Definition physicalQuantity.hpp:50
GTEST_TEST(testBasicMathFunctions, absoluteValueReturnsPositiveValueOfPhysicalQuantity)
Definition testBasicMathFunctions.hpp:22
constexpr DimensionlessQuantity pi
Definition physicalQuantities.hpp:213
Definition physicalQuantities.hpp:94
constexpr auto sqrt(const PhysicalQuantity< Dimensionality< L, M, T, I, Th, N, J > > &physicalQuantity) noexcept
Definition basicMath.hpp:85
constexpr auto pow(const PhysicalQuantity< Dimensionality< L, M, T, I, Th, N, J > > &physicalQuantity) noexcept
Definition basicMath.hpp:74
constexpr auto cbrt(const PhysicalQuantity< Dimensionality< L, M, T, I, Th, N, J > > &physicalQuantity) noexcept
Definition basicMath.hpp:94
Definition basicMath.hpp:17
PhysicalQuantity< Dimensionality< 2, 0, 0 > > Area
Definition physicalQuantities.hpp:42
PhysicalQuantity< Dimensionality< 0, 0, 0 > > Angle
Definition physicalQuantities.hpp:31
PhysicalQuantity< Dimensionality<> > DimensionlessQuantity
Definition physicalQuantities.hpp:22
PhysicalQuantity< Dimensionality<-1, 0, 0 > > WaveNumber
Definition physicalQuantities.hpp:27
PhysicalQuantity< Dimensionality< 3, 0, 0 > > Volume
Definition physicalQuantities.hpp:48
PhysicalQuantity< Dimensionality< 1, 0, 0 > > Length
Definition physicalQuantities.hpp:37