moments 0.0.1.alpha → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,194 +1,810 @@
1
- require_relative '../../../lib/moments/difference'
1
+ # frozen_string_literal: true
2
2
 
3
3
  describe Moments::Difference do
4
- let(:from) do
5
- 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
6
11
  end
7
12
 
8
- let(:to) do
9
- 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
+ hours: 0,
338
+ minutes: 0,
339
+ seconds: 0
340
+ }
341
+ end
342
+
343
+ context 'when future' do
344
+ let(:from) { Date.new 2013, 1, 1 }
345
+ let(:to) { Date.new 2019, 6, 5 }
346
+
347
+ it { is_expected.to eq expected_result }
348
+ end
349
+
350
+ context 'when past' do
351
+ let(:from) { Date.new 2019, 6, 5 }
352
+ let(:to) { Date.new 2013, 1, 1 }
353
+
354
+ it { is_expected.to eq expected_result }
355
+ end
356
+ end
357
+ end
358
+
359
+ context 'leap year' do
360
+ let(:expected_result) do
361
+ {
362
+ years: 0,
363
+ months: 0,
364
+ days: 2,
365
+ hours: 0,
366
+ minutes: 0,
367
+ seconds: 0
368
+ }
369
+ end
370
+
371
+ let(:from) { Time.utc 2008, 2, 28 }
372
+ let(:to) { Time.utc 2008, 3, 1 }
373
+
374
+ it { is_expected.to eq expected_result }
375
+ end
10
376
  end
11
377
 
12
- it 'requires from and to times' do
13
- expect do
14
- Moments::Difference.new
15
- end.to raise_error
378
+ describe '#same?' do
379
+ subject { Moments::Difference.new(from, to).same? }
380
+
381
+ context 'with the same dates' do
382
+ let(:to) { from }
383
+
384
+ it { is_expected.to eq true }
385
+ end
386
+
387
+ context 'when `from` is earlier than `to`' do
388
+ let(:from) { Time.utc 2020, 1, 1 }
389
+ let(:to) { Time.utc 2020, 1, 2 }
16
390
 
17
- expect do
18
- Moments::Difference.new from, to
19
- end.to_not raise_error
391
+ it { is_expected.to eq false }
392
+ end
393
+
394
+ context 'when `to` is earlier than `from`' do
395
+ let(:from) { Time.utc 2020, 1, 2 }
396
+ let(:to) { Time.utc 2020, 1, 1 }
397
+
398
+ it { is_expected.to eq false }
399
+ end
20
400
  end
21
401
 
22
- it 'raise error if from > to' do
23
- expect do
24
- Moments::Difference(to, from)
25
- end.to raise_error
402
+ describe '#future?' do
403
+ subject { Moments::Difference.new(from, to).future? }
404
+
405
+ context 'with the same dates' do
406
+ let(:to) { from }
407
+
408
+ it { is_expected.to eq false }
409
+ end
410
+
411
+ context 'when `from` is earlier than `to`' do
412
+ let(:from) { Time.utc 2020, 1, 1 }
413
+ let(:to) { Time.utc 2020, 1, 2 }
414
+
415
+ it { is_expected.to eq true }
416
+ end
417
+
418
+ context 'when `to` is earlier than `from`' do
419
+ let(:from) { Time.utc 2020, 1, 2 }
420
+ let(:to) { Time.utc 2020, 1, 1 }
421
+
422
+ it { is_expected.to eq false }
423
+ end
26
424
  end
27
425
 
28
- context '#to_hash' do
29
- context 'equal dates' do
30
- it '2013-01-01, 2013-01-01' do
31
- from = Time.new 2013, 1, 1
32
- to = from
426
+ describe '#past?' do
427
+ subject { Moments::Difference.new(from, to).past? }
33
428
 
34
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0 }
429
+ context 'with the same dates' do
430
+ let(:to) { from }
35
431
 
36
- Moments::Difference.new(from, to).to_hash.should == expectation
37
- end
432
+ it { is_expected.to eq false }
433
+ end
434
+
435
+ context 'when `from` is earlier than `to`' do
436
+ let(:from) { Time.utc 2020, 1, 1 }
437
+ let(:to) { Time.utc 2020, 1, 2 }
438
+
439
+ it { is_expected.to eq false }
440
+ end
441
+
442
+ context 'when `to` is earlier than `from`' do
443
+ let(:from) { Time.utc 2020, 1, 2 }
444
+ let(:to) { Time.utc 2020, 1, 1 }
445
+
446
+ it { is_expected.to eq true }
447
+ end
448
+ end
449
+
450
+ shared_examples 'in a component' do |when_seconds:, when_minutes:, when_hours:, when_days:, when_months:, when_years:|
451
+ context 'with equal dates' do
452
+ let(:to) { from }
453
+
454
+ it { is_expected.to eq 0 }
38
455
  end
