#include <gtest/gtest.h>

#include <stdint.h>
#include <string.h>

#include <string>

#define CPUINFO_BUILD_PROP_VALUE_MAX 92
#define CPUINFO_ARM_CHIPSET_NAME_MAX 48

extern "C" void cpuinfo_arm_android_parse_ro_chipname(
	const char chipname[CPUINFO_BUILD_PROP_VALUE_MAX],
	uint32_t cores,
	uint32_t max_cpu_freq_max,
	char chipset_name[CPUINFO_ARM_CHIPSET_NAME_MAX]);

inline std::string parse_ro_chipname(
	std::string chipname, uint32_t cores=1, uint32_t max_cpu_freq_max=0)
{
	char chipname_buffer[CPUINFO_BUILD_PROP_VALUE_MAX];
	strncpy(chipname_buffer, chipname.c_str(), CPUINFO_BUILD_PROP_VALUE_MAX);
	char chipset_name[CPUINFO_ARM_CHIPSET_NAME_MAX];
	cpuinfo_arm_android_parse_ro_chipname(
		chipname_buffer, cores, max_cpu_freq_max, chipset_name);
	return std::string(chipset_name, strnlen(chipset_name, CPUINFO_ARM_CHIPSET_NAME_MAX));
}

TEST(RO_CHIPNAME, qualcomm_msm) {
	EXPECT_EQ("Qualcomm MSM7630",
		parse_ro_chipname("MSM7630_SURF"));
	EXPECT_EQ("Qualcomm MSM8210",
		parse_ro_chipname("MSM8210"));
	EXPECT_EQ("Qualcomm MSM8226",
		parse_ro_chipname("MSM8226"));
	EXPECT_EQ("Qualcomm MSM8228",
		parse_ro_chipname("MSM8228"));
	EXPECT_EQ("Qualcomm MSM8230AB",
		parse_ro_chipname("MSM8230AB"));
	EXPECT_EQ("Qualcomm MSM8230VV",
		parse_ro_chipname("MSM8230VV"));
	EXPECT_EQ("Qualcomm MSM8239",
		parse_ro_chipname("MSM8239"));
	EXPECT_EQ("Qualcomm MSM8260A",
		parse_ro_chipname("MSM8260A"));
	EXPECT_EQ("Qualcomm MSM8274",
		parse_ro_chipname("MSM8274"));
	EXPECT_EQ("Qualcomm MSM8610",
		parse_ro_chipname("MSM8610", 2));
	EXPECT_EQ("Qualcomm MSM8626",
		parse_ro_chipname("MSM8626"));
	EXPECT_EQ("Qualcomm MSM8660",
		parse_ro_chipname("MSM8660_SURF"));
	EXPECT_EQ("Qualcomm MSM8674",
		parse_ro_chipname("MSM8674"));
	EXPECT_EQ("Qualcomm MSM8674PRO",
		parse_ro_chipname("MSM8674PRO"));
	EXPECT_EQ("Qualcomm MSM8916",
		parse_ro_chipname("MSM8216"));
	EXPECT_EQ("Qualcomm MSM8916",
		parse_ro_chipname("MSM8916", 4));
	EXPECT_EQ("Qualcomm MSM8916",
		parse_ro_chipname("msm8916", 4));
	EXPECT_EQ("Qualcomm MSM8917",
		parse_ro_chipname("MSM8937", 4));
	EXPECT_EQ("Qualcomm MSM8926",
		parse_ro_chipname("MSM8926"));
	EXPECT_EQ("Qualcomm MSM8928",
		parse_ro_chipname("MSM8928"));
	EXPECT_EQ("Qualcomm MSM8929",
		parse_ro_chipname("MSM8929"));
	EXPECT_EQ("Qualcomm MSM8930",
		parse_ro_chipname("MSM8930"));
	EXPECT_EQ("Qualcomm MSM8930AB",
		parse_ro_chipname("MSM8930AB"));
	EXPECT_EQ("Qualcomm MSM8930VV",
		parse_ro_chipname("MSM8930VV"));
	EXPECT_EQ("Qualcomm MSM8939",
		parse_ro_chipname("MSM8939"));
	EXPECT_EQ("Qualcomm MSM8952",
		parse_ro_chipname("MSM8952"));
	EXPECT_EQ("Qualcomm MSM8953",
		parse_ro_chipname("MSM8953"));
	EXPECT_EQ("Qualcomm MSM8960",
		parse_ro_chipname("MSM8960", 2));
	EXPECT_EQ("Qualcomm MSM8974",
		parse_ro_chipname("MSM8974"));
	EXPECT_EQ("Qualcomm MSM8974PRO",
		parse_ro_chipname("MSM8974PRO"));
	EXPECT_EQ("Qualcomm MSM8976",
		parse_ro_chipname("MSM8976"));
	EXPECT_EQ("Qualcomm MSM8996",
		parse_ro_chipname("MSM8996", 4));
	EXPECT_EQ("Qualcomm MSM8998",
		parse_ro_chipname("MSM8998"));
}

