activerecord-sqlserver-adapter 5.2.0 → 6.0.1

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 (152) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/issue_template.md +23 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +29 -0
  6. data/.travis.yml +6 -8
  7. data/CHANGELOG.md +46 -11
  8. data/{Dockerfile → Dockerfile.ci} +2 -2
  9. data/Gemfile +48 -41
  10. data/Guardfile +9 -8
  11. data/README.md +9 -37
  12. data/RUNNING_UNIT_TESTS.md +3 -0
  13. data/Rakefile +14 -16
  14. data/VERSION +1 -1
  15. data/activerecord-sqlserver-adapter.gemspec +25 -14
  16. data/appveyor.yml +24 -17
  17. data/docker-compose.ci.yml +7 -5
  18. data/guides/RELEASING.md +11 -0
  19. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +3 -4
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +22 -2
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
  23. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
  24. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +44 -0
  25. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
  26. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +28 -0
  27. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
  28. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +88 -44
  29. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +10 -12
  30. data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
  31. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +46 -8
  32. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
  33. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
  34. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +197 -165
  35. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
  36. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
  37. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
  38. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +2 -2
  39. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
  40. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
  41. data/lib/active_record/connection_adapters/sqlserver/type.rb +37 -35
  42. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
  43. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
  44. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
  45. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
  46. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +2 -2
  47. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
  48. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
  49. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
  51. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
  52. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
  53. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  54. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  55. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  56. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  57. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  58. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  59. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  60. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  61. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  62. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  63. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  64. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  65. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  70. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  71. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  72. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  73. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  74. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  75. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  76. data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
  77. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  78. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +132 -92
  79. data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
  80. data/lib/active_record/sqlserver_base.rb +9 -1
  81. data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
  82. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  83. data/lib/arel/visitors/sqlserver.rb +58 -24
  84. data/lib/arel_sqlserver.rb +4 -2
  85. data/test/appveyor/dbsetup.ps1 +4 -4
  86. data/test/cases/adapter_test_sqlserver.rb +223 -180
  87. data/test/cases/change_column_null_test_sqlserver.rb +17 -15
  88. data/test/cases/coerced_tests.rb +654 -360
  89. data/test/cases/column_test_sqlserver.rb +635 -604
  90. data/test/cases/connection_test_sqlserver.rb +18 -21
  91. data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
  92. data/test/cases/fetch_test_sqlserver.rb +17 -23
  93. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  94. data/test/cases/helper_sqlserver.rb +20 -15
  95. data/test/cases/in_clause_test_sqlserver.rb +36 -0
  96. data/test/cases/index_test_sqlserver.rb +15 -15
  97. data/test/cases/json_test_sqlserver.rb +25 -25
  98. data/test/cases/migration_test_sqlserver.rb +30 -26
  99. data/test/cases/order_test_sqlserver.rb +53 -54
  100. data/test/cases/pessimistic_locking_test_sqlserver.rb +31 -37
  101. data/test/cases/rake_test_sqlserver.rb +44 -56
  102. data/test/cases/schema_dumper_test_sqlserver.rb +117 -112
  103. data/test/cases/schema_test_sqlserver.rb +20 -26
  104. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  105. data/test/cases/showplan_test_sqlserver.rb +32 -39
  106. data/test/cases/specific_schema_test_sqlserver.rb +75 -72
  107. data/test/cases/transaction_test_sqlserver.rb +27 -29
  108. data/test/cases/trigger_test_sqlserver.rb +18 -17
  109. data/test/cases/utils_test_sqlserver.rb +78 -78
  110. data/test/cases/uuid_test_sqlserver.rb +19 -20
  111. data/test/debug.rb +8 -6
  112. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  113. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  114. data/test/models/sqlserver/booking.rb +3 -1
  115. data/test/models/sqlserver/customers_view.rb +3 -1
  116. data/test/models/sqlserver/datatype.rb +2 -0
  117. data/test/models/sqlserver/datatype_migration.rb +2 -0
  118. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  119. data/test/models/sqlserver/edge_schema.rb +3 -3
  120. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  121. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  122. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  123. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  124. data/test/models/sqlserver/no_pk_data.rb +3 -1
  125. data/test/models/sqlserver/object_default.rb +3 -1
  126. data/test/models/sqlserver/quoted_table.rb +4 -2
  127. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  128. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  129. data/test/models/sqlserver/sst_memory.rb +3 -1
  130. data/test/models/sqlserver/string_default.rb +3 -1
  131. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  132. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  133. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  134. data/test/models/sqlserver/trigger.rb +4 -2
  135. data/test/models/sqlserver/trigger_history.rb +3 -1
  136. data/test/models/sqlserver/upper.rb +3 -1
  137. data/test/models/sqlserver/uppered.rb +3 -1
  138. data/test/models/sqlserver/uuid.rb +3 -1
  139. data/test/schema/datatypes/2012.sql +1 -0
  140. data/test/schema/sqlserver_specific_schema.rb +31 -21
  141. data/test/support/coerceable_test_sqlserver.rb +15 -9
  142. data/test/support/connection_reflection.rb +3 -2
  143. data/test/support/core_ext/query_cache.rb +4 -1
  144. data/test/support/load_schema_sqlserver.rb +5 -5
  145. data/test/support/minitest_sqlserver.rb +3 -1
  146. data/test/support/paths_sqlserver.rb +11 -11
  147. data/test/support/rake_helpers.rb +13 -10
  148. data/test/support/sql_counter_sqlserver.rb +3 -4
  149. data/test/support/test_in_memory_oltp.rb +9 -7
  150. metadata +23 -13
  151. data/BACKERS.md +0 -32
  152. data/circle.yml +0 -38
@@ -1,809 +1,840 @@
1
- # encoding: UTF-8
2
- require 'cases/helper_sqlserver'
1
+ # frozen_string_literal: true
3
2
 
4
- class ColumnTestSQLServer < ActiveRecord::TestCase
3
+ require "cases/helper_sqlserver"
5
4
 
6
- it '#table_name' do
7
- assert SSTestDatatype.columns.all? { |c| c.table_name == 'sst_datatypes' }
8
- assert SSTestCustomersView.columns.all? { |c| c.table_name == 'customers' }
5
+ class ColumnTestSQLServer < ActiveRecord::TestCase
6
+ it "#table_name" do
7
+ assert SSTestDatatype.columns.all? { |c| c.table_name == "sst_datatypes" }
8
+ assert SSTestCustomersView.columns.all? { |c| c.table_name == "customers" }
9
9
  end
10
10
 
11
- describe 'ActiveRecord::ConnectionAdapters::SQLServer::Type' do
12
-
11
+ describe "ActiveRecord::ConnectionAdapters::SQLServer::Type" do
13
12
  let(:obj) { SSTestDatatype.new }
14
13
 
15
14
  Type = ActiveRecord::ConnectionAdapters::SQLServer::Type
16
15
 
17
- def new_obj ; SSTestDatatype.new ; end
18
- def column(name) ; SSTestDatatype.columns_hash[name] ; end
16
+ def new_obj; SSTestDatatype.new; end
17
+
18
+ def column(name); SSTestDatatype.columns_hash[name]; end
19
+
19
20
  def assert_obj_set_and_save(attribute, value)
20
21
  obj.send :"#{attribute}=", value
21
- obj.send(attribute).must_equal value
22
+ _(obj.send(attribute)).must_equal value
22
23
  obj.save!
23
- obj.reload.send(attribute).must_equal value
24
+ _(obj.reload.send(attribute)).must_equal value
24
25
  end
25
26
 
26
27
  # http://msdn.microsoft.com/en-us/library/ms187752.aspx
27
28
 
28
29
  # Exact Numerics
29
30
 
30
- it 'int(4) PRIMARY KEY' do
31
- col = column('id')
32
- col.sql_type.must_equal 'int(4)'
33
- col.null.must_equal false
31
+ it "int(4) PRIMARY KEY" do
32
+ col = column("id")
33
+ _(col.sql_type).must_equal "int(4)"
34
+ _(col.null).must_equal false
34
35
  end
35
36
 
36
- it 'bigint(8)' do
37
- col = column('bigint')
38
- col.sql_type.must_equal 'bigint(8)'
39
- col.type.must_equal :integer
40
- col.null.must_equal true
41
- col.default.must_equal 42
42
- obj.bigint.must_equal 42
43
- col.default_function.must_be_nil
37
+ it "bigint(8)" do
38
+ col = column("bigint")
39
+ _(col.sql_type).must_equal "bigint(8)"
40
+ _(col.type).must_equal :integer
41
+ _(col.null).must_equal true
42
+ _(col.default).must_equal 42
43
+ _(obj.bigint).must_equal 42
44
+ _(col.default_function).must_be_nil
44
45
  type = connection.lookup_cast_type_from_column(col)
45
- type.must_be_instance_of Type::BigInteger
46
- type.limit.must_equal 8
46
+ _(type).must_be_instance_of Type::BigInteger
47
+ _(type.limit).must_equal 8
47
48
  assert_obj_set_and_save :bigint, -9_223_372_036_854_775_808
48
49
  assert_obj_set_and_save :bigint, 9_223_372_036_854_775_807
49
50
  end
50
51
 
