glib2 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. data/ChangeLog +3023 -0
  2. data/README +28 -0
  3. data/Rakefile +87 -0
  4. data/extconf.rb +61 -0
  5. data/sample/bookmarkfile.rb +66 -0
  6. data/sample/completion.rb +45 -0
  7. data/sample/idle.rb +41 -0
  8. data/sample/iochannel.rb +44 -0
  9. data/sample/keyfile.rb +62 -0
  10. data/sample/shell.rb +36 -0
  11. data/sample/spawn.rb +25 -0
  12. data/sample/timeout.rb +28 -0
  13. data/sample/timeout2.rb +35 -0
  14. data/sample/timer.rb +40 -0
  15. data/sample/type-register.rb +103 -0
  16. data/sample/type-register2.rb +104 -0
  17. data/sample/utils.rb +54 -0
  18. data/src/glib-enum-types.c +1032 -0
  19. data/src/glib-enum-types.h +140 -0
  20. data/src/lib/glib-mkenums.rb +199 -0
  21. data/src/lib/glib2.rb +220 -0
  22. data/src/lib/mkmf-gnome2.rb +390 -0
  23. data/src/lib/pkg-config.rb +137 -0
  24. data/src/rbgcompat.h +30 -0
  25. data/src/rbglib.c +320 -0
  26. data/src/rbglib.h +96 -0
  27. data/src/rbglib_bookmarkfile.c +595 -0
  28. data/src/rbglib_completion.c +192 -0
  29. data/src/rbglib_convert.c +195 -0
  30. data/src/rbglib_error.c +95 -0
  31. data/src/rbglib_fileutils.c +83 -0
  32. data/src/rbglib_i18n.c +44 -0
  33. data/src/rbglib_int64.c +157 -0
  34. data/src/rbglib_iochannel.c +883 -0
  35. data/src/rbglib_keyfile.c +846 -0
  36. data/src/rbglib_maincontext.c +917 -0
  37. data/src/rbglib_mainloop.c +87 -0
  38. data/src/rbglib_messages.c +150 -0
  39. data/src/rbglib_pollfd.c +111 -0
  40. data/src/rbglib_shell.c +68 -0
  41. data/src/rbglib_source.c +190 -0
  42. data/src/rbglib_spawn.c +345 -0
  43. data/src/rbglib_threads.c +51 -0
  44. data/src/rbglib_timer.c +127 -0
  45. data/src/rbglib_unicode.c +611 -0
  46. data/src/rbglib_utils.c +386 -0
  47. data/src/rbglib_win32.c +136 -0
  48. data/src/rbgobj_boxed.c +251 -0
  49. data/src/rbgobj_closure.c +337 -0
  50. data/src/rbgobj_convert.c +167 -0
  51. data/src/rbgobj_enums.c +961 -0
  52. data/src/rbgobj_fundamental.c +30 -0
  53. data/src/rbgobj_object.c +892 -0
  54. data/src/rbgobj_param.c +390 -0
  55. data/src/rbgobj_paramspecs.c +305 -0
  56. data/src/rbgobj_signal.c +963 -0
  57. data/src/rbgobj_strv.c +61 -0
  58. data/src/rbgobj_type.c +851 -0
  59. data/src/rbgobj_typeinstance.c +121 -0
  60. data/src/rbgobj_typeinterface.c +148 -0
  61. data/src/rbgobj_typemodule.c +66 -0
  62. data/src/rbgobj_typeplugin.c +49 -0
  63. data/src/rbgobj_value.c +313 -0
  64. data/src/rbgobj_valuearray.c +59 -0
  65. data/src/rbgobj_valuetypes.c +298 -0
  66. data/src/rbgobject.c +406 -0
  67. data/src/rbgobject.h +265 -0
  68. data/src/rbgprivate.h +88 -0
  69. data/src/rbgutil.c +222 -0
  70. data/src/rbgutil.h +82 -0
  71. data/src/rbgutil_callback.c +231 -0
  72. data/test/glib-test-init.rb +6 -0
  73. data/test/glib-test-utils.rb +12 -0
  74. data/test/run-test.rb +25 -0
  75. data/test/test_enum.rb +99 -0
  76. data/test/test_file_utils.rb +15 -0
  77. data/test/test_glib2.rb +120 -0
  78. data/test/test_iochannel.rb +275 -0
  79. data/test/test_key_file.rb +38 -0
  80. data/test/test_mkenums.rb +25 -0
  81. data/test/test_signal.rb +20 -0
  82. data/test/test_timeout.rb +28 -0
  83. data/test/test_unicode.rb +369 -0
  84. data/test/test_utils.rb +37 -0
  85. data/test/test_win32.rb +13 -0
  86. metadata +165 -0
