moments 0.0.2.alpha → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,195 +1,814 @@
1
- require 'spec_helper'
2
- require_relative '../../../lib/moments/difference'
1
+ # frozen_string_literal: true
3
2
 
4
3
  describe Moments::Difference do
5
- let(:from) do
6
- Time.new 2007, 1, 1
4
+ let(:from) { Time.utc 2007, 1, 1 }
5
+ let(:to) { Time.utc 2012, 1, 1 }
6
+
7
+ describe '#new' do
8
+ context 'without arguments' do
9
+ it { expect { Moments::Difference.new }.to raise_error(ArgumentError) }
10
+ end
7
11
  end
8
12
 
9
- let(:to) do
10
- Time.new 2012, 1, 1
13
+ context '#to_hash' do
14
+ subject { Moments::Difference.new(from, to).to_hash }
15
+
16
+ describe 'order of keys' do
17
+ subject { super().keys }
18
+
19
+ it { is_expected.to eq %i[years months days hours minutes seconds] }
20
+ end
21
+
22
+ context 'with equal dates' do
23
+ let(:to) { from }
24
+
25
+ let(:expected_result) do
26
+ {
27
+ years: 0,
28
+ months: 0,
29
+ days: 0,
30
+ hours: 0,
31
+ minutes: 0,
32
+ seconds: 0
33
+ }
34
+ end
35
+
36
+ it { is_expected.to eq expected_result }
37
+ end
38
+
39
+ describe 'seconds' do
40
+ let(:expected_result) do
41
+ {
42
+ years: 0,
43
+ months: 0,
44
+ days: 0,
45
+ hours: 0,
46
+ minutes: 0,
47
+ seconds: 1
48
+ }
49
+ end
50
+
51
+ context 'when future' do
52
+ context 'when the same minute' do
53
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
54
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 1 }
55
+
56
+ it { is_expected.to eq expected_result }
57
+ end
58
+
59
+ context 'when different minutes' do
60
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
61
+ let(:to) { Time.utc 2013, 2, 1, 0, 0, 0 }
62
+
63
+ it { is_expected.to eq expected_result }
64
+ end
65
+ end
66
+
67
+ context 'when past' do
68
+ context 'when the same minute' do
69
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 1 }
70
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
71
+
72
+ it { is_expected.to eq expected_result }
73
+ end
74
+
75
+ context 'when different minutes' do
76
+ let(:from) { Time.utc 2013, 2, 1, 0, 0, 0 }
77
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
78
+
79
+ it { is_expected.to eq expected_result }
80
+ end
81
+ end
82
+ end
83
+
84
+ describe 'minutes' do
85
+ let(:expected_result) do
86
+ {
87
+ years: 0,
88
+ months: 0,
89
+ days: 0,
90
+ hours: 0,
91
+ minutes: 2,
92
+ seconds: 1
93
+ }
94
+ end
95
+
96
+ context 'when future' do
97
+ context 'when the same hour' do
98
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
99
+ let(:to) { Time.utc 2013, 1, 1, 0, 2, 1 }
100
+
101
+ it { is_expected.to eq expected_result }
102
+ end
103
+
104
+ context 'when different hours' do
105
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
106
+ let(:to) { Time.utc 2013, 2, 1, 0, 2, 0 }
107
+
108
+ it { is_expected.to eq expected_result }
109
+ end
110
+ end
111
+
112
+ context 'when past' do
113
+ context 'when the same hour' do
114
+ let(:from) { Time.utc 2013, 1, 1, 0, 2, 1 }
115
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
116
+
117
+ it { is_expected.to eq expected_result }
118
+ end
119
+
120
+ context 'when different hours' do
121
+ let(:from) { Time.utc 2013, 2, 1, 0, 2, 0 }
122
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
123
+
124
+ it { is_expected.to eq expected_result }
125
+ end
126
+ end
127
+ end
128
+
129
+ describe 'hours' do
130
+ let(:expected_result) do
131
+ {
132
+ years: 0,
133
+ months: 0,
134
+ days: 0,
135
+ hours: 3,
136
+ minutes: 2,
137
+ seconds: 1
138
+ }
139
+ end
140
+
141
+ context 'when future' do
142
+ context 'when the same day' do
143
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
144
+ let(:to) { Time.utc 2013, 1, 1, 3, 2, 1 }
145
+
146
+ it { is_expected.to eq expected_result }
147
+ end
148
+
149
+ context 'when different days' do
150
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
151
+ let(:to) { Time.utc 2013, 2, 1, 3, 2, 0 }
152
+
153
+ it { is_expected.to eq expected_result }
154
+ end
155
+ end
156
+
157
+ context 'when past' do
158
+ context 'when the same day' do
159
+ let(:from) { Time.utc 2013, 1, 1, 3, 2, 1 }
160
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
161
+
162
+ it { is_expected.to eq expected_result }
163
+ end
164
+
165
+ context 'when different days' do
166
+ let(:from) { Time.utc 2013, 2, 1, 3, 2, 0 }
167
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
168
+
169
+ it { is_expected.to eq expected_result }
170
+ end
171
+ end
172
+ end
173
+
174
+ describe 'days' do
175
+ let(:expected_result) do
176
+ {
177
+ years: 0,
178
+ months: 0,
179
+ days: 4,
180
+ hours: 3,
181
+ minutes: 2,
182
+ seconds: 1
183
+ }
184
+ end
185
+
186
+ context 'when future' do
187
+ context 'when the same month' do
188
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
189
+ let(:to) { Time.utc 2013, 1, 5, 3, 2, 1 }
190
+
191
+ it { is_expected.to eq expected_result }
192
+ end
193
+
194
+ context 'when different months' do
195
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
196
+ let(:to) { Time.utc 2013, 2, 5, 3, 2, 0 }
197
+
198
+ it { is_expected.to eq expected_result }
199
+ end
200
+
201
+ context 'when `to` month has a fewer days than `from`' do
202
+ let(:from) { Time.utc 2013, 1, 31, 3, 2, 0 }
203
+ let(:to) { Time.utc 2013, 2, 28, 23, 59, 59 }
204
+
205
+ let(:expected_result) do
206
+ {
207
+ years: 0,
208
+ months: 0,
209
+ days: 28,
210
+ hours: 20,
211
+ minutes: 57,
212
+ seconds: 59
213
+ }
214
+ end
215
+
216
+ it { is_expected.to eq expected_result }
217
+ end
218
+ end
219
+
220
+ context 'when past' do
221
+ context 'when the same month' do
222
+ let(:from) { Time.utc 2013, 1, 5, 3, 2, 1 }
223
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
224
+
225
+ it { is_expected.to eq expected_result }
226
+ end
227
+
228
+ context 'when different months' do
229
+ let(:from) { Time.utc 2013, 2, 5, 3, 2, 0 }
230
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
231
+
232
+ it { is_expected.to eq expected_result }
233
+ end
234
+ end
235
+ end
236
+
237
+ describe 'months' do
238
+ let(:expected_result) do
239
+ {
240
+ years: 0,
241
+ months: 5,
242
+ days: 4,
243
+ hours: 3,
244
+ minutes: 2,
245
+ seconds: 1
246
+ }
247
+ end
248
+
249
+ context 'when future' do
250
+ context 'when the same year' do
251
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
252
+ let(:to) { Time.utc 2013, 6, 5, 3, 2, 1 }
253
+
254
+ it { is_expected.to eq expected_result }
255
+ end
256
+
257
+ context 'when different years' do
258
+ let(:from) { Time.utc 2012, 8, 27, 20, 57, 58 }
259
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
260
+
261
+ it { is_expected.to eq expected_result }
262
+ end
263
+ end
264
+
265
+ context 'when past' do
266
+ context 'when the same year' do
267
+ let(:from) { Time.utc 2013, 6, 5, 3, 2, 1 }
268
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
269
+
270
+ it { is_expected.to eq expected_result }
271
+ end
272
+
273
+ context 'when different years' do
274
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
275
+ let(:to) { Time.utc 2012, 8, 27, 20, 57, 58 }
276
+
277
+ it { is_expected.to eq expected_result }
278
+ end
279
+ end
280
+ end
281
+
282
+ describe 'years' do
283
+ let(:expected_result) do
284
+ {
285
+ years: 6,
286
+ months: 5,
287
+ days: 4,
288
+ hours: 3,
289
+ minutes: 2,
290
+ seconds: 1
291
+ }
292
+ end
293
+
294
+ context 'when future' do
295
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
296
+ let(:to) { Time.utc 2019, 6, 5, 3, 2, 1 }
297
+
298
+ it { is_expected.to eq expected_result }
299
+ end
300
+
301
+ context 'when past' do
302
+ let(:from) { Time.utc 2019, 6, 5, 3, 2, 1 }
303
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
304
+
305
+ it { is_expected.to eq expected_result }
306
+ end
307
+
308
+ context 'when different time zones' do
309
+ let(:from) { Time.new 2013, 1, 1, 3, 0, 0, '+03:00' }
310
+ let(:to) { Time.new 2019, 6, 5, 3, 2, 1, '+00:00' }
311
+
312
+ it { is_expected.to eq expected_result }
313
+ end
314
+
315
+ context 'with DateTime class' do
316
+ context 'when future' do
317
+ let(:from) { DateTime.new 2013, 1, 1, 0, 0, 0 }
318
+ let(:to) { DateTime.new 2019, 6, 5, 3, 2, 1 }
319
+
320
+ it { is_expected.to eq expected_result }
321
+ end
322
+
323
+ context 'when past' do
324
+ let(:from) { DateTime.new 2019, 6, 5, 3, 2, 1 }
325
+ let(:to) { DateTime.new 2013, 1, 1, 0, 0, 0 }
326
+
327
+ it { is_expected.to eq expected_result }
328
+ end
329
+ end
330
+
331
+ context 'with Date class' do
332
+ let(:expected_result) do
333
+ {
334
+ years: 6,
335
+ months: 5,
336
+ days: 4
337
+ }
338
+ end
339
+
340
+ context 'when future' do
341
+ let(:from) { Date.new 2013, 1, 1 }
342
+ let(:to) { Date.new 2019, 6, 5 }
343
+
344
+ it { is_expected.to eq expected_result }
345
+ end
346
+
347
+ context 'when past' do
348
+ let(:from) { Date.new 2019, 6, 5 }
349
+ let(:to) { Date.new 2013, 1, 1 }
350
+
351
+ it { is_expected.to eq expected_result }
352
+ end
353
+ end
354
+ end
355
+
356
+ context 'leap year' do
357
+ let(:expected_result) do
358
+ {
359
+ years: 0,
360
+ months: 0,
361
+ days: 2,
362
+ hours: 0,
363
+ minutes: 0,
364
+ seconds: 0
365
+ }
366
+ end
367
+
368
+ let(:from) { Time.utc 2008, 2, 28 }
369
+ let(:to) { Time.utc 2008, 3, 1 }
370
+
371
+ it { is_expected.to eq expected_result }
372
+ end
11
373
  end
