sequel 4.22.0 → 4.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +22 -0
  3. data/README.rdoc +6 -0
  4. data/Rakefile +59 -81
  5. data/doc/migration.rdoc +2 -0
  6. data/doc/release_notes/4.23.0.txt +65 -0
  7. data/doc/sharding.rdoc +16 -14
  8. data/doc/testing.rdoc +61 -77
  9. data/lib/sequel/adapters/jdbc.rb +1 -0
  10. data/lib/sequel/adapters/mock.rb +0 -1
  11. data/lib/sequel/adapters/postgres.rb +1 -0
  12. data/lib/sequel/adapters/postgresql.rb +1 -0
  13. data/lib/sequel/adapters/shared/postgres.rb +3 -3
  14. data/lib/sequel/connection_pool/sharded_threaded.rb +5 -0
  15. data/lib/sequel/connection_pool/threaded.rb +9 -1
  16. data/lib/sequel/database/connecting.rb +1 -1
  17. data/lib/sequel/database/transactions.rb +2 -1
  18. data/lib/sequel/dataset/prepared_statements.rb +1 -1
  19. data/lib/sequel/extensions/constraint_validations.rb +12 -12
  20. data/lib/sequel/extensions/date_arithmetic.rb +0 -4
  21. data/lib/sequel/extensions/pagination.rb +14 -2
  22. data/lib/sequel/extensions/pg_enum.rb +2 -2
  23. data/lib/sequel/extensions/pg_hstore.rb +1 -1
  24. data/lib/sequel/extensions/pg_json_ops.rb +2 -2
  25. data/lib/sequel/plugins/csv_serializer.rb +2 -0
  26. data/lib/sequel/plugins/delay_add_association.rb +50 -0
  27. data/lib/sequel/plugins/list.rb +2 -2
  28. data/lib/sequel/plugins/nested_attributes.rb +8 -28
  29. data/lib/sequel/plugins/update_refresh.rb +50 -0
  30. data/lib/sequel/plugins/validate_associated.rb +55 -0
  31. data/lib/sequel/version.rb +1 -1
  32. data/spec/adapters/db2_spec.rb +29 -29
  33. data/spec/adapters/firebird_spec.rb +97 -103
  34. data/spec/adapters/informix_spec.rb +25 -25
  35. data/spec/adapters/mssql_spec.rb +156 -172
  36. data/spec/adapters/mysql_spec.rb +334 -359
  37. data/spec/adapters/oracle_spec.rb +67 -69
  38. data/spec/adapters/postgres_spec.rb +1298 -1249
  39. data/spec/adapters/spec_helper.rb +2 -35
  40. data/spec/adapters/sqlanywhere_spec.rb +39 -39
  41. data/spec/adapters/sqlite_spec.rb +203 -200
  42. data/spec/bin_spec.rb +57 -59
  43. data/spec/core/connection_pool_spec.rb +402 -401
  44. data/spec/core/database_spec.rb +953 -944
  45. data/spec/core/dataset_spec.rb +2178 -2168
  46. data/spec/core/deprecated_spec.rb +19 -19
  47. data/spec/core/expression_filters_spec.rb +415 -415
  48. data/spec/core/mock_adapter_spec.rb +212 -212
  49. data/spec/core/object_graph_spec.rb +73 -73
  50. data/spec/core/placeholder_literalizer_spec.rb +71 -71
  51. data/spec/core/schema_generator_spec.rb +44 -44
  52. data/spec/core/schema_spec.rb +470 -472
  53. data/spec/core/spec_helper.rb +5 -20
  54. data/spec/core/version_spec.rb +2 -2
  55. data/spec/core_extensions_spec.rb +320 -320
  56. data/spec/extensions/accessed_columns_spec.rb +12 -12
  57. data/spec/extensions/active_model_spec.rb +3 -3
  58. data/spec/extensions/after_initialize_spec.rb +2 -2
  59. data/spec/extensions/arbitrary_servers_spec.rb +23 -23
  60. data/spec/extensions/association_dependencies_spec.rb +34 -34
  61. data/spec/extensions/association_pks_spec.rb +98 -98
  62. data/spec/extensions/association_proxies_spec.rb +33 -33
  63. data/spec/extensions/auto_validations_spec.rb +46 -46
  64. data/spec/extensions/blacklist_security_spec.rb +19 -18
  65. data/spec/extensions/blank_spec.rb +36 -36
  66. data/spec/extensions/boolean_readers_spec.rb +36 -36
  67. data/spec/extensions/caching_spec.rb +82 -82
  68. data/spec/extensions/class_table_inheritance_spec.rb +72 -72
  69. data/spec/extensions/column_conflicts_spec.rb +19 -14
  70. data/spec/extensions/column_select_spec.rb +19 -19
  71. data/spec/extensions/columns_introspection_spec.rb +43 -43
  72. data/spec/extensions/composition_spec.rb +64 -64
  73. data/spec/extensions/connection_validator_spec.rb +92 -90
  74. data/spec/extensions/constraint_validations_plugin_spec.rb +92 -92
  75. data/spec/extensions/constraint_validations_spec.rb +80 -80
  76. data/spec/extensions/core_refinements_spec.rb +220 -220
  77. data/spec/extensions/csv_serializer_spec.rb +44 -44
  78. data/spec/extensions/current_datetime_timestamp_spec.rb +8 -8
  79. data/spec/extensions/dataset_associations_spec.rb +65 -65
  80. data/spec/extensions/dataset_source_alias_spec.rb +16 -16
  81. data/spec/extensions/date_arithmetic_spec.rb +51 -58
  82. data/spec/extensions/defaults_setter_spec.rb +19 -19
  83. data/spec/extensions/delay_add_association_spec.rb +52 -0
  84. data/spec/extensions/dirty_spec.rb +51 -51
  85. data/spec/extensions/eager_each_spec.rb +8 -8
  86. data/spec/extensions/empty_array_ignore_nulls_spec.rb +10 -10
  87. data/spec/extensions/error_splitter_spec.rb +2 -2
  88. data/spec/extensions/error_sql_spec.rb +4 -4
  89. data/spec/extensions/eval_inspect_spec.rb +3 -3
  90. data/spec/extensions/filter_having_spec.rb +8 -8
  91. data/spec/extensions/force_encoding_spec.rb +30 -30
  92. data/spec/extensions/from_block_spec.rb +7 -7
  93. data/spec/extensions/graph_each_spec.rb +19 -19
  94. data/spec/extensions/hash_aliases_spec.rb +5 -5
  95. data/spec/extensions/hook_class_methods_spec.rb +100 -100
  96. data/spec/extensions/inflector_spec.rb +54 -54
  97. data/spec/extensions/input_transformer_spec.rb +10 -10
  98. data/spec/extensions/insert_returning_select_spec.rb +8 -8
  99. data/spec/extensions/instance_filters_spec.rb +26 -26
  100. data/spec/extensions/instance_hooks_spec.rb +85 -85
  101. data/spec/extensions/json_serializer_spec.rb +68 -68
  102. data/spec/extensions/lazy_attributes_spec.rb +49 -49
  103. data/spec/extensions/list_spec.rb +77 -75
  104. data/spec/extensions/looser_typecasting_spec.rb +16 -16
  105. data/spec/extensions/many_through_many_spec.rb +627 -627
  106. data/spec/extensions/meta_def_spec.rb +7 -7
  107. data/spec/extensions/migration_spec.rb +217 -217
  108. data/spec/extensions/modification_detection_spec.rb +20 -20
  109. data/spec/extensions/mssql_optimistic_locking_spec.rb +21 -21
  110. data/spec/extensions/named_timezones_spec.rb +18 -18
  111. data/spec/extensions/nested_attributes_spec.rb +107 -107
  112. data/spec/extensions/null_dataset_spec.rb +24 -24
  113. data/spec/extensions/optimistic_locking_spec.rb +21 -21
  114. data/spec/extensions/pagination_spec.rb +52 -52
  115. data/spec/extensions/pg_array_associations_spec.rb +273 -273
  116. data/spec/extensions/pg_array_ops_spec.rb +52 -52
  117. data/spec/extensions/pg_array_spec.rb +152 -152
  118. data/spec/extensions/pg_enum_spec.rb +13 -13
  119. data/spec/extensions/pg_hstore_ops_spec.rb +63 -63
  120. data/spec/extensions/pg_hstore_spec.rb +84 -84
  121. data/spec/extensions/pg_inet_spec.rb +15 -15
  122. data/spec/extensions/pg_interval_spec.rb +29 -29
  123. data/spec/extensions/pg_json_ops_spec.rb +86 -84
  124. data/spec/extensions/pg_json_spec.rb +104 -104
  125. data/spec/extensions/pg_loose_count_spec.rb +6 -6
  126. data/spec/extensions/pg_range_ops_spec.rb +24 -24
  127. data/spec/extensions/pg_range_spec.rb +143 -143
  128. data/spec/extensions/pg_row_ops_spec.rb +14 -14
  129. data/spec/extensions/pg_row_plugin_spec.rb +12 -12
  130. data/spec/extensions/pg_row_spec.rb +118 -118
  131. data/spec/extensions/pg_static_cache_updater_spec.rb +28 -28
  132. data/spec/extensions/pg_typecast_on_load_spec.rb +21 -21
  133. data/spec/extensions/prepared_statements_associations_spec.rb +42 -42
  134. data/spec/extensions/prepared_statements_safe_spec.rb +18 -18
  135. data/spec/extensions/prepared_statements_spec.rb +28 -28
  136. data/spec/extensions/prepared_statements_with_pk_spec.rb +11 -11
  137. data/spec/extensions/pretty_table_spec.rb +16 -16
  138. data/spec/extensions/query_literals_spec.rb +37 -37
  139. data/spec/extensions/query_spec.rb +32 -32
  140. data/spec/extensions/rcte_tree_spec.rb +141 -141
  141. data/spec/extensions/round_timestamps_spec.rb +21 -21
  142. data/spec/extensions/schema_caching_spec.rb +8 -8
  143. data/spec/extensions/schema_dumper_spec.rb +78 -78
  144. data/spec/extensions/schema_spec.rb +31 -27
  145. data/spec/extensions/scissors_spec.rb +3 -3
  146. data/spec/extensions/select_remove_spec.rb +14 -14
  147. data/spec/extensions/sequel_3_dataset_methods_spec.rb +28 -28
  148. data/spec/extensions/serialization_modification_detection_spec.rb +33 -33
  149. data/spec/extensions/serialization_spec.rb +79 -78
  150. data/spec/extensions/server_block_spec.rb +17 -17
  151. data/spec/extensions/set_overrides_spec.rb +30 -30
  152. data/spec/extensions/sharding_spec.rb +65 -65
  153. data/spec/extensions/shared_caching_spec.rb +29 -29
  154. data/spec/extensions/single_table_inheritance_spec.rb +79 -79
  155. data/spec/extensions/skip_create_refresh_spec.rb +3 -3
  156. data/spec/extensions/spec_helper.rb +4 -29
  157. data/spec/extensions/split_array_nil_spec.rb +9 -9
  158. data/spec/extensions/split_values_spec.rb +7 -7
  159. data/spec/extensions/sql_expr_spec.rb +32 -32
  160. data/spec/extensions/static_cache_spec.rb +123 -123
  161. data/spec/extensions/string_date_time_spec.rb +34 -34
  162. data/spec/extensions/string_stripper_spec.rb +15 -15
  163. data/spec/extensions/subclasses_spec.rb +31 -31
  164. data/spec/extensions/table_select_spec.rb +15 -15
  165. data/spec/extensions/tactical_eager_loading_spec.rb +23 -23
  166. data/spec/extensions/thread_local_timezones_spec.rb +13 -13
  167. data/spec/extensions/timestamps_spec.rb +40 -40
  168. data/spec/extensions/to_dot_spec.rb +34 -34
  169. data/spec/extensions/touch_spec.rb +52 -52
  170. data/spec/extensions/tree_spec.rb +72 -72
  171. data/spec/extensions/typecast_on_load_spec.rb +25 -25
  172. data/spec/extensions/unlimited_update_spec.rb +2 -2
  173. data/spec/extensions/update_or_create_spec.rb +36 -36
  174. data/spec/extensions/update_primary_key_spec.rb +35 -35
  175. data/spec/extensions/update_refresh_spec.rb +41 -0
  176. data/spec/extensions/validate_associated_spec.rb +52 -0
  177. data/spec/extensions/validation_class_methods_spec.rb +314 -317
  178. data/spec/extensions/validation_helpers_spec.rb +195 -195
  179. data/spec/extensions/xml_serializer_spec.rb +48 -48
  180. data/spec/guards_helper.rb +55 -0
  181. data/spec/integration/associations_test.rb +1089 -1088
  182. data/spec/integration/database_test.rb +29 -29
  183. data/spec/integration/dataset_test.rb +661 -661
  184. data/spec/integration/eager_loader_test.rb +147 -147
  185. data/spec/integration/migrator_test.rb +122 -122
  186. data/spec/integration/model_test.rb +70 -70
  187. data/spec/integration/plugin_test.rb +682 -640
  188. data/spec/integration/prepared_statement_test.rb +172 -172
  189. data/spec/integration/schema_test.rb +245 -245
  190. data/spec/integration/spec_helper.rb +1 -64
  191. data/spec/integration/timezone_test.rb +17 -17
  192. data/spec/integration/transaction_test.rb +87 -87
  193. data/spec/integration/type_test.rb +33 -33
  194. data/spec/model/association_reflection_spec.rb +130 -121
  195. data/spec/model/associations_spec.rb +1112 -1113
  196. data/spec/model/base_spec.rb +197 -196
  197. data/spec/model/class_dataset_methods_spec.rb +118 -118
  198. data/spec/model/dataset_methods_spec.rb +49 -49
  199. data/spec/model/eager_loading_spec.rb +705 -702
  200. data/spec/model/hooks_spec.rb +169 -168
  201. data/spec/model/inflector_spec.rb +5 -5
  202. data/spec/model/model_spec.rb +287 -297
  203. data/spec/model/plugins_spec.rb +47 -47
  204. data/spec/model/record_spec.rb +534 -535
  205. data/spec/model/spec_helper.rb +3 -21
  206. data/spec/model/validations_spec.rb +72 -70
  207. data/spec/spec_config.rb +8 -0
  208. metadata +41 -9
  209. data/lib/sequel/adapters/fdbsql.rb +0 -286
  210. data/lib/sequel/adapters/jdbc/fdbsql.rb +0 -66
  211. data/lib/sequel/adapters/openbase.rb +0 -54
  212. data/lib/sequel/adapters/shared/fdbsql.rb +0 -550
  213. data/spec/adapters/fdbsql_spec.rb +0 -429
  214. data/spec/rspec_helper.rb +0 -22
@@ -5,28 +5,28 @@ describe Sequel::Database do
5
5
  @db = DB
6
6
  end
7
7
 
8
- specify "should provide disconnect functionality" do
8
+ it "should provide disconnect functionality" do
9
9
  @db.disconnect
10
- @db.pool.size.should == 0
10
+ @db.pool.size.must_equal 0
11
11
  @db.test_connection
12
- @db.pool.size.should == 1
12
+ @db.pool.size.must_equal 1
13
13
  end
14
14
 
15
- specify "should provide disconnect functionality after preparing a statement" do
15
+ it "should provide disconnect functionality after preparing a statement" do
16
16
  @db.create_table!(:items){Integer :i}
17
17
  @db[:items].prepare(:first, :a).call
18
18
  @db.disconnect
19
- @db.pool.size.should == 0
19
+ @db.pool.size.must_equal 0
20
20
  @db.drop_table?(:items)
21
21
  end
22
22
 
23
- specify "should raise Sequel::DatabaseError on invalid SQL" do
24
- proc{@db << "S"}.should raise_error(Sequel::DatabaseError)
23
+ it "should raise Sequel::DatabaseError on invalid SQL" do
24
+ proc{@db << "S"}.must_raise(Sequel::DatabaseError)
25
25
  end
26
26
 
27
- specify "should have Sequel::DatabaseError#sql give the SQL causing the error" do
27
+ it "should have Sequel::DatabaseError#sql give the SQL causing the error" do
28
28
  (@db << "SELECT") rescue (e = $!)
29
- e.sql.should == "SELECT"
29
+ e.sql.must_equal "SELECT"
30
30
  end if ENV['SEQUEL_ERROR_SQL']
31
31
 
32
32
  describe "constraint violations" do
@@ -40,64 +40,64 @@ describe Sequel::Database do
40
40
  cspecify "should raise Sequel::UniqueConstraintViolation when a unique constraint is violated", [:jdbc, :sqlite], [:db2] do
41
41
  @db.create_table!(:test){String :a, :unique=>true, :null=>false}
42
42
  @db[:test].insert('1')
43
- proc{@db[:test].insert('1')}.should raise_error(Sequel::UniqueConstraintViolation)
43
+ proc{@db[:test].insert('1')}.must_raise(Sequel::UniqueConstraintViolation)
44
44
  @db[:test].insert('2')
45
- proc{@db[:test].update(:a=>'1')}.should raise_error(Sequel::UniqueConstraintViolation)
45
+ proc{@db[:test].update(:a=>'1')}.must_raise(Sequel::UniqueConstraintViolation)
46
46
  end
47
47
 
48
48
  cspecify "should raise Sequel::UniqueConstraintViolation when a unique constraint is violated for composite primary keys", [:jdbc, :sqlite], [:db2] do
49
49
  @db.create_table!(:test){String :a; String :b; primary_key [:a, :b]}
50
50
  @db[:test].insert(:a=>'1', :b=>'2')
51
- proc{@db[:test].insert(:a=>'1', :b=>'2')}.should raise_error(Sequel::UniqueConstraintViolation)
51
+ proc{@db[:test].insert(:a=>'1', :b=>'2')}.must_raise(Sequel::UniqueConstraintViolation)
52
52
  @db[:test].insert(:a=>'3', :b=>'4')
53
- proc{@db[:test].update(:a=>'1', :b=>'2')}.should raise_error(Sequel::UniqueConstraintViolation)
53
+ proc{@db[:test].update(:a=>'1', :b=>'2')}.must_raise(Sequel::UniqueConstraintViolation)
54
54
  end
55
55
 
56
- cspecify "should raise Sequel::CheckConstraintViolation when a check constraint is violated", :mysql, [:db2], [proc{|db| db.sqlite_version < 30802}, :sqlite], :fdbsql do
56
+ cspecify "should raise Sequel::CheckConstraintViolation when a check constraint is violated", :mysql, [:db2], [proc{|db| db.sqlite_version < 30802}, :sqlite] do
57
57
  @db.create_table!(:test){String :a; check Sequel.~(:a=>'1')}
58
- proc{@db[:test].insert('1')}.should raise_error(Sequel::CheckConstraintViolation)
58
+ proc{@db[:test].insert('1')}.must_raise(Sequel::CheckConstraintViolation)
59
59
  @db[:test].insert('2')
60
- proc{@db[:test].insert('1')}.should raise_error(Sequel::CheckConstraintViolation)
60
+ proc{@db[:test].insert('1')}.must_raise(Sequel::CheckConstraintViolation)
61
61
  end
62
62
 
63
63
  cspecify "should raise Sequel::ForeignKeyConstraintViolation when a foreign key constraint is violated", [:jdbc, :sqlite], [:db2] do
64
64
  @db.create_table!(:test, :engine=>:InnoDB){primary_key :id}
65
65
  @db.create_table!(:test2, :engine=>:InnoDB){foreign_key :tid, :test}
66
- proc{@db[:test2].insert(:tid=>1)}.should raise_error(Sequel::ForeignKeyConstraintViolation)
66
+ proc{@db[:test2].insert(:tid=>1)}.must_raise(Sequel::ForeignKeyConstraintViolation)
67
67
  @db[:test].insert
68
68
  @db[:test2].insert(:tid=>1)
69
- proc{@db[:test2].where(:tid=>1).update(:tid=>3)}.should raise_error(Sequel::ForeignKeyConstraintViolation)
70
- proc{@db[:test].where(:id=>1).delete}.should raise_error(Sequel::ForeignKeyConstraintViolation)
69
+ proc{@db[:test2].where(:tid=>1).update(:tid=>3)}.must_raise(Sequel::ForeignKeyConstraintViolation)
70
+ proc{@db[:test].where(:id=>1).delete}.must_raise(Sequel::ForeignKeyConstraintViolation)
71
71
  end
72
72
 
73
73
  cspecify "should raise Sequel::NotNullConstraintViolation when a not null constraint is violated", [:jdbc, :sqlite], [:db2] do
74
74
  @db.create_table!(:test){Integer :a, :null=>false}