39
456
 
40
- context 'seconds' do
41
- it '2013-01-01 00:00:00, 2013-01-01 00:00:01' do
42
- from = Time.new 2013, 1, 1, 0, 0, 0
43
- to = Time.new 2013, 1, 1, 0, 0, 1
457
+ context 'when seconds' do
458
+ let(:expected_result) { when_seconds }
44
459
 
45
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 1 }
460
+ context 'when future' do
461
+ context 'when the same minute' do
462
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
463
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 15 }
46
464
 
47
- Moments::Difference.new(from, to).to_hash.should == expectation
465
+ it { is_expected.to eq expected_result }
466
+ end
467
+
468
+ context 'when different minutes' do
469
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
470
+ let(:to) { Time.utc 2013, 2, 1, 0, 0, 14 }
471
+
472
+ it { is_expected.to eq expected_result }
473
+ end
48
474
  end
49
475
 
50
- it '2013-01-31 23:59:59, 2013-02-01 00:00:00' do
51
- from = Time.new 2013, 1, 31, 23, 59, 59
52
- to = Time.new 2013, 2, 1, 0, 0, 0
476
+ context 'when past' do
477
+ context 'when the same minute' do
478
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 15 }
479
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
480
+
481
+ it { is_expected.to eq expected_result }
482
+ end
53
483
 
54
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 1 }
484
+ context 'when different minutes' do
485
+ let(:from) { Time.utc 2013, 2, 1, 0, 0, 14 }
486
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
55
487
 
56
- Moments::Difference.new(from, to).to_hash.should == expectation
488
+ it { is_expected.to eq expected_result }
489
+ end
57
490
  end
58
491
  end
59
492
 
60
- context 'minutes' do
61
- it '2013-01-01 00:00:00, 2013-01-01 00:01:01' do
62
- from = Time.new 2013, 1, 1, 0, 0, 0
63
- to = Time.new 2013, 1, 1, 0, 1, 1
493
+ context 'when minutes' do
494
+ let(:expected_result) { when_minutes }
495
+
496
+ context 'when future' do
497
+ context 'when the same hour' do
498
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
499
+ let(:to) { Time.utc 2013, 1, 1, 0, 12, 15 }
500
+
501
+ it { is_expected.to eq expected_result }
502
+ end
64
503
 
65
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 1, seconds: 1 }
504
+ context 'when different hours' do
505
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
506
+ let(:to) { Time.utc 2013, 2, 1, 0, 12, 14 }
66
507
 
67
- Moments::Difference.new(from, to).to_hash.should == expectation
508
+ it { is_expected.to eq expected_result }
509
+ end
68
510
  end
69
511
 
70
- it '2013-01-31 23:59:59, 2013-02-01 00:01:00' do
71
- from = Time.new 2013, 1, 31, 23, 59, 59
72
- to = Time.new 2013, 2, 1, 0, 1, 0
512
+ context 'when past' do
513
+ context 'when the same hour' do
514
+ let(:from) { Time.utc 2013, 1, 1, 0, 12, 15 }
515
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
73
516
 
74
- expectation = { years: 0, months: 0, days: 0, hours: 0, minutes: 1, seconds: 1 }
517
+ it { is_expected.to eq expected_result }
518
+ end
75
519
 
76
- Moments::Difference.new(from, to).to_hash.should == expectation
520
+ context 'when different hours' do
521
+ let(:from) { Time.utc 2013, 2, 1, 0, 12, 14 }
522
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
523
+
524
+ it { is_expected.to eq expected_result }
525
+ end
77
526
  end
78
527
  end
79
528
 
80
- context 'hours' do
81
- it '2013-01-01 00:00:00, 2013-01-01 01:01:01' do
82
- from = Time.new 2013, 1, 1, 0, 0, 0
83
- to = Time.new 2013, 1, 1, 1, 1, 1
529
+ context 'when hours' do
530
+ let(:expected_result) { when_hours }
531
+
532
+ context 'when future' do
533
+ context 'when the same day' do
534
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
535
+ let(:to) { Time.utc 2013, 1, 1, 8, 12, 15 }
536
+
537
+ it { is_expected.to eq expected_result }
538
+ end
84
539
 