12
374
 
13
- it 'requires from and to times' do
14
- expect do
15
- Moments::Difference.new
16
- end.to raise_error
375
+ describe '#same?' do
376
+ subject { Moments::Difference.new(from, to).same? }
17
377
 
18
- expect do
19
- Moments::Difference.new from, to
20
- end.to_not raise_error
378
+ context 'with the same dates' do
379
+ let(:to) { from }
380
+
381
+ it { is_expected.to eq true }
382
+ end
383
+
384
+ context 'when `from` is earlier than `to`' do
385
+ let(:from) { Time.utc 2020, 1, 1 }
386
+ let(:to) { Time.utc 2020, 1, 2 }
387
+
388
+ it { is_expected.to eq false }
389
+ end
390
+
391
+ context 'when `to` is earlier than `from`' do
392
+ let(:from) { Time.utc 2020, 1, 2 }
393
+ let(:to) { Time.utc 2020, 1, 1 }
394
+
395
+ it { is_expected.to eq false }
396
+ end
21
397
  end
22
398
 
23
- it 'raise error if from > to' do
24
- expect do
25
- Moments::Difference(to, from)
26
- end.to raise_error
399
+ describe '#future?' do
400
+ subject { Moments::Difference.new(from, to).future? }
401
+
402
+ context 'with the same dates' do
403
+ let(:to) { from }
404
+
405
+ it { is_expected.to eq false }
406
+ end
407
+
408
+ context 'when `from` is earlier than `to`' do
409
+ let(:from) { Time.utc 2020, 1, 1 }
410
+ let(:to) { Time.utc 2020, 1, 2 }
411
+
412
+ it { is_expected.to eq true }
413
+ end
414
+
415
+ context 'when `to` is earlier than `from`' do
416
+ let(:from) { Time.utc 2020, 1, 2 }
417
+ let(:to) { Time.utc 2020, 1, 1 }
418
+
419
+ it { is_expected.to eq false }
420
+ end
27
421
  end