data/src/rbgutil.h ADDED
@@ -0,0 +1,82 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /************************************************
3
+
4
+ rbgutil.h -
5
+
6
+ $Author: sakai $
7
+ $Date: 2007/07/08 03:17:21 $
8
+
9
+ Copyright (C) 2002,2003 Masao Mutoh
10
+ ************************************************/
11
+
12
+ #ifndef __RBGUTIL_H__
13
+ #define __RBGUTIL_H__
14
+
15
+ #include <glib-object.h>
16
+ #include "ruby.h"
17
+ #ifdef HAVE_RUBY_ENCODING_H
18
+ # include <ruby/encoding.h>
19
+ #endif
20
+ #include "rbglib.h"
21
+
22
+ #ifdef __cplusplus
23
+ extern "C" {
24
+ #endif /* __cplusplus */
25
+
26
+ #define G_DEF_SETTER(klass, name) \
27
+ rb_funcall(klass, rbgutil_id_module_eval, 1, rb_str_new2( \
28
+ "def " name "=(val); set_" name "(val); val; end\n"))
29
+ #define G_DEF_SETTERS(klass) rbgutil_def_setters(klass)
30
+
31
+ #define G_SET_PROPERTIES(self, hash) (rbgutil_set_properties(self, hash))
32
+ #define G_SET_SYMBOL_PROPERTY(gtype, name) \
33
+ rbgobj_register_property_getter(gtype, name, rbgutil_sym_g2r_func)
34
+ #define G_PROTECT_CALLBACK(func, data) (rbgutil_invoke_callback((VALUE(*)(VALUE))func, (VALUE)data))
35
+
36
+ #define GLIST2ARY(list) (rbgutil_glist2ary(list))
37
+ #define GLIST2ARY_FREE(list) (rbgutil_glist2ary_and_free(list))
38
+ #define GLIST2ARYF(list) (GLIST2ARY_FREE(list))
39
+ #define GLIST2ARY2(list, gtype) (rbgutil_glist2ary_boxed(list, gtype))
40
+ #define GLIST2ARY2F(list, gtype) (rbgutil_glist2ary_boxed_and_free(list, gtype))
41
+ #define GLIST2ARY_STR(list) (rbgutil_glist2ary_string(list))
42
+ #define GLIST2ARY_STR_FREE(list) (rbgutil_glist2ary_string_and_free(list))
43
+ #define GSLIST2ARY(list) (rbgutil_gslist2ary(list))
44
+ #define GSLIST2ARY_FREE(list) (rbgutil_gslist2ary_and_free(list))
45
+ #define GSLIST2ARYF(list) (GSLIST2ARY_FREE(list))
46
+ #define GSLIST2ARY2(list, gtype) (rbgutil_gslist2ary_boxed(list, gtype))
47
+ #define GSLIST2ARY2F(list, gtype) (rbgutil_gslist2ary_boxed_and_free(list, gtype))
48
+
49
+ #define RBG_STRING_SET_UTF8_ENCODING(string) \
50
+ (rbgutil_string_set_utf8_encoding(string))
51
+
52
+ extern VALUE rbgutil_def_setters(VALUE klass);
53
+ extern void rbgutil_set_properties(VALUE self, VALUE hash);
54
+ extern VALUE rbgutil_glist2ary(GList* list);
55
+ extern VALUE rbgutil_glist2ary_boxed(GList* list, GType gtype);
56
+ extern VALUE rbgutil_glist2ary_string(GList* list);
57
+ extern VALUE rbgutil_glist2ary_and_free(GList* list);
58
+ extern VALUE rbgutil_glist2ary_boxed_and_free(GList* list, GType gtype);
59
+ extern VALUE rbgutil_glist2ary_string_and_free(GList* list);
60
+ extern VALUE rbgutil_gslist2ary(GSList* list);
61
+ extern VALUE rbgutil_gslist2ary_and_free(GSList* list);
62
+ extern VALUE rbgutil_gslist2ary_boxed(GSList* list, GType gtype);
63
+ extern VALUE rbgutil_gslist2ary_boxed_and_free(GSList* list, GType gtype);
64
+ extern VALUE rbgutil_protect(VALUE (*proc) (VALUE), VALUE data);
65
+ extern VALUE rbgutil_invoke_callback(VALUE (*func)(VALUE), VALUE arg);
66
+ extern void rbgutil_start_callback_dispatch_thread(void);
67
+ extern void rbgutil_stop_callback_dispatch_thread(void);
68
+
69
+ extern VALUE rbgutil_string_set_utf8_encoding(VALUE string);
70
+
71
+ /*< protected >*/
72
+ RUBY_GLIB2_VAR ID rbgutil_id_module_eval;
73
+ extern VALUE rbgutil_sym_g2r_func(const GValue *from);
74
+
75
+ /* deprecated */
76
+ #define G_BLOCK_PROC rb_block_proc
77
+
78
+ #ifdef __cplusplus
79
+ }
80
+ #endif /* __cplusplus */
81
+
82
+ #endif /* __RBGLIB_H__ */
@@ -0,0 +1,231 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /**********************************************************************
3
+
4
+ utils_callback.c -
5
+
6
+ $Author: sakai $
7
+ $Date: 2007/07/14 07:16:18 $
8
+
9
+ Copyright (C) 2007 Ruby-GNOME2 Project
10
+
11
+ **********************************************************************/
12
+
13
+ #include "rbgprivate.h"
14
+
15
+ #ifdef HAVE_UNISTD_H
16
+ # include <unistd.h>
17
+ #endif
18
+ #ifdef HAVE_IO_H
19
+ # include <io.h>
20
+ # define pipe(phandles) _pipe(phandles, 128, _O_BINARY)
21
+ #endif
22
+ #include <fcntl.h>
23
+ #include <errno.h>
24
+
25
+ #ifndef HAVE_RB_ERRINFO
26
+ # define rb_errinfo() (ruby_errinfo)
27
+ #endif
28
+
29
+ #ifndef HAVE_RUBY_NATIVE_THREAD_P
30
+ # define ruby_native_thread_p() is_ruby_native_thread()
31
+ #endif
32
+
33
+ static VALUE rbgutil_eGLibCallbackNotInitializedError;
34
+ static ID id_exit_application;
35
+
36
+ /**********************************************************************/
37
+
38
+ VALUE
39
+ rbgutil_protect(VALUE (*func) (VALUE), VALUE data)
40
+ {
41
+ int state = 0;
42
+ VALUE ret = rb_protect(func, data, &state);
43
+ VALUE e = rb_errinfo();
44
+ if (state && !NIL_P(e))
45
+ rb_funcall(mGLib, id_exit_application, 2, e, INT2NUM(EXIT_FAILURE));
46
+ return ret;
47
+ }
48
+
49
+ /**********************************************************************/
50
+
51
+ #ifdef HAVE_NATIVETHREAD
52
+
53
+ typedef struct _CallbackRequest {
54
+ VALUE (*function)(VALUE);
55
+ VALUE argument;
56
+ VALUE result;
57
+ GMutex *done_mutex;
58
+ GCond *done_cond;
59
+ } CallbackRequest;
60
+
61
+ static GMutex *callback_dispatch_thread_mutex = NULL;
62
+ static GAsyncQueue *callback_request_queue = NULL;
63
+ static ID id_callback_dispatch_thread;
64
+ static gint callback_pipe_fds[2] = {-1, -1};
65
+
66
+ #define CALLBACK_PIPE_READY_MESSAGE "R"
67
+ #define CALLBACK_PIPE_READY_MESSAGE_SIZE 1
68
+
69
+ static VALUE
70
+ exec_callback(VALUE data)
71
+ {
72
+ CallbackRequest *request = (CallbackRequest *)data;
73
+ return request->function(request->argument);
74
+ }
75
+
76
+ static VALUE
77
+ process_request(CallbackRequest *request)
78
+ {
79
+ g_mutex_lock(request->done_mutex);
80
+ request->result = rbgutil_protect(exec_callback, (VALUE)request);
81
+ g_cond_signal(request->done_cond);
82
+ g_mutex_unlock(request->done_mutex);
83
+
84
+ return Qnil;
85
+ }
86
+
87
+ static VALUE
88
+ mainloop(void)
89
+ {
90
+ for (;;) {
91
+ CallbackRequest *request;
92
+ gchar ready_message_buffer[CALLBACK_PIPE_READY_MESSAGE_SIZE];
93
+
94
+ rb_thread_wait_fd(callback_pipe_fds[0]);
95
+ if (read(callback_pipe_fds[0], ready_message_buffer,
96
+ CALLBACK_PIPE_READY_MESSAGE_SIZE
97
+ ) != CALLBACK_PIPE_READY_MESSAGE_SIZE ||
98
+ strncmp(ready_message_buffer,
99
+ CALLBACK_PIPE_READY_MESSAGE,
100
+ CALLBACK_PIPE_READY_MESSAGE_SIZE) != 0) {
101
+ g_error("failed to read valid callback dispatcher message");
102
+ continue;
103
+ }
104
+ request = g_async_queue_pop(callback_request_queue);
105
+ if (!request)
106
+ break;
107
+
108
+ rb_thread_create(process_request, request);
109
+ }
110
+
111
+ close(callback_pipe_fds[0]);
112
+ callback_pipe_fds[0] = -1;
113
+ close(callback_pipe_fds[1]);
114
+ callback_pipe_fds[1] = -1;
115
+
116
+ return Qnil;
117
+ }
118
+
119
+ static void
120
+ queue_callback_request(CallbackRequest *request)
121
+ {
122
+ g_async_queue_push(callback_request_queue, request);
123
+ write(callback_pipe_fds[1],
124
+ CALLBACK_PIPE_READY_MESSAGE,
125
+ CALLBACK_PIPE_READY_MESSAGE_SIZE);
126
+ }
127
+
128
+ static VALUE
129
+ invoke_callback_in_ruby_thread(VALUE (*func)(VALUE), VALUE arg)
130
+ {
131
+ CallbackRequest request;
132
+
133
+ g_mutex_lock(callback_dispatch_thread_mutex);
134
+ if (callback_pipe_fds[0] == -1) {
135
+ g_error("Please call rbgutil_start_callback_dispatch_thread() "
136
+ "to dispatch a callback from non-ruby thread before "
137
+ "callbacks are requested from non-ruby thread.");
138
+ g_mutex_unlock(callback_dispatch_thread_mutex);
139
+ return Qnil;
140
+ }
141
+
142
+ request.function = func;
143
+ request.argument = arg;
144
+ request.result = Qnil;
145
+ request.done_mutex = g_mutex_new();
146
+ request.done_cond = g_cond_new();
147
+
148
+ g_mutex_lock(request.done_mutex);
149
+ queue_callback_request(&request);
150
+ g_mutex_unlock(callback_dispatch_thread_mutex);
151
+
152
+ g_cond_wait(request.done_cond, request.done_mutex);
153
+ g_mutex_unlock(request.done_mutex);
154
+
155
+ g_cond_free(request.done_cond);
156
+ g_mutex_free(request.done_mutex);
157
+
158
+
159
+ return request.result;
160
+ }
161
+ #endif
162
+
163
+ /**********************************************************************/
164
+
165
+ VALUE
166
+ rbgutil_invoke_callback(VALUE (*func)(VALUE), VALUE arg)
167
+ {
168
+ #ifdef HAVE_NATIVETHREAD
169
+ if (!ruby_native_thread_p()) {
170
+ return invoke_callback_in_ruby_thread(func, arg);
171
+ }
172
+ #endif
173
+ return rbgutil_protect(func, arg);
174
+ }
175
+
176
+ /**********************************************************************/
177
+
178
+ void
179
+ rbgutil_start_callback_dispatch_thread(void)
180
+ {
181
+ #ifdef HAVE_NATIVETHREAD
182
+ VALUE callback_dispatch_thread;
183
+
184
+ g_mutex_lock(callback_dispatch_thread_mutex);
185
+ callback_dispatch_thread = rb_ivar_get(mGLib, id_callback_dispatch_thread);
186
+ if (NIL_P(callback_dispatch_thread)) {
187
+ if (pipe(callback_pipe_fds) == -1)
188
+ rb_sys_fail("pipe()");
189
+
190
+ callback_dispatch_thread = rb_thread_create(mainloop, NULL);
191
+ rb_ivar_set(mGLib, id_callback_dispatch_thread,
192
+ callback_dispatch_thread);
193
+ }
194
+ g_mutex_unlock(callback_dispatch_thread_mutex);
195
+ #endif
196
+ }
197
+
198
+ void
199
+ rbgutil_stop_callback_dispatch_thread(void)
200
+ {
201
+ #ifdef HAVE_NATIVETHREAD
202
+ VALUE callback_dispatch_thread;
203
+
204
+ g_mutex_lock(callback_dispatch_thread_mutex);
205
+ callback_dispatch_thread = rb_ivar_get(mGLib, id_callback_dispatch_thread);
206
+ if (!NIL_P(callback_dispatch_thread)) {
207
+ queue_callback_request(NULL);
208
+ rb_ivar_set(mGLib, id_callback_dispatch_thread, Qnil);
209
+ }
210
+ g_mutex_unlock(callback_dispatch_thread_mutex);
211
+ #endif
212
+ }
213
+
214
+ void Init_gutil_callback()
215
+ {
216
+ id_exit_application = rb_intern("exit_application");
217
+ rbgutil_eGLibCallbackNotInitializedError =
218
+ rb_define_class_under(mGLib, "CallbackNotInitializedError",
219
+ rb_eRuntimeError);
220
+
221
+ #ifdef HAVE_NATIVETHREAD
222
+ if (!g_thread_supported())
223
+ g_thread_init(NULL);
224
+
225
+ id_callback_dispatch_thread = rb_intern("callback_dispatch_thread");
226
+ rb_ivar_set(mGLib, id_callback_dispatch_thread, Qnil);
227
+
228
+ callback_request_queue = g_async_queue_new();
229
+ callback_dispatch_thread_mutex = g_mutex_new();
230
+ #endif
231
+ }
@@ -0,0 +1,6 @@
1
+ $VERBOSE = true
2
+
3
+ glib_top = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+
5
+ $LOAD_PATH.unshift(File.join(glib_top, "test-unit", "lib"))
6
+ require 'test/unit'
@@ -0,0 +1,12 @@
1
+ module GLibTestUtils
2
+ private
3
+ def only_glib_version(major, minor, micro)
4
+ unless GLib.check_version?(major, minor, micro)
5
+ omit("Require GLib >= #{major}.#{minor}.#{micro}")
6
+ end
7
+ end
8
+
9
+ def only_win32
10
+ omit("Only for Win32 platform") unless GLib.os_win32?
11
+ end
12
+ end
data/test/run-test.rb ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ base = File.expand_path(File.join(File.dirname(__FILE__)))
4
+ top = File.expand_path(File.join(base, ".."))
5
+
6
+ $LOAD_PATH.unshift(top)
7
+ require 'test/glib-test-init'
8
+
9
+ if system("which make > /dev/null")
10
+ system("cd #{top.dump} && make > /dev/null") or exit(1)
11
+ end
12
+
13
+ $LOAD_PATH.unshift(File.join(top, "src"))
14
+ $LOAD_PATH.unshift(File.join(top, "src", "lib"))
15
+
16
+ $LOAD_PATH.unshift(base)
17
+ require 'glib-test-utils'
18
+
19
+ require 'glib2'
20
+
21
+ if !defined?(Test::Unit::AutoRunner)
22
+ require 'test-unit'
23
+ end
24
+
25
+ exit Test::Unit::AutoRunner.run(true, base)
data/test/test_enum.rb ADDED
@@ -0,0 +1,99 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'test/unit'
3
+ require 'glib2'
4
+
5
+ class TestEnum < Test::Unit::TestCase
6
+ def test_enum_by_symbol
7
+ original = [0x00c1].pack("U*") # A with acute
8
+
9
+ assert_equal(GLib::UTF8.normalize(original, GLib::NormalizeMode::NFD),
10
+ GLib::UTF8.normalize(original, :nfd))
11
+ assert_equal(GLib::UTF8.normalize(original, GLib::NormalizeMode::NFD),
12
+ GLib::UTF8.normalize(original, :NFD))
13
+
14
+ assert_raise(TypeError) do
15
+ GLib::UTF8.normalize(original, :unknown)
16
+ end
17
+ end
18
+
19
+ def test_enum_by_string
20
+ original = [0x00c1].pack("U*") # A with acute
21
+
22
+ assert_equal(GLib::UTF8.normalize(original, GLib::NormalizeMode::NFD),
23
+ GLib::UTF8.normalize(original, "nfd"))
24
+ assert_equal(GLib::UTF8.normalize(original, GLib::NormalizeMode::NFD),
25
+ GLib::UTF8.normalize(original, "NFD"))
26
+
27
+ assert_raise(TypeError) do
28
+ GLib::UTF8.normalize(original, "unknown")
29
+ end
30
+ end
31
+
32
+ def test_flags_simple
33
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS, :keep_comments)
34
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS, :KEEP_COMMENTS)
35
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS, "keep_comments")
36
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS, "KEEP_COMMENTS")
37
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS, "keep COMMENTS")
38
+
39
+ assert_raise(TypeError) do
40
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS, :unknown)
41
+ end
42
+
43
+ assert_raise(TypeError) do
44
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS, "UNKNOWN")
45
+ end
46
+ end
47
+
48
+ def test_flags_by_array
49
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS |
50
+ GLib::KeyFile::KEEP_TRANSLATIONS,
51
+ [:keep_comments, :keep_translations])
52
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS |
53
+ GLib::KeyFile::KEEP_TRANSLATIONS,
54
+ [:keep_COMMENTS, "KEEP_TRANSLATIONS"])
55
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS |
56
+ GLib::KeyFile::KEEP_TRANSLATIONS,
57
+ ["keep_comments", "KEEP_translations"])
58
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS |
59
+ GLib::KeyFile::KEEP_TRANSLATIONS,
60
+ [:keep_comments, GLib::KeyFile::KEEP_TRANSLATIONS])
61
+
62
+ assert_raise(TypeError) do
63
+ assert_key_file_load(GLib::KeyFile::KEEP_COMMENTS |
64
+ GLib::KeyFile::KEEP_TRANSLATIONS,
65
+ [:keep_comments, nil, :keep_translations])
66
+ end
67
+ end
68
+
69
+ def test_flags_or
70
+ assert_equal(GLib::KeyFile::KEEP_COMMENTS,
71
+ GLib::KeyFile::KEEP_COMMENTS | [])
72
+ assert_equal(GLib::KeyFile::KEEP_COMMENTS |
73
+ GLib::KeyFile::KEEP_TRANSLATIONS ,
74
+ GLib::KeyFile::KEEP_COMMENTS | [:keep_translations])
75
+ end
76
+
77
+ private
78
+ def assert_key_file_load(flags, convenience_flags)
79
+ data = <<-EOD
80
+ [SECTION]
81
+ KEY=VALUE
82
+ # comment
83
+
84
+ KEY[ja]=値
85
+ EOD
86
+
87
+ expected_key_file = GLib::KeyFile.new
88
+ expected_key_file.load_from_data(data, flags)
89
+
90
+ actual_key_file = GLib::KeyFile.new
91
+ actual_key_file.load_from_data(data, convenience_flags)
92
+
93
+ assert_equal(expected_key_file.get_value("SECTION", "KEY"),
94
+ actual_key_file.get_value("SECTION", "KEY"))
95
+
96
+ assert_equal(expected_key_file.to_data,
97
+ actual_key_file.to_data)
98
+ end
99
+ end