ffi-efl 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +13 -1
- data/README.rdoc +24 -14
- data/lib/efl/ecore.rb +7 -7
- data/lib/efl/ecore_evas.rb +78 -0
- data/lib/efl/ecore_getopt.rb +28 -29
- data/lib/efl/ecore_input.rb +14 -0
- data/lib/efl/edje.rb +47 -1
- data/lib/efl/eet.rb +18 -25
- data/lib/efl/eina.rb +14 -0
- data/lib/efl/eina_hash.rb +84 -0
- data/lib/efl/eina_list.rb +77 -0
- data/lib/efl/elementary.rb +22 -9
- data/lib/efl/evas.rb +67 -25
- data/lib/efl/{ecore/ecore-ffi.rb → ffi/ecore.rb} +8 -5
- data/lib/efl/{ecore/ecore_evas-ffi.rb → ffi/ecore_evas.rb} +10 -7
- data/lib/efl/{ecore/ecore_getopt-ffi.rb → ffi/ecore_getopt.rb} +8 -5
- data/lib/efl/{ecore/ecore_input-ffi.rb → ffi/ecore_input.rb} +9 -6
- data/lib/efl/{edje/edje-ffi.rb → ffi/edje.rb} +10 -7
- data/lib/efl/{eet/eet-ffi.rb → ffi/eet.rb} +8 -5
- data/lib/efl/ffi/eina.rb +48 -0
- data/lib/efl/ffi/eina_hash.rb +111 -0
- data/lib/efl/ffi/eina_list.rb +108 -0
- data/lib/efl/{eina/eina_types-ffi.rb → ffi/eina_types.rb} +8 -5
- data/lib/efl/{elementary/elementary-ffi.rb → ffi/elementary.rb} +16 -9
- data/lib/efl/{evas/evas-ffi.rb → ffi/evas.rb} +153 -150
- data/lib/efl/ffi.rb +81 -38
- data/lib/efl.rb +9 -4
- data/spec/ecore_evas_spec.rb +24 -0
- data/spec/ecore_getopt_spec.rb +1 -2
- data/spec/ecore_input_spec.rb +24 -0
- data/spec/ecore_spec.rb +2 -3
- data/spec/edje_spec.rb +1 -1
- data/spec/eet_spec.rb +68 -69
- data/spec/eina_hash_spec.rb +180 -0
- data/spec/eina_list_spec.rb +101 -0
- data/spec/eina_spec.rb +20 -0
- data/spec/evas_spec.rb +288 -40
- data/tasks/ffi.rake +1 -1
- data/test/test_edje.rb +141 -0
- data/test/test_elm_win.rb +25 -28
- data/test/test_elm_win_class.rb +7 -7
- data/test/test_evas.rb +106 -0
- metadata +30 -17
data/lib/efl/ffi.rb
CHANGED
@@ -5,9 +5,7 @@ require 'ffi'
|
|
5
5
|
#
|
6
6
|
module Efl
|
7
7
|
#
|
8
|
-
module
|
9
|
-
#
|
10
|
-
extend FFI::Library
|
8
|
+
module FFIHelper
|
11
9
|
#
|
12
10
|
def attach_fcts fcts
|
13
11
|
fcts.each do |func|
|
@@ -18,53 +16,98 @@ module Efl
|
|
18
16
|
end
|
19
17
|
end
|
20
18
|
end
|
21
|
-
module_function :attach_fcts
|
22
19
|
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
typedef :pointer, :long_p
|
27
|
-
typedef :pointer, :float_p
|
28
|
-
typedef :pointer, :double_p
|
29
|
-
typedef :pointer, :uchar_p
|
30
|
-
typedef :pointer, :ushort_p
|
31
|
-
typedef :pointer, :uint_p
|
32
|
-
typedef :pointer, :ulong_p
|
33
|
-
typedef :pointer, :ufloat_p
|
34
|
-
typedef :pointer, :udouble_p
|
35
|
-
typedef :pointer, :void_p
|
36
|
-
typedef :pointer, :string_array
|
37
|
-
typedef :pointer, :string_array_p
|
20
|
+
def ffi_typedefs
|
21
|
+
@ffi_typedefs
|
22
|
+
end
|
38
23
|
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
24
|
+
def steal_ffitype mod, sym
|
25
|
+
typedef mod.ffi_typedefs[sym], sym
|
26
|
+
end
|
27
|
+
#
|
28
|
+
def self.extended mod
|
29
|
+
#
|
30
|
+
mod.extend FFI::Library
|
31
|
+
#
|
32
|
+
mod.typedef :pointer, :char_p
|
33
|
+
mod.typedef :pointer, :short_p
|
34
|
+
mod.typedef :pointer, :int_p
|
35
|
+
mod.typedef :pointer, :long_p
|
36
|
+
mod.typedef :pointer, :float_p
|
37
|
+
mod.typedef :pointer, :double_p
|
38
|
+
mod.typedef :pointer, :uchar_p
|
39
|
+
mod.typedef :pointer, :ushort_p
|
40
|
+
mod.typedef :pointer, :uint_p
|
41
|
+
mod.typedef :pointer, :ulong_p
|
42
|
+
mod.typedef :pointer, :ufloat_p
|
43
|
+
mod.typedef :pointer, :udouble_p
|
44
|
+
mod.typedef :pointer, :void_p
|
45
|
+
mod.typedef :pointer, :string_array
|
46
|
+
mod.typedef :pointer, :string_array_p
|
47
|
+
mod.typedef :uint_p, :uintptr_t
|
48
|
+
#
|
49
|
+
mod.typedef :bool, :eina_bool
|
50
|
+
mod.typedef :pointer, :eina_bool_p
|
51
|
+
mod.typedef :pointer, :eina_list_p
|
52
|
+
mod.typedef :pointer, :eina_hash_p
|
53
|
+
mod.typedef :pointer, :eina_iterator_p
|
54
|
+
mod.typedef :pointer, :eina_accessor_p
|
55
|
+
mod.typedef :pointer, :evas_p
|
56
|
+
mod.typedef :pointer, :evas_object_p
|
57
|
+
mod.typedef :pointer, :evas_object_pp
|
58
|
+
mod.typedef :pointer, :ecore_getopt_p
|
59
|
+
mod.typedef :pointer, :ecore_getopt_desc_p
|
60
|
+
mod.typedef :pointer, :ecore_getopt_value_p
|
61
|
+
#
|
62
|
+
mod.callback :eina_compare_cb, [ :void_p, :void_p ], :int
|
63
|
+
mod.callback :eina_each_cb, [ :void_p, :void_p, :void_p ], :eina_bool
|
64
|
+
mod.callback :eina_free_cb, [ :void_p ], :void
|
65
|
+
#
|
66
|
+
end
|
44
67
|
#
|
45
68
|
end
|
46
69
|
#
|
47
|
-
module
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
70
|
+
module ClassHelper
|
71
|
+
def to_ptr; @ptr; end
|
72
|
+
def === o; @ptr === o.to_ptr; end
|
73
|
+
def address; @ptr.address; end
|
74
|
+
def self.included kls
|
75
|
+
# create class instance @proxy_list
|
76
|
+
kls.class_eval "@proxy_list ||=[]"
|
77
|
+
# access and prepend *args to @proxy_list
|
78
|
+
kls.class_eval "def self.proxy_list *args; @proxy_list.unshift *args unless args.empty?; @proxy_list; end"
|
79
|
+
# on inheritance, copy ancestor's @proxy_list
|
80
|
+
kls.class_eval <<-EOF
|
81
|
+
def self.inherited sub
|
82
|
+
sub.class_eval '@proxy_list = []'
|
83
|
+
sub.proxy_list *self.proxy_list
|
84
|
+
end
|
85
|
+
EOF
|
52
86
|
end
|
53
87
|
def method_missing m, *args, &block
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
88
|
+
if m =~/^(.*)=$/
|
89
|
+
m_s = $1+'_set'
|
90
|
+
args_s = '*args[0]'
|
91
|
+
elsif m =~/^(.*)\?$/
|
92
|
+
m_s = $1+'_get'
|
93
|
+
args_s = '*args'
|
94
|
+
else
|
95
|
+
m_s = m.to_s
|
96
|
+
args_s = '*args'
|
97
|
+
end
|
98
|
+
self.class.proxy_list.each do |mod,p|
|
99
|
+
sym = p+m_s
|
100
|
+
if mod.respond_to? sym
|
101
|
+
self.class.class_eval "def #{m} *args, █ r=#{mod.name}.#{sym}(@ptr,#{args_s}); yield r if block_given?; r; end"
|
102
|
+
return self.send m, *args, &block
|
103
|
+
elsif mod.respond_to? m
|
104
|
+
self.class.class_eval "def #{m} *args, █ r=#{mod.name}.#{m}(@ptr,#{args_s}); yield r if block_given?; r; end"
|
58
105
|
return self.send m, *args, &block
|
59
106
|
end
|
60
107
|
end
|
61
|
-
|
62
|
-
self.class.class_eval "def #{m} *args, █ r=Efl::API.#{m}(@ptr,*args); yield r if block_given?; r; end"
|
63
|
-
r
|
108
|
+
raise NameError.new "#{self.class} is unable to resolve #{m} within #{self.class.proxy_list.inspect}"
|
64
109
|
end
|
65
110
|
end
|
66
111
|
end
|
67
112
|
#
|
68
|
-
require 'efl/eina/eina_types-ffi'
|
69
|
-
#
|
70
113
|
# EOF
|
data/lib/efl.rb
CHANGED
@@ -4,14 +4,19 @@
|
|
4
4
|
#
|
5
5
|
module Efl
|
6
6
|
#
|
7
|
-
VERSION = '0.0.
|
7
|
+
VERSION = '0.0.3'
|
8
8
|
#
|
9
|
-
autoload :
|
10
|
-
autoload :Evas, './lib/efl/evas.rb'
|
11
|
-
autoload :Ecore, './lib/efl/ecore.rb'
|
9
|
+
autoload :EcoreEvas, './lib/efl/ecore_evas.rb'
|
12
10
|
autoload :EcoreGetopt, './lib/efl/ecore_getopt.rb'
|
11
|
+
autoload :EcoreInput, './lib/efl/ecore_input.rb'
|
12
|
+
autoload :Ecore, './lib/efl/ecore.rb'
|
13
13
|
autoload :Edje, './lib/efl/edje.rb'
|
14
|
+
autoload :Eet, './lib/efl/eet.rb'
|
15
|
+
autoload :EinHash, './lib/efl/eina_hash.rb'
|
16
|
+
autoload :EinaList, './lib/efl/eina_list.rb'
|
17
|
+
autoload :Eina, './lib/efl/eina.rb'
|
14
18
|
autoload :Elm, './lib/efl/elementary.rb'
|
19
|
+
autoload :Evas, './lib/efl/evas.rb'
|
15
20
|
end
|
16
21
|
#
|
17
22
|
# EOF
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
require 'efl/ecore_evas'
|
5
|
+
#
|
6
|
+
describe Efl::EcoreEvas do
|
7
|
+
#
|
8
|
+
before(:all) do
|
9
|
+
EcoreEvas = Efl::EcoreEvas
|
10
|
+
end
|
11
|
+
#
|
12
|
+
it "should init" do
|
13
|
+
EcoreEvas.init.should eql 1
|
14
|
+
EcoreEvas.init.should eql 2
|
15
|
+
EcoreEvas.init.should eql 3
|
16
|
+
end
|
17
|
+
#
|
18
|
+
it "should shutdown" do
|
19
|
+
EcoreEvas.shutdown.should eql 2
|
20
|
+
EcoreEvas.shutdown.should eql 1
|
21
|
+
EcoreEvas.shutdown.should eql 0
|
22
|
+
end
|
23
|
+
#
|
24
|
+
end
|
data/spec/ecore_getopt_spec.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# -*- coding: UTF-8 -*-
|
3
3
|
#
|
4
|
-
require 'efl/ecore'
|
5
4
|
require 'efl/ecore_getopt'
|
6
5
|
#
|
7
6
|
describe Efl::EcoreGetopt do
|
@@ -9,7 +8,7 @@ describe Efl::EcoreGetopt do
|
|
9
8
|
before(:all) do
|
10
9
|
Efl::Ecore.init
|
11
10
|
#
|
12
|
-
@p = Efl::EcoreGetopt::
|
11
|
+
@p = Efl::EcoreGetopt::REcoreGetopt.new :prog =>"Prog", :usage => "Usage", :version => "0.0.0", :copyright => "less", :license => "MIT", :description => "description", :strict => 1
|
13
12
|
@callback = Proc.new do |parser, desc, string, data, value|
|
14
13
|
parser.address.should eql @p.to_ptr.address
|
15
14
|
string.should eql "my_data"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
require 'efl/ecore_input'
|
5
|
+
#
|
6
|
+
describe Efl::EcoreInput do
|
7
|
+
#
|
8
|
+
before(:all) do
|
9
|
+
EcoreInput = Efl::EcoreInput
|
10
|
+
end
|
11
|
+
#
|
12
|
+
it "should init" do
|
13
|
+
EcoreInput.init.should eql 1
|
14
|
+
EcoreInput.init.should eql 2
|
15
|
+
EcoreInput.init.should eql 3
|
16
|
+
end
|
17
|
+
#
|
18
|
+
it "should shutdown" do
|
19
|
+
EcoreInput.shutdown.should eql 2
|
20
|
+
EcoreInput.shutdown.should eql 1
|
21
|
+
EcoreInput.shutdown.should eql 0
|
22
|
+
end
|
23
|
+
#
|
24
|
+
end
|
data/spec/ecore_spec.rb
CHANGED
@@ -4,10 +4,9 @@
|
|
4
4
|
require 'efl/ecore'
|
5
5
|
#
|
6
6
|
describe Efl::Ecore do
|
7
|
-
#
|
8
|
-
include Efl
|
9
7
|
#
|
10
8
|
before(:all) do
|
9
|
+
Ecore = Efl::Ecore
|
11
10
|
USER_SIGNAL_CB = Proc.new do |data, type, event|
|
12
11
|
data.read_string.should eql "ok"
|
13
12
|
type.should eql Ecore::EVENT_SIGNAL_USER
|
@@ -51,7 +50,7 @@ describe Efl::Ecore do
|
|
51
50
|
bytes.should eql 12
|
52
51
|
end
|
53
52
|
Ecore.init
|
54
|
-
pipe = Ecore::
|
53
|
+
pipe = Ecore::REcorePipe.new cb, data
|
55
54
|
pipe.write("hello world").should be_true
|
56
55
|
Ecore.main_loop_iterate
|
57
56
|
pipe.read_close
|
data/spec/edje_spec.rb
CHANGED
data/spec/eet_spec.rb
CHANGED
@@ -5,7 +5,10 @@ require 'efl/eet'
|
|
5
5
|
#
|
6
6
|
describe Efl::Eet do
|
7
7
|
#
|
8
|
-
|
8
|
+
before(:all) {
|
9
|
+
Eet = Efl::Eet
|
10
|
+
REetFile = Efl::Eet::REetFile
|
11
|
+
}
|
9
12
|
#
|
10
13
|
FP = '/tmp/_eet.cfg'
|
11
14
|
#
|
@@ -28,80 +31,76 @@ describe Efl::Eet do
|
|
28
31
|
end
|
29
32
|
#
|
30
33
|
it "should have good enums" do
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
34
|
+
Eet.enum_type(:eet_file_mode)[:eet_file_mode_invalid].should eql -1
|
35
|
+
Eet.enum_type(:eet_file_mode)[:eet_file_mode_read].should eql 0
|
36
|
+
Eet.enum_type(:eet_file_mode)[:eet_file_mode_write].should eql 1
|
37
|
+
Eet.enum_type(:eet_file_mode)[:eet_file_mode_read_write].should eql 2
|
35
38
|
end
|
36
39
|
#
|
37
|
-
|
38
|
-
Eet.init
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
40
|
+
describe Efl::Eet::REetFile do
|
41
|
+
before(:each) { Eet.init }
|
42
|
+
after(:each) { Eet.shutdown }
|
43
|
+
#
|
44
|
+
it "should open and close" do
|
45
|
+
f = REetFile.open FP, Eet.enum_type(:eet_file_mode)[:eet_file_mode_write]
|
46
|
+
f.write 'fake', 'value'
|
47
|
+
f.close
|
48
|
+
end
|
49
|
+
#
|
50
|
+
it "should be able to get file access mode" do
|
51
|
+
Eet.enum_type(:eet_file_mode).symbols.each do |m|
|
52
|
+
next if m==:eet_file_mode_invalid
|
53
|
+
REetFile.open FP, Eet.enum_type(:eet_file_mode)[m] do |f|
|
54
|
+
f.mode_get.should eql m
|
55
|
+
end
|
51
56
|
end
|
52
57
|
end
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
f.mode_get.should eql :eet_file_mode_write
|
60
|
-
f.write 'config', 'test key'
|
61
|
-
f.close
|
62
|
-
Eet.shutdown
|
63
|
-
end
|
64
|
-
#
|
65
|
-
it "should read" do
|
66
|
-
Eet.init
|
67
|
-
f = Eet.open FP, :eet_file_mode_read
|
68
|
-
f.mode_get.should eql :eet_file_mode_read
|
69
|
-
f.read('config').should eql 'test key'
|
70
|
-
f.close
|
71
|
-
Eet.shutdown
|
72
|
-
end
|
73
|
-
#
|
74
|
-
it "should read/write" do
|
75
|
-
Eet.init
|
76
|
-
f = Eet.open FP, :eet_file_mode_read_write
|
77
|
-
f.write 'configg', 'test key'
|
78
|
-
f.read('configg').should eql 'test key'
|
79
|
-
f.close
|
80
|
-
Eet.shutdown
|
81
|
-
end
|
82
|
-
#
|
83
|
-
it "should write in block" do
|
84
|
-
Eet.init
|
85
|
-
Eet.open FP, :eet_file_mode_write do |f|
|
86
|
-
f.write 'config2', 'test--key'
|
58
|
+
#
|
59
|
+
it "should write" do
|
60
|
+
f = REetFile.open FP, :eet_file_mode_write
|
61
|
+
f.mode_get.should eql :eet_file_mode_write
|
62
|
+
f.write 'config', 'test key'
|
63
|
+
f.close
|
87
64
|
end
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
Eet.open FP, :eet_file_mode_read do |f|
|
94
|
-
f.read('config2').should eql 'test--key'
|
65
|
+
#
|
66
|
+
it "default mode should be read" do
|
67
|
+
f = REetFile.open FP
|
68
|
+
f.mode_get.should eql :eet_file_mode_read
|
69
|
+
f.close
|
95
70
|
end
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
71
|
+
#
|
72
|
+
it "should read" do
|
73
|
+
f = REetFile.open FP, :eet_file_mode_read
|
74
|
+
f.mode_get.should eql :eet_file_mode_read
|
75
|
+
f.read('config').should eql 'test key'
|
76
|
+
f.close
|
77
|
+
end
|
78
|
+
#
|
79
|
+
it "should read/write" do
|
80
|
+
f = REetFile.open FP, :eet_file_mode_read_write
|
81
|
+
f.write 'configg', 'test key'
|
82
|
+
f.read('configg').should eql 'test key'
|
83
|
+
f.close
|
84
|
+
end
|
85
|
+
#
|
86
|
+
it "should write in block" do
|
87
|
+
REetFile.open FP, :eet_file_mode_write do |f|
|
88
|
+
f.write 'config2', 'test--key'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
#
|
92
|
+
it "should read in block" do
|
93
|
+
REetFile.open FP, :eet_file_mode_read do |f|
|
94
|
+
f.read('config2').should eql 'test--key'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
#
|
98
|
+
it "should read/write in block" do
|
99
|
+
REetFile.open FP, :eet_file_mode_read_write do |f|
|
100
|
+
f.write 'config22', 'test--key'
|
101
|
+
f.read('config22').should eql 'test--key'
|
102
|
+
end
|
104
103
|
end
|
105
|
-
|
104
|
+
#
|
106
105
|
end
|
107
106
|
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
require 'efl/eina_hash'
|
5
|
+
#
|
6
|
+
describe Efl::EinaHash do
|
7
|
+
#
|
8
|
+
before(:all) {
|
9
|
+
REinaHash = Efl::EinaHash::REinaHash
|
10
|
+
Efl::Eina.init.should eql 1
|
11
|
+
@d0 = FFI::MemoryPointer.from_string "D0"
|
12
|
+
@d1 = FFI::MemoryPointer.from_string "D1"
|
13
|
+
@d2 = FFI::MemoryPointer.from_string "D2"
|
14
|
+
@d3 = FFI::MemoryPointer.from_string "D3"
|
15
|
+
}
|
16
|
+
after(:all) {
|
17
|
+
Efl::Eina.shutdown.should eql 0
|
18
|
+
}
|
19
|
+
#
|
20
|
+
it "should append prepend and fetch" do
|
21
|
+
h = REinaHash.new
|
22
|
+
h.add 'k2', @d2
|
23
|
+
h.add 'k1', @d1
|
24
|
+
h['k3']=@d3
|
25
|
+
h['k0']=@d0
|
26
|
+
h['k0'].read_string.should eql "D0"
|
27
|
+
h['k1'].read_string.should eql "D1"
|
28
|
+
h['k2'].read_string.should eql "D2"
|
29
|
+
h['k3'].read_string.should eql "D3"
|
30
|
+
cpt=0
|
31
|
+
h.each { |k,v|
|
32
|
+
cpt+=1
|
33
|
+
v.read_string.empty?.should be_false
|
34
|
+
}
|
35
|
+
cpt.should eql 4
|
36
|
+
end
|
37
|
+
#
|
38
|
+
it "should be able to convert into ruby Hash from NULL pointer" do
|
39
|
+
h = Hash.from_eina_hash FFI::Pointer::NULL
|
40
|
+
h.empty?.should be_true
|
41
|
+
h.is_a?(Hash).should be_true
|
42
|
+
end
|
43
|
+
#
|
44
|
+
it "should be able to convert into ruby Hash from empty REinaHash" do
|
45
|
+
h = Hash.from_eina_hash REinaHash.new
|
46
|
+
h.empty?.should be_true
|
47
|
+
h.is_a?(Hash).should be_true
|
48
|
+
end
|
49
|
+
#
|
50
|
+
it "should be able to convert into ruby Hash from empty REinaHash pointer" do
|
51
|
+
h = Hash.from_eina_hash REinaHash.new.to_ptr
|
52
|
+
h.empty?.should be_true
|
53
|
+
h.is_a?(Hash).should be_true
|
54
|
+
end
|
55
|
+
#
|
56
|
+
it "should be able to convert into ruby Hash from non empty REinaHash" do
|
57
|
+
h = REinaHash.new
|
58
|
+
d0 = FFI::MemoryPointer.from_string "D0"
|
59
|
+
d1 = FFI::MemoryPointer.from_string "D1"
|
60
|
+
d2 = FFI::MemoryPointer.from_string "D2"
|
61
|
+
d3 = FFI::MemoryPointer.from_string "D3"
|
62
|
+
h.add 'k2', d2
|
63
|
+
h.add 'k1', d1
|
64
|
+
h['k3']=d3
|
65
|
+
h["k0"]=d0
|
66
|
+
h["k0"].read_string.should eql "D0"
|
67
|
+
h['k1'].read_string.should eql "D1"
|
68
|
+
h['k2'].read_string.should eql "D2"
|
69
|
+
h['k3'].read_string.should eql "D3"
|
70
|
+
cpt=0
|
71
|
+
h.each { |k,v|
|
72
|
+
cpt+=1
|
73
|
+
v.read_string.empty?.should be_false
|
74
|
+
true
|
75
|
+
}
|
76
|
+
cpt.should eql 4
|
77
|
+
rh = Hash.from_eina_hash h
|
78
|
+
rh.length.should eql 4
|
79
|
+
rh2 = {}
|
80
|
+
rh.each { |k,v|
|
81
|
+
rh2[k.read_string]=v.read_string
|
82
|
+
true
|
83
|
+
}
|
84
|
+
rh2['k0'].should eql 'D0'
|
85
|
+
rh2['k1'].should eql 'D1'
|
86
|
+
rh2['k2'].should eql 'D2'
|
87
|
+
rh2['k3'].should eql 'D3'
|
88
|
+
end
|
89
|
+
#
|
90
|
+
it "should be able to convert into ruby Hash from non empty REinaHash pointer" do
|
91
|
+
h = REinaHash.new
|
92
|
+
d0 = FFI::MemoryPointer.from_string "D0"
|
93
|
+
d1 = FFI::MemoryPointer.from_string "D1"
|
94
|
+
d2 = FFI::MemoryPointer.from_string "D2"
|
95
|
+
d3 = FFI::MemoryPointer.from_string "D3"
|
96
|
+
h.add 'k2', d2
|
97
|
+
h.add 'k1', d1
|
98
|
+
h['k3']=d3
|
99
|
+
h['k0']=d0
|
100
|
+
h['k0'].read_string.should eql "D0"
|
101
|
+
h['k1'].read_string.should eql "D1"
|
102
|
+
h['k2'].read_string.should eql "D2"
|
103
|
+
h['k3'].read_string.should eql "D3"
|
104
|
+
rh = Hash.from_eina_hash h.to_ptr
|
105
|
+
rh.length.should eql 4
|
106
|
+
end
|
107
|
+
#
|
108
|
+
it "should be able to convert into ruby Hash from non empty REinaHash pointer, with key from string" do
|
109
|
+
h = REinaHash.new
|
110
|
+
d0 = FFI::MemoryPointer.from_string "D0"
|
111
|
+
d1 = FFI::MemoryPointer.from_string "D1"
|
112
|
+
d2 = FFI::MemoryPointer.from_string "D2"
|
113
|
+
d3 = FFI::MemoryPointer.from_string "D3"
|
114
|
+
h.add 'k2', d2
|
115
|
+
h.add 'k1', d1
|
116
|
+
h['k3']=d3
|
117
|
+
h['k0']=d0
|
118
|
+
h['k0'].read_string.should eql "D0"
|
119
|
+
h['k1'].read_string.should eql "D1"
|
120
|
+
h['k2'].read_string.should eql "D2"
|
121
|
+
h['k3'].read_string.should eql "D3"
|
122
|
+
rh = h.to_h_conv
|
123
|
+
rh.length.should eql 4
|
124
|
+
rh['k0'].read_string.should eql "D0"
|
125
|
+
rh['k1'].read_string.should eql "D1"
|
126
|
+
rh['k2'].read_string.should eql "D2"
|
127
|
+
rh['k3'].read_string.should eql "D3"
|
128
|
+
end
|
129
|
+
#
|
130
|
+
it "should be able to convert into ruby Hash from non empty REinaHash pointer, with key from string block" do
|
131
|
+
h = REinaHash.new
|
132
|
+
d0 = FFI::MemoryPointer.from_string "D0"
|
133
|
+
d1 = FFI::MemoryPointer.from_string "D1"
|
134
|
+
d2 = FFI::MemoryPointer.from_string "D2"
|
135
|
+
d3 = FFI::MemoryPointer.from_string "D3"
|
136
|
+
h.add 'k2', d2
|
137
|
+
h.add 'k1', d1
|
138
|
+
h['k3']=d3
|
139
|
+
h['k0']=d0
|
140
|
+
h['k0'].read_string.should eql "D0"
|
141
|
+
h['k1'].read_string.should eql "D1"
|
142
|
+
h['k2'].read_string.should eql "D2"
|
143
|
+
h['k3'].read_string.should eql "D3"
|
144
|
+
cpt=0
|
145
|
+
rh = h.to_h_conv { |k| cpt+=1; k.read_string }
|
146
|
+
cpt.should eql 4
|
147
|
+
rh.length.should eql 4
|
148
|
+
rh['k0'].read_string.should eql "D0"
|
149
|
+
rh['k1'].read_string.should eql "D1"
|
150
|
+
rh['k2'].read_string.should eql "D2"
|
151
|
+
rh['k3'].read_string.should eql "D3"
|
152
|
+
end
|
153
|
+
#
|
154
|
+
it "should be able to build from ruby Hash" do
|
155
|
+
rh = {}
|
156
|
+
k0 = FFI::MemoryPointer.from_string "0"
|
157
|
+
k1 = FFI::MemoryPointer.from_string "1"
|
158
|
+
k2 = FFI::MemoryPointer.from_string "2"
|
159
|
+
k3 = FFI::MemoryPointer.from_string "3"
|
160
|
+
d0 = FFI::MemoryPointer.from_string "D0"
|
161
|
+
d1 = FFI::MemoryPointer.from_string "D1"
|
162
|
+
d2 = FFI::MemoryPointer.from_string "D2"
|
163
|
+
d3 = FFI::MemoryPointer.from_string "D3"
|
164
|
+
rh[k0]=d0
|
165
|
+
rh[k1]=d1
|
166
|
+
rh[k2]=d2
|
167
|
+
rh[k3]=d3
|
168
|
+
h = REinaHash.new rh
|
169
|
+
h[k0].read_string.should eql "D0"
|
170
|
+
h[k1].read_string.should eql "D1"
|
171
|
+
h[k2].read_string.should eql "D2"
|
172
|
+
h[k3].read_string.should eql "D3"
|
173
|
+
end
|
174
|
+
#
|
175
|
+
it "alternate constructor should work" do
|
176
|
+
cstr_cnt = 0
|
177
|
+
h = REinaHash.new { cstr_cnt+=1; Efl::EinaHash.eina_hash_string_superfast_new FFI::Pointer::NULL }
|
178
|
+
cstr_cnt.should eql 1
|
179
|
+
end
|
180
|
+
end
|