28
422
 
29
- context '#to_hash' do
30
- context 'equal dates' do
31
- it '2013-01-01, 2013-01-01' do
32
- from = Time.new 2013, 1, 1
33
- to = from
423
+ describe '#past?' do
424
+ subject { Moments::Difference.new(from, to).past? }
34
425
 
35
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0 }
426
+ context 'with the same dates' do
427
+ let(:to) { from }
36
428
 
37
- Moments::Difference.new(from, to).to_hash.should == expectation
38
- end
429
+ it { is_expected.to eq false }
430
+ end
431
+
432
+ context 'when `from` is earlier than `to`' do
433
+ let(:from) { Time.utc 2020, 1, 1 }
434
+ let(:to) { Time.utc 2020, 1, 2 }
435
+
436
+ it { is_expected.to eq false }
39
437
  end
40
438
 
41
- context 'seconds' do
42
- it '2013-01-01 00:00:00, 2013-01-01 00:00:01' do
43
- from = Time.new 2013, 1, 1, 0, 0, 0
44
- to = Time.new 2013, 1, 1, 0, 0, 1
439
+ context 'when `to` is earlier than `from`' do
440
+ let(:from) { Time.utc 2020, 1, 2 }
441
+ let(:to) { Time.utc 2020, 1, 1 }
45
442
 