51
- it 'int(4)' do
52
- col = column('int')
53
- col.sql_type.must_equal 'int(4)'
54
- col.type.must_equal :integer
55
- col.null.must_equal true
56
- col.default.must_equal 42
57
- obj.int.must_equal 42
58
- col.default_function.must_be_nil
52
+ it "int(4)" do
53
+ col = column("int")
54
+ _(col.sql_type).must_equal "int(4)"
55
+ _(col.type).must_equal :integer
56
+ _(col.null).must_equal true
57
+ _(col.default).must_equal 42
58
+ _(obj.int).must_equal 42
59
+ _(col.default_function).must_be_nil
59
60
  type = connection.lookup_cast_type_from_column(col)
60
- type.must_be_instance_of Type::Integer
61
- type.limit.must_equal 4
61
+ _(type).must_be_instance_of Type::Integer
62
+ _(type.limit).must_equal 4
62
63
  assert_obj_set_and_save :int, -2_147_483_648
63
64
  assert_obj_set_and_save :int, 2_147_483_647
64
65
  end
65
66
 
66
- it 'smallint(2)' do
67
- col = column('smallint')
68
- col.sql_type.must_equal 'smallint(2)'
69
- col.type.must_equal :integer
70
- col.null.must_equal true
71
- col.default.must_equal 42
72
- obj.smallint.must_equal 42
73
- col.default_function.must_be_nil
67
+ it "smallint(2)" do
68
+ col = column("smallint")
69
+ _(col.sql_type).must_equal "smallint(2)"
70
+ _(col.type).must_equal :integer
71
+ _(col.null).must_equal true
72
+ _(col.default).must_equal 42
73
+ _(obj.smallint).must_equal 42
74
+ _(col.default_function).must_be_nil
74
75
  type = connection.lookup_cast_type_from_column(col)
75
- type.must_be_instance_of Type::SmallInteger
76
- type.limit.must_equal 2
76
+ _(type).must_be_instance_of Type::SmallInteger
77
+ _(type.limit).must_equal 2
77
78
  assert_obj_set_and_save :smallint, -32_768
78
79
  assert_obj_set_and_save :smallint, 32_767
79
80
  end
80
81
 
81
- it 'tinyint(1)' do
82
- col = column('tinyint')
83
- col.sql_type.must_equal 'tinyint(1)'
84
- col.type.must_equal :integer
85
- col.null.must_equal true
86
- col.default.must_equal 42
87
- obj.tinyint.must_equal 42
88
- col.default_function.must_be_nil
82
+ it "tinyint(1)" do
83
+ col = column("tinyint")
84
+ _(col.sql_type).must_equal "tinyint(1)"
85
+ _(col.type).must_equal :integer
86
+ _(col.null).must_equal true
87
+ _(col.default).must_equal 42
88
+ _(obj.tinyint).must_equal 42
89
+ _(col.default_function).must_be_nil
89
90
  type = connection.lookup_cast_type_from_column(col)
90
- type.must_be_instance_of Type::TinyInteger
91
- type.limit.must_equal 1
91
+ _(type).must_be_instance_of Type::TinyInteger
92
+ _(type.limit).must_equal 1
92
93
  assert_obj_set_and_save :tinyint, 0
93
94
  assert_obj_set_and_save :tinyint, 255
94
95
  end
95
96
 
96
- it 'bit' do
97
- col = column('bit')
98
- col.sql_type.must_equal 'bit'
99
- col.type.must_equal :boolean
100
- col.null.must_equal true
101
- col.default.must_equal true
102
- obj.bit.must_equal true
103
- col.default_function.must_be_nil
97
+ it "bit" do
98
+ col = column("bit")
99
+ _(col.sql_type).must_equal "bit"
100
+ _(col.type).must_equal :boolean
101
+ _(col.null).must_equal true
102
+ _(col.default).must_equal true
103
+ _(obj.bit).must_equal true
104
+ _(col.default_function).must_be_nil
104
105
  type = connection.lookup_cast_type_from_column(col)
105
- type.must_be_instance_of Type::Boolean
106
- type.limit.must_be_nil
106
+ _(type).must_be_instance_of Type::Boolean
107
+ _(type.limit).must_be_nil
107
108
  obj.bit = 0
108
- obj.bit.must_equal false
109
- obj.save!
110
- obj.reload.bit.must_equal false
111
- obj.bit = '1'
112
- obj.bit.must_equal true
113
- obj.save!
114
- obj.reload.bit.must_equal true
115
- end
116
-
117
- it 'decimal(9,2)' do
118
- col = column('decimal_9_2')
119
- col.sql_type.must_equal 'decimal(9,2)'
120
- col.type.must_equal :decimal
121
- col.null.must_equal true
122
- col.default.must_equal BigDecimal('12345.01')
123
- obj.decimal_9_2.must_equal BigDecimal('12345.01')
124
- col.default_function.must_be_nil
125
- type = connection.lookup_cast_type_from_column(col)
126
- type.must_be_instance_of Type::Decimal
127
- type.limit.must_be_nil
128
- type.precision.must_equal 9
129
- type.scale.must_equal 2
130
- obj.decimal_9_2 = '1234567.8901'
131
- obj.decimal_9_2.must_equal BigDecimal('1234567.89')
132
- obj.save!
133
- obj.reload.decimal_9_2.must_equal BigDecimal('1234567.89')
134
- end
135
-
136
- it 'decimal(16,4)' do
137
- col = column('decimal_16_4')
138
- col.sql_type.must_equal 'decimal(16,4)'
139
- col.default.must_equal BigDecimal('1234567.89')
140
- obj.decimal_16_4.must_equal BigDecimal('1234567.89')
141
- col.default_function.must_be_nil
142
- type = connection.lookup_cast_type_from_column(col)
143
- type.precision.must_equal 16
144
- type.scale.must_equal 4
145
- obj.decimal_16_4 = '1234567.8901001'
146
- obj.decimal_16_4.must_equal BigDecimal('1234567.8901')
147
- obj.save!
148
- obj.reload.decimal_16_4.must_equal BigDecimal('1234567.8901')
149
- end
150
-
151
- it 'numeric(18,0)' do
152
- col = column('numeric_18_0')
153
- col.sql_type.must_equal 'numeric(18,0)'
154
- col.type.must_equal :decimal
155
- col.null.must_equal true
156
- col.default.must_equal BigDecimal('191')
157
- obj.numeric_18_0.must_equal BigDecimal('191')
158
- col.default_function.must_be_nil
159
- type = connection.lookup_cast_type_from_column(col)
160
- type.must_be_instance_of Type::Decimal
161
- type.limit.must_be_nil
162
- type.precision.must_equal 18
163
- type.scale.must_equal 0
164
- obj.numeric_18_0 = '192.1'
165
- obj.numeric_18_0.must_equal BigDecimal('192')
166
- obj.save!
167
- obj.reload.numeric_18_0.must_equal BigDecimal('192')
168
- end
169
-
170
- it 'numeric(36,2)' do
171
- col = column('numeric_36_2')
172
- col.sql_type.must_equal 'numeric(36,2)'
173
- col.type.must_equal :decimal
174
- col.null.must_equal true
175
- col.default.must_equal BigDecimal('12345678901234567890.01')
176
- obj.numeric_36_2.must_equal BigDecimal('12345678901234567890.01')
177
- col.default_function.must_be_nil
178
- type = connection.lookup_cast_type_from_column(col)
179
- type.must_be_instance_of Type::Decimal
180
- type.limit.must_be_nil
181
- type.precision.must_equal 36
182
- type.scale.must_equal 2
183
- obj.numeric_36_2 = '192.123'
184
- obj.numeric_36_2.must_equal BigDecimal('192.12')
185
- obj.save!
186
- obj.reload.numeric_36_2.must_equal BigDecimal('192.12')
187
- end
188
-
189
- it 'money' do
190
- col = column('money')
191
- col.sql_type.must_equal 'money'
192
- col.type.must_equal :money
193
- col.null.must_equal true
194
- col.default.must_equal BigDecimal('4.20')
195
- obj.money.must_equal BigDecimal('4.20')
196
- col.default_function.must_be_nil
197
- type = connection.lookup_cast_type_from_column(col)
198
- type.must_be_instance_of Type::Money
199
- type.limit.must_be_nil
200
- type.precision.must_equal 19
201
- type.scale.must_equal 4
202
- obj.money = '922337203685477.58061'
203
- obj.money.must_equal BigDecimal('922337203685477.5806')
204
- obj.save!
205
- obj.reload.money.must_equal BigDecimal('922337203685477.5806')
206
- end
207
-
208
- it 'smallmoney' do
209
- col = column('smallmoney')
210
- col.sql_type.must_equal 'smallmoney'
211
- col.type.must_equal :smallmoney
212
- col.null.must_equal true
213
- col.default.must_equal BigDecimal('4.20')
214
- obj.smallmoney.must_equal BigDecimal('4.20')
215
- col.default_function.must_be_nil
216
- type = connection.lookup_cast_type_from_column(col)
217
- type.must_be_instance_of Type::SmallMoney
218
- type.limit.must_be_nil
219
- type.precision.must_equal 10
220
- type.scale.must_equal 4
221
- obj.smallmoney = '214748.36461'
222
- obj.smallmoney.must_equal BigDecimal('214748.3646')
223
- obj.save!
224
- obj.reload.smallmoney.must_equal BigDecimal('214748.3646')
109
+ _(obj.bit).must_equal false
110
+ obj.save!
111
+ _(obj.reload.bit).must_equal false
112
+ obj.bit = "1"
113
+ _(obj.bit).must_equal true
114
+ obj.save!
115
+ _(obj.reload.bit).must_equal true
116
+ end
117
+
118
+ it "decimal(9,2)" do
119
+ col = column("decimal_9_2")
120
+ _(col.sql_type).must_equal "decimal(9,2)"
121
+ _(col.type).must_equal :decimal
122
+ _(col.null).must_equal true
123
+ _(col.default).must_equal BigDecimal("12345.01")
124
+ _(obj.decimal_9_2).must_equal BigDecimal("12345.01")
125
+ _(col.default_function).must_be_nil
126
+ type = connection.lookup_cast_type_from_column(col)
127
+ _(type).must_be_instance_of Type::Decimal
128
+ _(type.limit).must_be_nil
129
+ _(type.precision).must_equal 9
130
+ _(type.scale).must_equal 2
131
+ obj.decimal_9_2 = "1234567.8901"
132
+ _(obj.decimal_9_2).must_equal BigDecimal("1234567.89")
133
+ obj.save!
134
+ _(obj.reload.decimal_9_2).must_equal BigDecimal("1234567.89")
135
+ end
136
+
137
+ it "decimal(16,4)" do
138
+ col = column("decimal_16_4")
139
+ _(col.sql_type).must_equal "decimal(16,4)"
140
+ _(col.default).must_equal BigDecimal("1234567.89")
141
+ _(obj.decimal_16_4).must_equal BigDecimal("1234567.89")
142
+ _(col.default_function).must_be_nil
143
+ type = connection.lookup_cast_type_from_column(col)
144
+ _(type.precision).must_equal 16
145
+ _(type.scale).must_equal 4
146
+ obj.decimal_16_4 = "1234567.8901001"
147
+ _(obj.decimal_16_4).must_equal BigDecimal("1234567.8901")
148
+ obj.save!
149
+ _(obj.reload.decimal_16_4).must_equal BigDecimal("1234567.8901")
150
+ end
151
+
152
+ it "numeric(18,0)" do
153
+ col = column("numeric_18_0")
154
+ _(col.sql_type).must_equal "numeric(18,0)"
155
+ _(col.type).must_equal :decimal
156
+ _(col.null).must_equal true
157
+ _(col.default).must_equal BigDecimal("191")
158
+ _(obj.numeric_18_0).must_equal BigDecimal("191")
159
+ _(col.default_function).must_be_nil
160
+ type = connection.lookup_cast_type_from_column(col)
161
+ _(type).must_be_instance_of Type::Decimal
162
+ _(type.limit).must_be_nil
163
+ _(type.precision).must_equal 18
164
+ _(type.scale).must_equal 0
165
+ obj.numeric_18_0 = "192.1"
166
+ _(obj.numeric_18_0).must_equal BigDecimal("192")
167
+ obj.save!
168
+ _(obj.reload.numeric_18_0).must_equal BigDecimal("192")
169
+ end
170
+
171
+ it "numeric(36,2)" do
172
+ col = column("numeric_36_2")
173
+ _(col.sql_type).must_equal "numeric(36,2)"
174
+ _(col.type).must_equal :decimal
175
+ _(col.null).must_equal true
176
+ _(col.default).must_equal BigDecimal("12345678901234567890.01")
177
+ _(obj.numeric_36_2).must_equal BigDecimal("12345678901234567890.01")
178
+ _(col.default_function).must_be_nil
179
+ type = connection.lookup_cast_type_from_column(col)
180
+ _(type).must_be_instance_of Type::Decimal
181
+ _(type.limit).must_be_nil
182
+ _(type.precision).must_equal 36
183
+ _(type.scale).must_equal 2
184
+ obj.numeric_36_2 = "192.123"
185
+ _(obj.numeric_36_2).must_equal BigDecimal("192.12")
186
+ obj.save!
187
+ _(obj.reload.numeric_36_2).must_equal BigDecimal("192.12")
188
+ end
189
+
190
+ it "money" do
191
+ col = column("money")
192
+ _(col.sql_type).must_equal "money"
193
+ _(col.type).must_equal :money
194
+ _(col.null).must_equal true
195
+ _(col.default).must_equal BigDecimal("4.20")
196
+ _(obj.money).must_equal BigDecimal("4.20")
197
+ _(col.default_function).must_be_nil
198
+ type = connection.lookup_cast_type_from_column(col)
199
+ _(type).must_be_instance_of Type::Money
200
+ _(type.limit).must_be_nil
201
+ _(type.precision).must_equal 19
202
+ _(type.scale).must_equal 4
203
+ obj.money = "922337203685477.58061"
204
+ _(obj.money).must_equal BigDecimal("922337203685477.5806")
205
+ obj.save!
206
+ _(obj.reload.money).must_equal BigDecimal("922337203685477.5806")
207
+ end
208
+
209
+ it "smallmoney" do
210
+ col = column("smallmoney")
211
+ _(col.sql_type).must_equal "smallmoney"
212
+ _(col.type).must_equal :smallmoney
213
+ _(col.null).must_equal true
214
+ _(col.default).must_equal BigDecimal("4.20")
215
+ _(obj.smallmoney).must_equal BigDecimal("4.20")
216
+ _(col.default_function).must_be_nil
217
+ type = connection.lookup_cast_type_from_column(col)
218
+ _(type).must_be_instance_of Type::SmallMoney
219
+ _(type.limit).must_be_nil
220
+ _(type.precision).must_equal 10
221
+ _(type.scale).must_equal 4
222
+ obj.smallmoney = "214748.36461"
223
+ _(obj.smallmoney).must_equal BigDecimal("214748.3646")
224
+ obj.save!
225
+ _(obj.reload.smallmoney).must_equal BigDecimal("214748.3646")
225
226
  end
