sqlite3 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +7 -4
- data/VERSION +1 -1
- data/lib/sqlite3.rb +15 -0
- data/lib/sqlite3/database.rb +16 -339
- data/lib/sqlite3/driver/ffi/api.rb +65 -218
- data/lib/sqlite3/driver/ffi/driver.rb +141 -194
- data/lib/sqlite3/encoding.rb +43 -0
- data/lib/sqlite3/errors.rb +0 -2
- data/lib/sqlite3/pragmas.rb +0 -2
- data/lib/sqlite3/resultset.rb +8 -8
- data/lib/sqlite3/statement.rb +4 -18
- data/lib/sqlite3/translator.rb +0 -3
- data/lib/sqlite3/value.rb +0 -2
- data/test/fixtures/SQLite.gif +0 -0
- data/test/test_database_initialization.rb +25 -0
- data/test/test_database_queries_utf_16.rb +80 -0
- data/test/test_database_queries_utf_8.rb +80 -0
- metadata +18 -10
- data/test/test_database_queries.rb +0 -29
@@ -0,0 +1,43 @@
|
|
1
|
+
module SQLite3
|
2
|
+
class Encoding
|
3
|
+
class << self
|
4
|
+
def find(encoding)
|
5
|
+
enc = encoding.to_s
|
6
|
+
if enc.downcase == "utf-16"
|
7
|
+
utf_16native
|
8
|
+
else
|
9
|
+
::Encoding.find(enc).tap do |e|
|
10
|
+
if utf_16?(e) && e != utf_16native
|
11
|
+
raise ArgumentError, "requested to use byte order different than native"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def utf_16?(str_or_enc)
|
18
|
+
enc = str_or_enc.kind_of?(::Encoding) ? str_or_enc : str_or_enc.encoding
|
19
|
+
[utf_16le, utf_16be].include?(enc)
|
20
|
+
end
|
21
|
+
|
22
|
+
def utf_16native
|
23
|
+
"Ruby".unpack("i")[0] == 2036495698 ? utf_16le : utf_16be
|
24
|
+
end
|
25
|
+
|
26
|
+
def us_ascii
|
27
|
+
::Encoding::US_ASCII
|
28
|
+
end
|
29
|
+
|
30
|
+
def utf_8
|
31
|
+
::Encoding::UTF_8
|
32
|
+
end
|
33
|
+
|
34
|
+
def utf_16le
|
35
|
+
::Encoding::UTF_16LE
|
36
|
+
end
|
37
|
+
|
38
|
+
def utf_16be
|
39
|
+
::Encoding::UTF_16BE
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/sqlite3/errors.rb
CHANGED
data/lib/sqlite3/pragmas.rb
CHANGED
data/lib/sqlite3/resultset.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require "sqlite3/constants"
|
2
|
-
require "sqlite3/errors"
|
3
|
-
|
4
1
|
module SQLite3
|
5
2
|
|
6
3
|
# The ResultSet object encapsulates the enumerability of a query's output.
|
@@ -31,10 +28,11 @@ module SQLite3
|
|
31
28
|
|
32
29
|
# Create a new ResultSet attached to the given database, using the
|
33
30
|
# given sql text.
|
34
|
-
def initialize(db, stmt)
|
31
|
+
def initialize(db, stmt, utf_16 = false)
|
35
32
|
@db = db
|
36
33
|
@driver = @db.driver
|
37
34
|
@stmt = stmt
|
35
|
+
@utf_16 = utf_16
|
38
36
|
commence
|
39
37
|
end
|
40
38
|
|
@@ -103,14 +101,16 @@ module SQLite3
|
|
103
101
|
@driver.data_count(@stmt.handle).times do |column|
|
104
102
|
type = @driver.column_type(@stmt.handle, column)
|
105
103
|
|
106
|
-
if type == Constants::ColumnType::
|
107
|
-
row << @driver.column_text(@stmt.handle, column)
|
108
|
-
elsif type == Constants::ColumnType::NULL
|
104
|
+
if type == Constants::ColumnType::NULL
|
109
105
|
row << nil
|
110
106
|
elsif type == Constants::ColumnType::BLOB
|
111
107
|
row << @driver.column_blob(@stmt.handle, column)
|
108
|
+
elsif type == Constants::ColumnType::INTEGER
|
109
|
+
row << @driver.column_int64(@stmt.handle, column)
|
110
|
+
elsif type == Constants::ColumnType::FLOAT
|
111
|
+
row << @driver.column_double(@stmt.handle, column)
|
112
112
|
else
|
113
|
-
row << @driver.column_text(@stmt.handle, column)
|
113
|
+
row << @driver.column_text(@stmt.handle, column, @utf_16)
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
data/lib/sqlite3/statement.rb
CHANGED
@@ -1,18 +1,5 @@
|
|
1
|
-
require "sqlite3/errors"
|
2
|
-
require "sqlite3/resultset"
|
3
|
-
|
4
|
-
class String
|
5
|
-
def to_blob
|
6
|
-
SQLite3::Blob.new(self)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
1
|
module SQLite3
|
11
2
|
|
12
|
-
# A class for differentiating between strings and blobs, when binding them
|
13
|
-
# into statements.
|
14
|
-
class Blob < String; end
|
15
|
-
|
16
3
|
# A statement represents a prepared-but-unexecuted SQL query. It will rarely
|
17
4
|
# (if ever) be instantiated directly by a client, and is most often obtained
|
18
5
|
# via the Database#prepare method.
|
@@ -30,12 +17,13 @@ module SQLite3
|
|
30
17
|
# encapsulates the given SQL text. If the text contains more than one
|
31
18
|
# statement (i.e., separated by semicolons), then the #remainder property
|
32
19
|
# will be set to the trailing text.
|
33
|
-
def initialize(db, sql,
|
20
|
+
def initialize(db, sql, utf_16 = false)
|
34
21
|
raise ArgumentError, "nil argument passed as sql text" unless sql
|
35
22
|
@db = db
|
36
23
|
@driver = @db.driver
|
37
24
|
@closed = false
|
38
25
|
@results = @columns = nil
|
26
|
+
@utf_16 = utf_16
|
39
27
|
result, @handle, @remainder = @driver.prepare(@db.handle, sql)
|
40
28
|
Error.check(result, @db)
|
41
29
|
end
|
@@ -98,12 +86,10 @@ module SQLite3
|
|
98
86
|
end
|
99
87
|
when Numeric then
|
100
88
|
@driver.bind_double(@handle, param, value.to_f)
|
101
|
-
when Blob then
|
102
|
-
@driver.bind_blob(@handle, param, value)
|
103
89
|
when nil then
|
104
90
|
@driver.bind_null(@handle, param)
|
105
91
|
else
|
106
|
-
@driver.
|
92
|
+
@driver.bind_string(@handle, param, value.to_s)
|
107
93
|
end
|
108
94
|
else
|
109
95
|
param = param.to_s
|
@@ -133,7 +119,7 @@ module SQLite3
|
|
133
119
|
reset! if active?
|
134
120
|
|
135
121
|
bind_params(*bind_vars) unless bind_vars.empty?
|
136
|
-
@results = ResultSet.new(@db, self)
|
122
|
+
@results = ResultSet.new(@db, self, @utf_16)
|
137
123
|
|
138
124
|
if block_given?
|
139
125
|
yield @results
|
data/lib/sqlite3/translator.rb
CHANGED
data/lib/sqlite3/value.rb
CHANGED
Binary file
|
@@ -23,4 +23,29 @@ class TestDatabaseInitialization < Test::Unit::TestCase
|
|
23
23
|
@db.close
|
24
24
|
assert @db.closed?
|
25
25
|
end
|
26
|
+
|
27
|
+
def test_encoding_conversion_from_utf_16_to_utf_8
|
28
|
+
expected_string = "test"
|
29
|
+
db_filename = "test_database_encoding.db"
|
30
|
+
File.delete(db_filename) if File.exists?(db_filename)
|
31
|
+
db = SQLite3::Database.new(db_filename, :encoding => "utf-16le")
|
32
|
+
db.execute("CREATE TABLE t1(t TEXT)")
|
33
|
+
db.execute("INSERT INTO t1 VALUES (?)", expected_string.encode(Encoding::UTF_8))
|
34
|
+
db.execute("INSERT INTO t1 VALUES (?)", expected_string.encode(Encoding::UTF_16LE))
|
35
|
+
rows = db.execute("SELECT * FROM t1")
|
36
|
+
assert_equal 2, rows.size
|
37
|
+
assert_equal expected_string.encode(Encoding::UTF_16LE), rows[0][0]
|
38
|
+
assert_equal Encoding::UTF_16LE, rows[0][0].encoding
|
39
|
+
assert_equal expected_string.encode(Encoding::UTF_16LE), rows[1][0]
|
40
|
+
assert_equal Encoding::UTF_16LE, rows[1][0].encoding
|
41
|
+
db.close
|
42
|
+
db = SQLite3::Database.new(db_filename)
|
43
|
+
rows = db.execute("SELECT * FROM t1")
|
44
|
+
assert_equal 2, rows.size
|
45
|
+
assert_equal expected_string, rows[0][0]
|
46
|
+
assert_equal Encoding::UTF_8, rows[0][0].encoding
|
47
|
+
assert_equal expected_string, rows[1][0]
|
48
|
+
assert_equal Encoding::UTF_8, rows[1][0].encoding
|
49
|
+
File.delete(db_filename) if File.exists?(db_filename)
|
50
|
+
end
|
26
51
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestDatabaseQueriesUtf16 < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@db = SQLite3::Database.new(":memory:", :encoding => "utf-16")
|
6
|
+
@db.execute("CREATE TABLE t1(id INTEGER PRIMARY KEY ASC, t TEXT, nu1 NUMERIC, i1 INTEGER, i2 INTEGER, no BLOB)")
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
@db.close
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_tables_empty
|
14
|
+
assert_equal [], @db.execute("SELECT * FROM t1")
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_execute
|
18
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, 'text1', 1.22, 42, 4294967296, NULL)")
|
19
|
+
rows = @db.execute("SELECT * FROM t1")
|
20
|
+
assert_equal 1, rows.size
|
21
|
+
row = rows[0]
|
22
|
+
assert_equal "text1".encode(Encoding::UTF_16LE), row[1]
|
23
|
+
assert_equal Encoding::UTF_16LE, row[1].encoding
|
24
|
+
assert_equal 1.22, row[2]
|
25
|
+
assert_equal 42, row[3]
|
26
|
+
assert_equal 4294967296, row[4]
|
27
|
+
assert_nil row[5]
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_execute_with_bindings
|
31
|
+
blob = open("test/fixtures/SQLite.gif", "rb").read
|
32
|
+
@db.execute("INSERT INTO t1 VALUES(?, ?, ?, ?, ?, ?)", nil, "text1", 1.22, 42, 4294967296, blob)
|
33
|
+
rows = @db.execute("SELECT * FROM t1")
|
34
|
+
assert_equal 1, rows.size
|
35
|
+
row = rows[0]
|
36
|
+
assert_equal "text1".encode(Encoding::UTF_16LE), row[1]
|
37
|
+
assert_equal Encoding::UTF_16LE, row[1].encoding
|
38
|
+
assert_equal 1.22, row[2]
|
39
|
+
assert_equal 42, row[3]
|
40
|
+
assert_equal 4294967296, row[4]
|
41
|
+
assert_equal blob, row[5]
|
42
|
+
assert_equal Encoding::ASCII_8BIT, row[5].encoding
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_execute_with_different_encodings
|
46
|
+
expected_string = "text1"
|
47
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, ?, NULL, NULL, NULL, NULL)", expected_string.encode(Encoding::ASCII_8BIT))
|
48
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, ?, NULL, NULL, NULL, NULL)", expected_string.encode(Encoding::UTF_8))
|
49
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, ?, NULL, NULL, NULL, NULL)", expected_string.encode(Encoding::UTF_16LE))
|
50
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, ?, NULL, NULL, NULL, NULL)", expected_string.encode(Encoding::UTF_16BE))
|
51
|
+
rows = @db.execute("SELECT * FROM t1")
|
52
|
+
assert_equal 4, rows.size
|
53
|
+
assert_equal expected_string, rows[0][1]
|
54
|
+
assert_equal expected_string.encode(Encoding::UTF_16LE), rows[1][1]
|
55
|
+
assert_equal expected_string.encode(Encoding::UTF_16LE), rows[2][1]
|
56
|
+
assert_equal expected_string.encode(Encoding::UTF_16LE), rows[3][1]
|
57
|
+
assert_equal Encoding::ASCII_8BIT, rows[0][1].encoding
|
58
|
+
assert_equal Encoding::UTF_16LE, rows[1][1].encoding
|
59
|
+
assert_equal Encoding::UTF_16LE, rows[2][1].encoding
|
60
|
+
assert_equal Encoding::UTF_16LE, rows[3][1].encoding
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_execute_with_bad_query
|
64
|
+
assert_raise(SQLite3::SQLException) { @db.execute("bad query") }
|
65
|
+
assert_equal %Q{near "bad": syntax error}, @db.errmsg
|
66
|
+
assert_equal 1, @db.errcode
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_last_insert_row_id
|
70
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, NULL, NULL, NULL, NULL, NULL)")
|
71
|
+
id = @db.last_insert_row_id
|
72
|
+
rows = @db.execute("SELECT * FROM t1 WHERE id = #{id}")
|
73
|
+
assert_equal 1, rows.size
|
74
|
+
end
|
75
|
+
|
76
|
+
# def test_execute_with_closed_database
|
77
|
+
# @db.close
|
78
|
+
# @db.execute("SELECT * FROM t1")
|
79
|
+
# end
|
80
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestDatabaseQueriesUtf8 < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@db = SQLite3::Database.new(":memory:")
|
6
|
+
@db.execute("CREATE TABLE t1(id INTEGER PRIMARY KEY ASC, t TEXT, nu1 NUMERIC, i1 INTEGER, i2 INTEGER, no BLOB)")
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
@db.close
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_tables_empty
|
14
|
+
assert_equal [], @db.execute("SELECT * FROM t1")
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_execute
|
18
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, 'text1', 1.22, 42, 4294967296, NULL)")
|
19
|
+
rows = @db.execute("SELECT * FROM t1")
|
20
|
+
assert_equal 1, rows.size
|
21
|
+
row = rows[0]
|
22
|
+
assert_equal "text1", row[1]
|
23
|
+
assert_equal Encoding::UTF_8, row[1].encoding
|
24
|
+
assert_equal 1.22, row[2]
|
25
|
+
assert_equal 42, row[3]
|
26
|
+
assert_equal 4294967296, row[4]
|
27
|
+
assert_nil row[5]
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_execute_with_bindings
|
31
|
+
blob = open("test/fixtures/SQLite.gif", "rb").read
|
32
|
+
@db.execute("INSERT INTO t1 VALUES(?, ?, ?, ?, ?, ?)", nil, "text1", 1.22, 42, 4294967296, blob)
|
33
|
+
rows = @db.execute("SELECT * FROM t1")
|
34
|
+
assert_equal 1, rows.size
|
35
|
+
row = rows[0]
|
36
|
+
assert_equal "text1", row[1]
|
37
|
+
assert_equal Encoding::UTF_8, row[1].encoding
|
38
|
+
assert_equal 1.22, row[2]
|
39
|
+
assert_equal 42, row[3]
|
40
|
+
assert_equal 4294967296, row[4]
|
41
|
+
assert_equal blob, row[5]
|
42
|
+
assert_equal Encoding::ASCII_8BIT, row[5].encoding
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_execute_with_different_encodings
|
46
|
+
expected_string = "text1"
|
47
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, ?, NULL, NULL, NULL, NULL)", expected_string.encode(Encoding::ASCII_8BIT))
|
48
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, ?, NULL, NULL, NULL, NULL)", expected_string.encode(Encoding::UTF_8))
|
49
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, ?, NULL, NULL, NULL, NULL)", expected_string.encode(Encoding::UTF_16LE))
|
50
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, ?, NULL, NULL, NULL, NULL)", expected_string.encode(Encoding::UTF_16BE))
|
51
|
+
rows = @db.execute("SELECT * FROM t1")
|
52
|
+
assert_equal 4, rows.size
|
53
|
+
assert_equal expected_string, rows[0][1]
|
54
|
+
assert_equal expected_string, rows[1][1]
|
55
|
+
assert_equal expected_string, rows[2][1]
|
56
|
+
assert_equal expected_string, rows[3][1]
|
57
|
+
assert_equal Encoding::ASCII_8BIT, rows[0][1].encoding
|
58
|
+
assert_equal Encoding::UTF_8, rows[1][1].encoding
|
59
|
+
assert_equal Encoding::UTF_8, rows[2][1].encoding
|
60
|
+
assert_equal Encoding::UTF_8, rows[3][1].encoding
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_execute_with_bad_query
|
64
|
+
assert_raise(SQLite3::SQLException) { @db.execute("bad query") }
|
65
|
+
assert_equal %Q{near "bad": syntax error}, @db.errmsg
|
66
|
+
assert_equal 1, @db.errcode
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_last_insert_row_id
|
70
|
+
@db.execute("INSERT INTO t1 VALUES(NULL, NULL, NULL, NULL, NULL, NULL)")
|
71
|
+
id = @db.last_insert_row_id
|
72
|
+
rows = @db.execute("SELECT * FROM t1 WHERE id = #{id}")
|
73
|
+
assert_equal 1, rows.size
|
74
|
+
end
|
75
|
+
|
76
|
+
# def test_execute_with_closed_database
|
77
|
+
# @db.close
|
78
|
+
# @db.execute("SELECT * FROM t1")
|
79
|
+
# end
|
80
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqlite3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jakub Ku\xC5\xBAma"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-20 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/sqlite3/database.rb
|
54
54
|
- lib/sqlite3/driver/ffi/api.rb
|
55
55
|
- lib/sqlite3/driver/ffi/driver.rb
|
56
|
+
- lib/sqlite3/encoding.rb
|
56
57
|
- lib/sqlite3/errors.rb
|
57
58
|
- lib/sqlite3/pragmas.rb
|
58
59
|
- lib/sqlite3/resultset.rb
|
@@ -60,20 +61,26 @@ files:
|
|
60
61
|
- lib/sqlite3/translator.rb
|
61
62
|
- lib/sqlite3/value.rb
|
62
63
|
- lib/sqlite3/version.rb
|
64
|
+
- test/fixtures/SQLite.gif
|
63
65
|
- test/helper.rb
|
64
66
|
- test/test_database_initialization.rb
|
65
|
-
- test/
|
67
|
+
- test/test_database_queries_utf_16.rb
|
68
|
+
- test/test_database_queries_utf_8.rb
|
66
69
|
has_rdoc: true
|
67
70
|
homepage: http://github.com/qoobaa/sqlite3
|
68
71
|
licenses: []
|
69
72
|
|
70
|
-
post_install_message:
|
71
|
-
|
72
|
-
WARNING!
|
73
|
-
|
73
|
+
post_install_message: |
|
74
|
+
==== WARNING ===================================================================
|
74
75
|
This is an early alpha version of SQLite3/Ruby FFI bindings!
|
75
|
-
|
76
|
+
Currently we support Ruby 1.9 ONLY.
|
77
|
+
|
78
|
+
If you need native bindings for Ruby 1.8 - install sqlite3-ruby instead.
|
79
|
+
You may need to uninstall this sqlite3 gem as well.
|
76
80
|
|
81
|
+
Thank you for installing sqlite3 gem! Suggestions: qoobaa@gmail.com
|
82
|
+
================================================================================
|
83
|
+
|
77
84
|
rdoc_options:
|
78
85
|
- --charset=UTF-8
|
79
86
|
require_paths:
|
@@ -98,6 +105,7 @@ signing_key:
|
|
98
105
|
specification_version: 3
|
99
106
|
summary: SQLite3/Ruby FFI bindings
|
100
107
|
test_files:
|
101
|
-
- test/
|
102
|
-
- test/
|
108
|
+
- test/test_database_queries_utf_8.rb
|
109
|
+
- test/test_database_queries_utf_16.rb
|
103
110
|
- test/test_database_initialization.rb
|
111
|
+
- test/helper.rb
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
class TestDatabaseQueries < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
@db_filename = "test_database.db"
|
6
|
-
File.delete(@db_filename) if File.exists?(@db_filename)
|
7
|
-
@db = SQLite3::Database.new(@db_filename)
|
8
|
-
@db.execute("CREATE TABLE t1(id INTEGER PRIMARY KEY ASC, t TEXT, nu NUMERIC, i INTEGER, no BLOB)")
|
9
|
-
end
|
10
|
-
|
11
|
-
def teardown
|
12
|
-
File.delete(@db_filename) if File.exists?(@db_filename)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_tables_empty
|
16
|
-
assert_equal [], @db.execute("SELECT * FROM t1")
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_insert_and_select
|
20
|
-
@db.execute("INSERT INTO t1 VALUES(NULL, 'text1', 1.22, 42, NULL)")
|
21
|
-
rows = @db.execute("SELECT * FROM t1")
|
22
|
-
assert_equal 1, rows.size
|
23
|
-
row = rows[0]
|
24
|
-
assert_equal "text1", row[1]
|
25
|
-
assert_equal "1.22", row[2]
|
26
|
-
assert_equal "42", row[3]
|
27
|
-
assert_nil row[4]
|
28
|
-
end
|
29
|
-
end
|