46
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 1 }
443
+ it { is_expected.to eq true }
444
+ end
445
+ end
446
+
447
+ shared_examples 'in a component' do |
448
+ when_seconds:,
449
+ when_minutes:,
450
+ when_hours:,
451
+ when_days:,
452
+ when_months:,
453
+ when_years:
454
+ |
455
+ context 'with equal dates' do
456
+ let(:to) { from }
457
+
458
+ it { is_expected.to eq 0 }
459
+ end
460
+
461
+ context 'when seconds' do
462
+ let(:expected_result) { when_seconds }
463
+
464
+ context 'when future' do
465
+ context 'when the same minute' do
466
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
467
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 15 }
47
468
 
48
- Moments::Difference.new(from, to).to_hash.should == expectation
469
+ it { is_expected.to eq expected_result }
470
+ end
471
+
472
+ context 'when different minutes' do
473
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
474
+ let(:to) { Time.utc 2013, 2, 1, 0, 0, 14 }
475
+
476
+ it { is_expected.to eq expected_result }
477
+ end
49
478
  end
50
479
 
51
- it '2013-01-31 23:59:59, 2013-02-01 00:00:00' do
52
- from = Time.new 2013, 1, 31, 23, 59, 59
53
- to = Time.new 2013, 2, 1, 0, 0, 0
480
+ context 'when past' do
481
+ context 'when the same minute' do
482
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 15 }
483
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
484
+
485
+ it { is_expected.to eq expected_result }
486
+ end
54
487
 
