texp 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +15 -0
- data/INFO +33 -0
- data/MIT-LICENSE +21 -0
- data/README +2 -0
- data/Rakefile +86 -0
- data/doc/jamis.rb +591 -0
- data/lib/texp.rb +13 -0
- data/lib/texp/base.rb +146 -0
- data/lib/texp/core.rb +41 -0
- data/lib/texp/day_interval.rb +55 -0
- data/lib/texp/day_of_month.rb +32 -0
- data/lib/texp/day_of_week.rb +32 -0
- data/lib/texp/every_day.rb +30 -0
- data/lib/texp/ext.rb +4 -0
- data/lib/texp/hash_builder.rb +44 -0
- data/lib/texp/logic.rb +96 -0
- data/lib/texp/month.rb +32 -0
- data/lib/texp/parse.rb +112 -0
- data/lib/texp/week.rb +61 -0
- data/lib/texp/window.rb +52 -0
- data/lib/texp/year.rb +31 -0
- data/test/texp/day_interval_test.rb +22 -0
- data/test/texp/day_of_month_test.rb +27 -0
- data/test/texp/day_of_week_test.rb +31 -0
- data/test/texp/every_day_test.rb +15 -0
- data/test/texp/ext_test.rb +82 -0
- data/test/texp/hash_test.rb +26 -0
- data/test/texp/inspect_test.rb +65 -0
- data/test/texp/logic_test.rb +51 -0
- data/test/texp/logic_text_test.rb +0 -0
- data/test/texp/month_test.rb +20 -0
- data/test/texp/parse_test.rb +233 -0
- data/test/texp/week_test.rb +58 -0
- data/test/texp/window_test.rb +32 -0
- data/test/texp/year_test.rb +28 -0
- metadata +94 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'date'
|
5
|
+
require 'texp'
|
6
|
+
|
7
|
+
######################################################################
|
8
|
+
# TODO: This test is incomplete.
|
9
|
+
#
|
10
|
+
class ToHashTest < Test::Unit::TestCase
|
11
|
+
def test_to_hash
|
12
|
+
assert_hash '2008-02-14,2i', 'type' => 'i', 'i1' => '2008-02-14', 'i2' => '2'
|
13
|
+
assert_hash '[0,2]w', 'type' => 'w', 'w1' => ['0', '2']
|
14
|
+
assert_hash '[1,15]d', 'type' => 'd', 'd1' => ['1', '15']
|
15
|
+
assert_hash '[1,2,-1]k', 'type' => 'k', 'k1' => ['1', '2', '-1']
|
16
|
+
assert_hash '[1,3]m', 'type' => 'm', 'm1' => ['1', '3']
|
17
|
+
assert_hash '[2008,2010]y', 'type' => 'y', 'y1' => ['2008', '2010']
|
18
|
+
assert_hash 'e', 'type' => 'e'
|
19
|
+
end
|
20
|
+
|
21
|
+
def assert_hash(texp, hash)
|
22
|
+
assert_equal hash, TExp.parse(texp).to_hash, "should match for '#{texp}'"
|
23
|
+
# assert_equal texp, TExp.from_params('1' => hash).to_s
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'date'
|
5
|
+
require 'texp'
|
6
|
+
require 'flexmock/test_unit'
|
7
|
+
|
8
|
+
######################################################################
|
9
|
+
class InspectTest < Test::Unit::TestCase
|
10
|
+
def test_inspect
|
11
|
+
assert_inspect "e", "every day"
|
12
|
+
|
13
|
+
assert_inspect "0w", "the day of the week is Sunday"
|
14
|
+
assert_inspect "[0,1]w", "the day of the week is Sunday or Monday"
|
15
|
+
assert_inspect "[0,1,4,2,3,6,5]w",
|
16
|
+
"the day of the week is Sunday, Monday, Tuesday, Wednesday, Thursday, Friday or Saturday"
|
17
|
+
|
18
|
+
assert_inspect "1d", "the day of the month is the 1st"
|
19
|
+
assert_inspect "2d", "the day of the month is the 2nd"
|
20
|
+
assert_inspect "3d", "the day of the month is the 3rd"
|
21
|
+
assert_inspect "4d", "the day of the month is the 4th"
|
22
|
+
assert_inspect "5d", "the day of the month is the 5th"
|
23
|
+
assert_inspect "10d", "the day of the month is the 10th"
|
24
|
+
assert_inspect "11d", "the day of the month is the 11th"
|
25
|
+
assert_inspect "12d", "the day of the month is the 12th"
|
26
|
+
assert_inspect "13d", "the day of the month is the 13th"
|
27
|
+
assert_inspect "14d", "the day of the month is the 14th"
|
28
|
+
assert_inspect "15d", "the day of the month is the 15th"
|
29
|
+
assert_inspect "16d", "the day of the month is the 16th"
|
30
|
+
assert_inspect "17d", "the day of the month is the 17th"
|
31
|
+
assert_inspect "18d", "the day of the month is the 18th"
|
32
|
+
assert_inspect "19d", "the day of the month is the 19th"
|
33
|
+
assert_inspect "20d", "the day of the month is the 20th"
|
34
|
+
assert_inspect "[1,10,15]d", "the day of the month is the 1st, 10th or 15th"
|
35
|
+
|
36
|
+
assert_inspect "2008-02-15,3i", "every 3rd day starting on February 15, 2008"
|
37
|
+
assert_inspect "2008-02-15,1i", "every day starting on February 15, 2008"
|
38
|
+
|
39
|
+
assert_inspect "1k", "it is the 1st week of the month"
|
40
|
+
assert_inspect "[1,3]k", "it is the 1st or 3rd week of the month"
|
41
|
+
assert_inspect "[1,2,-1]k", "it is the 1st, 2nd or last week of the month"
|
42
|
+
assert_inspect "[-5,-4,-3,-2,-1]k",
|
43
|
+
"it is the 5th from the last, 4th from the last, 3rd from the last, next to the last or last week of the month"
|
44
|
+
|
45
|
+
assert_inspect "2008y", "the year is 2008"
|
46
|
+
|
47
|
+
assert_inspect "1m", "the month is January"
|
48
|
+
assert_inspect "[1,2,4]m", "the month is January, February or April"
|
49
|
+
|
50
|
+
assert_inspect "[1d1m]a",
|
51
|
+
"the day of the month is the 1st and the month is January"
|
52
|
+
assert_inspect "[1d1m]o",
|
53
|
+
"the day of the month is the 1st or the month is January"
|
54
|
+
|
55
|
+
assert_inspect "[1d1m]on",
|
56
|
+
"it is not the case that the day of the month is the 1st or the month is January"
|
57
|
+
|
58
|
+
assert_inspect "3w2,1s",
|
59
|
+
"the day of the week is Wednesday, or up to 2 days prior, or up to 1 day after"
|
60
|
+
end
|
61
|
+
|
62
|
+
def assert_inspect(texp, string)
|
63
|
+
assert_equal string, TExp.parse(texp).inspect
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'date'
|
5
|
+
require 'texp'
|
6
|
+
|
7
|
+
class LogicTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
DATE = Date.parse("Feb 14, 2008")
|
10
|
+
LEFT = TExp::DayInterval.new(DATE, 2)
|
11
|
+
RIGHT = TExp::DayInterval.new(DATE, 3)
|
12
|
+
TT = DATE
|
13
|
+
TF = DATE+2
|
14
|
+
FT = DATE+3
|
15
|
+
FF = DATE+1
|
16
|
+
|
17
|
+
def test_constants
|
18
|
+
assert LEFT.include?(TT)
|
19
|
+
assert LEFT.include?(TF)
|
20
|
+
assert ! LEFT.include?(FT)
|
21
|
+
assert ! LEFT.include?(FF)
|
22
|
+
assert RIGHT.include?(TT)
|
23
|
+
assert RIGHT.include?(FT)
|
24
|
+
assert ! RIGHT.include?(TF)
|
25
|
+
assert ! RIGHT.include?(FF)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_and
|
29
|
+
te = TExp::And.new(LEFT, RIGHT, LEFT, RIGHT)
|
30
|
+
assert te.include?(TT)
|
31
|
+
assert ! te.include?(FT)
|
32
|
+
assert ! te.include?(TF)
|
33
|
+
assert ! te.include?(FF)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_or
|
37
|
+
te = TExp::Or.new(LEFT, RIGHT, LEFT, RIGHT)
|
38
|
+
assert te.include?(TT)
|
39
|
+
assert te.include?(FT)
|
40
|
+
assert te.include?(TF)
|
41
|
+
assert ! te.include?(FF)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_not
|
45
|
+
te = TExp::Not.new(LEFT)
|
46
|
+
assert ! te.include?(TT)
|
47
|
+
assert te.include?(FF)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'date'
|
5
|
+
require 'texp'
|
6
|
+
|
7
|
+
class MonthTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@date = Date.parse("Feb 14, 2008")
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_initial_conditions
|
14
|
+
te = TExp::Month.new(2)
|
15
|
+
assert te.include?(@date)
|
16
|
+
assert te.include?(@date + 1)
|
17
|
+
assert ! te.include?(@date + 30)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,233 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'date'
|
5
|
+
require 'texp'
|
6
|
+
require 'flexmock/test_unit'
|
7
|
+
|
8
|
+
######################################################################
|
9
|
+
class TExpParseLexicalTest < Test::Unit::TestCase
|
10
|
+
def setup
|
11
|
+
@tokens = []
|
12
|
+
flexmock(TExp).should_receive(:compile).with(any).
|
13
|
+
and_return { |tok| @tokens << tok }
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_letters
|
17
|
+
assert_lex "abc", 'a', 'b', 'c'
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_numbers
|
21
|
+
assert_lex "1,23,4", '1', '23', '4'
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_positive_numbers
|
25
|
+
assert_lex "+1,23,+4", '+1', '23', '+4'
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_negative_numbers
|
29
|
+
assert_lex "-1,23,-4", '-1', '23', '-4'
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_punctuation
|
33
|
+
assert_lex "[@]()|&", '[', '@', ']', '(', ')', '|', '&'
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_dates
|
37
|
+
assert_lex "2008-02-14", "2008-02-14"
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_bad_dates
|
41
|
+
assert_lex "2008-2-14", "2008", "-2", "-14"
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_extension_tokens
|
45
|
+
assert_lex "<hi>", "<hi>"
|
46
|
+
end
|
47
|
+
|
48
|
+
EXPECTED = [
|
49
|
+
'[', '[', '2008', 'y', '2', 'm', '14', 'd', ']', 'a', '12', 'm',
|
50
|
+
'[', '1', '15', ']', 'd', '2008-02-14', '3', 'i', ']', 'o'
|
51
|
+
]
|
52
|
+
|
53
|
+
def test_mixed
|
54
|
+
assert_lex "[[2008y2m14d]a12m[1,15]d2008-02-14,3i]o", *EXPECTED
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_mixed_with_spaces
|
58
|
+
assert_lex "[[2008y 2m 14d]a 12m [1,15]d 2008-02-14,3i ]o", *EXPECTED
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def assert_lex(string, *tokens)
|
64
|
+
TExp.parse(string)
|
65
|
+
assert_equal tokens, @tokens
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
######################################################################
|
71
|
+
class ParseTest < Test::Unit::TestCase
|
72
|
+
def setup
|
73
|
+
@date = Date.parse("Feb 14, 2008")
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_bad_parse_string
|
77
|
+
assert_raise TExp::ParseError do
|
78
|
+
TExp.parse("(1,2)d")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_unbalanced_list
|
83
|
+
assert_raise TExp::ParseError do
|
84
|
+
TExp.parse("[1")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_unbalanced_list2
|
89
|
+
assert_raise TExp::ParseError do
|
90
|
+
TExp.parse("1]")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_parse_date
|
95
|
+
assert_equal Date.parse("Feb 14, 2008"), TExp.parse("2008-02-14")
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_parse_interval
|
99
|
+
te = TExp.parse("2008-02-14,2i")
|
100
|
+
assert te.include?(@date)
|
101
|
+
assert ! te.include?(@date+1)
|
102
|
+
assert te.include?(@date+2)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_parse_day_of_month
|
106
|
+
te = TExp.parse("14d")
|
107
|
+
te.include?(@date)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_parse_list
|
111
|
+
te = TExp.parse("[1,2,3]")
|
112
|
+
assert_equal [1,2,3], te
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_parse_day_of_month_with_multiple_args
|
116
|
+
te = TExp.parse("[13,14]d")
|
117
|
+
assert te.include?(@date)
|
118
|
+
assert te.include?(@date-1)
|
119
|
+
assert ! te.include?(@date+2)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_parse_day_of_week_with_single_arg
|
123
|
+
te = TExp.parse("4w")
|
124
|
+
assert te.include?(@date)
|
125
|
+
assert ! te.include?(@date+2)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_parse_day_of_week_with_multiple_args
|
129
|
+
te = TExp.parse("[3,4]w")
|
130
|
+
assert te.include?(@date)
|
131
|
+
assert te.include?(@date-1)
|
132
|
+
assert ! te.include?(@date+2)
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_parse_month_with_single_arg
|
136
|
+
te = TExp.parse("2m")
|
137
|
+
assert te.include?(@date)
|
138
|
+
assert ! te.include?(@date + 30)
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_parse_month_with_multiple_args
|
142
|
+
te = TExp.parse("[2,3]m")
|
143
|
+
assert te.include?(@date)
|
144
|
+
assert te.include?(@date + 30)
|
145
|
+
assert ! te.include?(@date + 60)
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_parse_year_with_single_arg
|
149
|
+
te = TExp.parse("2008y")
|
150
|
+
assert te.include?(@date)
|
151
|
+
assert ! te.include?(@date + 365)
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_parse_year_with_multiple_args
|
155
|
+
te = TExp.parse("[2007,2008]y")
|
156
|
+
assert te.include?(@date)
|
157
|
+
assert te.include?(@date - 365)
|
158
|
+
assert ! te.include?(@date + 365)
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_parse_window
|
162
|
+
te = TExp.parse("3w2,1s")
|
163
|
+
assert ! te.include?(Date.parse("Mar 2, 2008"))
|
164
|
+
assert te.include?(Date.parse("Mar 3, 2008"))
|
165
|
+
assert te.include?(Date.parse("Mar 4, 2008"))
|
166
|
+
assert te.include?(Date.parse("Mar 5, 2008"))
|
167
|
+
assert te.include?(Date.parse("Mar 6, 2008"))
|
168
|
+
assert ! te.include?(Date.parse("Mar 7, 2008"))
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_parse_not
|
172
|
+
te = TExp.parse("14dn")
|
173
|
+
assert ! te.include?(@date)
|
174
|
+
assert te.include?(@date + 1)
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_parse_and
|
178
|
+
TExp.parse("14d").include?(@date)
|
179
|
+
TExp.parse("2m").include?(@date)
|
180
|
+
te = TExp.parse("[14d 2m] a")
|
181
|
+
assert te.include?(@date)
|
182
|
+
assert ! te.include?(@date + 1)
|
183
|
+
assert ! te.include?(@date + 365)
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_parse_or
|
187
|
+
te = TExp.parse("[14d 15d] o")
|
188
|
+
assert te.include?(@date)
|
189
|
+
assert te.include?(@date + 1)
|
190
|
+
assert ! te.include?(@date + 2)
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_parse_every_day
|
194
|
+
te = TExp.parse('e')
|
195
|
+
assert te.include?(Date.today)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
######################################################################
|
200
|
+
class ParseReverseTest < Test::Unit::TestCase
|
201
|
+
def setup
|
202
|
+
@date = Date.parse("Feb 14, 2008")
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_round_trip
|
206
|
+
assert_round_trip("2008-02-14,2i")
|
207
|
+
assert_round_trip("14d")
|
208
|
+
assert_round_trip("[13,14]d")
|
209
|
+
assert_round_trip("[3,4]w")
|
210
|
+
assert_round_trip("2m")
|
211
|
+
assert_round_trip("[2,3]m")
|
212
|
+
assert_round_trip("2008y")
|
213
|
+
assert_round_trip("[2007,2008]y")
|
214
|
+
assert_round_trip("14dn")
|
215
|
+
assert_round_trip("[14d2m]a")
|
216
|
+
assert_round_trip("[14d15d]o")
|
217
|
+
assert_round_trip("14do")
|
218
|
+
assert_round_trip("[]o")
|
219
|
+
assert_round_trip("e")
|
220
|
+
assert_round_trip("1k")
|
221
|
+
assert_round_trip("[1,2]k")
|
222
|
+
assert_round_trip("[1,2,-1]k")
|
223
|
+
assert_round_trip("3w2,1s")
|
224
|
+
end
|
225
|
+
|
226
|
+
private
|
227
|
+
|
228
|
+
def assert_round_trip(string)
|
229
|
+
te = TExp.parse(string)
|
230
|
+
assert_equal string, te.to_s
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'texp'
|
6
|
+
|
7
|
+
class WeekTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def test_week_include_with_one_week
|
10
|
+
te = TExp::Week.new([1])
|
11
|
+
assert te.include?(Date.parse("Feb 1, 2008"))
|
12
|
+
assert te.include?(Date.parse("Feb 2, 2008"))
|
13
|
+
assert te.include?(Date.parse("Feb 3, 2008"))
|
14
|
+
assert te.include?(Date.parse("Feb 5, 2008"))
|
15
|
+
assert te.include?(Date.parse("Feb 6, 2008"))
|
16
|
+
assert te.include?(Date.parse("Feb 7, 2008"))
|
17
|
+
assert ! te.include?(Date.parse("Feb 8, 2008"))
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_week_include_with_several_weeks
|
21
|
+
te = TExp::Week.new([2,4])
|
22
|
+
assert ! te.include?(Date.parse("Feb 1, 2008"))
|
23
|
+
assert ! te.include?(Date.parse("Feb 7, 2008"))
|
24
|
+
assert te.include?(Date.parse("Feb 8, 2008"))
|
25
|
+
assert te.include?(Date.parse("Feb 14, 2008"))
|
26
|
+
assert ! te.include?(Date.parse("Feb 15, 2008"))
|
27
|
+
assert ! te.include?(Date.parse("Feb 21, 2008"))
|
28
|
+
assert te.include?(Date.parse("Feb 22, 2008"))
|
29
|
+
assert te.include?(Date.parse("Feb 28, 2008"))
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_week_with_last_week_of_month
|
33
|
+
te = TExp::Week.new([-1])
|
34
|
+
assert ! te.include?(Date.parse("Feb 1, 2008"))
|
35
|
+
assert ! te.include?(Date.parse("Feb 22, 2008"))
|
36
|
+
assert te.include?(Date.parse("Feb 23, 2008"))
|
37
|
+
assert te.include?(Date.parse("Feb 29, 2008"))
|
38
|
+
end
|
39
|
+
|
40
|
+
# Test some private methods
|
41
|
+
|
42
|
+
def test_week_from_back
|
43
|
+
te = TExp::Week.new([1])
|
44
|
+
assert_equal -1, te.send(:week_from_back, Date.parse("Mar 31, 2008"))
|
45
|
+
assert_equal -1, te.send(:week_from_back, Date.parse("Mar 25, 2008"))
|
46
|
+
assert_equal -2, te.send(:week_from_back, Date.parse("Mar 24, 2008"))
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_last_day_of_month
|
50
|
+
te = TExp::Week.new([1])
|
51
|
+
assert_equal 31, te.send(:last_day_of_month, Date.parse("Jan 21, 2008"))
|
52
|
+
assert_equal 29, te.send(:last_day_of_month, Date.parse("Feb 21, 2008"))
|
53
|
+
assert_equal 28, te.send(:last_day_of_month, Date.parse("Feb 21, 2007"))
|
54
|
+
assert_equal 30, te.send(:last_day_of_month, Date.parse("Nov 1, 2007"))
|
55
|
+
assert_equal 31, te.send(:last_day_of_month, Date.parse("Dec 1, 2007"))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|