226
227
 
227
228
  # Approximate Numerics
228
229
  # Float limits are adjusted to 24 or 53 by the database as per http://msdn.microsoft.com/en-us/library/ms173773.aspx
229
230
  # Floats with a limit of <= 24 are reduced to reals by sqlserver on creation.
230
231
 
231
- it 'float' do
232
- col = column('float')
233
- col.sql_type.must_equal 'float'
234
- col.type.must_equal :float
235
- col.null.must_equal true
236
- col.default.must_equal 123.00000001
237
- obj.float.must_equal 123.00000001
238
- col.default_function.must_be_nil
232
+ it "float" do
233
+ col = column("float")
234
+ _(col.sql_type).must_equal "float"
235
+ _(col.type).must_equal :float
236
+ _(col.null).must_equal true
237
+ _(col.default).must_equal 123.00000001
238
+ _(obj.float).must_equal 123.00000001
239
+ _(col.default_function).must_be_nil
239
240
  type = connection.lookup_cast_type_from_column(col)
240
- type.must_be_instance_of Type::Float
241
- type.limit.must_be_nil
242
- type.precision.must_be_nil
243
- type.scale.must_be_nil
244
- obj.float = '214748.36461'
245
- obj.float.must_equal 214748.36461
241
+ _(type).must_be_instance_of Type::Float
242
+ _(type.limit).must_be_nil
243
+ _(type.precision).must_be_nil
244
+ _(type.scale).must_be_nil
245
+ obj.float = "214748.36461"
246
+ _(obj.float).must_equal 214748.36461
246
247
  obj.save!
247
- obj.reload.float.must_equal 214748.36461
248
+ _(obj.reload.float).must_equal 214748.36461
248
249
  end
249
250
 
250
- it 'real' do
251
- col = column('real')
252
- col.sql_type.must_equal 'real'
253
- col.type.must_equal :real
254
- col.null.must_equal true
255
- col.default.must_be_close_to 123.45, 0.01
256
- obj.real.must_be_close_to 123.45, 0.01
257
- col.default_function.must_be_nil
251
+ it "real" do
252
+ col = column("real")
253
+ _(col.sql_type).must_equal "real"
254
+ _(col.type).must_equal :real
255
+ _(col.null).must_equal true
256
+ _(col.default).must_be_close_to 123.45, 0.01
257
+ _(obj.real).must_be_close_to 123.45, 0.01
258
+ _(col.default_function).must_be_nil
258
259
  type = connection.lookup_cast_type_from_column(col)
259
- type.must_be_instance_of Type::Real
260
- type.limit.must_be_nil
261
- type.precision.must_be_nil
262
- type.scale.must_be_nil
263
- obj.real = '214748.36461'
264
- obj.real.must_be_close_to 214748.36461, 0.01
260
+ _(type).must_be_instance_of Type::Real
261
+ _(type.limit).must_be_nil
262
+ _(type.precision).must_be_nil
263
+ _(type.scale).must_be_nil
264
+ obj.real = "214748.36461"
265
+ _(obj.real).must_be_close_to 214748.36461, 0.01
265
266
  obj.save!
266
- obj.reload.real.must_be_close_to 214748.36461, 0.01
267
+ _(obj.reload.real).must_be_close_to 214748.36461, 0.01
267
268
  end
268
269
 
269
270
  # Date and Time
270
271
 
271
- it 'date' do
272
- col = column('date')
273
- col.sql_type.must_equal 'date'
274
- col.type.must_equal :date
275
- col.null.must_equal true
276
- col.default.must_equal connection_dblib_73? ? Date.civil(0001, 1, 1) : '0001-01-01'
277
- obj.date.must_equal Date.civil(0001, 1, 1)
278
- col.default_function.must_be_nil
279
- type = connection.lookup_cast_type_from_column(col)
280
- type.must_be_instance_of Type::Date
281
- type.limit.must_be_nil
282
- type.precision.must_be_nil
283
- type.scale.must_be_nil
272
+ it "date" do
273
+ col = column("date")
274
+ _(col.sql_type).must_equal "date"
275
+ _(col.type).must_equal :date
276
+ _(col.null).must_equal true
277
+ _(col.default).must_equal connection_dblib_73? ? Date.civil(0001, 1, 1) : "0001-01-01"
278
+ _(obj.date).must_equal Date.civil(0001, 1, 1)
279
+ _(col.default_function).must_be_nil
280
+ type = connection.lookup_cast_type_from_column(col)
281
+ _(type).must_be_instance_of Type::Date
282
+ _(type.limit).must_be_nil
283
+ _(type.precision).must_be_nil
284
+ _(type.scale).must_be_nil
284
285
  # Can cast strings. SQL Server format.