55
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 1 }
488
+ context 'when different minutes' do
489
+ let(:from) { Time.utc 2013, 2, 1, 0, 0, 14 }
490
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
56
491
 
57
- Moments::Difference.new(from, to).to_hash.should == expectation
492
+ it { is_expected.to eq expected_result }
493
+ end
58
494
  end
59
495
  end
60
496
 
61
- context 'minutes' do
62
- it '2013-01-01 00:00:00, 2013-01-01 00:01:01' do
63
- from = Time.new 2013, 1, 1, 0, 0, 0
64
- to = Time.new 2013, 1, 1, 0, 1, 1
497
+ context 'when minutes' do
498
+ let(:expected_result) { when_minutes }
499
+
500
+ context 'when future' do
501
+ context 'when the same hour' do
502
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
503
+ let(:to) { Time.utc 2013, 1, 1, 0, 12, 15 }
504
+
505
+ it { is_expected.to eq expected_result }
506
+ end
65
507
 
66
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 1, seconds: 1 }
508
+ context 'when different hours' do
509
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
510
+ let(:to) { Time.utc 2013, 2, 1, 0, 12, 14 }
67
511
 
68
- Moments::Difference.new(from, to).to_hash.should == expectation
512
+ it { is_expected.to eq expected_result }
513
+ end
69
514
  end
70
515
 
71
- it '2013-01-31 23:59:59, 2013-02-01 00:01:00' do
72
- from = Time.new 2013, 1, 31, 23, 59, 59
73
- to = Time.new 2013, 2, 1, 0, 1, 0
516
+ context 'when past' do
517
+ context 'when the same hour' do
518
+ let(:from) { Time.utc 2013, 1, 1, 0, 12, 15 }
519
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
74
520
 
75
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 1, seconds: 1 }
521
+ it { is_expected.to eq expected_result }
522
+ end
76
523
 
77
- Moments::Difference.new(from, to).to_hash.should == expectation
524
+ context 'when different hours' do
525
+ let(:from) { Time.utc 2013, 2, 1, 0, 12, 14 }
526
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
527
+
528
+ it { is_expected.to eq expected_result }
529
+ end
78
530
  end
79
531
  end
80
532
 
81
- context 'hours' do
82
- it '2013-01-01 00:00:00, 2013-01-01 01:01:01' do
83
- from = Time.new 2013, 1, 1, 0, 0, 0
84
- to = Time.new 2013, 1, 1, 1, 1, 1
533
+ context 'when hours' do
534
+ let(:expected_result) { when_hours }
535
+
536
+ context 'when future' do
537
+ context 'when the same day' do
538
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
539
+ let(:to) { Time.utc 2013, 1, 1, 8, 12, 15 }
540
+
541
+ it { is_expected.to eq expected_result }
542
+ end
85
543
 
86
- expectation = { years: 0, months: 0, days: 0, hours: 1, minutes: 1, seconds: 1 }
544
+ context 'when different days' do
545
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
546
+ let(:to) { Time.utc 2013, 2, 1, 8, 12, 14 }
87
547
 
88
- Moments::Difference.new(from, to).to_hash.should == expectation
548
+ it { is_expected.to eq expected_result }
549
+ end
89
550
  end
90
551
 
91
- it '2013-01-31 23:59:59, 2013-02-01 01:01:00' do
92
- from = Time.new 2013, 1, 31, 23, 59, 59
93
- to = Time.new 2013, 2, 1, 1, 1, 0
552
+ context 'when past' do
553
+ context 'when the same day' do
554
+ let(:from) { Time.utc 2013, 1, 1, 8, 12, 15 }
555
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
94
556
 
95
- expectation = { years: 0, months: 0, days: 0, hours: 1, minutes: 1, seconds: 1 }
557
+ it { is_expected.to eq expected_result }
558
+ end
96
559
 
97
- Moments::Difference.new(from, to).to_hash.should == expectation
560
+ context 'when different days' do
561
+ let(:from) { Time.utc 2013, 2, 1, 8, 12, 14 }
562
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
563
+
564
+ it { is_expected.to eq expected_result }
565
+ end
98
566
  end