85
- expectation = { years: 0, months: 0, days: 0, hours: 1, minutes: 1, seconds: 1 }
540
+ context 'when different days' do
541
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
542
+ let(:to) { Time.utc 2013, 2, 1, 8, 12, 14 }
86
543
 
87
- Moments::Difference.new(from, to).to_hash.should == expectation
544
+ it { is_expected.to eq expected_result }
545
+ end
88
546
  end
89
547
 
90
- it '2013-01-31 23:59:59, 2013-02-01 01:01:00' do
91
- from = Time.new 2013, 1, 31, 23, 59, 59
92
- to = Time.new 2013, 2, 1, 1, 1, 0
548
+ context 'when past' do
549
+ context 'when the same day' do
550
+ let(:from) { Time.utc 2013, 1, 1, 8, 12, 15 }
551
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
93
552
 
94
- expectation = { years: 0, months: 0, days: 0, hours: 1, minutes: 1, seconds: 1 }
553
+ it { is_expected.to eq expected_result }
554
+ end
95
555
 
96
- Moments::Difference.new(from, to).to_hash.should == expectation
556
+ context 'when different days' do
557
+ let(:from) { Time.utc 2013, 2, 1, 8, 12, 14 }
558
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
559
+
560
+ it { is_expected.to eq expected_result }
561
+ end
97
562
  end
98
563
  end
99
564
 
100
- context 'days' do
101
- it '2013-01-01, 2013-01-02' do
102
- from = Time.new 2013, 1, 1
103
- to = Time.new 2013, 1, 2
565
+ context 'when days' do
566
+ let(:expected_result) { when_days }
567
+
568
+ context 'when future' do
569
+ context 'when the same month' do
570
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
571
+ let(:to) { Time.utc 2013, 1, 7, 8, 12, 15 }
104
572
 
105
- expectation = { years: 0, months: 0, days: 1, hours: 0, minutes: 0, seconds: 0 }
573
+ it { is_expected.to eq expected_result }
574
+ end
106
575
 
107
- Moments::Difference.new(from, to).to_hash.should == expectation
576
+ context 'when different months' do
577
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
578
+ let(:to) { Time.utc 2013, 2, 7, 8, 12, 14 }
579
+
580
+ it { is_expected.to eq expected_result }
581
+ end
108
582
  end
109
583
 
110
- it '2013-01-31, 2013-02-01' do
111
- from = Time.new 2013, 1, 31
112
- to = Time.new 2013, 2, 1
584
+ context 'when past' do
585
+ context 'when the same month' do
586
+ let(:from) { Time.utc 2013, 1, 7, 8, 12, 15 }
587
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
588
+
589
+ it { is_expected.to eq expected_result }
590
+ end
113
591
 
114
- expectation = { years: 0, months: 0, days: 1, hours: 0, minutes: 0, seconds: 0 }
592
+ context 'when different months' do
593
+ let(:from) { Time.utc 2013, 2, 7, 8, 12, 14 }
594
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
115
595
 
116
- Moments::Difference.new(from, to).to_hash.should == expectation
596
+ it { is_expected.to eq expected_result }
597
+ end
117
598
  end
118
599
  end
119
600
 
120
- context 'months' do
121
- it '2013-01-01, 2013-02-01' do
122
- from = Time.new 2013, 1, 1
123
- to = Time.new 2013, 2, 2
601
+ describe 'when months' do
602
+ let(:expected_result) { when_months }
603
+
604
+ context 'when future' do
605
+ context 'when the same year' do
606
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
607
+ let(:to) { Time.utc 2013, 5, 7, 8, 12, 15 }
124
608
 
125
- expectation = { years: 0, months: 1, days: 1, hours: 0, minutes: 0, seconds: 0 }
609
+ it { is_expected.to eq expected_result }
610
+ end
126
611
 
127
- Moments::Difference.new(from, to).to_hash.should == expectation
612
+ context 'when different years' do
613
+ let(:from) { Time.utc 2013, 1, 31, 23, 59, 59 }
614
+ let(:to) { Time.utc 2013, 6, 7, 8, 12, 14 }
615
+
616
+ it { is_expected.to eq expected_result }
617
+ end
128
618
  end
129
619
 
130
- it '2013-01-31, 2013-03-01' do
131
- from = Time.new 2013, 1, 31
132
- to = Time.new 2013, 3, 1
620
+ context 'when past' do
621
+ context 'when the same year' do
622
+ let(:from) { Time.utc 2013, 5, 7, 8, 12, 15 }
623
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
624
+
625
+ it { is_expected.to eq expected_result }
626
+ end
133
627
 
