dtg 4.0.1 → 5.0.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.
@@ -0,0 +1,175 @@
1
+ RSpec.describe DateTime do
2
+ # Set Time Zone before tests
3
+ before { Time.zone = 'UTC' }
4
+
5
+ let(:time) { described_class.now { include DateTimeGroup } }
6
+
7
+ describe '#to_dtg' do
8
+ context 'when zone is a symbol' do
9
+ context 'when symbol is lowercase' do
10
+ it 'converts and formats as dtg' do
11
+ (:a..:z).to_set.delete(:j).each do |zone|
12
+ expect(time.to_dtg(zone)).to eq(
13
+ time.in_time_zone(Zones::UTC_ZONES[zone]).strftime(
14
+ "%d%H%M#{zone.upcase.to_s} %b %y"
15
+ )
16
+ )
17
+ end
18
+ # :j is separate because there is no local timezone identifier,
19
+ # it just gets returned and formatted
20
+ expect(time.to_dtg(:j)).to eq(time.format(:j))
21
+ end
22
+ end
23
+
24
+ context 'when symbol is uppercase' do
25
+ it 'converts and formats as dtg' do
26
+ (:A..:Z).to_set.delete(:J).each do |zone|
27
+ expect(time.to_dtg(zone)).to eq(
28
+ time.in_time_zone(Zones::UTC_ZONES[zone.downcase]).strftime(
29
+ "%d%H%M#{zone.to_s} %b %y"
30
+ )
31
+ )
32
+ end
33
+ # :J is separate because there is no local timezone identifier,
34
+ # it just gets returned and formatted
35
+ expect(time.to_dtg(:J)).to eq(time.format(:j))
36
+ end
37
+ end
38
+ end
39
+
40
+ context 'when zone is a single character string' do
41
+ context 'when string is lowercase' do
42
+ it 'converts and formats as dtg' do
43
+ ('a'..'z').to_set.delete('j').each do |zone|
44
+ expect(time.to_dtg(zone)).to eq(
45
+ time.in_time_zone(Zones::UTC_ZONES[zone.to_sym]).strftime(
46
+ "%d%H%M#{zone.upcase} %b %y"
47
+ )
48
+ )
49
+ end
50
+ # 'j' is separate because there is no local timezone identifier
51
+ # it just gets returned and formatted
52
+ expect(time.to_dtg('j')).to eq(time.format(:j))
53
+ end
54
+ end
55
+
56
+ context 'when string is uppercase' do
57
+ it 'converts and formats as dtg' do
58
+ ('A'..'Z').to_set.delete('J').each do |zone|
59
+ expect(time.to_dtg(zone)).to eq(
60
+ time.in_time_zone(Zones::UTC_ZONES[zone.downcase.to_sym])
61
+ .strftime("%d%H%M#{zone} %b %y")
62
+ )
63
+ end
64
+ # 'J' is separate because there is no local timezone identifier,
65
+ # it just gets returned and formatted
66
+ expect(time.to_dtg('J')).to eq(time.format(:j))
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ describe '#format' do
73
+ context 'when zone is a symbol' do
74
+ context 'when symbol is lowercase' do
75
+ it 'formats to dtg standard' do
76
+ (:a..:z).each do |zone|
77
+ expect(time.format(zone)).to eq(
78
+ time.strftime("%d%H%M#{zone.upcase.to_s} %b %y")
79
+ )
80
+ end
81
+ end
82
+ end
83
+
84
+ context 'when symbol is uppercase' do
85
+ it 'formats to dtg standard' do
86
+ (:A..:Z).each do |zone|
87
+ expect(time.format(zone)).to eq(
88
+ time.strftime("%d%H%M#{zone.to_s} %b %y")
89
+ )
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ context 'when zone is a single character string' do
96
+ context 'when string is lowercase' do
97
+ it 'formats to dtg standard' do
98
+ ('a'..'z').each do |zone|
99
+ expect(time.format(zone)).to eq(
100
+ time.strftime("%d%H%M#{zone.upcase} %b %y")
101
+ )
102
+ end
103
+ end
104
+ end
105
+
106
+ context 'when string is uppercase' do
107
+ it 'formats to dtg standard' do
108
+ ('A'..'Z').each do |zone|
109
+ expect(time.format(zone)).to eq(
110
+ time.strftime("%d%H%M#{zone} %b %y")
111
+ )
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ describe '#convert' do
119
+ context 'when zone is a symbol' do
120
+ context 'when symbol is lowercase' do
121
+ it 'returns converted time to new zone' do
122
+ (:a..:z).to_set.delete(:j).each do |zone|
123
+ expect(time.convert(zone)).to eq(
124
+ time.in_time_zone(Zones::UTC_ZONES[zone])
125
+ )
126
+ end
127
+ # :j is separate because there is no local timezone identifier,
128
+ # it just gets returned and formatted
129
+ expect(time.convert(:j)).to eq(time)
130
+ end
131
+ end
132
+
133
+ context 'when symbol is uppercase' do
134
+ it 'returns converted time to new zone' do
135
+ (:A..:Z).to_set.delete(:J).each do |zone|
136
+ expect(time.convert(zone)).to eq(
137
+ time.in_time_zone(Zones::UTC_ZONES[zone.downcase])
138
+ )
139
+ end
140
+ # :J is separate because there is no local timezone identifier,
141
+ # it just gets returned and formatted
142
+ expect(time.convert(:J)).to eq(time)
143
+ end
144
+ end
145
+ end
146
+
147
+ context 'when zone is a single character string' do
148
+ context 'when string is lowercase' do
149
+ it 'returns converted time to new zone' do
150
+ ('a'..'z').to_set.delete('j').each do |zone|
151
+ expect(time.convert(zone)).to eq(
152
+ time.in_time_zone(Zones::UTC_ZONES[zone.to_sym])
153
+ )
154
+ end
155
+ # 'j' is separate because there is no local timezone identifier,
156
+ # it just gets returned and formatted
157
+ expect(time.convert('j')).to eq(time)
158
+ end
159
+ end
160
+
161
+ context 'when string is uppercase' do
162
+ it 'returns converted time to new zone' do
163
+ ('A'..'Z').to_set.delete('J').each do |zone|
164
+ expect(time.convert(zone)).to eq(
165
+ time.in_time_zone(Zones::UTC_ZONES[zone.downcase.to_sym])
166
+ )
167
+ end
168
+ # 'J' is separate because there is no local timezone identifier,
169
+ # it just gets returned and formatted
170
+ expect(time.convert('J')).to eq(time)
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,73 @@
1
+ RSpec.describe DateTimeGroup do
2
+ # Set Time Zone before tests: ActiveSupport::TimeWithZone needs this or will nil:nilObject (e.g. Time.zone.now)
3
+ before do
4
+ # UTC is a fair zone right?
5
+ Time.zone = 'UTC'
6
+ end
7
+
8
+ describe '#dtg' do
9
+ context 'when the object is a DateTime' do
10
+ let(:dummy) { DateTime.new { include described_class } }
11
+
12
+ it 'returns datetime in a string' do
13
+ expect(dummy.dtg).to eq(
14
+ "DTG gem is natively integrated with this class: #{dummy.class}"
15
+ )
16
+ end
17
+ end
18
+
19
+ context 'when the object is a Time' do
20
+ let(:dummy) { Time.new { include described_class } }
21
+
22
+ it 'returns time in a string' do
23
+ expect(dummy.dtg).to eq(
24
+ "DTG gem is natively integrated with this class: #{dummy.class}"
25
+ )
26
+ end
27
+ end
28
+
29
+ context 'when the object is an ActiveSupport::TimeWithZone' do
30
+ # ActiveSupport::TimeWithZone.new is not allowed to instantiate empty class
31
+ let(:dummy) { Time.zone.now { include described_class } }
32
+
33
+ it 'returns the ActiveSupport::TimeWithZone in a string' do
34
+ expect(dummy.dtg).to eq(
35
+ "DTG gem is natively integrated with this class: #{dummy.class}"
36
+ )
37
+ end
38
+ end
39
+ end
40
+
41
+ describe '.parse' do
42
+ it 'parses a dtg into its parts' do
43
+ time = Time.now.convert(:z)
44
+ dtg = time.to_dtg(:z)
45
+ parsed = described_class.parse(dtg)
46
+ expect(parsed[:day]).to eq(time.strftime('%d').to_s)
47
+ expect(parsed[:hour]).to eq(time.strftime('%H').to_s)
48
+ expect(parsed[:minute]).to eq(time.strftime('%M').to_s)
49
+ expect(parsed[:zone]).to eq('Z')
50
+ expect(parsed[:month]).to eq(time.strftime('%b'))
51
+ expect(parsed[:year]).to eq(time.strftime('%y'))
52
+ end
53
+ end
54
+
55
+ describe '.from_dtg' do
56
+ it 'converts from a dtg into the proper time' do
57
+ time = Time.now.convert(:z)
58
+ dtg = time.to_dtg(:z)
59
+ # anything less than minutes is lost in a DTG
60
+ time = time.change(usec: 0)
61
+ time = time.change(sec: 0)
62
+ expect(described_class.from_dtg(dtg)).to eq(time)
63
+ end
64
+ end
65
+
66
+ describe '.convert' do
67
+ it 'converts a dtg into a different zoned dtg' do
68
+ time = Time.now.convert(:z)
69
+ dtg = time.to_dtg(:z)
70
+ expect(described_class.convert(dtg, :w)).to eq(time.to_dtg(:w))
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,99 @@
1
+ RSpec.describe Format do
2
+ describe 'FORMAT' do
3
+ it 'shows a complete DTG size' do
4
+ expect(Format::FORMAT[:size]).to eq(14)
5
+ end
6
+
7
+ it 'shows the day field size' do
8
+ expect(Format::FORMAT[:size_day]).to eq(2)
9
+ end
10
+
11
+ it 'shows the hour field size' do
12
+ expect(Format::FORMAT[:size_hour]).to eq(2)
13
+ end
14
+
15
+ it 'shows the zone field size' do
16
+ expect(Format::FORMAT[:size_zone]).to eq(1)
17
+ end
18
+
19
+ it 'shows the month field size' do
20
+ expect(Format::FORMAT[:size_month]).to eq(3)
21
+ end
22
+
23
+ it 'shows the year field size' do
24
+ expect(Format::FORMAT[:size_year]).to eq(2)
25
+ end
26
+
27
+ it 'shows the day field start position' do
28
+ expect(Format::FORMAT[:day_start]).to eq(0)
29
+ end
30
+
31
+ it 'shows the day field end position' do
32
+ expect(Format::FORMAT[:day_end]).to eq(1)
33
+ end
34
+
35
+ it 'shows the day field position range' do
36
+ expect(Format::FORMAT[:day_range]).to eq(0..1)
37
+ end
38
+
39
+ it 'shows the hour field start position' do
40
+ expect(Format::FORMAT[:hour_start]).to eq(2)
41
+ end
42
+
43
+ it 'shows the hour field end position' do
44
+ expect(Format::FORMAT[:hour_end]).to eq(3)
45
+ end
46
+
47
+ it 'shows the hour field position range' do
48
+ expect(Format::FORMAT[:hour_range]).to eq(2..3)
49
+ end
50
+
51
+ it 'shows the minute field start position' do
52
+ expect(Format::FORMAT[:minute_start]).to eq(4)
53
+ end
54
+
55
+ it 'shows the minute field end position' do
56
+ expect(Format::FORMAT[:minute_end]).to eq(5)
57
+ end
58
+
59
+ it 'shows the minute field position range' do
60
+ expect(Format::FORMAT[:minute_range]).to eq(4..5)
61
+ end
62
+
63
+ it 'shows the zone field start position' do
64
+ expect(Format::FORMAT[:zone_start]).to eq(6)
65
+ end
66
+
67
+ it 'shows the zone field end position' do
68
+ expect(Format::FORMAT[:zone_end]).to eq(6)
69
+ end
70
+
71
+ it 'shows the zone field position range' do
72
+ expect(Format::FORMAT[:zone_range]).to eq(6..6)
73
+ end
74
+
75
+ it 'shows the month field start position' do
76
+ expect(Format::FORMAT[:month_start]).to eq(8)
77
+ end
78
+
79
+ it 'shows the month field end position' do
80
+ expect(Format::FORMAT[:month_end]).to eq(10)
81
+ end
82
+
83
+ it 'shows the month field position range' do
84
+ expect(Format::FORMAT[:month_range]).to eq(8..10)
85
+ end
86
+
87
+ it 'shows the year field start position' do
88
+ expect(Format::FORMAT[:year_start]).to eq(12)
89
+ end
90
+
91
+ it 'shows the year field end position' do
92
+ expect(Format::FORMAT[:year_end]).to eq(13)
93
+ end
94
+
95
+ it 'shows the year field position range' do
96
+ expect(Format::FORMAT[:year_range]).to eq(12..13)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,175 @@
1
+ RSpec.describe Time do
2
+ # Set Time Zone before tests
3
+ before { described_class.zone = 'UTC' }
4
+
5
+ let(:time) { described_class.now { include DateTimeGroup } }
6
+
7
+ describe '#to_dtg' do
8
+ context 'when zone is a symbol' do
9
+ context 'when symbol is lowercase' do
10
+ it 'converts and formats as dtg' do
11
+ (:a..:z).to_set.delete(:j).each do |zone|
12
+ expect(time.to_dtg(zone)).to eq(
13
+ time.in_time_zone(Zones::UTC_ZONES[zone]).strftime(
14
+ "%d%H%M#{zone.upcase.to_s} %b %y"
15
+ )
16
+ )
17
+ end
18
+ # :j is separate because there is no local timezone identifier,
19
+ # it just gets returned and formatted
20
+ expect(time.to_dtg(:j)).to eq(time.format(:j))
21
+ end
22
+ end
23
+
24
+ context 'when symbol is uppercase' do
25
+ it 'converts and formats as dtg' do
26
+ (:A..:Z).to_set.delete(:J).each do |zone|
27
+ expect(time.to_dtg(zone)).to eq(
28
+ time.in_time_zone(Zones::UTC_ZONES[zone.downcase]).strftime(
29
+ "%d%H%M#{zone.to_s} %b %y"
30
+ )
31
+ )
32
+ end
33
+ # :J is separate because there is no local timezone identifier,
34
+ # it just gets returned and formatted
35
+ expect(time.to_dtg(:J)).to eq(time.format(:j))
36
+ end
37
+ end
38
+ end
39
+
40
+ context 'when zone is a single character string' do
41
+ context 'when string is lowercase' do
42
+ it 'converts and formats as dtg' do
43
+ ('a'..'z').to_set.delete('j').each do |zone|
44
+ expect(time.to_dtg(zone)).to eq(
45
+ time.in_time_zone(Zones::UTC_ZONES[zone.to_sym]).strftime(
46
+ "%d%H%M#{zone.upcase} %b %y"
47
+ )
48
+ )
49
+ end
50
+ # 'j' is separate because there is no local timezone identifier
51
+ # it just gets returned and formatted
52
+ expect(time.to_dtg('j')).to eq(time.format(:j))
53
+ end
54
+ end
55
+
56
+ context 'when string is uppercase' do
57
+ it 'converts and formats as dtg' do
58
+ ('A'..'Z').to_set.delete('J').each do |zone|
59
+ expect(time.to_dtg(zone)).to eq(
60
+ time.in_time_zone(Zones::UTC_ZONES[zone.downcase.to_sym])
61
+ .strftime("%d%H%M#{zone} %b %y")
62
+ )
63
+ end
64
+ # 'J' is separate because there is no local timezone identifier,
65
+ # it just gets returned and formatted
66
+ expect(time.to_dtg('J')).to eq(time.format(:j))
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ describe '#format' do
73
+ context 'when zone is a symbol' do
74
+ context 'when symbol is lowercase' do
75
+ it 'formats to dtg standard' do
76
+ (:a..:z).each do |zone|
77
+ expect(time.format(zone)).to eq(
78
+ time.strftime("%d%H%M#{zone.upcase.to_s} %b %y")
79
+ )
80
+ end
81
+ end
82
+ end
83
+
84
+ context 'when symbol is uppercase' do
85
+ it 'formats to dtg standard' do
86
+ (:A..:Z).each do |zone|
87
+ expect(time.format(zone)).to eq(
88
+ time.strftime("%d%H%M#{zone.to_s} %b %y")
89
+ )
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ context 'when zone is a single character string' do
96
+ context 'when string is lowercase' do
97
+ it 'formats to dtg standard' do
98
+ ('a'..'z').each do |zone|
99
+ expect(time.format(zone)).to eq(
100
+ time.strftime("%d%H%M#{zone.upcase} %b %y")
101
+ )
102
+ end
103
+ end
104
+ end
105
+
106
+ context 'when string is uppercase' do
107
+ it 'formats to dtg standard' do
108
+ ('A'..'Z').each do |zone|
109
+ expect(time.format(zone)).to eq(
110
+ time.strftime("%d%H%M#{zone} %b %y")
111
+ )
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ describe '#convert' do
119
+ context 'when zone is a symbol' do
120
+ context 'when symbol is lowercase' do
121
+ it 'returns converted time to new zone' do
122
+ (:a..:z).to_set.delete(:j).each do |zone|
123
+ expect(time.convert(zone)).to eq(
124
+ time.in_time_zone(Zones::UTC_ZONES[zone])
125
+ )
126
+ end
127
+ # :j is separate because there is no local timezone identifier,
128
+ # it just gets returned and formatted
129
+ expect(time.convert(:j)).to eq(time)
130
+ end
131
+ end
132
+
133
+ context 'when symbol is uppercase' do
134
+ it 'returns converted time to new zone' do
135
+ (:A..:Z).to_set.delete(:J).each do |zone|
136
+ expect(time.convert(zone)).to eq(
137
+ time.in_time_zone(Zones::UTC_ZONES[zone.downcase])
138
+ )
139
+ end
140
+ # :J is separate because there is no local timezone identifier,
141
+ # it just gets returned and formatted
142
+ expect(time.convert(:J)).to eq(time)
143
+ end
144
+ end
145
+ end
146
+
147
+ context 'when zone is a single character string' do
148
+ context 'when string is lowercase' do
149
+ it 'returns converted time to new zone' do
150
+ ('a'..'z').to_set.delete('j').each do |zone|
151
+ expect(time.convert(zone)).to eq(
152
+ time.in_time_zone(Zones::UTC_ZONES[zone.to_sym])
153
+ )
154
+ end
155
+ # 'j' is separate because there is no local timezone identifier,
156
+ # it just gets returned and formatted
157
+ expect(time.convert('j')).to eq(time)
158
+ end
159
+ end
160
+
161
+ context 'when string is uppercase' do
162
+ it 'returns converted time to new zone' do
163
+ ('A'..'Z').to_set.delete('J').each do |zone|
164
+ expect(time.convert(zone)).to eq(
165
+ time.in_time_zone(Zones::UTC_ZONES[zone.downcase.to_sym])
166
+ )
167
+ end
168
+ # 'J' is separate because there is no local timezone identifier,
169
+ # it just gets returned and formatted
170
+ expect(time.convert('J')).to eq(time)
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end