99
567
  end
100
568
 
101
- context 'days' do
102
- it '2013-01-01, 2013-01-02' do
103
- from = Time.new 2013, 1, 1
104
- to = Time.new 2013, 1, 2
569
+ context 'when days' do
570
+ let(:expected_result) { when_days }
571
+
572
+ context 'when future' do
573
+ context 'when the same month' do
574
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
575
+ let(:to) { Time.utc 2013, 1, 7, 8, 12, 15 }
105
576
 
106
- expectation = { years: 0, months: 0, days: 1, hours: 0, minutes: 0, seconds: 0 }
577
+ it { is_expected.to eq expected_result }
578
+ end
107
579
 
108
- Moments::Difference.new(from, to).to_hash.should == expectation
580
+ context 'when different months' do
581
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
582
+ let(:to) { Time.utc 2013, 2, 7, 8, 12, 14 }
583
+
584
+ it { is_expected.to eq expected_result }
585
+ end
109
586
  end
110
587
 
111
- it '2013-01-31, 2013-02-01' do
112
- from = Time.new 2013, 1, 31
113
- to = Time.new 2013, 2, 1
588
+ context 'when past' do
589
+ context 'when the same month' do
590
+ let(:from) { Time.utc 2013, 1, 7, 8, 12, 15 }
591
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
592
+
593
+ it { is_expected.to eq expected_result }
594
+ end
114
595
 
115
- expectation = { years: 0, months: 0, days: 1, hours: 0, minutes: 0, seconds: 0 }
596
+ context 'when different months' do
597
+ let(:from) { Time.utc 2013, 2, 7, 8, 12, 14 }
598
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
116
599
 
117
- Moments::Difference.new(from, to).to_hash.should == expectation
600
+ it { is_expected.to eq expected_result }
601
+ end
118
602
  end
119
603
  end
120
604
 
121
- context 'months' do
122
- it '2013-01-01, 2013-02-01' do
123
- from = Time.new 2013, 1, 1
124
- to = Time.new 2013, 2, 2
605
+ describe 'when months' do
606
+ let(:expected_result) { when_months }
607
+
608
+ context 'when future' do
609
+ context 'when the same year' do
610
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
611
+ let(:to) { Time.utc 2013, 5, 7, 8, 12, 15 }
125
612
 
126
- expectation = { years: 0, months: 1, days: 1, hours: 0, minutes: 0, seconds: 0 }
613
+ it { is_expected.to eq expected_result }
614
+ end
127
615
 
128
- Moments::Difference.new(from, to).to_hash.should == expectation
616
+ context 'when different years' do
617
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
618
+ let(:to) { Time.utc 2013, 6, 7, 8, 12, 14 }
619
+
620
+ it { is_expected.to eq expected_result }
621
+ end
129
622
  end
130
623
 
131
- it '2013-01-31, 2013-03-01' do
132
- from = Time.new 2013, 1, 31
133
- to = Time.new 2013, 3, 1
624
+ context 'when past' do
625
+ context 'when the same year' do
626
+ let(:from) { Time.utc 2013, 5, 7, 8, 12, 15 }
627
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
628
+
629
+ it { is_expected.to eq expected_result }
630
+ end
134
631
 
135
- expectation = { years: 0, months: 1, days: 1, hours: 0, minutes: 0, seconds: 0 }
632
+ context 'when different years' do
633
+ let(:from) { Time.utc 2013, 6, 7, 8, 12, 14 }
634
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
136
635
 
137
- Moments::Difference.new(from, to).to_hash.should == expectation
636
+ it { is_expected.to eq expected_result }
637
+ end
138
638
  end
139
639
  end
140
640
 
141
- context 'years' do
142
- it '2013-01-01, 2014-01-01' do
143
- from = Time.new 2013, 1, 1
144
- to = Time.new 2014, 2, 2
641
+ context 'when years' do
642
+ let(:expected_result) { when_years }
145
643
 
