moments 0.0.1.alpha → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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