//
// Copyright 2018 Ettus Research, a National Instruments Company
//
// SPDX-License-Identifier: GPL-3.0-or-later
//

#include <uhd/types/dict.hpp>
#include <uhdlib/utils/eeprom_utils.hpp>
#include <boost/test/unit_test.hpp>

class upper_case_char
{
public:
    upper_case_char(char ch)
    {
        value = ch;
    }
    static upper_case_char from_string(std::string str)
    {
        return upper_case_char(toupper(str[0]));
    }
    std::string to_string()
    {
        return std::string(1, value);
    }

private:
    char value;
};

BOOST_AUTO_TEST_CASE(test_eeprom_duplicate_check)
{
    const uhd::dict<std::string, std::string> curr_eeprom{
        {"0", "A"}, {"1", "B"}, {"2", "C"}};
    const uhd::dict<std::string, std::string> new_eeprom_no_dups{{"0", "d"}, {"1", "e"}};
    const uhd::dict<std::string, std::string> new_eeprom_dups_in_curr{{"0", "b"}};
    const uhd::dict<std::string, std::string> new_eeprom_dups_in_new{
        {"0", "c"}, {"1", "c"}};
    const uhd::dict<std::string, std::string> new_eeprom_dups_in_both{
        {"0", "b"}, {"1", "B"}};
    const std::vector<std::string> keys{"0", "1", "2"};

    BOOST_CHECK_EQUAL(check_for_duplicates("TEST",
                          new_eeprom_no_dups,
                          curr_eeprom,
                          "Test Value",
                          keys,
                          [](const std::string& str) {
                              return upper_case_char::from_string(str).to_string();
                          }),
        false);
    BOOST_CHECK(check_for_duplicates("TEST",
        new_eeprom_dups_in_curr,
        curr_eeprom,
        "Test Value",
        keys,
        [](const std::string& str) {
            return upper_case_char::from_string(str).to_string();
        }));
    BOOST_CHECK(check_for_duplicates("TEST",
        new_eeprom_dups_in_new,
        curr_eeprom,
        "Test Value",
        keys,
        [](const std::string& str) {
            return upper_case_char::from_string(str).to_string();
        }));
    BOOST_CHECK(check_for_duplicates("TEST",
        new_eeprom_dups_in_both,
        curr_eeprom,
        "Test Value",
        keys,
        [](const std::string& str) {
            return upper_case_char::from_string(str).to_string();
        }));
}
