ydbi 0.5.2 → 0.5.7

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 (93) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +35 -0
  3. data/.gitignore +8 -0
  4. data/.travis.yml +15 -0
  5. data/ChangeLog +339 -314
  6. data/Gemfile +5 -0
  7. data/Rakefile +10 -0
  8. data/TODO +44 -0
  9. data/bench/bench.rb +79 -0
  10. data/build/rake_task_lib.rb +186 -0
  11. data/doc/DBD_SPEC.rdoc +88 -0
  12. data/doc/DBI_SPEC.rdoc +157 -0
  13. data/doc/homepage/contact.html +62 -0
  14. data/doc/homepage/development.html +124 -0
  15. data/doc/homepage/index.html +83 -0
  16. data/doc/homepage/ruby-dbi.css +91 -0
  17. data/lib/dbd/Mysql.rb +137 -0
  18. data/lib/dbd/ODBC.rb +89 -0
  19. data/lib/dbd/Pg.rb +188 -0
  20. data/lib/dbd/SQLite.rb +97 -0
  21. data/lib/dbd/SQLite3.rb +124 -0
  22. data/lib/dbd/mysql/database.rb +405 -0
  23. data/lib/dbd/mysql/driver.rb +125 -0
  24. data/lib/dbd/mysql/statement.rb +188 -0
  25. data/lib/dbd/odbc/database.rb +128 -0
  26. data/lib/dbd/odbc/driver.rb +38 -0
  27. data/lib/dbd/odbc/statement.rb +137 -0
  28. data/lib/dbd/pg/database.rb +504 -0
  29. data/lib/dbd/pg/exec.rb +47 -0
  30. data/lib/dbd/pg/statement.rb +160 -0
  31. data/lib/dbd/pg/tuples.rb +121 -0
  32. data/lib/dbd/pg/type.rb +209 -0
  33. data/lib/dbd/sqlite/database.rb +151 -0
  34. data/lib/dbd/sqlite/statement.rb +125 -0
  35. data/lib/dbd/sqlite3/database.rb +201 -0
  36. data/lib/dbd/sqlite3/statement.rb +78 -0
  37. data/lib/dbi.rb +14 -17
  38. data/lib/dbi/utils/date.rb +7 -3
  39. data/lib/dbi/version.rb +1 -1
  40. data/prototypes/types2.rb +237 -0
  41. data/readme.md +15 -0
  42. data/setup.rb +1585 -0
  43. data/test/DBD_TESTS +50 -0
  44. data/test/TESTING +16 -0
  45. data/test/dbd/general/test_database.rb +206 -0
  46. data/test/dbd/general/test_statement.rb +326 -0
  47. data/test/dbd/general/test_types.rb +296 -0
  48. data/test/dbd/mysql/base.rb +26 -0
  49. data/test/dbd/mysql/down.sql +19 -0
  50. data/test/dbd/mysql/test_blob.rb +18 -0
  51. data/test/dbd/mysql/test_new_methods.rb +7 -0
  52. data/test/dbd/mysql/test_patches.rb +111 -0
  53. data/test/dbd/mysql/up.sql +28 -0
  54. data/test/dbd/odbc/base.rb +30 -0
  55. data/test/dbd/odbc/down.sql +19 -0
  56. data/test/dbd/odbc/test_new_methods.rb +12 -0
  57. data/test/dbd/odbc/test_ping.rb +10 -0
  58. data/test/dbd/odbc/test_statement.rb +44 -0
  59. data/test/dbd/odbc/test_transactions.rb +58 -0
  60. data/test/dbd/odbc/up.sql +33 -0
  61. data/test/dbd/postgresql/base.rb +31 -0
  62. data/test/dbd/postgresql/down.sql +31 -0
  63. data/test/dbd/postgresql/test_arrays.rb +179 -0
  64. data/test/dbd/postgresql/test_async.rb +121 -0
  65. data/test/dbd/postgresql/test_blob.rb +36 -0
  66. data/test/dbd/postgresql/test_bytea.rb +87 -0
  67. data/test/dbd/postgresql/test_ping.rb +10 -0
  68. data/test/dbd/postgresql/test_timestamp.rb +77 -0
  69. data/test/dbd/postgresql/test_transactions.rb +58 -0
  70. data/test/dbd/postgresql/testdbipg.rb +307 -0
  71. data/test/dbd/postgresql/up.sql +60 -0
  72. data/test/dbd/sqlite/base.rb +32 -0
  73. data/test/dbd/sqlite/test_database.rb +30 -0
  74. data/test/dbd/sqlite/test_driver.rb +68 -0
  75. data/test/dbd/sqlite/test_statement.rb +112 -0
  76. data/test/dbd/sqlite/up.sql +25 -0
  77. data/test/dbd/sqlite3/base.rb +32 -0
  78. data/test/dbd/sqlite3/test_database.rb +77 -0
  79. data/test/dbd/sqlite3/test_driver.rb +67 -0
  80. data/test/dbd/sqlite3/test_statement.rb +88 -0
  81. data/test/dbd/sqlite3/up.sql +33 -0
  82. data/test/dbi/tc_columninfo.rb +4 -9
  83. data/test/dbi/tc_date.rb +2 -9
  84. data/test/dbi/tc_dbi.rb +3 -9
  85. data/test/dbi/tc_row.rb +17 -23
  86. data/test/dbi/tc_sqlbind.rb +6 -7
  87. data/test/dbi/tc_statementhandle.rb +3 -4
  88. data/test/dbi/tc_time.rb +2 -8
  89. data/test/dbi/tc_timestamp.rb +2 -16
  90. data/test/dbi/tc_types.rb +5 -11
  91. data/test/ts_dbd.rb +131 -0
  92. data/ydbi.gemspec +23 -0
  93. metadata +128 -10