285
- obj.date = '04-01-0001'
286
- obj.date.must_equal Date.civil(0001, 4, 1)
286
+ obj.date = "04-01-0001"
287
+ _(obj.date).must_equal Date.civil(0001, 4, 1)
287
288
  obj.save!
288
- obj.date.must_equal Date.civil(0001, 4, 1)
289
+ _(obj.date).must_equal Date.civil(0001, 4, 1)
289
290
  obj.reload
290
- obj.date.must_equal Date.civil(0001, 4, 1)
291
+ _(obj.date).must_equal Date.civil(0001, 4, 1)
291
292
  # Can cast strings. ISO format.
292
- obj.date = '0001-04-01'
293
- obj.date.must_equal Date.civil(0001, 4, 1)
293
+ obj.date = "0001-04-01"
294
+ _(obj.date).must_equal Date.civil(0001, 4, 1)
294
295
  obj.save!
295
- obj.date.must_equal Date.civil(0001, 4, 1)
296
+ _(obj.date).must_equal Date.civil(0001, 4, 1)
296
297
  obj.reload
297
- obj.date.must_equal Date.civil(0001, 4, 1)
298
+ _(obj.date).must_equal Date.civil(0001, 4, 1)
298
299
  # Can keep and return assigned date.
299
300
  assert_obj_set_and_save :date, Date.civil(1972, 04, 14)
300
301
  # Can accept and cast time objects.
301
302
  obj.date = Time.utc(2010, 4, 14, 12, 34, 56, 3000)
302
- obj.date.must_equal Date.civil(2010, 4, 14)
303
+ _(obj.date).must_equal Date.civil(2010, 4, 14)
303
304
  obj.save!
304
- obj.reload.date.must_equal Date.civil(2010, 4, 14)
305
+ _(obj.reload.date).must_equal Date.civil(2010, 4, 14)
305
306
  end
306
307
 
307
- it 'datetime' do
308
- col = column('datetime')
309
- col.sql_type.must_equal 'datetime'
310
- col.type.must_equal :datetime
311
- col.null.must_equal true
308
+ it "datetime" do
309
+ col = column("datetime")
310
+ _(col.sql_type).must_equal "datetime"
311
+ _(col.type).must_equal :datetime
312
+ _(col.null).must_equal true
312
313
  time = Time.utc 1753, 01, 01, 00, 00, 00, 123000
313
- col.default.must_equal time, "Microseconds were <#{col.default.usec}> vs <123000>"
314
- obj.datetime.must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <123000>"
315
- col.default_function.must_be_nil
314
+ _(col.default).must_equal time, "Microseconds were <#{col.default.usec}> vs <123000>"
315
+ _(obj.datetime).must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <123000>"
316
+ _(col.default_function).must_be_nil
316
317
  type = connection.lookup_cast_type_from_column(col)
317
- type.must_be_instance_of Type::DateTime
318
- type.limit.must_be_nil
319
- type.precision.must_be_nil
320
- type.scale.must_be_nil
318
+ _(type).must_be_instance_of Type::DateTime
319
+ _(type.limit).must_be_nil
320
+ _(type.precision).must_be_nil
321
+ _(type.scale).must_be_nil
321
322
  obj.save!
322
- obj.must_equal obj.class.where(datetime: time).first
323
+ _(obj).must_equal obj.class.where(datetime: time).first
323
324
  # Can save to proper accuracy and return again.
324
325
  time = Time.utc 2010, 04, 01, 12, 34, 56, 3000
325
326
  obj.datetime = time
326
- obj.datetime.must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
327
+ _(obj.datetime).must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
327
328
  obj.save!
328
- obj.datetime.must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
329
+ _(obj.datetime).must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
329
330
  obj.reload
330
- obj.datetime.must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
331
- obj.must_equal obj.class.where(datetime: time).first
331
+ _(obj.datetime).must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
332
+ _(obj).must_equal obj.class.where(datetime: time).first
332
333
  # Will cast to true DB value on attribute write, save and return again.
333
- time = Time.utc 2010, 04, 01, 12, 34, 56, 234567
334
+ time = Time.utc 2010, 04, 01, 12, 34, 56, 234567
334
335
  time2 = Time.utc 2010, 04, 01, 12, 34, 56, 233000
335
336
  obj.datetime = time
336
- obj.datetime.must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
337
+ _(obj.datetime).must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
337
338
  obj.save!
338
- obj.datetime.must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
339
+ _(obj.datetime).must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
339
340
  obj.reload
340
- obj.datetime.must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
341
- obj.must_equal obj.class.where(datetime: time).first
342
- obj.must_equal obj.class.where(datetime: time2).first
341
+ _(obj.datetime).must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
342
+ _(obj).must_equal obj.class.where(datetime: time).first
343
+ _(obj).must_equal obj.class.where(datetime: time2).first
343
344
  # Set and find nil.
344
345
  obj.datetime = nil
345
- obj.datetime.must_be_nil
346
+ _(obj.datetime).must_be_nil
346
347
  obj.save!
347
- obj.datetime.must_be_nil
348
- obj.must_equal obj.class.where(datetime: nil).first
348
+ _(obj.datetime).must_be_nil
349
+ _(obj).must_equal obj.class.where(datetime: nil).first
349
350
  end
350
351
 
351
- it 'datetime2' do
352
- skip 'datetime2 not supported in this protocal version' unless connection_dblib_73?
353
- col = column('datetime2_7')
354
- col.sql_type.must_equal 'datetime2(7)'
355
- col.type.must_equal :datetime
356
- col.null.must_equal true
352
+ it "datetime2" do
353
+ skip "datetime2 not supported in this protocol version" unless connection_dblib_73?
354
+ col = column("datetime2_7")
355
+ _(col.sql_type).must_equal "datetime2(7)"
356
+ _(col.type).must_equal :datetime
357
+ _(col.null).must_equal true
357
358
  time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(999999900, 1000)
358
- col.default.must_equal time, "Nanoseconds were <#{col.default.nsec}> vs <999999900>"
359
- obj.datetime2_7.must_equal time, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <999999900>"
360
- col.default_function.must_be_nil
359
+ _(col.default).must_equal time, "Nanoseconds were <#{col.default.nsec}> vs <999999900>"
360
+ _(obj.datetime2_7).must_equal time, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <999999900>"
361
+ _(col.default_function).must_be_nil
361
362
  type = connection.lookup_cast_type_from_column(col)
362
- type.must_be_instance_of Type::DateTime2
363
- type.limit.must_be_nil
364
- type.precision.must_equal 7
365
- type.scale.must_be_nil
363
+ _(type).must_be_instance_of Type::DateTime2
364
+ _(type.limit).must_be_nil
365
+ _(type.precision).must_equal 7
366
+ _(type.scale).must_be_nil
366
367
  obj.save!
367
- obj.must_equal obj.class.where(datetime2_7: time).first
368
+ _(obj).must_equal obj.class.where(datetime2_7: time).first
368
369
  # Can save 100 nanosecond precisoins and return again.
369
- time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456755, 1000)
370
+ time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456755, 1000)
370
371
  time2 = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456800, 1000)
371
372
  obj.datetime2_7 = time
372
- obj.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
373
+ _(obj.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
373
374
  obj.save!
374
- obj.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
375
+ _(obj.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
375
376
  obj.reload
376
- obj.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
377
- obj.must_equal obj.class.where(datetime2_7: time).first
378
- obj.must_equal obj.class.where(datetime2_7: time2).first
377
+ _(obj.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
378
+ _(obj).must_equal obj.class.where(datetime2_7: time).first
379
+ _(obj).must_equal obj.class.where(datetime2_7: time2).first
379
380
  # Can save small fraction nanosecond precisoins and return again.
380
- time = Time.utc 2008, 6, 21, 13, 30, 0, Rational(15020, 1000)
381
+ time = Time.utc 2008, 6, 21, 13, 30, 0, Rational(15020, 1000)
381
382
  time2 = Time.utc 2008, 6, 21, 13, 30, 0, Rational(15000, 1000)
382
383
  obj.datetime2_7 = time
383
- obj.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
384
+ _(obj.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
384
385
  obj.save!
385
- obj.reload.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
386
- obj.must_equal obj.class.where(datetime2_7: time).first
387
- obj.must_equal obj.class.where(datetime2_7: time2).first
386
+ _(obj.reload.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
387
+ _(obj).must_equal obj.class.where(datetime2_7: time).first
388
+ _(obj).must_equal obj.class.where(datetime2_7: time2).first
388
389
  # datetime2_3
389
390
  time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456789, 1000)
390
- col = column('datetime2_3')
391
- connection.lookup_cast_type_from_column(col).precision.must_equal 3
391
+ col = column("datetime2_3")
392
+ _(connection.lookup_cast_type_from_column(col).precision).must_equal 3
392
393
  obj.datetime2_3 = time
393
- obj.datetime2_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetime2_3.nsec}> vs <123000000>"
394
- obj.save! ; obj.reload
395
- obj.datetime2_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetime2_3.nsec}> vs <123000000>"
396
- obj.must_equal obj.class.where(datetime2_3: time).first
394
+ _(obj.datetime2_3).must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetime2_3.nsec}> vs <123000000>"
395
+ obj.save!; obj.reload
396
+ _(obj.datetime2_3).must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetime2_3.nsec}> vs <123000000>"
397
+ _(obj).must_equal obj.class.where(datetime2_3: time).first
397
398
  # datetime2_1
