-
Notifications
You must be signed in to change notification settings - Fork 204
/
Copy pathtest_encoding.rb
178 lines (148 loc) · 5.33 KB
/
test_encoding.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
require "helper"
module SQLite3
class TestEncoding < SQLite3::TestCase
def setup
@db = SQLite3::Database.new(":memory:")
@create = "create table ex(id int, data string)"
@insert = "insert into ex(id, data) values (?, ?)"
@db.execute(@create)
end
def teardown
@db.close
end
def test_change_encoding
db = SQLite3::Database.new(":memory:")
assert_equal Encoding.find("UTF-8"), db.encoding
db.execute "PRAGMA encoding='UTF-16le'"
assert_equal Encoding.find("UTF-16le"), db.encoding
end
def test_encoding_when_results_are_hash
db = SQLite3::Database.new(":memory:", results_as_hash: true)
assert_equal Encoding.find("UTF-8"), db.encoding
db = SQLite3::Database.new(":memory:")
assert_equal Encoding.find("UTF-8"), db.encoding
end
def test_select_encoding_on_utf_16
str = "foo"
utf16 = ([1].pack("I") == [1].pack("N")) ? "UTF-16BE" : "UTF-16LE"
db = SQLite3::Database.new(":memory:".encode(utf16))
db.execute @create
db.execute "insert into ex (id, data) values (1, \"#{str}\")"
stmt = db.prepare "select * from ex where data = ?"
["US-ASCII", utf16, "EUC-JP", "UTF-8"].each do |enc|
stmt.bind_param 1, str.encode(enc)
assert_equal 1, stmt.to_a.length
stmt.reset!
end
stmt.close
end
def test_insert_encoding
str = "foo"
utf16 = ([1].pack("I") == [1].pack("N")) ? "UTF-16BE" : "UTF-16LE"
db = SQLite3::Database.new(":memory:".encode(utf16))
db.execute @create
stmt = db.prepare @insert
["US-ASCII", utf16, "EUC-JP", "UTF-8"].each_with_index do |enc, i|
stmt.bind_param 1, i
stmt.bind_param 2, str.encode(enc)
stmt.to_a
stmt.reset!
end
stmt.close
db.execute("select data from ex").flatten.each do |s|
assert_equal str, s
end
end
def test_default_internal_is_honored
warn_before = $-w
$-w = false
before_enc = Encoding.default_internal
str = "壁に耳あり、障子に目あり"
stmt = @db.prepare("insert into ex(data) values (?)")
stmt.bind_param 1, str
stmt.step
stmt.close
Encoding.default_internal = "EUC-JP"
string = @db.execute("select data from ex").first.first
assert_equal Encoding.default_internal, string.encoding
assert_equal str.encode("EUC-JP"), string
assert_equal str, string.encode(str.encoding)
ensure
Encoding.default_internal = before_enc
$-w = warn_before
end
def test_blob_is_binary
str = "猫舌"
@db.execute("create table foo(data text)")
stmt = @db.prepare("insert into foo(data) values (?)")
stmt.bind_param(1, SQLite3::Blob.new(str))
stmt.step
stmt.close
string = @db.execute("select data from foo").first.first
assert_equal Encoding.find("ASCII-8BIT"), string.encoding
assert_equal str, string.dup.force_encoding("UTF-8")
end
def test_blob_is_ascii8bit
str = "猫舌"
@db.execute("create table foo(data text)")
stmt = @db.prepare("insert into foo(data) values (?)")
stmt.bind_param(1, str.dup.force_encoding("ASCII-8BIT"))
stmt.step
stmt.close
string = @db.execute("select data from foo").first.first
assert_equal Encoding.find("ASCII-8BIT"), string.encoding
assert_equal str, string.dup.force_encoding("UTF-8")
end
def test_blob_with_eucjp
str = "猫舌".encode("EUC-JP")
@db.execute("create table foo(data text)")
stmt = @db.prepare("insert into foo(data) values (?)")
stmt.bind_param(1, SQLite3::Blob.new(str))
stmt.step
stmt.close
string = @db.execute("select data from foo").first.first
assert_equal Encoding.find("ASCII-8BIT"), string.encoding
assert_equal str, string.dup.force_encoding("EUC-JP")
end
def test_db_with_eucjp
db = SQLite3::Database.new(":memory:".encode("EUC-JP"))
assert_equal(Encoding.find("UTF-8"), db.encoding)
end
def test_db_with_utf16
utf16 = ([1].pack("I") == [1].pack("N")) ? "UTF-16BE" : "UTF-16LE"
db = SQLite3::Database.new(":memory:".encode(utf16))
assert_equal(Encoding.find(utf16), db.encoding)
end
def test_statement_eucjp
str = "猫舌"
@db.execute("insert into ex(data) values ('#{str}')".encode("EUC-JP"))
row = @db.execute("select data from ex")
assert_equal @db.encoding, row.first.first.encoding
assert_equal str, row.first.first
end
def test_statement_utf8
str = "猫舌"
@db.execute("insert into ex(data) values ('#{str}')")
row = @db.execute("select data from ex")
assert_equal @db.encoding, row.first.first.encoding
assert_equal str, row.first.first
end
def test_encoding
assert_equal Encoding.find("UTF-8"), @db.encoding
end
def test_utf_8
str = "猫舌"
@db.execute(@insert, [10, str])
row = @db.execute("select data from ex")
assert_equal @db.encoding, row.first.first.encoding
assert_equal str, row.first.first
end
def test_euc_jp
str = "猫舌".encode("EUC-JP")
@db.execute(@insert, [10, str])
row = @db.execute("select data from ex")
assert_equal @db.encoding, row.first.first.encoding
assert_equal str.encode("UTF-8"), row.first.first
end
end
end