@@ -0,0 +1,88 @@
1
+ class TestStatement < DBDConfig.testbase(:sqlite3)
2
+ def test_constructor
3
+ sth = DBI::DBD::SQLite3::Statement.new("select * from names", @dbh.instance_variable_get("@handle").instance_variable_get("@db"))
4
+
5
+ assert_kind_of DBI::DBD::SQLite3::Statement, sth
6
+ assert sth.instance_variable_get("@db")
7
+ assert_kind_of ::SQLite3::Database, sth.instance_variable_get("@db")
8
+ assert_equal(@dbh.instance_variable_get("@handle").instance_variable_get("@db"), sth.instance_variable_get("@db"))
9
+ assert_kind_of ::SQLite3::Statement, sth.instance_variable_get("@stmt")
10
+ assert_nil(@sth.instance_variable_get("@result"))
11
+
12
+ sth.finish
13
+
14
+ sth = @dbh.prepare("select * from names")
15
+
16
+ assert_kind_of DBI::StatementHandle, sth
17
+ sth.finish
18
+ end
19
+
20
+ def test_bind_param
21
+ sth = DBI::DBD::SQLite3::Statement.new("select * from names", @dbh.instance_variable_get("@handle").instance_variable_get("@db"))
22
+
23
+ assert_raises(DBI::InterfaceError) do
24
+ sth.bind_param(:foo, "monkeys")
25
+ end
26
+
27
+ sth.finish
28
+ end
29
+
30
+ def test_column_info
31
+ @sth = nil
32
+
33
+ assert_nothing_raised do
34
+ @sth = @dbh.prepare("select * from names")
35
+ @sth.execute
36
+ end
37
+
38
+ assert_kind_of Array, @sth.column_info
39
+ assert_kind_of DBI::ColumnInfo, @sth.column_info[0]
40
+ assert_kind_of DBI::ColumnInfo, @sth.column_info[1]
41
+ assert_equal [
42
+ {
43
+ :name => "name",
44
+ :sql_type => 12,
45
+ :precision => 255,
46
+ :type_name => "varchar"
47
+ },
48
+ {
49
+ :name => "age",
50
+ :sql_type => 4,
51
+ :type_name => "integer"
52
+ }
53
+ ], @sth.column_info
54
+
55
+ @sth.finish
56
+ end
57
+
58
+ def test_specific_types
59
+ assert_nothing_raised do
60
+ @sth = @dbh.prepare("insert into db_specific_types_test (dbl) values (?)")
61
+ @sth.execute(11111111.111111)
62
+ @sth.execute(22)
63
+ @sth.finish
64
+ end
65
+
66
+ assert_nothing_raised do
67
+ @sth = @dbh.prepare("select * from db_specific_types_test")
68
+ @sth.execute
69
+ assert_equal([11111111.111111], @sth.fetch)
70
+ assert_equal([22], @sth.fetch)
71
+ @sth.finish
72
+
73
+ assert_equal([[11111111.111111], [22]], @dbh.select_all("select * from db_specific_types_test"))
74
+ end
75
+
76
+ assert_nothing_raised do
77
+ @sth = @dbh.prepare("insert into names (name, age) values (?, ?)")
78
+ @sth.execute(:joseph, 20)
79
+ @sth.finish
80
+
81
+ @sth = @dbh.prepare("select name, age from names where name=?")
82
+ @sth.execute("joseph")
83
+ rows = @sth.fetch_all
84
+ @sth.finish
85
+ assert_equal(rows, [["joseph", 20]])
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,33 @@
1
+ create table names (name varchar(255), age integer);
2
+ ---
3
+ insert into names (name, age) values ("Bob", 21);
4
+ ---
5
+ insert into names (name, age) values ("Joe", 19);
6
+ ---
7
+ insert into names (name, age) values ("Jim", 30);
8
+ ---
9
+ create table precision_test (text_field varchar(20) primary key not null, integer_field integer, decimal_field decimal(2,1), numeric_field numeric(30,6));
10
+ ---
11
+ create view view_names as select * from names;
12
+ ---
13
+ create table blob_test (name varchar(255));
14
+ ---
15
+ create table boolean_test (num integer, mybool boolean);
16
+ ---
17
+ create table time_test (mytime time);
18
+ ---
19
+ create table timestamp_test (mytimestamp timestamp);
20
+ ---
21
+ create table bit_test (mybit bit);
22
+ ---
23
+ create table field_types_test (foo integer not null primary key default 1);
24
+ ---
25
+ create table db_specific_types_test (dbl double);
26
+ ---
27
+ create table names_defined_with_spaces ( name varchar( 255 ), age integer );
28
+ ---
29
+ insert into names_defined_with_spaces (name, age) values ("Bob", 21);
30
+ ---
31
+ insert into names_defined_with_spaces (name, age) values ("Joe", 19);
32
+ ---
33
+ insert into names_defined_with_spaces (name, age) values ("Jim", 30);
@@ -3,17 +3,12 @@
3
3
  #
