1+ #include " contains_duplicate.h"
2+
3+ #include < gtest/gtest.h>
4+ #include < climits>
5+ #include < string>
6+ #include < vector>
7+
8+ struct ContainsDuplicateCase {
9+ std::string test_name;
10+ std::vector<int > nums;
11+ bool expected;
12+ };
13+
14+ using ContainsDuplicateTest = ::testing::TestWithParam<ContainsDuplicateCase>;
15+
16+ TEST_P (ContainsDuplicateTest, TestCases) {
17+ const ContainsDuplicateCase &testCase = GetParam ();
18+ std::vector<int > nums = testCase.nums ; // Copy since function takes non-const reference
19+ const bool result = containsDuplicate (nums);
20+ EXPECT_EQ (result, testCase.expected );
21+ }
22+
23+ INSTANTIATE_TEST_SUITE_P (
24+ ContainsDuplicateTestCases, ContainsDuplicateTest,
25+ ::testing::Values (
26+ // Boundary conditions
27+ ContainsDuplicateCase{.test_name = " EmptyArray" , .nums = {}, .expected = false },
28+ ContainsDuplicateCase{.test_name = " SingleElement" , .nums = {42 }, .expected = false },
29+
30+ // Basic cases
31+ ContainsDuplicateCase{.test_name = " TwoUnique" , .nums = {1 , 2 }, .expected = false },
32+ ContainsDuplicateCase{.test_name = " TwoDuplicate" , .nums = {1 , 1 }, .expected = true },
33+ ContainsDuplicateCase{.test_name = " ThreeUnique" , .nums = {1 , 2 , 3 }, .expected = false },
34+ ContainsDuplicateCase{
35+ .test_name = " ThreeWithDuplicate" , .nums = {1 , 2 , 1 }, .expected = true },
36+
37+ // Edge cases with special values
38+ ContainsDuplicateCase{.test_name = " ZeroDuplicate" , .nums = {0 , 1 , 0 }, .expected = true },
39+ ContainsDuplicateCase{
40+ .test_name = " NegativeDuplicate" , .nums = {-1 , -2 , -1 }, .expected = true },
41+ ContainsDuplicateCase{
42+ .test_name = " MinMaxValues" , .nums = {INT_MIN, INT_MAX, INT_MIN}, .expected = true },
43+
44+ // Position sensitivity
45+ ContainsDuplicateCase{
46+ .test_name = " DuplicateAtEnd" , .nums = {1 , 2 , 3 , 4 , 5 , 1 }, .expected = true },
47+ ContainsDuplicateCase{
48+ .test_name = " DuplicateAtBoundaries" , .nums = {5 , 1 , 2 , 3 , 4 , 5 }, .expected = true },
49+
50+ // Performance edge cases
51+ ContainsDuplicateCase{.test_name = " LargeUniqueArray" ,
52+ .nums =
53+ []() {
54+ std::vector<int > v;
55+ v.reserve (100 );
56+ for (int i = 0 ; i < 100 ; ++i) {
57+ v.push_back (i);
58+ }
59+ return v;
60+ }(),
61+ .expected = false },
62+ ContainsDuplicateCase{.test_name = " ManyDuplicates" ,
63+ .nums =
64+ []() {
65+ std::vector<int > v (50 , 1 );
66+ v.push_back (2 );
67+ return v;
68+ }(),
69+ .expected = true },
70+ ContainsDuplicateCase{.test_name = " LargeArrayOneDuplicate" ,
71+ .nums =
72+ []() {
73+ std::vector<int > v;
74+ v.reserve (5001 );
75+ for (int i = 0 ; i < 5000 ; ++i) {
76+ v.push_back (i);
77+ }
78+ v.push_back (2500 ); // Introduce a single duplicate
79+ return v;
80+ }(),
81+ .expected = true }),
82+ [](const ::testing::TestParamInfo<ContainsDuplicateCase> &info) {
83+ return info.param .test_name ;
84+ });
0 commit comments