134
- expectation = { years: 0, months: 1, days: 1, hours: 0, minutes: 0, seconds: 0 }
628
+ context 'when different years' do
629
+ let(:from) { Time.utc 2013, 6, 7, 8, 12, 14 }
630
+ let(:to) { Time.utc 2013, 1, 31, 23, 59, 59 }
135
631
 
136
- Moments::Difference.new(from, to).to_hash.should == expectation
632
+ it { is_expected.to eq expected_result }
633
+ end
137
634
  end
138
635
  end
139
636
 
140
- context 'years' do
141
- it '2013-01-01, 2014-01-01' do
142
- from = Time.new 2013, 1, 1
143
- to = Time.new 2014, 2, 2
637
+ context 'when years' do
638
+ let(:expected_result) { when_years }
144
639
 
145
- expectation = { years: 1, months: 1, days: 1, hours: 0, minutes: 0, seconds: 0 }
640
+ context 'when future' do
641
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
642
+ let(:to) { Time.utc 2015, 5, 7, 8, 12, 15 }
146
643
 
147
- Moments::Difference.new(from, to).to_hash.should == expectation
148
- end
644
+ it { is_expected.to eq expected_result }
645
+
646
+ context 'with DateTime class' do
647
+ let(:from) { DateTime.new 2013, 1, 1, 0, 0, 0 }
648
+ let(:to) { DateTime.new 2015, 5, 7, 8, 12, 15 }
149
649
 
150
- it '2013-01-31, 2014-03-01' do
151
- from = Time.new 2013, 1, 31
152
- to = Time.new 2014, 3, 1
650
+ it { is_expected.to eq expected_result }
651
+ end
652
+ end
153
653
 
154
- expectation = { years: 1, months: 1, days: 1, hours: 0, minutes: 0, seconds: 0 }
654
+ context 'when past' do
655
+ let(:from) { Time.utc 2015, 5, 7, 8, 12, 15 }
656
+ let(:to) { Time.utc 2013, 1, 1, 0, 0, 0 }
155
657
 
156
- Moments::Difference.new(from, to).to_hash.should == expectation
658
+ it { is_expected.to eq expected_result }
157
659
  end
158
660
  end
661
+ end
159
662
 
160
- context 'leap year' do
161
- it '2008-02-27, 2008-02-029' do
162
- from = Time.new 2008, 2, 27
163
- to = Time.new 2008, 2, 29
663
+ context '#in_seconds' do
664
+ subject { Moments::Difference.new(from, to).in_seconds }
665
+
666
+ include_examples 'in a component',
667
+ when_seconds: 15,
668
+ when_minutes: (12 * 60) + 15,
669
+ when_hours: (8 * 60 * 60) + (12 * 60) + 15,
670
+ when_days: (6 * 24 * 60 * 60) + (8 * 60 * 60) + (12 * 60) + 15,
671
+ when_months:
672
+ ((31 + 28 + 31 + 30) * 24 * 60 * 60) +
673
+ (6 * 24 * 60 * 60) +
674
+ (8 * 60 * 60) +
675
+ (12 * 60) +
676
+ 15,
677
+ when_years:
678
+ (2 * 365 * 24 * 60 * 60) +
679
+ ((31 + 28 + 31 + 30) * 24 * 60 * 60) +
680
+ (6 * 24 * 60 * 60) +
681
+ (8 * 60 * 60) +
682
+ (12 * 60) +
683
+ 15
684
+
685
+ context 'with miliseconds' do
686
+ context 'when `to` is a bit greater' do
687
+ let(:from) { Time.utc(2020, 7, 11, 20, 26, 12) }
688
+ let(:to) { Time.utc(2020, 7, 11, 20, 28, 39.149092) }
689
+
690
+ it { is_expected.to eq 147 }
691
+ end
164
692
 
165
- expectation = { years: 0, months: 0, days: 2, hours: 0, minutes: 0, seconds: 0 }
693
+ context 'when `from` is a bit greater' do
694
+ let(:from) { Time.utc(2020, 7, 11, 20, 26, 12.149092) }
695
+ let(:to) { Time.utc(2020, 7, 11, 20, 28, 39) }
166
696
 
167
- Moments::Difference.new(from, to).to_hash.should == expectation
697
+ it { is_expected.to eq 147 }
168
698
  end
169
699
 