75
- proc{@db[:test].insert(:a=>nil)}.should raise_error(Sequel::NotNullConstraintViolation)
75
+ proc{@db[:test].insert(:a=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
76
76
  unless @db.database_type == :mysql
77
77
  # Broken mysql silently changes NULL here to 0, and doesn't raise an exception.
78
78
  @db[:test].insert(2)
79
- proc{@db[:test].update(:a=>nil)}.should raise_error(Sequel::NotNullConstraintViolation)
79
+ proc{@db[:test].update(:a=>nil)}.must_raise(Sequel::NotNullConstraintViolation)
80
80
  end
81
81
  end
82
82
  end
83
83
 
84
- specify "should store underlying wrapped exception in Sequel::DatabaseError" do
84
+ it "should store underlying wrapped exception in Sequel::DatabaseError" do
85
85
  begin
86
86
  @db << "SELECT"
87
87
  rescue Sequel::DatabaseError=>e
88
88
  if defined?(Java::JavaLang::Exception)
89
- (e.wrapped_exception.is_a?(Exception) || e.wrapped_exception.is_a?(Java::JavaLang::Exception)).should == true
89
+ (e.wrapped_exception.is_a?(Exception) || e.wrapped_exception.is_a?(Java::JavaLang::Exception)).must_equal true
90
90
  else
91
- e.wrapped_exception.should be_a_kind_of(Exception)
91
+ e.wrapped_exception.must_be_kind_of(Exception)
92
92
  end
93
93
  end
94
94
  end
95
95
 
96
- specify "should not have the connection pool swallow non-StandardError based exceptions" do
97
- proc{@db.pool.hold{raise Interrupt, "test"}}.should raise_error(Interrupt)
96
+ it "should not have the connection pool swallow non-StandardError based exceptions" do
97
+ proc{@db.pool.hold{raise Interrupt, "test"}}.must_raise(Interrupt)
98
98
  end
99
99
 
100
- specify "should be able to disconnect connections more than once without exceptions" do
100
+ it "should be able to disconnect connections more than once without exceptions" do
101
101
  conn = @db.synchronize{|c| c}
102
102
  @db.disconnect
103
103
  @db.disconnect_connection(conn)
@@ -106,8 +106,8 @@ describe Sequel::Database do
106
106
 
107
107
  cspecify "should provide ability to check connections for validity", [:do, :postgres] do
108
108
  conn = @db.synchronize{|c| c}
109
- @db.valid_connection?(conn).should == true
109
+ @db.valid_connection?(conn).must_equal true
110
110
  @db.disconnect
111
- @db.valid_connection?(conn).should == false
111
+ @db.valid_connection?(conn).must_equal false
112
112
  end
113
113
  end
@@ -14,69 +14,69 @@ describe "Simple Dataset operations" do
14
14
  @db.drop_table?(:items)
15
15
  end
16
16
 
17
- specify "should support sequential primary keys" do
17
+ it "should support sequential primary keys" do
18
18
  @ds << {:number=>20}
19
19
  @ds << {:number=>30}
20
- @ds.order(:number).all.should == [
20
+ @ds.order(:number).all.must_equal [
21
21
  {:id => 1, :number=>10},
22
22
  {:id => 2, :number=>20},
23
23
  {:id => 3, :number=>30} ]
24
24
  end
25
25
 
26
- specify "should support sequential primary keys with a Bignum" do
26
+ it "should support sequential primary keys with a Bignum" do
27
27
  @db.create_table!(:items) do
28
28
  primary_key :id, :type=>Bignum
29
29
  Integer :number
30
30
  end
31
31
  @ds << {:number=>20}
32
32
  @ds << {:number=>30}
33
- @ds.order(:number).all.should == [{:id => 1, :number=>20}, {:id => 2, :number=>30}]
33
+ @ds.order(:number).all.must_equal [{:id => 1, :number=>20}, {:id => 2, :number=>30}]
34
34
  end
35
35
 
36
36
  cspecify "should insert with a primary key specified", :db2, :mssql do
37
37
  @ds.insert(:id=>100, :number=>20)
38
- @ds.count.should == 2
39
- @ds.order(:id).all.should == [{:id=>1, :number=>10}, {:id=>100, :number=>20}]
38
+ @ds.count.must_equal 2
39
+ @ds.order(:id).all.must_equal [{:id=>1, :number=>10}, {:id=>100, :number=>20}]
40
40
  end
41
41
 
42
- specify "should have insert return primary key value" do
43
- @ds.insert(:number=>20).should == 2
44
- @ds.filter(:id=>2).first[:number].should == 20
42
+ it "should have insert return primary key value" do
43
+ @ds.insert(:number=>20).must_equal 2
44
+ @ds.filter(:id=>2).first[:number].must_equal 20
45
45
  end
46
46
 
47
- specify "should have insert work correctly with static SQL" do
47
+ it "should have insert work correctly with static SQL" do
48
48
  @db["INSERT INTO #{@ds.literal(:items)} (#{@ds.literal(:number)}) VALUES (20)"].insert
49
- @ds.filter(:id=>2).first[:number].should == 20
49
+ @ds.filter(:id=>2).first[:number].must_equal 20
50
50
  end
51
51
 
52
- specify "should have insert_multiple return primary key values" do
53
- @ds.extension(:sequel_3_dataset_methods).insert_multiple([{:number=>20}, {:number=>30}]).should == [2, 3]
54
- @ds.filter(:id=>2).get(:number).should == 20
55
- @ds.filter(:id=>3).get(:number).should == 30
52
+ it "should have insert_multiple return primary key values" do
53
+ @ds.extension(:sequel_3_dataset_methods).insert_multiple([{:number=>20}, {:number=>30}]).must_equal [2, 3]
54
+ @ds.filter(:id=>2).get(:number).must_equal 20
55
+ @ds.filter(:id=>3).get(:number).must_equal 30
56
56
  end
57
57
 
58
- specify "should join correctly" do
59
- @ds.join(:items___b, :id=>:id).select_all(:items).all.should == [{:id=>1, :number=>10}]
58
+ it "should join correctly" do
59
+ @ds.join(:items___b, :id=>:id).select_all(:items).all.must_equal [{:id=>1, :number=>10}]
60
60
  end
61
61
 
62
- specify "should handle LATERAL subqueries correctly" do
62
+ it "should handle LATERAL subqueries correctly" do
63
63
  @ds << {:number=>20}
64
- @ds.from(:items___i, @ds.where(:items__number=>:i__number).lateral).select_order_map([:i__number___n, :t1__number]).should == [[10, 10], [20, 20]]
65
- @ds.from(:items___i).cross_join(@ds.where(:items__number=>:i__number).lateral).select_order_map([:i__number___n, :t1__number]).should == [[10, 10], [20, 20]]
66
- @ds.from(:items___i).join(@ds.where(:items__number=>:i__number).lateral, 1=>1).select_order_map([:i__number___n, :t1__number]).should == [[10, 10], [20, 20]]
67
- @ds.from(:items___i).join(@ds.where(:items__number=>:i__number).lateral, 1=>0).select_order_map([:i__number___n, :t1__number]).should == []
68
- @ds.from(:items___i).left_join(@ds.from(:items___i2).where(:i2__number=>:i__number).lateral, 1=>1).select_order_map([:i__number___n, :t1__number]).should == [[10, 10], [20, 20]]
69
- @ds.from(:items___i).left_join(@ds.from(:items___i2).where(:i2__number=>:i__number).lateral, 1=>0).select_order_map([:i__number___n, :t1__number]).should == [[10, nil], [20, nil]]
64
+ @ds.from(:items___i, @ds.where(:items__number=>:i__number).lateral).select_order_map([:i__number___n, :t1__number]).must_equal [[10, 10], [20, 20]]
65
+ @ds.from(:items___i).cross_join(@ds.where(:items__number=>:i__number).lateral).select_order_map([:i__number___n, :t1__number]).must_equal [[10, 10], [20, 20]]
66
+ @ds.from(:items___i).join(@ds.where(:items__number=>:i__number).lateral, 1=>1).select_order_map([:i__number___n, :t1__number]).must_equal [[10, 10], [20, 20]]
67
+ @ds.from(:items___i).join(@ds.where(:items__number=>:i__number).lateral, 1=>0).select_order_map([:i__number___n, :t1__number]).must_equal []
68
+ @ds.from(:items___i).left_join(@ds.from(:items___i2).where(:i2__number=>:i__number).lateral, 1=>1).select_order_map([:i__number___n, :t1__number]).must_equal [[10, 10], [20, 20]]
69
+ @ds.from(:items___i).left_join(@ds.from(:items___i2).where(:i2__number=>:i__number).lateral, 1=>0).select_order_map([:i__number___n, :t1__number]).must_equal [[10, nil], [20, nil]]
70
70
  end if DB.dataset.supports_lateral_subqueries?
71
71
 
72
- specify "should correctly deal with qualified columns and subselects" do
73
- @ds.from_self(:alias=>:a).select(:a__id, Sequel.qualify(:a, :number)).all.should == [{:id=>1, :number=>10}]
74
- @ds.join(@ds.as(:a), :id=>:id).select(:a__id, Sequel.qualify(:a, :number)).all.should == [{:id=>1, :number=>10}]
72
+ it "should correctly deal with qualified columns and subselects" do
73
+ @ds.from_self(:alias=>:a).select(:a__id, Sequel.qualify(:a, :number)).all.must_equal [{:id=>1, :number=>10}]
74
+ @ds.join(@ds.as(:a), :id=>:id).select(:a__id, Sequel.qualify(:a, :number)).all.must_equal [{:id=>1, :number=>10}]
75
75
  end
76
76
 
77
- specify "should graph correctly" do
77
+ it "should graph correctly" do
78
78
  a = [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
79
- pr = proc{|t| @ds.graph(t, {:id=>:id}, :table_alias=>:b).extension(:graph_each).all.should == a}
79
+ pr = proc{|t| @ds.graph(t, {:id=>:id}, :table_alias=>:b).extension(:graph_each).all.must_equal a}
80
80
  pr[:items]
81
81
  pr[:items___foo]
82
82
  pr[Sequel.identifier(:items)]
@@ -85,8 +85,8 @@ describe "Simple Dataset operations" do
85
85
  pr[Sequel.as(Sequel.identifier('items'), 'foo')]
86
86
  end
87
87
 
88
- specify "should graph correctly with a subselect" do
89
- @ds.from_self(:alias=>:items).graph(@ds.from_self, {:id=>:id}, :table_alias=>:b).extension(:graph_each).all.should == [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
88
+ it "should graph correctly with a subselect" do
89
+ @ds.from_self(:alias=>:items).graph(@ds.from_self, {:id=>:id}, :table_alias=>:b).extension(:graph_each).all.must_equal [{:items=>{:id=>1, :number=>10}, :b=>{:id=>1, :number=>10}}]
90
90
  end
91
91
 
92
92
  cspecify "should have insert work correctly when inserting a row with all NULL values", :hsqldb do
@@ -94,214 +94,214 @@ describe "Simple Dataset operations" do
94
94
  String :name
95
95
  Integer :number
96
96
  end
97
- proc{@ds.insert}.should_not raise_error
98
- @ds.all.should == [{:name=>nil, :number=>nil}]
97
+ @ds.insert
98
+ @ds.all.must_equal [{:name=>nil, :number=>nil}]
99
99
  end
100
100
 
101
- specify "should delete correctly" do
102
- @ds.filter(1=>1).delete.should == 1
103
- @ds.count.should == 0
101
+ it "should delete correctly" do
102
+ @ds.filter(1=>1).delete.must_equal 1
103
+ @ds.count.must_equal 0
104
104
  end
105
105
 
106
- specify "should update correctly" do
107
- @ds.update(:number=>Sequel.expr(:number)+1).should == 1
108
- @ds.all.should == [{:id=>1, :number=>11}]
106
+ it "should update correctly" do
107
+ @ds.update(:number=>Sequel.expr(:number)+1).must_equal 1
108
+ @ds.all.must_equal [{:id=>1, :number=>11}]
109
109
  end
110
110
 
111
111
  cspecify "should have update return the number of matched rows", [:do, :mysql], [:ado] do
112
- @ds.update(:number=>:number).should == 1
113
- @ds.filter(:id=>1).update(:number=>:number).should == 1
114
- @ds.filter(:id=>2).update(:number=>:number).should == 0
115
- @ds.all.should == [{:id=>1, :number=>10}]
112
+ @ds.update(:number=>:number).must_equal 1
113
+ @ds.filter(:id=>1).update(:number=>:number).must_equal 1
114
+ @ds.filter(:id=>2).update(:number=>:number).must_equal 0
115
+ @ds.all.must_equal [{:id=>1, :number=>10}]
116
116
  end
117
117
 
118
- specify "should iterate over records as they come in" do
118
+ it "should iterate over records as they come in" do
119
119
  called = false
120
- @ds.each{|row| called = true; row.should == {:id=>1, :number=>10}}
121
- called.should == true
120
+ @ds.each{|row| called = true; row.must_equal(:id=>1, :number=>10)}
121
+ called.must_equal true
122
122
  end
123
123
 
124
- specify "should support iterating over large numbers of records with paged_each" do
124
+ it "should support iterating over large numbers of records with paged_each" do
125
125
  (2..100).each{|i| @ds.insert(:number=>i*10)}
126
126
 
127
127
  [:offset, :filter].each do |strategy|
128
128
  rows = []
129
129
  @ds.order(:number).paged_each(:rows_per_fetch=>5, :strategy=>strategy){|row| rows << row}
130
- rows.should == (1..100).map{|i| {:id=>i, :number=>i*10}}
130
+ rows.must_equal((1..100).map{|i| {:id=>i, :number=>i*10}})
131
131
 
132
132
  rows = []
133
133
  @ds.order(:number).paged_each(:rows_per_fetch=>3, :strategy=>strategy){|row| rows << row}
134
- rows.should == (1..100).map{|i| {:id=>i, :number=>i*10}}
134
+ rows.must_equal((1..100).map{|i| {:id=>i, :number=>i*10}})
135
135
 
136
136
  rows = []
137
137
  @ds.order(:number, :id).paged_each(:rows_per_fetch=>5, :strategy=>strategy){|row| rows << row}
138
- rows.should == (1..100).map{|i| {:id=>i, :number=>i*10}}
138
+ rows.must_equal((1..100).map{|i| {:id=>i, :number=>i*10}})
139
139
 
140
140
  rows = []
141
141
  @ds.reverse_order(:number).paged_each(:rows_per_fetch=>5, :strategy=>strategy){|row| rows << row}
142
- rows.should == (1..100).map{|i| {:id=>i, :number=>i*10}}.reverse
142
+ rows.must_equal((1..100).map{|i| {:id=>i, :number=>i*10}}.reverse)
143
143
 
144
144
  rows = []
145
145
  @ds.order(Sequel.desc(:number), :id).paged_each(:rows_per_fetch=>5, :strategy=>strategy){|row| rows << row}
146
- rows.should == (1..100).map{|i| {:id=>i, :number=>i*10}}.reverse
146
+ rows.must_equal((1..100).map{|i| {:id=>i, :number=>i*10}}.reverse)
147
147
  end
148
148
 
149
149
  rows = []
150
150
  @ds.order(:number).limit(50, 25).paged_each(:rows_per_fetch=>3){|row| rows << row}
151
- rows.should == (26..75).map{|i| {:id=>i, :number=>i*10}}
151
+ rows.must_equal((26..75).map{|i| {:id=>i, :number=>i*10}})
152
152
 
153
153
  rows = []
154
154
  @ds.order(Sequel.*(:number, 2)).paged_each(:rows_per_fetch=>5){|row| rows << row}
155
- rows.should == (1..100).map{|i| {:id=>i, :number=>i*10}}
155
+ rows.must_equal((1..100).map{|i| {:id=>i, :number=>i*10}})
156
156
 
157
157
  rows = []
158
158
  @ds.order(Sequel.*(:number, 2)).paged_each(:rows_per_fetch=>5, :strategy=>:filter, :filter_values=>proc{|row, _| [row[:number] * 2]}){|row| rows << row}
159
- rows.should == (1..100).map{|i| {:id=>i, :number=>i*10}}
159
+ rows.must_equal((1..100).map{|i| {:id=>i, :number=>i*10}})
160
160
 
161
161
  if DB.adapter_scheme == :jdbc
162
162
  # check retrival with varying fetch sizes
163
163
  array = (1..100).to_a
164
164
  [1, 2, 5, 10, 33, 50, 100, 1000].each do |i|
165
- @ds.with_fetch_size(i).select_order_map(:id).should == array
165
+ @ds.with_fetch_size(i).select_order_map(:id).must_equal array
166
166
  end
167
167
  end
168
168
  end
169
169
 
170
- specify "should fetch all results correctly" do
171
- @ds.all.should == [{:id=>1, :number=>10}]
170
+ it "should fetch all results correctly" do
171
+ @ds.all.must_equal [{:id=>1, :number=>10}]
172
172
  end
173
173
 
174
- specify "should fetch a single row correctly" do
175
- @ds.first.should == {:id=>1, :number=>10}
174
+ it "should fetch a single row correctly" do
175
+ @ds.first.must_equal(:id=>1, :number=>10)
176
176
  end
177
177
 
178
- specify "should have distinct work with limit" do
179
- @ds.limit(1).distinct.all.should == [{:id=>1, :number=>10}]
178
+ it "should have distinct work with limit" do
179
+ @ds.limit(1).distinct.all.must_equal [{:id=>1, :number=>10}]
180
180
  end
181
181
 
182
- specify "should fetch correctly with a limit" do
183
- @ds.order(:id).limit(2).all.should == [{:id=>1, :number=>10}]
182
+ it "should fetch correctly with a limit" do
183
+ @ds.order(:id).limit(2).all.must_equal [{:id=>1, :number=>10}]
184
184
  @ds.insert(:number=>20)
185
- @ds.order(:id).limit(1).all.should == [{:id=>1, :number=>10}]
186
- @ds.order(:id).limit(2).all.should == [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
185
+ @ds.order(:id).limit(1).all.must_equal [{:id=>1, :number=>10}]
186
+ @ds.order(:id).limit(2).all.must_equal [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
187
187
  end
188
188
 
189
- specify "should fetch correctly with a limit and offset" do
190
- @ds.order(:id).limit(2, 0).all.should == [{:id=>1, :number=>10}]
191
- @ds.order(:id).limit(2, 1).all.should == []
189
+ it "should fetch correctly with a limit and offset" do
190
+ @ds.order(:id).limit(2, 0).all.must_equal [{:id=>1, :number=>10}]
191
+ @ds.order(:id).limit(2, 1).all.must_equal []
192
192
  @ds.insert(:number=>20)
193
- @ds.order(:id).limit(1, 1).all.should == [{:id=>2, :number=>20}]
194
- @ds.order(:id).limit(2, 0).all.should == [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
195
- @ds.order(:id).limit(2, 1).all.should == [{:id=>2, :number=>20}]
193
+ @ds.order(:id).limit(1, 1).all.must_equal [{:id=>2, :number=>20}]
194
+ @ds.order(:id).limit(2, 0).all.must_equal [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
195
+ @ds.order(:id).limit(2, 1).all.must_equal [{:id=>2, :number=>20}]
196
196
  end
197
197
 
198
- specify "should fetch correctly with just offset" do
199
- @ds.order(:id).offset(0).all.should == [{:id=>1, :number=>10}]
200
- @ds.order(:id).offset(1).all.should == []
198
+ it "should fetch correctly with just offset" do
199
+ @ds.order(:id).offset(0).all.must_equal [{:id=>1, :number=>10}]
200
+ @ds.order(:id).offset(1).all.must_equal []
201
201
  @ds.insert(:number=>20)
202
- @ds.order(:id).offset(0).all.should == [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
203
- @ds.order(:id).offset(1).all.should == [{:id=>2, :number=>20}]
204
- @ds.order(:id).offset(2).all.should == []
202
+ @ds.order(:id).offset(0).all.must_equal [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
203
+ @ds.order(:id).offset(1).all.must_equal [{:id=>2, :number=>20}]
204
+ @ds.order(:id).offset(2).all.must_equal []
205
205
  end
206
206
 
207
- specify "should fetch correctly with a limit and offset using seperate methods" do
208
- @ds.order(:id).limit(2).offset(0).all.should == [{:id=>1, :number=>10}]
209
- @ds.order(:id).limit(2).offset(1).all.should == []
207
+ it "should fetch correctly with a limit and offset using seperate methods" do
208
+ @ds.order(:id).limit(2).offset(0).all.must_equal [{:id=>1, :number=>10}]
209
+ @ds.order(:id).limit(2).offset(1).all.must_equal []
210
210
  @ds.insert(:number=>20)
211
- @ds.order(:id).limit(1).offset(1).all.should == [{:id=>2, :number=>20}]
212
- @ds.order(:id).limit(2).offset(0).all.should == [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
213
- @ds.order(:id).limit(2).offset(1).all.should == [{:id=>2, :number=>20}]
211
+ @ds.order(:id).limit(1).offset(1).all.must_equal [{:id=>2, :number=>20}]
212
+ @ds.order(:id).limit(2).offset(0).all.must_equal [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
213
+ @ds.order(:id).limit(2).offset(1).all.must_equal [{:id=>2, :number=>20}]
214
214
  end
215
215
 
216
- specify "should provide correct columns when using a limit and offset" do
216
+ it "should provide correct columns when using a limit and offset" do
217
217
  ds = @ds.order(:id).limit(1, 1)
218
218
  ds.all
219
- ds.columns.should == [:id, :number]
220
- @ds.order(:id).limit(1, 1).columns.should == [:id, :number]
219
+ ds.columns.must_equal [:id, :number]
220
+ @ds.order(:id).limit(1, 1).columns.must_equal [:id, :number]
221
221
  end
222
222
 
223
- specify "should fetch correctly with a limit and offset for different combinations of from and join tables" do
223
+ it "should fetch correctly with a limit and offset for different combinations of from and join tables" do
224
224
  @db.create_table!(:items2){primary_key :id2; Integer :number2}
225
225
  @db[:items2].insert(:number2=>10)
226
- @ds.from(:items, :items2).order(:id).limit(2, 0).all.should == [{:id=>1, :number=>10, :id2=>1, :number2=>10}]
227
- @ds.from(:items___i, :items2___i2).order(:id).limit(2, 0).all.should == [{:id=>1, :number=>10, :id2=>1, :number2=>10}]
228
- @ds.cross_join(:items2).order(:id).limit(2, 0).all.should ==[{:id=>1, :number=>10, :id2=>1, :number2=>10}]
229
- @ds.from(:items___i).cross_join(:items2___i2).order(:id).limit(2, 0).all.should == [{:id=>1, :number=>10, :id2=>1, :number2=>10}]
230
- @ds.cross_join(:items2___i).cross_join(@db[:items2].select(:id2___id3, :number2___number3)).order(:id).limit(2, 0).all.should == [{:id=>1, :number=>10, :id2=>1, :number2=>10, :id3=>1, :number3=>10}]
231
-
232
- @ds.from(:items, :items2).order(:id).limit(2, 1).all.should == []
233
- @ds.from(:items___i, :items2___i2).order(:id).limit(2, 1).all.should == []
234
- @ds.cross_join(:items2).order(:id).limit(2, 1).all.should == []
235
- @ds.from(:items___i).cross_join(:items2___i2).order(:id).limit(2, 1).all.should == []
236
- @ds.cross_join(:items2___i).cross_join(@db[:items2].select(:id2___id3, :number2___number3)).order(:id).limit(2, 1).all.should == []
226
+ @ds.from(:items, :items2).order(:id).limit(2, 0).all.must_equal [{:id=>1, :number=>10, :id2=>1, :number2=>10}]
227
+ @ds.from(:items___i, :items2___i2).order(:id).limit(2, 0).all.must_equal [{:id=>1, :number=>10, :id2=>1, :number2=>10}]
228
+ @ds.cross_join(:items2).order(:id).limit(2, 0).all.must_equal [{:id=>1, :number=>10, :id2=>1, :number2=>10}]
229
+ @ds.from(:items___i).cross_join(:items2___i2).order(:id).limit(2, 0).all.must_equal [{:id=>1, :number=>10, :id2=>1, :number2=>10}]
230
+ @ds.cross_join(:items2___i).cross_join(@db[:items2].select(:id2___id3, :number2___number3)).order(:id).limit(2, 0).all.must_equal [{:id=>1, :number=>10, :id2=>1, :number2=>10, :id3=>1, :number3=>10}]
231
+
232
+ @ds.from(:items, :items2).order(:id).limit(2, 1).all.must_equal []
233
+ @ds.from(:items___i, :items2___i2).order(:id).limit(2, 1).all.must_equal []
234
+ @ds.cross_join(:items2).order(:id).limit(2, 1).all.must_equal []
235
+ @ds.from(:items___i).cross_join(:items2___i2).order(:id).limit(2, 1).all.must_equal []
236
+ @ds.cross_join(:items2___i).cross_join(@db[:items2].select(:id2___id3, :number2___number3)).order(:id).limit(2, 1).all.must_equal []
237
237
  @db.drop_table(:items2)
238
238
  end
239
239
 
240
- specify "should fetch correctly with a limit and offset without an order" do
241
- @ds.limit(2, 1).all.should == []
240
+ it "should fetch correctly with a limit and offset without an order" do
241
+ @ds.limit(2, 1).all.must_equal []
242
242
  end
243
243
 
244
- specify "should be orderable by column number" do
244
+ it "should be orderable by column number" do
245
245
  @ds.insert(:number=>20)
246
246
  @ds.insert(:number=>10)
247
- @ds.order(2, 1).select_map([:id, :number]).should == [[1, 10], [3, 10], [2, 20]]
247
+ @ds.order(2, 1).select_map([:id, :number]).must_equal [[1, 10], [3, 10], [2, 20]]
248
248
  end
249
249
 
250
- specify "should fetch correctly with a limit in an IN subselect" do
251
- @ds.where(:id=>@ds.select(:id).order(:id).limit(2)).all.should == [{:id=>1, :number=>10}]
250
+ it "should fetch correctly with a limit in an IN subselect" do
251
+ @ds.where(:id=>@ds.select(:id).order(:id).limit(2)).all.must_equal [{:id=>1, :number=>10}]
252
252
  @ds.insert(:number=>20)
253
- @ds.where(:id=>@ds.select(:id).order(:id).limit(1)).all.should == [{:id=>1, :number=>10}]
254
- @ds.where(:id=>@ds.select(:id).order(:id).limit(2)).order(:id).all.should == [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
253
+ @ds.where(:id=>@ds.select(:id).order(:id).limit(1)).all.must_equal [{:id=>1, :number=>10}]
254
+ @ds.where(:id=>@ds.select(:id).order(:id).limit(2)).order(:id).all.must_equal [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
255
255
  end
256
256
 
257
- specify "should fetch correctly with a limit and offset in an IN subselect" do
258
- @ds.where(:id=>@ds.select(:id).order(:id).limit(2, 0)).all.should == [{:id=>1, :number=>10}]
259
- @ds.where(:id=>@ds.select(:id).order(:id).limit(2, 1)).all.should == []
257
+ it "should fetch correctly with a limit and offset in an IN subselect" do
258
+ @ds.where(:id=>@ds.select(:id).order(:id).limit(2, 0)).all.must_equal [{:id=>1, :number=>10}]
259
+ @ds.where(:id=>@ds.select(:id).order(:id).limit(2, 1)).all.must_equal []
260
260
  @ds.insert(:number=>20)
261
- @ds.where(:id=>@ds.select(:id).order(:id).limit(1, 1)).all.should == [{:id=>2, :number=>20}]
262
- @ds.where(:id=>@ds.select(:id).order(:id).limit(2, 0)).order(:id).all.should == [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
263
- @ds.where(:id=>@ds.select(:id).order(:id).limit(2, 1)).all.should == [{:id=>2, :number=>20}]
261
+ @ds.where(:id=>@ds.select(:id).order(:id).limit(1, 1)).all.must_equal [{:id=>2, :number=>20}]
262
+ @ds.where(:id=>@ds.select(:id).order(:id).limit(2, 0)).order(:id).all.must_equal [{:id=>1, :number=>10}, {:id=>2, :number=>20}]
263
+ @ds.where(:id=>@ds.select(:id).order(:id).limit(2, 1)).all.must_equal [{:id=>2, :number=>20}]
264
264
  end
265
265
 
266
- specify "should fetch correctly when using limit and offset in a from_self" do
266
+ it "should fetch correctly when using limit and offset in a from_self" do
267
267
  @ds.insert(:number=>20)
268
268
  ds = @ds.order(:id).limit(1, 1).from_self
269
- ds.all.should == [{:number=>20, :id=>2}]
270
- ds.columns.should == [:id, :number]
271
- @ds.order(:id).limit(1, 1).columns.should == [:id, :number]
269
+ ds.all.must_equal [{:number=>20, :id=>2}]
270
+ ds.columns.must_equal [:id, :number]
271
+ @ds.order(:id).limit(1, 1).columns.must_equal [:id, :number]
272
272
  end
273
273
 
274
- specify "should fetch correctly when using nested limit and offset in a from_self" do
274
+ it "should fetch correctly when using nested limit and offset in a from_self" do
275
275
  @ds.insert(:number=>20)
276
276
  @ds.insert(:number=>30)
277
277
  ds = @ds.order(:id).limit(2, 1).from_self.reverse_order(:number).limit(1, 1)
278
- ds.all.should == [{:number=>20, :id=>2}]
279
- ds.columns.should == [:id, :number]
280
- @ds.order(:id).limit(2, 1).from_self.reverse_order(:number).limit(1, 1).columns.should == [:id, :number]
278
+ ds.all.must_equal [{:number=>20, :id=>2}]
279
+ ds.columns.must_equal [:id, :number]
280
+ @ds.order(:id).limit(2, 1).from_self.reverse_order(:number).limit(1, 1).columns.must_equal [:id, :number]
281
281
 
282
282
  ds = @ds.order(:id).limit(3, 1).from_self.limit(2, 1).from_self.limit(1, 1)
283
- ds.all.should == []
284
- ds.columns.should == [:id, :number]
283
+ ds.all.must_equal []
284
+ ds.columns.must_equal [:id, :number]
285
285
 
286
286
  @ds.insert(:number=>40)
287
287
  ds = @ds.order(:id).limit(3, 1).from_self.reverse_order(:number).limit(2, 1).from_self.reverse_order(:id).limit(1, 1)
288
- ds.all.should == [{:number=>20, :id=>2}]
289
- ds.columns.should == [:id, :number]
288
+ ds.all.must_equal [{:number=>20, :id=>2}]
289
+ ds.columns.must_equal [:id, :number]
290
290
  end
291
291
 
292
- specify "should alias columns correctly" do
293
- @ds.select(:id___x, :number___n).first.should == {:x=>1, :n=>10}
292
+ it "should alias columns correctly" do
293
+ @ds.select(:id___x, :number___n).first.must_equal(:x=>1, :n=>10)
294
294
  end
295
295
 
296
- specify "should support table aliases with column aliases" do
297
- DB.from(@ds.as(:i, [:x, :n])).first.should == {:x=>1, :n=>10}
296
+ it "should support table aliases with column aliases" do
297
+ DB.from(@ds.as(:i, [:x, :n])).first.must_equal(:x=>1, :n=>10)
298
298
  end if DB.dataset.supports_derived_column_lists?
299
299
 
300
- specify "should handle true/false properly" do
301
- @ds.filter(Sequel::TRUE).select_map(:number).should == [10]
302
- @ds.filter(Sequel::FALSE).select_map(:number).should == []
303
- @ds.filter(true).select_map(:number).should == [10]
304
- @ds.filter(false).select_map(:number).should == []
300
+ it "should handle true/false properly" do
301
+ @ds.filter(Sequel::TRUE).select_map(:number).must_equal [10]
302
+ @ds.filter(Sequel::FALSE).select_map(:number).must_equal []
303
+ @ds.filter(true).select_map(:number).must_equal [10]
304
+ @ds.filter(false).select_map(:number).must_equal []
305
305
  end
306
306
  end
307
307
 
@@ -322,13 +322,13 @@ describe "Simple dataset operations with nasty table names" do
322
322
  Integer :number
323
323
  end
324
324
  @ds = @db[@table]
325
- @ds.insert(:number=>10).should == 1
326
- @ds.all.should == [{:id=>1, :number=>10}]
327
- @ds.update(:number=>20).should == 1
328
- @ds.all.should == [{:id=>1, :number=>20}]
329
- @ds.delete.should == 1
330
- @ds.count.should == 0
331
- proc{@db.drop_table?(@table)}.should_not raise_error
325
+ @ds.insert(:number=>10).must_equal 1
326
+ @ds.all.must_equal [{:id=>1, :number=>10}]
327
+ @ds.update(:number=>20).must_equal 1
328
+ @ds.all.must_equal [{:id=>1, :number=>20}]
329
+ @ds.delete.must_equal 1
330
+ @ds.count.must_equal 0
331
+ @db.drop_table?(@table)
332
332
  end
333
333
  end
334
334
 
@@ -344,81 +344,81 @@ describe Sequel::Dataset do
344
344
  DB.drop_table?(:test)
345
345
  end
346
346
 
347
- specify "should return the correct record count" do
348
- @d.count.should == 0
347
+ it "should return the correct record count" do
348
+ @d.count.must_equal 0
349
349
  @d << {:name => 'abc', :value => 123}
350
350
  @d << {:name => 'abc', :value => 456}
351
351
  @d << {:name => 'def', :value => 789}
352
- @d.count.should == 3
352
+ @d.count.must_equal 3
353
353
  end
354
354
 
355
- specify "should handle functions with identifier names correctly" do
355
+ it "should handle functions with identifier names correctly" do
356
356
  @d << {:name => 'abc', :value => 6}
357
- @d.get{sum.function(:value)}.should == 6
357
+ @d.get{sum.function(:value)}.must_equal 6
358
358
  end
359
359
 
360
- specify "should handle aggregate methods on limited datasets correctly" do
360
+ it "should handle aggregate methods on limited datasets correctly" do
361
361
  @d << {:name => 'abc', :value => 6}
362
362
  @d << {:name => 'bcd', :value => 12}
363
363
  @d << {:name => 'def', :value => 18}
364
364
  @d = @d.order(:name).limit(2)
365
- @d.count.should == 2
366
- @d.avg(:value).to_i.should == 9
367
- @d.min(:value).to_i.should == 6
368
- @d.reverse.min(:value).to_i.should == 12
369
- @d.max(:value).to_i.should == 12
370
- @d.sum(:value).to_i.should == 18
371
- @d.interval(:value).to_i.should == 6
365
+ @d.count.must_equal 2
366
+ @d.avg(:value).to_i.must_equal 9
367
+ @d.min(:value).to_i.must_equal 6
368
+ @d.reverse.min(:value).to_i.must_equal 12
369
+ @d.max(:value).to_i.must_equal 12
370
+ @d.sum(:value).to_i.must_equal 18
371
+ @d.interval(:value).to_i.must_equal 6
372
372
  end
373
373
 
374
- specify "should return the correct records" do
375
- @d.to_a.should == []
374
+ it "should return the correct records" do
375
+ @d.to_a.must_equal []
376
376
  @d << {:name => 'abc', :value => 123}
377
377
  @d << {:name => 'abc', :value => 456}
378
378
  @d << {:name => 'def', :value => 789}
379
379
 
380
- @d.order(:value).to_a.should == [
380
+ @d.order(:value).to_a.must_equal [
381
381
  {:name => 'abc', :value => 123},
382
382
  {:name => 'abc', :value => 456},
383
383
  {:name => 'def', :value => 789}
384
384
  ]
385
385
  end
386
386
 
387
- specify "should update records correctly" do
387
+ it "should update records correctly" do
388
388
  @d << {:name => 'abc', :value => 123}
389
389
  @d << {:name => 'abc', :value => 456}
390
390
  @d << {:name => 'def', :value => 789}
391
391
  @d.filter(:name => 'abc').update(:value => 530)
392
- @d[:name => 'def'][:value].should == 789
393
- @d.filter(:value => 530).count.should == 2
392
+ @d[:name => 'def'][:value].must_equal 789
393
+ @d.filter(:value => 530).count.must_equal 2
394
394
  end
395
395
 
396
- specify "should delete records correctly" do
396
+ it "should delete records correctly" do
397
397
  @d << {:name => 'abc', :value => 123}
398
398
  @d << {:name => 'abc', :value => 456}
399
399
  @d << {:name => 'def', :value => 789}
400
400
  @d.filter(:name => 'abc').delete
401
- @d.count.should == 1
402
- @d.first[:name].should == 'def'
401
+ @d.count.must_equal 1
402
+ @d.first[:name].must_equal 'def'
403
403
  end
404
404
 
405
- specify "should be able to truncate the table" do
405
+ it "should be able to truncate the table" do
406
406
  @d << {:name => 'abc', :value => 123}
407
407
  @d << {:name => 'abc', :value => 456}
408
408
  @d << {:name => 'def', :value => 789}
409
- @d.count.should == 3
410
- @d.truncate.should == nil
411
- @d.count.should == 0
409
+ @d.count.must_equal 3
410
+ @d.truncate.must_equal nil
411
+ @d.count.must_equal 0
412
412
  end
413
413
 
414
- specify "should be able to literalize booleans" do
415
- proc {@d.literal(true)}.should_not raise_error
416
- proc {@d.literal(false)}.should_not raise_error
414
+ it "should be able to literalize booleans" do
415
+ @d.literal(true)
416
+ @d.literal(false)
417
417
  end
418
418
  end
419
419
 
420
420
  describe Sequel::Database do
421
- specify "should correctly escape strings" do
421
+ it "should correctly escape strings" do
422
422
  ["\\\n",
423
423
  "\\\\\n",
424
424
  "\\\r\n",
@@ -429,20 +429,20 @@ describe Sequel::Database do
429
429
  "\\'dingo",
430
430
  "\\\\''dingo",
431
431
  ].each do |str|
432
- DB.get(Sequel.cast(str, String)).should == str
432
+ DB.get(Sequel.cast(str, String)).must_equal str
433
433
  str = "1#{str}1"
434
- DB.get(Sequel.cast(str, String)).should == str
434
+ DB.get(Sequel.cast(str, String)).must_equal str
435
435
  str = "#{str}#{str}"
436
- DB.get(Sequel.cast(str, String)).should == str
436
+ DB.get(Sequel.cast(str, String)).must_equal str
437
437
  end
438
438
  end
439
439
 
440
440
  cspecify "should properly escape binary data", [:odbc], [:jdbc, :hsqldb], :oracle do
441
- DB.get(Sequel.cast(Sequel.blob("\1\2\3"), File).as(:a)).should == "\1\2\3"
441
+ DB.get(Sequel.cast(Sequel.blob("\1\2\3"), File).as(:a)).must_equal "\1\2\3"
442
442
  end
443
443
 
444
444
  cspecify "should properly handle empty blobs", [:jdbc, :hsqldb], :oracle do
445
- DB.get(Sequel.cast(Sequel.blob(""), File).as(:a)).should == ""
445
+ DB.get(Sequel.cast(Sequel.blob(""), File).as(:a)).must_equal ""
446
446
  end
447
447
 
448
448
  cspecify "should properly escape identifiers", :db2, :oracle, :sqlanywhere do
@@ -450,13 +450,13 @@ describe Sequel::Database do
450
450
  DB.drop_table(:"\\'\"[]")
451
451
  end
452
452
 
453
- specify "should have a working table_exists?" do
453
+ it "should have a working table_exists?" do
454
454
  t = :basdfdsafsaddsaf
455
455
  DB.drop_table?(t)
456
- DB.table_exists?(t).should == false
456
+ DB.table_exists?(t).must_equal false
457
457
  DB.create_table(t){Integer :a}
458
458
  begin
459
- DB.table_exists?(t).should == true
459
+ DB.table_exists?(t).must_equal true
460
460
  ensure
461
461
  DB.drop_table(t)
462
462
  end
@@ -478,20 +478,20 @@ describe Sequel::Dataset do
478
478
  DB.drop_table?(:items)
479
479
  end
480
480
 
481
- specify "should correctly return avg" do
482
- @d.avg(:value).to_i.should == 456
481
+ it "should correctly return avg" do
482
+ @d.avg(:value).to_i.must_equal 456
483
483
  end
484
484
 
485
- specify "should correctly return sum" do
486
- @d.sum(:value).to_i.should == 1368
485
+ it "should correctly return sum" do
486
+ @d.sum(:value).to_i.must_equal 1368
487
487
  end
488
488
 
489
- specify "should correctly return max" do
490
- @d.max(:value).to_i.should == 789
489
+ it "should correctly return max" do
490
+ @d.max(:value).to_i.must_equal 789
491
491
  end
492
492
 
493
- specify "should correctly return min" do
494
- @d.min(:value).to_i.should == 123
493
+ it "should correctly return min" do
494
+ @d.min(:value).to_i.must_equal 123
495
495
  end
496
496
  end
497
497
 
@@ -507,17 +507,17 @@ describe "Simple Dataset operations" do
507
507
  DB.drop_table?(:items)
508
508
  end
509
509
 
510
- specify "should deal with boolean conditions correctly" do
510
+ it "should deal with boolean conditions correctly" do
511
511
  @ds.insert(:number=>1, :flag=>true)
512
512
  @ds.insert(:number=>2, :flag=>false)
513
513
  @ds.insert(:number=>3, :flag=>nil)
514
514
  @ds.order!(:number)
515
- @ds.filter(:flag=>true).map(:number).should == [1]
516
- @ds.filter(:flag=>false).map(:number).should == [2]
517
- @ds.filter(:flag=>nil).map(:number).should == [3]
518
- @ds.exclude(:flag=>true).map(:number).should == [2, 3]
519
- @ds.exclude(:flag=>false).map(:number).should == [1, 3]
520
- @ds.exclude(:flag=>nil).map(:number).should == [1, 2]
515
+ @ds.filter(:flag=>true).map(:number).must_equal [1]
516
+ @ds.filter(:flag=>false).map(:number).must_equal [2]
517
+ @ds.filter(:flag=>nil).map(:number).must_equal [3]
518
+ @ds.exclude(:flag=>true).map(:number).must_equal [2, 3]
519
+ @ds.exclude(:flag=>false).map(:number).must_equal [1, 3]
520
+ @ds.exclude(:flag=>nil).map(:number).must_equal [1, 2]
521
521
  end
522
522
  end
523
523
 
@@ -536,21 +536,21 @@ describe "Simple Dataset operations in transactions" do
536
536
  cspecify "should insert correctly with a primary key specified inside a transaction", :db2, :mssql do
537
537
  DB.transaction do
538
538
  @ds.insert(:id=>100, :number=>20)
539
- @ds.count.should == 1
540
- @ds.order(:id).all.should == [{:id=>100, :number=>20}]
539
+ @ds.count.must_equal 1
540
+ @ds.order(:id).all.must_equal [{:id=>100, :number=>20}]
541
541
  end
542
542
  end
543
543
 
544
- specify "should have insert return primary key value inside a transaction" do
544
+ it "should have insert return primary key value inside a transaction" do
545
545
  DB.transaction do
546
- @ds.insert(:number=>20).should == 1
547
- @ds.count.should == 1
548
- @ds.order(:id).all.should == [{:id=>1, :number=>20}]
546
+ @ds.insert(:number=>20).must_equal 1
547
+ @ds.count.must_equal 1
548
+ @ds.order(:id).all.must_equal [{:id=>1, :number=>20}]
549
549
  end
550
550
  end
551
551
 
552
- specify "should support for_update" do
553
- DB.transaction{@ds.for_update.all.should == []}
552
+ it "should support for_update" do
553
+ DB.transaction{@ds.for_update.all.must_equal []}
554
554
  end
555
555
  end
556
556
 
@@ -569,11 +569,11 @@ describe "Dataset UNION, EXCEPT, and INTERSECT" do
569
569
  DB.drop_table?(:i1, :i2, :i3)
570
570
  end
571
571
 
572
- specify "should give the correct results for simple UNION, EXCEPT, and INTERSECT" do
573
- @ds1.union(@ds2).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 30'
572
+ it "should give the correct results for simple UNION, EXCEPT, and INTERSECT" do
573
+ @ds1.union(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20 30'
574
574
  if @ds1.supports_intersect_except?
575
- @ds1.except(@ds2).order(:number).map{|x| x[:number].to_s}.should == %w'20'
576
- @ds1.intersect(@ds2).order(:number).map{|x| x[:number].to_s}.should == %w'10'
575
+ @ds1.except(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'20'
576
+ @ds1.intersect(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'10'
577
577
  end
578
578
  end
579
579
 
@@ -583,49 +583,49 @@ describe "Dataset UNION, EXCEPT, and INTERSECT" do
583
583
  @ds1.insert(:number=>38)
584
584
  @ds2.insert(:number=>39)
585
585
 
586
- @ds1.reverse_order(:number).union(@ds2).order(:number).map{|x| x[:number].to_s}.should == %w'8 9 10 20 30 38 39'
587
- @ds1.union(@ds2.reverse_order(:number)).order(:number).map{|x| x[:number].to_s}.should == %w'8 9 10 20 30 38 39'
586
+ @ds1.reverse_order(:number).union(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9 10 20 30 38 39'
587
+ @ds1.union(@ds2.reverse_order(:number)).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9 10 20 30 38 39'
588
588
 
589
- @ds1.reverse_order(:number).limit(1).union(@ds2).order(:number).map{|x| x[:number].to_s}.should == %w'9 10 30 38 39'
590
- @ds2.reverse_order(:number).limit(1).union(@ds1).order(:number).map{|x| x[:number].to_s}.should == %w'8 10 20 38 39'
589
+ @ds1.reverse_order(:number).limit(1).union(@ds2).order(:number).map{|x| x[:number].to_s}.must_equal %w'9 10 30 38 39'
590
+ @ds2.reverse_order(:number).limit(1).union(@ds1).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 10 20 38 39'
591
591
 
592
- @ds1.union(@ds2.order(:number).limit(1)).order(:number).map{|x| x[:number].to_s}.should == %w'8 9 10 20 38'
593
- @ds2.union(@ds1.order(:number).limit(1)).order(:number).map{|x| x[:number].to_s}.should == %w'8 9 10 30 39'
592
+ @ds1.union(@ds2.order(:number).limit(1)).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9 10 20 38'
593
+ @ds2.union(@ds1.order(:number).limit(1)).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9 10 30 39'
594
594
 
595
- @ds1.union(@ds2).limit(2).order(:number).map{|x| x[:number].to_s}.should == %w'8 9'
596
- @ds2.union(@ds1).reverse_order(:number).limit(2).map{|x| x[:number].to_s}.should == %w'39 38'
595
+ @ds1.union(@ds2).limit(2).order(:number).map{|x| x[:number].to_s}.must_equal %w'8 9'
596
+ @ds2.union(@ds1).reverse_order(:number).limit(2).map{|x| x[:number].to_s}.must_equal %w'39 38'
597
597
 
598
- @ds1.reverse_order(:number).limit(2).union(@ds2.reverse_order(:number).limit(2)).order(:number).limit(3).map{|x| x[:number].to_s}.should == %w'20 30 38'
599
- @ds2.order(:number).limit(2).union(@ds1.order(:number).limit(2)).reverse_order(:number).limit(3).map{|x| x[:number].to_s}.should == %w'10 9 8'
598
+ @ds1.reverse_order(:number).limit(2).union(@ds2.reverse_order(:number).limit(2)).order(:number).limit(3).map{|x| x[:number].to_s}.must_equal %w'20 30 38'
599
+ @ds2.order(:number).limit(2).union(@ds1.order(:number).limit(2)).reverse_order(:number).limit(3).map{|x| x[:number].to_s}.must_equal %w'10 9 8'
600
600
  end
601
601
 
602
- specify "should give the correct results for compound UNION, EXCEPT, and INTERSECT" do
602
+ it "should give the correct results for compound UNION, EXCEPT, and INTERSECT" do
603
603
  DB.create_table!(:i3){integer :number}
604
604
  @ds3 = DB[:i3]
605
605
  @ds3.insert(:number=>10)
606
606
  @ds3.insert(:number=>40)
607
607
 
608
- @ds1.union(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 30 40'
609
- @ds1.union(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 30 40'
608
+ @ds1.union(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20 30 40'
609
+ @ds1.union(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20 30 40'
610
610
  if @ds1.supports_intersect_except?
611
- @ds1.union(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'20 30'
612
- @ds1.union(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 30'
613
- @ds1.union(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10 '
614
- @ds1.union(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10 20'
611
+ @ds1.union(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w'20 30'
612
+ @ds1.union(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20 30'
613
+ @ds1.union(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 '
614
+ @ds1.union(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20'
615
615
 
616
- @ds1.except(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 40'
617
- @ds1.except(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'20'
618
- @ds1.except(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'20'
619
- @ds1.except(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10 20'
620
- @ds1.except(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w''
621
- @ds1.except(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'20'
616
+ @ds1.except(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20 40'
617
+ @ds1.except(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w'20'
618
+ @ds1.except(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w'20'
619
+ @ds1.except(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 20'
620
+ @ds1.except(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w''
621
+ @ds1.except(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w'20'
622
622
 
623
- @ds1.intersect(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10 40'
624
- @ds1.intersect(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10'
625
- @ds1.intersect(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w''
626
- @ds1.intersect(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w''
627
- @ds1.intersect(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10'
628
- @ds1.intersect(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10'
623
+ @ds1.intersect(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w'10 40'
624
+ @ds1.intersect(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w'10'
625
+ @ds1.intersect(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w''
626
+ @ds1.intersect(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w''
627
+ @ds1.intersect(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.must_equal %w'10'
628
+ @ds1.intersect(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.must_equal %w'10'
629
629
  end
630
630
  end
631
631
  end
@@ -647,39 +647,39 @@ if DB.dataset.supports_cte?
647
647
  @db.drop_table?(:i1)
648
648
  end
649
649
 
650
- specify "should give correct results for WITH" do
651
- @db[:t].with(:t, @ds.filter(:parent_id=>nil).select(:id)).order(:id).map(:id).should == [1, 2]
650
+ it "should give correct results for WITH" do
651
+ @db[:t].with(:t, @ds.filter(:parent_id=>nil).select(:id)).order(:id).map(:id).must_equal [1, 2]
652
652
  end
653
653
 
654
654
  cspecify "should give correct results for recursive WITH", :db2 do
655
655
  ds = @db[:t].select(:i___id, :pi___parent_id).with_recursive(:t, @ds.filter(:parent_id=>nil), @ds.join(:t, :i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi]).order(:id)
656
- ds.all.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>nil, :id=>2}, {:parent_id=>1, :id=>3}, {:parent_id=>1, :id=>4}, {:parent_id=>3, :id=>5}, {:parent_id=>5, :id=>6}]
656
+ ds.all.must_equal [{:parent_id=>nil, :id=>1}, {:parent_id=>nil, :id=>2}, {:parent_id=>1, :id=>3}, {:parent_id=>1, :id=>4}, {:parent_id=>3, :id=>5}, {:parent_id=>5, :id=>6}]
657
657
  ps = @db[:t].select(:i___id, :pi___parent_id).with_recursive(:t, @ds.filter(:parent_id=>:$n), @ds.join(:t, :i=>:parent_id).filter(:t__i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi]).order(:id).prepare(:select, :cte_sel)
658
- ps.call(:n=>1).should == [{:id=>3, :parent_id=>1}, {:id=>4, :parent_id=>1}, {:id=>5, :parent_id=>3}, {:id=>6, :parent_id=>5}]
659
- ps.call(:n=>3).should == [{:id=>5, :parent_id=>3}, {:id=>6, :parent_id=>5}]
660
- ps.call(:n=>5).should == [{:id=>6, :parent_id=>5}]
658
+ ps.call(:n=>1).must_equal [{:id=>3, :parent_id=>1}, {:id=>4, :parent_id=>1}, {:id=>5, :parent_id=>3}, {:id=>6, :parent_id=>5}]
659
+ ps.call(:n=>3).must_equal [{:id=>5, :parent_id=>3}, {:id=>6, :parent_id=>5}]
660
+ ps.call(:n=>5).must_equal [{:id=>6, :parent_id=>5}]
661
661
  end
662
662
 
663
- specify "should support joining a dataset with a CTE" do
664
- @ds.inner_join(@db[:t].with(:t, @ds.filter(:parent_id=>nil)), :id => :id).select(:i1__id).order(:i1__id).map(:id).should == [1,2]
665
- @db[:t].with(:t, @ds).inner_join(@db[:s].with(:s, @ds.filter(:parent_id=>nil)), :id => :id).select(:t__id).order(:t__id).map(:id).should == [1,2]
663
+ it "should support joining a dataset with a CTE" do
664
+ @ds.inner_join(@db[:t].with(:t, @ds.filter(:parent_id=>nil)), :id => :id).select(:i1__id).order(:i1__id).map(:id).must_equal [1,2]
665
+ @db[:t].with(:t, @ds).inner_join(@db[:s].with(:s, @ds.filter(:parent_id=>nil)), :id => :id).select(:t__id).order(:t__id).map(:id).must_equal [1,2]
666
666
  end
667
667
 
668
- specify "should support a subselect in the FROM clause with a CTE" do
669
- @ds.from(@db[:t].with(:t, @ds)).select_order_map(:id).should == [1,2,3,4,5,6]
670
- @db[:t].with(:t, @ds).from_self.select_order_map(:id).should == [1,2,3,4,5,6]
668
+ it "should support a subselect in the FROM clause with a CTE" do
669
+ @ds.from(@db[:t].with(:t, @ds)).select_order_map(:id).must_equal [1,2,3,4,5,6]
670
+ @db[:t].with(:t, @ds).from_self.select_order_map(:id).must_equal [1,2,3,4,5,6]
671
671
  end
672
672
 
673
- specify "should support using a CTE inside a CTE" do
674
- @db[:s].with(:s, @db[:t].with(:t, @ds)).select_order_map(:id).should == [1,2,3,4,5,6]
675
- @db[:s].with_recursive(:s, @db[:t].with(:t, @ds), @db[:t2].with(:t2, @ds)).select_order_map(:id).should == [1,1,2,2,3,3,4,4,5,5,6,6]
673
+ it "should support using a CTE inside a CTE" do
674
+ @db[:s].with(:s, @db[:t].with(:t, @ds)).select_order_map(:id).must_equal [1,2,3,4,5,6]
675
+ @db[:s].with_recursive(:s, @db[:t].with(:t, @ds), @db[:t2].with(:t2, @ds)).select_order_map(:id).must_equal [1,1,2,2,3,3,4,4,5,5,6,6]
676
676
  end
677
677
 
678
- specify "should support using a CTE inside UNION/EXCEPT/INTERSECT" do
679
- @ds.union(@db[:t].with(:t, @ds)).select_order_map(:id).should == [1,2,3,4,5,6]
678
+ it "should support using a CTE inside UNION/EXCEPT/INTERSECT" do
679
+ @ds.union(@db[:t].with(:t, @ds)).select_order_map(:id).must_equal [1,2,3,4,5,6]
680
680
  if @ds.supports_intersect_except?
681
- @ds.intersect(@db[:t].with(:t, @ds)).select_order_map(:id).should == [1,2,3,4,5,6]
682
- @ds.except(@db[:t].with(:t, @ds)).select_order_map(:id).should == []
681
+ @ds.intersect(@db[:t].with(:t, @ds)).select_order_map(:id).must_equal [1,2,3,4,5,6]
682
+ @ds.except(@db[:t].with(:t, @ds)).select_order_map(:id).must_equal []
683
683
  end
684
684
  end
685
685
  end
@@ -699,13 +699,13 @@ if DB.dataset.supports_cte?(:update) # Assume INSERT and DELETE support as well
699
699
  @db.drop_table?(:i1)
700
700
  end
701
701
 
702
- specify "should give correct results for WITH" do
702
+ it "should give correct results for WITH" do
703
703
  @ds2.insert(@db[:t])
704
- @ds.select_order_map(:id).should == [1, 1, 2, 2]
704
+ @ds.select_order_map(:id).must_equal [1, 1, 2, 2]
705
705
  @ds2.filter(:id=>@db[:t].select{max(id)}).update(:id=>Sequel.+(:id, 1))
706
- @ds.select_order_map(:id).should == [1, 1, 3, 3]
706
+ @ds.select_order_map(:id).must_equal [1, 1, 3, 3]
707
707
  @ds2.filter(:id=>@db[:t].select{max(id)}).delete
708
- @ds.select_order_map(:id).should == [1, 1]
708
+ @ds.select_order_map(:id).must_equal [1, 1]
709
709
  end
710
710
  end
711
711
  end
@@ -721,16 +721,16 @@ if DB.dataset.supports_returning?(:insert)
721
721
  @db.drop_table?(:i1)
722
722
  end
723
723
 
724
- specify "should give correct results" do
724
+ it "should give correct results" do
725
725
  h = {}
726
726
  @ds.returning(:foo).insert(1, 2){|r| h = r}
727
- h.should == {:foo=>2}
727
+ h.must_equal(:foo=>2)
728
728
  @ds.returning(:id).insert(3, 4){|r| h = r}
729
- h.should == {:id=>3}
729
+ h.must_equal(:id=>3)
730
730
  @ds.returning.insert(5, 6){|r| h = r}
731
- h.should == {:id=>5, :foo=>6}
731
+ h.must_equal(:id=>5, :foo=>6)
732
732
  @ds.returning(:id___foo, :foo___id).insert(7, 8){|r| h = r}
733
- h.should == {:id=>8, :foo=>7}
733
+ h.must_equal(:id=>8, :foo=>7)
734
734
  end
735
735
  end
736
736
  end
@@ -747,26 +747,26 @@ if DB.dataset.supports_returning?(:update) # Assume DELETE support as well
747
747
  @db.drop_table?(:i1)
748
748
  end
749
749
 
750
- specify "should give correct results" do
750
+ it "should give correct results" do
751
751
  h = []
752
752
  @ds.returning(:foo).update(:id=>Sequel.+(:id, 1), :foo=>Sequel.*(:foo, 2)){|r| h << r}
753
- h.should == [{:foo=>4}]
753
+ h.must_equal [{:foo=>4}]
754
754
  h.clear
755
755
  @ds.returning(:id).update(:id=>Sequel.+(:id, 1), :foo=>Sequel.*(:foo, 2)){|r| h << r}
756
- h.should == [{:id=>3}]
756
+ h.must_equal [{:id=>3}]
757
757
  h.clear
758
758
  @ds.returning.update(:id=>Sequel.+(:id, 1), :foo=>Sequel.*(:foo, 2)){|r| h << r}
759
- h.should == [{:id=>4, :foo=>16}]
759
+ h.must_equal [{:id=>4, :foo=>16}]
760
760
  h.clear
761
761
  @ds.returning(:id___foo, :foo___id).update(:id=>Sequel.+(:id, 1), :foo=>Sequel.*(:foo, 2)){|r| h << r}
762
- h.should == [{:id=>32, :foo=>5}]
762
+ h.must_equal [{:id=>32, :foo=>5}]
763
763
  h.clear
764
764
 
765
765
  @ds.returning.delete{|r| h << r}
766
- h.should == [{:id=>5, :foo=>32}]
766
+ h.must_equal [{:id=>5, :foo=>32}]
767
767
  h.clear
768
768
  @ds.returning.delete{|r| h << r}
769
- h.should == []
769
+ h.must_equal []
770
770
  end
771
771
  end
772
772
  end
@@ -788,37 +788,37 @@ if DB.dataset.supports_window_functions?
788
788
  @db.drop_table?(:i1)
789
789
  end
790
790
 
791
- specify "should give correct results for aggregate window functions" do
792
- @ds.select(:id){sum(:amount).over(:partition=>:group_id).as(:sum)}.all.should ==
793
- [{:sum=>111, :id=>1}, {:sum=>111, :id=>2}, {:sum=>111, :id=>3}, {:sum=>111000, :id=>4}, {:sum=>111000, :id=>5}, {:sum=>111000, :id=>6}]
794
- @ds.select(:id){sum(:amount).over.as(:sum)}.all.should ==
795
- [{:sum=>111111, :id=>1}, {:sum=>111111, :id=>2}, {:sum=>111111, :id=>3}, {:sum=>111111, :id=>4}, {:sum=>111111, :id=>5}, {:sum=>111111, :id=>6}]
791
+ it "should give correct results for aggregate window functions" do
792
+ @ds.select(:id){sum(:amount).over(:partition=>:group_id).as(:sum)}.all.
793
+ must_equal [{:sum=>111, :id=>1}, {:sum=>111, :id=>2}, {:sum=>111, :id=>3}, {:sum=>111000, :id=>4}, {:sum=>111000, :id=>5}, {:sum=>111000, :id=>6}]
794
+ @ds.select(:id){sum(:amount).over.as(:sum)}.all.
795
+ must_equal [{:sum=>111111, :id=>1}, {:sum=>111111, :id=>2}, {:sum=>111111, :id=>3}, {:sum=>111111, :id=>4}, {:sum=>111111, :id=>5}, {:sum=>111111, :id=>6}]
796
796
  end
797
797
 
798
- specify "should give correct results for ranking window functions with orders" do
799
- @ds.select(:id){rank{}.over(:partition=>:group_id, :order=>:id).as(:rank)}.all.should ==
800
- [{:rank=>1, :id=>1}, {:rank=>2, :id=>2}, {:rank=>3, :id=>3}, {:rank=>1, :id=>4}, {:rank=>2, :id=>5}, {:rank=>3, :id=>6}]
801
- @ds.select(:id){rank{}.over(:order=>id).as(:rank)}.all.should ==
802
- [{:rank=>1, :id=>1}, {:rank=>2, :id=>2}, {:rank=>3, :id=>3}, {:rank=>4, :id=>4}, {:rank=>5, :id=>5}, {:rank=>6, :id=>6}]
798
+ it "should give correct results for ranking window functions with orders" do
799
+ @ds.select(:id){rank{}.over(:partition=>:group_id, :order=>:id).as(:rank)}.all.
800
+ must_equal [{:rank=>1, :id=>1}, {:rank=>2, :id=>2}, {:rank=>3, :id=>3}, {:rank=>1, :id=>4}, {:rank=>2, :id=>5}, {:rank=>3, :id=>6}]
801
+ @ds.select(:id){rank{}.over(:order=>id).as(:rank)}.all.
802
+ must_equal [{:rank=>1, :id=>1}, {:rank=>2, :id=>2}, {:rank=>3, :id=>3}, {:rank=>4, :id=>4}, {:rank=>5, :id=>5}, {:rank=>6, :id=>6}]
803
803
  end
804
804
 
805
- specify "should give correct results for aggregate window functions with orders" do
806
- @ds.select(:id){sum(:amount).over(:partition=>:group_id, :order=>:id).as(:sum)}.all.should ==
807
- [{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1000, :id=>4}, {:sum=>11000, :id=>5}, {:sum=>111000, :id=>6}]
808
- @ds.select(:id){sum(:amount).over(:order=>:id).as(:sum)}.all.should ==
809
- [{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1111, :id=>4}, {:sum=>11111, :id=>5}, {:sum=>111111, :id=>6}]
805
+ it "should give correct results for aggregate window functions with orders" do
806
+ @ds.select(:id){sum(:amount).over(:partition=>:group_id, :order=>:id).as(:sum)}.all.
807
+ must_equal [{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1000, :id=>4}, {:sum=>11000, :id=>5}, {:sum=>111000, :id=>6}]
808
+ @ds.select(:id){sum(:amount).over(:order=>:id).as(:sum)}.all.
809
+ must_equal [{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1111, :id=>4}, {:sum=>11111, :id=>5}, {:sum=>111111, :id=>6}]
810
810
  end
811
811
 
812
- specify "should give correct results for aggregate window functions with frames" do
813
- @ds.select(:id){sum(:amount).over(:partition=>:group_id, :order=>:id, :frame=>:all).as(:sum)}.all.should ==
814
- [{:sum=>111, :id=>1}, {:sum=>111, :id=>2}, {:sum=>111, :id=>3}, {:sum=>111000, :id=>4}, {:sum=>111000, :id=>5}, {:sum=>111000, :id=>6}]
815
- @ds.select(:id){sum(:amount).over(:order=>:id, :frame=>:all).as(:sum)}.all.should ==
816
- [{:sum=>111111, :id=>1}, {:sum=>111111, :id=>2}, {:sum=>111111, :id=>3}, {:sum=>111111, :id=>4}, {:sum=>111111, :id=>5}, {:sum=>111111, :id=>6}]
812
+ it "should give correct results for aggregate window functions with frames" do
813
+ @ds.select(:id){sum(:amount).over(:partition=>:group_id, :order=>:id, :frame=>:all).as(:sum)}.all.
814
+ must_equal [{:sum=>111, :id=>1}, {:sum=>111, :id=>2}, {:sum=>111, :id=>3}, {:sum=>111000, :id=>4}, {:sum=>111000, :id=>5}, {:sum=>111000, :id=>6}]
815
+ @ds.select(:id){sum(:amount).over(:order=>:id, :frame=>:all).as(:sum)}.all.
816
+ must_equal [{:sum=>111111, :id=>1}, {:sum=>111111, :id=>2}, {:sum=>111111, :id=>3}, {:sum=>111111, :id=>4}, {:sum=>111111, :id=>5}, {:sum=>111111, :id=>6}]
817
817
 
818
- @ds.select(:id){sum(:amount).over(:partition=>:group_id, :order=>:id, :frame=>:rows).as(:sum)}.all.should ==
819
- [{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1000, :id=>4}, {:sum=>11000, :id=>5}, {:sum=>111000, :id=>6}]
820
- @ds.select(:id){sum(:amount).over(:order=>:id, :frame=>:rows).as(:sum)}.all.should ==
821
- [{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1111, :id=>4}, {:sum=>11111, :id=>5}, {:sum=>111111, :id=>6}]
818
+ @ds.select(:id){sum(:amount).over(:partition=>:group_id, :order=>:id, :frame=>:rows).as(:sum)}.all.
819
+ must_equal [{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1000, :id=>4}, {:sum=>11000, :id=>5}, {:sum=>111000, :id=>6}]
820
+ @ds.select(:id){sum(:amount).over(:order=>:id, :frame=>:rows).as(:sum)}.all.
821
+ must_equal [{:sum=>1, :id=>1}, {:sum=>11, :id=>2}, {:sum=>111, :id=>3}, {:sum=>1111, :id=>4}, {:sum=>11111, :id=>5}, {:sum=>111111, :id=>6}]
822
822
  end
823
823
  end
824
824
  end
@@ -847,26 +847,26 @@ describe Sequel::SQL::Constants do
847
847
  @db.create_table!(:constants){Date :d}
848
848
  @ds.insert(:d=>Sequel::CURRENT_DATE)
849
849
  d = @c2[@ds.get(:d)]
850
- d.should be_a_kind_of(Date)
851
- d.to_s.should == Date.today.to_s
850
+ d.must_be_kind_of(Date)
851
+ d.to_s.must_equal Date.today.to_s
852
852
  end
853
853
 
854
854
  cspecify "should have working CURRENT_TIME", [:jdbc, :sqlite], [:mysql2] do
855
855
  @db.create_table!(:constants){Time :t, :only_time=>true}
856
856
  @ds.insert(:t=>Sequel::CURRENT_TIME)
857
- (Time.now - @c[@ds.get(:t)]).should be_within(60).of(0)
857
+ (Time.now - @c[@ds.get(:t)]).must_be_close_to 0, 60
858
858
  end
859
859
 
860
860
  cspecify "should have working CURRENT_TIMESTAMP", [:jdbc, :sqlite], [:swift] do
861
861
  @db.create_table!(:constants){DateTime :ts}
862
862
  @ds.insert(:ts=>Sequel::CURRENT_TIMESTAMP)
863
- (Time.now - @c[@ds.get(:ts)]).should be_within(60).of(0)
863
+ (Time.now - @c[@ds.get(:ts)]).must_be_close_to 0, 60
864
864
  end
865
865
 
866
866
  cspecify "should have working CURRENT_TIMESTAMP when used as a column default", [:jdbc, :sqlite], [:swift] do
867
867
  @db.create_table!(:constants){DateTime :ts, :default=>Sequel::CURRENT_TIMESTAMP}
868
868
  @ds.insert
869
- (Time.now - @c[@ds.get(:ts)]).should be_within(60).of(0)
869
+ (Time.now - @c[@ds.get(:ts)]).must_be_close_to 0, 60
870
870
  end
871
871
  end
872
872
 
@@ -885,36 +885,36 @@ describe "Sequel::Dataset#import and #multi_insert" do
885
885
 
886
886
  it "should import with multi_insert and an array of hashes" do
887
887
  @ids.multi_insert([{:i=>10}, {:i=>20}])
888
- @ids.all.should == [{:i=>10}, {:i=>20}]
888
+ @ids.all.must_equal [{:i=>10}, {:i=>20}]
889
889
  end
890
890
 
891
891
  it "should import with an array of arrays of values" do
892
892
  @ids.import([:i], [[10], [20]])
893
- @ids.all.should == [{:i=>10}, {:i=>20}]
893
+ @ids.all.must_equal [{:i=>10}, {:i=>20}]
894
894
  end
895
895
 
896
896
  it "should import with a dataset" do
897
897
  @db.create_table!(:exp2){Integer :i}
898
898
  @db[:exp2].import([:i], [[10], [20]])
899
899
  @ids.import([:i], @db[:exp2])
900
- @ids.all.should == [{:i=>10}, {:i=>20}]
900
+ @ids.all.must_equal [{:i=>10}, {:i=>20}]
901
901
  @db.drop_table(:exp2)
902
902
  end
903
903
 
904
904
  it "should have import work with the :slice_size option" do
905
905
  @ids.import([:i], [[10], [20], [30]], :slice_size=>1)
906
- @ids.all.should == [{:i=>10}, {:i=>20}, {:i=>30}]
906
+ @ids.all.must_equal [{:i=>10}, {:i=>20}, {:i=>30}]
907
907
  @ids.delete
908
908
  @ids.import([:i], [[10], [20], [30]], :slice_size=>2)
909
- @ids.all.should == [{:i=>10}, {:i=>20}, {:i=>30}]
909
+ @ids.all.must_equal [{:i=>10}, {:i=>20}, {:i=>30}]
910
910
  @ids.delete
911
911
  @ids.import([:i], [[10], [20], [30]], :slice_size=>3)
912
- @ids.all.should == [{:i=>10}, {:i=>20}, {:i=>30}]
912
+ @ids.all.must_equal [{:i=>10}, {:i=>20}, {:i=>30}]
913
913
  end
914
914
 
915
915
  it "should import many rows at once" do
916
916
  @ids.import([:i], (1..1000).to_a.map{|x| [x]})
917
- @ids.select_order_map(:i).should == (1..1000).to_a
917
+ @ids.select_order_map(:i).must_equal((1..1000).to_a)
918
918
  end
919
919
  end
920
920
 
@@ -928,16 +928,16 @@ describe "Sequel::Dataset#import and #multi_insert :return=>:primary_key " do
928
928
  @db.drop_table?(:imp)
929
929
  end
930
930
 
931
- specify "should return primary key values" do
932
- @ds.multi_insert([{:i=>10}, {:i=>20}, {:i=>30}], :return=>:primary_key).should == [1, 2, 3]
933
- @ds.import([:i], [[40], [50], [60]], :return=>:primary_key).should == [4, 5, 6]
934
- @ds.order(:id).map([:id, :i]).should == [[1, 10], [2, 20], [3, 30], [4, 40], [5, 50], [6, 60]]
931
+ it "should return primary key values" do
932
+ @ds.multi_insert([{:i=>10}, {:i=>20}, {:i=>30}], :return=>:primary_key).must_equal [1, 2, 3]
933
+ @ds.import([:i], [[40], [50], [60]], :return=>:primary_key).must_equal [4, 5, 6]
934
+ @ds.order(:id).map([:id, :i]).must_equal [[1, 10], [2, 20], [3, 30], [4, 40], [5, 50], [6, 60]]
935
935
  end
936
936
 
937
- specify "should return primary key values when :slice is used" do
938
- @ds.multi_insert([{:i=>10}, {:i=>20}, {:i=>30}], :return=>:primary_key, :slice=>2).should == [1, 2, 3]
939
- @ds.import([:i], [[40], [50], [60]], :return=>:primary_key, :slice=>2).should == [4, 5, 6]
940
- @ds.order(:id).map([:id, :i]).should == [[1, 10], [2, 20], [3, 30], [4, 40], [5, 50], [6, 60]]
937
+ it "should return primary key values when :slice is used" do
938
+ @ds.multi_insert([{:i=>10}, {:i=>20}, {:i=>30}], :return=>:primary_key, :slice=>2).must_equal [1, 2, 3]
939
+ @ds.import([:i], [[40], [50], [60]], :return=>:primary_key, :slice=>2).must_equal [4, 5, 6]
940
+ @ds.order(:id).map([:id, :i]).must_equal [[1, 10], [2, 20], [3, 30], [4, 40], [5, 50], [6, 60]]
941
941
  end
942
942
  end
943
943
 
@@ -957,13 +957,13 @@ describe "Sequel::Dataset convenience methods" do
957
957
  end
958
958
 
959
959
  it "#group_rollup should include hierarchy of groupings" do
960
- @ds.group_by(:a).group_rollup.select_map([:a, Sequel.function(:sum, :b).cast(Integer).as(:b), Sequel.function(:sum, :c).cast(Integer).as(:c)]).sort_by{|x| x.inspect}.should == [[1, 10, 16], [2, 7, 11], [nil, 17, 27]]
961
- @ds.group_by(:a, :b).group_rollup.select_map([:a, :b, Sequel.function(:sum, :c).cast(Integer).as(:c)]).sort_by{|x| x.inspect}.should == [[1, 3, 11], [1, 4, 5], [1, nil, 16], [2, 3, 5], [2, 4, 6], [2, nil, 11], [nil, nil, 27]]
960
+ @ds.group_by(:a).group_rollup.select_map([:a, Sequel.function(:sum, :b).cast(Integer).as(:b), Sequel.function(:sum, :c).cast(Integer).as(:c)]).sort_by{|x| x.inspect}.must_equal [[1, 10, 16], [2, 7, 11], [nil, 17, 27]]
961
+ @ds.group_by(:a, :b).group_rollup.select_map([:a, :b, Sequel.function(:sum, :c).cast(Integer).as(:c)]).sort_by{|x| x.inspect}.must_equal [[1, 3, 11], [1, 4, 5], [1, nil, 16], [2, 3, 5], [2, 4, 6], [2, nil, 11], [nil, nil, 27]]
962
962
  end if DB.dataset.supports_group_rollup?
963
963
 
964
964
  it "#group_cube should include all combinations of groupings" do
965
- @ds.group_by(:a).group_cube.select_map([:a, Sequel.function(:sum, :b).cast(Integer).as(:b), Sequel.function(:sum, :c).cast(Integer).as(:c)]).sort_by{|x| x.inspect}.should == [[1, 10, 16], [2, 7, 11], [nil, 17, 27]]
966
- @ds.group_by(:a, :b).group_cube.select_map([:a, :b, Sequel.function(:sum, :c).cast(Integer).as(:c)]).sort_by{|x| x.inspect}.should == [[1, 3, 11], [1, 4, 5], [1, nil, 16], [2, 3, 5], [2, 4, 6], [2, nil, 11], [nil, 3, 16], [nil, 4, 11], [nil, nil, 27]]
965
+ @ds.group_by(:a).group_cube.select_map([:a, Sequel.function(:sum, :b).cast(Integer).as(:b), Sequel.function(:sum, :c).cast(Integer).as(:c)]).sort_by{|x| x.inspect}.must_equal [[1, 10, 16], [2, 7, 11], [nil, 17, 27]]
966
+ @ds.group_by(:a, :b).group_cube.select_map([:a, :b, Sequel.function(:sum, :c).cast(Integer).as(:c)]).sort_by{|x| x.inspect}.must_equal [[1, 3, 11], [1, 4, 5], [1, nil, 16], [2, 3, 5], [2, 4, 6], [2, nil, 11], [nil, 3, 16], [nil, 4, 11], [nil, nil, 27]]
967
967
  end if DB.dataset.supports_group_cube?
968
968
  end
969
969
 
@@ -983,65 +983,65 @@ describe "Sequel::Dataset convenience methods" do
983
983
  it "#[]= should update matching rows" do
984
984
  @ds.insert(20, 10)
985
985
  @ds.extension(:sequel_3_dataset_methods)[:a=>20] = {:b=>30}
986
- @ds.all.should == [{:a=>20, :b=>30}]
986
+ @ds.all.must_equal [{:a=>20, :b=>30}]
987
987
  end
988
988
 
989
989
  it "#empty? should return whether the dataset returns no rows" do
990
- @ds.empty?.should == true
990
+ @ds.empty?.must_equal true
991
991
  @ds.insert(20, 10)
992
- @ds.empty?.should == false
992
+ @ds.empty?.must_equal false
993
993
  end
994
994
 
995
995
  it "#empty? should work correctly for datasets with limits" do
996
996
  ds = @ds.limit(1)
997
- ds.empty?.should == true
997
+ ds.empty?.must_equal true
998
998
  ds.insert(20, 10)
999
- ds.empty?.should == false
999
+ ds.empty?.must_equal false
1000
1000
  end
1001
1001
 
1002
1002
  it "#empty? should work correctly for datasets with limits and offsets" do
1003
1003
  ds = @ds.limit(1, 1)
1004
- ds.empty?.should == true
1004
+ ds.empty?.must_equal true
1005
1005
  ds.insert(20, 10)
1006
- ds.empty?.should == true
1006
+ ds.empty?.must_equal true
1007
1007
  ds.insert(20, 10)
1008
- ds.empty?.should == false
1008
+ ds.empty?.must_equal false
1009
1009
  end
1010
1010
 
1011
1011
  it "#group_and_count should return a grouping by count" do
1012
- @ds.group_and_count(:a).order{count(:a)}.all.should == []
1012
+ @ds.group_and_count(:a).order{count(:a)}.all.must_equal []
1013
1013
  @ds.insert(20, 10)
1014
- @ds.group_and_count(:a).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.should == [{:a=>20, :count=>1}]
1014
+ @ds.group_and_count(:a).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.must_equal [{:a=>20, :count=>1}]
1015
1015
  @ds.insert(20, 30)
1016
- @ds.group_and_count(:a).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.should == [{:a=>20, :count=>2}]
1016
+ @ds.group_and_count(:a).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.must_equal [{:a=>20, :count=>2}]
1017
1017
  @ds.insert(30, 30)
1018
- @ds.group_and_count(:a).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.should == [{:a=>30, :count=>1}, {:a=>20, :count=>2}]
1018
+ @ds.group_and_count(:a).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.must_equal [{:a=>30, :count=>1}, {:a=>20, :count=>2}]
1019
1019
  end
1020
1020
 
1021
1021
  it "#group_and_count should support column aliases" do
1022
- @ds.group_and_count(:a___c).order{count(:a)}.all.should == []
1022
+ @ds.group_and_count(:a___c).order{count(:a)}.all.must_equal []
1023
1023
  @ds.insert(20, 10)
1024
- @ds.group_and_count(:a___c).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.should == [{:c=>20, :count=>1}]
1024
+ @ds.group_and_count(:a___c).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.must_equal [{:c=>20, :count=>1}]
1025
1025
  @ds.insert(20, 30)
1026
- @ds.group_and_count(:a___c).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.should == [{:c=>20, :count=>2}]
1026
+ @ds.group_and_count(:a___c).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.must_equal [{:c=>20, :count=>2}]
1027
1027
  @ds.insert(30, 30)
1028
- @ds.group_and_count(:a___c).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.should == [{:c=>30, :count=>1}, {:c=>20, :count=>2}]
1028
+ @ds.group_and_count(:a___c).order{count(:a)}.all.each{|h| h[:count] = h[:count].to_i}.must_equal [{:c=>30, :count=>1}, {:c=>20, :count=>2}]
1029
1029
  end
1030
1030
 
1031
- specify "#range should return the range between the maximum and minimum values" do
1031
+ it "#range should return the range between the maximum and minimum values" do
1032
1032
  @ds = @ds.unordered
1033
1033
  @ds.insert(20, 10)
1034
1034
  @ds.insert(30, 10)
1035
- @ds.range(:a).should == (20..30)
1036
- @ds.range(:b).should == (10..10)
1035
+ @ds.range(:a).must_equal(20..30)
1036
+ @ds.range(:b).must_equal(10..10)
1037
1037
  end
1038
1038
 
1039
1039
  it "#interval should return the different between the maximum and minimum values" do
1040
1040
  @ds = @ds.unordered
1041
1041
  @ds.insert(20, 10)
1042
1042
  @ds.insert(30, 10)
1043
- @ds.interval(:a).to_i.should == 10
1044
- @ds.interval(:b).to_i.should == 0
1043
+ @ds.interval(:a).to_i.must_equal 10
1044
+ @ds.interval(:b).to_i.must_equal 0
1045
1045
  end
1046
1046
  end
1047
1047
 
@@ -1059,60 +1059,60 @@ describe "Sequel::Dataset main SQL methods" do
1059
1059
  end
1060
1060
 
1061
1061
  it "#exists should return a usable exists clause" do
1062
- @ds.filter(@db[:d___c].filter(:c__a=>:d__b).exists).all.should == []
1062
+ @ds.filter(@db[:d___c].filter(:c__a=>:d__b).exists).all.must_equal []
1063
1063
  @ds.insert(20, 30)
1064
1064
  @ds.insert(10, 20)
1065
- @ds.filter(@db[:d___c].filter(:c__a=>:d__b).exists).all.should == [{:a=>10, :b=>20}]
1065
+ @ds.filter(@db[:d___c].filter(:c__a=>:d__b).exists).all.must_equal [{:a=>10, :b=>20}]
1066
1066
  end
1067
1067
 
1068
1068
  it "#filter and #exclude should work with placeholder strings" do
1069
1069
  @ds.insert(20, 30)
1070
- @ds.filter("a > ?", 15).all.should == [{:a=>20, :b=>30}]
1071
- @ds.exclude("b < ?", 15).all.should == [{:a=>20, :b=>30}]
1072
- @ds.filter("b < ?", 15).invert.all.should == [{:a=>20, :b=>30}]
1070
+ @ds.filter("a > ?", 15).all.must_equal [{:a=>20, :b=>30}]
1071
+ @ds.exclude("b < ?", 15).all.must_equal [{:a=>20, :b=>30}]
1072
+ @ds.filter("b < ?", 15).invert.all.must_equal [{:a=>20, :b=>30}]
1073
1073
  end
1074
1074
 
1075
1075
  it "#and and #or should work correctly" do
1076
1076
  @ds.insert(20, 30)
1077
- @ds.filter(:a=>20).and(:b=>30).all.should == [{:a=>20, :b=>30}]
1078
- @ds.filter(:a=>20).and(:b=>15).all.should == []
1079
- @ds.filter(:a=>20).or(:b=>15).all.should == [{:a=>20, :b=>30}]
1080
- @ds.filter(:a=>10).or(:b=>15).all.should == []
1077
+ @ds.filter(:a=>20).and(:b=>30).all.must_equal [{:a=>20, :b=>30}]
1078
+ @ds.filter(:a=>20).and(:b=>15).all.must_equal []
1079
+ @ds.filter(:a=>20).or(:b=>15).all.must_equal [{:a=>20, :b=>30}]
1080
+ @ds.filter(:a=>10).or(:b=>15).all.must_equal []
1081
1081
  end
1082
1082
 
1083
1083
  it "#select_group should work correctly" do
1084
1084
  @ds.unordered!
1085
- @ds.select_group(:a).all.should == []
1085
+ @ds.select_group(:a).all.must_equal []
1086
1086
  @ds.insert(20, 30)
1087
- @ds.select_group(:a).all.should == [{:a=>20}]
1088
- @ds.select_group(:b).all.should == [{:b=>30}]
1087
+ @ds.select_group(:a).all.must_equal [{:a=>20}]
1088
+ @ds.select_group(:b).all.must_equal [{:b=>30}]
1089
1089
  @ds.insert(20, 40)
1090
- @ds.select_group(:a).all.should == [{:a=>20}]
1091
- @ds.order(:b).select_group(:b).all.should == [{:b=>30}, {:b=>40}]
1090
+ @ds.select_group(:a).all.must_equal [{:a=>20}]
1091
+ @ds.order(:b).select_group(:b).all.must_equal [{:b=>30}, {:b=>40}]
1092
1092
  end
1093
1093
 
1094
1094
  it "#select_group should work correctly when aliasing" do
1095
1095
  @ds.unordered!
1096
1096
  @ds.insert(20, 30)
1097
- @ds.select_group(:b___c).all.should == [{:c=>30}]
1097
+ @ds.select_group(:b___c).all.must_equal [{:c=>30}]
1098
1098
  end
1099
1099
 
1100
1100
  it "#having should work correctly" do
1101
1101
  @ds.unordered!
1102
- @ds.select{[b, max(a).as(c)]}.group(:b).having{max(a) > 30}.all.should == []
1102
+ @ds.select{[b, max(a).as(c)]}.group(:b).having{max(a) > 30}.all.must_equal []
1103
1103
  @ds.insert(20, 30)
1104
- @ds.select{[b, max(a).as(c)]}.group(:b).having{max(a) > 30}.all.should == []
1104
+ @ds.select{[b, max(a).as(c)]}.group(:b).having{max(a) > 30}.all.must_equal []
1105
1105
  @ds.insert(40, 20)
1106
- @ds.select{[b, max(a).as(c)]}.group(:b).having{max(a) > 30}.all.each{|h| h[:c] = h[:c].to_i}.should == [{:b=>20, :c=>40}]
1106
+ @ds.select{[b, max(a).as(c)]}.group(:b).having{max(a) > 30}.all.each{|h| h[:c] = h[:c].to_i}.must_equal [{:b=>20, :c=>40}]
1107
1107
  end
1108
1108
 
1109
1109
  cspecify "#having should work without a previous group", :sqlite do
1110
1110
  @ds.unordered!
1111
- @ds.select{max(a).as(c)}.having{max(a) > 30}.all.should == []
1111
+ @ds.select{max(a).as(c)}.having{max(a) > 30}.all.must_equal []
1112
1112
  @ds.insert(20, 30)
1113
- @ds.select{max(a).as(c)}.having{max(a) > 30}.all.should == []
1113
+ @ds.select{max(a).as(c)}.having{max(a) > 30}.all.must_equal []
1114
1114
  @ds.insert(40, 20)
1115
- @ds.select{max(a).as(c)}.having{max(a) > 30}.all.each{|h| h[:c] = h[:c].to_i}.should == [{:c=>40}]
1115
+ @ds.select{max(a).as(c)}.having{max(a) > 30}.all.each{|h| h[:c] = h[:c].to_i}.must_equal [{:c=>40}]
1116
1116
  end
1117
1117
  end
1118
1118
 
@@ -1131,90 +1131,90 @@ describe "Sequel::Dataset convenience methods" do
1131
1131
  @db.drop_table?(:a)
1132
1132
  end
1133
1133
 
1134
- specify "should have working #map" do
1135
- @ds.map(:a).should == [1, 5]
1136
- @ds.map(:b).should == [2, 6]
1137
- @ds.map([:a, :b]).should == [[1, 2], [5, 6]]
1134
+ it "should have working #map" do
1135
+ @ds.map(:a).must_equal [1, 5]
1136
+ @ds.map(:b).must_equal [2, 6]
1137
+ @ds.map([:a, :b]).must_equal [[1, 2], [5, 6]]
1138
1138
  end
1139
1139
 
1140
- specify "should have working #to_hash" do
1141
- @ds.to_hash(:a).should == {1=>{:a=>1, :b=>2, :c=>3, :d=>4}, 5=>{:a=>5, :b=>6, :c=>7, :d=>8}}
1142
- @ds.to_hash(:b).should == {2=>{:a=>1, :b=>2, :c=>3, :d=>4}, 6=>{:a=>5, :b=>6, :c=>7, :d=>8}}
1143
- @ds.to_hash([:a, :b]).should == {[1, 2]=>{:a=>1, :b=>2, :c=>3, :d=>4}, [5, 6]=>{:a=>5, :b=>6, :c=>7, :d=>8}}
1140
+ it "should have working #to_hash" do
1141
+ @ds.to_hash(:a).must_equal(1=>{:a=>1, :b=>2, :c=>3, :d=>4}, 5=>{:a=>5, :b=>6, :c=>7, :d=>8})
1142
+ @ds.to_hash(:b).must_equal(2=>{:a=>1, :b=>2, :c=>3, :d=>4}, 6=>{:a=>5, :b=>6, :c=>7, :d=>8})
1143
+ @ds.to_hash([:a, :b]).must_equal([1, 2]=>{:a=>1, :b=>2, :c=>3, :d=>4}, [5, 6]=>{:a=>5, :b=>6, :c=>7, :d=>8})
1144
1144
 
1145
- @ds.to_hash(:a, :b).should == {1=>2, 5=>6}
1146
- @ds.to_hash([:a, :c], :b).should == {[1, 3]=>2, [5, 7]=>6}
1147
- @ds.to_hash(:a, [:b, :c]).should == {1=>[2, 3], 5=>[6, 7]}
1148
- @ds.to_hash([:a, :c], [:b, :d]).should == {[1, 3]=>[2, 4], [5, 7]=>[6, 8]}
1145
+ @ds.to_hash(:a, :b).must_equal(1=>2, 5=>6)
1146
+ @ds.to_hash([:a, :c], :b).must_equal([1, 3]=>2, [5, 7]=>6)
1147
+ @ds.to_hash(:a, [:b, :c]).must_equal(1=>[2, 3], 5=>[6, 7])
1148
+ @ds.to_hash([:a, :c], [:b, :d]).must_equal([1, 3]=>[2, 4], [5, 7]=>[6, 8])
1149
1149
  end
1150
1150
 
1151
- specify "should have working #to_hash_groups" do
1151
+ it "should have working #to_hash_groups" do
1152
1152
  ds = @ds.order(*@ds.columns)
1153
1153
  ds.insert(1, 2, 3, 9)
1154
- ds.to_hash_groups(:a).should == {1=>[{:a=>1, :b=>2, :c=>3, :d=>4}, {:a=>1, :b=>2, :c=>3, :d=>9}], 5=>[{:a=>5, :b=>6, :c=>7, :d=>8}]}
1155
- ds.to_hash_groups(:b).should == {2=>[{:a=>1, :b=>2, :c=>3, :d=>4}, {:a=>1, :b=>2, :c=>3, :d=>9}], 6=>[{:a=>5, :b=>6, :c=>7, :d=>8}]}
1156
- ds.to_hash_groups([:a, :b]).should == {[1, 2]=>[{:a=>1, :b=>2, :c=>3, :d=>4}, {:a=>1, :b=>2, :c=>3, :d=>9}], [5, 6]=>[{:a=>5, :b=>6, :c=>7, :d=>8}]}
1157
-
1158
- ds.to_hash_groups(:a, :d).should == {1=>[4, 9], 5=>[8]}
1159
- ds.to_hash_groups([:a, :c], :d).should == {[1, 3]=>[4, 9], [5, 7]=>[8]}
1160
- ds.to_hash_groups(:a, [:b, :d]).should == {1=>[[2, 4], [2, 9]], 5=>[[6, 8]]}
1161
- ds.to_hash_groups([:a, :c], [:b, :d]).should == {[1, 3]=>[[2, 4], [2, 9]], [5, 7]=>[[6, 8]]}
1162
- end
1163
-
1164
- specify "should have working #select_map" do
1165
- @ds.select_map(:a).should == [1, 5]
1166
- @ds.select_map(:b).should == [2, 6]
1167
- @ds.select_map([:a]).should == [[1], [5]]
1168
- @ds.select_map([:a, :b]).should == [[1, 2], [5, 6]]
1169
-
1170
- @ds.select_map(:a___e).should == [1, 5]
1171
- @ds.select_map(:b___e).should == [2, 6]
1172
- @ds.select_map([:a___e, :b___f]).should == [[1, 2], [5, 6]]
1173
- @ds.select_map([:a__a___e, :a__b___f]).should == [[1, 2], [5, 6]]
1174
- @ds.select_map([Sequel.expr(:a__a).as(:e), Sequel.expr(:a__b).as(:f)]).should == [[1, 2], [5, 6]]
1175
- @ds.select_map([Sequel.qualify(:a, :a).as(:e), Sequel.qualify(:a, :b).as(:f)]).should == [[1, 2], [5, 6]]
1176
- @ds.select_map([Sequel.identifier(:a).qualify(:a).as(:e), Sequel.qualify(:a, :b).as(:f)]).should == [[1, 2], [5, 6]]
1177
- end
1178
-
1179
- specify "should have working #select_order_map" do
1180
- @ds.select_order_map(:a).should == [1, 5]
1181
- @ds.select_order_map(Sequel.desc(:a__b)).should == [6, 2]
1182
- @ds.select_order_map(Sequel.desc(:a__b___e)).should == [6, 2]
1183
- @ds.select_order_map(Sequel.qualify(:a, :b).as(:e)).should == [2, 6]
1184
- @ds.select_order_map([:a]).should == [[1], [5]]
1185
- @ds.select_order_map([Sequel.desc(:a), :b]).should == [[5, 6], [1, 2]]
1186
-
1187
- @ds.select_order_map(:a___e).should == [1, 5]
1188
- @ds.select_order_map(:b___e).should == [2, 6]
1189
- @ds.select_order_map([Sequel.desc(:a___e), :b___f]).should == [[5, 6], [1, 2]]
1190
- @ds.select_order_map([Sequel.desc(:a__a___e), :a__b___f]).should == [[5, 6], [1, 2]]
1191
- @ds.select_order_map([Sequel.desc(:a__a), Sequel.expr(:a__b).as(:f)]).should == [[5, 6], [1, 2]]
1192
- @ds.select_order_map([Sequel.qualify(:a, :a).desc, Sequel.qualify(:a, :b).as(:f)]).should == [[5, 6], [1, 2]]
1193
- @ds.select_order_map([Sequel.identifier(:a).qualify(:a).desc, Sequel.qualify(:a, :b).as(:f)]).should == [[5, 6], [1, 2]]
1194
- end
1195
-
1196
- specify "should have working #select_hash" do
1197
- @ds.select_hash(:a, :b).should == {1=>2, 5=>6}
1198
- @ds.select_hash(:a__a___e, :b).should == {1=>2, 5=>6}
1199
- @ds.select_hash(Sequel.expr(:a__a).as(:e), :b).should == {1=>2, 5=>6}
1200
- @ds.select_hash(Sequel.qualify(:a, :a).as(:e), :b).should == {1=>2, 5=>6}
1201
- @ds.select_hash(Sequel.identifier(:a).qualify(:a).as(:e), :b).should == {1=>2, 5=>6}
1202
- @ds.select_hash([:a, :c], :b).should == {[1, 3]=>2, [5, 7]=>6}
1203
- @ds.select_hash(:a, [:b, :c]).should == {1=>[2, 3], 5=>[6, 7]}
1204
- @ds.select_hash([:a, :c], [:b, :d]).should == {[1, 3]=>[2, 4], [5, 7]=>[6, 8]}
1205
- end
1206
-
1207
- specify "should have working #select_hash_groups" do
1154
+ ds.to_hash_groups(:a).must_equal(1=>[{:a=>1, :b=>2, :c=>3, :d=>4}, {:a=>1, :b=>2, :c=>3, :d=>9}], 5=>[{:a=>5, :b=>6, :c=>7, :d=>8}])
1155
+ ds.to_hash_groups(:b).must_equal(2=>[{:a=>1, :b=>2, :c=>3, :d=>4}, {:a=>1, :b=>2, :c=>3, :d=>9}], 6=>[{:a=>5, :b=>6, :c=>7, :d=>8}])
1156
+ ds.to_hash_groups([:a, :b]).must_equal([1, 2]=>[{:a=>1, :b=>2, :c=>3, :d=>4}, {:a=>1, :b=>2, :c=>3, :d=>9}], [5, 6]=>[{:a=>5, :b=>6, :c=>7, :d=>8}])
1157
+
1158
+ ds.to_hash_groups(:a, :d).must_equal(1=>[4, 9], 5=>[8])
1159
+ ds.to_hash_groups([:a, :c], :d).must_equal([1, 3]=>[4, 9], [5, 7]=>[8])
1160
+ ds.to_hash_groups(:a, [:b, :d]).must_equal(1=>[[2, 4], [2, 9]], 5=>[[6, 8]])
1161
+ ds.to_hash_groups([:a, :c], [:b, :d]).must_equal([1, 3]=>[[2, 4], [2, 9]], [5, 7]=>[[6, 8]])
1162
+ end
1163
+
1164
+ it "should have working #select_map" do
1165
+ @ds.select_map(:a).must_equal [1, 5]
1166
+ @ds.select_map(:b).must_equal [2, 6]
1167
+ @ds.select_map([:a]).must_equal [[1], [5]]
1168
+ @ds.select_map([:a, :b]).must_equal [[1, 2], [5, 6]]
1169
+
1170
+ @ds.select_map(:a___e).must_equal [1, 5]
1171
+ @ds.select_map(:b___e).must_equal [2, 6]
1172
+ @ds.select_map([:a___e, :b___f]).must_equal [[1, 2], [5, 6]]
1173
+ @ds.select_map([:a__a___e, :a__b___f]).must_equal [[1, 2], [5, 6]]
1174
+ @ds.select_map([Sequel.expr(:a__a).as(:e), Sequel.expr(:a__b).as(:f)]).must_equal [[1, 2], [5, 6]]
1175
+ @ds.select_map([Sequel.qualify(:a, :a).as(:e), Sequel.qualify(:a, :b).as(:f)]).must_equal [[1, 2], [5, 6]]
1176
+ @ds.select_map([Sequel.identifier(:a).qualify(:a).as(:e), Sequel.qualify(:a, :b).as(:f)]).must_equal [[1, 2], [5, 6]]
1177
+ end
1178
+
1179
+ it "should have working #select_order_map" do
1180
+ @ds.select_order_map(:a).must_equal [1, 5]
1181
+ @ds.select_order_map(Sequel.desc(:a__b)).must_equal [6, 2]
1182
+ @ds.select_order_map(Sequel.desc(:a__b___e)).must_equal [6, 2]
1183
+ @ds.select_order_map(Sequel.qualify(:a, :b).as(:e)).must_equal [2, 6]
1184
+ @ds.select_order_map([:a]).must_equal [[1], [5]]
1185
+ @ds.select_order_map([Sequel.desc(:a), :b]).must_equal [[5, 6], [1, 2]]
1186
+
1187
+ @ds.select_order_map(:a___e).must_equal [1, 5]
1188
+ @ds.select_order_map(:b___e).must_equal [2, 6]
1189
+ @ds.select_order_map([Sequel.desc(:a___e), :b___f]).must_equal [[5, 6], [1, 2]]
1190
+ @ds.select_order_map([Sequel.desc(:a__a___e), :a__b___f]).must_equal [[5, 6], [1, 2]]
1191
+ @ds.select_order_map([Sequel.desc(:a__a), Sequel.expr(:a__b).as(:f)]).must_equal [[5, 6], [1, 2]]
1192
+ @ds.select_order_map([Sequel.qualify(:a, :a).desc, Sequel.qualify(:a, :b).as(:f)]).must_equal [[5, 6], [1, 2]]
1193
+ @ds.select_order_map([Sequel.identifier(:a).qualify(:a).desc, Sequel.qualify(:a, :b).as(:f)]).must_equal [[5, 6], [1, 2]]
1194
+ end
1195
+
1196
+ it "should have working #select_hash" do
1197
+ @ds.select_hash(:a, :b).must_equal(1=>2, 5=>6)
1198
+ @ds.select_hash(:a__a___e, :b).must_equal(1=>2, 5=>6)
1199
+ @ds.select_hash(Sequel.expr(:a__a).as(:e), :b).must_equal(1=>2, 5=>6)
1200
+ @ds.select_hash(Sequel.qualify(:a, :a).as(:e), :b).must_equal(1=>2, 5=>6)
1201
+ @ds.select_hash(Sequel.identifier(:a).qualify(:a).as(:e), :b).must_equal(1=>2, 5=>6)
1202
+ @ds.select_hash([:a, :c], :b).must_equal([1, 3]=>2, [5, 7]=>6)
1203
+ @ds.select_hash(:a, [:b, :c]).must_equal(1=>[2, 3], 5=>[6, 7])
1204
+ @ds.select_hash([:a, :c], [:b, :d]).must_equal([1, 3]=>[2, 4], [5, 7]=>[6, 8])
1205
+ end
1206
+
1207
+ it "should have working #select_hash_groups" do
1208
1208
  ds = @ds.order(*@ds.columns)
1209
1209
  ds.insert(1, 2, 3, 9)
1210
- ds.select_hash_groups(:a, :d).should == {1=>[4, 9], 5=>[8]}
1211
- ds.select_hash_groups(:a__a___e, :d).should == {1=>[4, 9], 5=>[8]}
1212
- ds.select_hash_groups(Sequel.expr(:a__a).as(:e), :d).should == {1=>[4, 9], 5=>[8]}
1213
- ds.select_hash_groups(Sequel.qualify(:a, :a).as(:e), :d).should == {1=>[4, 9], 5=>[8]}
1214
- ds.select_hash_groups(Sequel.identifier(:a).qualify(:a).as(:e), :d).should == {1=>[4, 9], 5=>[8]}
1215
- ds.select_hash_groups([:a, :c], :d).should == {[1, 3]=>[4, 9], [5, 7]=>[8]}
1216
- ds.select_hash_groups(:a, [:b, :d]).should == {1=>[[2, 4], [2, 9]], 5=>[[6, 8]]}
1217
- ds.select_hash_groups([:a, :c], [:b, :d]).should == {[1, 3]=>[[2, 4], [2, 9]], [5, 7]=>[[6, 8]]}
1210
+ ds.select_hash_groups(:a, :d).must_equal(1=>[4, 9], 5=>[8])
1211
+ ds.select_hash_groups(:a__a___e, :d).must_equal(1=>[4, 9], 5=>[8])
1212
+ ds.select_hash_groups(Sequel.expr(:a__a).as(:e), :d).must_equal(1=>[4, 9], 5=>[8])
1213
+ ds.select_hash_groups(Sequel.qualify(:a, :a).as(:e), :d).must_equal(1=>[4, 9], 5=>[8])
1214
+ ds.select_hash_groups(Sequel.identifier(:a).qualify(:a).as(:e), :d).must_equal(1=>[4, 9], 5=>[8])
1215
+ ds.select_hash_groups([:a, :c], :d).must_equal([1, 3]=>[4, 9], [5, 7]=>[8])
1216
+ ds.select_hash_groups(:a, [:b, :d]).must_equal(1=>[[2, 4], [2, 9]], 5=>[[6, 8]])
1217
+ ds.select_hash_groups([:a, :c], [:b, :d]).must_equal([1, 3]=>[[2, 4], [2, 9]], [5, 7]=>[[6, 8]])
1218
1218
  end
1219
1219
  end
1220
1220
 
@@ -1233,151 +1233,151 @@ describe "Sequel::Dataset DSL support" do
1233
1233
 
1234
1234
  it "should work with standard mathematical operators" do
1235
1235
  @ds.insert(20, 10)
1236
- @ds.get{a + b}.to_i.should == 30
1237
- @ds.get{a - b}.to_i.should == 10
1238
- @ds.get{a * b}.to_i.should == 200
1239
- @ds.get{a / b}.to_i.should == 2
1236
+ @ds.get{a + b}.to_i.must_equal 30
1237
+ @ds.get{a - b}.to_i.must_equal 10
1238
+ @ds.get{a * b}.to_i.must_equal 200
1239
+ @ds.get{a / b}.to_i.must_equal 2
1240
1240
  end
1241
1241
 
1242
1242
  cspecify "should work with bitwise shift operators", :derby do
1243
1243
  @ds.insert(3, 2)
1244
- @ds.get{a.sql_number << b}.to_i.should == 12
1245
- @ds.get{a.sql_number >> b}.to_i.should == 0
1246
- @ds.get{a.sql_number << b << 1}.to_i.should == 24
1244
+ @ds.get{a.sql_number << b}.to_i.must_equal 12
1245
+ @ds.get{a.sql_number >> b}.to_i.must_equal 0
1246
+ @ds.get{a.sql_number << b << 1}.to_i.must_equal 24
1247
1247
  @ds.delete
1248
1248
  @ds.insert(3, 1)
1249
- @ds.get{a.sql_number << b}.to_i.should == 6
1250
- @ds.get{a.sql_number >> b}.to_i.should == 1
1251
- @ds.get{a.sql_number >> b >> 1}.to_i.should == 0
1249
+ @ds.get{a.sql_number << b}.to_i.must_equal 6
1250
+ @ds.get{a.sql_number >> b}.to_i.must_equal 1
1251
+ @ds.get{a.sql_number >> b >> 1}.to_i.must_equal 0
1252
1252
  end
1253
1253
 
1254
1254
  cspecify "should work with bitwise AND and OR operators", :derby do
1255
1255
  @ds.insert(3, 5)
1256
- @ds.get{a.sql_number | b}.to_i.should == 7
1257
- @ds.get{a.sql_number & b}.to_i.should == 1
1258
- @ds.get{a.sql_number | b | 8}.to_i.should == 15
1259
- @ds.get{a.sql_number & b & 8}.to_i.should == 0
1256
+ @ds.get{a.sql_number | b}.to_i.must_equal 7
1257
+ @ds.get{a.sql_number & b}.to_i.must_equal 1
1258
+ @ds.get{a.sql_number | b | 8}.to_i.must_equal 15
1259
+ @ds.get{a.sql_number & b & 8}.to_i.must_equal 0
1260
1260
  end
1261
1261
 
1262
- specify "should work with the bitwise compliment operator" do
1262
+ it "should work with the bitwise compliment operator" do
1263
1263
  @ds.insert(-3, 3)
1264
- @ds.get{~a.sql_number}.to_i.should == 2
1265
- @ds.get{~b.sql_number}.to_i.should == -4
1264
+ @ds.get{~a.sql_number}.to_i.must_equal 2
1265
+ @ds.get{~b.sql_number}.to_i.must_equal(-4)
1266
1266
  end
1267
1267
 
1268
1268
  cspecify "should work with the bitwise xor operator", :derby do
1269
1269
  @ds.insert(3, 5)
1270
- @ds.get{a.sql_number ^ b}.to_i.should == 6
1271
- @ds.get{a.sql_number ^ b ^ 1}.to_i.should == 7
1270
+ @ds.get{a.sql_number ^ b}.to_i.must_equal 6
1271
+ @ds.get{a.sql_number ^ b ^ 1}.to_i.must_equal 7
1272
1272
  end
1273
1273
 
1274
- specify "should work with the modulus operator" do
1274
+ it "should work with the modulus operator" do
1275
1275
  @ds.insert(3, 5)
1276
- @ds.get{a.sql_number % 4}.to_i.should == 3
1277
- @ds.get{b.sql_number % 4}.to_i.should == 1
1278
- @ds.get{a.sql_number % 4 % 2}.to_i.should == 1
1276
+ @ds.get{a.sql_number % 4}.to_i.must_equal 3
1277
+ @ds.get{b.sql_number % 4}.to_i.must_equal 1
1278
+ @ds.get{a.sql_number % 4 % 2}.to_i.must_equal 1
1279
1279
  end
1280
1280
 
1281
- specify "should work with inequality operators" do
1281
+ it "should work with inequality operators" do
1282
1282
  @ds.insert(10, 11)
1283
1283
  @ds.insert(11, 11)
1284
1284
  @ds.insert(20, 19)
1285
1285
  @ds.insert(20, 20)
1286
- @ds.filter{a > b}.select_order_map(:a).should == [20]
1287
- @ds.filter{a >= b}.select_order_map(:a).should == [11, 20, 20]
1288
- @ds.filter{a < b}.select_order_map(:a).should == [10]
1289
- @ds.filter{a <= b}.select_order_map(:a).should == [10, 11, 20]
1286
+ @ds.filter{a > b}.select_order_map(:a).must_equal [20]
1287
+ @ds.filter{a >= b}.select_order_map(:a).must_equal [11, 20, 20]
1288
+ @ds.filter{a < b}.select_order_map(:a).must_equal [10]
1289
+ @ds.filter{a <= b}.select_order_map(:a).must_equal [10, 11, 20]
1290
1290
  end
1291
1291
 
1292
- specify "should work with casting and string concatentation" do
1292
+ it "should work with casting and string concatentation" do
1293
1293
  @ds.insert(20, 20)
1294
- @ds.get{Sequel.cast(a, String).sql_string + Sequel.cast(b, String)}.should == '2020'
1294
+ @ds.get{Sequel.cast(a, String).sql_string + Sequel.cast(b, String)}.must_equal '2020'
1295
1295
  end
1296
1296
 
1297
1297
  it "should work with ordering" do
1298
1298
  @ds.insert(10, 20)
1299
1299
  @ds.insert(20, 10)
1300
- @ds.order(:a, :b).all.should == [{:a=>10, :b=>20}, {:a=>20, :b=>10}]
1301
- @ds.order(Sequel.asc(:a), Sequel.asc(:b)).all.should == [{:a=>10, :b=>20}, {:a=>20, :b=>10}]
1302
- @ds.order(Sequel.desc(:a), Sequel.desc(:b)).all.should == [{:a=>20, :b=>10}, {:a=>10, :b=>20}]
1300
+ @ds.order(:a, :b).all.must_equal [{:a=>10, :b=>20}, {:a=>20, :b=>10}]
1301
+ @ds.order(Sequel.asc(:a), Sequel.asc(:b)).all.must_equal [{:a=>10, :b=>20}, {:a=>20, :b=>10}]
1302
+ @ds.order(Sequel.desc(:a), Sequel.desc(:b)).all.must_equal [{:a=>20, :b=>10}, {:a=>10, :b=>20}]
1303
1303
  end
1304
1304
 
1305
1305
  it "should work with qualifying" do
1306
1306
  @ds.insert(10, 20)
1307
- @ds.get(:a__b).should == 20
1308
- @ds.get{a__b}.should == 20
1309
- @ds.get(Sequel.qualify(:a, :b)).should == 20
1307
+ @ds.get(:a__b).must_equal 20
1308
+ @ds.get{a__b}.must_equal 20
1309
+ @ds.get(Sequel.qualify(:a, :b)).must_equal 20
1310
1310
  end
1311
1311
 
1312
1312
  it "should work with aliasing" do
1313
1313
  @ds.insert(10, 20)
1314
- @ds.get(:a__b___c).should == 20
1315
- @ds.get{a__b.as(c)}.should == 20
1316
- @ds.get(Sequel.qualify(:a, :b).as(:c)).should == 20
1317
- @ds.get(Sequel.as(:b, :c)).should == 20
1314
+ @ds.get(:a__b___c).must_equal 20
1315
+ @ds.get{a__b.as(c)}.must_equal 20
1316
+ @ds.get(Sequel.qualify(:a, :b).as(:c)).must_equal 20
1317
+ @ds.get(Sequel.as(:b, :c)).must_equal 20
1318
1318
  end
1319
1319
 
1320
1320
  it "should work with selecting all columns of a table" do
1321
1321
  @ds.insert(20, 10)
1322
- @ds.select_all(:a).all.should == [{:a=>20, :b=>10}]
1322
+ @ds.select_all(:a).all.must_equal [{:a=>20, :b=>10}]
1323
1323
  end
1324
1324
 
1325
1325
  it "should work with ranges as hash values" do
1326
1326
  @ds.insert(20, 10)
1327
- @ds.filter(:a=>(10..30)).all.should == [{:a=>20, :b=>10}]
1328
- @ds.filter(:a=>(25..30)).all.should == []
1329
- @ds.filter(:a=>(10..15)).all.should == []
1330
- @ds.exclude(:a=>(10..30)).all.should == []
1331
- @ds.exclude(:a=>(25..30)).all.should == [{:a=>20, :b=>10}]
1332
- @ds.exclude(:a=>(10..15)).all.should == [{:a=>20, :b=>10}]
1327
+ @ds.filter(:a=>(10..30)).all.must_equal [{:a=>20, :b=>10}]
1328
+ @ds.filter(:a=>(25..30)).all.must_equal []
1329
+ @ds.filter(:a=>(10..15)).all.must_equal []
1330
+ @ds.exclude(:a=>(10..30)).all.must_equal []
1331
+ @ds.exclude(:a=>(25..30)).all.must_equal [{:a=>20, :b=>10}]
1332
+ @ds.exclude(:a=>(10..15)).all.must_equal [{:a=>20, :b=>10}]
1333
1333
  end
1334
1334
 
1335
1335
  it "should work with nil as hash value" do
1336
1336
  @ds.insert(20, nil)
1337
- @ds.filter(:a=>nil).all.should == []
1338
- @ds.filter(:b=>nil).all.should == [{:a=>20, :b=>nil}]
1339
- @ds.exclude(:b=>nil).all.should == []
1340
- @ds.exclude(:a=>nil).all.should == [{:a=>20, :b=>nil}]
1337
+ @ds.filter(:a=>nil).all.must_equal []
1338
+ @ds.filter(:b=>nil).all.must_equal [{:a=>20, :b=>nil}]
1339
+ @ds.exclude(:b=>nil).all.must_equal []
1340
+ @ds.exclude(:a=>nil).all.must_equal [{:a=>20, :b=>nil}]
1341
1341
  end
1342
1342
 
1343
1343
  it "should work with arrays as hash values" do
1344
1344
  @ds.insert(20, 10)
1345
- @ds.filter(:a=>[10]).all.should == []
1346
- @ds.filter(:a=>[20, 10]).all.should == [{:a=>20, :b=>10}]
1347
- @ds.exclude(:a=>[10]).all.should == [{:a=>20, :b=>10}]
1348
- @ds.exclude(:a=>[20, 10]).all.should == []
1345
+ @ds.filter(:a=>[10]).all.must_equal []
1346
+ @ds.filter(:a=>[20, 10]).all.must_equal [{:a=>20, :b=>10}]
1347
+ @ds.exclude(:a=>[10]).all.must_equal [{:a=>20, :b=>10}]
1348
+ @ds.exclude(:a=>[20, 10]).all.must_equal []
1349
1349
  end
1350
1350
 
1351
1351
  it "should work with ranges as hash values" do
1352
1352
  @ds.insert(20, 10)
1353
- @ds.filter(:a=>(10..30)).all.should == [{:a=>20, :b=>10}]
1354
- @ds.filter(:a=>(25..30)).all.should == []
1355
- @ds.filter(:a=>(10..15)).all.should == []
1356
- @ds.exclude(:a=>(10..30)).all.should == []
1357
- @ds.exclude(:a=>(25..30)).all.should == [{:a=>20, :b=>10}]
1358
- @ds.exclude(:a=>(10..15)).all.should == [{:a=>20, :b=>10}]
1353
+ @ds.filter(:a=>(10..30)).all.must_equal [{:a=>20, :b=>10}]
1354
+ @ds.filter(:a=>(25..30)).all.must_equal []
1355
+ @ds.filter(:a=>(10..15)).all.must_equal []
1356
+ @ds.exclude(:a=>(10..30)).all.must_equal []
1357
+ @ds.exclude(:a=>(25..30)).all.must_equal [{:a=>20, :b=>10}]
1358
+ @ds.exclude(:a=>(10..15)).all.must_equal [{:a=>20, :b=>10}]
1359
1359
  end
1360
1360
 
1361
1361
  it "should work with CASE statements" do
1362
1362
  @ds.insert(20, 10)
1363
- @ds.filter(Sequel.case({{:a=>20}=>20}, 0) > 0).all.should == [{:a=>20, :b=>10}]
1364
- @ds.filter(Sequel.case({{:a=>15}=>20}, 0) > 0).all.should == []
1365
- @ds.filter(Sequel.case({20=>20}, 0, :a) > 0).all.should == [{:a=>20, :b=>10}]
1366
- @ds.filter(Sequel.case({15=>20}, 0, :a) > 0).all.should == []
1363
+ @ds.filter(Sequel.case({{:a=>20}=>20}, 0) > 0).all.must_equal [{:a=>20, :b=>10}]
1364
+ @ds.filter(Sequel.case({{:a=>15}=>20}, 0) > 0).all.must_equal []
1365
+ @ds.filter(Sequel.case({20=>20}, 0, :a) > 0).all.must_equal [{:a=>20, :b=>10}]
1366
+ @ds.filter(Sequel.case({15=>20}, 0, :a) > 0).all.must_equal []
1367
1367
  end
1368
1368
 
1369
- specify "should work with multiple value arrays" do
1369
+ it "should work with multiple value arrays" do
1370
1370
  @ds.insert(20, 10)
1371
1371
  @ds.quote_identifiers = false
1372
- @ds.filter([:a, :b]=>[[20, 10]]).all.should == [{:a=>20, :b=>10}]
1373
- @ds.filter([:a, :b]=>[[10, 20]]).all.should == []
1374
- @ds.filter([:a, :b]=>[[20, 10], [1, 2]]).all.should == [{:a=>20, :b=>10}]
1375
- @ds.filter([:a, :b]=>[[10, 10], [20, 20]]).all.should == []
1372
+ @ds.filter([:a, :b]=>[[20, 10]]).all.must_equal [{:a=>20, :b=>10}]
1373
+ @ds.filter([:a, :b]=>[[10, 20]]).all.must_equal []
1374
+ @ds.filter([:a, :b]=>[[20, 10], [1, 2]]).all.must_equal [{:a=>20, :b=>10}]
1375
+ @ds.filter([:a, :b]=>[[10, 10], [20, 20]]).all.must_equal []
1376
1376
 
1377
- @ds.exclude([:a, :b]=>[[20, 10]]).all.should == []
1378
- @ds.exclude([:a, :b]=>[[10, 20]]).all.should == [{:a=>20, :b=>10}]
1379
- @ds.exclude([:a, :b]=>[[20, 10], [1, 2]]).all.should == []
1380
- @ds.exclude([:a, :b]=>[[10, 10], [20, 20]]).all.should == [{:a=>20, :b=>10}]
1377
+ @ds.exclude([:a, :b]=>[[20, 10]]).all.must_equal []
1378
+ @ds.exclude([:a, :b]=>[[10, 20]]).all.must_equal [{:a=>20, :b=>10}]
1379
+ @ds.exclude([:a, :b]=>[[20, 10], [1, 2]]).all.must_equal []
1380
+ @ds.exclude([:a, :b]=>[[10, 10], [20, 20]]).all.must_equal [{:a=>20, :b=>10}]
1381
1381
  end
1382
1382
 
1383
1383
  it "should work with IN/NOT in with datasets" do
@@ -1385,70 +1385,70 @@ describe "Sequel::Dataset DSL support" do
1385
1385
  ds = @ds.unordered
1386
1386
  @ds.quote_identifiers = false
1387
1387
 
1388
- @ds.filter(:a=>ds.select(:a)).all.should == [{:a=>20, :b=>10}]
1389
- @ds.filter(:a=>ds.select(:a).where(:a=>15)).all.should == []
1390
- @ds.exclude(:a=>ds.select(:a)).all.should == []
1391
- @ds.exclude(:a=>ds.select(:a).where(:a=>15)).all.should == [{:a=>20, :b=>10}]
1388
+ @ds.filter(:a=>ds.select(:a)).all.must_equal [{:a=>20, :b=>10}]
1389
+ @ds.filter(:a=>ds.select(:a).where(:a=>15)).all.must_equal []
1390
+ @ds.exclude(:a=>ds.select(:a)).all.must_equal []
1391
+ @ds.exclude(:a=>ds.select(:a).where(:a=>15)).all.must_equal [{:a=>20, :b=>10}]
1392
1392
 
1393
- @ds.filter([:a, :b]=>ds.select(:a, :b)).all.should == [{:a=>20, :b=>10}]
1394
- @ds.filter([:a, :b]=>ds.select(:b, :a)).all.should == []
1395
- @ds.exclude([:a, :b]=>ds.select(:a, :b)).all.should == []
1396
- @ds.exclude([:a, :b]=>ds.select(:b, :a)).all.should == [{:a=>20, :b=>10}]
1393
+ @ds.filter([:a, :b]=>ds.select(:a, :b)).all.must_equal [{:a=>20, :b=>10}]
1394
+ @ds.filter([:a, :b]=>ds.select(:b, :a)).all.must_equal []
1395
+ @ds.exclude([:a, :b]=>ds.select(:a, :b)).all.must_equal []
1396
+ @ds.exclude([:a, :b]=>ds.select(:b, :a)).all.must_equal [{:a=>20, :b=>10}]
1397
1397
 
1398
- @ds.filter([:a, :b]=>ds.select(:a, :b).where(:a=>15)).all.should == []
1399
- @ds.exclude([:a, :b]=>ds.select(:a, :b).where(:a=>15)).all.should == [{:a=>20, :b=>10}]
1398
+ @ds.filter([:a, :b]=>ds.select(:a, :b).where(:a=>15)).all.must_equal []
1399
+ @ds.exclude([:a, :b]=>ds.select(:a, :b).where(:a=>15)).all.must_equal [{:a=>20, :b=>10}]
1400
1400
  end
1401
1401
 
1402
- specify "should work empty arrays" do
1402
+ it "should work empty arrays" do
1403
1403
  @ds.insert(20, 10)
1404
- @ds.filter(:a=>[]).all.should == []
1405
- @ds.exclude(:a=>[]).all.should == [{:a=>20, :b=>10}]
1406
- @ds.filter([:a, :b]=>[]).all.should == []
1407
- @ds.exclude([:a, :b]=>[]).all.should == [{:a=>20, :b=>10}]
1404
+ @ds.filter(:a=>[]).all.must_equal []
1405
+ @ds.exclude(:a=>[]).all.must_equal [{:a=>20, :b=>10}]
1406
+ @ds.filter([:a, :b]=>[]).all.must_equal []
1407
+ @ds.exclude([:a, :b]=>[]).all.must_equal [{:a=>20, :b=>10}]
1408
1408
  end
1409
1409
 
1410
- specify "should work empty arrays with nulls" do
1410
+ it "should work empty arrays with nulls" do
1411
1411
  @ds.insert(nil, nil)
1412
- @ds.filter(:a=>[]).all.should == []
1413
- @ds.exclude(:a=>[]).all.should == []
1414
- @ds.filter([:a, :b]=>[]).all.should == []
1415
- @ds.exclude([:a, :b]=>[]).all.should == []
1412
+ @ds.filter(:a=>[]).all.must_equal []
1413
+ @ds.exclude(:a=>[]).all.must_equal []
1414
+ @ds.filter([:a, :b]=>[]).all.must_equal []
1415
+ @ds.exclude([:a, :b]=>[]).all.must_equal []
1416
1416
 
1417
1417
  unless Sequel.guarded?(:mssql, :oracle, :db2, :sqlanywhere)
1418
1418
  # Some databases don't like boolean results in the select list
1419
1419
  pr = proc{|r| r.is_a?(Integer) ? (r != 0) : r}
1420
- pr[@ds.get(Sequel.expr(:a=>[]))].should == nil
1421
- pr[@ds.get(~Sequel.expr(:a=>[]))].should == nil
1422
- pr[@ds.get(Sequel.expr([:a, :b]=>[]))].should == nil
1423
- pr[@ds.get(~Sequel.expr([:a, :b]=>[]))].should == nil
1420
+ pr[@ds.get(Sequel.expr(:a=>[]))].must_equal nil
1421
+ pr[@ds.get(~Sequel.expr(:a=>[]))].must_equal nil
1422
+ pr[@ds.get(Sequel.expr([:a, :b]=>[]))].must_equal nil
1423
+ pr[@ds.get(~Sequel.expr([:a, :b]=>[]))].must_equal nil
1424
1424
  end
1425
1425
  end
1426
1426
 
1427
- specify "should work empty arrays with nulls and the empty_array_ignore_nulls extension" do
1427
+ it "should work empty arrays with nulls and the empty_array_ignore_nulls extension" do
1428
1428
  ds = @ds.extension(:empty_array_ignore_nulls)
1429
1429
  ds.insert(nil, nil)
1430
- ds.filter(:a=>[]).all.should == []
1431
- ds.exclude(:a=>[]).all.should == [{:a=>nil, :b=>nil}]
1432
- ds.filter([:a, :b]=>[]).all.should == []
1433
- ds.exclude([:a, :b]=>[]).all.should == [{:a=>nil, :b=>nil}]
1430
+ ds.filter(:a=>[]).all.must_equal []
1431
+ ds.exclude(:a=>[]).all.must_equal [{:a=>nil, :b=>nil}]
1432
+ ds.filter([:a, :b]=>[]).all.must_equal []
1433
+ ds.exclude([:a, :b]=>[]).all.must_equal [{:a=>nil, :b=>nil}]
1434
1434
 
1435
1435
  unless Sequel.guarded?(:mssql, :oracle, :db2, :sqlanywhere)
1436
1436
  # Some databases don't like boolean results in the select list
1437
1437
  pr = proc{|r| r.is_a?(Integer) ? (r != 0) : r}
1438
- pr[ds.get(Sequel.expr(:a=>[]))].should == false
1439
- pr[ds.get(~Sequel.expr(:a=>[]))].should == true
1440
- pr[ds.get(Sequel.expr([:a, :b]=>[]))].should == false
1441
- pr[ds.get(~Sequel.expr([:a, :b]=>[]))].should == true
1438
+ pr[ds.get(Sequel.expr(:a=>[]))].must_equal false
1439
+ pr[ds.get(~Sequel.expr(:a=>[]))].must_equal true
1440
+ pr[ds.get(Sequel.expr([:a, :b]=>[]))].must_equal false
1441
+ pr[ds.get(~Sequel.expr([:a, :b]=>[]))].must_equal true
1442
1442
  end
1443
1443
  end
1444
1444
 
1445
1445
  it "should work multiple conditions" do
1446
1446
  @ds.insert(20, 10)
1447
- @ds.filter(:a=>20, :b=>10).all.should == [{:a=>20, :b=>10}]
1448
- @ds.filter([[:a, 20], [:b, 10]]).all.should == [{:a=>20, :b=>10}]
1449
- @ds.filter({:a=>20}, {:b=>10}).all.should == [{:a=>20, :b=>10}]
1450
- @ds.filter(Sequel.|({:a=>20}, {:b=>5})).all.should == [{:a=>20, :b=>10}]
1451
- @ds.filter(Sequel.~(:a=>10)).all.should == [{:a=>20, :b=>10}]
1447
+ @ds.filter(:a=>20, :b=>10).all.must_equal [{:a=>20, :b=>10}]
1448
+ @ds.filter([[:a, 20], [:b, 10]]).all.must_equal [{:a=>20, :b=>10}]
1449
+ @ds.filter({:a=>20}, {:b=>10}).all.must_equal [{:a=>20, :b=>10}]
1450
+ @ds.filter(Sequel.|({:a=>20}, {:b=>5})).all.must_equal [{:a=>20, :b=>10}]
1451
+ @ds.filter(Sequel.~(:a=>10)).all.must_equal [{:a=>20, :b=>10}]
1452
1452
  end
1453
1453
  end
1454
1454
 
@@ -1462,16 +1462,16 @@ describe "SQL Extract Function" do
1462
1462
  @db.drop_table?(:a)
1463
1463
  end
1464
1464
 
1465
- specify "should return the part of the datetime asked for" do
1465
+ it "should return the part of the datetime asked for" do
1466
1466
  t = Time.now
1467
1467
  def @ds.supports_timestamp_timezones?() false end
1468
1468
  @ds.insert(t)
1469
- @ds.get{a.extract(:year)}.should == t.year
1470
- @ds.get{a.extract(:month)}.should == t.month
1471
- @ds.get{a.extract(:day)}.should == t.day
1472
- @ds.get{a.extract(:hour)}.should == t.hour
1473
- @ds.get{a.extract(:minute)}.should == t.min
1474
- @ds.get{a.extract(:second)}.to_i.should == t.sec
1469
+ @ds.get{a.extract(:year)}.must_equal t.year
1470
+ @ds.get{a.extract(:month)}.must_equal t.month
1471
+ @ds.get{a.extract(:day)}.must_equal t.day
1472
+ @ds.get{a.extract(:hour)}.must_equal t.hour
1473
+ @ds.get{a.extract(:minute)}.must_equal t.min
1474
+ @ds.get{a.extract(:second)}.to_i.must_equal t.sec
1475
1475
  end
1476
1476
  end
1477
1477
 
@@ -1497,12 +1497,12 @@ describe "Dataset string methods" do
1497
1497
 
1498
1498
  it "#grep should return matching rows" do
1499
1499
  @ds.insert('foo', 'bar')
1500
- @ds.grep(:a, 'foo').all.should == [{:a=>'foo', :b=>'bar'}]
1501
- @ds.grep(:b, 'foo').all.should == []
1502
- @ds.grep(:b, 'bar').all.should == [{:a=>'foo', :b=>'bar'}]
1503
- @ds.grep(:a, 'bar').all.should == []
1504
- @ds.grep([:a, :b], %w'foo bar').all.should == [{:a=>'foo', :b=>'bar'}]
1505
- @ds.grep([:a, :b], %w'boo far').all.should == []
1500
+ @ds.grep(:a, 'foo').all.must_equal [{:a=>'foo', :b=>'bar'}]
1501
+ @ds.grep(:b, 'foo').all.must_equal []
1502
+ @ds.grep(:b, 'bar').all.must_equal [{:a=>'foo', :b=>'bar'}]
1503
+ @ds.grep(:a, 'bar').all.must_equal []
1504
+ @ds.grep([:a, :b], %w'foo bar').all.must_equal [{:a=>'foo', :b=>'bar'}]
1505
+ @ds.grep([:a, :b], %w'boo far').all.must_equal []
1506
1506
  end
1507
1507
 
1508
1508
  it "#grep should work with :all_patterns and :all_columns options" do
@@ -1514,44 +1514,44 @@ describe "Dataset string methods" do
1514
1514
  @ds.insert('foo baz', 'bar baz')
1515
1515
  @ds.insert('foo boo', 'boo foo')
1516
1516
 
1517
- @ds.grep([:a, :b], %w'%foo% %bar%', :all_patterns=>true).all.should == [{:a=>'foo bar', :b=>' '}, {:a=>'foo baz', :b=>'bar baz'}, {:a=>'foo d', :b=>'bar'}]
1518
- @ds.grep([:a, :b], %w'%foo% %bar% %blob%', :all_patterns=>true).all.should == []
1517
+ @ds.grep([:a, :b], %w'%foo% %bar%', :all_patterns=>true).all.must_equal [{:a=>'foo bar', :b=>' '}, {:a=>'foo baz', :b=>'bar baz'}, {:a=>'foo d', :b=>'bar'}]
1518
+ @ds.grep([:a, :b], %w'%foo% %bar% %blob%', :all_patterns=>true).all.must_equal []
1519
1519
 
1520
- @ds.grep([:a, :b], %w'%bar% %foo%', :all_columns=>true).all.should == [{:a=>"foo baz", :b=>"bar baz"}, {:a=>"foo boo", :b=>"boo foo"}, {:a=>"foo d", :b=>"bar"}]
1521
- @ds.grep([:a, :b], %w'%baz%', :all_columns=>true).all.should == [{:a=>'foo baz', :b=>'bar baz'}]
1520
+ @ds.grep([:a, :b], %w'%bar% %foo%', :all_columns=>true).all.must_equal [{:a=>"foo baz", :b=>"bar baz"}, {:a=>"foo boo", :b=>"boo foo"}, {:a=>"foo d", :b=>"bar"}]
1521
+ @ds.grep([:a, :b], %w'%baz%', :all_columns=>true).all.must_equal [{:a=>'foo baz', :b=>'bar baz'}]
1522
1522
 
1523
- @ds.grep([:a, :b], %w'%baz% %foo%', :all_columns=>true, :all_patterns=>true).all.should == []
1524
- @ds.grep([:a, :b], %w'%boo% %foo%', :all_columns=>true, :all_patterns=>true).all.should == [{:a=>'foo boo', :b=>'boo foo'}]
1523
+ @ds.grep([:a, :b], %w'%baz% %foo%', :all_columns=>true, :all_patterns=>true).all.must_equal []
1524
+ @ds.grep([:a, :b], %w'%boo% %foo%', :all_columns=>true, :all_patterns=>true).all.must_equal [{:a=>'foo boo', :b=>'boo foo'}]
1525
1525
  end
1526
1526
 
1527
1527
  it "#like should return matching rows" do
1528
1528
  @ds.insert('foo', 'bar')
1529
- @ds.filter(Sequel.expr(:a).like('foo')).all.should == [{:a=>'foo', :b=>'bar'}]
1530
- @ds.filter(Sequel.expr(:a).like('bar')).all.should == []
1531
- @ds.filter(Sequel.expr(:a).like('foo', 'bar')).all.should == [{:a=>'foo', :b=>'bar'}]
1532
- @ds.exclude(Sequel.expr(:a).like('foo')).all.should == []
1533
- @ds.exclude(Sequel.expr(:a).like('bar')).all.should == [{:a=>'foo', :b=>'bar'}]
1534
- @ds.exclude(Sequel.expr(:a).like('foo', 'bar')).all.should == []
1529
+ @ds.filter(Sequel.expr(:a).like('foo')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1530
+ @ds.filter(Sequel.expr(:a).like('bar')).all.must_equal []
1531
+ @ds.filter(Sequel.expr(:a).like('foo', 'bar')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1532
+ @ds.exclude(Sequel.expr(:a).like('foo')).all.must_equal []
1533
+ @ds.exclude(Sequel.expr(:a).like('bar')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1534
+ @ds.exclude(Sequel.expr(:a).like('foo', 'bar')).all.must_equal []
1535
1535
  end
1536
1536
 
1537
1537
  it "#like should be case sensitive" do
1538
1538
  @ds.insert('foo', 'bar')
1539
- @ds.filter(Sequel.expr(:a).like('Foo')).all.should == []
1540
- @ds.filter(Sequel.expr(:b).like('baR')).all.should == []
1541
- @ds.filter(Sequel.expr(:a).like('FOO', 'BAR')).all.should == []
1542
- @ds.exclude(Sequel.expr(:a).like('Foo')).all.should == [{:a=>'foo', :b=>'bar'}]
1543
- @ds.exclude(Sequel.expr(:b).like('baR')).all.should == [{:a=>'foo', :b=>'bar'}]
1544
- @ds.exclude(Sequel.expr(:a).like('FOO', 'BAR')).all.should == [{:a=>'foo', :b=>'bar'}]
1539
+ @ds.filter(Sequel.expr(:a).like('Foo')).all.must_equal []
1540
+ @ds.filter(Sequel.expr(:b).like('baR')).all.must_equal []
1541
+ @ds.filter(Sequel.expr(:a).like('FOO', 'BAR')).all.must_equal []
1542
+ @ds.exclude(Sequel.expr(:a).like('Foo')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1543
+ @ds.exclude(Sequel.expr(:b).like('baR')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1544
+ @ds.exclude(Sequel.expr(:a).like('FOO', 'BAR')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1545
1545
  end
1546
1546
 
1547
1547
  it "#ilike should return matching rows, in a case insensitive manner" do
1548
1548
  @ds.insert('foo', 'bar')
1549
- @ds.filter(Sequel.expr(:a).ilike('Foo')).all.should == [{:a=>'foo', :b=>'bar'}]
1550
- @ds.filter(Sequel.expr(:a).ilike('baR')).all.should == []
1551
- @ds.filter(Sequel.expr(:a).ilike('FOO', 'BAR')).all.should == [{:a=>'foo', :b=>'bar'}]
1552
- @ds.exclude(Sequel.expr(:a).ilike('Foo')).all.should == []
1553
- @ds.exclude(Sequel.expr(:a).ilike('baR')).all.should == [{:a=>'foo', :b=>'bar'}]
1554
- @ds.exclude(Sequel.expr(:a).ilike('FOO', 'BAR')).all.should == []
1549
+ @ds.filter(Sequel.expr(:a).ilike('Foo')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1550
+ @ds.filter(Sequel.expr(:a).ilike('baR')).all.must_equal []
1551
+ @ds.filter(Sequel.expr(:a).ilike('FOO', 'BAR')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1552
+ @ds.exclude(Sequel.expr(:a).ilike('Foo')).all.must_equal []
1553
+ @ds.exclude(Sequel.expr(:a).ilike('baR')).all.must_equal [{:a=>'foo', :b=>'bar'}]
1554
+ @ds.exclude(Sequel.expr(:a).ilike('FOO', 'BAR')).all.must_equal []
1555
1555
  end
1556
1556
 
1557
1557
  it "#escape_like should escape any metacharacters" do
@@ -1563,68 +1563,68 @@ describe "Dataset string methods" do
1563
1563
  @ds.insert('foo_.', 'bar%.')
1564
1564
  @ds.insert('foo_..', 'bar%..')
1565
1565
  @ds.insert('[f#*?oo_]', '[bar%]')
1566
- @ds.filter(Sequel.expr(:a).like(@ds.escape_like('foo_'))).select_order_map(:a).should == ['foo_']
1567
- @ds.filter(Sequel.expr(:b).like(@ds.escape_like('bar%'))).select_order_map(:b).should == ['bar%']
1568
- @ds.filter(Sequel.expr(:a).like(@ds.escape_like('foo\\_'))).select_order_map(:a).should == ['foo\\_']
1569
- @ds.filter(Sequel.expr(:b).like(@ds.escape_like('bar\\%'))).select_order_map(:b).should == ['bar\\%']
1570
- @ds.filter(Sequel.expr(:a).like(@ds.escape_like('[f#*?oo_]'))).select_order_map(:a).should == ['[f#*?oo_]']
1571
- @ds.filter(Sequel.expr(:b).like(@ds.escape_like('[bar%]'))).select_order_map(:b).should == ['[bar%]']
1572
- @ds.filter(Sequel.expr(:b).like("#{@ds.escape_like('bar%')}_")).select_order_map(:b).should == ['bar%.']
1573
- @ds.filter(Sequel.expr(:b).like("#{@ds.escape_like('bar%')}%")).select_order_map(:b).should == ['bar%', 'bar%.', 'bar%..']
1574
-
1575
- @ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('Foo_'))).select_order_map(:a).should == ['foo_']
1576
- @ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('Bar%'))).select_order_map(:b).should == ['bar%']
1577
- @ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('Foo\\_'))).select_order_map(:a).should == ['foo\\_']
1578
- @ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('Bar\\%'))).select_order_map(:b).should == ['bar\\%']
1579
- @ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('[F#*?oo_]'))).select_order_map(:a).should == ['[f#*?oo_]']
1580
- @ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('[Bar%]'))).select_order_map(:b).should == ['[bar%]']
1581
- @ds.filter(Sequel.expr(:b).ilike("#{@ds.escape_like('Bar%')}_")).select_order_map(:b).should == ['bar%.']
1582
- @ds.filter(Sequel.expr(:b).ilike("#{@ds.escape_like('Bar%')}%")).select_order_map(:b).should == ['bar%', 'bar%.', 'bar%..']
1566
+ @ds.filter(Sequel.expr(:a).like(@ds.escape_like('foo_'))).select_order_map(:a).must_equal ['foo_']
1567
+ @ds.filter(Sequel.expr(:b).like(@ds.escape_like('bar%'))).select_order_map(:b).must_equal ['bar%']
1568
+ @ds.filter(Sequel.expr(:a).like(@ds.escape_like('foo\\_'))).select_order_map(:a).must_equal ['foo\\_']
1569
+ @ds.filter(Sequel.expr(:b).like(@ds.escape_like('bar\\%'))).select_order_map(:b).must_equal ['bar\\%']
1570
+ @ds.filter(Sequel.expr(:a).like(@ds.escape_like('[f#*?oo_]'))).select_order_map(:a).must_equal ['[f#*?oo_]']
1571
+ @ds.filter(Sequel.expr(:b).like(@ds.escape_like('[bar%]'))).select_order_map(:b).must_equal ['[bar%]']
1572
+ @ds.filter(Sequel.expr(:b).like("#{@ds.escape_like('bar%')}_")).select_order_map(:b).must_equal ['bar%.']
1573
+ @ds.filter(Sequel.expr(:b).like("#{@ds.escape_like('bar%')}%")).select_order_map(:b).must_equal ['bar%', 'bar%.', 'bar%..']
1574
+
1575
+ @ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('Foo_'))).select_order_map(:a).must_equal ['foo_']
1576
+ @ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('Bar%'))).select_order_map(:b).must_equal ['bar%']
1577
+ @ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('Foo\\_'))).select_order_map(:a).must_equal ['foo\\_']
1578
+ @ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('Bar\\%'))).select_order_map(:b).must_equal ['bar\\%']
1579
+ @ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('[F#*?oo_]'))).select_order_map(:a).must_equal ['[f#*?oo_]']
1580
+ @ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('[Bar%]'))).select_order_map(:b).must_equal ['[bar%]']
1581
+ @ds.filter(Sequel.expr(:b).ilike("#{@ds.escape_like('Bar%')}_")).select_order_map(:b).must_equal ['bar%.']
1582
+ @ds.filter(Sequel.expr(:b).ilike("#{@ds.escape_like('Bar%')}%")).select_order_map(:b).must_equal ['bar%', 'bar%.', 'bar%..']
1583
1583
  end
1584
1584
 
1585
1585
  if DB.dataset.supports_regexp?
1586
1586
  it "#like with regexp return matching rows" do
1587
1587
  @ds.insert('foo', 'bar')
1588
- @ds.filter(Sequel.expr(:a).like(/fo/)).all.should == [{:a=>'foo', :b=>'bar'}]
1589
- @ds.filter(Sequel.expr(:a).like(/fo$/)).all.should == []
1590
- @ds.filter(Sequel.expr(:a).like(/fo/, /ar/)).all.should == [{:a=>'foo', :b=>'bar'}]
1591
- @ds.exclude(Sequel.expr(:a).like(/fo/)).all.should == []
1592
- @ds.exclude(Sequel.expr(:a).like(/fo$/)).all.should == [{:a=>'foo', :b=>'bar'}]
1593
- @ds.exclude(Sequel.expr(:a).like(/fo/, /ar/)).all.should == []
1588
+ @ds.filter(Sequel.expr(:a).like(/fo/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1589
+ @ds.filter(Sequel.expr(:a).like(/fo$/)).all.must_equal []
1590
+ @ds.filter(Sequel.expr(:a).like(/fo/, /ar/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1591
+ @ds.exclude(Sequel.expr(:a).like(/fo/)).all.must_equal []
1592
+ @ds.exclude(Sequel.expr(:a).like(/fo$/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1593
+ @ds.exclude(Sequel.expr(:a).like(/fo/, /ar/)).all.must_equal []
1594
1594
  end
1595
1595
 
1596
1596
  it "#like with regexp should be case sensitive if regexp is case sensitive" do
1597
1597
  @ds.insert('foo', 'bar')
1598
- @ds.filter(Sequel.expr(:a).like(/Fo/)).all.should == []
1599
- @ds.filter(Sequel.expr(:b).like(/baR/)).all.should == []
1600
- @ds.filter(Sequel.expr(:a).like(/FOO/, /BAR/)).all.should == []
1601
- @ds.exclude(Sequel.expr(:a).like(/Fo/)).all.should == [{:a=>'foo', :b=>'bar'}]
1602
- @ds.exclude(Sequel.expr(:b).like(/baR/)).all.should == [{:a=>'foo', :b=>'bar'}]
1603
- @ds.exclude(Sequel.expr(:a).like(/FOO/, /BAR/)).all.should == [{:a=>'foo', :b=>'bar'}]
1604
-
1605
- @ds.filter(Sequel.expr(:a).like(/Fo/i)).all.should == [{:a=>'foo', :b=>'bar'}]
1606
- @ds.filter(Sequel.expr(:b).like(/baR/i)).all.should == [{:a=>'foo', :b=>'bar'}]
1607
- @ds.filter(Sequel.expr(:a).like(/FOO/i, /BAR/i)).all.should == [{:a=>'foo', :b=>'bar'}]
1608
- @ds.exclude(Sequel.expr(:a).like(/Fo/i)).all.should == []
1609
- @ds.exclude(Sequel.expr(:b).like(/baR/i)).all.should == []
1610
- @ds.exclude(Sequel.expr(:a).like(/FOO/i, /BAR/i)).all.should == []
1598
+ @ds.filter(Sequel.expr(:a).like(/Fo/)).all.must_equal []
1599
+ @ds.filter(Sequel.expr(:b).like(/baR/)).all.must_equal []
1600
+ @ds.filter(Sequel.expr(:a).like(/FOO/, /BAR/)).all.must_equal []
1601
+ @ds.exclude(Sequel.expr(:a).like(/Fo/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1602
+ @ds.exclude(Sequel.expr(:b).like(/baR/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1603
+ @ds.exclude(Sequel.expr(:a).like(/FOO/, /BAR/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1604
+
1605
+ @ds.filter(Sequel.expr(:a).like(/Fo/i)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1606
+ @ds.filter(Sequel.expr(:b).like(/baR/i)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1607
+ @ds.filter(Sequel.expr(:a).like(/FOO/i, /BAR/i)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1608
+ @ds.exclude(Sequel.expr(:a).like(/Fo/i)).all.must_equal []
1609
+ @ds.exclude(Sequel.expr(:b).like(/baR/i)).all.must_equal []
1610
+ @ds.exclude(Sequel.expr(:a).like(/FOO/i, /BAR/i)).all.must_equal []
1611
1611
  end
1612
1612
 
1613
1613
  it "#ilike with regexp should return matching rows, in a case insensitive manner" do
1614
1614
  @ds.insert('foo', 'bar')
1615
- @ds.filter(Sequel.expr(:a).ilike(/Fo/)).all.should == [{:a=>'foo', :b=>'bar'}]
1616
- @ds.filter(Sequel.expr(:b).ilike(/baR/)).all.should == [{:a=>'foo', :b=>'bar'}]
1617
- @ds.filter(Sequel.expr(:a).ilike(/FOO/, /BAR/)).all.should == [{:a=>'foo', :b=>'bar'}]
1618
- @ds.exclude(Sequel.expr(:a).ilike(/Fo/)).all.should == []
1619
- @ds.exclude(Sequel.expr(:b).ilike(/baR/)).all.should == []
1620
- @ds.exclude(Sequel.expr(:a).ilike(/FOO/, /BAR/)).all.should == []
1615
+ @ds.filter(Sequel.expr(:a).ilike(/Fo/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1616
+ @ds.filter(Sequel.expr(:b).ilike(/baR/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1617
+ @ds.filter(Sequel.expr(:a).ilike(/FOO/, /BAR/)).all.must_equal [{:a=>'foo', :b=>'bar'}]
1618
+ @ds.exclude(Sequel.expr(:a).ilike(/Fo/)).all.must_equal []
1619
+ @ds.exclude(Sequel.expr(:b).ilike(/baR/)).all.must_equal []
1620
+ @ds.exclude(Sequel.expr(:a).ilike(/FOO/, /BAR/)).all.must_equal []
1621
1621
  end
1622
1622
  end
1623
1623
 
1624
1624
  it "should work with strings created with Sequel.join" do
1625
1625
  @ds.insert('foo', 'bar')
1626
- @ds.get(Sequel.join([:a, "bar"])).should == 'foobar'
1627
- @ds.get(Sequel.join(["foo", :b], ' ')).should == 'foo bar'
1626
+ @ds.get(Sequel.join([:a, "bar"])).must_equal 'foobar'
1627
+ @ds.get(Sequel.join(["foo", :b], ' ')).must_equal 'foo bar'
1628
1628
  end
1629
1629
  end
1630
1630
 
@@ -1646,21 +1646,21 @@ describe "Dataset identifier methods" do
1646
1646
  @db.drop_table?(:a)
1647
1647
  end
1648
1648
 
1649
- specify "#identifier_output_method should change how identifiers are output" do
1649
+ it "#identifier_output_method should change how identifiers are output" do
1650
1650
  @ds.identifier_output_method = :upcase
1651
- @ds.first.should == {:AB=>1}
1651
+ @ds.first.must_equal(:AB=>1)
1652
1652
  @ds.identifier_output_method = :uprev
1653
- @ds.first.should == {:BA=>1}
1653
+ @ds.first.must_equal(:BA=>1)
1654
1654
  end
1655
1655
 
1656
1656
  it "should work with a nil identifier_output_method" do
1657
1657
  @ds.identifier_output_method = nil
1658
- [{:ab=>1}, {:AB=>1}].should include(@ds.first)
1658
+ [{:ab=>1}, {:AB=>1}].must_include(@ds.first)
1659
1659
  end
1660
1660
 
1661
1661
  it "should work when not quoting identifiers" do
1662
1662
  @ds.quote_identifiers = false
1663
- @ds.first.should == {:ab=>1}
1663
+ @ds.first.must_equal(:ab=>1)
1664
1664
  end
1665
1665
  end
1666
1666
 
@@ -1681,14 +1681,14 @@ describe "Dataset defaults and overrides" do
1681
1681
  @ds = @ds.set_defaults(:a=>10)
1682
1682
  @ds.insert
1683
1683
  @ds.insert(:a=>20)
1684
- @ds.all.should == [{:a=>10}, {:a=>20}]
1684
+ @ds.all.must_equal [{:a=>10}, {:a=>20}]
1685
1685
  end
1686
1686
 
1687
1687
  it "#set_overrides should set defaults that cannot be overridden" do
1688
1688
  @ds = @ds.set_overrides(:a=>10)
1689
1689
  @ds.insert
1690
1690
  @ds.insert(:a=>20)
1691
- @ds.all.should == [{:a=>10}, {:a=>10}]
1691
+ @ds.all.must_equal [{:a=>10}, {:a=>10}]
1692
1692
  end
1693
1693
  end
1694
1694
 
@@ -1713,18 +1713,18 @@ if DB.dataset.supports_modifying_joins?
1713
1713
 
1714
1714
  it "#update should allow updating joined datasets" do
1715
1715
  @ds.update(:a=>10)
1716
- @ds.all.should == [{:c=>5, :b=>2, :a=>10, :d=>2, :e=>5, :f=>6}]
1717
- @db[:a].order(:a).all.should == [{:a=>3, :d=>4}, {:a=>10, :d=>2}]
1718
- @db[:b].order(:b).all.should == [{:b=>2, :e=>5}, {:b=>4, :e=>7}]
1719
- @db[:c].order(:c).all.should == [{:c=>5, :f=>6}, {:c=>7, :f=>8}]
1716
+ @ds.all.must_equal [{:c=>5, :b=>2, :a=>10, :d=>2, :e=>5, :f=>6}]
1717
+ @db[:a].order(:a).all.must_equal [{:a=>3, :d=>4}, {:a=>10, :d=>2}]
1718
+ @db[:b].order(:b).all.must_equal [{:b=>2, :e=>5}, {:b=>4, :e=>7}]
1719
+ @db[:c].order(:c).all.must_equal [{:c=>5, :f=>6}, {:c=>7, :f=>8}]
1720
1720
  end
1721
1721
 
1722
1722
  it "#delete should allow deleting from joined datasets" do
1723
1723
  @ds.delete
1724
- @ds.all.should == []
1725
- @db[:a].order(:a).all.should == [{:a=>3, :d=>4}]
1726
- @db[:b].order(:b).all.should == [{:b=>2, :e=>5}, {:b=>4, :e=>7}]
1727
- @db[:c].order(:c).all.should == [{:c=>5, :f=>6}, {:c=>7, :f=>8}]
1724
+ @ds.all.must_equal []
1725
+ @db[:a].order(:a).all.must_equal [{:a=>3, :d=>4}]
1726
+ @db[:b].order(:b).all.must_equal [{:b=>2, :e=>5}, {:b=>4, :e=>7}]
1727
+ @db[:c].order(:c).all.must_equal [{:c=>5, :f=>6}, {:c=>7, :f=>8}]
1728
1728
  end
1729
1729
  end
1730
1730
  end
@@ -1742,28 +1742,28 @@ describe "Emulated functions" do
1742
1742
  @ds.delete
1743
1743
  end
1744
1744
 
1745
- specify "Sequel.char_length should return the length of characters in the string" do
1746
- @ds.get(Sequel.char_length(:a)).should == nil
1745
+ it "Sequel.char_length should return the length of characters in the string" do
1746
+ @ds.get(Sequel.char_length(:a)).must_equal nil
1747
1747
  @ds.insert(:a=>'foo')
1748
- @ds.get(Sequel.char_length(:a)).should == 3
1748
+ @ds.get(Sequel.char_length(:a)).must_equal 3
1749
1749
  # Check behavior with leading/trailing blanks
1750
1750
  @ds.update(:a=>' foo22 ')
1751
- @ds.get(Sequel.char_length(:a)).should == 7
1751
+ @ds.get(Sequel.char_length(:a)).must_equal 7
1752
1752
  end
1753
1753
 
1754
- specify "Sequel.trim should return the string with spaces trimmed from both sides" do
1755
- @ds.get(Sequel.trim(:a)).should == nil
1754
+ it "Sequel.trim should return the string with spaces trimmed from both sides" do
1755
+ @ds.get(Sequel.trim(:a)).must_equal nil
1756
1756
  @ds.insert(:a=>'foo')
1757
- @ds.get(Sequel.trim(:a)).should == 'foo'
1757
+ @ds.get(Sequel.trim(:a)).must_equal 'foo'
1758
1758
  # Check behavior with leading/trailing blanks
1759
1759
  @ds.update(:a=>' foo22 ')
1760
- @ds.get(Sequel.trim(:a)).should == 'foo22'
1760
+ @ds.get(Sequel.trim(:a)).must_equal 'foo22'
1761
1761
  end
1762
1762
  end
1763
1763
 
1764
1764
  describe "Dataset replace" do
1765
1765
  before do
1766
- DB.create_table(:items){Integer :id, :unique=>true; Integer :value}
1766
+ DB.create_table!(:items){Integer :id, :unique=>true; Integer :value}
1767
1767
  sqls = []
1768
1768
  DB.loggers << Class.new{%w'info error'.each{|m| define_method(m){|sql| sqls << sql}}}.new
1769
1769
 
@@ -1775,24 +1775,24 @@ describe "Dataset replace" do
1775
1775
  DB.drop_table?(:items)
1776
1776
  end
1777
1777
 
1778
- specify "should use support arrays, datasets, and multiple values" do
1778
+ it "should use support arrays, datasets, and multiple values" do
1779
1779
  @d.replace([1, 2])
1780
- @d.all.should == [{:id=>1, :value=>2}]
1780
+ @d.all.must_equal [{:id=>1, :value=>2}]
1781
1781
  @d.replace(1, 2)
1782
- @d.all.should == [{:id=>1, :value=>2}]
1782
+ @d.all.must_equal [{:id=>1, :value=>2}]
1783
1783
  @d.replace(@d)
1784
- @d.all.should == [{:id=>1, :value=>2}]
1784
+ @d.all.must_equal [{:id=>1, :value=>2}]
1785
1785
  end
1786
1786
 
1787
- specify "should create a record if the condition is not met" do
1787
+ it "should create a record if the condition is not met" do
1788
1788
  @d.replace(:id => 111, :value => 333)
1789
- @d.all.should == [{:id => 111, :value => 333}]
1789
+ @d.all.must_equal [{:id => 111, :value => 333}]
1790
1790
  end
1791
1791
 
1792
- specify "should update a record if the condition is met" do
1792
+ it "should update a record if the condition is met" do
1793
1793
  @d << {:id => 111}
1794
- @d.all.should == [{:id => 111, :value => nil}]
1794
+ @d.all.must_equal [{:id => 111, :value => nil}]
1795
1795
  @d.replace(:id => 111, :value => 333)
1796
- @d.all.should == [{:id => 111, :value => 333}]
1796
+ @d.all.must_equal [{:id => 111, :value => 333}]
1797
1797
  end
1798
1798
  end if DB.dataset.supports_replace?