@@ -235,13 +235,88 @@ TEST_F(IniParserTest, HandlesCRLFFiles)
235235 EXPECT_STREQ (value, " value" );
236236}
237237
238+ TEST_F (IniParserTest, HandlesCRLineEndings)
239+ {
240+ const char *content = " [section]\r key=value\r " ;
241+ ASSERT_TRUE (LoadIniContent (content));
242+ char value[INI_MAX_LINE_LENGTH];
243+ EXPECT_TRUE (ini_getValue (&ctx, " section" , " key" , value, sizeof (value)));
244+ EXPECT_STREQ (value, " value" );
245+ }
246+
247+ TEST_F (IniParserTest, HandlesMixedLineEndings)
248+ {
249+ const char *content =
250+ " [crlf]\r\n "
251+ " key1=value1\r\n "
252+ " [lf]\n "
253+ " key2=value2\n "
254+ " [cr]\r "
255+ " key3=value3\r " ;
256+ ASSERT_TRUE (LoadIniContent (content));
257+ char value[INI_MAX_LINE_LENGTH];
258+ EXPECT_TRUE (ini_getValue (&ctx, " crlf" , " key1" , value, sizeof (value)));
259+ EXPECT_STREQ (value, " value1" );
260+ EXPECT_TRUE (ini_getValue (&ctx, " lf" , " key2" , value, sizeof (value)));
261+ EXPECT_STREQ (value, " value2" );
262+ EXPECT_TRUE (ini_getValue (&ctx, " cr" , " key3" , value, sizeof (value)));
263+ EXPECT_STREQ (value, " value3" );
264+ }
265+
266+ TEST_F (IniParserTest, HandlesMaxLengthLines)
267+ {
268+ // Section: [aaaaa...] (INI_MAX_LINE_LENGTH - 3 chars)
269+ const size_t section_len = INI_MAX_LINE_LENGTH - 3 ;
270+ std::string section_name (section_len, ' a' );
271+ // Key & value: "key=value" within line limit
272+ const size_t kv_len = (INI_MAX_LINE_LENGTH - 1 ) / 2 - 1 ; // Half for key, half for value
273+ std::string key (kv_len, ' b' );
274+ std::string value (kv_len, ' c' );
275+ std::string content =
276+ " [" + section_name + " ]\n " +
277+ key + " =" + value;
278+ ASSERT_TRUE (ini_initialize (&ctx, content.c_str (), content.size ()));
279+ char result[INI_MAX_LINE_LENGTH];
280+ EXPECT_TRUE (ini_getValue (&ctx, section_name.c_str (), key.c_str (), result, sizeof (result)));
281+ EXPECT_STREQ (result, value.c_str ());
282+ }
283+
238284TEST_F (IniParserTest, MaxLineLengthHandling)
239285{
240286 std::string long_line (INI_MAX_LINE_LENGTH * 2 , ' a' );
241287 std::string content = " [section]\n " + long_line + " \n " ;
242288 ASSERT_TRUE (ini_initialize (&ctx, content.c_str (), content.size ()));
243289}
244290
291+ TEST_F (IniParserTest, HandlesWhitespaceOnlySections)
292+ {
293+ const char *content =
294+ " [ ]\n " // Invalid empty section
295+ " [ valid ]\n " // Valid section
296+ " key=value\n " ;
297+ ASSERT_TRUE (LoadIniContent (content));
298+ EXPECT_FALSE (ini_hasSection (&ctx, " " ));
299+ EXPECT_TRUE (ini_hasSection (&ctx, " valid" ));
300+ }
301+
302+ TEST_F (IniParserTest, HandlesCaseSensitivityWhenEnabled)
303+ {
304+ #ifdef INI_ENABLE_CASE_SENSITIVITY
305+ const char *content = " [Section]\n Key=Value\n " ;
306+ ASSERT_TRUE (LoadIniContent (content));
307+ char value[INI_MAX_LINE_LENGTH];
308+ EXPECT_FALSE (ini_getValue (&ctx, " section" , " key" , value, sizeof (value)));
309+ EXPECT_TRUE (ini_getValue (&ctx, " Section" , " Key" , value, sizeof (value)));
310+ EXPECT_STREQ (value, " Value" );
311+ #endif
312+ }
313+
314+ TEST_F (IniParserTest, DetectsUnclosedSectionHeaders)
315+ {
316+ const char *content = " [section\n key=value" ;
317+ ASSERT_FALSE (LoadIniContent (content));
318+ }
319+
245320TEST_F (IniParserTest, MemorySafetyOnInvalidInput)
246321{
247322 const char *content = " [section\n key=value" ; // Missing ] and unterminated quote
0 commit comments