146
- expectation = { years: 1, months: 1, days: 1, hours: 0, minutes: 0, seconds: 0 }
644
+ context 'when future' do
645
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
646
+ let(:to) { Time.utc 2015, 5, 7, 8, 12, 15 }
147
647
 
148
- Moments::Difference.new(from, to).to_hash.should == expectation
149
- end
648
+ it { is_expected.to eq expected_result }
649
+
650
+ context 'with DateTime class' do
651
+ let(:from) { DateTime.new 2013, 1, 1, 0, 0, 0 }
652
+ let(:to) { DateTime.new 2015, 5, 7, 8, 12, 15 }
150
653
 
151
- it '2013-01-31, 2014-03-01' do
152
- from = Time.new 2013, 1, 31
153
- to = Time.new 2014, 3, 1
654
+ it { is_expected.to eq expected_result }
655
+ end
656
+ end
154
657
 
155
- expectation = { years: 1, months: 1, days: 1, hours: 0, minutes: 0, seconds: 0 }
658
+ context 'when past' do
659
+ let(:from) { Time.utc 2015, 5, 7, 8, 12, 15 }
660
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
156
661
 
157
- Moments::Difference.new(from, to).to_hash.should == expectation
662
+ it { is_expected.to eq expected_result }
158
663
  end
159
664
  end
665
+ end
160
666
 
161
- context 'leap year' do
162
- it '2008-02-27, 2008-02-029' do
163
- from = Time.new 2008, 2, 27
164
- to = Time.new 2008, 2, 29
667
+ context '#in_seconds' do
668
+ subject { Moments::Difference.new(from, to).in_seconds }
669
+
670
+ include_examples 'in a component',
671
+ when_seconds: 15,
672
+ when_minutes: 12 * 60 + 15,
673
+ when_hours: 8 * 60 * 60 + 12 * 60 + 15,
674
+ when_days: 6 * 24 * 60 * 60 + 8 * 60 * 60 + 12 * 60 + 15,
675
+ when_months:
676
+ (31 + 28 + 31 + 30) * 24 * 60 * 60 +
677
+ 6 * 24 * 60 * 60 +
678
+ 8 * 60 * 60 +
679
+ 12 * 60 +
680
+ 15,
681
+ when_years:
682
+ 2 * 365 * 24 * 60 * 60 +
683
+ (31 + 28 + 31 + 30) * 24 * 60 * 60 +
684
+ 6 * 24 * 60 * 60 +
685
+ 8 * 60 * 60 +
686
+ 12 * 60 +
687
+ 15
688
+
689
+ context 'with miliseconds' do
690
+ context 'when `to` is a bit greater' do
691
+ let(:from) { Time.utc(2020, 7, 11, 20, 26, 12) }
692
+ let(:to) { Time.utc(2020, 7, 11, 20, 28, 39.149092) }
693
+
694
+ it { is_expected.to eq 147 }
695
+ end
165
696
 
166
- expectation = { years: 0, months: 0, days: 2, hours: 0, minutes: 0, seconds: 0 }
697
+ context 'when `from` is a bit greater' do
698
+ let(:from) { Time.utc(2020, 7, 11, 20, 26, 12.149092) }
699
+ let(:to) { Time.utc(2020, 7, 11, 20, 28, 39) }
167
700
 
168
- Moments::Difference.new(from, to).to_hash.should == expectation
701
+ it { is_expected.to eq 147 }
169
702
  end
170
703
 
171
- it '2008-02-27, 2008-03-01' do
172
- from = Time.new 2008, 2, 27
173
- to = Time.new 2008, 3, 1
704
+ context 'when `to` is a lot greater' do
705
+ let(:from) { Time.utc(2020, 7, 11, 20, 26, 12) }
706
+ let(:to) { Time.utc(2020, 7, 11, 20, 28, 39.896152) }
707
+
708
+ it { is_expected.to eq 147 }
709
+ end
174
710
 
