ydbi 0.5.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 (122) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/ChangeLog +3699 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +25 -0
  6. data/Rakefile +8 -0
  7. data/TODO +44 -0
  8. data/bench/bench.rb +79 -0
  9. data/bin/dbi +518 -0
  10. data/bin/test_broken_dbi +37 -0
  11. data/build/Rakefile.dbi.rb +60 -0
  12. data/build/rake_task_lib.rb +187 -0
  13. data/doc/DBD_SPEC.rdoc +88 -0
  14. data/doc/DBI_SPEC.rdoc +157 -0
  15. data/doc/homepage/contact.html +62 -0
  16. data/doc/homepage/development.html +124 -0
  17. data/doc/homepage/index.html +83 -0
  18. data/doc/homepage/ruby-dbi.css +91 -0
  19. data/examples/test1.pl +39 -0
  20. data/examples/test1.rb +20 -0
  21. data/examples/xmltest.rb +8 -0
  22. data/lib/dbd/Mysql.rb +137 -0
  23. data/lib/dbd/ODBC.rb +89 -0
  24. data/lib/dbd/Pg.rb +188 -0
  25. data/lib/dbd/SQLite.rb +97 -0
  26. data/lib/dbd/SQLite3.rb +124 -0
  27. data/lib/dbd/mysql/database.rb +405 -0
  28. data/lib/dbd/mysql/driver.rb +125 -0
  29. data/lib/dbd/mysql/statement.rb +188 -0
  30. data/lib/dbd/odbc/database.rb +128 -0
  31. data/lib/dbd/odbc/driver.rb +38 -0
  32. data/lib/dbd/odbc/statement.rb +137 -0
  33. data/lib/dbd/pg/database.rb +516 -0
  34. data/lib/dbd/pg/exec.rb +47 -0
  35. data/lib/dbd/pg/statement.rb +160 -0
  36. data/lib/dbd/pg/tuples.rb +121 -0
  37. data/lib/dbd/pg/type.rb +209 -0
  38. data/lib/dbd/sqlite/database.rb +151 -0
  39. data/lib/dbd/sqlite/statement.rb +125 -0
  40. data/lib/dbd/sqlite3/database.rb +201 -0
  41. data/lib/dbd/sqlite3/statement.rb +78 -0
  42. data/lib/dbi.rb +336 -0
  43. data/lib/dbi/base_classes.rb +12 -0
  44. data/lib/dbi/base_classes/database.rb +135 -0
  45. data/lib/dbi/base_classes/driver.rb +47 -0
  46. data/lib/dbi/base_classes/statement.rb +171 -0
  47. data/lib/dbi/binary.rb +25 -0
  48. data/lib/dbi/columninfo.rb +107 -0
  49. data/lib/dbi/exceptions.rb +65 -0
  50. data/lib/dbi/handles.rb +49 -0
  51. data/lib/dbi/handles/database.rb +241 -0
  52. data/lib/dbi/handles/driver.rb +60 -0
  53. data/lib/dbi/handles/statement.rb +408 -0
  54. data/lib/dbi/row.rb +269 -0
  55. data/lib/dbi/sql.rb +22 -0
  56. data/lib/dbi/sql/preparedstatement.rb +115 -0
  57. data/lib/dbi/sql_type_constants.rb +75 -0
  58. data/lib/dbi/trace.rb +91 -0
  59. data/lib/dbi/types.rb +218 -0
  60. data/lib/dbi/typeutil.rb +109 -0
  61. data/lib/dbi/utils.rb +60 -0
  62. data/lib/dbi/utils/date.rb +59 -0
  63. data/lib/dbi/utils/tableformatter.rb +112 -0
  64. data/lib/dbi/utils/time.rb +52 -0
  65. data/lib/dbi/utils/timestamp.rb +96 -0
  66. data/lib/dbi/utils/xmlformatter.rb +73 -0
  67. data/lib/dbi/version.rb +3 -0
  68. data/prototypes/types2.rb +237 -0
  69. data/readme.md +274 -0
  70. data/setup.rb +1585 -0
  71. data/test/DBD_TESTS +50 -0
  72. data/test/TESTING +16 -0
  73. data/test/dbd/general/test_database.rb +206 -0
  74. data/test/dbd/general/test_statement.rb +326 -0
  75. data/test/dbd/general/test_types.rb +296 -0
  76. data/test/dbd/mysql/base.rb +26 -0
  77. data/test/dbd/mysql/down.sql +19 -0
  78. data/test/dbd/mysql/test_blob.rb +18 -0
  79. data/test/dbd/mysql/test_new_methods.rb +7 -0
  80. data/test/dbd/mysql/test_patches.rb +111 -0
  81. data/test/dbd/mysql/up.sql +28 -0
  82. data/test/dbd/odbc/base.rb +30 -0
  83. data/test/dbd/odbc/down.sql +19 -0
  84. data/test/dbd/odbc/test_new_methods.rb +12 -0
  85. data/test/dbd/odbc/test_ping.rb +10 -0
  86. data/test/dbd/odbc/test_statement.rb +44 -0
  87. data/test/dbd/odbc/test_transactions.rb +58 -0
  88. data/test/dbd/odbc/up.sql +33 -0
  89. data/test/dbd/postgresql/base.rb +31 -0
  90. data/test/dbd/postgresql/down.sql +31 -0
  91. data/test/dbd/postgresql/test_arrays.rb +179 -0
  92. data/test/dbd/postgresql/test_async.rb +121 -0
  93. data/test/dbd/postgresql/test_blob.rb +36 -0
  94. data/test/dbd/postgresql/test_bytea.rb +87 -0
  95. data/test/dbd/postgresql/test_ping.rb +10 -0
  96. data/test/dbd/postgresql/test_timestamp.rb +77 -0
  97. data/test/dbd/postgresql/test_transactions.rb +58 -0
  98. data/test/dbd/postgresql/testdbipg.rb +307 -0
  99. data/test/dbd/postgresql/up.sql +60 -0
  100. data/test/dbd/sqlite/base.rb +32 -0
  101. data/test/dbd/sqlite/test_database.rb +30 -0
  102. data/test/dbd/sqlite/test_driver.rb +68 -0
  103. data/test/dbd/sqlite/test_statement.rb +112 -0
  104. data/test/dbd/sqlite/up.sql +25 -0
  105. data/test/dbd/sqlite3/base.rb +32 -0
  106. data/test/dbd/sqlite3/test_database.rb +77 -0
  107. data/test/dbd/sqlite3/test_driver.rb +67 -0
  108. data/test/dbd/sqlite3/test_statement.rb +88 -0
  109. data/test/dbd/sqlite3/up.sql +33 -0
  110. data/test/dbi/tc_columninfo.rb +94 -0
  111. data/test/dbi/tc_date.rb +88 -0
  112. data/test/dbi/tc_dbi.rb +184 -0
  113. data/test/dbi/tc_row.rb +256 -0
  114. data/test/dbi/tc_sqlbind.rb +168 -0
  115. data/test/dbi/tc_statementhandle.rb +29 -0
  116. data/test/dbi/tc_time.rb +77 -0
  117. data/test/dbi/tc_timestamp.rb +142 -0
  118. data/test/dbi/tc_types.rb +268 -0
  119. data/test/ts_dbd.rb +131 -0
  120. data/test/ts_dbi.rb +16 -0
  121. data/ydbi.gemspec +24 -0
  122. metadata +224 -0
