/glib-2.33.6/glib/tests/keyfile.c

# · C · 1607 lines · 1272 code · 290 blank · 45 comment · 34 complexity · 0508b6cb6500ba32fcf529c2a433b53d MD5 · raw file

  1. #include <glib.h>
  2. #include <locale.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. static GKeyFile *
  6. load_data (const gchar *data,
  7. GKeyFileFlags flags)
  8. {
  9. GKeyFile *keyfile;
  10. GError *error = NULL;
  11. keyfile = g_key_file_new ();
  12. g_key_file_load_from_data (keyfile, data, -1, flags, &error);
  13. g_assert_no_error (error);
  14. return keyfile;
  15. }
  16. static void
  17. check_error (GError **error,
  18. GQuark domain,
  19. gint code)
  20. {
  21. g_assert_error (*error, domain, code);
  22. g_error_free (*error);
  23. *error = NULL;
  24. }
  25. static void
  26. check_no_error (GError **error)
  27. {
  28. g_assert_no_error (*error);
  29. }
  30. static void
  31. check_string_value (GKeyFile *keyfile,
  32. const gchar *group,
  33. const gchar *key,
  34. const gchar *expected)
  35. {
  36. GError *error = NULL;
  37. gchar *value;
  38. value = g_key_file_get_string (keyfile, group, key, &error);
  39. check_no_error (&error);
  40. g_assert (value != NULL);
  41. g_assert_cmpstr (value, ==, expected);
  42. g_free (value);
  43. }
  44. static void
  45. check_locale_string_value (GKeyFile *keyfile,
  46. const gchar *group,
  47. const gchar *key,
  48. const gchar *locale,
  49. const gchar *expected)
  50. {
  51. GError *error = NULL;
  52. gchar *value;
  53. value = g_key_file_get_locale_string (keyfile, group, key, locale, &error);
  54. check_no_error (&error);
  55. g_assert (value != NULL);
  56. g_assert_cmpstr (value, ==, expected);
  57. g_free (value);
  58. }
  59. static void
  60. check_string_list_value (GKeyFile *keyfile,
  61. const gchar *group,
  62. const gchar *key,
  63. ...)
  64. {
  65. gint i;
  66. gchar *v, **value;
  67. va_list args;
  68. gsize len;
  69. GError *error = NULL;
  70. value = g_key_file_get_string_list (keyfile, group, key, &len, &error);
  71. check_no_error (&error);
  72. g_assert (value != NULL);
  73. va_start (args, key);
  74. i = 0;
  75. v = va_arg (args, gchar*);
  76. while (v)
  77. {
  78. g_assert (value[i] != NULL);
  79. g_assert_cmpstr (v, ==, value[i]);
  80. i++;
  81. v = va_arg (args, gchar*);
  82. }
  83. va_end (args);
  84. g_strfreev (value);
  85. }
  86. static void
  87. check_locale_string_list_value (GKeyFile *keyfile,
  88. const gchar *group,
  89. const gchar *key,
  90. const gchar *locale,
  91. ...)
  92. {
  93. gint i;
  94. gchar *v, **value;
  95. va_list args;
  96. gsize len;
  97. GError *error = NULL;
  98. value = g_key_file_get_locale_string_list (keyfile, group, key, locale, &len, &error);
  99. check_no_error (&error);
  100. g_assert (value != NULL);
  101. va_start (args, locale);
  102. i = 0;
  103. v = va_arg (args, gchar*);
  104. while (v)
  105. {
  106. g_assert (value[i] != NULL);
  107. g_assert_cmpstr (v, ==, value[i]);
  108. i++;
  109. v = va_arg (args, gchar*);
  110. }
  111. va_end (args);
  112. g_strfreev (value);
  113. }
  114. static void
  115. check_integer_list_value (GKeyFile *keyfile,
  116. const gchar *group,
  117. const gchar *key,
  118. ...)
  119. {
  120. gint i;
  121. gint v, *value;
  122. va_list args;
  123. gsize len;
  124. GError *error = NULL;
  125. value = g_key_file_get_integer_list (keyfile, group, key, &len, &error);
  126. check_no_error (&error);
  127. g_assert (value != NULL);
  128. va_start (args, key);
  129. i = 0;
  130. v = va_arg (args, gint);
  131. while (v != -100)
  132. {
  133. g_assert_cmpint (i, <, len);
  134. g_assert_cmpint (value[i], ==, v);
  135. i++;
  136. v = va_arg (args, gint);
  137. }
  138. va_end (args);
  139. g_free (value);
  140. }
  141. static void
  142. check_double_list_value (GKeyFile *keyfile,
  143. const gchar *group,
  144. const gchar *key,
  145. ...)
  146. {
  147. gint i;
  148. gdouble v, *value;
  149. va_list args;
  150. gsize len;
  151. GError *error = NULL;
  152. value = g_key_file_get_double_list (keyfile, group, key, &len, &error);
  153. check_no_error (&error);
  154. g_assert (value != NULL);
  155. va_start (args, key);
  156. i = 0;
  157. v = va_arg (args, gdouble);
  158. while (v != -100)
  159. {
  160. g_assert_cmpint (i, <, len);
  161. g_assert_cmpfloat (value[i], ==, v);
  162. i++;
  163. v = va_arg (args, gdouble);
  164. }
  165. va_end (args);
  166. g_free (value);
  167. }
  168. static void
  169. check_boolean_list_value (GKeyFile *keyfile,
  170. const gchar *group,
  171. const gchar *key,
  172. ...)
  173. {
  174. gint i;
  175. gboolean v, *value;
  176. va_list args;
  177. gsize len;
  178. GError *error = NULL;
  179. value = g_key_file_get_boolean_list (keyfile, group, key, &len, &error);
  180. check_no_error (&error);
  181. g_assert (value != NULL);
  182. va_start (args, key);
  183. i = 0;
  184. v = va_arg (args, gboolean);
  185. while (v != -100)
  186. {
  187. g_assert_cmpint (i, <, len);
  188. g_assert_cmpint (value[i], ==, v);
  189. i++;
  190. v = va_arg (args, gboolean);
  191. }
  192. va_end (args);
  193. g_free (value);
  194. }
  195. static void
  196. check_boolean_value (GKeyFile *keyfile,
  197. const gchar *group,
  198. const gchar *key,
  199. gboolean expected)
  200. {
  201. GError *error = NULL;
  202. gboolean value;
  203. value = g_key_file_get_boolean (keyfile, group, key, &error);
  204. check_no_error (&error);
  205. g_assert_cmpint (value, ==, expected);
  206. }
  207. static void
  208. check_integer_value (GKeyFile *keyfile,
  209. const gchar *group,
  210. const gchar *key,
  211. gint expected)
  212. {
  213. GError *error = NULL;
  214. gint value;
  215. value = g_key_file_get_integer (keyfile, group, key, &error);
  216. check_no_error (&error);
  217. g_assert_cmpint (value, ==, expected);
  218. }
  219. static void
  220. check_double_value (GKeyFile *keyfile,
  221. const gchar *group,
  222. const gchar *key,
  223. gdouble expected)
  224. {
  225. GError *error = NULL;
  226. gdouble value;
  227. value = g_key_file_get_double (keyfile, group, key, &error);
  228. check_no_error (&error);
  229. g_assert_cmpfloat (value, ==, expected);
  230. }
  231. static void
  232. check_name (const gchar *what,
  233. const gchar *value,
  234. const gchar *expected,
  235. gint position)
  236. {
  237. g_assert_cmpstr (value, ==, expected);
  238. }
  239. static void
  240. check_length (const gchar *what,
  241. gint n_items,
  242. gint length,
  243. gint expected)
  244. {
  245. g_assert_cmpint (n_items, ==, length);
  246. g_assert_cmpint (n_items, ==, expected);
  247. }
  248. /* check that both \n and \r\n are accepted as line ends,
  249. * and that stray \r are passed through
  250. */
  251. static void
  252. test_line_ends (void)
  253. {
  254. GKeyFile *keyfile;
  255. const gchar *data =
  256. "[group1]\n"
  257. "key1=value1\n"
  258. "key2=value2\r\n"
  259. "[group2]\r\n"
  260. "key3=value3\r\r\n"
  261. "key4=value4\n";
  262. keyfile = load_data (data, 0);
  263. check_string_value (keyfile, "group1", "key1", "value1");
  264. check_string_value (keyfile, "group1", "key2", "value2");
  265. check_string_value (keyfile, "group2", "key3", "value3\r");
  266. check_string_value (keyfile, "group2", "key4", "value4");
  267. g_key_file_free (keyfile);
  268. }
  269. /* check handling of whitespace
  270. */
  271. static void
  272. test_whitespace (void)
  273. {
  274. GKeyFile *keyfile;
  275. const gchar *data =
  276. "[group1]\n"
  277. "key1 = value1\n"
  278. "key2\t=\tvalue2\n"
  279. " [ group2 ] \n"
  280. "key3 = value3 \n"
  281. "key4 = value \t4\n"
  282. " key5 = value5\n";
  283. keyfile = load_data (data, 0);
  284. check_string_value (keyfile, "group1", "key1", "value1");
  285. check_string_value (keyfile, "group1", "key2", "value2");
  286. check_string_value (keyfile, " group2 ", "key3", "value3 ");
  287. check_string_value (keyfile, " group2 ", "key4", "value \t4");
  288. check_string_value (keyfile, " group2 ", "key5", "value5");
  289. g_key_file_free (keyfile);
  290. }
  291. /* check handling of comments
  292. */
  293. static void
  294. test_comments (void)
  295. {
  296. GKeyFile *keyfile;
  297. gchar **names;
  298. gsize len;
  299. GError *error = NULL;
  300. gchar *comment;
  301. const gchar *data =
  302. "# top comment\n"
  303. "# top comment, continued\n"
  304. "[group1]\n"
  305. "key1 = value1\n"
  306. "# key comment\n"
  307. "# key comment, continued\n"
  308. "key2 = value2\n"
  309. "# line end check\r\n"
  310. "key3 = value3\n"
  311. "key4 = value4\n"
  312. "# group comment\n"
  313. "# group comment, continued\n"
  314. "[group2]\n";
  315. const gchar *top_comment= " top comment\n top comment, continued\n";
  316. const gchar *group_comment= " group comment\n group comment, continued\n";
  317. const gchar *key_comment= " key comment\n key comment, continued\n";
  318. keyfile = load_data (data, 0);
  319. check_string_value (keyfile, "group1", "key1", "value1");
  320. check_string_value (keyfile, "group1", "key2", "value2");
  321. check_string_value (keyfile, "group1", "key3", "value3");
  322. check_string_value (keyfile, "group1", "key4", "value4");
  323. names = g_key_file_get_keys (keyfile, "group1", &len, &error);
  324. check_no_error (&error);
  325. check_length ("keys", g_strv_length (names), len, 4);
  326. check_name ("key", names[0], "key1", 0);
  327. check_name ("key", names[1], "key2", 1);
  328. check_name ("key", names[2], "key3", 2);
  329. check_name ("key", names[3], "key4", 3);
  330. g_strfreev (names);
  331. g_key_file_free (keyfile);
  332. keyfile = load_data (data, G_KEY_FILE_KEEP_COMMENTS);
  333. names = g_key_file_get_keys (keyfile, "group1", &len, &error);
  334. check_no_error (&error);
  335. check_length ("keys", g_strv_length (names), len, 4);
  336. check_name ("key", names[0], "key1", 0);
  337. check_name ("key", names[1], "key2", 1);
  338. check_name ("key", names[2], "key3", 2);
  339. check_name ("key", names[3], "key4", 3);
  340. g_strfreev (names);
  341. comment = g_key_file_get_comment (keyfile, NULL, NULL, &error);
  342. check_no_error (&error);
  343. check_name ("top comment", comment, top_comment, 0);
  344. g_free (comment);
  345. comment = g_key_file_get_comment (keyfile, "group1", "key2", &error);
  346. check_no_error (&error);
  347. check_name ("key comment", comment, key_comment, 0);
  348. g_free (comment);
  349. g_key_file_remove_comment (keyfile, "group1", "key2", &error);
  350. check_no_error (&error);
  351. comment = g_key_file_get_comment (keyfile, "group1", "key2", &error);
  352. check_no_error (&error);
  353. g_assert (comment == NULL);
  354. comment = g_key_file_get_comment (keyfile, "group2", NULL, &error);
  355. check_no_error (&error);
  356. check_name ("group comment", comment, group_comment, 0);
  357. g_free (comment);
  358. comment = g_key_file_get_comment (keyfile, "group3", NULL, &error);
  359. check_error (&error,
  360. G_KEY_FILE_ERROR,
  361. G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  362. g_assert (comment == NULL);
  363. g_key_file_free (keyfile);
  364. }
  365. /* check key and group listing */
  366. static void
  367. test_listing (void)
  368. {
  369. GKeyFile *keyfile;
  370. gchar **names;
  371. gsize len;
  372. gchar *start;
  373. GError *error = NULL;
  374. const gchar *data =
  375. "[group1]\n"
  376. "key1=value1\n"
  377. "key2=value2\n"
  378. "[group2]\n"
  379. "key3=value3\n"
  380. "key4=value4\n";
  381. keyfile = load_data (data, 0);
  382. names = g_key_file_get_groups (keyfile, &len);
  383. g_assert (names != NULL);
  384. check_length ("groups", g_strv_length (names), len, 2);
  385. check_name ("group name", names[0], "group1", 0);
  386. check_name ("group name", names[1], "group2", 1);
  387. g_strfreev (names);
  388. names = g_key_file_get_keys (keyfile, "group1", &len, &error);
  389. check_no_error (&error);
  390. check_length ("keys", g_strv_length (names), len, 2);
  391. check_name ("key", names[0], "key1", 0);
  392. check_name ("key", names[1], "key2", 1);
  393. g_strfreev (names);
  394. names = g_key_file_get_keys (keyfile, "no-such-group", &len, &error);
  395. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  396. g_strfreev (names);
  397. g_assert (g_key_file_has_group (keyfile, "group1"));
  398. g_assert (g_key_file_has_group (keyfile, "group2"));
  399. g_assert (!g_key_file_has_group (keyfile, "group10"));
  400. g_assert (!g_key_file_has_group (keyfile, "group20"));
  401. start = g_key_file_get_start_group (keyfile);
  402. g_assert_cmpstr (start, ==, "group1");
  403. g_free (start);
  404. g_assert (g_key_file_has_key (keyfile, "group1", "key1", &error));
  405. check_no_error (&error);
  406. g_assert (g_key_file_has_key (keyfile, "group2", "key3", &error));
  407. check_no_error (&error);
  408. g_assert (!g_key_file_has_key (keyfile, "group2", "no-such-key", NULL));
  409. g_key_file_has_key (keyfile, "no-such-group", "key", &error);
  410. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  411. g_key_file_free (keyfile);
  412. }
  413. /* check parsing of string values */
  414. static void
  415. test_string (void)
  416. {
  417. GKeyFile *keyfile;
  418. GError *error = NULL;
  419. gchar *value;
  420. const gchar *data =
  421. "[valid]\n"
  422. "key1=\\s\\n\\t\\r\\\\\n"
  423. "key2=\"quoted\"\n"
  424. "key3='quoted'\n"
  425. "key4=\xe2\x89\xa0\xe2\x89\xa0\n"
  426. "[invalid]\n"
  427. "key1=\\a\\b\\0800xff\n"
  428. "key2=blabla\\\n";
  429. keyfile = load_data (data, 0);
  430. check_string_value (keyfile, "valid", "key1", " \n\t\r\\");
  431. check_string_value (keyfile, "valid", "key2", "\"quoted\"");
  432. check_string_value (keyfile, "valid", "key3", "'quoted'");
  433. check_string_value (keyfile, "valid", "key4", "\xe2\x89\xa0\xe2\x89\xa0");
  434. value = g_key_file_get_string (keyfile, "invalid", "key1", &error);
  435. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  436. g_free (value);
  437. value = g_key_file_get_string (keyfile, "invalid", "key2", &error);
  438. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  439. g_free (value);
  440. g_key_file_free (keyfile);
  441. }
  442. /* check parsing of boolean values */
  443. static void
  444. test_boolean (void)
  445. {
  446. GKeyFile *keyfile;
  447. GError *error = NULL;
  448. const gchar *data =
  449. "[valid]\n"
  450. "key1=true\n"
  451. "key2=false\n"
  452. "key3=1\n"
  453. "key4=0\n"
  454. "[invalid]\n"
  455. "key1=t\n"
  456. "key2=f\n"
  457. "key3=yes\n"
  458. "key4=no\n";
  459. keyfile = load_data (data, 0);
  460. check_boolean_value (keyfile, "valid", "key1", TRUE);
  461. check_boolean_value (keyfile, "valid", "key2", FALSE);
  462. check_boolean_value (keyfile, "valid", "key3", TRUE);
  463. check_boolean_value (keyfile, "valid", "key4", FALSE);
  464. g_key_file_get_boolean (keyfile, "invalid", "key1", &error);
  465. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  466. g_key_file_get_boolean (keyfile, "invalid", "key2", &error);
  467. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  468. g_key_file_get_boolean (keyfile, "invalid", "key3", &error);
  469. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  470. g_key_file_get_boolean (keyfile, "invalid", "key4", &error);
  471. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  472. g_key_file_set_boolean (keyfile, "valid", "key1", FALSE);
  473. check_boolean_value (keyfile, "valid", "key1", FALSE);
  474. g_key_file_free (keyfile);
  475. }
  476. /* check parsing of integer and double values */
  477. static void
  478. test_number (void)
  479. {
  480. GKeyFile *keyfile;
  481. GError *error = NULL;
  482. const gchar *data =
  483. "[valid]\n"
  484. "key1=0\n"
  485. "key2=1\n"
  486. "key3=-1\n"
  487. "key4=2324431\n"
  488. "key5=-2324431\n"
  489. "key6=000111\n"
  490. "dkey1=000111\n"
  491. "dkey2=145.45\n"
  492. "dkey3=-3453.7\n"
  493. "[invalid]\n"
  494. "key1=0xffff\n"
  495. "key2=0.5\n"
  496. "key3=1e37\n"
  497. "key4=ten\n"
  498. "key5=\n"
  499. "key6=1.0.0\n"
  500. "key7=2x2\n"
  501. "key8=abc\n";
  502. keyfile = load_data (data, 0);
  503. check_integer_value (keyfile, "valid", "key1", 0);
  504. check_integer_value (keyfile, "valid", "key2", 1);
  505. check_integer_value (keyfile, "valid", "key3", -1);
  506. check_integer_value (keyfile, "valid", "key4", 2324431);
  507. check_integer_value (keyfile, "valid", "key5", -2324431);
  508. check_integer_value (keyfile, "valid", "key6", 111);
  509. check_double_value (keyfile, "valid", "dkey1", 111.0);
  510. check_double_value (keyfile, "valid", "dkey2", 145.45);
  511. check_double_value (keyfile, "valid", "dkey3", -3453.7);
  512. g_key_file_get_integer (keyfile, "invalid", "key1", &error);
  513. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  514. g_key_file_get_integer (keyfile, "invalid", "key2", &error);
  515. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  516. g_key_file_get_integer (keyfile, "invalid", "key3", &error);
  517. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  518. g_key_file_get_integer (keyfile, "invalid", "key4", &error);
  519. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  520. g_key_file_get_double (keyfile, "invalid", "key5", &error);
  521. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  522. g_key_file_get_double (keyfile, "invalid", "key6", &error);
  523. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  524. g_key_file_get_double (keyfile, "invalid", "key7", &error);
  525. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  526. g_key_file_get_double (keyfile, "invalid", "key8", &error);
  527. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  528. g_key_file_free (keyfile);
  529. }
  530. /* check handling of translated strings */
  531. static void
  532. test_locale_string (void)
  533. {
  534. GKeyFile *keyfile;
  535. gchar *old_locale;
  536. const gchar *data =
  537. "[valid]\n"
  538. "key1=v1\n"
  539. "key1[de]=v1-de\n"
  540. "key1[de_DE]=v1-de_DE\n"
  541. "key1[de_DE.UTF8]=v1-de_DE.UTF8\n"
  542. "key1[fr]=v1-fr\n"
  543. "key1[en] =v1-en\n"
  544. "key1[sr@Latn]=v1-sr\n";
  545. keyfile = load_data (data, G_KEY_FILE_KEEP_TRANSLATIONS);
  546. check_locale_string_value (keyfile, "valid", "key1", "it", "v1");
  547. check_locale_string_value (keyfile, "valid", "key1", "de", "v1-de");
  548. check_locale_string_value (keyfile, "valid", "key1", "de_DE", "v1-de_DE");
  549. check_locale_string_value (keyfile, "valid", "key1", "de_DE.UTF8", "v1-de_DE.UTF8");
  550. check_locale_string_value (keyfile, "valid", "key1", "fr", "v1-fr");
  551. check_locale_string_value (keyfile, "valid", "key1", "fr_FR", "v1-fr");
  552. check_locale_string_value (keyfile, "valid", "key1", "en", "v1-en");
  553. check_locale_string_value (keyfile, "valid", "key1", "sr@Latn", "v1-sr");
  554. g_key_file_free (keyfile);
  555. /* now test that translations are thrown away */
  556. old_locale = g_strdup (setlocale (LC_ALL, NULL));
  557. g_setenv ("LANGUAGE", "de", TRUE);
  558. setlocale (LC_ALL, "");
  559. keyfile = load_data (data, 0);
  560. check_locale_string_value (keyfile, "valid", "key1", "it", "v1");
  561. check_locale_string_value (keyfile, "valid", "key1", "de", "v1-de");
  562. check_locale_string_value (keyfile, "valid", "key1", "de_DE", "v1-de");
  563. check_locale_string_value (keyfile, "valid", "key1", "de_DE.UTF8", "v1-de");
  564. check_locale_string_value (keyfile, "valid", "key1", "fr", "v1");
  565. check_locale_string_value (keyfile, "valid", "key1", "fr_FR", "v1");
  566. check_locale_string_value (keyfile, "valid", "key1", "en", "v1");
  567. g_key_file_free (keyfile);
  568. setlocale (LC_ALL, old_locale);
  569. g_free (old_locale);
  570. }
  571. static void
  572. test_lists (void)
  573. {
  574. GKeyFile *keyfile;
  575. const gchar *data =
  576. "[valid]\n"
  577. "key1=v1;v2\n"
  578. "key2=v1;v2;\n"
  579. "key3=v1,v2\n"
  580. "key4=v1\\;v2\n"
  581. "key5=true;false\n"
  582. "key6=1;0;-1\n"
  583. "key7= 1 ; 0 ; -1 \n"
  584. "key8=v1\\,v2\n"
  585. "key9=0;1.3456;-76532.456\n";
  586. keyfile = load_data (data, 0);
  587. check_string_list_value (keyfile, "valid", "key1", "v1", "v2", NULL);
  588. check_string_list_value (keyfile, "valid", "key2", "v1", "v2", NULL);
  589. check_string_list_value (keyfile, "valid", "key3", "v1,v2", NULL);
  590. check_string_list_value (keyfile, "valid", "key4", "v1;v2", NULL);
  591. check_boolean_list_value (keyfile, "valid", "key5", TRUE, FALSE, -100);
  592. check_integer_list_value (keyfile, "valid", "key6", 1, 0, -1, -100);
  593. check_double_list_value (keyfile, "valid", "key9", 0.0, 1.3456, -76532.456, -100.0);
  594. /* maybe these should be valid */
  595. /* check_integer_list_value (keyfile, "valid", "key7", 1, 0, -1, -100);*/
  596. /* check_string_list_value (keyfile, "valid", "key8", "v1\\,v2", NULL);*/
  597. g_key_file_free (keyfile);
  598. /* Now check an alternate separator */
  599. keyfile = load_data (data, 0);
  600. g_key_file_set_list_separator (keyfile, ',');
  601. check_string_list_value (keyfile, "valid", "key1", "v1;v2", NULL);
  602. check_string_list_value (keyfile, "valid", "key2", "v1;v2;", NULL);
  603. check_string_list_value (keyfile, "valid", "key3", "v1", "v2", NULL);
  604. g_key_file_free (keyfile);
  605. }
  606. static void
  607. test_lists_set_get (void)
  608. {
  609. GKeyFile *keyfile;
  610. static const char * const strings[] = { "v1", "v2" };
  611. static const char * const locale_strings[] = { "v1-l", "v2-l" };
  612. static int integers[] = { 1, -1, 2 };
  613. static gdouble doubles[] = { 3.14, 2.71 };
  614. keyfile = g_key_file_new ();
  615. g_key_file_set_string_list (keyfile, "group0", "key1", strings, G_N_ELEMENTS (strings));
  616. g_key_file_set_locale_string_list (keyfile, "group0", "key1", "de", locale_strings, G_N_ELEMENTS (locale_strings));
  617. g_key_file_set_integer_list (keyfile, "group0", "key2", integers, G_N_ELEMENTS (integers));
  618. g_key_file_set_double_list (keyfile, "group0", "key3", doubles, G_N_ELEMENTS (doubles));
  619. check_string_list_value (keyfile, "group0", "key1", strings[0], strings[1], NULL);
  620. check_locale_string_list_value (keyfile, "group0", "key1", "de", locale_strings[0], locale_strings[1], NULL);
  621. check_integer_list_value (keyfile, "group0", "key2", integers[0], integers[1], -100);
  622. check_double_list_value (keyfile, "group0", "key3", doubles[0], doubles[1], -100.0);
  623. g_key_file_free (keyfile);
  624. /* and again with a different list separator */
  625. keyfile = g_key_file_new ();
  626. g_key_file_set_list_separator (keyfile, ',');
  627. g_key_file_set_string_list (keyfile, "group0", "key1", strings, G_N_ELEMENTS (strings));
  628. g_key_file_set_locale_string_list (keyfile, "group0", "key1", "de", locale_strings, G_N_ELEMENTS (locale_strings));
  629. g_key_file_set_integer_list (keyfile, "group0", "key2", integers, G_N_ELEMENTS (integers));
  630. g_key_file_set_double_list (keyfile, "group0", "key3", doubles, G_N_ELEMENTS (doubles));
  631. check_string_list_value (keyfile, "group0", "key1", strings[0], strings[1], NULL);
  632. check_locale_string_list_value (keyfile, "group0", "key1", "de", locale_strings[0], locale_strings[1], NULL);
  633. check_integer_list_value (keyfile, "group0", "key2", integers[0], integers[1], -100);
  634. check_double_list_value (keyfile, "group0", "key3", doubles[0], doubles[1], -100.0);
  635. g_key_file_free (keyfile);
  636. }
  637. static void
  638. test_group_remove (void)
  639. {
  640. GKeyFile *keyfile;
  641. gchar **names;
  642. gsize len;
  643. GError *error = NULL;
  644. const gchar *data =
  645. "[group1]\n"
  646. "[group2]\n"
  647. "key1=bla\n"
  648. "key2=bla\n"
  649. "[group3]\n"
  650. "key1=bla\n"
  651. "key2=bla\n";
  652. g_test_bug ("165887");
  653. keyfile = load_data (data, 0);
  654. names = g_key_file_get_groups (keyfile, &len);
  655. g_assert (names != NULL);
  656. check_length ("groups", g_strv_length (names), len, 3);
  657. check_name ("group name", names[0], "group1", 0);
  658. check_name ("group name", names[1], "group2", 1);
  659. check_name ("group name", names[2], "group3", 2);
  660. g_key_file_remove_group (keyfile, "group1", &error);
  661. check_no_error (&error);
  662. g_strfreev (names);
  663. names = g_key_file_get_groups (keyfile, &len);
  664. g_assert (names != NULL);
  665. check_length ("groups", g_strv_length (names), len, 2);
  666. check_name ("group name", names[0], "group2", 0);
  667. check_name ("group name", names[1], "group3", 1);
  668. g_key_file_remove_group (keyfile, "group2", &error);
  669. check_no_error (&error);
  670. g_strfreev (names);
  671. names = g_key_file_get_groups (keyfile, &len);
  672. g_assert (names != NULL);
  673. check_length ("groups", g_strv_length (names), len, 1);
  674. check_name ("group name", names[0], "group3", 0);
  675. g_key_file_remove_group (keyfile, "no such group", &error);
  676. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  677. g_strfreev (names);
  678. g_key_file_free (keyfile);
  679. }
  680. static void
  681. test_key_remove (void)
  682. {
  683. GKeyFile *keyfile;
  684. gchar *value;
  685. GError *error = NULL;
  686. const gchar *data =
  687. "[group1]\n"
  688. "key1=bla\n"
  689. "key2=bla\n";
  690. g_test_bug ("165980");
  691. keyfile = load_data (data, 0);
  692. check_string_value (keyfile, "group1", "key1", "bla");
  693. g_key_file_remove_key (keyfile, "group1", "key1", &error);
  694. check_no_error (&error);
  695. value = g_key_file_get_string (keyfile, "group1", "key1", &error);
  696. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
  697. g_free (value);
  698. g_key_file_remove_key (keyfile, "group1", "key1", &error);
  699. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
  700. g_key_file_remove_key (keyfile, "no such group", "key1", &error);
  701. check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  702. g_key_file_free (keyfile);
  703. }
  704. static void
  705. test_groups (void)
  706. {
  707. GKeyFile *keyfile;
  708. const gchar *data =
  709. "[1]\n"
  710. "key1=123\n"
  711. "[2]\n"
  712. "key2=123\n";
  713. g_test_bug ("316309");
  714. keyfile = load_data (data, 0);
  715. check_string_value (keyfile, "1", "key1", "123");
  716. check_string_value (keyfile, "2", "key2", "123");
  717. g_key_file_free (keyfile);
  718. }
  719. static void
  720. test_group_names (void)
  721. {
  722. GKeyFile *keyfile;
  723. GError *error = NULL;
  724. const gchar *data;
  725. gchar *value;
  726. /* [ in group name */
  727. data = "[a[b]\n"
  728. "key1=123\n";
  729. keyfile = g_key_file_new ();
  730. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  731. g_key_file_free (keyfile);
  732. check_error (&error,
  733. G_KEY_FILE_ERROR,
  734. G_KEY_FILE_ERROR_PARSE);
  735. /* ] in group name */
  736. data = "[a]b]\n"
  737. "key1=123\n";
  738. keyfile = g_key_file_new ();
  739. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  740. g_key_file_free (keyfile);
  741. check_error (&error,
  742. G_KEY_FILE_ERROR,
  743. G_KEY_FILE_ERROR_PARSE);
  744. /* control char in group name */
  745. data = "[a\tb]\n"
  746. "key1=123\n";
  747. keyfile = g_key_file_new ();
  748. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  749. g_key_file_free (keyfile);
  750. check_error (&error,
  751. G_KEY_FILE_ERROR,
  752. G_KEY_FILE_ERROR_PARSE);
  753. /* empty group name */
  754. data = "[]\n"
  755. "key1=123\n";
  756. keyfile = g_key_file_new ();
  757. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  758. g_key_file_free (keyfile);
  759. check_error (&error,
  760. G_KEY_FILE_ERROR,
  761. G_KEY_FILE_ERROR_PARSE);
  762. /* Unicode in group name */
  763. data = "[\xc2\xbd]\n"
  764. "key1=123\n";
  765. keyfile = g_key_file_new ();
  766. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  767. g_key_file_free (keyfile);
  768. check_no_error (&error);
  769. keyfile = g_key_file_new ();
  770. /*g_key_file_set_string (keyfile, "a[b", "key1", "123");*/
  771. value = g_key_file_get_string (keyfile, "a[b", "key1", &error);
  772. check_error (&error,
  773. G_KEY_FILE_ERROR,
  774. G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  775. g_assert (value == NULL);
  776. g_key_file_free (keyfile);
  777. keyfile = g_key_file_new ();
  778. /*g_key_file_set_string (keyfile, "a]b", "key1", "123");*/
  779. value = g_key_file_get_string (keyfile, "a]b", "key1", &error);
  780. check_error (&error,
  781. G_KEY_FILE_ERROR,
  782. G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  783. g_assert (value == NULL);
  784. g_key_file_free (keyfile);
  785. keyfile = g_key_file_new ();
  786. /*g_key_file_set_string (keyfile, "a\tb", "key1", "123");*/
  787. value = g_key_file_get_string (keyfile, "a\tb", "key1", &error);
  788. check_error (&error,
  789. G_KEY_FILE_ERROR,
  790. G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  791. g_assert (value == NULL);
  792. g_key_file_free (keyfile);
  793. keyfile = g_key_file_new ();
  794. g_key_file_set_string (keyfile, "\xc2\xbd", "key1", "123");
  795. check_string_value (keyfile, "\xc2\xbd", "key1", "123");
  796. g_key_file_free (keyfile);
  797. }
  798. static void
  799. test_key_names (void)
  800. {
  801. GKeyFile *keyfile;
  802. GError *error = NULL;
  803. const gchar *data;
  804. gchar *value;
  805. /* [ in key name */
  806. data = "[a]\n"
  807. "key[=123\n";
  808. keyfile = g_key_file_new ();
  809. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  810. g_key_file_free (keyfile);
  811. check_error (&error,
  812. G_KEY_FILE_ERROR,
  813. G_KEY_FILE_ERROR_PARSE);
  814. /* empty key name */
  815. data = "[a]\n"
  816. " =123\n";
  817. keyfile = g_key_file_new ();
  818. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  819. g_key_file_free (keyfile);
  820. check_error (&error,
  821. G_KEY_FILE_ERROR,
  822. G_KEY_FILE_ERROR_PARSE);
  823. /* empty key name */
  824. data = "[a]\n"
  825. " [de] =123\n";
  826. keyfile = g_key_file_new ();
  827. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  828. g_key_file_free (keyfile);
  829. check_error (&error,
  830. G_KEY_FILE_ERROR,
  831. G_KEY_FILE_ERROR_PARSE);
  832. /* bad locale suffix */
  833. data = "[a]\n"
  834. "foo[@#!&%]=123\n";
  835. keyfile = g_key_file_new ();
  836. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  837. g_key_file_free (keyfile);
  838. check_error (&error,
  839. G_KEY_FILE_ERROR,
  840. G_KEY_FILE_ERROR_PARSE);
  841. /* initial space */
  842. data = "[a]\n"
  843. " foo=123\n";
  844. keyfile = g_key_file_new ();
  845. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  846. check_no_error (&error);
  847. check_string_value (keyfile, "a", "foo", "123");
  848. g_key_file_free (keyfile);
  849. /* final space */
  850. data = "[a]\n"
  851. "foo =123\n";
  852. keyfile = g_key_file_new ();
  853. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  854. check_no_error (&error);
  855. check_string_value (keyfile, "a", "foo", "123");
  856. g_key_file_free (keyfile);
  857. /* inner space */
  858. data = "[a]\n"
  859. "foo bar=123\n";
  860. keyfile = g_key_file_new ();
  861. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  862. check_no_error (&error);
  863. check_string_value (keyfile, "a", "foo bar", "123");
  864. g_key_file_free (keyfile);
  865. /* inner space */
  866. data = "[a]\n"
  867. "foo [de] =123\n";
  868. keyfile = g_key_file_new ();
  869. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  870. check_error (&error,
  871. G_KEY_FILE_ERROR,
  872. G_KEY_FILE_ERROR_PARSE);
  873. g_key_file_free (keyfile);
  874. /* control char in key name */
  875. data = "[a]\n"
  876. "key\tfoo=123\n";
  877. keyfile = g_key_file_new ();
  878. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  879. g_key_file_free (keyfile);
  880. check_no_error (&error);
  881. /* Unicode in key name */
  882. data = "[a]\n"
  883. "\xc2\xbd=123\n";
  884. keyfile = g_key_file_new ();
  885. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  886. g_key_file_free (keyfile);
  887. check_no_error (&error);
  888. keyfile = g_key_file_new ();
  889. g_key_file_set_string (keyfile, "a", "x", "123");
  890. /*g_key_file_set_string (keyfile, "a", "key=", "123");*/
  891. value = g_key_file_get_string (keyfile, "a", "key=", &error);
  892. check_error (&error,
  893. G_KEY_FILE_ERROR,
  894. G_KEY_FILE_ERROR_KEY_NOT_FOUND);
  895. g_key_file_free (keyfile);
  896. keyfile = g_key_file_new ();
  897. g_key_file_set_string (keyfile, "a", "x", "123");
  898. /*g_key_file_set_string (keyfile, "a", "key[", "123");*/
  899. value = g_key_file_get_string (keyfile, "a", "key[", &error);
  900. check_error (&error,
  901. G_KEY_FILE_ERROR,
  902. G_KEY_FILE_ERROR_KEY_NOT_FOUND);
  903. g_key_file_free (keyfile);
  904. keyfile = g_key_file_new ();
  905. g_key_file_set_string (keyfile, "a", "x", "123");
  906. g_key_file_set_string (keyfile, "a", "key\tfoo", "123");
  907. value = g_key_file_get_string (keyfile, "a", "key\tfoo", &error);
  908. check_no_error (&error);
  909. g_free (value);
  910. g_key_file_free (keyfile);
  911. keyfile = g_key_file_new ();
  912. g_key_file_set_string (keyfile, "a", "x", "123");
  913. /*g_key_file_set_string (keyfile, "a", " key", "123");*/
  914. value = g_key_file_get_string (keyfile, "a", " key", &error);
  915. check_error (&error,
  916. G_KEY_FILE_ERROR,
  917. G_KEY_FILE_ERROR_KEY_NOT_FOUND);
  918. g_key_file_free (keyfile);
  919. keyfile = g_key_file_new ();
  920. g_key_file_set_string (keyfile, "a", "x", "123");
  921. /* Unicode key */
  922. g_key_file_set_string (keyfile, "a", "\xc2\xbd", "123");
  923. check_string_value (keyfile, "a", "\xc2\xbd", "123");
  924. /* Keys with / + . (as used by the gnome-vfs mime cache) */
  925. g_key_file_set_string (keyfile, "a", "foo/bar", "/");
  926. check_string_value (keyfile, "a", "foo/bar", "/");
  927. g_key_file_set_string (keyfile, "a", "foo+bar", "+");
  928. check_string_value (keyfile, "a", "foo+bar", "+");
  929. g_key_file_set_string (keyfile, "a", "foo.bar", ".");
  930. check_string_value (keyfile, "a", "foo.bar", ".");
  931. g_key_file_free (keyfile);
  932. }
  933. static void
  934. test_duplicate_keys (void)
  935. {
  936. GKeyFile *keyfile;
  937. const gchar *data =
  938. "[1]\n"
  939. "key1=123\n"
  940. "key1=345\n";
  941. keyfile = load_data (data, 0);
  942. check_string_value (keyfile, "1", "key1", "345");
  943. g_key_file_free (keyfile);
  944. }
  945. static void
  946. test_duplicate_groups (void)
  947. {
  948. GKeyFile *keyfile;
  949. const gchar *data =
  950. "[Desktop Entry]\n"
  951. "key1=123\n"
  952. "[Desktop Entry]\n"
  953. "key2=123\n";
  954. g_test_bug ("157877");
  955. keyfile = load_data (data, 0);
  956. check_string_value (keyfile, "Desktop Entry", "key1", "123");
  957. check_string_value (keyfile, "Desktop Entry", "key2", "123");
  958. g_key_file_free (keyfile);
  959. }
  960. static void
  961. test_duplicate_groups2 (void)
  962. {
  963. GKeyFile *keyfile;
  964. const gchar *data =
  965. "[A]\n"
  966. "foo=bar\n"
  967. "[B]\n"
  968. "foo=baz\n"
  969. "[A]\n"
  970. "foo=bang\n";
  971. g_test_bug ("385910");
  972. keyfile = load_data (data, 0);
  973. check_string_value (keyfile, "A", "foo", "bang");
  974. check_string_value (keyfile, "B", "foo", "baz");
  975. g_key_file_free (keyfile);
  976. }
  977. static void
  978. test_reload_idempotency (void)
  979. {
  980. static const gchar *original_data=""
  981. "# Top comment\n"
  982. "\n"
  983. "# First comment\n"
  984. "[first]\n"
  985. "key=value\n"
  986. "# A random comment in the first group\n"
  987. "anotherkey=anothervalue\n"
  988. "# Second comment - one line\n"
  989. "[second]\n"
  990. "# Third comment - two lines\n"
  991. "# Third comment - two lines\n"
  992. "[third]\n"
  993. "blank_line=1\n"
  994. "\n"
  995. "blank_lines=2\n"
  996. "\n\n"
  997. "[fourth]\n"
  998. "[fifth]\n";
  999. GKeyFile *keyfile;
  1000. GError *error = NULL;
  1001. gchar *data1, *data2;
  1002. gsize len1, len2;
  1003. g_test_bug ("420686");
  1004. /* check that we only insert a single new line between groups */
  1005. keyfile = g_key_file_new ();
  1006. g_key_file_load_from_data (keyfile,
  1007. original_data, strlen(original_data),
  1008. G_KEY_FILE_KEEP_COMMENTS,
  1009. &error);
  1010. check_no_error (&error);
  1011. data1 = g_key_file_to_data (keyfile, &len1, &error);
  1012. g_assert (data1 != NULL);
  1013. g_key_file_free (keyfile);
  1014. keyfile = g_key_file_new ();
  1015. g_key_file_load_from_data (keyfile,
  1016. data1, len1,
  1017. G_KEY_FILE_KEEP_COMMENTS,
  1018. &error);
  1019. check_no_error (&error);
  1020. data2 = g_key_file_to_data (keyfile, &len2, &error);
  1021. g_assert (data2 != NULL);
  1022. g_key_file_free (keyfile);
  1023. g_assert_cmpstr (data1, ==, data2);
  1024. g_free (data2);
  1025. g_free (data1);
  1026. }
  1027. static const char int64_data[] =
  1028. "[bees]\n"
  1029. "a=1\n"
  1030. "b=2\n"
  1031. "c=123456789123456789\n"
  1032. "d=-123456789123456789\n";
  1033. static void
  1034. test_int64 (void)
  1035. {
  1036. GKeyFile *file;
  1037. gboolean ok;
  1038. guint64 c;
  1039. gint64 d;
  1040. gchar *value;
  1041. g_test_bug ("614864");
  1042. file = g_key_file_new ();
  1043. ok = g_key_file_load_from_data (file, int64_data, strlen (int64_data),
  1044. 0, NULL);
  1045. g_assert (ok);
  1046. c = g_key_file_get_uint64 (file, "bees", "c", NULL);
  1047. g_assert (c == G_GUINT64_CONSTANT (123456789123456789));
  1048. d = g_key_file_get_int64 (file, "bees", "d", NULL);
  1049. g_assert (d == G_GINT64_CONSTANT (-123456789123456789));
  1050. g_key_file_set_uint64 (file, "bees", "c",
  1051. G_GUINT64_CONSTANT (987654321987654321));
  1052. value = g_key_file_get_value (file, "bees", "c", NULL);
  1053. g_assert_cmpstr (value, ==, "987654321987654321");
  1054. g_free (value);
  1055. g_key_file_set_int64 (file, "bees", "d",
  1056. G_GINT64_CONSTANT (-987654321987654321));
  1057. value = g_key_file_get_value (file, "bees", "d", NULL);
  1058. g_assert_cmpstr (value, ==, "-987654321987654321");
  1059. g_free (value);
  1060. g_key_file_free (file);
  1061. }
  1062. static void
  1063. test_load (void)
  1064. {
  1065. GKeyFile *file;
  1066. GError *error;
  1067. gboolean bools[2] = { TRUE, FALSE };
  1068. file = g_key_file_new ();
  1069. error = NULL;
  1070. g_assert (g_key_file_load_from_data_dirs (file, "keyfiletest.ini", NULL, 0, &error));
  1071. g_assert_no_error (error);
  1072. g_key_file_set_locale_string (file, "test", "key4", "de", "Vierter Schl?ssel");
  1073. g_key_file_set_boolean_list (file, "test", "key5", bools, 2);
  1074. g_key_file_set_integer (file, "test", "key6", 22);
  1075. g_key_file_set_double (file, "test", "key7", 2.5);
  1076. g_key_file_set_comment (file, "test", "key7", "some float", NULL);
  1077. g_key_file_set_comment (file, "test", NULL, "the test group", NULL);
  1078. g_key_file_set_comment (file, NULL, NULL, "top comment", NULL);
  1079. g_key_file_free (file);
  1080. file = g_key_file_new ();
  1081. error = NULL;
  1082. g_assert (!g_key_file_load_from_data_dirs (file, "keyfile-test.ini", NULL, 0, &error));
  1083. g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND);
  1084. g_error_free (error);
  1085. g_key_file_free (file);
  1086. }
  1087. static void
  1088. test_load_fail (void)
  1089. {
  1090. GKeyFile *file;
  1091. GError *error;
  1092. file = g_key_file_new ();
  1093. error = NULL;
  1094. g_assert (!g_key_file_load_from_file (file, "/", 0, &error));
  1095. g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE);
  1096. g_clear_error (&error);
  1097. g_assert (!g_key_file_load_from_file (file, "/nosuchfile", 0, &error));
  1098. g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT);
  1099. g_clear_error (&error);
  1100. g_key_file_free (file);
  1101. }
  1102. static void
  1103. test_non_utf8 (void)
  1104. {
  1105. GKeyFile *file;
  1106. static const char data[] =
  1107. "[group]\n"
  1108. "a=\230\230\230\n"
  1109. "b=a;b;\230\230\230;\n"
  1110. "c=a\\\n";
  1111. gboolean ok;
  1112. GError *error;
  1113. gchar *s;
  1114. gchar **l;
  1115. file = g_key_file_new ();
  1116. ok = g_key_file_load_from_data (file, data, strlen (data), 0, NULL);
  1117. g_assert (ok);
  1118. error = NULL;
  1119. s = g_key_file_get_string (file, "group", "a", &error);
  1120. g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING);
  1121. g_assert (s == NULL);
  1122. g_clear_error (&error);
  1123. l = g_key_file_get_string_list (file, "group", "b", NULL, &error);
  1124. g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING);
  1125. g_assert (l == NULL);
  1126. g_clear_error (&error);
  1127. l = g_key_file_get_string_list (file, "group", "c", NULL, &error);
  1128. g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
  1129. g_assert (l == NULL);
  1130. g_clear_error (&error);
  1131. g_key_file_free (file);
  1132. }
  1133. #ifndef SRCDIR
  1134. #define SRCDIR "."
  1135. #endif
  1136. static void
  1137. test_page_boundary (void)
  1138. {
  1139. GKeyFile *file;
  1140. GError *error;
  1141. gint i;
  1142. #define GROUP "main_section"
  1143. #define KEY_PREFIX "fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_"
  1144. #define FIRST_KEY 10
  1145. #define LAST_KEY 99
  1146. #define VALUE 92
  1147. g_test_bug ("640695");
  1148. file = g_key_file_new ();
  1149. error = NULL;
  1150. g_key_file_load_from_file (file, SRCDIR "/pages.ini", G_KEY_FILE_NONE, &error);
  1151. g_assert_no_error (error);
  1152. for (i = FIRST_KEY; i <= LAST_KEY; i++)
  1153. {
  1154. gchar *key;
  1155. gint val;
  1156. key = g_strdup_printf (KEY_PREFIX "%d", i);
  1157. val = g_key_file_get_integer (file, GROUP, key, &error);
  1158. g_free (key);
  1159. g_assert_no_error (error);
  1160. g_assert_cmpint (val, ==, VALUE);
  1161. }
  1162. g_key_file_free (file);
  1163. }
  1164. static void
  1165. test_ref (void)
  1166. {
  1167. GKeyFile *file;
  1168. static const char data[] =
  1169. "[group]\n"
  1170. "a=1\n";
  1171. gboolean ok;
  1172. file = g_key_file_new ();
  1173. ok = g_key_file_load_from_data (file, data, strlen (data), 0, NULL);
  1174. g_assert (ok);
  1175. g_assert (g_key_file_has_key (file, "group", "a", NULL));
  1176. g_key_file_ref (file);
  1177. g_key_file_free (file);
  1178. g_key_file_unref (file);
  1179. }
  1180. /* https://bugzilla.gnome.org/show_bug.cgi?id=634232 */
  1181. static void
  1182. test_replace_value (void)
  1183. {
  1184. GKeyFile *keyfile;
  1185. keyfile = g_key_file_new();
  1186. g_key_file_set_value(keyfile, "grupo1", "chave1", "1234567890");
  1187. g_key_file_set_value(keyfile, "grupo1", "chave1", "123123423423423432432423423");
  1188. g_key_file_remove_group(keyfile, "grupo1", NULL);
  1189. g_free (g_key_file_to_data (keyfile, NULL, NULL));
  1190. g_key_file_unref (keyfile);
  1191. }
  1192. static void
  1193. test_list_separator (void)
  1194. {
  1195. GKeyFile *keyfile;
  1196. GError *error = NULL;
  1197. const gchar *data =
  1198. "[test]\n"
  1199. "key1=v1,v2\n";
  1200. keyfile = g_key_file_new ();
  1201. g_key_file_set_list_separator (keyfile, ',');
  1202. g_key_file_load_from_data (keyfile, data, -1, 0, &error);
  1203. check_string_list_value (keyfile, "test", "key1", "v1", "v2", NULL);
  1204. g_key_file_unref (keyfile);
  1205. }
  1206. static void
  1207. test_empty_string (void)
  1208. {
  1209. GError *error = NULL;
  1210. GKeyFile *kf;
  1211. kf = g_key_file_new ();
  1212. g_key_file_load_from_data (kf, "", 0, 0, &error);
  1213. g_assert_no_error (error);
  1214. g_key_file_load_from_data (kf, "", -1, 0, &error);
  1215. g_assert_no_error (error);
  1216. /* NULL is a fine pointer to use if length is zero */
  1217. g_key_file_load_from_data (kf, NULL, 0, 0, &error);
  1218. g_assert_no_error (error);
  1219. /* should not attempt to access non-NULL pointer if length is zero */
  1220. g_key_file_load_from_data (kf, GINT_TO_POINTER (1), 0, 0, &error);
  1221. g_assert_no_error (error);
  1222. g_key_file_unref (kf);
  1223. }
  1224. static void
  1225. test_limbo (void)
  1226. {
  1227. GKeyFile *file;
  1228. static const char data[] =
  1229. "a=b\n"
  1230. "[group]\n"
  1231. "b=c\n";
  1232. gboolean ok;
  1233. GError *error;
  1234. file = g_key_file_new ();
  1235. error = NULL;
  1236. ok = g_key_file_load_from_data (file, data, strlen (data), 0, &error);
  1237. g_assert (!ok);
  1238. g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
  1239. g_clear_error (&error);
  1240. g_key_file_free (file);
  1241. }
  1242. static void
  1243. test_utf8 (void)
  1244. {
  1245. GKeyFile *file;
  1246. static const char data[] =
  1247. "[group]\n"
  1248. "Encoding=non-UTF-8\n";
  1249. gboolean ok;
  1250. GError *error;
  1251. file = g_key_file_new ();
  1252. error = NULL;
  1253. ok = g_key_file_load_from_data (file, data, strlen (data), 0, &error);
  1254. g_assert (!ok);
  1255. g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING);
  1256. g_clear_error (&error);
  1257. g_key_file_free (file);
  1258. }
  1259. static void
  1260. test_roundtrip (void)
  1261. {
  1262. GKeyFile *kf;
  1263. const gchar orig[] =
  1264. "[Group1]\n"
  1265. "key1=value1\n"
  1266. "\n"
  1267. "[Group2]\n"
  1268. "key1=value1\n";
  1269. gsize len;
  1270. gchar *data;
  1271. kf = load_data (orig, G_KEY_FILE_KEEP_COMMENTS);
  1272. g_key_file_set_integer (kf, "Group1", "key2", 0);
  1273. g_key_file_remove_key (kf, "Group1", "key2", NULL);
  1274. data = g_key_file_to_data (kf, &len, NULL);
  1275. g_assert_cmpstr (data, ==, orig);
  1276. g_free (data);
  1277. g_key_file_free (kf);
  1278. }
  1279. int
  1280. main (int argc, char *argv[])
  1281. {
  1282. g_setenv ("XDG_DATA_HOME", SRCDIR, TRUE);
  1283. g_test_init (&argc, &argv, NULL);
  1284. g_test_bug_base ("http://bugzilla.gnome.org/");
  1285. g_test_add_func ("/keyfile/line-ends", test_line_ends);
  1286. g_test_add_func ("/keyfile/whitespace", test_whitespace);
  1287. g_test_add_func ("/keyfile/comments", test_comments);
  1288. g_test_add_func ("/keyfile/listing", test_listing);
  1289. g_test_add_func ("/keyfile/string", test_string);
  1290. g_test_add_func ("/keyfile/boolean", test_boolean);
  1291. g_test_add_func ("/keyfile/number", test_number);
  1292. g_test_add_func ("/keyfile/locale-string", test_locale_string);
  1293. g_test_add_func ("/keyfile/lists", test_lists);
  1294. g_test_add_func ("/keyfile/lists-set-get", test_lists_set_get);
  1295. g_test_add_func ("/keyfile/group-remove", test_group_remove);
  1296. g_test_add_func ("/keyfile/key-remove", test_key_remove);
  1297. g_test_add_func ("/keyfile/groups", test_groups);
  1298. g_test_add_func ("/keyfile/duplicate-keys", test_duplicate_keys);
  1299. g_test_add_func ("/keyfile/duplicate-groups", test_duplicate_groups);
  1300. g_test_add_func ("/keyfile/duplicate-groups2", test_duplicate_groups2);
  1301. g_test_add_func ("/keyfile/group-names", test_group_names);
  1302. g_test_add_func ("/keyfile/key-names", test_key_names);
  1303. g_test_add_func ("/keyfile/reload", test_reload_idempotency);
  1304. g_test_add_func ("/keyfile/int64", test_int64);
  1305. g_test_add_func ("/keyfile/load", test_load);
  1306. g_test_add_func ("/keyfile/load-fail", test_load_fail);
  1307. g_test_add_func ("/keyfile/non-utf8", test_non_utf8);
  1308. g_test_add_func ("/keyfile/page-boundary", test_page_boundary);
  1309. g_test_add_func ("/keyfile/ref", test_ref);
  1310. g_test_add_func ("/keyfile/replace-value", test_replace_value);
  1311. g_test_add_func ("/keyfile/list-separator", test_list_separator);
  1312. g_test_add_func ("/keyfile/empty-string", test_empty_string);
  1313. g_test_add_func ("/keyfile/limbo", test_limbo);
  1314. g_test_add_func ("/keyfile/utf8", test_utf8);
  1315. g_test_add_func ("/keyfile/roundtrip", test_roundtrip);
  1316. return g_test_run ();
  1317. }