4
4
  # Test case for the DBI::ColumnInfo class.
5
5
  ############################################################
6
- $LOAD_PATH.unshift(Dir.pwd)
7
- $LOAD_PATH.unshift(File.dirname(Dir.pwd))
8
- $LOAD_PATH.unshift("../../lib")
9
- $LOAD_PATH.unshift("../../lib/dbi")
10
- $LOAD_PATH.unshift("lib")
11
-
12
- require "dbi/columninfo"
13
6
  require "test/unit"
7
+ require_relative "../../lib/dbi/columninfo"
14
8
 
15
9
  class TC_DBI_ColumnInfo < Test::Unit::TestCase
16
10
  def setup
11
+ super
17
12
  @colinfo = DBI::ColumnInfo.new(
18
13
  "name" => "test",
19
14
  "sql_type" => "numeric",
@@ -30,7 +25,7 @@ class TC_DBI_ColumnInfo < Test::Unit::TestCase
30
25
  indexed primary unique
31
26
  /
32
27
  end
33
-
28
+
34
29
  def test_constructor
35
30
  assert_nothing_raised{ DBI::ColumnInfo.new }
36
31
 
@@ -81,7 +76,7 @@ class TC_DBI_ColumnInfo < Test::Unit::TestCase
81
76
  assert_respond_to(@colinfo, :keys)
82
77
  assert_equal(@keys.sort, @colinfo.keys.collect { |x| x.to_s }.sort)
83
78
  end
84
-
79
+
85
80
  def test_respond_to_hash_methods
86
81
  assert_respond_to(@colinfo, :each)
87
82
  assert_respond_to(@colinfo, :empty?)
@@ -3,15 +3,8 @@
3
3
  #
4
4
  # Test case for the DBI::Date class (currently) located in the utils.rb file.
5
5
  ##############################################################################
6
- $LOAD_PATH.unshift(Dir.pwd)
7
- $LOAD_PATH.unshift(File.dirname(Dir.pwd))
8
- $LOAD_PATH.unshift("../../lib")
9
- $LOAD_PATH.unshift("../../lib/dbi")
10
- $LOAD_PATH.unshift("lib")
11
-
12
- require 'date'
13
- require 'dbi'
14
- require 'test/unit'
6
+ require "test/unit"
7
+ require_relative "../../lib/dbi"
15
8
 
16
9
  Deprecate.set_action(proc { })
17
10
 
@@ -3,14 +3,8 @@
3
3
  #
4
4
  # Test case for the DBI module (dbi.rb).
5
5
  ######################################################################
6
- $LOAD_PATH.unshift(Dir.pwd)
7
- $LOAD_PATH.unshift(File.dirname(Dir.pwd))
8
- $LOAD_PATH.unshift("../../lib")
9
- $LOAD_PATH.unshift("../../lib/dbi")
10
- $LOAD_PATH.unshift("lib")
11
-
12
- require 'dbi'
13
- require 'test/unit'
6
+ require "test/unit"
7
+ require_relative "../../lib/dbi"
14
8
 
15
9
  class TC_DBI < Test::Unit::TestCase
16
10
  def setup
@@ -22,7 +16,7 @@ class TC_DBI < Test::Unit::TestCase
22
16
  end
23
17
 
24
18
  def test_dbi_version
25
- assert_equal("0.5.2", DBI::VERSION)
19
+ assert_equal("0.5.7", DBI::VERSION)
26
20
  end
27
21
 
28
22
  def test_dbd_module
@@ -1,16 +1,10 @@
1
1
  ######################################################################
2
2
  # tc_row.rb
3
3
  #
4
- # Test case for the DBI::Row class.
4
+ # Test case for the DBI::Row class.
5
5
  ######################################################################
6
- $LOAD_PATH.unshift(Dir.pwd)
7
- $LOAD_PATH.unshift(File.dirname(Dir.pwd))
8
- $LOAD_PATH.unshift("../../lib")
9
- $LOAD_PATH.unshift("../../lib/dbi")
10
- $LOAD_PATH.unshift("lib")
11
-
12
- require 'test/unit'
13
- require 'dbi'
6
+ require "test/unit"
7
+ require_relative "../../lib/dbi"
14
8
 
15
9
  class TC_DBI_Row < Test::Unit::TestCase
16
10
  def setup
@@ -18,7 +12,7 @@ class TC_DBI_Row < Test::Unit::TestCase
18
12
  @cols = %w/first last age/
19
13
  @coltypes = [DBI::Type::Varchar, DBI::Type::Varchar, DBI::Type::Integer]
20
14
  @row = DBI::Row.new(@cols, @coltypes, @data.clone)
21
- @row_noconv = DBI::Row.new(@cols, @coltypes, @data.clone, false)
15
+ @row_noconv = DBI::Row.new(@cols, @coltypes, @data.clone, false)
22
16
  end
23
17
 
24
18
  def teardown
@@ -46,7 +40,7 @@ class TC_DBI_Row < Test::Unit::TestCase
46
40
  assert_equal(@data, @row_noconv)
47
41
  end
48
42
  end
49
-
43
+
50
44
  # Ensure that constructor only allows Integers or Arrays (or nil)
51
45
  def test_row_constructor
52
46
  assert_nothing_raised{ DBI::Row.new(@cols, @coltypes) }
@@ -67,14 +61,14 @@ class TC_DBI_Row < Test::Unit::TestCase
67
61
  assert_equal(@data[2].to_s, @row.at(2).to_s)
68
62
  assert_equal(@data[99].to_s, @row.at(99).to_s)
69
63
  end
70
-
64
+
71
65
  # Should respond to Array and Enumerable methods
72
66
  def test_row_delegate
73
67
  assert_respond_to(@row, :length)
74
68
  assert_respond_to(@row, :each)
75
69
  assert_respond_to(@row, :grep)
76
70
  end
77
-
71
+
78
72
  def test_row_length
79
73
  assert_equal(3, @row.length)
80
74
  assert_equal(3, DBI::Row.new(@cols, @coltypes).length)
@@ -86,14 +80,14 @@ class TC_DBI_Row < Test::Unit::TestCase
86
80
  assert_equal(@data[2], @row.by_index(2).to_s)
87
81
  assert_nil(@row.by_index(3))
88
82
  end
89
-
83
+
90
84
  def test_row_data_by_field
91
85
  assert_equal @data[0], @row.by_field('first')
92
86
  assert_equal @data[1], @row.by_field('last')
93
87
  assert_equal @data[2], @row.by_field('age').to_s
94
88
  assert_equal nil, @row.by_field('unknown')
95
89
  end
96
-
90
+
97
91
  def test_row_set_values
98
92
  assert_respond_to(@row, :set_values)
99
93
  assert_nothing_raised{ @row.set_values(["John", "Doe", 23]) }
@@ -101,14 +95,14 @@ class TC_DBI_Row < Test::Unit::TestCase
101
95
  assert_equal("Doe", @row.by_index(1))
102
96
  assert_equal(23, @row.by_index(2))
103
97
  end
104
-
98
+
105
99
  def test_row_to_h
106
100
  assert_respond_to(@row, :to_h)
107
101
  assert_nothing_raised{ @row.to_h }
108
102
  assert_kind_of(Hash, @row.to_h)
109
103
  assert_equal({"first"=>"Daniel", "last"=>"Berger", "age"=>36}, @row.to_h)
110
104
  end
111
-
105
+
112
106
  def test_row_column_names
113
107
  assert_respond_to(@row, :column_names)
114
108
  assert_nothing_raised{ @row.column_names }
@@ -123,13 +117,13 @@ class TC_DBI_Row < Test::Unit::TestCase
123
117
  assert_kind_of(Array, @row.column_names)
124
118
  assert_equal(["first", "last", "age"], @row.column_names)
125
119
  end
126
-
120
+
127
121
  def test_indexing_numeric
128
- assert_equal(@data[0], @row[0])
129
- assert_equal(@data[1], @row[1])
130
- assert_equal(@data[2], @row[2].to_s)
122
+ assert_equal(@data[0], @row[0])
123
+ assert_equal(@data[1], @row[1])
124
+ assert_equal(@data[2], @row[2].to_s)
131
125
  end
132
-
126
+
133
127
  def test_indexing_string_or_symbol
134
128
  assert_equal(@data[0], @row['first'])
135
129
  assert_equal(@data[0], @row[:first])
@@ -137,7 +131,7 @@ class TC_DBI_Row < Test::Unit::TestCase
137
131
  assert_equal(@data[2], @row['age'].to_s)
138
132
  assert_equal(nil, @row['unknown'])
139
133
  end
140
-
134
+
141
135
  def test_indexing_regexp
142
136
  assert_equal(["Daniel"], @row[/first/])
143
137
  assert_equal(["Berger"], @row[/last/])
@@ -1,6 +1,5 @@
1
- $: << 'lib'
2
- require 'test/unit'
3
- require "dbi/sql"
1
+ require "test/unit"
2
+ require_relative "../../lib/dbi/sql"
4
3
 
5
4
  # ====================================================================
6
5
  class TestSqlBind < Test::Unit::TestCase
@@ -60,18 +59,18 @@ class TestSqlBind < Test::Unit::TestCase
60
59
  def test_minus_bug
61
60
  sql = "SELECT 1 - 3"
62
61
  res = "SELECT 1 - 3"
63
- assert_equal res, bind(self, sql, [])
62
+ assert_equal res, bind(self, sql, [])
64
63
  end
65
64
 
66
65
  def test_minus2
67
- sql = "SELECT * from test --Dan's query"
68
- assert_equal sql, bind(self, sql, [])
66
+ sql = "SELECT * from test --Dan's query"
67
+ assert_equal sql, bind(self, sql, [])
69
68
  end
70
69
 
71
70
  def test_slash
72
71
  sql = "SELECT 5 / 4"
73
72
  res = "SELECT 5 / 4"
74
- assert_equal res, bind(self, sql, [])
73
+ assert_equal res, bind(self, sql, [])
75
74
  end
76
75
 
77
76
  def test_much
@@ -1,6 +1,5 @@
1
- $: << 'lib'
2
- require 'test/unit'
3
- require 'dbi'
1
+ require "test/unit"
2
+ require_relative "../../lib/dbi"
4
3
 
5
4
  class TC_DBI_StatementHandle < Test::Unit::TestCase
6
5
  def test_fetch
@@ -9,7 +8,7 @@ class TC_DBI_StatementHandle < Test::Unit::TestCase
9
8
  def mock_handle.column_info; {}; end
10
9
  def mock_handle.fetch; nil; end
11
10
  sth = DBI::StatementHandle.new( mock_handle, true, true, false, true)
12
-
11
+
13
12
  10.times do
14
13
  assert_nil sth.fetch
15
14
  end
@@ -3,14 +3,8 @@
3
3
  #
4
4
  # Test case for the DBI::Time class (currently) located in the utils.rb file.
5
5
  ##############################################################################
6
- $LOAD_PATH.unshift(Dir.pwd)
7
- $LOAD_PATH.unshift(File.dirname(Dir.pwd))
8
- $LOAD_PATH.unshift("../../lib")
9
- $LOAD_PATH.unshift("../../lib/dbi")
10
- $LOAD_PATH.unshift("lib")
11
-
12
- require 'dbi'
13
- require 'test/unit'
6
+ require "test/unit"
7
+ require_relative "../../lib/dbi"
14
8
 
15
9
  Deprecate.set_action(proc { })
16
10
 
@@ -4,17 +4,8 @@
4
4
  # Test case for the DBI::Timestamp class (currently) located in the
5
5
  # utils.rb file.
6
6
  ##############################################################################
7
- $LOAD_PATH.unshift(Dir.pwd)
8
- $LOAD_PATH.unshift(File.dirname(Dir.pwd))
9
- $LOAD_PATH.unshift("../../lib")
10
- $LOAD_PATH.unshift("../../lib/dbi")
11
- $LOAD_PATH.unshift("lib")
12
-
13
- require 'date'
14
- require 'dbi'
15
- require 'test/unit'
16
-
17
- Deprecate.set_action(proc { })
7
+ require "test/unit"
8
+ require_relative "../../lib/dbi"
18
9
 
19
10
  class TC_DBI_Date < Test::Unit::TestCase
20
11
  def setup
@@ -134,9 +125,4 @@ class TC_DBI_Date < Test::Unit::TestCase
134
125
  assert_equal(2006, @dbi_ts.year)
135
126
  end
136
127
 
137
- def teardown
138
- @date = nil
139
- @time = nil
140
- @dbi_ts = nil
141
- end
142
128
  end
@@ -1,11 +1,5 @@
1
- $LOAD_PATH.unshift(Dir.pwd)
2
- $LOAD_PATH.unshift(File.dirname(Dir.pwd))
3
- $LOAD_PATH.unshift("../../lib")
4
- $LOAD_PATH.unshift("../../lib/dbi")
5
- $LOAD_PATH.unshift("lib")
6
-
7
- require "dbi"
8
1
  require "test/unit"
2
+ require_relative "../../lib/dbi"
9
3
 
10
4
  class MyType
11
5
  def initialize(obj)
@@ -107,7 +101,7 @@ class TC_DBI_Type < Test::Unit::TestCase
107
101
  # string coercion
108
102
  dt = DateTime.now
109
103
  assert_equal(dt.to_s, klass.parse(dt).to_s)
110
-
104
+
111
105
  t = Time.now
112
106
  assert_equal(DateTime.parse(t.to_s).to_s, klass.parse(t).to_s)
113
107
 
@@ -137,7 +131,7 @@ class TC_DBI_Type < Test::Unit::TestCase
137
131
  )
138
132
 
139
133
  # precision tests, related to ticket #27182
140
-
134
+
141
135
  # iso8601 (bypasses regex)
142
136
  [
143
137
  '2009-09-27T19:41:00-05:00',
@@ -158,7 +152,7 @@ class TC_DBI_Type < Test::Unit::TestCase
158
152
  )
159
153
 
160
154
  # unix convention (uses regex)
161
-
155
+
162
156
  [
163
157
  '2009-09-27 19:41:00 -05:00',
164
158
  '2009-09-27 19:41:00.123 -05:00'
@@ -208,7 +202,7 @@ class TC_DBI_TypeUtil < Test::Unit::TestCase
208
202
  assert_kind_of(String, cast(Time.now))
209
203
  assert_kind_of(String, cast(Date.today))
210
204
  assert_kind_of(String, cast(DateTime.now))
211
-
205
+
212
206
  obj = Time.now
213
207
  assert_equal(datecast(obj), cast(obj))
214
208
  obj = Date.today