@@ -0,0 +1,77 @@
1
+ ##############################################################################
2
+ # tc_time.rb
3
+ #
4
+ # Test case for the DBI::Time class (currently) located in the utils.rb file.
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'
14
+
15
+ Deprecate.set_action(proc { })
16
+
17
+ class TC_DBI_Time < Test::Unit::TestCase
18
+ def setup
19
+ @time = Time.new
20
+ @dbi_time = DBI::Time.new
21
+ end
22
+
23
+ def test_constructor
24
+ assert_nothing_raised{ DBI::Time.new(9) }
25
+ assert_nothing_raised{ DBI::Time.new(9, 41) }
26
+ assert_nothing_raised{ DBI::Time.new(9, 41, 20) }
27
+ assert_nothing_raised{ DBI::Time.new(Date.new) }
28
+ assert_nothing_raised{ DBI::Time.new(Time.now) }
29
+ end
30
+
31
+ def test_hour
32
+ assert_respond_to(@dbi_time, :hour)
33
+ assert_respond_to(@dbi_time, :hour=)
34
+ assert_equal(0, @dbi_time.hour)
35
+ end
36
+
37
+ def test_minute
38
+ assert_respond_to(@dbi_time, :minute)
39
+ assert_respond_to(@dbi_time, :minute=)
40
+ assert_equal(0, @dbi_time.minute)
41
+ end
42
+
43
+ # Alias for minute
44
+ def test_min
45
+ assert_respond_to(@dbi_time, :min)
46
+ assert_respond_to(@dbi_time, :min=)
47
+ assert_equal(0, @dbi_time.min)
48
+ end
49
+
50
+ def test_second
51
+ assert_respond_to(@dbi_time, :second)
52
+ assert_respond_to(@dbi_time, :second=)
53
+ assert_equal(0, @dbi_time.second)
54
+ end
55
+
56
+ def test_sec
57
+ assert_respond_to(@dbi_time, :sec)
58
+ assert_respond_to(@dbi_time, :sec=)
59
+ assert_equal(0, @dbi_time.sec)
60
+ end
61
+
62
+ def test_to_time
63
+ assert_respond_to(@dbi_time, :to_time)
64
+ assert_equal(@time, DBI::Time.new(@time).to_time)
65
+ #assert_equal(@time.object_id, DBI::Time.new(@time).object_id) # Fails ??
66
+ end
67
+
68
+ def test_to_s
69
+ assert_respond_to(@dbi_time, :to_s)
70
+ assert_equal("00:00:00", @dbi_time.to_s)
71
+ end
72
+
73
+ def teardown
74
+ @time = nil
75
+ @dbi_time = nil
76
+ end
77
+ end
@@ -0,0 +1,142 @@
1
+ ##############################################################################
2
+ # tc_timestamp.rb
3
+ #
4
+ # Test case for the DBI::Timestamp class (currently) located in the
5
+ # utils.rb file.
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 { })
18
+
19
+ class TC_DBI_Date < Test::Unit::TestCase
20
+ def setup
21
+ @date = Date.new
22
+ @time = Time.now
23
+ @dbi_ts = DBI::Timestamp.new(2006, 1, 31, 10, 23, 22, 45)
24
+ end
25
+
26
+ def test_constructor
27
+ assert_nothing_raised{ DBI::Timestamp.new }
28
+ assert_nothing_raised{ DBI::Timestamp.new(2006) }
29
+ assert_nothing_raised{ DBI::Timestamp.new(2006, 1) }
30
+ assert_nothing_raised{ DBI::Timestamp.new(2006, 1, 31) }
31
+ assert_nothing_raised{ DBI::Timestamp.new(2006, 1, 31, 10) }
32
+ assert_nothing_raised{ DBI::Timestamp.new(2006, 1, 31, 10, 23) }
33
+ assert_nothing_raised{ DBI::Timestamp.new(2006, 1, 31, 10, 23, 22) }
34
+ assert_nothing_raised{ DBI::Timestamp.new(2006, 1, 31, 10, 23, 22, 45) }
35
+ end
36
+
37
+ def test_to_date
38
+ assert_respond_to(@dbi_ts, :to_date)
39
+ assert_kind_of(Date, @dbi_ts.to_date)
40
+ end
41
+
42
+ def test_to_time
43
+ assert_respond_to(@dbi_ts, :to_time)
44
+ assert_kind_of(Time, @dbi_ts.to_time)
45
+ end
46
+
47
+ def test_to_s
48
+ assert_respond_to(@dbi_ts, :to_s)
49
+ assert_equal("2006-01-31 10:23:22.000000045", @dbi_ts.to_s)
50
+ assert_equal("2008-03-08 10:39:01.0045",
51
+ DBI::Timestamp.new(2008, 3, 8, 10, 39, 1, 4500000).to_s)
52
+ assert_equal("2008-03-08 10:39:01.0",
53
+ DBI::Timestamp.new(2008, 3, 8, 10, 39, 1, 0).to_s)
54
+ assert_equal("2008-03-08 10:39:01",
55
+ DBI::Timestamp.new(2008, 3, 8, 10, 39, 1, nil).to_s)
56
+ assert_equal("0000-00-00 00:00:00", DBI::Timestamp.new.to_s)
57
+ end
58
+
59
+ def test_equality
60
+ assert_equal(true, @dbi_ts == DBI::Timestamp.new(2006,1,31,10,23,22,45))
61
+ assert_equal(false, @dbi_ts == DBI::Timestamp.new(2006,1,31,10,23,22,46))
62
+ assert_equal(false, @dbi_ts == nil)
63
+ assert_equal(false, @dbi_ts == 1)
64
+ assert_equal(false, @dbi_ts == "hello")
65
+ end
66
+
67
+ def test_fraction
68
+ assert_respond_to(@dbi_ts, :fraction)
69
+ assert_respond_to(@dbi_ts, :fraction=)
70
+ assert_equal(45, @dbi_ts.fraction)
71
+ end
72
+
73
+ def test_second
74
+ assert_respond_to(@dbi_ts, :second)
75
+ assert_respond_to(@dbi_ts, :second=)
76
+ assert_equal(22, @dbi_ts.second)
77
+ end
78
+
79
+ # Alias for second
80
+ def test_sec
81
+ assert_respond_to(@dbi_ts, :sec)
82
+ assert_respond_to(@dbi_ts, :sec=)
83
+ assert_equal(22, @dbi_ts.sec)
84
+ end
85
+
86
+ def test_minute
87
+ assert_respond_to(@dbi_ts, :minute)
88
+ assert_respond_to(@dbi_ts, :minute=)
89
+ assert_equal(23, @dbi_ts.minute)
90
+ end
91
+
92
+ # Alias for minute
93
+ def test_min
94
+ assert_respond_to(@dbi_ts, :min)
95
+ assert_respond_to(@dbi_ts, :min=)
96
+ assert_equal(23, @dbi_ts.min)
97
+ end
98
+
99
+ def test_hour
100
+ assert_respond_to(@dbi_ts, :hour)
101
+ assert_respond_to(@dbi_ts, :hour=)
102
+ assert_equal(10, @dbi_ts.hour)
103
+ end
104
+
105
+ def test_day
106
+ assert_respond_to(@dbi_ts, :day)
107
+ assert_respond_to(@dbi_ts, :day=)
108
+ assert_equal(31, @dbi_ts.day)
109
+ end
110
+
111
+ # Alias for day
112
+ def test_mday
113
+ assert_respond_to(@dbi_ts, :mday)
114
+ assert_respond_to(@dbi_ts, :mday=)
115
+ assert_equal(31, @dbi_ts.mday)
116
+ end
117
+
118
+ def test_month
119
+ assert_respond_to(@dbi_ts, :month)
120
+ assert_respond_to(@dbi_ts, :month=)
121
+ assert_equal(1, @dbi_ts.month)
122
+ end
123
+
124
+ # Alias for month
125
+ def test_mon
126
+ assert_respond_to(@dbi_ts, :mon)
127
+ assert_respond_to(@dbi_ts, :mon=)
128
+ assert_equal(1, @dbi_ts.mon)
129
+ end
130
+
131
+ def test_year
132
+ assert_respond_to(@dbi_ts, :year)
133
+ assert_respond_to(@dbi_ts, :year=)
134
+ assert_equal(2006, @dbi_ts.year)
135
+ end
136
+
137
+ def teardown
138
+ @date = nil
139
+ @time = nil
140
+ @dbi_ts = nil
141
+ end
142
+ end
@@ -0,0 +1,268 @@
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
+ require "test/unit"
9
+
10
+ class MyType
11
+ def initialize(obj)
12
+ @obj = obj
13
+ end
14
+
15
+ def to_s
16
+ @obj.to_s
17
+ end
18
+ end
19
+
20
+ class TC_DBI_Type < Test::Unit::TestCase
21
+ def test_null
22
+ # all types except Varchar need to appropriately handle NULL
23
+ [
24
+ DBI::Type::Null,
25
+ DBI::Type::Integer,
26
+ DBI::Type::Float,
27
+ DBI::Type::Timestamp,
28
+ DBI::Type::Boolean
29
+ ].each do |klass|
30
+ assert_equal(nil, klass.parse("NULL"))
31
+ assert_equal(nil, klass.parse("null"))
32
+ assert_equal(nil, klass.parse("Null"))
33
+ end
34
+ end
35
+
36
+ def test_boolean
37
+ klass = DBI::Type::Boolean
38
+ assert_kind_of(NilClass, klass.parse(nil))
39
+ assert_kind_of(NilClass, klass.parse("NULL"))
40
+ assert_kind_of(TrueClass, klass.parse('t'))
41
+ assert_kind_of(TrueClass, klass.parse(1))
42
+ assert_kind_of(TrueClass, klass.parse('1'))
43
+ assert_kind_of(FalseClass, klass.parse('f'))
44
+ assert_kind_of(FalseClass, klass.parse(0))
45
+ assert_kind_of(FalseClass, klass.parse('0'))
46
+ end
47
+
48
+ def test_varchar
49
+ klass = DBI::Type::Varchar
50
+ assert_kind_of(String, klass.parse("hello"))
51
+ assert_kind_of(String, klass.parse("1"))
52
+ assert_kind_of(String, klass.parse("1.23"))
53
+
54
+ assert_equal("NULL", klass.parse("NULL"))
55
+ assert_equal("1", klass.parse("1"))
56
+ assert_equal("hello", klass.parse("hello"))
57
+ assert_equal("1.23", klass.parse("1.23"))
58
+ end
59
+
60
+ def test_integer
61
+ klass = DBI::Type::Integer
62
+ assert_kind_of(Integer, klass.parse("1.23"))
63
+ assert_kind_of(Integer, klass.parse("-1.23"))
64
+ assert_kind_of(Integer, klass.parse("1.0"))
65
+ assert_kind_of(Integer, klass.parse("1"))
66
+ assert_kind_of(Integer, klass.parse("-1"))
67
+ assert_kind_of(Integer, klass.parse("0"))
68
+
69
+ assert_equal(nil, klass.parse("NULL"))
70
+ assert_equal(1, klass.parse("1.23"))
71
+ assert_equal(-1, klass.parse("-1.23"))
72
+ assert_equal(1, klass.parse("1.0"))
73
+ assert_equal(1, klass.parse("1"))
74
+ assert_equal(-1, klass.parse("-1"))
75
+ assert_equal(0, klass.parse("0"))
76
+ end
77
+
78
+ def test_float
79
+ klass = DBI::Type::Float
80
+ assert_kind_of(Float, klass.parse("1.23"))
81
+ assert_kind_of(Float, klass.parse("-1.23"))
82
+ assert_kind_of(Float, klass.parse("1.0"))
83
+ assert_kind_of(Float, klass.parse("1"))
84
+ assert_kind_of(Float, klass.parse("-1"))
85
+ assert_kind_of(Float, klass.parse("0"))
86
+
87
+ assert_equal(nil, klass.parse("NULL"))
88
+ assert_equal(1.23, klass.parse("1.23"))
89
+ assert_equal(-1.23, klass.parse("-1.23"))
90
+ assert_equal(1, klass.parse("1.0"))
91
+ assert_equal(1, klass.parse("1"))
92
+ assert_equal(-1, klass.parse("-1"))
93
+ assert_equal(0, klass.parse("0"))
94
+ end
95
+
96
+ def test_timestamp
97
+ klass = DBI::Type::Timestamp
98
+ assert_kind_of(DateTime, klass.parse(Time.now))
99
+ assert_kind_of(DateTime, klass.parse(Date.today))
100
+ assert_kind_of(DateTime, klass.parse(DateTime.now))
101
+ assert_kind_of(DateTime, klass.parse(Time.now.to_s))
102
+ assert_kind_of(DateTime, klass.parse(Date.today.to_s))
103
+ assert_kind_of(DateTime, klass.parse(DateTime.now.to_s))
104
+
105
+ assert_equal(nil, klass.parse("NULL"))
106
+
107
+ # string coercion
108
+ dt = DateTime.now
109
+ assert_equal(dt.to_s, klass.parse(dt).to_s)
110
+
111
+ t = Time.now
112
+ assert_equal(DateTime.parse(t.to_s).to_s, klass.parse(t).to_s)
113
+
114
+ d = Date.today
115
+ assert_equal(DateTime.parse(d.to_s).to_s, klass.parse(d).to_s)
116
+
117
+ md = "10-11"
118
+
119
+ if RUBY_VERSION !~ /^1\.8/
120
+ md = "11-10"
121
+ end
122
+
123
+ # be sure we're actually getting the right data back
124
+ assert_equal(
125
+ "2008-#{md}",
126
+ klass.parse(Date.parse("10/11/2008")).strftime("%Y-%m-%d")
127
+ )
128
+
129
+ assert_equal(
130
+ "10:01:02",
131
+ klass.parse(Time.parse("10:01:02")).strftime("%H:%M:%S")
132
+ )
133
+
134
+ assert_equal(
135
+ "#{md}-2008 10:01:02",
136
+ klass.parse(DateTime.parse("10/11/2008 10:01:02")).strftime("%m-%d-%Y %H:%M:%S")
137
+ )
138
+
139
+ # precision tests, related to ticket #27182
140
+
141
+ # iso8601 (bypasses regex)
142
+ [
143
+ '2009-09-27T19:41:00-05:00',
144
+ '2009-09-27T19:41:00.123-05:00'
145
+ ].each do |string|
146
+ assert_equal(DateTime.parse(string), klass.parse(string))
147
+ end
148
+
149
+ # offset comparison check
150
+ assert_equal(
151
+ DateTime.parse('2009-09-27T19:41:00.123-05:00'),
152
+ klass.parse('2009-09-28T00:41:00.123+00:00')
153
+ )
154
+
155
+ assert_equal(
156
+ DateTime.parse('2009-09-28T00:41:00.123+00:00'),
157
+ klass.parse('2009-09-27T19:41:00.123-05:00')
158
+ )
159
+
160
+ # unix convention (uses regex)
161
+
162
+ [
163
+ '2009-09-27 19:41:00 -05:00',
164
+ '2009-09-27 19:41:00.123 -05:00'
165
+ ].each do |string|
166
+ assert_equal(DateTime.parse(string), klass.parse(string))
167
+ end
168
+
169
+ # offset comparison check
170
+ assert_equal(
171
+ DateTime.parse('2009-09-27 19:41:00.123 -05:00'),
172
+ klass.parse('2009-09-28 00:41:00.123 +00:00')
173
+ )
174
+
175
+ assert_equal(
176
+ DateTime.parse('2009-09-28 00:41:00.123 +00:00'),
177
+ klass.parse('2009-09-27 19:41:00.123 -05:00')
178
+ )
179
+ end
180
+ end
181
+
182
+ class TC_DBI_TypeUtil < Test::Unit::TestCase
183
+ def cast(obj)
184
+ DBI::TypeUtil.convert(nil, obj)
185
+ end
186
+
187
+ def datecast(obj)
188
+ "'#{::DateTime.parse(obj.to_s).strftime("%Y-%m-%dT%H:%M:%S")}'"
189
+ end
190
+
191
+ def test_default_unknown_cast
192
+ assert_kind_of(String, cast(MyType.new("foo")))
193
+ assert_equal("'foo'", cast(MyType.new("foo")))
194
+ end
195
+
196
+ def test_default_numeric_cast
197
+ assert_kind_of(String, cast(1))
198
+ assert_equal("1", cast(1))
199
+ end
200
+
201
+ def test_default_string_cast
202
+ assert_kind_of(String, cast("foo"))
203
+ assert_equal("'foo'", cast("foo"))
204
+ assert_equal("'foo''bar'", cast("foo'bar"))
205
+ end
206
+
207
+ def test_default_time_casts
208
+ assert_kind_of(String, cast(Time.now))
209
+ assert_kind_of(String, cast(Date.today))
210
+ assert_kind_of(String, cast(DateTime.now))
211
+
212
+ obj = Time.now
213
+ assert_equal(datecast(obj), cast(obj))
214
+ obj = Date.today
215
+ assert_equal(datecast(obj), cast(obj))
216
+ obj = DateTime.now
217
+ assert_equal(datecast(obj), cast(obj))
218
+ end
219
+
220
+ def test_default_boolean_casts
221
+ assert_kind_of(String, cast(false))
222
+ assert_kind_of(String, cast(true))
223
+ assert_kind_of(NilClass, cast(nil))
224
+
225
+ assert_equal("'1'", cast(true))
226
+ assert_equal("'0'", cast(false))
227
+ assert_equal(nil, cast(nil))
228
+ end
229
+
230
+ def test_default_binary_casts
231
+ assert_kind_of(DBI::Binary, cast(DBI::Binary.new("poop")))
232
+ obj = DBI::Binary.new("poop")
233
+ assert_equal(obj.object_id, cast(obj).object_id)
234
+ end
235
+ end
236
+
237
+ DBI::TypeUtil.register_conversion("test") do |obj|
238
+ case obj
239
+ when ::NilClass
240
+ ["Custom Nil", false]
241
+ when ::TrueClass
242
+ ["Custom True", false]
243
+ when ::FalseClass
244
+ ["Custom False", false]
245
+ else
246
+ [obj, true]
247
+ end
248
+ end
249
+
250
+ class TC_DBI_TypeUtil_Custom < Test::Unit::TestCase
251
+ def cast(obj)
252
+ DBI::TypeUtil.convert("test", obj)
253
+ end
254
+
255
+ def test_custom_casts
256
+ assert_equal("Custom Nil", cast(nil))
257
+ assert_equal("Custom True", cast(true))
258
+ assert_equal("Custom False", cast(false))
259
+ end
260
+
261
+ def test_custom_fallthrough
262
+ assert_equal("'foo'", cast(:foo))
263
+ assert_equal("'foo'", cast("foo"))
264
+ assert_equal("'foo''bar'", cast("foo'bar"))
265
+ assert_equal("1", cast(1))
266
+ assert_equal("'foo'", cast(MyType.new("foo")))
267
+ end
268
+ end