shoulda-matchers 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +3 -1
- data/Gemfile +1 -2
- data/Gemfile.lock +8 -2
- data/NEWS.md +29 -1
- data/README.md +3 -11
- data/doc_config/yard/templates/default/fulldoc/html/css/global.css +17 -0
- data/doc_config/yard/templates/default/fulldoc/html/css/style.css +3 -4
- data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +1 -1
- data/doc_config/yard/templates/default/layout/html/footer.erb +6 -0
- data/docs/errors/NonCaseSwappableValueError.md +111 -0
- data/gemfiles/4.0.0.gemfile +1 -2
- data/gemfiles/4.0.0.gemfile.lock +5 -2
- data/gemfiles/4.0.1.gemfile +1 -2
- data/gemfiles/4.0.1.gemfile.lock +5 -2
- data/gemfiles/4.1.gemfile +1 -2
- data/gemfiles/4.1.gemfile.lock +5 -2
- data/gemfiles/4.2.gemfile +1 -2
- data/gemfiles/4.2.gemfile.lock +5 -2
- data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +1 -5
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +26 -4
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +9 -8
- data/lib/shoulda/matchers/active_model/numericality_matchers/even_number_matcher.rb +14 -8
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +47 -12
- data/lib/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher.rb +15 -9
- data/lib/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher.rb +14 -7
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +16 -4
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +67 -5
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +35 -0
- data/lib/shoulda/matchers/util.rb +2 -0
- data/lib/shoulda/matchers/util/word_wrap.rb +178 -0
- data/lib/shoulda/matchers/version.rb +1 -1
- data/lib/shoulda/matchers/warn.rb +1 -10
- data/spec/acceptance_spec_helper.rb +2 -10
- data/spec/doublespeak_spec_helper.rb +1 -17
- data/spec/spec_helper.rb +23 -0
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb +1 -1
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/even_number_matcher_spec.rb +5 -2
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher_spec.rb +5 -2
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher_spec.rb +5 -1
- data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +91 -4
- data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +292 -2
- data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +16 -2
- data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +197 -0
- data/spec/unit_spec_helper.rb +1 -16
- data/tasks/documentation.rb +10 -17
- metadata +9 -2
@@ -126,6 +126,42 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
126
126
|
record = build_record_validating_numericality
|
127
127
|
expect(record).to validate_numericality
|
128
128
|
end
|
129
|
+
|
130
|
+
context 'when the column is an integer column' do
|
131
|
+
it 'raises an IneffectiveTestError' do
|
132
|
+
record = build_record_validating_numericality(
|
133
|
+
column_type: :integer
|
134
|
+
)
|
135
|
+
assertion = -> { expect(record).to validate_numericality }
|
136
|
+
|
137
|
+
expect(&assertion).
|
138
|
+
to raise_error(described_class::IneffectiveTestError)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'when the column is a float column' do
|
143
|
+
it 'raises an IneffectiveTestError' do
|
144
|
+
record = build_record_validating_numericality(
|
145
|
+
column_type: :float
|
146
|
+
)
|
147
|
+
assertion = -> { expect(record).to validate_numericality }
|
148
|
+
|
149
|
+
expect(&assertion).
|
150
|
+
to raise_error(described_class::IneffectiveTestError)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'when the column is a decimal column' do
|
155
|
+
it 'raises an IneffectiveTestError' do
|
156
|
+
record = build_record_validating_numericality(
|
157
|
+
column_type: :decimal,
|
158
|
+
)
|
159
|
+
assertion = -> { expect(record).to validate_numericality }
|
160
|
+
|
161
|
+
expect(&assertion).
|
162
|
+
to raise_error(described_class::IneffectiveTestError)
|
163
|
+
end
|
164
|
+
end
|
129
165
|
end
|
130
166
|
|
131
167
|
context 'and not validating anything' do
|
@@ -187,6 +223,39 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
187
223
|
record = build_record_validating_numericality(odd: true)
|
188
224
|
expect(record).to validate_numericality.odd
|
189
225
|
end
|
226
|
+
|
227
|
+
context 'when the column is an integer column' do
|
228
|
+
it 'accepts (and does not raise an error)' do
|
229
|
+
record = build_record_validating_numericality(
|
230
|
+
column_type: :integer,
|
231
|
+
odd: true
|
232
|
+
)
|
233
|
+
|
234
|
+
expect(record).to validate_numericality.odd
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
context 'when the column is a float column' do
|
239
|
+
it 'accepts (and does not raise an error)' do
|
240
|
+
record = build_record_validating_numericality(
|
241
|
+
column_type: :float,
|
242
|
+
odd: true
|
243
|
+
)
|
244
|
+
|
245
|
+
expect(record).to validate_numericality.odd
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
context 'when the column is a decimal column' do
|
250
|
+
it 'accepts (and does not raise an error)' do
|
251
|
+
record = build_record_validating_numericality(
|
252
|
+
column_type: :decimal,
|
253
|
+
odd: true,
|
254
|
+
)
|
255
|
+
|
256
|
+
expect(record).to validate_numericality.odd
|
257
|
+
end
|
258
|
+
end
|
190
259
|
end
|
191
260
|
|
192
261
|
context 'and not validating with odd' do
|
@@ -204,10 +273,43 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
204
273
|
|
205
274
|
context 'qualified with even' do
|
206
275
|
context 'and validating with even' do
|
207
|
-
it '
|
276
|
+
it 'accepts' do
|
208
277
|
record = build_record_validating_numericality(even: true)
|
209
278
|
expect(record).to validate_numericality.even
|
210
279
|
end
|
280
|
+
|
281
|
+
context 'when the column is an integer column' do
|
282
|
+
it 'accepts (and does not raise an error)' do
|
283
|
+
record = build_record_validating_numericality(
|
284
|
+
column_type: :integer,
|
285
|
+
even: true
|
286
|
+
)
|
287
|
+
|
288
|
+
expect(record).to validate_numericality.even
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
context 'when the column is a float column' do
|
293
|
+
it 'accepts (and does not raise an error)' do
|
294
|
+
record = build_record_validating_numericality(
|
295
|
+
column_type: :float,
|
296
|
+
even: true
|
297
|
+
)
|
298
|
+
|
299
|
+
expect(record).to validate_numericality.even
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
context 'when the column is a decimal column' do
|
304
|
+
it 'accepts (and does not raise an error)' do
|
305
|
+
record = build_record_validating_numericality(
|
306
|
+
column_type: :decimal,
|
307
|
+
even: true,
|
308
|
+
)
|
309
|
+
|
310
|
+
expect(record).to validate_numericality.even
|
311
|
+
end
|
312
|
+
end
|
211
313
|
end
|
212
314
|
|
213
315
|
context 'and not validating with even' do
|
@@ -229,6 +331,39 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
229
331
|
)
|
230
332
|
expect(record).to validate_numericality.is_less_than_or_equal_to(18)
|
231
333
|
end
|
334
|
+
|
335
|
+
context 'when the column is an integer column' do
|
336
|
+
it 'accepts (and does not raise an error)' do
|
337
|
+
record = build_record_validating_numericality(
|
338
|
+
column_type: :integer,
|
339
|
+
less_than_or_equal_to: 18
|
340
|
+
)
|
341
|
+
|
342
|
+
expect(record).to validate_numericality.is_less_than_or_equal_to(18)
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
context 'when the column is a float column' do
|
347
|
+
it 'accepts (and does not raise an error)' do
|
348
|
+
record = build_record_validating_numericality(
|
349
|
+
column_type: :float,
|
350
|
+
less_than_or_equal_to: 18
|
351
|
+
)
|
352
|
+
|
353
|
+
expect(record).to validate_numericality.is_less_than_or_equal_to(18)
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
context 'when the column is a decimal column' do
|
358
|
+
it 'accepts (and does not raise an error)' do
|
359
|
+
record = build_record_validating_numericality(
|
360
|
+
column_type: :decimal,
|
361
|
+
less_than_or_equal_to: 18,
|
362
|
+
)
|
363
|
+
|
364
|
+
expect(record).to validate_numericality.is_less_than_or_equal_to(18)
|
365
|
+
end
|
366
|
+
end
|
232
367
|
end
|
233
368
|
|
234
369
|
context 'and not validating with less_than_or_equal_to' do
|
@@ -254,6 +389,39 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
254
389
|
to validate_numericality.
|
255
390
|
is_less_than(18)
|
256
391
|
end
|
392
|
+
|
393
|
+
context 'when the column is an integer column' do
|
394
|
+
it 'accepts (and does not raise an error)' do
|
395
|
+
record = build_record_validating_numericality(
|
396
|
+
column_type: :integer,
|
397
|
+
less_than: 18
|
398
|
+
)
|
399
|
+
|
400
|
+
expect(record).to validate_numericality.is_less_than(18)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
context 'when the column is a float column' do
|
405
|
+
it 'accepts (and does not raise an error)' do
|
406
|
+
record = build_record_validating_numericality(
|
407
|
+
column_type: :float,
|
408
|
+
less_than: 18
|
409
|
+
)
|
410
|
+
|
411
|
+
expect(record).to validate_numericality.is_less_than(18)
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
context 'when the column is a decimal column' do
|
416
|
+
it 'accepts (and does not raise an error)' do
|
417
|
+
record = build_record_validating_numericality(
|
418
|
+
column_type: :decimal,
|
419
|
+
less_than: 18,
|
420
|
+
)
|
421
|
+
|
422
|
+
expect(record).to validate_numericality.is_less_than(18)
|
423
|
+
end
|
424
|
+
end
|
257
425
|
end
|
258
426
|
|
259
427
|
context 'and not validating with less_than' do
|
@@ -277,6 +445,39 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
277
445
|
record = build_record_validating_numericality(equal_to: 18)
|
278
446
|
expect(record).to validate_numericality.is_equal_to(18)
|
279
447
|
end
|
448
|
+
|
449
|
+
context 'when the column is an integer column' do
|
450
|
+
it 'accepts (and does not raise an error)' do
|
451
|
+
record = build_record_validating_numericality(
|
452
|
+
column_type: :integer,
|
453
|
+
equal_to: 18
|
454
|
+
)
|
455
|
+
|
456
|
+
expect(record).to validate_numericality.is_equal_to(18)
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
context 'when the column is a float column' do
|
461
|
+
it 'accepts (and does not raise an error)' do
|
462
|
+
record = build_record_validating_numericality(
|
463
|
+
column_type: :float,
|
464
|
+
equal_to: 18
|
465
|
+
)
|
466
|
+
|
467
|
+
expect(record).to validate_numericality.is_equal_to(18)
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|
471
|
+
context 'when the column is a decimal column' do
|
472
|
+
it 'accepts (and does not raise an error)' do
|
473
|
+
record = build_record_validating_numericality(
|
474
|
+
column_type: :decimal,
|
475
|
+
equal_to: 18,
|
476
|
+
)
|
477
|
+
|
478
|
+
expect(record).to validate_numericality.is_equal_to(18)
|
479
|
+
end
|
480
|
+
end
|
280
481
|
end
|
281
482
|
|
282
483
|
context 'and not validating with equal_to' do
|
@@ -302,6 +503,45 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
302
503
|
to validate_numericality.
|
303
504
|
is_greater_than_or_equal_to(18)
|
304
505
|
end
|
506
|
+
|
507
|
+
context 'when the column is an integer column' do
|
508
|
+
it 'accepts (and does not raise an error)' do
|
509
|
+
record = build_record_validating_numericality(
|
510
|
+
column_type: :integer,
|
511
|
+
greater_than_or_equal_to: 18
|
512
|
+
)
|
513
|
+
|
514
|
+
expect(record).
|
515
|
+
to validate_numericality.
|
516
|
+
is_greater_than_or_equal_to(18)
|
517
|
+
end
|
518
|
+
end
|
519
|
+
|
520
|
+
context 'when the column is a float column' do
|
521
|
+
it 'accepts (and does not raise an error)' do
|
522
|
+
record = build_record_validating_numericality(
|
523
|
+
column_type: :float,
|
524
|
+
greater_than_or_equal_to: 18
|
525
|
+
)
|
526
|
+
|
527
|
+
expect(record).
|
528
|
+
to validate_numericality.
|
529
|
+
is_greater_than_or_equal_to(18)
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
context 'when the column is a decimal column' do
|
534
|
+
it 'accepts (and does not raise an error)' do
|
535
|
+
record = build_record_validating_numericality(
|
536
|
+
column_type: :decimal,
|
537
|
+
greater_than_or_equal_to: 18,
|
538
|
+
)
|
539
|
+
|
540
|
+
expect(record).
|
541
|
+
to validate_numericality.
|
542
|
+
is_greater_than_or_equal_to(18)
|
543
|
+
end
|
544
|
+
end
|
305
545
|
end
|
306
546
|
|
307
547
|
context 'not validating with greater_than_or_equal_to' do
|
@@ -327,6 +567,45 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
327
567
|
to validate_numericality.
|
328
568
|
is_greater_than(18)
|
329
569
|
end
|
570
|
+
|
571
|
+
context 'when the column is an integer column' do
|
572
|
+
it 'accepts (and does not raise an error)' do
|
573
|
+
record = build_record_validating_numericality(
|
574
|
+
column_type: :integer,
|
575
|
+
greater_than: 18
|
576
|
+
)
|
577
|
+
|
578
|
+
expect(record).
|
579
|
+
to validate_numericality.
|
580
|
+
is_greater_than(18)
|
581
|
+
end
|
582
|
+
end
|
583
|
+
|
584
|
+
context 'when the column is a float column' do
|
585
|
+
it 'accepts (and does not raise an error)' do
|
586
|
+
record = build_record_validating_numericality(
|
587
|
+
column_type: :float,
|
588
|
+
greater_than: 18
|
589
|
+
)
|
590
|
+
|
591
|
+
expect(record).
|
592
|
+
to validate_numericality.
|
593
|
+
is_greater_than(18)
|
594
|
+
end
|
595
|
+
end
|
596
|
+
|
597
|
+
context 'when the column is a decimal column' do
|
598
|
+
it 'accepts (and does not raise an error)' do
|
599
|
+
record = build_record_validating_numericality(
|
600
|
+
column_type: :decimal,
|
601
|
+
greater_than: 18,
|
602
|
+
)
|
603
|
+
|
604
|
+
expect(record).
|
605
|
+
to validate_numericality.
|
606
|
+
is_greater_than(18)
|
607
|
+
end
|
608
|
+
end
|
330
609
|
end
|
331
610
|
|
332
611
|
context 'and not validating with greater_than' do
|
@@ -740,6 +1019,16 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
740
1019
|
end
|
741
1020
|
end
|
742
1021
|
|
1022
|
+
context 'against an ActiveModel model' do
|
1023
|
+
it 'accepts' do
|
1024
|
+
model = define_active_model_class :example, accessors: [:attr] do
|
1025
|
+
validates_numericality_of :attr
|
1026
|
+
end
|
1027
|
+
|
1028
|
+
expect(model.new).to validate_numericality_of(:attr)
|
1029
|
+
end
|
1030
|
+
end
|
1031
|
+
|
743
1032
|
describe '#description' do
|
744
1033
|
context 'qualified with nothing' do
|
745
1034
|
it 'describes that it allows numbers' do
|
@@ -845,8 +1134,9 @@ describe Shoulda::Matchers::ActiveModel::ValidateNumericalityOfMatcher, type: :m
|
|
845
1134
|
|
846
1135
|
def define_model_validating_numericality(options = {})
|
847
1136
|
attribute_name = options.delete(:attribute_name) { self.attribute_name }
|
1137
|
+
column_type = options.delete(:column_type) { :string }
|
848
1138
|
|
849
|
-
define_model 'Example', attribute_name => :
|
1139
|
+
define_model 'Example', attribute_name => { type: column_type } do |model|
|
850
1140
|
model.validates_numericality_of(attribute_name, options)
|
851
1141
|
end
|
852
1142
|
end
|
@@ -441,7 +441,7 @@ describe Shoulda::Matchers::ActiveRecord::ValidateUniquenessOfMatcher, type: :mo
|
|
441
441
|
end
|
442
442
|
|
443
443
|
context 'when the model has a case-sensitive validation' do
|
444
|
-
context 'when
|
444
|
+
context 'when the matcher is not qualified with case_insensitive' do
|
445
445
|
it 'accepts' do
|
446
446
|
record = build_record_validating_uniqueness(
|
447
447
|
attribute_type: :string,
|
@@ -450,9 +450,23 @@ describe Shoulda::Matchers::ActiveRecord::ValidateUniquenessOfMatcher, type: :mo
|
|
450
450
|
|
451
451
|
expect(record).to validate_uniqueness
|
452
452
|
end
|
453
|
+
|
454
|
+
context 'given an existing record where the value of the attribute under test is not case-swappable' do
|
455
|
+
it 'raises a NonCaseSwappableValueError' do
|
456
|
+
model = define_model_validating_uniqueness(
|
457
|
+
attribute_type: :string,
|
458
|
+
validation_options: { case_sensitive: true },
|
459
|
+
)
|
460
|
+
record = create_record_from(model, attribute_name => '123')
|
461
|
+
running_matcher = -> { validate_uniqueness.matches?(record) }
|
462
|
+
|
463
|
+
expect(&running_matcher).
|
464
|
+
to raise_error(described_class::NonCaseSwappableValueError)
|
465
|
+
end
|
466
|
+
end
|
453
467
|
end
|
454
468
|
|
455
|
-
context 'when
|
469
|
+
context 'when the matcher is qualified with case_insensitive' do
|
456
470
|
it 'rejects' do
|
457
471
|
record = build_record_validating_uniqueness(
|
458
472
|
attribute_type: :string,
|
@@ -0,0 +1,197 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shoulda/matchers/util/word_wrap'
|
3
|
+
|
4
|
+
describe Shoulda::Matchers, ".word_wrap" do
|
5
|
+
it "can wrap a simple paragraph" do
|
6
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE.strip)
|
7
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus, ipsum sit amet efficitur feugiat
|
8
|
+
MESSAGE
|
9
|
+
|
10
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
11
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus,
|
12
|
+
ipsum sit amet efficitur feugiat
|
13
|
+
MESSAGE
|
14
|
+
end
|
15
|
+
|
16
|
+
it "does not split words up when wrapping" do
|
17
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE.strip)
|
18
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean lusciousness, ipsum sit amet efficitur feugiat
|
19
|
+
MESSAGE
|
20
|
+
|
21
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
22
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean
|
23
|
+
lusciousness, ipsum sit amet efficitur feugiat
|
24
|
+
MESSAGE
|
25
|
+
end
|
26
|
+
|
27
|
+
it "considers punctuation as part of a word" do
|
28
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE.strip)
|
29
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luscious, ipsum sit amet efficitur feugiat
|
30
|
+
MESSAGE
|
31
|
+
|
32
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
33
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean
|
34
|
+
luscious, ipsum sit amet efficitur feugiat
|
35
|
+
MESSAGE
|
36
|
+
end
|
37
|
+
|
38
|
+
it "re-wraps entire paragraphs" do
|
39
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
40
|
+
Lorem ipsum dolor sit amet,
|
41
|
+
consectetur adipiscing elit.
|
42
|
+
Aenean luctus,
|
43
|
+
ipsum sit amet efficitur feugiat,
|
44
|
+
dolor mauris fringilla erat, sed posuere diam ex ut velit.
|
45
|
+
MESSAGE
|
46
|
+
|
47
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
48
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus,
|
49
|
+
ipsum sit amet efficitur feugiat, dolor mauris fringilla erat, sed
|
50
|
+
posuere diam ex ut velit.
|
51
|
+
MESSAGE
|
52
|
+
end
|
53
|
+
|
54
|
+
it "can wrap multiple paragraphs" do
|
55
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE.strip)
|
56
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla erat, sed posuere diam ex ut velit.
|
57
|
+
|
58
|
+
Etiam ultrices cursus ligula eget feugiat. Vestibulum eget tincidunt risus, non faucibus sem.
|
59
|
+
MESSAGE
|
60
|
+
|
61
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
62
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus,
|
63
|
+
ipsum sit amet efficitur feugiat, dolor mauris fringilla erat, sed
|
64
|
+
posuere diam ex ut velit.
|
65
|
+
|
66
|
+
Etiam ultrices cursus ligula eget feugiat. Vestibulum eget tincidunt
|
67
|
+
risus, non faucibus sem.
|
68
|
+
MESSAGE
|
69
|
+
end
|
70
|
+
|
71
|
+
it "can wrap a bulleted list" do
|
72
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
73
|
+
* Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla erat, sed posuere diam ex ut velit.
|
74
|
+
* And the beat goes on.
|
75
|
+
MESSAGE
|
76
|
+
|
77
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
78
|
+
* Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean
|
79
|
+
luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla
|
80
|
+
erat, sed posuere diam ex ut velit.
|
81
|
+
* And the beat goes on.
|
82
|
+
MESSAGE
|
83
|
+
end
|
84
|
+
|
85
|
+
it "re-wraps bulleted lists" do
|
86
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
87
|
+
* Lorem ipsum dolor sit amet,
|
88
|
+
consectetur adipiscing elit.
|
89
|
+
Aenean luctus,
|
90
|
+
ipsum sit amet efficitur feugiat,
|
91
|
+
dolor mauris fringilla erat,
|
92
|
+
sed posuere diam ex ut velit.
|
93
|
+
* And the beat goes on.
|
94
|
+
MESSAGE
|
95
|
+
|
96
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
97
|
+
* Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean
|
98
|
+
luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla
|
99
|
+
erat, sed posuere diam ex ut velit.
|
100
|
+
* And the beat goes on.
|
101
|
+
MESSAGE
|
102
|
+
end
|
103
|
+
|
104
|
+
it "can wrap a numbered list" do
|
105
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
106
|
+
1. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla erat, sed posuere diam ex ut velit.
|
107
|
+
2. And the beat goes on.
|
108
|
+
MESSAGE
|
109
|
+
|
110
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
111
|
+
1. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean
|
112
|
+
luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla
|
113
|
+
erat, sed posuere diam ex ut velit.
|
114
|
+
2. And the beat goes on.
|
115
|
+
MESSAGE
|
116
|
+
end
|
117
|
+
|
118
|
+
it "re-wraps numbered lists" do
|
119
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
120
|
+
1. Lorem ipsum dolor sit amet,
|
121
|
+
consectetur adipiscing elit.
|
122
|
+
Aenean luctus,
|
123
|
+
ipsum sit amet efficitur feugiat,
|
124
|
+
dolor mauris fringilla erat,
|
125
|
+
sed posuere diam ex ut velit.
|
126
|
+
2. And the beat goes on.
|
127
|
+
MESSAGE
|
128
|
+
|
129
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
130
|
+
1. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean
|
131
|
+
luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla
|
132
|
+
erat, sed posuere diam ex ut velit.
|
133
|
+
2. And the beat goes on.
|
134
|
+
MESSAGE
|
135
|
+
end
|
136
|
+
|
137
|
+
it "can wrap a numbered list, using x) instead of x. as the leader" do
|
138
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
139
|
+
1) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla erat, sed posuere diam ex ut velit.
|
140
|
+
2) And the beat goes on.
|
141
|
+
MESSAGE
|
142
|
+
|
143
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
144
|
+
1) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean
|
145
|
+
luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla
|
146
|
+
erat, sed posuere diam ex ut velit.
|
147
|
+
2) And the beat goes on.
|
148
|
+
MESSAGE
|
149
|
+
end
|
150
|
+
|
151
|
+
it "re-wraps numbered lists using x) instead of x. as the leader" do
|
152
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
153
|
+
1) Lorem ipsum dolor sit amet,
|
154
|
+
consectetur adipiscing elit.
|
155
|
+
Aenean luctus,
|
156
|
+
ipsum sit amet efficitur feugiat,
|
157
|
+
dolor mauris fringilla erat,
|
158
|
+
sed posuere diam ex ut velit.
|
159
|
+
2) And the beat goes on.
|
160
|
+
MESSAGE
|
161
|
+
|
162
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
163
|
+
1) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean
|
164
|
+
luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla
|
165
|
+
erat, sed posuere diam ex ut velit.
|
166
|
+
2) And the beat goes on.
|
167
|
+
MESSAGE
|
168
|
+
end
|
169
|
+
|
170
|
+
it "doesn't mess with indented blocks" do
|
171
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
172
|
+
Some text is gonna go here.
|
173
|
+
|
174
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla erat, sed posuere diam ex ut velit.
|
175
|
+
|
176
|
+
And now we return.
|
177
|
+
MESSAGE
|
178
|
+
|
179
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
180
|
+
Some text is gonna go here.
|
181
|
+
|
182
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean luctus, ipsum sit amet efficitur feugiat, dolor mauris fringilla erat, sed posuere diam ex ut velit.
|
183
|
+
|
184
|
+
And now we return.
|
185
|
+
MESSAGE
|
186
|
+
end
|
187
|
+
|
188
|
+
it "doesn't get stuck trying to wrap a line that can't be wrapped" do
|
189
|
+
wrapped_message = described_class.word_wrap(<<-MESSAGE)
|
190
|
+
Loremipsumdolorsitamet,consecteturadipiscingelit.Aeneanluctus,ipsumsitametefficiturfeugiat,
|
191
|
+
MESSAGE
|
192
|
+
|
193
|
+
expect(wrapped_message).to eq(<<-MESSAGE.strip)
|
194
|
+
Loremipsumdolorsitamet,consecteturadipiscingelit.Aeneanluctus,ipsumsitametefficiturfeugiat,
|
195
|
+
MESSAGE
|
196
|
+
end
|
197
|
+
end
|