TEST(RO_CHIPNAME, qualcomm_apq) {
	EXPECT_EQ("Qualcomm APQ8016",
		parse_ro_chipname("APQ8016"));
	EXPECT_EQ("Qualcomm APQ8026",
		parse_ro_chipname("APQ8026"));
	EXPECT_EQ("Qualcomm APQ8064",
		parse_ro_chipname("apq8064"));
	EXPECT_EQ("Qualcomm APQ8074",
		parse_ro_chipname("APQ8074"));
	EXPECT_EQ("Qualcomm APQ8076",
		parse_ro_chipname("APQ8076"));
	EXPECT_EQ("Qualcomm APQ8084",
		parse_ro_chipname("APQ8084"));
}

TEST(RO_CHIPNAME, mediatek_mt) {
	EXPECT_EQ("MediaTek MT6737T",
		parse_ro_chipname("MT6737T"));
	EXPECT_EQ("MediaTek MT6757",
		parse_ro_chipname("MT6757"));
}

TEST(RO_CHIPNAME, samsung_exynos) {
	EXPECT_EQ("Samsung Exynos 3470",
		parse_ro_chipname("exynos3470"));
	EXPECT_EQ("Samsung Exynos 3475",
		parse_ro_chipname("exynos3475"));
	EXPECT_EQ("Samsung Exynos 4415",
		parse_ro_chipname("exynos4415"));
	EXPECT_EQ("Samsung Exynos 5260",
		parse_ro_chipname("exynos5260"));
	EXPECT_EQ("Samsung Exynos 5410",
		parse_ro_chipname("exynos5410"));
	EXPECT_EQ("Samsung Exynos 5420",
		parse_ro_chipname("exynos5420", 4));
	EXPECT_EQ("Samsung Exynos 5422",
		parse_ro_chipname("exynos5422"));
	EXPECT_EQ("Samsung Exynos 5430",
		parse_ro_chipname("exynos5430"));
	EXPECT_EQ("Samsung Exynos 5433",
		parse_ro_chipname("exynos5433"));
	EXPECT_EQ("Samsung Exynos 7420",
		parse_ro_chipname("exynos7420"));
	EXPECT_EQ("Samsung Exynos 7570",
		parse_ro_chipname("exynos7570"));
	EXPECT_EQ("Samsung Exynos 7578",
		parse_ro_chipname("exynos7580", 4));
	EXPECT_EQ("Samsung Exynos 7580",
		parse_ro_chipname("exynos7580", 8));
	EXPECT_EQ("Samsung Exynos 7870",
		parse_ro_chipname("exynos7870"));
	EXPECT_EQ("Samsung Exynos 7880",
		parse_ro_chipname("exynos7880"));
	EXPECT_EQ("Samsung Exynos 8890",
		parse_ro_chipname("exynos8890"));
	EXPECT_EQ("Samsung Exynos 8895",
		parse_ro_chipname("exynos8895"));
}

TEST(RO_CHIPNAME, marvell_pxa) {
	EXPECT_EQ("Marvell PXA1088",
		parse_ro_chipname("PXA1088"));
	EXPECT_EQ("Marvell PXA986",
		parse_ro_chipname("PXA986"));
}

TEST(RO_CHIPNAME, renesas) {
	EXPECT_EQ("Renesas MP5232",
		parse_ro_chipname("mp523x"));
}

TEST(RO_CHIPNAME, spreadtrum) {
	EXPECT_EQ("Spreadtrum SC6815AS",
		parse_ro_chipname("SC6815AS"));
	EXPECT_EQ("Spreadtrum SC7715A",
		parse_ro_chipname("SC7715A"));
	EXPECT_EQ("Spreadtrum SC7715T",
		parse_ro_chipname("SC7715T"));
	EXPECT_EQ("Spreadtrum SC7727S",
		parse_ro_chipname("SC7727S"));
	EXPECT_EQ("Spreadtrum SC7727S",
		parse_ro_chipname("sc7727s"));
	EXPECT_EQ("Spreadtrum SC7727SE",
		parse_ro_chipname("SC7727SE"));
	EXPECT_EQ("Spreadtrum SC7730S",
		parse_ro_chipname("sc7730s"));
	EXPECT_EQ("Spreadtrum SC7730SE",
		parse_ro_chipname("SC7730SE"));
	EXPECT_EQ("Spreadtrum SC7730SW",
		parse_ro_chipname("SC7730SW"));
	EXPECT_EQ("Spreadtrum SC7735S",
		parse_ro_chipname("sc7735s"));
	EXPECT_EQ("Spreadtrum SC9830I",
		parse_ro_chipname("SC9830I"));
}