175
- expectation = { years: 0, months: 0, days: 3, hours: 0, minutes: 0, seconds: 0 }
711
+ context 'when `from` is a lot greater' do
712
+ let(:from) { Time.utc(2020, 7, 11, 20, 26, 12.896152) }
713
+ let(:to) { Time.utc(2020, 7, 11, 20, 28, 39) }
176
714
 
177
- Moments::Difference.new(from, to).to_hash.should == expectation
715
+ it { is_expected.to eq 147 }
178
716
  end
179
717
  end
180
718
  end
181
719
 
182
- it '#same?' do
183
- moments = Moments::Difference.new(from, from)
720
+ context '#in_minutes' do
721
+ subject { Moments::Difference.new(from, to).in_minutes }
722
+
723
+ include_examples 'in a component',
724
+ when_seconds: 0,
725
+ when_minutes: 12,
726
+ when_hours: 8 * 60 + 12,
727
+ when_days: 6 * 24 * 60 + 8 * 60 + 12,
728
+ when_months:
729
+ (31 + 28 + 31 + 30) * 24 * 60 +
730
+ 6 * 24 * 60 +
731
+ 8 * 60 +
732
+ 12,
733
+ when_years:
734
+ 2 * 365 * 24 * 60 +
735
+ (31 + 28 + 31 + 30) * 24 * 60 +
736
+ 6 * 24 * 60 +
737
+ 8 * 60 +
738
+ 12
739
+ end
740
+
741
+ context '#in_hours' do
742
+ subject { Moments::Difference.new(from, to).in_hours }
743
+
744
+ include_examples 'in a component',
745
+ when_seconds: 0,
746
+ when_minutes: 0,
747
+ when_hours: 8,
748
+ when_days: 6 * 24 + 8,
749
+ when_months:
750
+ (31 + 28 + 31 + 30) * 24 +
751
+ 6 * 24 +
752
+ 8,
753
+ when_years:
754
+ 2 * 365 * 24 +
755
+ (31 + 28 + 31 + 30) * 24 +
756
+ 6 * 24 +
757
+ 8
758
+ end
184
759
 
185
- moments.same?.should == true
186
- moments.past?.should == false
760
+ context '#in_days' do
761
+ subject { Moments::Difference.new(from, to).in_days }
762
+
763
+ include_examples 'in a component',
764
+ when_seconds: 0,
765
+ when_minutes: 0,
766
+ when_hours: 0,
767
+ when_days: 6,
768
+ when_months:
769
+ (31 + 28 + 31 + 30) +
770
+ 6,
771
+ when_years:
772
+ 2 * 365 +
773
+ (31 + 28 + 31 + 30) +
774
+ 6
187
775
  end
188
776
 
189
- it '#future?' do
190
- moments = Moments::Difference.new(from, to)
777
+ context '#in_months' do
778
+ subject { Moments::Difference.new(from, to).in_months }
779
+
780
+ include_examples 'in a component',
781
+ when_seconds: 0,
782
+ when_minutes: 0,
783
+ when_hours: 0,
784
+ when_days: 0,
785
+ when_months: 4,
786
+ when_years: 2 * 12 + 4
787
+ end
788
+
789
+ context '#in_years' do
790
+ subject { Moments::Difference.new(from, to).in_years }
791
+
792
+ include_examples 'in a component',
793
+ when_seconds: 0,
794
+ when_minutes: 0,
795
+ when_hours: 0,
796
+ when_days: 0,
797
+ when_months: 0,
798
+ when_years: 2
191
799
 
192
- moments.future?.should == true
193
- moments.past?.should == false
800
+ context 'when `to` day is greater than `from` day' do
801
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
802
+ let(:to) { Time.utc 2015, 1, 7, 8, 12, 15 }
803
+
804
+ it { is_expected.to eq 2 }
805
+ end
806
+
807
+ context 'when `to` day is less than `from` day' do
808
+ let(:from) { Time.utc 2013, 1, 7, 0, 0, 0 }
809
+ let(:to) { Time.utc 2015, 1, 1, 8, 12, 15 }
810
+
811
+ it { is_expected.to eq 1 }
812
+ end
194
813
  end
195
814
  end