398
- col = column('datetime2_1')
399
- connection.lookup_cast_type_from_column(col).precision.must_equal 1
399
+ col = column("datetime2_1")
400
+ _(connection.lookup_cast_type_from_column(col).precision).must_equal 1
400
401
  obj.datetime2_1 = time
401
- obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
402
- obj.save! ; obj.reload
403
- obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
404
- obj.must_equal obj.class.where(datetime2_1: time).first
402
+ _(obj.datetime2_1).must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
403
+ obj.save!; obj.reload
404
+ _(obj.datetime2_1).must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
405
+ _(obj).must_equal obj.class.where(datetime2_1: time).first
405
406
  # datetime2_0
406
- col = column('datetime2_0')
407
- connection.lookup_cast_type_from_column(col).precision.must_equal 0
407
+ col = column("datetime2_0")
408
+ _(connection.lookup_cast_type_from_column(col).precision).must_equal 0
408
409
  time = Time.utc 2016, 4, 19, 16, 45, 40, 771036
409
410
  obj.datetime2_0 = time
410
- obj.datetime2_0.must_equal time.change(nsec: 0), "Nanoseconds were <#{obj.datetime2_0.nsec}> vs <0>"
411
- obj.save! ; obj.reload
412
- obj.datetime2_0.must_equal time.change(nsec: 0), "Nanoseconds were <#{obj.datetime2_0.nsec}> vs <0>"
413
- obj.must_equal obj.class.where(datetime2_0: time).first
414
- end
415
-
416
- it 'datetimeoffset' do
417
- skip 'datetimeoffset not supported in this protocal version' unless connection_dblib_73?
418
- col = column('datetimeoffset_7')
419
- col.sql_type.must_equal 'datetimeoffset(7)'
420
- col.type.must_equal :datetimeoffset
421
- col.null.must_equal true
422
- col.default.must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds <#{col.default.nsec}> vs <123456700>"
423
- obj.datetimeoffset_7.must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <999999900>"
424
- col.default_function.must_be_nil
425
- type = connection.lookup_cast_type_from_column(col)
426
- type.must_be_instance_of Type::DateTimeOffset
427
- type.limit.must_be_nil
428
- type.precision.must_equal 7
429
- type.scale.must_be_nil
411
+ _(obj.datetime2_0).must_equal time.change(nsec: 0), "Nanoseconds were <#{obj.datetime2_0.nsec}> vs <0>"
412
+ obj.save!; obj.reload
413
+ _(obj.datetime2_0).must_equal time.change(nsec: 0), "Nanoseconds were <#{obj.datetime2_0.nsec}> vs <0>"
414
+ _(obj).must_equal obj.class.where(datetime2_0: time).first
415
+ end
416
+
417
+ it "datetimeoffset" do
418
+ skip "datetimeoffset not supported in this protocol version" unless connection_dblib_73?
419
+ col = column("datetimeoffset_7")
420
+ _(col.sql_type).must_equal "datetimeoffset(7)"
421
+ _(col.type).must_equal :datetimeoffset
422
+ _(col.null).must_equal true
423
+ _(col.default).must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds <#{col.default.nsec}> vs <123456700>"
424
+ _(obj.datetimeoffset_7).must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <999999900>"
425
+ _(col.default_function).must_be_nil
426
+ type = connection.lookup_cast_type_from_column(col)
427
+ _(type).must_be_instance_of Type::DateTimeOffset
428
+ _(type.limit).must_be_nil
429
+ _(type.precision).must_equal 7
430
+ _(type.scale).must_be_nil
430
431
  # Can save 100 nanosecond precisoins and return again.
431
432
  obj.datetimeoffset_7 = Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456755)
432
- obj.datetimeoffset_7.must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
433
+ _(obj.datetimeoffset_7).must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
433
434
  obj.save!
434
- obj.datetimeoffset_7.must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
435
+ _(obj.datetimeoffset_7).must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
435
436
  obj.reload
436
- obj.datetimeoffset_7.must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
437
+ _(obj.datetimeoffset_7).must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
437
438
  # Maintains the timezone
438
- time = ActiveSupport::TimeZone['America/Los_Angeles'].local 2010, 12, 31, 23, 59, 59, Rational(123456800, 1000)
439
+ time = ActiveSupport::TimeZone["America/Los_Angeles"].local 2010, 12, 31, 23, 59, 59, Rational(123456800, 1000)
439
440
  obj.datetimeoffset_7 = time
440
- obj.datetimeoffset_7.must_equal time
441
+ _(obj.datetimeoffset_7).must_equal time
441
442
  obj.save!
442
- obj.datetimeoffset_7.must_equal time
443
- obj.reload.datetimeoffset_7.must_equal time
443
+ _(obj.datetimeoffset_7).must_equal time
444
+ _(obj.reload.datetimeoffset_7).must_equal time
444
445
  # With other precisions.
445
- time = ActiveSupport::TimeZone['America/Los_Angeles'].local 2010, 12, 31, 23, 59, 59, Rational(123456755, 1000)
446
- col = column('datetimeoffset_3')
447
- connection.lookup_cast_type_from_column(col).precision.must_equal 3
446
+ time = ActiveSupport::TimeZone["America/Los_Angeles"].local 2010, 12, 31, 23, 59, 59, Rational(123456755, 1000)
447
+ col = column("datetimeoffset_3")
448
+ _(connection.lookup_cast_type_from_column(col).precision).must_equal 3
448
449
  obj.datetimeoffset_3 = time
449
- obj.datetimeoffset_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
450
+ _(obj.datetimeoffset_3).must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
450
451
  obj.save!
451
- obj.datetimeoffset_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
452
- col = column('datetime2_1')
453
- connection.lookup_cast_type_from_column(col).precision.must_equal 1
452
+ _(obj.datetimeoffset_3).must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
453
+ col = column("datetime2_1")
454
+ _(connection.lookup_cast_type_from_column(col).precision).must_equal 1
454
455
  obj.datetime2_1 = time
455
- obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
456
+ _(obj.datetime2_1).must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
456
457
  obj.save!
457
- obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
458
+ _(obj.datetime2_1).must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
458
459
  end
459
460
 
460
- it 'smalldatetime' do
461
- col = column('smalldatetime')
462
- col.sql_type.must_equal 'smalldatetime'
463
- col.type.must_equal :smalldatetime
464
- col.null.must_equal true
465
- col.default.must_equal Time.utc(1901, 01, 01, 15, 45, 00, 000)
466
- obj.smalldatetime.must_equal Time.utc(1901, 01, 01, 15, 45, 00, 000)
467
- col.default_function.must_be_nil
461
+ it "smalldatetime" do
462
+ col = column("smalldatetime")
463
+ _(col.sql_type).must_equal "smalldatetime"
464
+ _(col.type).must_equal :smalldatetime
465
+ _(col.null).must_equal true
466
+ _(col.default).must_equal Time.utc(1901, 01, 01, 15, 45, 00, 000)
467
+ _(obj.smalldatetime).must_equal Time.utc(1901, 01, 01, 15, 45, 00, 000)
468
+ _(col.default_function).must_be_nil
468
469
  type = connection.lookup_cast_type_from_column(col)
469
- type.must_be_instance_of Type::SmallDateTime
470
- type.limit.must_be_nil
471
- type.precision.must_be_nil
472
- type.scale.must_be_nil
470
+ _(type).must_be_instance_of Type::SmallDateTime
471
+ _(type.limit).must_be_nil
472
+ _(type.precision).must_be_nil
473
+ _(type.scale).must_be_nil
473
474
  # Will remove fractional seconds and return again.
474
475
  obj.smalldatetime = Time.utc(2078, 06, 05, 4, 20, 00, 3000)
475
- obj.smalldatetime.must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.smalldatetime.usec}> vs <0>"
476
+ _(obj.smalldatetime).must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.smalldatetime.usec}> vs <0>"
476
477
  obj.save!
477
- obj.smalldatetime.must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
478
+ _(obj.smalldatetime).must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
478
479
  obj.reload
479
- obj.smalldatetime.must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
480
- end
481
-
482
- it 'time(7)' do
483
- skip 'time() not supported in this protocal version' unless connection_dblib_73?
484
- col = column('time_7')
485
- col.sql_type.must_equal 'time(7)'
486
- col.type.must_equal :time
487
- col.null.must_equal true
488
- col.default.must_equal Time.utc(1900, 01, 01, 04, 20, 00, Rational(288321500, 1000)), "Nanoseconds were <#{col.default.nsec}> vs <288321500>"
489
- col.default_function.must_be_nil
490
- type = connection.lookup_cast_type_from_column(col)
491
- type.must_be_instance_of Type::Time
492
- type.limit.must_be_nil
493
- type.precision.must_equal 7
494
- type.scale.must_be_nil
480
+ _(obj.smalldatetime).must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
481
+ end
482
+
483
+ it "time(7)" do
484
+ skip "time() not supported in this protocol version" unless connection_dblib_73?
485
+ col = column("time_7")
486
+ _(col.sql_type).must_equal "time(7)"
487
+ _(col.type).must_equal :time
488
+ _(col.null).must_equal true
489
+ _(col.default).must_equal Time.utc(1900, 01, 01, 04, 20, 00, Rational(288321500, 1000)), "Nanoseconds were <#{col.default.nsec}> vs <288321500>"
490
+ _(col.default_function).must_be_nil
491
+ type = connection.lookup_cast_type_from_column(col)
492
+ _(type).must_be_instance_of Type::Time
493
+ _(type.limit).must_be_nil
494
+ _(type.precision).must_equal 7
495
+ _(type.scale).must_be_nil
495
496
  # Time's #usec precision (low micro)