170
- it '2008-02-27, 2008-03-01' do
171
- from = Time.new 2008, 2, 27
172
- to = Time.new 2008, 3, 1
700
+ context 'when `to` is a lot greater' do
701
+ let(:from) { Time.utc(2020, 7, 11, 20, 26, 12) }
702
+ let(:to) { Time.utc(2020, 7, 11, 20, 28, 39.896152) }
703
+
704
+ it { is_expected.to eq 147 }
705
+ end
173
706
 
174
- expectation = { years: 0, months: 0, days: 3, hours: 0, minutes: 0, seconds: 0 }
707
+ context 'when `from` is a lot greater' do
708
+ let(:from) { Time.utc(2020, 7, 11, 20, 26, 12.896152) }
709
+ let(:to) { Time.utc(2020, 7, 11, 20, 28, 39) }
175
710
 
176
- Moments::Difference.new(from, to).to_hash.should == expectation
711
+ it { is_expected.to eq 147 }
177
712
  end
178
713
  end
179
714
  end
180
715
 
181
- it '#same?' do
182
- moments = Moments::Difference.new(from, from)
716
+ context '#in_minutes' do
717
+ subject { Moments::Difference.new(from, to).in_minutes }
718
+
719
+ include_examples 'in a component',
720
+ when_seconds: 0,
721
+ when_minutes: 12,
722
+ when_hours: (8 * 60) + 12,
723
+ when_days: (6 * 24 * 60) + (8 * 60) + 12,
724
+ when_months:
725
+ ((31 + 28 + 31 + 30) * 24 * 60) +
726
+ (6 * 24 * 60) +
727
+ (8 * 60) +
728
+ 12,
729
+ when_years:
730
+ (2 * 365 * 24 * 60) +
731
+ ((31 + 28 + 31 + 30) * 24 * 60) +
732
+ (6 * 24 * 60) +
733
+ (8 * 60) +
734
+ 12
735
+ end
736
+
737
+ context '#in_hours' do
738
+ subject { Moments::Difference.new(from, to).in_hours }
739
+
740
+ include_examples 'in a component',
741
+ when_seconds: 0,
742
+ when_minutes: 0,
743
+ when_hours: 8,
744
+ when_days: (6 * 24) + 8,
745
+ when_months:
746
+ ((31 + 28 + 31 + 30) * 24) +
747
+ (6 * 24) +
748
+ 8,
749
+ when_years:
750
+ (2 * 365 * 24) +
751
+ ((31 + 28 + 31 + 30) * 24) +
752
+ (6 * 24) +
753
+ 8
754
+ end
183
755
 
184
- moments.same?.should == true
185
- moments.past?.should == false
756
+ context '#in_days' do
757
+ subject { Moments::Difference.new(from, to).in_days }
758
+
759
+ include_examples 'in a component',
760
+ when_seconds: 0,
761
+ when_minutes: 0,
762
+ when_hours: 0,
763
+ when_days: 6,
764
+ when_months:
765
+ (31 + 28 + 31 + 30) +
766
+ 6,
767
+ when_years:
768
+ (2 * 365) +
769
+ (31 + 28 + 31 + 30) +
770
+ 6
186
771
  end
187
772
 
188
- it '#future?' do
189
- moments = Moments::Difference.new(from, to)
773
+ context '#in_months' do
774
+ subject { Moments::Difference.new(from, to).in_months }
775
+
776
+ include_examples 'in a component',
777
+ when_seconds: 0,
778
+ when_minutes: 0,
779
+ when_hours: 0,
780
+ when_days: 0,
781
+ when_months: 4,
782
+ when_years: (2 * 12) + 4
783
+ end
784
+
785
+ context '#in_years' do
786
+ subject { Moments::Difference.new(from, to).in_years }
787
+
788
+ include_examples 'in a component',
789
+ when_seconds: 0,
790
+ when_minutes: 0,
791
+ when_hours: 0,
792
+ when_days: 0,
793
+ when_months: 0,
794
+ when_years: 2
190
795
 
191
- moments.future?.should == true
192
- moments.past?.should == false
796
+ context 'when `to` day is greater than `from` day' do
797
+ let(:from) { Time.utc 2013, 1, 1, 0, 0, 0 }
798
+ let(:to) { Time.utc 2015, 1, 7, 8, 12, 15 }
799
+
800
+ it { is_expected.to eq 2 }
801
+ end
802
+
803
+ context 'when `to` day is less than `from` day' do
804
+ let(:from) { Time.utc 2013, 1, 7, 0, 0, 0 }
805
+ let(:to) { Time.utc 2015, 1, 1, 8, 12, 15 }
806
+
807
+ it { is_expected.to eq 1 }
808
+ end
193
809
  end
194
810
  end