From 03ee350dd21a73a3dd6119732028c1f9e2526461 Mon Sep 17 00:00:00 2001 From: Cillian O'Driscoll Date: Fri, 15 Nov 2019 11:39:32 +0000 Subject: [PATCH] Added unit tests for item_type_helpers --- src/tests/test_main.cc | 1 + .../libs/item_type_helpers.cc | 266 ++++++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 src/tests/unit-tests/signal-processing-blocks/libs/item_type_helpers.cc diff --git a/src/tests/test_main.cc b/src/tests/test_main.cc index de3a6d513..c93cf5eab 100644 --- a/src/tests/test_main.cc +++ b/src/tests/test_main.cc @@ -92,6 +92,7 @@ DECLARE_string(log_dir); #include "unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc" #include "unit-tests/signal-processing-blocks/sources/unpack_2bit_samples_test.cc" // #include "unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc" +#include "unit-tests/signal-processing-blocks/libs/item_type_helpers.cc" #if OPENCL_BLOCKS_TEST #include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc" diff --git a/src/tests/unit-tests/signal-processing-blocks/libs/item_type_helpers.cc b/src/tests/unit-tests/signal-processing-blocks/libs/item_type_helpers.cc new file mode 100644 index 000000000..a290d2934 --- /dev/null +++ b/src/tests/unit-tests/signal-processing-blocks/libs/item_type_helpers.cc @@ -0,0 +1,266 @@ +/*! + * \file item_type_helpers_test.cc + * \brief This file implements unit tests for the item_type_helpers + * custom block + * \author Cillian O'Driscoll, 2019. cillian.odriscoll (at) gmail.com + * + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "item_type_helpers.h" +#include +#include + +class ItemTypeHelpersTest : public ::testing::Test +{ + protected: + static constexpr size_t N = 1000; + + public: + ItemTypeHelpersTest() + { + std::random_device r; + std::default_random_engine e(r()); + + std::uniform_int_distribution udist_int8(-100,100); + std::uniform_int_distribution udist_int16(-100,100); + std::uniform_real_distribution udist_float(-100,100); + + std::generate( byte_array_in.begin(), byte_array_in.end(), [&udist_int8, &e](){ + return udist_int8(e); } ); + + std::generate( short_array_in.begin(), short_array_in.end(), [&udist_int16, &e](){ + return udist_int16(e); } ); + + std::generate( float_array_in.begin(), float_array_in.end(), [&udist_float, &e](){ + return udist_float(e); } ); + + } + + std::vector valid_item_types = {"byte", "ibyte", "cbyte", + "short", "ishort", "cshort", "float", "gr_complex"}; + + std::vector invalid_item_types = {"i8", "tfgs", "cbite", + "shirt", "qshort", "csort", "flat", "igr_complex"}; + + std::array< int8_t, 2*N > byte_array_in; + std::array< int8_t, 2*N > byte_array_out; + + std::array< int16_t, 2*N > short_array_in; + std::array< int16_t, 2*N > short_array_out; + + std::array< float, 2*N > float_array_in; + std::array< float, 2*N > float_array_out; + + +}; + +TEST_F(ItemTypeHelpersTest, CheckValidTypes) +{ + for (auto &valid_type : valid_item_types) + { + EXPECT_TRUE(item_type_valid(valid_type)); + } + + for (auto &invalid_type : invalid_item_types) + { + EXPECT_FALSE(item_type_valid(invalid_type)); + } +} + +TEST_F(ItemTypeHelpersTest, CheckSizes) +{ + EXPECT_EQ( item_type_size( "byte" ), 1 ); + EXPECT_EQ( item_type_size( "ibyte" ), 1 ); + EXPECT_EQ( item_type_size( "cbyte" ), 2 ); + + EXPECT_EQ( item_type_size( "short" ), 2 ); + EXPECT_EQ( item_type_size( "ishort" ), 2 ); + EXPECT_EQ( item_type_size( "cshort" ), 4 ); + + EXPECT_EQ( item_type_size( "float" ), 4 ); + EXPECT_EQ( item_type_size( "gr_complex" ), 8 ); + + + for (auto &invalid_type : invalid_item_types) + { + EXPECT_EQ(item_type_size(invalid_type), 0); + } +} + +TEST_F(ItemTypeHelpersTest, CheckMakeConverters) +{ + for( auto & input_type : valid_item_types ) + { + for( auto &output_type : valid_item_types ) + { + item_type_converter_t converter = nullptr; + + if( item_type_is_complex(input_type) == item_type_is_complex(output_type) ) + { + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr ); + } + else + { + EXPECT_THROW( converter = make_vector_converter(input_type, output_type), std::runtime_error ); + } + + } + } +} + +TEST_F(ItemTypeHelpersTest, CheckConversionsReal) +{ + std::string input_type = "byte"; + std::string output_type = "byte"; + item_type_converter_t converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( byte_array_out.data(), byte_array_in.data(), N ); + EXPECT_TRUE( std::equal( byte_array_in.begin(), byte_array_in.begin() + N, byte_array_out.begin() ) ); + + input_type = "byte"; + output_type = "short"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( short_array_out.data(), byte_array_in.data(), N ); + converter = make_vector_converter( output_type, input_type ); + EXPECT_NE( converter, nullptr); + converter( byte_array_out.data(), short_array_out.data(), N ); + EXPECT_TRUE( std::equal( byte_array_out.begin(), byte_array_out.begin() + N, byte_array_in.begin() ) ); + + input_type = "byte"; + output_type = "float"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( float_array_out.data(), byte_array_in.data(), N ); + converter = make_vector_converter( output_type, input_type ); + EXPECT_NE( converter, nullptr); + converter( byte_array_out.data(), float_array_out.data(), N ); + EXPECT_TRUE( std::equal( byte_array_out.begin(), byte_array_out.begin() + N, byte_array_in.begin() ) ); + + input_type = "short"; + output_type = "short"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( short_array_out.data(), short_array_in.data(), N ); + EXPECT_TRUE( std::equal( short_array_in.begin(), short_array_in.begin() + N, short_array_out.begin() ) ); + + input_type = "short"; + output_type = "float"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( float_array_out.data(), short_array_in.data(), N ); + converter = make_vector_converter( output_type, input_type ); + EXPECT_NE( converter, nullptr); + converter( short_array_out.data(), float_array_out.data(), N ); + EXPECT_TRUE( std::equal( short_array_out.begin(), short_array_out.begin() + N, short_array_in.begin() ) ); + + input_type = "float"; + output_type = "float"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( float_array_out.data(), float_array_in.data(), N ); + EXPECT_TRUE( std::equal( float_array_in.begin(), float_array_in.begin() + N, float_array_out.begin() ) ); +} + +TEST_F(ItemTypeHelpersTest, CheckConversionsComplex) +{ + std::string input_type = "cbyte"; + std::string output_type = "cbyte"; + item_type_converter_t converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( byte_array_out.data(), byte_array_in.data(), N ); + EXPECT_TRUE( std::equal( byte_array_in.begin(), byte_array_in.begin() + N, byte_array_out.begin() ) ); + + input_type = "cbyte"; + output_type = "ibyte"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( byte_array_out.data(), byte_array_in.data(), N ); + EXPECT_TRUE( std::equal( byte_array_in.begin(), byte_array_in.begin() + N, byte_array_out.begin() ) ); + + input_type = "cbyte"; + output_type = "cshort"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( short_array_out.data(), byte_array_in.data(), N ); + converter = make_vector_converter( output_type, input_type ); + EXPECT_NE( converter, nullptr); + converter( byte_array_out.data(), short_array_out.data(), N ); + EXPECT_TRUE( std::equal( byte_array_out.begin(), byte_array_out.begin() + N, byte_array_in.begin() ) ); + + input_type = "cbyte"; + output_type = "ishort"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( short_array_out.data(), byte_array_in.data(), N ); + converter = make_vector_converter( output_type, input_type ); + EXPECT_NE( converter, nullptr); + converter( byte_array_out.data(), short_array_out.data(), N ); + EXPECT_TRUE( std::equal( byte_array_out.begin(), byte_array_out.begin() + N, byte_array_in.begin() ) ); + + input_type = "cbyte"; + output_type = "gr_complex"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( float_array_out.data(), byte_array_in.data(), N ); + converter = make_vector_converter( output_type, input_type ); + EXPECT_NE( converter, nullptr); + converter( byte_array_out.data(), float_array_out.data(), N ); + EXPECT_TRUE( std::equal( byte_array_out.begin(), byte_array_out.begin() + N, byte_array_in.begin() ) ); + + input_type = "cshort"; + output_type = "cshort"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( short_array_out.data(), short_array_in.data(), N ); + EXPECT_TRUE( std::equal( short_array_in.begin(), short_array_in.begin() + N, short_array_out.begin() ) ); + + input_type = "cshort"; + output_type = "ishort"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( short_array_out.data(), short_array_in.data(), N ); + EXPECT_TRUE( std::equal( short_array_in.begin(), short_array_in.begin() + N, short_array_out.begin() ) ); + + input_type = "cshort"; + output_type = "gr_complex"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( float_array_out.data(), short_array_in.data(), N ); + converter = make_vector_converter( output_type, input_type ); + EXPECT_NE( converter, nullptr); + converter( short_array_out.data(), float_array_out.data(), N ); + EXPECT_TRUE( std::equal( short_array_out.begin(), short_array_out.begin() + N, short_array_in.begin() ) ); + + input_type = "gr_complex"; + output_type = "gr_complex"; + converter = make_vector_converter( input_type, output_type ); + EXPECT_NE( converter, nullptr); + converter( float_array_out.data(), float_array_in.data(), N ); + EXPECT_TRUE( std::equal( float_array_in.begin(), float_array_in.begin() + N, float_array_out.begin() ) ); +}