496
497
  obj.time_7 = Time.utc(2000, 01, 01, 15, 45, 00, 300)
497
- obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_7.usec}> vs <0>"
498
- obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_7.nsec}> vs <300>"
499
- obj.save! ; obj.reload
500
- obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_7.usec}> vs <0>"
501
- obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_7.nsec}> vs <300>"
498
+ _(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_7.usec}> vs <0>"
499
+ _(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_7.nsec}> vs <300>"
500
+ obj.save!; obj.reload
501
+ _(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_7.usec}> vs <0>"
502
+ _(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_7.nsec}> vs <300>"
502
503
  # Time's #usec precision (high micro)
503
504
  obj.time_7 = Time.utc(2000, 01, 01, 15, 45, 00, 234567)
504
- obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_7.usec}> vs <234567>"
505
- obj.save! ; obj.reload
506
- obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_7.usec}> vs <234567>"
505
+ _(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_7.usec}> vs <234567>"
506
+ obj.save!; obj.reload
507
+ _(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_7.usec}> vs <234567>"
507
508
  # Time's #usec precision (high nano rounded)
508
509
  obj.time_7 = Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321545, 1000))
509
- obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_7.nsec}> vs <288321500>"
510
- obj.save! ; obj.reload
511
- obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_7.nsec}> vs <288321500>"
512
- end
513
-
514
- it 'time(2)' do
515
- skip 'time() not supported in this protocal version' unless connection_dblib_73?
516
- col = column('time_2')
517
- col.sql_type.must_equal 'time(2)'
518
- col.type.must_equal :time
519
- col.null.must_equal true
520
- col.default.must_be_nil
521
- col.default_function.must_be_nil
522
- type = connection.lookup_cast_type_from_column(col)
523
- type.must_be_instance_of Type::Time
524
- type.limit.must_be_nil
525
- type.precision.must_equal 2
526
- type.scale.must_be_nil
510
+ _(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_7.nsec}> vs <288321500>"
511
+ obj.save!; obj.reload
512
+ _(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_7.nsec}> vs <288321500>"
513
+ end
514
+
515
+ it "time(2)" do
516
+ skip "time() not supported in this protocol version" unless connection_dblib_73?
517
+ col = column("time_2")
518
+ _(col.sql_type).must_equal "time(2)"
519
+ _(col.type).must_equal :time
520
+ _(col.null).must_equal true
521
+ _(col.default).must_be_nil
522
+ _(col.default_function).must_be_nil
523
+ type = connection.lookup_cast_type_from_column(col)
524
+ _(type).must_be_instance_of Type::Time
525
+ _(type.limit).must_be_nil
526
+ _(type.precision).must_equal 2
527
+ _(type.scale).must_be_nil
527
528
  # Always uses TinyTDS/Windows 2000-01-01 convention too.
528
529
  obj.time_2 = Time.utc(2015, 01, 10, 15, 45, 00, 0)
529
- obj.time_2.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0)
530
- obj.save! ; obj.reload
531
- obj.time_2.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0)
530
+ _(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0)
531
+ obj.save!; obj.reload
532
+ _(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0)
532
533
  # Time's #usec precision (barely in 2 precision equal to 0.03 seconds)
533
534
  obj.time_2 = Time.utc(2000, 01, 01, 15, 45, 00, 30000)
534
- obj.time_2.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 30000), "Microseconds were <#{obj.time_2.usec}> vs <30000>"
535
- obj.save! ; obj.reload
536
- obj.time_2.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 30000), "Microseconds were <#{obj.time_2.usec}> vs <30000>"
535
+ _(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 30000), "Microseconds were <#{obj.time_2.usec}> vs <30000>"
536
+ obj.save!; obj.reload
537
+ _(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 30000), "Microseconds were <#{obj.time_2.usec}> vs <30000>"
537
538
  # Time's #usec precision (below 2 precision)
538
539
  obj.time_2 = Time.utc(2000, 01, 01, 15, 45, 00, 4000)
539
- obj.time_2.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0), "Microseconds were <#{obj.time_2.usec}> vs <0>"
540
- obj.save! ; obj.reload
541
- obj.time_2.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0), "Microseconds were <#{obj.time_2.usec}> vs <0>"
540
+ _(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0), "Microseconds were <#{obj.time_2.usec}> vs <0>"
541
+ obj.save!; obj.reload
542
+ _(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0), "Microseconds were <#{obj.time_2.usec}> vs <0>"
543
+ end
544
+
545
+ it "time using default precision" do
546
+ skip "time() not supported in this protocol version" unless connection_dblib_73?
547
+ col = column("time_default")
548
+ _(col.sql_type).must_equal "time(7)"
549
+ _(col.type).must_equal :time
550
+ _(col.null).must_equal true
551
+ _(col.default).must_equal Time.utc(1900, 01, 01, 15, 03, 42, Rational(62197800, 1000)), "Nanoseconds were <#{col.default.nsec}> vs <62197800>"
552
+ _(col.default_function).must_be_nil
553
+ type = connection.lookup_cast_type_from_column(col)
554
+ _(type).must_be_instance_of Type::Time
555
+ _(type.limit).must_be_nil
556
+ _(type.precision).must_equal 7
557
+ _(type.scale).must_be_nil
558
+ # Time's #usec precision (low micro)
559
+ obj.time_default = Time.utc(2000, 01, 01, 15, 45, 00, 300)
560
+ _(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_default.usec}> vs <0>"
561
+ _(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_default.nsec}> vs <300>"
562
+ obj.save!; obj.reload
563
+ _(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_default.usec}> vs <0>"
564
+ _(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_default.nsec}> vs <300>"
565
+ # Time's #usec precision (high micro)
566
+ obj.time_default = Time.utc(2000, 01, 01, 15, 45, 00, 234567)
567
+ _(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_default.usec}> vs <234567>"
568
+ obj.save!; obj.reload
569
+ _(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_default.usec}> vs <234567>"
570
+ # Time's #usec precision (high nano rounded)
571
+ obj.time_default = Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321545, 1000))
572
+ _(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_default.nsec}> vs <288321500>"
573
+ obj.save!; obj.reload
574
+ _(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_default.nsec}> vs <288321500>"
542
575
  end
543
576
 
544
577
  # Character Strings
545
578
 
546
- it 'char(10)' do
547
- col = column('char_10')
548
- col.sql_type.must_equal 'char(10)'
549
- col.type.must_equal :char
550
- col.null.must_equal true
551
- col.default.must_equal '1234567890'
552
- obj.char_10.must_equal '1234567890'
553
- col.default_function.must_be_nil
554
- type = connection.lookup_cast_type_from_column(col)
555
- type.must_be_instance_of Type::Char
556
- type.limit.must_equal 10
557
- type.precision.must_be_nil
558
- type.scale.must_be_nil
579
+ it "char(10)" do
580
+ col = column("char_10")
581
+ _(col.sql_type).must_equal "char(10)"
582
+ _(col.type).must_equal :char
583
+ _(col.null).must_equal true
584
+ _(col.default).must_equal "1234567890"
585
+ _(obj.char_10).must_equal "1234567890"
586
+ _(col.default_function).must_be_nil
587
+ type = connection.lookup_cast_type_from_column(col)
588
+ _(type).must_be_instance_of Type::Char
589
+ _(type.limit).must_equal 10
590
+ _(type.precision).must_be_nil
591
+ _(type.scale).must_be_nil
559
592
  # Basic set and save.
560
- obj.char_10 = '012345'
561
- obj.char_10.strip.must_equal '012345'
593
+ obj.char_10 = "012345"
594
+ _(obj.char_10.strip).must_equal "012345"
562
595
  obj.save!
563
- obj.reload.char_10.strip.must_equal '012345'
596
+ _(obj.reload.char_10.strip).must_equal "012345"
564
597
  end
565
598
 
566
- it 'varchar(50)' do
567
- col = column('varchar_50')
568
- col.sql_type.must_equal 'varchar(50)'
569
- col.type.must_equal :varchar
570
- col.null.must_equal true
571
- col.default.must_equal 'test varchar_50'
572
- obj.varchar_50.must_equal 'test varchar_50'
573
- col.default_function.must_be_nil
599
+ it "varchar(50)" do
600
+ col = column("varchar_50")
601
+ _(col.sql_type).must_equal "varchar(50)"
602
+ _(col.type).must_equal :varchar
603
+ _(col.null).must_equal true
604
+ _(col.default).must_equal "test varchar_50"
605
+ _(obj.varchar_50).must_equal "test varchar_50"
606
+ _(col.default_function).must_be_nil
574
607
  type = connection.lookup_cast_type_from_column(col)
