#include "gtest/gtest.h" #include "RiaWeightedGeometricMeanCalculator.h" #include //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- TEST( RiaWeightedGeometricMeanCalculator, BasicUsage ) { { RiaWeightedGeometricMeanCalculator calc; EXPECT_DOUBLE_EQ( 0.0, calc.aggregatedWeight() ); EXPECT_DOUBLE_EQ( 0.0, calc.weightedMean() ); } { RiaWeightedGeometricMeanCalculator calc; std::vector values{ 30.0, 60.0 }; std::vector weights{ 1.5, 3.5 }; for ( size_t i = 0; i < values.size(); i++ ) { calc.addValueAndWeight( values[i], weights[i] ); } double expectedValue = std::pow( std::pow( 30.0, 1.5 ) * std::pow( 60.0, 3.5 ), 1 / ( 1.5 + 3.5 ) ); EXPECT_DOUBLE_EQ( 5.0, calc.aggregatedWeight() ); EXPECT_NEAR( expectedValue, calc.weightedMean(), 1e-10 ); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- TEST( RiaWeightedGeometricMeanCalculator, BigValues ) { RiaWeightedGeometricMeanCalculator calc; std::vector values{ 3000000.0, 6000000.0, 1250000, 2200000 }; std::vector weights{ 1.5, 3.5, 7, 5 }; for ( size_t i = 0; i < values.size(); i++ ) { calc.addValueAndWeight( values[i], weights[i] ); } double expectedValue = std::pow( std::pow( 3000000.0, 1.5 ) * std::pow( 6000000.0, 3.5 ) * std::pow( 1250000.0, 7 ) * std::pow( 2200000.0, 5 ), 1 / ( 1.5 + 3.5 + 7 + 5 ) ); EXPECT_DOUBLE_EQ( 17.0, calc.aggregatedWeight() ); EXPECT_NEAR( expectedValue, calc.weightedMean(), 1e-8 ); }