runt19 0.7.6
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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/History.txt +153 -0
- data/LICENSE +22 -0
- data/LICENSE.txt +44 -0
- data/Manifest.txt +112 -0
- data/README.md +29 -0
- data/README.txt +106 -0
- data/Rakefile +2 -0
- data/TODO +13 -0
- data/examples/payment_report.rb +59 -0
- data/examples/payment_reporttest.rb +49 -0
- data/examples/reminder.rb +63 -0
- data/examples/schedule_tutorial.rb +59 -0
- data/examples/schedule_tutorialtest.rb +52 -0
- data/lib/runt.rb +249 -0
- data/lib/runt/daterange.rb +74 -0
- data/lib/runt/dprecision.rb +150 -0
- data/lib/runt/expressionbuilder.rb +65 -0
- data/lib/runt/pdate.rb +165 -0
- data/lib/runt/schedule.rb +88 -0
- data/lib/runt/sugar.rb +171 -0
- data/lib/runt/temporalexpression.rb +795 -0
- data/lib/runt/version.rb +3 -0
- data/lib/runt19.rb +1 -0
- data/runt19.gemspec +17 -0
- data/setup.rb +1331 -0
- data/site/blue-robot3.css +132 -0
- data/site/dcl-small.gif +0 -0
- data/site/index.html +72 -0
- data/site/logohover.png +0 -0
- data/site/runt-logo.gif +0 -0
- data/site/runt-logo.psd +0 -0
- data/test/aftertetest.rb +31 -0
- data/test/baseexpressiontest.rb +110 -0
- data/test/beforetetest.rb +31 -0
- data/test/collectiontest.rb +63 -0
- data/test/combinedexpressionstest.rb +158 -0
- data/test/daterangetest.rb +89 -0
- data/test/dayintervaltetest.rb +37 -0
- data/test/difftest.rb +37 -0
- data/test/dimonthtest.rb +59 -0
- data/test/diweektest.rb +32 -0
- data/test/dprecisiontest.rb +58 -0
- data/test/everytetest.rb +36 -0
- data/test/expressionbuildertest.rb +64 -0
- data/test/icalendartest.rb +1104 -0
- data/test/intersecttest.rb +34 -0
- data/test/pdatetest.rb +147 -0
- data/test/redaytest.rb +40 -0
- data/test/remonthtest.rb +37 -0
- data/test/reweektest.rb +51 -0
- data/test/reyeartest.rb +99 -0
- data/test/rspectest.rb +25 -0
- data/test/runttest.rb +98 -0
- data/test/scheduletest.rb +148 -0
- data/test/spectest.rb +36 -0
- data/test/sugartest.rb +104 -0
- data/test/temporalexpressiontest.rb +76 -0
- data/test/uniontest.rb +36 -0
- data/test/wimonthtest.rb +54 -0
- data/test/yeartetest.rb +22 -0
- metadata +137 -0
@@ -0,0 +1,148 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'runt'
|
5
|
+
require 'date'
|
6
|
+
|
7
|
+
# Unit tests for Schedule classes
|
8
|
+
# Author:: Matthew Lipper
|
9
|
+
class ScheduleTest < Test::Unit::TestCase
|
10
|
+
|
11
|
+
include Runt
|
12
|
+
|
13
|
+
def setup
|
14
|
+
# Jane is very busy these days.
|
15
|
+
@sched=Schedule.new
|
16
|
+
# Elmo's World is on TV: Mon-Fri 8am-8:30am
|
17
|
+
@elmo=Event.new("Elmo's World")
|
18
|
+
@elmo_broadcast=(REWeek.new(Mon,Fri) & REDay.new(8,00,8,30))
|
19
|
+
@sched.add(@elmo,@elmo_broadcast)
|
20
|
+
#Oobi's on TV: Thu-Sat 8:30am-9am
|
21
|
+
@oobi=Event.new("Oobi")
|
22
|
+
@oobi_broadcast=(REWeek.new(Thu,Sat) & REDay.new(8,30,9,00))
|
23
|
+
@sched.add(@oobi,@oobi_broadcast)
|
24
|
+
@during_elmo=PDate.new(2004,5,4,8,06)
|
25
|
+
@not_during_elmo=PDate.new(2004,5,1,8,06)
|
26
|
+
@during_oobi=PDate.new(2004,4,30,8,56)
|
27
|
+
@not_during_oobi=PDate.new(2004,5,1,8,12)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_include
|
31
|
+
# Check Elmo
|
32
|
+
assert(@sched.include?(@elmo, @during_elmo))
|
33
|
+
assert(!@sched.include?(@elmo,@not_during_elmo))
|
34
|
+
assert(!@sched.include?(@elmo,@during_oobi))
|
35
|
+
# Check Oobi
|
36
|
+
assert(@sched.include?(@oobi, @during_oobi))
|
37
|
+
assert(!@sched.include?(@oobi,@not_during_oobi))
|
38
|
+
assert(!@sched.include?(@oobi,@not_during_elmo))
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_select_all
|
42
|
+
# select all
|
43
|
+
all=@sched.select {|ev,xpr| true; }
|
44
|
+
assert all.size==2
|
45
|
+
assert all.include?(@elmo)
|
46
|
+
assert all.include?(@oobi)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_select_none
|
50
|
+
# select none
|
51
|
+
assert((@sched.select {|ev,xpr| false; }).size==0)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_select_some
|
55
|
+
# select oobi only
|
56
|
+
some=@sched.select {|ev,xpr| @oobi.eql?(ev); }
|
57
|
+
assert some.size==1
|
58
|
+
assert !some.include?(@elmo)
|
59
|
+
assert some.include?(@oobi)
|
60
|
+
some.clear
|
61
|
+
# select elmo only
|
62
|
+
some=@sched.select {|ev,xpr| @elmo.eql?(ev); }
|
63
|
+
assert some.size==1
|
64
|
+
assert some.include?(@elmo)
|
65
|
+
assert !some.include?(@oobi)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_events
|
69
|
+
events=@sched.events(PDate.new(2006,12,4,11,15))
|
70
|
+
assert_equal 0,events.size
|
71
|
+
# The Barney power hour which overlaps with Elmo
|
72
|
+
barney=Event.new("Barney")
|
73
|
+
@sched.add(barney,REDay.new(7,30,8,30))
|
74
|
+
events=@sched.events(PDate.new(2006,12,4,8,15))
|
75
|
+
assert_equal 2,events.size
|
76
|
+
assert events.include?(barney)
|
77
|
+
assert events.include?(@elmo)
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_update
|
81
|
+
@sched.update(Event.new("aaa")){|ev|assert_nil(ev)}
|
82
|
+
@sched.update(@elmo){|ev|assert_equal(@elmo_broadcast,ev)}
|
83
|
+
@sched.update(@oobi){|ev|assert_equal(@oobi_broadcast,ev)}
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_select_old
|
87
|
+
@sched=Schedule.new
|
88
|
+
e1=Event.new("e1")
|
89
|
+
assert(!@sched.include?(e1,nil))
|
90
|
+
range=RSpec.new(DateRange.new(PDate.new(2006,12,3),PDate.new(2007,1,24)))
|
91
|
+
in_range=PDate.new(2007,1,4)
|
92
|
+
assert(range.include?(in_range))
|
93
|
+
out_of_range=PDate.new(2006,1,4)
|
94
|
+
assert(!range.include?(out_of_range))
|
95
|
+
@sched.add(e1,range)
|
96
|
+
assert(@sched.include?(e1,in_range))
|
97
|
+
assert(!@sched.include?(e1,out_of_range))
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_dates
|
101
|
+
# range: May 1st, 2004 to May 31st, 2004
|
102
|
+
d_range = DateRange.new(PDate.day(2004,5,1), PDate.day(2004,5,31))
|
103
|
+
@sched = Schedule.new
|
104
|
+
event = Event.new("Visit Ernie")
|
105
|
+
# First and last Friday of the month
|
106
|
+
expr1 = DIMonth.new(1,Fri) | DIMonth.new(-1,Fri)
|
107
|
+
@sched.add(event,expr1)
|
108
|
+
dates = @sched.dates(event,d_range)
|
109
|
+
expected = [PDate.day(2004,5,7), PDate.day(2004,5,28)]
|
110
|
+
assert_equal(expected,dates)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_using_a_schedule
|
114
|
+
|
115
|
+
# September 18th - 19th, 2005, 8am - 10am
|
116
|
+
expr1=RSpec.new(DateRange.new(PDate.day(2005,9,18),PDate.day(2005,9,19))) & REDay.new(8,0,10,0)
|
117
|
+
assert(expr1.include?(PDate.min(2005,9,18,8,15)))
|
118
|
+
# September 19th - 20th, 2005, 9am - 11am
|
119
|
+
expr2=RSpec.new(DateRange.new(PDate.day(2005,9,19),PDate.day(2005,9,20))) & REDay.new(9,0,11,0)
|
120
|
+
# Quick sanuty check
|
121
|
+
assert(expr1.overlap?(expr2))
|
122
|
+
# Setup a @schedule w/first expression
|
123
|
+
@sched = Schedule.new
|
124
|
+
@sched.add(Event.new("Snafubar Opening"),expr1)
|
125
|
+
resource = Resource.new(@sched)
|
126
|
+
# Add a another overlapping event
|
127
|
+
resource.add_event(Event.new("Yodeling Lesson"),expr2)
|
128
|
+
# Create a new resource using the same schedule
|
129
|
+
resource2 = Resource.new(@sched)
|
130
|
+
# Add a another overlapping event and pass a block which should complain
|
131
|
+
#resource.add_event(Event.new("Yodeling Lesson"),expr2) \
|
132
|
+
#{|e,s| raise "Resource not available at requested time(s)." \
|
133
|
+
# if (@schedule.overlap?(s))}
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class Resource
|
138
|
+
def initialize(schedule)
|
139
|
+
@schedule=schedule
|
140
|
+
end
|
141
|
+
def add_event(event,expr)
|
142
|
+
if(block_given?)
|
143
|
+
yield(event,expr)
|
144
|
+
else
|
145
|
+
@schedule.add(event,expr)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
data/test/spectest.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
#!/usr/bin/env ruby
|
3
|
+
|
4
|
+
require 'baseexpressiontest'
|
5
|
+
|
6
|
+
# Unit tests for Spec class
|
7
|
+
# Author:: Matthew Lipper
|
8
|
+
|
9
|
+
class SpecTest < BaseExpressionTest
|
10
|
+
|
11
|
+
def setup
|
12
|
+
super
|
13
|
+
@spec = Spec.new(@stub1)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_initialize
|
17
|
+
assert_same @stub1, @spec.date_expr, "Expected #{@stub1}, instead got #{@spec.date_expr}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_include_arg_has_include_method
|
21
|
+
assert !@spec.include?(@stub2), "Expression should not include configured stub"
|
22
|
+
@stub2.match = true
|
23
|
+
assert @spec.include?(@stub2), "Expression should include configured stub"
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_include_arg_without_include_method
|
27
|
+
@spec = Spec.new(4)
|
28
|
+
assert !@spec.include?(3), "Expression #{@spec.to_s} should not include 3"
|
29
|
+
assert @spec.include?(4), "Expression #{@spec.to_s} should include 4"
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_to_s
|
33
|
+
assert_equal @stub1.to_s, @spec.to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/test/sugartest.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'runt'
|
5
|
+
require 'runt/sugar'
|
6
|
+
|
7
|
+
class SugarTest < Test::Unit::TestCase
|
8
|
+
include Runt
|
9
|
+
|
10
|
+
def test_build__should_return_nil_when_an_unknown_name_is_given
|
11
|
+
assert self.build('duh').nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_method_missing_should_be_called_for_invalid_name
|
15
|
+
begin
|
16
|
+
self.some_tuesday
|
17
|
+
rescue NoMethodError
|
18
|
+
# YAY!
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_const_should_return_runt_constant
|
23
|
+
assert_equal Runt::Monday, Runt.const('monday'), \
|
24
|
+
"Expected #{Runt::Monday} but was #{Runt.const('monday')}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_method_missing_should_define_dimonth
|
28
|
+
make_ordinals.each do |ordinal|
|
29
|
+
make_days.each do |day|
|
30
|
+
name = ordinal + '_' + day
|
31
|
+
result = self.send(name)
|
32
|
+
expected = DIMonth.new(Runt.const(ordinal), Runt.const(day))
|
33
|
+
assert_expression expected, result
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_method_missing_should_define_diweek
|
39
|
+
assert_expression(DIWeek.new(Monday), self.monday)
|
40
|
+
assert_expression(DIWeek.new(Tuesday), self.tuesday)
|
41
|
+
assert_expression(DIWeek.new(Wednesday), self.wednesday)
|
42
|
+
assert_expression(DIWeek.new(Thursday), self.thursday)
|
43
|
+
assert_expression(DIWeek.new(Friday), self.friday)
|
44
|
+
assert_expression(DIWeek.new(Saturday), self.saturday)
|
45
|
+
assert_expression(DIWeek.new(Sunday), self.sunday)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_parse_time
|
49
|
+
assert_equal [13,2], parse_time('1','02','pm')
|
50
|
+
assert_equal [1,2], parse_time('1','02','am')
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_method_missing_should_define_re_day
|
54
|
+
assert_expression(REDay.new(8,45,14,00), daily_8_45am_to_2_00pm)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_method_missing_should_define_re_week
|
58
|
+
make_days.each do |st_day|
|
59
|
+
make_days.each do |end_day|
|
60
|
+
if Runt.const(st_day) <= Runt.const(end_day) then
|
61
|
+
assert_expression REWeek.new(Runt.const(st_day), \
|
62
|
+
Runt.const(end_day)), self.send('weekly_' + st_day + '_to_' + end_day)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_method_missing_should_define_re_month
|
69
|
+
assert_expression(REMonth.new(3,14), monthly_3rd_to_14th)
|
70
|
+
end
|
71
|
+
def test_method_missing_should_define_re_year
|
72
|
+
# Imperfect but "good enough" for now
|
73
|
+
make_months.each do |st_month|
|
74
|
+
make_months.each do |end_month|
|
75
|
+
st_mon_number = Runt.const(st_month)
|
76
|
+
end_mon_number = Runt.const(end_month)
|
77
|
+
next if st_mon_number > end_mon_number
|
78
|
+
st_day = rand(27) + 1
|
79
|
+
end_day = rand(27) + 1
|
80
|
+
if st_mon_number == end_mon_number && st_day > end_day then
|
81
|
+
st_day, end_day = end_day, st_day
|
82
|
+
end
|
83
|
+
#puts "Checking #{st_month} #{st_day} - #{end_month} #{end_day}"
|
84
|
+
assert_expression REYear.new(st_mon_number, st_day, end_mon_number, end_day), \
|
85
|
+
self.send('yearly_' + st_month + '_' + st_day.to_s + '_to_' + end_month + '_' + end_day.to_s)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
def assert_expression(expected, actual)
|
92
|
+
assert_equal expected.to_s, actual.to_s, \
|
93
|
+
"Expected #{expected.to_s} but was #{actual.to_s}"
|
94
|
+
end
|
95
|
+
def make_ordinals
|
96
|
+
Runt::WEEK_OF_MONTH_ORDINALS.delete('()').split('|')
|
97
|
+
end
|
98
|
+
def make_days
|
99
|
+
Runt::DAYS.delete('()').split('|')
|
100
|
+
end
|
101
|
+
def make_months
|
102
|
+
Runt::MONTHS.delete('()').split('|')
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'baseexpressiontest'
|
4
|
+
|
5
|
+
# Unit tests for TExpr classes
|
6
|
+
# Author:: Matthew Lipper
|
7
|
+
|
8
|
+
class TExprTest < BaseExpressionTest
|
9
|
+
|
10
|
+
include TExpr
|
11
|
+
|
12
|
+
def test_include
|
13
|
+
assert !self.include?(true), "Default include? method should always return false"
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_to_s
|
17
|
+
assert_equal self.to_s, 'TExpr', "Default to_s method should always return 'TExpr'"
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_or_from_union
|
21
|
+
union = Union.new
|
22
|
+
same_union = union.or(@stub1)
|
23
|
+
assert_same union, same_union, "Expected same Union instance that received the or method"
|
24
|
+
assert_same @stub1, union.expressions.first, "Union instance should have added the stub expression"
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_or_from_nonunion
|
28
|
+
result = @stub1.or(@stub2) {|e| e}
|
29
|
+
assert_equal Runt::Union, result.class, "Expected an Union instance. Instead got #{result.class}"
|
30
|
+
assert_same @stub1, result.expressions.first, "Result should be new Union instance containing both stub expressions"
|
31
|
+
assert_same @stub2, result.expressions.last, "Result should be new Union instance containing both stub expressions"
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_and_from_intersect
|
35
|
+
intersect = Intersect.new
|
36
|
+
result = intersect.and(@stub1)
|
37
|
+
assert_same intersect, result, "Expected same Intersect instance that received the and method"
|
38
|
+
assert_same @stub1, intersect.expressions.first, "Intersect instance should have added the stub expression"
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_or_from_nonintersect
|
42
|
+
result = @stub1.and(@stub2) {|e| e}
|
43
|
+
assert_equal Runt::Intersect, result.class, "Expected an Intersect instance. Instead got #{result.class}"
|
44
|
+
assert_same @stub1, result.expressions.first, "Result should be new Intersect instance containing both stub expressions"
|
45
|
+
assert_same @stub2, result.expressions.last, "Result should be new Intersect instance containing both stub expressions"
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_minus
|
49
|
+
result = @stub1.minus(@stub2) {|e| e}
|
50
|
+
assert_equal Runt::Diff, result.class, "Expected an Diff instance. Instead got #{result.class}"
|
51
|
+
assert_same @stub1, result.expr1, "Expected first stub instance used to create Diff expression"
|
52
|
+
assert_same @stub2, result.expr2, "Expected second stub instance used to create Diff expression"
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_dates_no_limit
|
56
|
+
# Normally, your range is made up of Date-like Objects
|
57
|
+
range = 1..3
|
58
|
+
assert @stub1.dates(range).empty?, "Expected empty Array of Objects returned from stub expression"
|
59
|
+
@stub1.match = true
|
60
|
+
result = @stub1.dates(range)
|
61
|
+
assert_equal 1, result[0], "Expected Array of Objects given by range to be returned from stub expression"
|
62
|
+
assert_equal 2, result[1], "Expected Array of Objects given by range to be returned from stub expression"
|
63
|
+
assert_equal 3, result[2], "Expected Array of Objects given by range to be returned from stub expression"
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_dates_with_limit
|
67
|
+
range = 1..3
|
68
|
+
assert @stub1.dates(range).empty?, "Expected empty Array of Objects returned from stub expression"
|
69
|
+
@stub1.match = true
|
70
|
+
result = @stub1.dates(range,2)
|
71
|
+
assert_equal 2, result.size, "Expected Array of only 2 Objects. Got #{result.size}"
|
72
|
+
assert_equal 1, result[0], "Expected Array of Objects given by range to be returned from stub expression"
|
73
|
+
assert_equal 2, result[1], "Expected Array of Objects given by range to be returned from stub expression"
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
data/test/uniontest.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'baseexpressiontest'
|
4
|
+
|
5
|
+
# Unit tests for Union class
|
6
|
+
# Author:: Matthew Lipper
|
7
|
+
|
8
|
+
class UnionTest < BaseExpressionTest
|
9
|
+
|
10
|
+
def setup
|
11
|
+
super
|
12
|
+
@union = Union.new
|
13
|
+
@date = @pdate_20071028
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_include
|
17
|
+
assert !@union.include?(@date), "Empty Union instance should not include any dates"
|
18
|
+
@union.add(@stub1).add(@stub2) # both expressions will return false
|
19
|
+
assert !@union.include?(@date), "Union instance should not include any dates"
|
20
|
+
@stub2.match = true
|
21
|
+
assert @union.include?(@date), "Union instance should include any dates"
|
22
|
+
@stub2.match = false
|
23
|
+
@stub1.match = true
|
24
|
+
assert @union.include?(@date), "Union instance should include any dates"
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_to_s
|
29
|
+
assert_equal 'empty', @union.to_s
|
30
|
+
@union.add(@stub1)
|
31
|
+
assert_equal 'every ' + @stub1.to_s, @union.to_s
|
32
|
+
@union.add(@stub2)
|
33
|
+
assert_equal 'every ' + @stub1.to_s + ' or ' + @stub2.to_s, @union.to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/test/wimonthtest.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'baseexpressiontest'
|
4
|
+
|
5
|
+
# Unit tests for WIMonth class
|
6
|
+
# Author:: Matthew Lipper
|
7
|
+
|
8
|
+
class WIMonthTest < BaseExpressionTest
|
9
|
+
|
10
|
+
def setup
|
11
|
+
super
|
12
|
+
@date_range = @date_20050101..@date_20050228
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def test_second_week_in_month
|
17
|
+
expr = WIMonth.new(Second)
|
18
|
+
assert expr.include?(@pdate_20071008), "#{expr.to_s} should include #{@pdate_20071008.to_s}"
|
19
|
+
assert !expr.include?(@pdate_20071030), "#{expr.to_s} should not include #{@pdate_20071030.to_s}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_last_week_in_month
|
23
|
+
expr = WIMonth.new(Last_of)
|
24
|
+
# Make sure of day precision or things will be unusably slow!
|
25
|
+
assert expr.include?(@pdate_20071030), "#{expr.to_s} should include #{@pdate_20071030.to_s}"
|
26
|
+
assert !expr.include?(@pdate_20071008), "#{expr.to_s} should not include #{@pdate_20071008.to_s}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_second_to_last_week_in_month
|
30
|
+
expr = WIMonth.new(Second_to_last)
|
31
|
+
# Make sure of day precision or things will be unusably slow!
|
32
|
+
assert expr.include?(@pdate_20071024), "#{expr.to_s} should include #{@pdate_20071024}"
|
33
|
+
assert !expr.include?(@pdate_20071008), "#{expr.to_s} should not include #{@pdate_20071008}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_dates_mixin_second_week_in_month
|
37
|
+
dates = WIMonth.new(Second).dates(@date_range)
|
38
|
+
assert dates.size == 14, "Expected 14 dates, was #{dates.size}"
|
39
|
+
assert dates.first.mday == 8, "Expected first date.mday to be 8, was #{dates.first.mday}"
|
40
|
+
assert dates.last.mday == 14, "Expected last date.mday to be 14, was #{dates.last.mday}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_dates_mixin_last_week_in_month
|
44
|
+
dates = WIMonth.new(Last).dates(@date_range)
|
45
|
+
assert dates.size == 14, "Expected 14 dates, was #{dates.size}"
|
46
|
+
assert dates.first.mday == 25, "Expected first date.mday to be 25, was #{dates.first.mday}"
|
47
|
+
assert dates.last.mday == 28, "Expected last date.mday to be 28, was #{dates.last.mday}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_week_in_month_to_s
|
51
|
+
assert_equal 'last week of any month', WIMonth.new(Last).to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|