575
- type.must_be_instance_of Type::Varchar
576
- type.limit.must_equal 50
577
- type.precision.must_be_nil
578
- type.scale.must_be_nil
608
+ _(type).must_be_instance_of Type::Varchar
609
+ _(type.limit).must_equal 50
610
+ _(type.precision).must_be_nil
611
+ _(type.scale).must_be_nil
579
612
  # Basic set and save.
580
- assert_obj_set_and_save :varchar_50, 'Hello World'
581
- end
582
-
583
- it 'varchar(max)' do
584
- col = column('varchar_max')
585
- col.sql_type.must_equal 'varchar(max)'
586
- col.type.must_equal :varchar_max
587
- col.null.must_equal true
588
- col.default.must_equal 'test varchar_max'
589
- obj.varchar_max.must_equal 'test varchar_max'
590
- col.default_function.must_be_nil
591
- type = connection.lookup_cast_type_from_column(col)
592
- type.must_be_instance_of Type::VarcharMax
593
- type.limit.must_equal 2_147_483_647
594
- type.precision.must_be_nil
595
- type.scale.must_be_nil
613
+ assert_obj_set_and_save :varchar_50, "Hello World"
614
+ end
615
+
616
+ it "varchar(max)" do
617
+ col = column("varchar_max")
618
+ _(col.sql_type).must_equal "varchar(max)"
619
+ _(col.type).must_equal :varchar_max
620
+ _(col.null).must_equal true
621
+ _(col.default).must_equal "test varchar_max"
622
+ _(obj.varchar_max).must_equal "test varchar_max"
623
+ _(col.default_function).must_be_nil
624
+ type = connection.lookup_cast_type_from_column(col)
625
+ _(type).must_be_instance_of Type::VarcharMax
626
+ _(type.limit).must_equal 2_147_483_647
627
+ _(type.precision).must_be_nil
628
+ _(type.scale).must_be_nil
596
629
  # Basic set and save.
597
- assert_obj_set_and_save :varchar_max, 'Hello World'
598
- end
599
-
600
- it 'text' do
601
- col = column('text')
602
- col.sql_type.must_equal 'text'
603
- col.type.must_equal :text_basic
604
- col.null.must_equal true
605
- col.default.must_equal 'test text'
606
- obj.text.must_equal 'test text'
607
- col.default_function.must_be_nil
608
- type = connection.lookup_cast_type_from_column(col)
609
- type.must_be_instance_of Type::Text
610
- type.limit.must_equal 2_147_483_647
611
- type.precision.must_be_nil
612
- type.scale.must_be_nil
630
+ assert_obj_set_and_save :varchar_max, "Hello World"
631
+ end
632
+
633
+ it "text" do
634
+ col = column("text")
635
+ _(col.sql_type).must_equal "text"
636
+ _(col.type).must_equal :text_basic
637
+ _(col.null).must_equal true
638
+ _(col.default).must_equal "test text"
639
+ _(obj.text).must_equal "test text"
640
+ _(col.default_function).must_be_nil
641
+ type = connection.lookup_cast_type_from_column(col)
642
+ _(type).must_be_instance_of Type::Text
643
+ _(type.limit).must_equal 2_147_483_647
644
+ _(type.precision).must_be_nil
645
+ _(type.scale).must_be_nil
613
646
  # Basic set and save.
614
- assert_obj_set_and_save :text, 'Hello World'
647
+ assert_obj_set_and_save :text, "Hello World"
615
648
  end
616
649
 
617
650
  # Unicode Character Strings
618
651
 
619
- it 'nchar(10)' do
620
- col = column('nchar_10')
621
- col.sql_type.must_equal 'nchar(10)'
622
- col.type.must_equal :nchar
623
- col.null.must_equal true
624
- col.default.must_equal '12345678åå'
625
- obj.nchar_10.must_equal '12345678åå'
626
- col.default_function.must_be_nil
627
- type = connection.lookup_cast_type_from_column(col)
628
- type.must_be_instance_of Type::UnicodeChar
629
- type.limit.must_equal 10
630
- type.precision.must_be_nil
631
- type.scale.must_be_nil
652
+ it "nchar(10)" do
653
+ col = column("nchar_10")
654
+ _(col.sql_type).must_equal "nchar(10)"
655
+ _(col.type).must_equal :nchar
656
+ _(col.null).must_equal true
657
+ _(col.default).must_equal "12345678åå"
658
+ _(obj.nchar_10).must_equal "12345678åå"
659
+ _(col.default_function).must_be_nil
660
+ type = connection.lookup_cast_type_from_column(col)
661
+ _(type).must_be_instance_of Type::UnicodeChar
662
+ _(type.limit).must_equal 10
663
+ _(type.precision).must_be_nil
664
+ _(type.scale).must_be_nil
632
665
  # Basic set and save.
633
666
  obj.nchar_10 = "五六"
634
- obj.nchar_10.strip.must_equal "五六"
667
+ _(obj.nchar_10.strip).must_equal "五六"
635
668
  obj.save!
636
- obj.reload.nchar_10.strip.must_equal "五六"
669
+ _(obj.reload.nchar_10.strip).must_equal "五六"
637
670
  end
638
671
 
639
- it 'nvarchar(50)' do
640
- col = column('nvarchar_50')
641
- col.sql_type.must_equal 'nvarchar(50)'
642
- col.type.must_equal :string
643
- col.null.must_equal true
644
- col.default.must_equal 'test nvarchar_50 åå'
645
- obj.nvarchar_50.must_equal 'test nvarchar_50 åå'
646
- col.default_function.must_be_nil
672
+ it "nvarchar(50)" do
673
+ col = column("nvarchar_50")
674
+ _(col.sql_type).must_equal "nvarchar(50)"
675
+ _(col.type).must_equal :string
676
+ _(col.null).must_equal true
677
+ _(col.default).must_equal "test nvarchar_50 åå"
678
+ _(obj.nvarchar_50).must_equal "test nvarchar_50 åå"
679
+ _(col.default_function).must_be_nil
647
680
  type = connection.lookup_cast_type_from_column(col)
648
- type.must_be_instance_of Type::UnicodeVarchar
649
- type.limit.must_equal 50
650
- type.precision.must_be_nil
651
- type.scale.must_be_nil
681
+ _(type).must_be_instance_of Type::UnicodeVarchar
682
+ _(type.limit).must_equal 50
683
+ _(type.precision).must_be_nil
684
+ _(type.scale).must_be_nil
652
685
  # Basic set and save.
653
686
  assert_obj_set_and_save :nvarchar_50, "一二34五六"
654
687
  end
655
688
 
656
- it 'nvarchar(max)' do
657
- col = column('nvarchar_max')
658
- col.sql_type.must_equal 'nvarchar(max)'
659
- col.type.must_equal :text
660
- col.null.must_equal true
661
- col.default.must_equal 'test nvarchar_max åå'
662
- obj.nvarchar_max.must_equal 'test nvarchar_max åå'
663
- col.default_function.must_be_nil
689
+ it "nvarchar(max)" do
690
+ col = column("nvarchar_max")
691
+ _(col.sql_type).must_equal "nvarchar(max)"
692
+ _(col.type).must_equal :text
693
+ _(col.null).must_equal true
694
+ _(col.default).must_equal "test nvarchar_max åå"
695
+ _(obj.nvarchar_max).must_equal "test nvarchar_max åå"
696
+ _(col.default_function).must_be_nil
664
697
  type = connection.lookup_cast_type_from_column(col)
665
- type.must_be_instance_of Type::UnicodeVarcharMax
666
- type.limit.must_equal 2_147_483_647
667
- type.precision.must_be_nil
668
- type.scale.must_be_nil
698
+ _(type).must_be_instance_of Type::UnicodeVarcharMax
699
+ _(type.limit).must_equal 2_147_483_647
700
+ _(type.precision).must_be_nil
701
+ _(type.scale).must_be_nil
669
702
  # Basic set and save.
670
703
  assert_obj_set_and_save :nvarchar_max, "一二34五六"
671
704
  end
672
705
 
673
- it 'ntext' do
674
- col = column('ntext')
675
- col.sql_type.must_equal 'ntext'
676
- col.type.must_equal :ntext
677
- col.null.must_equal true
678
- col.default.must_equal 'test ntext åå'
679
- obj.ntext.must_equal 'test ntext åå'
680
- col.default_function.must_be_nil
706
+ it "ntext" do
707
+ col = column("ntext")
708
+ _(col.sql_type).must_equal "ntext"
709
+ _(col.type).must_equal :ntext
710
+ _(col.null).must_equal true
711
+ _(col.default).must_equal "test ntext åå"
712
+ _(obj.ntext).must_equal "test ntext åå"
713
+ _(col.default_function).must_be_nil
681
714
  type = connection.lookup_cast_type_from_column(col)
682
- type.must_be_instance_of Type::UnicodeText
683
- type.limit.must_equal 2_147_483_647
684
- type.precision.must_be_nil
685
- type.scale.must_be_nil
715
+ _(type).must_be_instance_of Type::UnicodeText
716
+ _(type.limit).must_equal 2_147_483_647
717
+ _(type.precision).must_be_nil
718
+ _(type.scale).must_be_nil
686
719
  # Basic set and save.
687
720
  assert_obj_set_and_save :ntext, "一二34五六"
688
721
  end
689
722
 
690
723
  # Binary Strings
691
724
 
