gb_work_day 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.idea/.name +1 -0
- data/.idea/encodings.xml +6 -0
- data/.idea/gb_working_day.iml +239 -0
- data/.idea/misc.xml +14 -0
- data/.idea/modules.xml +8 -0
- data/.idea/runConfigurations/specs.xml +33 -0
- data/.idea/workspace.xml +1333 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +22 -0
- data/README.md +119 -0
- data/Rakefile +2 -0
- data/gb_work_day.gemspec +26 -0
- data/lib/gb_work_day.rb +12 -0
- data/lib/gb_work_day/core_ext.rb +3 -0
- data/lib/gb_work_day/core_ext/date.rb +59 -0
- data/lib/gb_work_day/core_ext/integer.rb +8 -0
- data/lib/gb_work_day/core_ext/time.rb +60 -0
- data/lib/gb_work_day/duration.rb +107 -0
- data/lib/gb_work_day/helpers/date.rb +33 -0
- data/lib/gb_work_day/helpers/time.rb +33 -0
- data/lib/gb_work_day/interval.rb +55 -0
- data/lib/gb_work_day/version.rb +3 -0
- data/lib/gb_work_day/work_week.rb +58 -0
- data/spec/core_ext/date_spec.rb +66 -0
- data/spec/core_ext/integer_spec.rb +28 -0
- data/spec/core_ext/time_spec.rb +66 -0
- data/spec/duration_spec.rb +104 -0
- data/spec/helpers/date_spec.rb +56 -0
- data/spec/helpers/time_spec.rb +50 -0
- data/spec/interval_spec.rb +19 -0
- data/spec/spec_helper.rb +106 -0
- data/spec/work_week_spec.rb +122 -0
- metadata +157 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'gb_work_day/interval'
|
2
|
+
module GBWorkDay
|
3
|
+
class Date < ::Date
|
4
|
+
attr_accessor :work_week
|
5
|
+
|
6
|
+
def -(other)
|
7
|
+
if other.is_a?(::Date) || other.is_a?(::Time)
|
8
|
+
Interval.new(self, other, week: self.work_week).work_days
|
9
|
+
else
|
10
|
+
super
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# @return [GBWorkDay::WorkWeek]
|
17
|
+
def default_week
|
18
|
+
self.work_week || GBWorkDay::WorkWeek.current
|
19
|
+
end
|
20
|
+
|
21
|
+
class << self
|
22
|
+
# Create {GBWorkingDay::Date} object from a given Date object.
|
23
|
+
# Copy constructor.
|
24
|
+
#
|
25
|
+
# @param date [Date]
|
26
|
+
def from_date(date, work_week = nil)
|
27
|
+
new_date = self.jd(date.jd)
|
28
|
+
new_date.work_week = work_week if work_week
|
29
|
+
new_date
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'gb_work_day/interval'
|
2
|
+
module GBWorkDay
|
3
|
+
class Time < ::Time
|
4
|
+
attr_accessor :work_week
|
5
|
+
|
6
|
+
def -(other)
|
7
|
+
if other.is_a?(::Time) || other.is_a?(::Date)
|
8
|
+
Interval.new(self, other, week: work_week).work_days
|
9
|
+
else
|
10
|
+
super
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# @return [GBWorkDay::WorkWeek]
|
17
|
+
def default_week
|
18
|
+
self.work_week || GBWorkDay::WorkWeek.current
|
19
|
+
end
|
20
|
+
|
21
|
+
class << self
|
22
|
+
# Create {GBWorkingDay::Time} object from a given Time object.
|
23
|
+
# Copy constructor.
|
24
|
+
#
|
25
|
+
# @param time [Time]
|
26
|
+
def from_time(time, work_week=nil)
|
27
|
+
new_time = self.at(time)
|
28
|
+
new_time.work_week = work_week if work_week
|
29
|
+
new_time
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'gb_work_day/work_week'
|
2
|
+
require 'gb_work_day/duration'
|
3
|
+
module GBWorkDay
|
4
|
+
class Interval
|
5
|
+
attr_reader :start_time, :end_time
|
6
|
+
|
7
|
+
# @param start_time [Time, Date]
|
8
|
+
# @param end_time [Time, Date]
|
9
|
+
# @param params [Hash]
|
10
|
+
# @option params [Fixnum] :work_days number of work days in a week, default is 7
|
11
|
+
# @option params [Fixnum] :week_start first working day in a week as number. Default value is 1 corresponding to Monday.
|
12
|
+
def initialize(start_time, end_time, params=Hash.new)
|
13
|
+
@start_time = start_time
|
14
|
+
@end_time = end_time
|
15
|
+
@symbol = 1
|
16
|
+
revert if @start_time > @end_time
|
17
|
+
@working_week = params[:week]
|
18
|
+
unless @working_week
|
19
|
+
if params[:work_days] || params[:week_start]
|
20
|
+
work_days = params.fetch(:work_days, 7)
|
21
|
+
week_start = params.fetch(:week_start, 1)
|
22
|
+
@working_week = WorkWeek.new work_days, week_start
|
23
|
+
else
|
24
|
+
@working_week = WorkWeek.current
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Integer] Number of working days in a given period
|
30
|
+
def work_days
|
31
|
+
date = @start_time
|
32
|
+
work_days = 0
|
33
|
+
while date < end_time
|
34
|
+
work_days += 1 if @working_week.work_day?(date)
|
35
|
+
date += 1.day
|
36
|
+
end
|
37
|
+
Duration.new(work_days * @symbol, @working_week)
|
38
|
+
end
|
39
|
+
|
40
|
+
alias_method :duration, :work_days
|
41
|
+
|
42
|
+
def endpoints
|
43
|
+
[start_time, end_time]
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def revert
|
49
|
+
new_end_time = @start_time
|
50
|
+
@start_time = @end_time
|
51
|
+
@end_time = new_end_time
|
52
|
+
@symbol= @symbol * -1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module GBWorkDay
|
2
|
+
class WorkWeek
|
3
|
+
attr_reader :work_days_per_week, :free_days_per_week, :work_days, :free_days, :week_start
|
4
|
+
|
5
|
+
# @param work_days [#to_i] Amount of working days in a week. Default value is 7.
|
6
|
+
# @param week_start [#to_i] Number of a week day, when work starts. Default value is 1 corresponding to Monday
|
7
|
+
def initialize(work_days=7, week_start=1)
|
8
|
+
work_days = work_days.to_i
|
9
|
+
week_start = week_start.to_i
|
10
|
+
raise ArgumentError, 'Work days have to be between 0 and 7!' unless work_days >= 0 && work_days <= 7
|
11
|
+
@work_days_per_week = work_days
|
12
|
+
@week_start = week_start % 7
|
13
|
+
@free_days_per_week = 7 - @work_days_per_week
|
14
|
+
@work_days = []
|
15
|
+
@work_days_per_week.times do
|
16
|
+
day = week_start % 7
|
17
|
+
@work_days << (day != 0 ? day : 7)
|
18
|
+
week_start += 1
|
19
|
+
end
|
20
|
+
@work_days.sort!
|
21
|
+
@free_days = (1..7).to_a - @work_days
|
22
|
+
end
|
23
|
+
|
24
|
+
# Check if given day is a work day
|
25
|
+
# @param day [Time, Date]
|
26
|
+
def work_day?(day)
|
27
|
+
week_day = day.wday
|
28
|
+
week_day = 7 if week_day == 0
|
29
|
+
work_days.include? week_day
|
30
|
+
end
|
31
|
+
|
32
|
+
# Check if given day is a work day
|
33
|
+
# @param day [Time, Date]
|
34
|
+
def free_day?(day)
|
35
|
+
week_day = day.wday
|
36
|
+
week_day = 7 if week_day == 0
|
37
|
+
free_days.include? week_day
|
38
|
+
end
|
39
|
+
|
40
|
+
def ==(other) # :nodoc:
|
41
|
+
work_days_per_week == other.work_days_per_week && week_start == other.week_start
|
42
|
+
end
|
43
|
+
|
44
|
+
def eql?(other) # :nodoc:
|
45
|
+
work_days_per_week.eql?(other.work_days_per_week) && week_start.eql?(other.week_start)
|
46
|
+
end
|
47
|
+
|
48
|
+
class << self
|
49
|
+
def current
|
50
|
+
Thread.current[:working_week] ||= self.new
|
51
|
+
end
|
52
|
+
|
53
|
+
def current=(new_week)
|
54
|
+
Thread.current[:working_week] = new_week if WorkWeek === new_week
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gb_work_day/core_ext/date'
|
3
|
+
require 'gb_work_day/core_ext/integer'
|
4
|
+
require 'active_support/time'
|
5
|
+
|
6
|
+
describe 'Date extensions' do
|
7
|
+
before(:all) { GBWorkDay::WorkWeek.current = GBWorkDay::WorkWeek.new(5) }
|
8
|
+
after(:all) { GBWorkDay::WorkWeek.current = GBWorkDay::WorkWeek.new() }
|
9
|
+
|
10
|
+
it 'should respond to work?' do
|
11
|
+
expect(Date.today.beginning_of_week.work?).to be_truthy
|
12
|
+
expect(Date.today.end_of_week.work?).to be_falsey
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should respond to free?' do
|
16
|
+
expect(Date.today.beginning_of_week.free?).to be_falsey
|
17
|
+
expect(Date.today.end_of_week.free?).to be_truthy
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should respond to work_date' do
|
21
|
+
date = Date.today
|
22
|
+
expect(date.work_date).to be_kind_of GBWorkDay::Date
|
23
|
+
expect(date.work_date).to eq date
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should respond to to_work_date' do
|
27
|
+
date = Date.today
|
28
|
+
expect(date.to_work_date).to be_kind_of GBWorkDay::Date
|
29
|
+
expect(date.to_work_date).to eq date
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should respond to to_work' do
|
33
|
+
date = Date.today
|
34
|
+
expect(date.to_work).to be_kind_of GBWorkDay::Date
|
35
|
+
expect(date.to_work).to eq date
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should properly subtract work dates' do
|
39
|
+
expect(Date.today - Date.tomorrow.to_work_date).to be_a_kind_of GBWorkDay::Duration
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should return next_work_day' do
|
43
|
+
monday = Date.today.beginning_of_week
|
44
|
+
friday = monday + 4.days
|
45
|
+
sunday = Date.today.end_of_week
|
46
|
+
expect(monday.next_work_day). to eq (monday + 1.day)
|
47
|
+
expect(friday.next_work_day). to eq (friday + 3.day)
|
48
|
+
expect(sunday.next_work_day). to eq (sunday + 1.day)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should properly subtract work duration' do
|
52
|
+
monday = Date.today.beginning_of_week
|
53
|
+
wednesday = monday + 2.days
|
54
|
+
expect(monday - 1.work_day).to eq (monday - 3.days)
|
55
|
+
expect(wednesday - 2.work_day).to eq (wednesday - 2.days)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should properly add work duration' do
|
59
|
+
monday = Date.today.beginning_of_week
|
60
|
+
wednesday = monday + 2.days
|
61
|
+
friday = monday + 4.days
|
62
|
+
expect(monday + 1.work_day).to eq (monday + 1.days)
|
63
|
+
expect(friday + 1.work_day).to eq (friday + 3.days)
|
64
|
+
expect(wednesday + 2.work_day).to eq (wednesday + 2.days)
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gb_work_day/core_ext/integer'
|
3
|
+
require 'gb_work_day/duration'
|
4
|
+
|
5
|
+
describe 'Integer extensions' do
|
6
|
+
|
7
|
+
it 'should respond work_days' do
|
8
|
+
expect(2.work_days).to be_kind_of GBWorkDay::Duration
|
9
|
+
expect(2.work_days.work_days).to eq 2
|
10
|
+
expect(2.work_days.week).to eq GBWorkDay::WorkWeek.current
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should respond work_day' do
|
14
|
+
expect(1.work_day).to be_kind_of GBWorkDay::Duration
|
15
|
+
expect(1.work_day.work_days).to eq 1
|
16
|
+
expect(1.work_day.week).to eq GBWorkDay::WorkWeek.current
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should setup proper week on work_days' do
|
20
|
+
week = GBWorkDay::WorkWeek.new(5, 1)
|
21
|
+
expect(2.work_days(week).week).to eq week
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should be able to sum' do
|
25
|
+
expect(1.work_day + 2).to eq 3.work_days
|
26
|
+
expect(1.work_day + 2.work_day).to eq 3.work_days
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gb_work_day/core_ext/time'
|
3
|
+
require 'gb_work_day/core_ext/integer'
|
4
|
+
require 'active_support/time'
|
5
|
+
|
6
|
+
describe 'Time extensions' do
|
7
|
+
before(:all) { GBWorkDay::WorkWeek.current = GBWorkDay::WorkWeek.new(5) }
|
8
|
+
after(:all) { GBWorkDay::WorkWeek.current = GBWorkDay::WorkWeek.new() }
|
9
|
+
|
10
|
+
it 'should respond to work?' do
|
11
|
+
expect(Time.now.beginning_of_week.work?).to be_truthy
|
12
|
+
expect(Time.now.end_of_week.work?).to be_falsey
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should respond to free?' do
|
16
|
+
expect(Time.now.beginning_of_week.free?).to be_falsey
|
17
|
+
expect(Time.now.end_of_week.free?).to be_truthy
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should respond to work_time' do
|
21
|
+
time = Time.now
|
22
|
+
expect(time.work_time).to be_kind_of GBWorkDay::Time
|
23
|
+
expect(time.work_time).to eq time
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should respond to to_work_time' do
|
27
|
+
time = Time.now
|
28
|
+
expect(time.to_work_time).to be_kind_of GBWorkDay::Time
|
29
|
+
expect(time.to_work_time).to eq time
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should respond to to_work' do
|
33
|
+
time = Time.now
|
34
|
+
expect(time.to_work).to be_kind_of GBWorkDay::Time
|
35
|
+
expect(time.to_work).to eq time
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should properly subtract work times' do
|
39
|
+
expect(Time.now - (Time.now + 1.day).to_work_time).to be_a_kind_of GBWorkDay::Duration
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should return next_work_day' do
|
43
|
+
monday = Time.now.beginning_of_week
|
44
|
+
friday = monday + 4.days
|
45
|
+
sunday = Time.now.end_of_week
|
46
|
+
expect(monday.next_work_day). to eq (monday + 1.day)
|
47
|
+
expect(friday.next_work_day). to eq (friday + 3.day)
|
48
|
+
expect(sunday.next_work_day). to eq (sunday + 1.day)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should properly subtract work duration' do
|
52
|
+
monday = Time.now.beginning_of_week
|
53
|
+
wednesday = monday + 2.days
|
54
|
+
expect(monday - 1.work_day).to eq (monday - 3.days)
|
55
|
+
expect(wednesday - 2.work_day).to eq (wednesday - 2.days)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should properly add work duration' do
|
59
|
+
monday = Time.now.beginning_of_week
|
60
|
+
wednesday = monday + 2.days
|
61
|
+
friday = monday + 4.days
|
62
|
+
expect(monday + 1.work_day).to eq (monday + 1.days)
|
63
|
+
expect(friday + 1.work_day).to eq (friday + 3.days)
|
64
|
+
expect(wednesday + 2.work_day).to eq (wednesday + 2.days)
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gb_work_day/duration'
|
3
|
+
require 'active_support/time'
|
4
|
+
|
5
|
+
describe GBWorkDay::Duration do
|
6
|
+
|
7
|
+
it 'should add durations' do
|
8
|
+
expect(GBWorkDay::Duration.new(1) + GBWorkDay::Duration.new(1)).to eq GBWorkDay::Duration.new(2)
|
9
|
+
expect(GBWorkDay::Duration.new(1) + 1).to eq GBWorkDay::Duration.new(2)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should subtract durations' do
|
13
|
+
expect(GBWorkDay::Duration.new(10) - GBWorkDay::Duration.new(7)).to eq GBWorkDay::Duration.new(3)
|
14
|
+
expect(GBWorkDay::Duration.new(10) - 3).to eq GBWorkDay::Duration.new(7)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should negate durations' do
|
18
|
+
expect(-GBWorkDay::Duration.new(7)).to eq GBWorkDay::Duration.new(-7)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should respond to is_a?' do
|
22
|
+
expect(GBWorkDay::Duration.new(1).is_a? GBWorkDay::Duration).to be_truthy
|
23
|
+
expect(GBWorkDay::Duration.new(1).is_a? Numeric).to be_truthy
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should respond to instance_of?' do
|
27
|
+
expect(GBWorkDay::Duration.new(1).instance_of? GBWorkDay::Duration).to be_truthy
|
28
|
+
expect(GBWorkDay::Duration.new(1).instance_of? Fixnum).to be_truthy
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should respond do equality signs' do
|
32
|
+
expect(GBWorkDay::Duration.new(1) == GBWorkDay::Duration.new(1)).to be_truthy
|
33
|
+
expect(GBWorkDay::Duration.new(1) == GBWorkDay::Duration.new(2)).to be_falsey
|
34
|
+
expect(GBWorkDay::Duration.new(1) == 1).to be_truthy
|
35
|
+
expect(GBWorkDay::Duration.new(1) == 2).to be_falsey
|
36
|
+
|
37
|
+
week = GBWorkDay::WorkWeek.new(3, 3)
|
38
|
+
expect(GBWorkDay::Duration.new(1, week) == GBWorkDay::Duration.new(1)).to be_falsey
|
39
|
+
expect(GBWorkDay::Duration.new(1, week) == GBWorkDay::Duration.new(2)).to be_falsey
|
40
|
+
|
41
|
+
expect(GBWorkDay::Duration.new(1).eql? GBWorkDay::Duration.new(1)).to be_truthy
|
42
|
+
expect(GBWorkDay::Duration.new(1).eql? GBWorkDay::Duration.new(2)).to be_falsey
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should return number of sec for to_s' do
|
46
|
+
expect(GBWorkDay::Duration.new(1).to_s).to eq '86400'
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
it 'should respond to_i' do
|
51
|
+
expect(GBWorkDay::Duration.new(1).to_i).to eq 86400
|
52
|
+
expect(GBWorkDay::Duration.new(1).to_i(:days)).to eq 1
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should respond to inspect' do
|
56
|
+
expect(GBWorkDay::Duration.new(1).inspect).to be_kind_of String
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should calculate proper time for future' do
|
60
|
+
week = GBWorkDay::WorkWeek.new(5, 1)
|
61
|
+
monday = Time.now.beginning_of_week
|
62
|
+
|
63
|
+
expect(GBWorkDay::Duration.new(1, week).since(monday)).to eq monday + 1.day
|
64
|
+
expect(GBWorkDay::Duration.new(-1, week).since(monday)).to eq monday - 3.days
|
65
|
+
expect(GBWorkDay::Duration.new(3, week).since(monday)).to eq monday + 3.days
|
66
|
+
expect(GBWorkDay::Duration.new(5, week).since(monday)).to eq monday + 7.days
|
67
|
+
expect(GBWorkDay::Duration.new(6, week).since(monday)).to eq monday + 8.days
|
68
|
+
expect(GBWorkDay::Duration.new(16, week).since(monday)).to eq monday + 22.days
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should calculate proper date for future' do
|
72
|
+
week = GBWorkDay::WorkWeek.new(5, 1)
|
73
|
+
monday = Date.today.beginning_of_week
|
74
|
+
|
75
|
+
expect(GBWorkDay::Duration.new(1, week).since(monday)).to eq monday + 1.day
|
76
|
+
expect(GBWorkDay::Duration.new(-1, week).since(monday)).to eq monday - 3.days
|
77
|
+
expect(GBWorkDay::Duration.new(3, week).since(monday)).to eq monday + 3.days
|
78
|
+
expect(GBWorkDay::Duration.new(5, week).since(monday)).to eq monday + 7.days
|
79
|
+
expect(GBWorkDay::Duration.new(6, week).since(monday)).to eq monday + 8.days
|
80
|
+
expect(GBWorkDay::Duration.new(16, week).since(monday)).to eq monday + 22.days
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should calculate proper time for past' do
|
84
|
+
week = GBWorkDay::WorkWeek.new(5, 1)
|
85
|
+
monday = Time.now.beginning_of_week
|
86
|
+
|
87
|
+
expect(GBWorkDay::Duration.new(1, week).until(monday)).to eq monday - 3.days
|
88
|
+
expect(GBWorkDay::Duration.new(-1, week).until(monday)).to eq monday + 1.days
|
89
|
+
expect(GBWorkDay::Duration.new(3, week).until(monday)).to eq monday - 5.days
|
90
|
+
expect(GBWorkDay::Duration.new(6, week).until(monday)).to eq monday - 10.days
|
91
|
+
expect(GBWorkDay::Duration.new(16, week).until(monday)).to eq monday - 24.days
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should calculate proper date for past' do
|
95
|
+
week = GBWorkDay::WorkWeek.new(5, 1)
|
96
|
+
monday = Date.today.beginning_of_week
|
97
|
+
|
98
|
+
expect(GBWorkDay::Duration.new(1, week).until(monday)).to eq monday - 3.days
|
99
|
+
expect(GBWorkDay::Duration.new(-1, week).until(monday)).to eq monday + 1.days
|
100
|
+
expect(GBWorkDay::Duration.new(3, week).until(monday)).to eq monday - 5.days
|
101
|
+
expect(GBWorkDay::Duration.new(6, week).until(monday)).to eq monday - 10.days
|
102
|
+
expect(GBWorkDay::Duration.new(16, week).until(monday)).to eq monday - 24.days
|
103
|
+
end
|
104
|
+
end
|