692
- let(:binary_file) { File.join ARTest::SQLServer.test_root_sqlserver, 'fixtures', '1px.gif' }
693
- let(:binary_data) { File.open(binary_file, 'rb') { |f| f.read } }
694
-
695
- it 'binary(49)' do
696
- col = column('binary_49')
697
- col.sql_type.must_equal 'binary(49)'
698
- col.type.must_equal :binary_basic
699
- col.null.must_equal true
700
- col.default.must_be_nil
701
- col.default_function.must_be_nil
702
- type = connection.lookup_cast_type_from_column(col)
703
- type.must_be_instance_of Type::Binary
704
- type.limit.must_equal 49
705
- type.precision.must_be_nil
706
- type.scale.must_be_nil
725
+ let(:binary_file) { File.join ARTest::SQLServer.test_root_sqlserver, "fixtures", "1px.gif" }
726
+ let(:binary_data) { File.open(binary_file, "rb") { |f| f.read } }
727
+
728
+ it "binary(49)" do
729
+ col = column("binary_49")
730
+ _(col.sql_type).must_equal "binary(49)"
731
+ _(col.type).must_equal :binary_basic
732
+ _(col.null).must_equal true
733
+ _(col.default).must_be_nil
734
+ _(col.default_function).must_be_nil
735
+ type = connection.lookup_cast_type_from_column(col)
736
+ _(type).must_be_instance_of Type::Binary
737
+ _(type.limit).must_equal 49
738
+ _(type.precision).must_be_nil
739
+ _(type.scale).must_be_nil
707
740
  # Basic set and save.
708
- binary_data.encoding.must_equal Encoding::BINARY
709
- binary_data.length.must_equal 49
741
+ _(binary_data.encoding).must_equal Encoding::BINARY
742
+ _(binary_data.length).must_equal 49
710
743
  obj.binary_49 = binary_data
711
- obj.binary_49.must_equal binary_data
744
+ _(obj.binary_49).must_equal binary_data
712
745
  obj.save!
713
- obj.reload.binary_49.must_equal binary_data
746
+ _(obj.reload.binary_49).must_equal binary_data
714
747
  end
715
748
 
716
- it 'varbinary(49)' do
717
- col = column('varbinary_49')
718
- col.sql_type.must_equal 'varbinary(49)'
719
- col.type.must_equal :varbinary
720
- col.null.must_equal true
721
- col.default.must_be_nil
722
- col.default_function.must_be_nil
749
+ it "varbinary(49)" do
750
+ col = column("varbinary_49")
751
+ _(col.sql_type).must_equal "varbinary(49)"
752
+ _(col.type).must_equal :varbinary
753
+ _(col.null).must_equal true
754
+ _(col.default).must_be_nil
755
+ _(col.default_function).must_be_nil
723
756
  type = connection.lookup_cast_type_from_column(col)
724
- type.must_be_instance_of Type::Varbinary
725
- type.limit.must_equal 49
726
- type.precision.must_be_nil
727
- type.scale.must_be_nil
757
+ _(type).must_be_instance_of Type::Varbinary
758
+ _(type.limit).must_equal 49
759
+ _(type.precision).must_be_nil
760
+ _(type.scale).must_be_nil
728
761
  # Basic set and save.
729
- binary_data_20 = binary_data.to(20)
730
- binary_data_20.encoding.must_equal Encoding::BINARY
731
- obj.varbinary_49 = binary_data_20
732
- obj.varbinary_49.must_equal binary_data_20
733
- obj.save!
734
- obj.reload.varbinary_49.must_equal binary_data_20
735
- end
736
-
737
- it 'varbinary(max)' do
738
- col = column('varbinary_max')
739
- col.sql_type.must_equal 'varbinary(max)'
740
- col.type.must_equal :binary
741
- col.null.must_equal true
742
- col.default.must_be_nil
743
- col.default_function.must_be_nil
744
- type = connection.lookup_cast_type_from_column(col)
745
- type.must_be_instance_of Type::VarbinaryMax
746
- type.limit.must_equal 2_147_483_647
747
- type.precision.must_be_nil
748
- type.scale.must_be_nil
762
+ binary_data20 = binary_data.to(20)
763
+ _(binary_data20.encoding).must_equal Encoding::BINARY
764
+ obj.varbinary_49 = binary_data20
765
+ _(obj.varbinary_49).must_equal binary_data20
766
+ obj.save!
767
+ _(obj.reload.varbinary_49).must_equal binary_data20
768
+ end
769
+
770
+ it "varbinary(max)" do
771
+ col = column("varbinary_max")
772
+ _(col.sql_type).must_equal "varbinary(max)"
773
+ _(col.type).must_equal :binary
774
+ _(col.null).must_equal true
775
+ _(col.default).must_be_nil
776
+ _(col.default_function).must_be_nil
777
+ type = connection.lookup_cast_type_from_column(col)
778
+ _(type).must_be_instance_of Type::VarbinaryMax
779
+ _(type.limit).must_equal 2_147_483_647
780
+ _(type.precision).must_be_nil
781
+ _(type.scale).must_be_nil
749
782
  # Basic set and save.
750
- binary_data.encoding.must_equal Encoding::BINARY
783
+ _(binary_data.encoding).must_equal Encoding::BINARY
751
784
  assert_obj_set_and_save :varbinary_max, binary_data
752
785
  end
753
786
 
754
787
  # Other Data Types
755
788
 
756
- it 'uniqueidentifier' do
757
- col = column('uniqueidentifier')
758
- col.sql_type.must_equal 'uniqueidentifier'
759
- col.type.must_equal :uuid
760
- col.null.must_equal true
761
- col.default.must_be_nil
762
- col.default_function.must_equal 'newid()'
763
- type = connection.lookup_cast_type_from_column(col)
764
- type.must_be_instance_of Type::Uuid
765
- type.limit.must_be_nil
766
- type.precision.must_be_nil
767
- type.scale.must_be_nil
789
+ it "uniqueidentifier" do
790
+ col = column("uniqueidentifier")
791
+ _(col.sql_type).must_equal "uniqueidentifier"
792
+ _(col.type).must_equal :uuid
793
+ _(col.null).must_equal true
794
+ _(col.default).must_be_nil
795
+ _(col.default_function).must_equal "newid()"
796
+ type = connection.lookup_cast_type_from_column(col)
797
+ _(type).must_be_instance_of Type::Uuid
798
+ _(type.limit).must_be_nil
799
+ _(type.precision).must_be_nil
800
+ _(type.scale).must_be_nil
768
801
  # Basic set and save.
769
802
  obj.uniqueidentifier = "this will not qualify as valid"
770
- obj.uniqueidentifier.must_be_nil
771
- obj.save! ; obj.reload
772
- obj.uniqueidentifier.must_match Type::Uuid::ACCEPTABLE_UUID
803
+ _(obj.uniqueidentifier).must_be_nil
804
+ obj.save!; obj.reload
805
+ _(obj.uniqueidentifier).must_match Type::Uuid::ACCEPTABLE_UUID
773
806
  obj.uniqueidentifier = "6F9619FF-8B86-D011-B42D-00C04FC964FF"
774
- obj.uniqueidentifier.must_equal "6F9619FF-8B86-D011-B42D-00C04FC964FF"
775
- obj.save! ; obj.reload
776
- obj.uniqueidentifier.must_equal "6F9619FF-8B86-D011-B42D-00C04FC964FF"
777
- end
778
-
779
- it 'timestamp' do
780
- col = column('timestamp')
781
- col.sql_type.must_equal 'timestamp'
782
- col.type.must_equal :ss_timestamp
783
- col.null.must_equal true
784
- col.default.must_be_nil
785
- col.default_function.must_be_nil
786
- type = connection.lookup_cast_type_from_column(col)
787
- type.must_be_instance_of Type::Timestamp
788
- type.limit.must_be_nil
789
- type.precision.must_be_nil
790
- type.scale.must_be_nil
807
+ _(obj.uniqueidentifier).must_equal "6F9619FF-8B86-D011-B42D-00C04FC964FF"
808
+ obj.save!; obj.reload
809
+ _(obj.uniqueidentifier).must_equal "6F9619FF-8B86-D011-B42D-00C04FC964FF"
810
+ end
811
+
812
+ it "timestamp" do
813
+ col = column("timestamp")
814
+ _(col.sql_type).must_equal "timestamp"
815
+ _(col.type).must_equal :ss_timestamp
816
+ _(col.null).must_equal true
817
+ _(col.default).must_be_nil
818
+ _(col.default_function).must_be_nil
819
+ type = connection.lookup_cast_type_from_column(col)
820
+ _(type).must_be_instance_of Type::Timestamp
821
+ _(type.limit).must_be_nil
822
+ _(type.precision).must_be_nil
823
+ _(type.scale).must_be_nil
791
824
  # Basic read.
792
- obj.timestamp.must_be_nil
793
- obj.save! ; obj.reload
794
- obj.timestamp.must_match %r|\000|
825
+ _(obj.timestamp).must_be_nil
826
+ obj.save!; obj.reload
827
+ _(obj.timestamp).must_match %r|\000|
795
828
  obj.timestamp
796
829
  # Can set another attribute
797
830
  obj.uniqueidentifier = "6F9619FF-8B86-D011-B42D-00C04FC964FF"
798
831
  obj.save!
799
832
  end
800
833
 
801
- it 'does not mark object as changed after save' do
834
+ it "does not mark object as changed after save" do
802
835
  obj.save!
803
836
  obj.attributes
804
- obj.changed?.must_equal false
837
+ _(obj.changed?).must_equal false
805
838
  end
806
-
807
839
  end
808
-
809
840
  end