1# -*- coding: utf-8 -*- 2from __future__ import unicode_literals 3from ._common import WarningTestMixin, unittest 4 5import calendar 6from datetime import datetime, date 7from six import PY3 8 9from dateutil.rrule import * 10 11 12class RRuleTest(WarningTestMixin, unittest.TestCase): 13 def _rrulestr_reverse_test(self, rule): 14 """ 15 Call with an `rrule` and it will test that `str(rrule)` generates a 16 string which generates the same `rrule` as the input when passed to 17 `rrulestr()` 18 """ 19 rr_str = str(rule) 20 rrulestr_rrule = rrulestr(rr_str) 21 22 self.assertEqual(list(rule), list(rrulestr_rrule)) 23 24 def testYearly(self): 25 self.assertEqual(list(rrule(YEARLY, 26 count=3, 27 dtstart=datetime(1997, 9, 2, 9, 0))), 28 [datetime(1997, 9, 2, 9, 0), 29 datetime(1998, 9, 2, 9, 0), 30 datetime(1999, 9, 2, 9, 0)]) 31 32 def testYearlyInterval(self): 33 self.assertEqual(list(rrule(YEARLY, 34 count=3, 35 interval=2, 36 dtstart=datetime(1997, 9, 2, 9, 0))), 37 [datetime(1997, 9, 2, 9, 0), 38 datetime(1999, 9, 2, 9, 0), 39 datetime(2001, 9, 2, 9, 0)]) 40 41 def testYearlyIntervalLarge(self): 42 self.assertEqual(list(rrule(YEARLY, 43 count=3, 44 interval=100, 45 dtstart=datetime(1997, 9, 2, 9, 0))), 46 [datetime(1997, 9, 2, 9, 0), 47 datetime(2097, 9, 2, 9, 0), 48 datetime(2197, 9, 2, 9, 0)]) 49 50 def testYearlyByMonth(self): 51 self.assertEqual(list(rrule(YEARLY, 52 count=3, 53 bymonth=(1, 3), 54 dtstart=datetime(1997, 9, 2, 9, 0))), 55 [datetime(1998, 1, 2, 9, 0), 56 datetime(1998, 3, 2, 9, 0), 57 datetime(1999, 1, 2, 9, 0)]) 58 59 def testYearlyByMonthDay(self): 60 self.assertEqual(list(rrule(YEARLY, 61 count=3, 62 bymonthday=(1, 3), 63 dtstart=datetime(1997, 9, 2, 9, 0))), 64 [datetime(1997, 9, 3, 9, 0), 65 datetime(1997, 10, 1, 9, 0), 66 datetime(1997, 10, 3, 9, 0)]) 67 68 def testYearlyByMonthAndMonthDay(self): 69 self.assertEqual(list(rrule(YEARLY, 70 count=3, 71 bymonth=(1, 3), 72 bymonthday=(5, 7), 73 dtstart=datetime(1997, 9, 2, 9, 0))), 74 [datetime(1998, 1, 5, 9, 0), 75 datetime(1998, 1, 7, 9, 0), 76 datetime(1998, 3, 5, 9, 0)]) 77 78 def testYearlyByWeekDay(self): 79 self.assertEqual(list(rrule(YEARLY, 80 count=3, 81 byweekday=(TU, TH), 82 dtstart=datetime(1997, 9, 2, 9, 0))), 83 [datetime(1997, 9, 2, 9, 0), 84 datetime(1997, 9, 4, 9, 0), 85 datetime(1997, 9, 9, 9, 0)]) 86 87 def testYearlyByNWeekDay(self): 88 self.assertEqual(list(rrule(YEARLY, 89 count=3, 90 byweekday=(TU(1), TH(-1)), 91 dtstart=datetime(1997, 9, 2, 9, 0))), 92 [datetime(1997, 12, 25, 9, 0), 93 datetime(1998, 1, 6, 9, 0), 94 datetime(1998, 12, 31, 9, 0)]) 95 96 def testYearlyByNWeekDayLarge(self): 97 self.assertEqual(list(rrule(YEARLY, 98 count=3, 99 byweekday=(TU(3), TH(-3)), 100 dtstart=datetime(1997, 9, 2, 9, 0))), 101 [datetime(1997, 12, 11, 9, 0), 102 datetime(1998, 1, 20, 9, 0), 103 datetime(1998, 12, 17, 9, 0)]) 104 105 def testYearlyByMonthAndWeekDay(self): 106 self.assertEqual(list(rrule(YEARLY, 107 count=3, 108 bymonth=(1, 3), 109 byweekday=(TU, TH), 110 dtstart=datetime(1997, 9, 2, 9, 0))), 111 [datetime(1998, 1, 1, 9, 0), 112 datetime(1998, 1, 6, 9, 0), 113 datetime(1998, 1, 8, 9, 0)]) 114 115 def testYearlyByMonthAndNWeekDay(self): 116 self.assertEqual(list(rrule(YEARLY, 117 count=3, 118 bymonth=(1, 3), 119 byweekday=(TU(1), TH(-1)), 120 dtstart=datetime(1997, 9, 2, 9, 0))), 121 [datetime(1998, 1, 6, 9, 0), 122 datetime(1998, 1, 29, 9, 0), 123 datetime(1998, 3, 3, 9, 0)]) 124 125 def testYearlyByMonthAndNWeekDayLarge(self): 126 # This is interesting because the TH(-3) ends up before 127 # the TU(3). 128 self.assertEqual(list(rrule(YEARLY, 129 count=3, 130 bymonth=(1, 3), 131 byweekday=(TU(3), TH(-3)), 132 dtstart=datetime(1997, 9, 2, 9, 0))), 133 [datetime(1998, 1, 15, 9, 0), 134 datetime(1998, 1, 20, 9, 0), 135 datetime(1998, 3, 12, 9, 0)]) 136 137 def testYearlyByMonthDayAndWeekDay(self): 138 self.assertEqual(list(rrule(YEARLY, 139 count=3, 140 bymonthday=(1, 3), 141 byweekday=(TU, TH), 142 dtstart=datetime(1997, 9, 2, 9, 0))), 143 [datetime(1998, 1, 1, 9, 0), 144 datetime(1998, 2, 3, 9, 0), 145 datetime(1998, 3, 3, 9, 0)]) 146 147 def testYearlyByMonthAndMonthDayAndWeekDay(self): 148 self.assertEqual(list(rrule(YEARLY, 149 count=3, 150 bymonth=(1, 3), 151 bymonthday=(1, 3), 152 byweekday=(TU, TH), 153 dtstart=datetime(1997, 9, 2, 9, 0))), 154 [datetime(1998, 1, 1, 9, 0), 155 datetime(1998, 3, 3, 9, 0), 156 datetime(2001, 3, 1, 9, 0)]) 157 158 def testYearlyByYearDay(self): 159 self.assertEqual(list(rrule(YEARLY, 160 count=4, 161 byyearday=(1, 100, 200, 365), 162 dtstart=datetime(1997, 9, 2, 9, 0))), 163 [datetime(1997, 12, 31, 9, 0), 164 datetime(1998, 1, 1, 9, 0), 165 datetime(1998, 4, 10, 9, 0), 166 datetime(1998, 7, 19, 9, 0)]) 167 168 def testYearlyByYearDayNeg(self): 169 self.assertEqual(list(rrule(YEARLY, 170 count=4, 171 byyearday=(-365, -266, -166, -1), 172 dtstart=datetime(1997, 9, 2, 9, 0))), 173 [datetime(1997, 12, 31, 9, 0), 174 datetime(1998, 1, 1, 9, 0), 175 datetime(1998, 4, 10, 9, 0), 176 datetime(1998, 7, 19, 9, 0)]) 177 178 def testYearlyByMonthAndYearDay(self): 179 self.assertEqual(list(rrule(YEARLY, 180 count=4, 181 bymonth=(4, 7), 182 byyearday=(1, 100, 200, 365), 183 dtstart=datetime(1997, 9, 2, 9, 0))), 184 [datetime(1998, 4, 10, 9, 0), 185 datetime(1998, 7, 19, 9, 0), 186 datetime(1999, 4, 10, 9, 0), 187 datetime(1999, 7, 19, 9, 0)]) 188 189 def testYearlyByMonthAndYearDayNeg(self): 190 self.assertEqual(list(rrule(YEARLY, 191 count=4, 192 bymonth=(4, 7), 193 byyearday=(-365, -266, -166, -1), 194 dtstart=datetime(1997, 9, 2, 9, 0))), 195 [datetime(1998, 4, 10, 9, 0), 196 datetime(1998, 7, 19, 9, 0), 197 datetime(1999, 4, 10, 9, 0), 198 datetime(1999, 7, 19, 9, 0)]) 199 200 def testYearlyByWeekNo(self): 201 self.assertEqual(list(rrule(YEARLY, 202 count=3, 203 byweekno=20, 204 dtstart=datetime(1997, 9, 2, 9, 0))), 205 [datetime(1998, 5, 11, 9, 0), 206 datetime(1998, 5, 12, 9, 0), 207 datetime(1998, 5, 13, 9, 0)]) 208 209 def testYearlyByWeekNoAndWeekDay(self): 210 # That's a nice one. The first days of week number one 211 # may be in the last year. 212 self.assertEqual(list(rrule(YEARLY, 213 count=3, 214 byweekno=1, 215 byweekday=MO, 216 dtstart=datetime(1997, 9, 2, 9, 0))), 217 [datetime(1997, 12, 29, 9, 0), 218 datetime(1999, 1, 4, 9, 0), 219 datetime(2000, 1, 3, 9, 0)]) 220 221 def testYearlyByWeekNoAndWeekDayLarge(self): 222 # Another nice test. The last days of week number 52/53 223 # may be in the next year. 224 self.assertEqual(list(rrule(YEARLY, 225 count=3, 226 byweekno=52, 227 byweekday=SU, 228 dtstart=datetime(1997, 9, 2, 9, 0))), 229 [datetime(1997, 12, 28, 9, 0), 230 datetime(1998, 12, 27, 9, 0), 231 datetime(2000, 1, 2, 9, 0)]) 232 233 def testYearlyByWeekNoAndWeekDayLast(self): 234 self.assertEqual(list(rrule(YEARLY, 235 count=3, 236 byweekno=-1, 237 byweekday=SU, 238 dtstart=datetime(1997, 9, 2, 9, 0))), 239 [datetime(1997, 12, 28, 9, 0), 240 datetime(1999, 1, 3, 9, 0), 241 datetime(2000, 1, 2, 9, 0)]) 242 243 def testYearlyByEaster(self): 244 self.assertEqual(list(rrule(YEARLY, 245 count=3, 246 byeaster=0, 247 dtstart=datetime(1997, 9, 2, 9, 0))), 248 [datetime(1998, 4, 12, 9, 0), 249 datetime(1999, 4, 4, 9, 0), 250 datetime(2000, 4, 23, 9, 0)]) 251 252 def testYearlyByEasterPos(self): 253 self.assertEqual(list(rrule(YEARLY, 254 count=3, 255 byeaster=1, 256 dtstart=datetime(1997, 9, 2, 9, 0))), 257 [datetime(1998, 4, 13, 9, 0), 258 datetime(1999, 4, 5, 9, 0), 259 datetime(2000, 4, 24, 9, 0)]) 260 261 def testYearlyByEasterNeg(self): 262 self.assertEqual(list(rrule(YEARLY, 263 count=3, 264 byeaster=-1, 265 dtstart=datetime(1997, 9, 2, 9, 0))), 266 [datetime(1998, 4, 11, 9, 0), 267 datetime(1999, 4, 3, 9, 0), 268 datetime(2000, 4, 22, 9, 0)]) 269 270 def testYearlyByWeekNoAndWeekDay53(self): 271 self.assertEqual(list(rrule(YEARLY, 272 count=3, 273 byweekno=53, 274 byweekday=MO, 275 dtstart=datetime(1997, 9, 2, 9, 0))), 276 [datetime(1998, 12, 28, 9, 0), 277 datetime(2004, 12, 27, 9, 0), 278 datetime(2009, 12, 28, 9, 0)]) 279 280 def testYearlyByHour(self): 281 self.assertEqual(list(rrule(YEARLY, 282 count=3, 283 byhour=(6, 18), 284 dtstart=datetime(1997, 9, 2, 9, 0))), 285 [datetime(1997, 9, 2, 18, 0), 286 datetime(1998, 9, 2, 6, 0), 287 datetime(1998, 9, 2, 18, 0)]) 288 289 def testYearlyByMinute(self): 290 self.assertEqual(list(rrule(YEARLY, 291 count=3, 292 byminute=(6, 18), 293 dtstart=datetime(1997, 9, 2, 9, 0))), 294 [datetime(1997, 9, 2, 9, 6), 295 datetime(1997, 9, 2, 9, 18), 296 datetime(1998, 9, 2, 9, 6)]) 297 298 def testYearlyBySecond(self): 299 self.assertEqual(list(rrule(YEARLY, 300 count=3, 301 bysecond=(6, 18), 302 dtstart=datetime(1997, 9, 2, 9, 0))), 303 [datetime(1997, 9, 2, 9, 0, 6), 304 datetime(1997, 9, 2, 9, 0, 18), 305 datetime(1998, 9, 2, 9, 0, 6)]) 306 307 def testYearlyByHourAndMinute(self): 308 self.assertEqual(list(rrule(YEARLY, 309 count=3, 310 byhour=(6, 18), 311 byminute=(6, 18), 312 dtstart=datetime(1997, 9, 2, 9, 0))), 313 [datetime(1997, 9, 2, 18, 6), 314 datetime(1997, 9, 2, 18, 18), 315 datetime(1998, 9, 2, 6, 6)]) 316 317 def testYearlyByHourAndSecond(self): 318 self.assertEqual(list(rrule(YEARLY, 319 count=3, 320 byhour=(6, 18), 321 bysecond=(6, 18), 322 dtstart=datetime(1997, 9, 2, 9, 0))), 323 [datetime(1997, 9, 2, 18, 0, 6), 324 datetime(1997, 9, 2, 18, 0, 18), 325 datetime(1998, 9, 2, 6, 0, 6)]) 326 327 def testYearlyByMinuteAndSecond(self): 328 self.assertEqual(list(rrule(YEARLY, 329 count=3, 330 byminute=(6, 18), 331 bysecond=(6, 18), 332 dtstart=datetime(1997, 9, 2, 9, 0))), 333 [datetime(1997, 9, 2, 9, 6, 6), 334 datetime(1997, 9, 2, 9, 6, 18), 335 datetime(1997, 9, 2, 9, 18, 6)]) 336 337 def testYearlyByHourAndMinuteAndSecond(self): 338 self.assertEqual(list(rrule(YEARLY, 339 count=3, 340 byhour=(6, 18), 341 byminute=(6, 18), 342 bysecond=(6, 18), 343 dtstart=datetime(1997, 9, 2, 9, 0))), 344 [datetime(1997, 9, 2, 18, 6, 6), 345 datetime(1997, 9, 2, 18, 6, 18), 346 datetime(1997, 9, 2, 18, 18, 6)]) 347 348 def testYearlyBySetPos(self): 349 self.assertEqual(list(rrule(YEARLY, 350 count=3, 351 bymonthday=15, 352 byhour=(6, 18), 353 bysetpos=(3, -3), 354 dtstart=datetime(1997, 9, 2, 9, 0))), 355 [datetime(1997, 11, 15, 18, 0), 356 datetime(1998, 2, 15, 6, 0), 357 datetime(1998, 11, 15, 18, 0)]) 358 359 def testMonthly(self): 360 self.assertEqual(list(rrule(MONTHLY, 361 count=3, 362 dtstart=datetime(1997, 9, 2, 9, 0))), 363 [datetime(1997, 9, 2, 9, 0), 364 datetime(1997, 10, 2, 9, 0), 365 datetime(1997, 11, 2, 9, 0)]) 366 367 def testMonthlyInterval(self): 368 self.assertEqual(list(rrule(MONTHLY, 369 count=3, 370 interval=2, 371 dtstart=datetime(1997, 9, 2, 9, 0))), 372 [datetime(1997, 9, 2, 9, 0), 373 datetime(1997, 11, 2, 9, 0), 374 datetime(1998, 1, 2, 9, 0)]) 375 376 def testMonthlyIntervalLarge(self): 377 self.assertEqual(list(rrule(MONTHLY, 378 count=3, 379 interval=18, 380 dtstart=datetime(1997, 9, 2, 9, 0))), 381 [datetime(1997, 9, 2, 9, 0), 382 datetime(1999, 3, 2, 9, 0), 383 datetime(2000, 9, 2, 9, 0)]) 384 385 def testMonthlyByMonth(self): 386 self.assertEqual(list(rrule(MONTHLY, 387 count=3, 388 bymonth=(1, 3), 389 dtstart=datetime(1997, 9, 2, 9, 0))), 390 [datetime(1998, 1, 2, 9, 0), 391 datetime(1998, 3, 2, 9, 0), 392 datetime(1999, 1, 2, 9, 0)]) 393 394 def testMonthlyByMonthDay(self): 395 self.assertEqual(list(rrule(MONTHLY, 396 count=3, 397 bymonthday=(1, 3), 398 dtstart=datetime(1997, 9, 2, 9, 0))), 399 [datetime(1997, 9, 3, 9, 0), 400 datetime(1997, 10, 1, 9, 0), 401 datetime(1997, 10, 3, 9, 0)]) 402 403 def testMonthlyByMonthAndMonthDay(self): 404 self.assertEqual(list(rrule(MONTHLY, 405 count=3, 406 bymonth=(1, 3), 407 bymonthday=(5, 7), 408 dtstart=datetime(1997, 9, 2, 9, 0))), 409 [datetime(1998, 1, 5, 9, 0), 410 datetime(1998, 1, 7, 9, 0), 411 datetime(1998, 3, 5, 9, 0)]) 412 413 def testMonthlyByWeekDay(self): 414 self.assertEqual(list(rrule(MONTHLY, 415 count=3, 416 byweekday=(TU, TH), 417 dtstart=datetime(1997, 9, 2, 9, 0))), 418 [datetime(1997, 9, 2, 9, 0), 419 datetime(1997, 9, 4, 9, 0), 420 datetime(1997, 9, 9, 9, 0)]) 421 422 # Third Monday of the month 423 self.assertEqual(rrule(MONTHLY, 424 byweekday=(MO(+3)), 425 dtstart=datetime(1997, 9, 1)).between(datetime(1997, 9, 1), 426 datetime(1997, 12, 1)), 427 [datetime(1997, 9, 15, 0, 0), 428 datetime(1997, 10, 20, 0, 0), 429 datetime(1997, 11, 17, 0, 0)]) 430 431 def testMonthlyByNWeekDay(self): 432 self.assertEqual(list(rrule(MONTHLY, 433 count=3, 434 byweekday=(TU(1), TH(-1)), 435 dtstart=datetime(1997, 9, 2, 9, 0))), 436 [datetime(1997, 9, 2, 9, 0), 437 datetime(1997, 9, 25, 9, 0), 438 datetime(1997, 10, 7, 9, 0)]) 439 440 def testMonthlyByNWeekDayLarge(self): 441 self.assertEqual(list(rrule(MONTHLY, 442 count=3, 443 byweekday=(TU(3), TH(-3)), 444 dtstart=datetime(1997, 9, 2, 9, 0))), 445 [datetime(1997, 9, 11, 9, 0), 446 datetime(1997, 9, 16, 9, 0), 447 datetime(1997, 10, 16, 9, 0)]) 448 449 def testMonthlyByMonthAndWeekDay(self): 450 self.assertEqual(list(rrule(MONTHLY, 451 count=3, 452 bymonth=(1, 3), 453 byweekday=(TU, TH), 454 dtstart=datetime(1997, 9, 2, 9, 0))), 455 [datetime(1998, 1, 1, 9, 0), 456 datetime(1998, 1, 6, 9, 0), 457 datetime(1998, 1, 8, 9, 0)]) 458 459 def testMonthlyByMonthAndNWeekDay(self): 460 self.assertEqual(list(rrule(MONTHLY, 461 count=3, 462 bymonth=(1, 3), 463 byweekday=(TU(1), TH(-1)), 464 dtstart=datetime(1997, 9, 2, 9, 0))), 465 [datetime(1998, 1, 6, 9, 0), 466 datetime(1998, 1, 29, 9, 0), 467 datetime(1998, 3, 3, 9, 0)]) 468 469 def testMonthlyByMonthAndNWeekDayLarge(self): 470 self.assertEqual(list(rrule(MONTHLY, 471 count=3, 472 bymonth=(1, 3), 473 byweekday=(TU(3), TH(-3)), 474 dtstart=datetime(1997, 9, 2, 9, 0))), 475 [datetime(1998, 1, 15, 9, 0), 476 datetime(1998, 1, 20, 9, 0), 477 datetime(1998, 3, 12, 9, 0)]) 478 479 def testMonthlyByMonthDayAndWeekDay(self): 480 self.assertEqual(list(rrule(MONTHLY, 481 count=3, 482 bymonthday=(1, 3), 483 byweekday=(TU, TH), 484 dtstart=datetime(1997, 9, 2, 9, 0))), 485 [datetime(1998, 1, 1, 9, 0), 486 datetime(1998, 2, 3, 9, 0), 487 datetime(1998, 3, 3, 9, 0)]) 488 489 def testMonthlyByMonthAndMonthDayAndWeekDay(self): 490 self.assertEqual(list(rrule(MONTHLY, 491 count=3, 492 bymonth=(1, 3), 493 bymonthday=(1, 3), 494 byweekday=(TU, TH), 495 dtstart=datetime(1997, 9, 2, 9, 0))), 496 [datetime(1998, 1, 1, 9, 0), 497 datetime(1998, 3, 3, 9, 0), 498 datetime(2001, 3, 1, 9, 0)]) 499 500 def testMonthlyByYearDay(self): 501 self.assertEqual(list(rrule(MONTHLY, 502 count=4, 503 byyearday=(1, 100, 200, 365), 504 dtstart=datetime(1997, 9, 2, 9, 0))), 505 [datetime(1997, 12, 31, 9, 0), 506 datetime(1998, 1, 1, 9, 0), 507 datetime(1998, 4, 10, 9, 0), 508 datetime(1998, 7, 19, 9, 0)]) 509 510 def testMonthlyByYearDayNeg(self): 511 self.assertEqual(list(rrule(MONTHLY, 512 count=4, 513 byyearday=(-365, -266, -166, -1), 514 dtstart=datetime(1997, 9, 2, 9, 0))), 515 [datetime(1997, 12, 31, 9, 0), 516 datetime(1998, 1, 1, 9, 0), 517 datetime(1998, 4, 10, 9, 0), 518 datetime(1998, 7, 19, 9, 0)]) 519 520 def testMonthlyByMonthAndYearDay(self): 521 self.assertEqual(list(rrule(MONTHLY, 522 count=4, 523 bymonth=(4, 7), 524 byyearday=(1, 100, 200, 365), 525 dtstart=datetime(1997, 9, 2, 9, 0))), 526 [datetime(1998, 4, 10, 9, 0), 527 datetime(1998, 7, 19, 9, 0), 528 datetime(1999, 4, 10, 9, 0), 529 datetime(1999, 7, 19, 9, 0)]) 530 531 def testMonthlyByMonthAndYearDayNeg(self): 532 self.assertEqual(list(rrule(MONTHLY, 533 count=4, 534 bymonth=(4, 7), 535 byyearday=(-365, -266, -166, -1), 536 dtstart=datetime(1997, 9, 2, 9, 0))), 537 [datetime(1998, 4, 10, 9, 0), 538 datetime(1998, 7, 19, 9, 0), 539 datetime(1999, 4, 10, 9, 0), 540 datetime(1999, 7, 19, 9, 0)]) 541 542 def testMonthlyByWeekNo(self): 543 self.assertEqual(list(rrule(MONTHLY, 544 count=3, 545 byweekno=20, 546 dtstart=datetime(1997, 9, 2, 9, 0))), 547 [datetime(1998, 5, 11, 9, 0), 548 datetime(1998, 5, 12, 9, 0), 549 datetime(1998, 5, 13, 9, 0)]) 550 551 def testMonthlyByWeekNoAndWeekDay(self): 552 # That's a nice one. The first days of week number one 553 # may be in the last year. 554 self.assertEqual(list(rrule(MONTHLY, 555 count=3, 556 byweekno=1, 557 byweekday=MO, 558 dtstart=datetime(1997, 9, 2, 9, 0))), 559 [datetime(1997, 12, 29, 9, 0), 560 datetime(1999, 1, 4, 9, 0), 561 datetime(2000, 1, 3, 9, 0)]) 562 563 def testMonthlyByWeekNoAndWeekDayLarge(self): 564 # Another nice test. The last days of week number 52/53 565 # may be in the next year. 566 self.assertEqual(list(rrule(MONTHLY, 567 count=3, 568 byweekno=52, 569 byweekday=SU, 570 dtstart=datetime(1997, 9, 2, 9, 0))), 571 [datetime(1997, 12, 28, 9, 0), 572 datetime(1998, 12, 27, 9, 0), 573 datetime(2000, 1, 2, 9, 0)]) 574 575 def testMonthlyByWeekNoAndWeekDayLast(self): 576 self.assertEqual(list(rrule(MONTHLY, 577 count=3, 578 byweekno=-1, 579 byweekday=SU, 580 dtstart=datetime(1997, 9, 2, 9, 0))), 581 [datetime(1997, 12, 28, 9, 0), 582 datetime(1999, 1, 3, 9, 0), 583 datetime(2000, 1, 2, 9, 0)]) 584 585 def testMonthlyByWeekNoAndWeekDay53(self): 586 self.assertEqual(list(rrule(MONTHLY, 587 count=3, 588 byweekno=53, 589 byweekday=MO, 590 dtstart=datetime(1997, 9, 2, 9, 0))), 591 [datetime(1998, 12, 28, 9, 0), 592 datetime(2004, 12, 27, 9, 0), 593 datetime(2009, 12, 28, 9, 0)]) 594 595 def testMonthlyByEaster(self): 596 self.assertEqual(list(rrule(MONTHLY, 597 count=3, 598 byeaster=0, 599 dtstart=datetime(1997, 9, 2, 9, 0))), 600 [datetime(1998, 4, 12, 9, 0), 601 datetime(1999, 4, 4, 9, 0), 602 datetime(2000, 4, 23, 9, 0)]) 603 604 def testMonthlyByEasterPos(self): 605 self.assertEqual(list(rrule(MONTHLY, 606 count=3, 607 byeaster=1, 608 dtstart=datetime(1997, 9, 2, 9, 0))), 609 [datetime(1998, 4, 13, 9, 0), 610 datetime(1999, 4, 5, 9, 0), 611 datetime(2000, 4, 24, 9, 0)]) 612 613 def testMonthlyByEasterNeg(self): 614 self.assertEqual(list(rrule(MONTHLY, 615 count=3, 616 byeaster=-1, 617 dtstart=datetime(1997, 9, 2, 9, 0))), 618 [datetime(1998, 4, 11, 9, 0), 619 datetime(1999, 4, 3, 9, 0), 620 datetime(2000, 4, 22, 9, 0)]) 621 622 def testMonthlyByHour(self): 623 self.assertEqual(list(rrule(MONTHLY, 624 count=3, 625 byhour=(6, 18), 626 dtstart=datetime(1997, 9, 2, 9, 0))), 627 [datetime(1997, 9, 2, 18, 0), 628 datetime(1997, 10, 2, 6, 0), 629 datetime(1997, 10, 2, 18, 0)]) 630 631 def testMonthlyByMinute(self): 632 self.assertEqual(list(rrule(MONTHLY, 633 count=3, 634 byminute=(6, 18), 635 dtstart=datetime(1997, 9, 2, 9, 0))), 636 [datetime(1997, 9, 2, 9, 6), 637 datetime(1997, 9, 2, 9, 18), 638 datetime(1997, 10, 2, 9, 6)]) 639 640 def testMonthlyBySecond(self): 641 self.assertEqual(list(rrule(MONTHLY, 642 count=3, 643 bysecond=(6, 18), 644 dtstart=datetime(1997, 9, 2, 9, 0))), 645 [datetime(1997, 9, 2, 9, 0, 6), 646 datetime(1997, 9, 2, 9, 0, 18), 647 datetime(1997, 10, 2, 9, 0, 6)]) 648 649 def testMonthlyByHourAndMinute(self): 650 self.assertEqual(list(rrule(MONTHLY, 651 count=3, 652 byhour=(6, 18), 653 byminute=(6, 18), 654 dtstart=datetime(1997, 9, 2, 9, 0))), 655 [datetime(1997, 9, 2, 18, 6), 656 datetime(1997, 9, 2, 18, 18), 657 datetime(1997, 10, 2, 6, 6)]) 658 659 def testMonthlyByHourAndSecond(self): 660 self.assertEqual(list(rrule(MONTHLY, 661 count=3, 662 byhour=(6, 18), 663 bysecond=(6, 18), 664 dtstart=datetime(1997, 9, 2, 9, 0))), 665 [datetime(1997, 9, 2, 18, 0, 6), 666 datetime(1997, 9, 2, 18, 0, 18), 667 datetime(1997, 10, 2, 6, 0, 6)]) 668 669 def testMonthlyByMinuteAndSecond(self): 670 self.assertEqual(list(rrule(MONTHLY, 671 count=3, 672 byminute=(6, 18), 673 bysecond=(6, 18), 674 dtstart=datetime(1997, 9, 2, 9, 0))), 675 [datetime(1997, 9, 2, 9, 6, 6), 676 datetime(1997, 9, 2, 9, 6, 18), 677 datetime(1997, 9, 2, 9, 18, 6)]) 678 679 def testMonthlyByHourAndMinuteAndSecond(self): 680 self.assertEqual(list(rrule(MONTHLY, 681 count=3, 682 byhour=(6, 18), 683 byminute=(6, 18), 684 bysecond=(6, 18), 685 dtstart=datetime(1997, 9, 2, 9, 0))), 686 [datetime(1997, 9, 2, 18, 6, 6), 687 datetime(1997, 9, 2, 18, 6, 18), 688 datetime(1997, 9, 2, 18, 18, 6)]) 689 690 def testMonthlyBySetPos(self): 691 self.assertEqual(list(rrule(MONTHLY, 692 count=3, 693 bymonthday=(13, 17), 694 byhour=(6, 18), 695 bysetpos=(3, -3), 696 dtstart=datetime(1997, 9, 2, 9, 0))), 697 [datetime(1997, 9, 13, 18, 0), 698 datetime(1997, 9, 17, 6, 0), 699 datetime(1997, 10, 13, 18, 0)]) 700 701 def testWeekly(self): 702 self.assertEqual(list(rrule(WEEKLY, 703 count=3, 704 dtstart=datetime(1997, 9, 2, 9, 0))), 705 [datetime(1997, 9, 2, 9, 0), 706 datetime(1997, 9, 9, 9, 0), 707 datetime(1997, 9, 16, 9, 0)]) 708 709 def testWeeklyInterval(self): 710 self.assertEqual(list(rrule(WEEKLY, 711 count=3, 712 interval=2, 713 dtstart=datetime(1997, 9, 2, 9, 0))), 714 [datetime(1997, 9, 2, 9, 0), 715 datetime(1997, 9, 16, 9, 0), 716 datetime(1997, 9, 30, 9, 0)]) 717 718 def testWeeklyIntervalLarge(self): 719 self.assertEqual(list(rrule(WEEKLY, 720 count=3, 721 interval=20, 722 dtstart=datetime(1997, 9, 2, 9, 0))), 723 [datetime(1997, 9, 2, 9, 0), 724 datetime(1998, 1, 20, 9, 0), 725 datetime(1998, 6, 9, 9, 0)]) 726 727 def testWeeklyByMonth(self): 728 self.assertEqual(list(rrule(WEEKLY, 729 count=3, 730 bymonth=(1, 3), 731 dtstart=datetime(1997, 9, 2, 9, 0))), 732 [datetime(1998, 1, 6, 9, 0), 733 datetime(1998, 1, 13, 9, 0), 734 datetime(1998, 1, 20, 9, 0)]) 735 736 def testWeeklyByMonthDay(self): 737 self.assertEqual(list(rrule(WEEKLY, 738 count=3, 739 bymonthday=(1, 3), 740 dtstart=datetime(1997, 9, 2, 9, 0))), 741 [datetime(1997, 9, 3, 9, 0), 742 datetime(1997, 10, 1, 9, 0), 743 datetime(1997, 10, 3, 9, 0)]) 744 745 def testWeeklyByMonthAndMonthDay(self): 746 self.assertEqual(list(rrule(WEEKLY, 747 count=3, 748 bymonth=(1, 3), 749 bymonthday=(5, 7), 750 dtstart=datetime(1997, 9, 2, 9, 0))), 751 [datetime(1998, 1, 5, 9, 0), 752 datetime(1998, 1, 7, 9, 0), 753 datetime(1998, 3, 5, 9, 0)]) 754 755 def testWeeklyByWeekDay(self): 756 self.assertEqual(list(rrule(WEEKLY, 757 count=3, 758 byweekday=(TU, TH), 759 dtstart=datetime(1997, 9, 2, 9, 0))), 760 [datetime(1997, 9, 2, 9, 0), 761 datetime(1997, 9, 4, 9, 0), 762 datetime(1997, 9, 9, 9, 0)]) 763 764 def testWeeklyByNWeekDay(self): 765 self.assertEqual(list(rrule(WEEKLY, 766 count=3, 767 byweekday=(TU(1), TH(-1)), 768 dtstart=datetime(1997, 9, 2, 9, 0))), 769 [datetime(1997, 9, 2, 9, 0), 770 datetime(1997, 9, 4, 9, 0), 771 datetime(1997, 9, 9, 9, 0)]) 772 773 def testWeeklyByMonthAndWeekDay(self): 774 # This test is interesting, because it crosses the year 775 # boundary in a weekly period to find day '1' as a 776 # valid recurrence. 777 self.assertEqual(list(rrule(WEEKLY, 778 count=3, 779 bymonth=(1, 3), 780 byweekday=(TU, TH), 781 dtstart=datetime(1997, 9, 2, 9, 0))), 782 [datetime(1998, 1, 1, 9, 0), 783 datetime(1998, 1, 6, 9, 0), 784 datetime(1998, 1, 8, 9, 0)]) 785 786 def testWeeklyByMonthAndNWeekDay(self): 787 self.assertEqual(list(rrule(WEEKLY, 788 count=3, 789 bymonth=(1, 3), 790 byweekday=(TU(1), TH(-1)), 791 dtstart=datetime(1997, 9, 2, 9, 0))), 792 [datetime(1998, 1, 1, 9, 0), 793 datetime(1998, 1, 6, 9, 0), 794 datetime(1998, 1, 8, 9, 0)]) 795 796 def testWeeklyByMonthDayAndWeekDay(self): 797 self.assertEqual(list(rrule(WEEKLY, 798 count=3, 799 bymonthday=(1, 3), 800 byweekday=(TU, TH), 801 dtstart=datetime(1997, 9, 2, 9, 0))), 802 [datetime(1998, 1, 1, 9, 0), 803 datetime(1998, 2, 3, 9, 0), 804 datetime(1998, 3, 3, 9, 0)]) 805 806 def testWeeklyByMonthAndMonthDayAndWeekDay(self): 807 self.assertEqual(list(rrule(WEEKLY, 808 count=3, 809 bymonth=(1, 3), 810 bymonthday=(1, 3), 811 byweekday=(TU, TH), 812 dtstart=datetime(1997, 9, 2, 9, 0))), 813 [datetime(1998, 1, 1, 9, 0), 814 datetime(1998, 3, 3, 9, 0), 815 datetime(2001, 3, 1, 9, 0)]) 816 817 def testWeeklyByYearDay(self): 818 self.assertEqual(list(rrule(WEEKLY, 819 count=4, 820 byyearday=(1, 100, 200, 365), 821 dtstart=datetime(1997, 9, 2, 9, 0))), 822 [datetime(1997, 12, 31, 9, 0), 823 datetime(1998, 1, 1, 9, 0), 824 datetime(1998, 4, 10, 9, 0), 825 datetime(1998, 7, 19, 9, 0)]) 826 827 def testWeeklyByYearDayNeg(self): 828 self.assertEqual(list(rrule(WEEKLY, 829 count=4, 830 byyearday=(-365, -266, -166, -1), 831 dtstart=datetime(1997, 9, 2, 9, 0))), 832 [datetime(1997, 12, 31, 9, 0), 833 datetime(1998, 1, 1, 9, 0), 834 datetime(1998, 4, 10, 9, 0), 835 datetime(1998, 7, 19, 9, 0)]) 836 837 def testWeeklyByMonthAndYearDay(self): 838 self.assertEqual(list(rrule(WEEKLY, 839 count=4, 840 bymonth=(1, 7), 841 byyearday=(1, 100, 200, 365), 842 dtstart=datetime(1997, 9, 2, 9, 0))), 843 [datetime(1998, 1, 1, 9, 0), 844 datetime(1998, 7, 19, 9, 0), 845 datetime(1999, 1, 1, 9, 0), 846 datetime(1999, 7, 19, 9, 0)]) 847 848 def testWeeklyByMonthAndYearDayNeg(self): 849 self.assertEqual(list(rrule(WEEKLY, 850 count=4, 851 bymonth=(1, 7), 852 byyearday=(-365, -266, -166, -1), 853 dtstart=datetime(1997, 9, 2, 9, 0))), 854 [datetime(1998, 1, 1, 9, 0), 855 datetime(1998, 7, 19, 9, 0), 856 datetime(1999, 1, 1, 9, 0), 857 datetime(1999, 7, 19, 9, 0)]) 858 859 def testWeeklyByWeekNo(self): 860 self.assertEqual(list(rrule(WEEKLY, 861 count=3, 862 byweekno=20, 863 dtstart=datetime(1997, 9, 2, 9, 0))), 864 [datetime(1998, 5, 11, 9, 0), 865 datetime(1998, 5, 12, 9, 0), 866 datetime(1998, 5, 13, 9, 0)]) 867 868 def testWeeklyByWeekNoAndWeekDay(self): 869 # That's a nice one. The first days of week number one 870 # may be in the last year. 871 self.assertEqual(list(rrule(WEEKLY, 872 count=3, 873 byweekno=1, 874 byweekday=MO, 875 dtstart=datetime(1997, 9, 2, 9, 0))), 876 [datetime(1997, 12, 29, 9, 0), 877 datetime(1999, 1, 4, 9, 0), 878 datetime(2000, 1, 3, 9, 0)]) 879 880 def testWeeklyByWeekNoAndWeekDayLarge(self): 881 # Another nice test. The last days of week number 52/53 882 # may be in the next year. 883 self.assertEqual(list(rrule(WEEKLY, 884 count=3, 885 byweekno=52, 886 byweekday=SU, 887 dtstart=datetime(1997, 9, 2, 9, 0))), 888 [datetime(1997, 12, 28, 9, 0), 889 datetime(1998, 12, 27, 9, 0), 890 datetime(2000, 1, 2, 9, 0)]) 891 892 def testWeeklyByWeekNoAndWeekDayLast(self): 893 self.assertEqual(list(rrule(WEEKLY, 894 count=3, 895 byweekno=-1, 896 byweekday=SU, 897 dtstart=datetime(1997, 9, 2, 9, 0))), 898 [datetime(1997, 12, 28, 9, 0), 899 datetime(1999, 1, 3, 9, 0), 900 datetime(2000, 1, 2, 9, 0)]) 901 902 def testWeeklyByWeekNoAndWeekDay53(self): 903 self.assertEqual(list(rrule(WEEKLY, 904 count=3, 905 byweekno=53, 906 byweekday=MO, 907 dtstart=datetime(1997, 9, 2, 9, 0))), 908 [datetime(1998, 12, 28, 9, 0), 909 datetime(2004, 12, 27, 9, 0), 910 datetime(2009, 12, 28, 9, 0)]) 911 912 def testWeeklyByEaster(self): 913 self.assertEqual(list(rrule(WEEKLY, 914 count=3, 915 byeaster=0, 916 dtstart=datetime(1997, 9, 2, 9, 0))), 917 [datetime(1998, 4, 12, 9, 0), 918 datetime(1999, 4, 4, 9, 0), 919 datetime(2000, 4, 23, 9, 0)]) 920 921 def testWeeklyByEasterPos(self): 922 self.assertEqual(list(rrule(WEEKLY, 923 count=3, 924 byeaster=1, 925 dtstart=datetime(1997, 9, 2, 9, 0))), 926 [datetime(1998, 4, 13, 9, 0), 927 datetime(1999, 4, 5, 9, 0), 928 datetime(2000, 4, 24, 9, 0)]) 929 930 def testWeeklyByEasterNeg(self): 931 self.assertEqual(list(rrule(WEEKLY, 932 count=3, 933 byeaster=-1, 934 dtstart=datetime(1997, 9, 2, 9, 0))), 935 [datetime(1998, 4, 11, 9, 0), 936 datetime(1999, 4, 3, 9, 0), 937 datetime(2000, 4, 22, 9, 0)]) 938 939 def testWeeklyByHour(self): 940 self.assertEqual(list(rrule(WEEKLY, 941 count=3, 942 byhour=(6, 18), 943 dtstart=datetime(1997, 9, 2, 9, 0))), 944 [datetime(1997, 9, 2, 18, 0), 945 datetime(1997, 9, 9, 6, 0), 946 datetime(1997, 9, 9, 18, 0)]) 947 948 def testWeeklyByMinute(self): 949 self.assertEqual(list(rrule(WEEKLY, 950 count=3, 951 byminute=(6, 18), 952 dtstart=datetime(1997, 9, 2, 9, 0))), 953 [datetime(1997, 9, 2, 9, 6), 954 datetime(1997, 9, 2, 9, 18), 955 datetime(1997, 9, 9, 9, 6)]) 956 957 def testWeeklyBySecond(self): 958 self.assertEqual(list(rrule(WEEKLY, 959 count=3, 960 bysecond=(6, 18), 961 dtstart=datetime(1997, 9, 2, 9, 0))), 962 [datetime(1997, 9, 2, 9, 0, 6), 963 datetime(1997, 9, 2, 9, 0, 18), 964 datetime(1997, 9, 9, 9, 0, 6)]) 965 966 def testWeeklyByHourAndMinute(self): 967 self.assertEqual(list(rrule(WEEKLY, 968 count=3, 969 byhour=(6, 18), 970 byminute=(6, 18), 971 dtstart=datetime(1997, 9, 2, 9, 0))), 972 [datetime(1997, 9, 2, 18, 6), 973 datetime(1997, 9, 2, 18, 18), 974 datetime(1997, 9, 9, 6, 6)]) 975 976 def testWeeklyByHourAndSecond(self): 977 self.assertEqual(list(rrule(WEEKLY, 978 count=3, 979 byhour=(6, 18), 980 bysecond=(6, 18), 981 dtstart=datetime(1997, 9, 2, 9, 0))), 982 [datetime(1997, 9, 2, 18, 0, 6), 983 datetime(1997, 9, 2, 18, 0, 18), 984 datetime(1997, 9, 9, 6, 0, 6)]) 985 986 def testWeeklyByMinuteAndSecond(self): 987 self.assertEqual(list(rrule(WEEKLY, 988 count=3, 989 byminute=(6, 18), 990 bysecond=(6, 18), 991 dtstart=datetime(1997, 9, 2, 9, 0))), 992 [datetime(1997, 9, 2, 9, 6, 6), 993 datetime(1997, 9, 2, 9, 6, 18), 994 datetime(1997, 9, 2, 9, 18, 6)]) 995 996 def testWeeklyByHourAndMinuteAndSecond(self): 997 self.assertEqual(list(rrule(WEEKLY, 998 count=3, 999 byhour=(6, 18), 1000 byminute=(6, 18), 1001 bysecond=(6, 18), 1002 dtstart=datetime(1997, 9, 2, 9, 0))), 1003 [datetime(1997, 9, 2, 18, 6, 6), 1004 datetime(1997, 9, 2, 18, 6, 18), 1005 datetime(1997, 9, 2, 18, 18, 6)]) 1006 1007 def testWeeklyBySetPos(self): 1008 self.assertEqual(list(rrule(WEEKLY, 1009 count=3, 1010 byweekday=(TU, TH), 1011 byhour=(6, 18), 1012 bysetpos=(3, -3), 1013 dtstart=datetime(1997, 9, 2, 9, 0))), 1014 [datetime(1997, 9, 2, 18, 0), 1015 datetime(1997, 9, 4, 6, 0), 1016 datetime(1997, 9, 9, 18, 0)]) 1017 1018 def testDaily(self): 1019 self.assertEqual(list(rrule(DAILY, 1020 count=3, 1021 dtstart=datetime(1997, 9, 2, 9, 0))), 1022 [datetime(1997, 9, 2, 9, 0), 1023 datetime(1997, 9, 3, 9, 0), 1024 datetime(1997, 9, 4, 9, 0)]) 1025 1026 def testDailyInterval(self): 1027 self.assertEqual(list(rrule(DAILY, 1028 count=3, 1029 interval=2, 1030 dtstart=datetime(1997, 9, 2, 9, 0))), 1031 [datetime(1997, 9, 2, 9, 0), 1032 datetime(1997, 9, 4, 9, 0), 1033 datetime(1997, 9, 6, 9, 0)]) 1034 1035 def testDailyIntervalLarge(self): 1036 self.assertEqual(list(rrule(DAILY, 1037 count=3, 1038 interval=92, 1039 dtstart=datetime(1997, 9, 2, 9, 0))), 1040 [datetime(1997, 9, 2, 9, 0), 1041 datetime(1997, 12, 3, 9, 0), 1042 datetime(1998, 3, 5, 9, 0)]) 1043 1044 def testDailyByMonth(self): 1045 self.assertEqual(list(rrule(DAILY, 1046 count=3, 1047 bymonth=(1, 3), 1048 dtstart=datetime(1997, 9, 2, 9, 0))), 1049 [datetime(1998, 1, 1, 9, 0), 1050 datetime(1998, 1, 2, 9, 0), 1051 datetime(1998, 1, 3, 9, 0)]) 1052 1053 def testDailyByMonthDay(self): 1054 self.assertEqual(list(rrule(DAILY, 1055 count=3, 1056 bymonthday=(1, 3), 1057 dtstart=datetime(1997, 9, 2, 9, 0))), 1058 [datetime(1997, 9, 3, 9, 0), 1059 datetime(1997, 10, 1, 9, 0), 1060 datetime(1997, 10, 3, 9, 0)]) 1061 1062 def testDailyByMonthAndMonthDay(self): 1063 self.assertEqual(list(rrule(DAILY, 1064 count=3, 1065 bymonth=(1, 3), 1066 bymonthday=(5, 7), 1067 dtstart=datetime(1997, 9, 2, 9, 0))), 1068 [datetime(1998, 1, 5, 9, 0), 1069 datetime(1998, 1, 7, 9, 0), 1070 datetime(1998, 3, 5, 9, 0)]) 1071 1072 def testDailyByWeekDay(self): 1073 self.assertEqual(list(rrule(DAILY, 1074 count=3, 1075 byweekday=(TU, TH), 1076 dtstart=datetime(1997, 9, 2, 9, 0))), 1077 [datetime(1997, 9, 2, 9, 0), 1078 datetime(1997, 9, 4, 9, 0), 1079 datetime(1997, 9, 9, 9, 0)]) 1080 1081 def testDailyByNWeekDay(self): 1082 self.assertEqual(list(rrule(DAILY, 1083 count=3, 1084 byweekday=(TU(1), TH(-1)), 1085 dtstart=datetime(1997, 9, 2, 9, 0))), 1086 [datetime(1997, 9, 2, 9, 0), 1087 datetime(1997, 9, 4, 9, 0), 1088 datetime(1997, 9, 9, 9, 0)]) 1089 1090 def testDailyByMonthAndWeekDay(self): 1091 self.assertEqual(list(rrule(DAILY, 1092 count=3, 1093 bymonth=(1, 3), 1094 byweekday=(TU, TH), 1095 dtstart=datetime(1997, 9, 2, 9, 0))), 1096 [datetime(1998, 1, 1, 9, 0), 1097 datetime(1998, 1, 6, 9, 0), 1098 datetime(1998, 1, 8, 9, 0)]) 1099 1100 def testDailyByMonthAndNWeekDay(self): 1101 self.assertEqual(list(rrule(DAILY, 1102 count=3, 1103 bymonth=(1, 3), 1104 byweekday=(TU(1), TH(-1)), 1105 dtstart=datetime(1997, 9, 2, 9, 0))), 1106 [datetime(1998, 1, 1, 9, 0), 1107 datetime(1998, 1, 6, 9, 0), 1108 datetime(1998, 1, 8, 9, 0)]) 1109 1110 def testDailyByMonthDayAndWeekDay(self): 1111 self.assertEqual(list(rrule(DAILY, 1112 count=3, 1113 bymonthday=(1, 3), 1114 byweekday=(TU, TH), 1115 dtstart=datetime(1997, 9, 2, 9, 0))), 1116 [datetime(1998, 1, 1, 9, 0), 1117 datetime(1998, 2, 3, 9, 0), 1118 datetime(1998, 3, 3, 9, 0)]) 1119 1120 def testDailyByMonthAndMonthDayAndWeekDay(self): 1121 self.assertEqual(list(rrule(DAILY, 1122 count=3, 1123 bymonth=(1, 3), 1124 bymonthday=(1, 3), 1125 byweekday=(TU, TH), 1126 dtstart=datetime(1997, 9, 2, 9, 0))), 1127 [datetime(1998, 1, 1, 9, 0), 1128 datetime(1998, 3, 3, 9, 0), 1129 datetime(2001, 3, 1, 9, 0)]) 1130 1131 def testDailyByYearDay(self): 1132 self.assertEqual(list(rrule(DAILY, 1133 count=4, 1134 byyearday=(1, 100, 200, 365), 1135 dtstart=datetime(1997, 9, 2, 9, 0))), 1136 [datetime(1997, 12, 31, 9, 0), 1137 datetime(1998, 1, 1, 9, 0), 1138 datetime(1998, 4, 10, 9, 0), 1139 datetime(1998, 7, 19, 9, 0)]) 1140 1141 def testDailyByYearDayNeg(self): 1142 self.assertEqual(list(rrule(DAILY, 1143 count=4, 1144 byyearday=(-365, -266, -166, -1), 1145 dtstart=datetime(1997, 9, 2, 9, 0))), 1146 [datetime(1997, 12, 31, 9, 0), 1147 datetime(1998, 1, 1, 9, 0), 1148 datetime(1998, 4, 10, 9, 0), 1149 datetime(1998, 7, 19, 9, 0)]) 1150 1151 def testDailyByMonthAndYearDay(self): 1152 self.assertEqual(list(rrule(DAILY, 1153 count=4, 1154 bymonth=(1, 7), 1155 byyearday=(1, 100, 200, 365), 1156 dtstart=datetime(1997, 9, 2, 9, 0))), 1157 [datetime(1998, 1, 1, 9, 0), 1158 datetime(1998, 7, 19, 9, 0), 1159 datetime(1999, 1, 1, 9, 0), 1160 datetime(1999, 7, 19, 9, 0)]) 1161 1162 def testDailyByMonthAndYearDayNeg(self): 1163 self.assertEqual(list(rrule(DAILY, 1164 count=4, 1165 bymonth=(1, 7), 1166 byyearday=(-365, -266, -166, -1), 1167 dtstart=datetime(1997, 9, 2, 9, 0))), 1168 [datetime(1998, 1, 1, 9, 0), 1169 datetime(1998, 7, 19, 9, 0), 1170 datetime(1999, 1, 1, 9, 0), 1171 datetime(1999, 7, 19, 9, 0)]) 1172 1173 def testDailyByWeekNo(self): 1174 self.assertEqual(list(rrule(DAILY, 1175 count=3, 1176 byweekno=20, 1177 dtstart=datetime(1997, 9, 2, 9, 0))), 1178 [datetime(1998, 5, 11, 9, 0), 1179 datetime(1998, 5, 12, 9, 0), 1180 datetime(1998, 5, 13, 9, 0)]) 1181 1182 def testDailyByWeekNoAndWeekDay(self): 1183 # That's a nice one. The first days of week number one 1184 # may be in the last year. 1185 self.assertEqual(list(rrule(DAILY, 1186 count=3, 1187 byweekno=1, 1188 byweekday=MO, 1189 dtstart=datetime(1997, 9, 2, 9, 0))), 1190 [datetime(1997, 12, 29, 9, 0), 1191 datetime(1999, 1, 4, 9, 0), 1192 datetime(2000, 1, 3, 9, 0)]) 1193 1194 def testDailyByWeekNoAndWeekDayLarge(self): 1195 # Another nice test. The last days of week number 52/53 1196 # may be in the next year. 1197 self.assertEqual(list(rrule(DAILY, 1198 count=3, 1199 byweekno=52, 1200 byweekday=SU, 1201 dtstart=datetime(1997, 9, 2, 9, 0))), 1202 [datetime(1997, 12, 28, 9, 0), 1203 datetime(1998, 12, 27, 9, 0), 1204 datetime(2000, 1, 2, 9, 0)]) 1205 1206 def testDailyByWeekNoAndWeekDayLast(self): 1207 self.assertEqual(list(rrule(DAILY, 1208 count=3, 1209 byweekno=-1, 1210 byweekday=SU, 1211 dtstart=datetime(1997, 9, 2, 9, 0))), 1212 [datetime(1997, 12, 28, 9, 0), 1213 datetime(1999, 1, 3, 9, 0), 1214 datetime(2000, 1, 2, 9, 0)]) 1215 1216 def testDailyByWeekNoAndWeekDay53(self): 1217 self.assertEqual(list(rrule(DAILY, 1218 count=3, 1219 byweekno=53, 1220 byweekday=MO, 1221 dtstart=datetime(1997, 9, 2, 9, 0))), 1222 [datetime(1998, 12, 28, 9, 0), 1223 datetime(2004, 12, 27, 9, 0), 1224 datetime(2009, 12, 28, 9, 0)]) 1225 1226 def testDailyByEaster(self): 1227 self.assertEqual(list(rrule(DAILY, 1228 count=3, 1229 byeaster=0, 1230 dtstart=datetime(1997, 9, 2, 9, 0))), 1231 [datetime(1998, 4, 12, 9, 0), 1232 datetime(1999, 4, 4, 9, 0), 1233 datetime(2000, 4, 23, 9, 0)]) 1234 1235 def testDailyByEasterPos(self): 1236 self.assertEqual(list(rrule(DAILY, 1237 count=3, 1238 byeaster=1, 1239 dtstart=datetime(1997, 9, 2, 9, 0))), 1240 [datetime(1998, 4, 13, 9, 0), 1241 datetime(1999, 4, 5, 9, 0), 1242 datetime(2000, 4, 24, 9, 0)]) 1243 1244 def testDailyByEasterNeg(self): 1245 self.assertEqual(list(rrule(DAILY, 1246 count=3, 1247 byeaster=-1, 1248 dtstart=datetime(1997, 9, 2, 9, 0))), 1249 [datetime(1998, 4, 11, 9, 0), 1250 datetime(1999, 4, 3, 9, 0), 1251 datetime(2000, 4, 22, 9, 0)]) 1252 1253 def testDailyByHour(self): 1254 self.assertEqual(list(rrule(DAILY, 1255 count=3, 1256 byhour=(6, 18), 1257 dtstart=datetime(1997, 9, 2, 9, 0))), 1258 [datetime(1997, 9, 2, 18, 0), 1259 datetime(1997, 9, 3, 6, 0), 1260 datetime(1997, 9, 3, 18, 0)]) 1261 1262 def testDailyByMinute(self): 1263 self.assertEqual(list(rrule(DAILY, 1264 count=3, 1265 byminute=(6, 18), 1266 dtstart=datetime(1997, 9, 2, 9, 0))), 1267 [datetime(1997, 9, 2, 9, 6), 1268 datetime(1997, 9, 2, 9, 18), 1269 datetime(1997, 9, 3, 9, 6)]) 1270 1271 def testDailyBySecond(self): 1272 self.assertEqual(list(rrule(DAILY, 1273 count=3, 1274 bysecond=(6, 18), 1275 dtstart=datetime(1997, 9, 2, 9, 0))), 1276 [datetime(1997, 9, 2, 9, 0, 6), 1277 datetime(1997, 9, 2, 9, 0, 18), 1278 datetime(1997, 9, 3, 9, 0, 6)]) 1279 1280 def testDailyByHourAndMinute(self): 1281 self.assertEqual(list(rrule(DAILY, 1282 count=3, 1283 byhour=(6, 18), 1284 byminute=(6, 18), 1285 dtstart=datetime(1997, 9, 2, 9, 0))), 1286 [datetime(1997, 9, 2, 18, 6), 1287 datetime(1997, 9, 2, 18, 18), 1288 datetime(1997, 9, 3, 6, 6)]) 1289 1290 def testDailyByHourAndSecond(self): 1291 self.assertEqual(list(rrule(DAILY, 1292 count=3, 1293 byhour=(6, 18), 1294 bysecond=(6, 18), 1295 dtstart=datetime(1997, 9, 2, 9, 0))), 1296 [datetime(1997, 9, 2, 18, 0, 6), 1297 datetime(1997, 9, 2, 18, 0, 18), 1298 datetime(1997, 9, 3, 6, 0, 6)]) 1299 1300 def testDailyByMinuteAndSecond(self): 1301 self.assertEqual(list(rrule(DAILY, 1302 count=3, 1303 byminute=(6, 18), 1304 bysecond=(6, 18), 1305 dtstart=datetime(1997, 9, 2, 9, 0))), 1306 [datetime(1997, 9, 2, 9, 6, 6), 1307 datetime(1997, 9, 2, 9, 6, 18), 1308 datetime(1997, 9, 2, 9, 18, 6)]) 1309 1310 def testDailyByHourAndMinuteAndSecond(self): 1311 self.assertEqual(list(rrule(DAILY, 1312 count=3, 1313 byhour=(6, 18), 1314 byminute=(6, 18), 1315 bysecond=(6, 18), 1316 dtstart=datetime(1997, 9, 2, 9, 0))), 1317 [datetime(1997, 9, 2, 18, 6, 6), 1318 datetime(1997, 9, 2, 18, 6, 18), 1319 datetime(1997, 9, 2, 18, 18, 6)]) 1320 1321 def testDailyBySetPos(self): 1322 self.assertEqual(list(rrule(DAILY, 1323 count=3, 1324 byhour=(6, 18), 1325 byminute=(15, 45), 1326 bysetpos=(3, -3), 1327 dtstart=datetime(1997, 9, 2, 9, 0))), 1328 [datetime(1997, 9, 2, 18, 15), 1329 datetime(1997, 9, 3, 6, 45), 1330 datetime(1997, 9, 3, 18, 15)]) 1331 1332 def testHourly(self): 1333 self.assertEqual(list(rrule(HOURLY, 1334 count=3, 1335 dtstart=datetime(1997, 9, 2, 9, 0))), 1336 [datetime(1997, 9, 2, 9, 0), 1337 datetime(1997, 9, 2, 10, 0), 1338 datetime(1997, 9, 2, 11, 0)]) 1339 1340 def testHourlyInterval(self): 1341 self.assertEqual(list(rrule(HOURLY, 1342 count=3, 1343 interval=2, 1344 dtstart=datetime(1997, 9, 2, 9, 0))), 1345 [datetime(1997, 9, 2, 9, 0), 1346 datetime(1997, 9, 2, 11, 0), 1347 datetime(1997, 9, 2, 13, 0)]) 1348 1349 def testHourlyIntervalLarge(self): 1350 self.assertEqual(list(rrule(HOURLY, 1351 count=3, 1352 interval=769, 1353 dtstart=datetime(1997, 9, 2, 9, 0))), 1354 [datetime(1997, 9, 2, 9, 0), 1355 datetime(1997, 10, 4, 10, 0), 1356 datetime(1997, 11, 5, 11, 0)]) 1357 1358 def testHourlyByMonth(self): 1359 self.assertEqual(list(rrule(HOURLY, 1360 count=3, 1361 bymonth=(1, 3), 1362 dtstart=datetime(1997, 9, 2, 9, 0))), 1363 [datetime(1998, 1, 1, 0, 0), 1364 datetime(1998, 1, 1, 1, 0), 1365 datetime(1998, 1, 1, 2, 0)]) 1366 1367 def testHourlyByMonthDay(self): 1368 self.assertEqual(list(rrule(HOURLY, 1369 count=3, 1370 bymonthday=(1, 3), 1371 dtstart=datetime(1997, 9, 2, 9, 0))), 1372 [datetime(1997, 9, 3, 0, 0), 1373 datetime(1997, 9, 3, 1, 0), 1374 datetime(1997, 9, 3, 2, 0)]) 1375 1376 def testHourlyByMonthAndMonthDay(self): 1377 self.assertEqual(list(rrule(HOURLY, 1378 count=3, 1379 bymonth=(1, 3), 1380 bymonthday=(5, 7), 1381 dtstart=datetime(1997, 9, 2, 9, 0))), 1382 [datetime(1998, 1, 5, 0, 0), 1383 datetime(1998, 1, 5, 1, 0), 1384 datetime(1998, 1, 5, 2, 0)]) 1385 1386 def testHourlyByWeekDay(self): 1387 self.assertEqual(list(rrule(HOURLY, 1388 count=3, 1389 byweekday=(TU, TH), 1390 dtstart=datetime(1997, 9, 2, 9, 0))), 1391 [datetime(1997, 9, 2, 9, 0), 1392 datetime(1997, 9, 2, 10, 0), 1393 datetime(1997, 9, 2, 11, 0)]) 1394 1395 def testHourlyByNWeekDay(self): 1396 self.assertEqual(list(rrule(HOURLY, 1397 count=3, 1398 byweekday=(TU(1), TH(-1)), 1399 dtstart=datetime(1997, 9, 2, 9, 0))), 1400 [datetime(1997, 9, 2, 9, 0), 1401 datetime(1997, 9, 2, 10, 0), 1402 datetime(1997, 9, 2, 11, 0)]) 1403 1404 def testHourlyByMonthAndWeekDay(self): 1405 self.assertEqual(list(rrule(HOURLY, 1406 count=3, 1407 bymonth=(1, 3), 1408 byweekday=(TU, TH), 1409 dtstart=datetime(1997, 9, 2, 9, 0))), 1410 [datetime(1998, 1, 1, 0, 0), 1411 datetime(1998, 1, 1, 1, 0), 1412 datetime(1998, 1, 1, 2, 0)]) 1413 1414 def testHourlyByMonthAndNWeekDay(self): 1415 self.assertEqual(list(rrule(HOURLY, 1416 count=3, 1417 bymonth=(1, 3), 1418 byweekday=(TU(1), TH(-1)), 1419 dtstart=datetime(1997, 9, 2, 9, 0))), 1420 [datetime(1998, 1, 1, 0, 0), 1421 datetime(1998, 1, 1, 1, 0), 1422 datetime(1998, 1, 1, 2, 0)]) 1423 1424 def testHourlyByMonthDayAndWeekDay(self): 1425 self.assertEqual(list(rrule(HOURLY, 1426 count=3, 1427 bymonthday=(1, 3), 1428 byweekday=(TU, TH), 1429 dtstart=datetime(1997, 9, 2, 9, 0))), 1430 [datetime(1998, 1, 1, 0, 0), 1431 datetime(1998, 1, 1, 1, 0), 1432 datetime(1998, 1, 1, 2, 0)]) 1433 1434 def testHourlyByMonthAndMonthDayAndWeekDay(self): 1435 self.assertEqual(list(rrule(HOURLY, 1436 count=3, 1437 bymonth=(1, 3), 1438 bymonthday=(1, 3), 1439 byweekday=(TU, TH), 1440 dtstart=datetime(1997, 9, 2, 9, 0))), 1441 [datetime(1998, 1, 1, 0, 0), 1442 datetime(1998, 1, 1, 1, 0), 1443 datetime(1998, 1, 1, 2, 0)]) 1444 1445 def testHourlyByYearDay(self): 1446 self.assertEqual(list(rrule(HOURLY, 1447 count=4, 1448 byyearday=(1, 100, 200, 365), 1449 dtstart=datetime(1997, 9, 2, 9, 0))), 1450 [datetime(1997, 12, 31, 0, 0), 1451 datetime(1997, 12, 31, 1, 0), 1452 datetime(1997, 12, 31, 2, 0), 1453 datetime(1997, 12, 31, 3, 0)]) 1454 1455 def testHourlyByYearDayNeg(self): 1456 self.assertEqual(list(rrule(HOURLY, 1457 count=4, 1458 byyearday=(-365, -266, -166, -1), 1459 dtstart=datetime(1997, 9, 2, 9, 0))), 1460 [datetime(1997, 12, 31, 0, 0), 1461 datetime(1997, 12, 31, 1, 0), 1462 datetime(1997, 12, 31, 2, 0), 1463 datetime(1997, 12, 31, 3, 0)]) 1464 1465 def testHourlyByMonthAndYearDay(self): 1466 self.assertEqual(list(rrule(HOURLY, 1467 count=4, 1468 bymonth=(4, 7), 1469 byyearday=(1, 100, 200, 365), 1470 dtstart=datetime(1997, 9, 2, 9, 0))), 1471 [datetime(1998, 4, 10, 0, 0), 1472 datetime(1998, 4, 10, 1, 0), 1473 datetime(1998, 4, 10, 2, 0), 1474 datetime(1998, 4, 10, 3, 0)]) 1475 1476 def testHourlyByMonthAndYearDayNeg(self): 1477 self.assertEqual(list(rrule(HOURLY, 1478 count=4, 1479 bymonth=(4, 7), 1480 byyearday=(-365, -266, -166, -1), 1481 dtstart=datetime(1997, 9, 2, 9, 0))), 1482 [datetime(1998, 4, 10, 0, 0), 1483 datetime(1998, 4, 10, 1, 0), 1484 datetime(1998, 4, 10, 2, 0), 1485 datetime(1998, 4, 10, 3, 0)]) 1486 1487 def testHourlyByWeekNo(self): 1488 self.assertEqual(list(rrule(HOURLY, 1489 count=3, 1490 byweekno=20, 1491 dtstart=datetime(1997, 9, 2, 9, 0))), 1492 [datetime(1998, 5, 11, 0, 0), 1493 datetime(1998, 5, 11, 1, 0), 1494 datetime(1998, 5, 11, 2, 0)]) 1495 1496 def testHourlyByWeekNoAndWeekDay(self): 1497 self.assertEqual(list(rrule(HOURLY, 1498 count=3, 1499 byweekno=1, 1500 byweekday=MO, 1501 dtstart=datetime(1997, 9, 2, 9, 0))), 1502 [datetime(1997, 12, 29, 0, 0), 1503 datetime(1997, 12, 29, 1, 0), 1504 datetime(1997, 12, 29, 2, 0)]) 1505 1506 def testHourlyByWeekNoAndWeekDayLarge(self): 1507 self.assertEqual(list(rrule(HOURLY, 1508 count=3, 1509 byweekno=52, 1510 byweekday=SU, 1511 dtstart=datetime(1997, 9, 2, 9, 0))), 1512 [datetime(1997, 12, 28, 0, 0), 1513 datetime(1997, 12, 28, 1, 0), 1514 datetime(1997, 12, 28, 2, 0)]) 1515 1516 def testHourlyByWeekNoAndWeekDayLast(self): 1517 self.assertEqual(list(rrule(HOURLY, 1518 count=3, 1519 byweekno=-1, 1520 byweekday=SU, 1521 dtstart=datetime(1997, 9, 2, 9, 0))), 1522 [datetime(1997, 12, 28, 0, 0), 1523 datetime(1997, 12, 28, 1, 0), 1524 datetime(1997, 12, 28, 2, 0)]) 1525 1526 def testHourlyByWeekNoAndWeekDay53(self): 1527 self.assertEqual(list(rrule(HOURLY, 1528 count=3, 1529 byweekno=53, 1530 byweekday=MO, 1531 dtstart=datetime(1997, 9, 2, 9, 0))), 1532 [datetime(1998, 12, 28, 0, 0), 1533 datetime(1998, 12, 28, 1, 0), 1534 datetime(1998, 12, 28, 2, 0)]) 1535 1536 def testHourlyByEaster(self): 1537 self.assertEqual(list(rrule(HOURLY, 1538 count=3, 1539 byeaster=0, 1540 dtstart=datetime(1997, 9, 2, 9, 0))), 1541 [datetime(1998, 4, 12, 0, 0), 1542 datetime(1998, 4, 12, 1, 0), 1543 datetime(1998, 4, 12, 2, 0)]) 1544 1545 def testHourlyByEasterPos(self): 1546 self.assertEqual(list(rrule(HOURLY, 1547 count=3, 1548 byeaster=1, 1549 dtstart=datetime(1997, 9, 2, 9, 0))), 1550 [datetime(1998, 4, 13, 0, 0), 1551 datetime(1998, 4, 13, 1, 0), 1552 datetime(1998, 4, 13, 2, 0)]) 1553 1554 def testHourlyByEasterNeg(self): 1555 self.assertEqual(list(rrule(HOURLY, 1556 count=3, 1557 byeaster=-1, 1558 dtstart=datetime(1997, 9, 2, 9, 0))), 1559 [datetime(1998, 4, 11, 0, 0), 1560 datetime(1998, 4, 11, 1, 0), 1561 datetime(1998, 4, 11, 2, 0)]) 1562 1563 def testHourlyByHour(self): 1564 self.assertEqual(list(rrule(HOURLY, 1565 count=3, 1566 byhour=(6, 18), 1567 dtstart=datetime(1997, 9, 2, 9, 0))), 1568 [datetime(1997, 9, 2, 18, 0), 1569 datetime(1997, 9, 3, 6, 0), 1570 datetime(1997, 9, 3, 18, 0)]) 1571 1572 def testHourlyByMinute(self): 1573 self.assertEqual(list(rrule(HOURLY, 1574 count=3, 1575 byminute=(6, 18), 1576 dtstart=datetime(1997, 9, 2, 9, 0))), 1577 [datetime(1997, 9, 2, 9, 6), 1578 datetime(1997, 9, 2, 9, 18), 1579 datetime(1997, 9, 2, 10, 6)]) 1580 1581 def testHourlyBySecond(self): 1582 self.assertEqual(list(rrule(HOURLY, 1583 count=3, 1584 bysecond=(6, 18), 1585 dtstart=datetime(1997, 9, 2, 9, 0))), 1586 [datetime(1997, 9, 2, 9, 0, 6), 1587 datetime(1997, 9, 2, 9, 0, 18), 1588 datetime(1997, 9, 2, 10, 0, 6)]) 1589 1590 def testHourlyByHourAndMinute(self): 1591 self.assertEqual(list(rrule(HOURLY, 1592 count=3, 1593 byhour=(6, 18), 1594 byminute=(6, 18), 1595 dtstart=datetime(1997, 9, 2, 9, 0))), 1596 [datetime(1997, 9, 2, 18, 6), 1597 datetime(1997, 9, 2, 18, 18), 1598 datetime(1997, 9, 3, 6, 6)]) 1599 1600 def testHourlyByHourAndSecond(self): 1601 self.assertEqual(list(rrule(HOURLY, 1602 count=3, 1603 byhour=(6, 18), 1604 bysecond=(6, 18), 1605 dtstart=datetime(1997, 9, 2, 9, 0))), 1606 [datetime(1997, 9, 2, 18, 0, 6), 1607 datetime(1997, 9, 2, 18, 0, 18), 1608 datetime(1997, 9, 3, 6, 0, 6)]) 1609 1610 def testHourlyByMinuteAndSecond(self): 1611 self.assertEqual(list(rrule(HOURLY, 1612 count=3, 1613 byminute=(6, 18), 1614 bysecond=(6, 18), 1615 dtstart=datetime(1997, 9, 2, 9, 0))), 1616 [datetime(1997, 9, 2, 9, 6, 6), 1617 datetime(1997, 9, 2, 9, 6, 18), 1618 datetime(1997, 9, 2, 9, 18, 6)]) 1619 1620 def testHourlyByHourAndMinuteAndSecond(self): 1621 self.assertEqual(list(rrule(HOURLY, 1622 count=3, 1623 byhour=(6, 18), 1624 byminute=(6, 18), 1625 bysecond=(6, 18), 1626 dtstart=datetime(1997, 9, 2, 9, 0))), 1627 [datetime(1997, 9, 2, 18, 6, 6), 1628 datetime(1997, 9, 2, 18, 6, 18), 1629 datetime(1997, 9, 2, 18, 18, 6)]) 1630 1631 def testHourlyBySetPos(self): 1632 self.assertEqual(list(rrule(HOURLY, 1633 count=3, 1634 byminute=(15, 45), 1635 bysecond=(15, 45), 1636 bysetpos=(3, -3), 1637 dtstart=datetime(1997, 9, 2, 9, 0))), 1638 [datetime(1997, 9, 2, 9, 15, 45), 1639 datetime(1997, 9, 2, 9, 45, 15), 1640 datetime(1997, 9, 2, 10, 15, 45)]) 1641 1642 def testMinutely(self): 1643 self.assertEqual(list(rrule(MINUTELY, 1644 count=3, 1645 dtstart=datetime(1997, 9, 2, 9, 0))), 1646 [datetime(1997, 9, 2, 9, 0), 1647 datetime(1997, 9, 2, 9, 1), 1648 datetime(1997, 9, 2, 9, 2)]) 1649 1650 def testMinutelyInterval(self): 1651 self.assertEqual(list(rrule(MINUTELY, 1652 count=3, 1653 interval=2, 1654 dtstart=datetime(1997, 9, 2, 9, 0))), 1655 [datetime(1997, 9, 2, 9, 0), 1656 datetime(1997, 9, 2, 9, 2), 1657 datetime(1997, 9, 2, 9, 4)]) 1658 1659 def testMinutelyIntervalLarge(self): 1660 self.assertEqual(list(rrule(MINUTELY, 1661 count=3, 1662 interval=1501, 1663 dtstart=datetime(1997, 9, 2, 9, 0))), 1664 [datetime(1997, 9, 2, 9, 0), 1665 datetime(1997, 9, 3, 10, 1), 1666 datetime(1997, 9, 4, 11, 2)]) 1667 1668 def testMinutelyByMonth(self): 1669 self.assertEqual(list(rrule(MINUTELY, 1670 count=3, 1671 bymonth=(1, 3), 1672 dtstart=datetime(1997, 9, 2, 9, 0))), 1673 [datetime(1998, 1, 1, 0, 0), 1674 datetime(1998, 1, 1, 0, 1), 1675 datetime(1998, 1, 1, 0, 2)]) 1676 1677 def testMinutelyByMonthDay(self): 1678 self.assertEqual(list(rrule(MINUTELY, 1679 count=3, 1680 bymonthday=(1, 3), 1681 dtstart=datetime(1997, 9, 2, 9, 0))), 1682 [datetime(1997, 9, 3, 0, 0), 1683 datetime(1997, 9, 3, 0, 1), 1684 datetime(1997, 9, 3, 0, 2)]) 1685 1686 def testMinutelyByMonthAndMonthDay(self): 1687 self.assertEqual(list(rrule(MINUTELY, 1688 count=3, 1689 bymonth=(1, 3), 1690 bymonthday=(5, 7), 1691 dtstart=datetime(1997, 9, 2, 9, 0))), 1692 [datetime(1998, 1, 5, 0, 0), 1693 datetime(1998, 1, 5, 0, 1), 1694 datetime(1998, 1, 5, 0, 2)]) 1695 1696 def testMinutelyByWeekDay(self): 1697 self.assertEqual(list(rrule(MINUTELY, 1698 count=3, 1699 byweekday=(TU, TH), 1700 dtstart=datetime(1997, 9, 2, 9, 0))), 1701 [datetime(1997, 9, 2, 9, 0), 1702 datetime(1997, 9, 2, 9, 1), 1703 datetime(1997, 9, 2, 9, 2)]) 1704 1705 def testMinutelyByNWeekDay(self): 1706 self.assertEqual(list(rrule(MINUTELY, 1707 count=3, 1708 byweekday=(TU(1), TH(-1)), 1709 dtstart=datetime(1997, 9, 2, 9, 0))), 1710 [datetime(1997, 9, 2, 9, 0), 1711 datetime(1997, 9, 2, 9, 1), 1712 datetime(1997, 9, 2, 9, 2)]) 1713 1714 def testMinutelyByMonthAndWeekDay(self): 1715 self.assertEqual(list(rrule(MINUTELY, 1716 count=3, 1717 bymonth=(1, 3), 1718 byweekday=(TU, TH), 1719 dtstart=datetime(1997, 9, 2, 9, 0))), 1720 [datetime(1998, 1, 1, 0, 0), 1721 datetime(1998, 1, 1, 0, 1), 1722 datetime(1998, 1, 1, 0, 2)]) 1723 1724 def testMinutelyByMonthAndNWeekDay(self): 1725 self.assertEqual(list(rrule(MINUTELY, 1726 count=3, 1727 bymonth=(1, 3), 1728 byweekday=(TU(1), TH(-1)), 1729 dtstart=datetime(1997, 9, 2, 9, 0))), 1730 [datetime(1998, 1, 1, 0, 0), 1731 datetime(1998, 1, 1, 0, 1), 1732 datetime(1998, 1, 1, 0, 2)]) 1733 1734 def testMinutelyByMonthDayAndWeekDay(self): 1735 self.assertEqual(list(rrule(MINUTELY, 1736 count=3, 1737 bymonthday=(1, 3), 1738 byweekday=(TU, TH), 1739 dtstart=datetime(1997, 9, 2, 9, 0))), 1740 [datetime(1998, 1, 1, 0, 0), 1741 datetime(1998, 1, 1, 0, 1), 1742 datetime(1998, 1, 1, 0, 2)]) 1743 1744 def testMinutelyByMonthAndMonthDayAndWeekDay(self): 1745 self.assertEqual(list(rrule(MINUTELY, 1746 count=3, 1747 bymonth=(1, 3), 1748 bymonthday=(1, 3), 1749 byweekday=(TU, TH), 1750 dtstart=datetime(1997, 9, 2, 9, 0))), 1751 [datetime(1998, 1, 1, 0, 0), 1752 datetime(1998, 1, 1, 0, 1), 1753 datetime(1998, 1, 1, 0, 2)]) 1754 1755 def testMinutelyByYearDay(self): 1756 self.assertEqual(list(rrule(MINUTELY, 1757 count=4, 1758 byyearday=(1, 100, 200, 365), 1759 dtstart=datetime(1997, 9, 2, 9, 0))), 1760 [datetime(1997, 12, 31, 0, 0), 1761 datetime(1997, 12, 31, 0, 1), 1762 datetime(1997, 12, 31, 0, 2), 1763 datetime(1997, 12, 31, 0, 3)]) 1764 1765 def testMinutelyByYearDayNeg(self): 1766 self.assertEqual(list(rrule(MINUTELY, 1767 count=4, 1768 byyearday=(-365, -266, -166, -1), 1769 dtstart=datetime(1997, 9, 2, 9, 0))), 1770 [datetime(1997, 12, 31, 0, 0), 1771 datetime(1997, 12, 31, 0, 1), 1772 datetime(1997, 12, 31, 0, 2), 1773 datetime(1997, 12, 31, 0, 3)]) 1774 1775 def testMinutelyByMonthAndYearDay(self): 1776 self.assertEqual(list(rrule(MINUTELY, 1777 count=4, 1778 bymonth=(4, 7), 1779 byyearday=(1, 100, 200, 365), 1780 dtstart=datetime(1997, 9, 2, 9, 0))), 1781 [datetime(1998, 4, 10, 0, 0), 1782 datetime(1998, 4, 10, 0, 1), 1783 datetime(1998, 4, 10, 0, 2), 1784 datetime(1998, 4, 10, 0, 3)]) 1785 1786 def testMinutelyByMonthAndYearDayNeg(self): 1787 self.assertEqual(list(rrule(MINUTELY, 1788 count=4, 1789 bymonth=(4, 7), 1790 byyearday=(-365, -266, -166, -1), 1791 dtstart=datetime(1997, 9, 2, 9, 0))), 1792 [datetime(1998, 4, 10, 0, 0), 1793 datetime(1998, 4, 10, 0, 1), 1794 datetime(1998, 4, 10, 0, 2), 1795 datetime(1998, 4, 10, 0, 3)]) 1796 1797 def testMinutelyByWeekNo(self): 1798 self.assertEqual(list(rrule(MINUTELY, 1799 count=3, 1800 byweekno=20, 1801 dtstart=datetime(1997, 9, 2, 9, 0))), 1802 [datetime(1998, 5, 11, 0, 0), 1803 datetime(1998, 5, 11, 0, 1), 1804 datetime(1998, 5, 11, 0, 2)]) 1805 1806 def testMinutelyByWeekNoAndWeekDay(self): 1807 self.assertEqual(list(rrule(MINUTELY, 1808 count=3, 1809 byweekno=1, 1810 byweekday=MO, 1811 dtstart=datetime(1997, 9, 2, 9, 0))), 1812 [datetime(1997, 12, 29, 0, 0), 1813 datetime(1997, 12, 29, 0, 1), 1814 datetime(1997, 12, 29, 0, 2)]) 1815 1816 def testMinutelyByWeekNoAndWeekDayLarge(self): 1817 self.assertEqual(list(rrule(MINUTELY, 1818 count=3, 1819 byweekno=52, 1820 byweekday=SU, 1821 dtstart=datetime(1997, 9, 2, 9, 0))), 1822 [datetime(1997, 12, 28, 0, 0), 1823 datetime(1997, 12, 28, 0, 1), 1824 datetime(1997, 12, 28, 0, 2)]) 1825 1826 def testMinutelyByWeekNoAndWeekDayLast(self): 1827 self.assertEqual(list(rrule(MINUTELY, 1828 count=3, 1829 byweekno=-1, 1830 byweekday=SU, 1831 dtstart=datetime(1997, 9, 2, 9, 0))), 1832 [datetime(1997, 12, 28, 0, 0), 1833 datetime(1997, 12, 28, 0, 1), 1834 datetime(1997, 12, 28, 0, 2)]) 1835 1836 def testMinutelyByWeekNoAndWeekDay53(self): 1837 self.assertEqual(list(rrule(MINUTELY, 1838 count=3, 1839 byweekno=53, 1840 byweekday=MO, 1841 dtstart=datetime(1997, 9, 2, 9, 0))), 1842 [datetime(1998, 12, 28, 0, 0), 1843 datetime(1998, 12, 28, 0, 1), 1844 datetime(1998, 12, 28, 0, 2)]) 1845 1846 def testMinutelyByEaster(self): 1847 self.assertEqual(list(rrule(MINUTELY, 1848 count=3, 1849 byeaster=0, 1850 dtstart=datetime(1997, 9, 2, 9, 0))), 1851 [datetime(1998, 4, 12, 0, 0), 1852 datetime(1998, 4, 12, 0, 1), 1853 datetime(1998, 4, 12, 0, 2)]) 1854 1855 def testMinutelyByEasterPos(self): 1856 self.assertEqual(list(rrule(MINUTELY, 1857 count=3, 1858 byeaster=1, 1859 dtstart=datetime(1997, 9, 2, 9, 0))), 1860 [datetime(1998, 4, 13, 0, 0), 1861 datetime(1998, 4, 13, 0, 1), 1862 datetime(1998, 4, 13, 0, 2)]) 1863 1864 def testMinutelyByEasterNeg(self): 1865 self.assertEqual(list(rrule(MINUTELY, 1866 count=3, 1867 byeaster=-1, 1868 dtstart=datetime(1997, 9, 2, 9, 0))), 1869 [datetime(1998, 4, 11, 0, 0), 1870 datetime(1998, 4, 11, 0, 1), 1871 datetime(1998, 4, 11, 0, 2)]) 1872 1873 def testMinutelyByHour(self): 1874 self.assertEqual(list(rrule(MINUTELY, 1875 count=3, 1876 byhour=(6, 18), 1877 dtstart=datetime(1997, 9, 2, 9, 0))), 1878 [datetime(1997, 9, 2, 18, 0), 1879 datetime(1997, 9, 2, 18, 1), 1880 datetime(1997, 9, 2, 18, 2)]) 1881 1882 def testMinutelyByMinute(self): 1883 self.assertEqual(list(rrule(MINUTELY, 1884 count=3, 1885 byminute=(6, 18), 1886 dtstart=datetime(1997, 9, 2, 9, 0))), 1887 [datetime(1997, 9, 2, 9, 6), 1888 datetime(1997, 9, 2, 9, 18), 1889 datetime(1997, 9, 2, 10, 6)]) 1890 1891 def testMinutelyBySecond(self): 1892 self.assertEqual(list(rrule(MINUTELY, 1893 count=3, 1894 bysecond=(6, 18), 1895 dtstart=datetime(1997, 9, 2, 9, 0))), 1896 [datetime(1997, 9, 2, 9, 0, 6), 1897 datetime(1997, 9, 2, 9, 0, 18), 1898 datetime(1997, 9, 2, 9, 1, 6)]) 1899 1900 def testMinutelyByHourAndMinute(self): 1901 self.assertEqual(list(rrule(MINUTELY, 1902 count=3, 1903 byhour=(6, 18), 1904 byminute=(6, 18), 1905 dtstart=datetime(1997, 9, 2, 9, 0))), 1906 [datetime(1997, 9, 2, 18, 6), 1907 datetime(1997, 9, 2, 18, 18), 1908 datetime(1997, 9, 3, 6, 6)]) 1909 1910 def testMinutelyByHourAndSecond(self): 1911 self.assertEqual(list(rrule(MINUTELY, 1912 count=3, 1913 byhour=(6, 18), 1914 bysecond=(6, 18), 1915 dtstart=datetime(1997, 9, 2, 9, 0))), 1916 [datetime(1997, 9, 2, 18, 0, 6), 1917 datetime(1997, 9, 2, 18, 0, 18), 1918 datetime(1997, 9, 2, 18, 1, 6)]) 1919 1920 def testMinutelyByMinuteAndSecond(self): 1921 self.assertEqual(list(rrule(MINUTELY, 1922 count=3, 1923 byminute=(6, 18), 1924 bysecond=(6, 18), 1925 dtstart=datetime(1997, 9, 2, 9, 0))), 1926 [datetime(1997, 9, 2, 9, 6, 6), 1927 datetime(1997, 9, 2, 9, 6, 18), 1928 datetime(1997, 9, 2, 9, 18, 6)]) 1929 1930 def testMinutelyByHourAndMinuteAndSecond(self): 1931 self.assertEqual(list(rrule(MINUTELY, 1932 count=3, 1933 byhour=(6, 18), 1934 byminute=(6, 18), 1935 bysecond=(6, 18), 1936 dtstart=datetime(1997, 9, 2, 9, 0))), 1937 [datetime(1997, 9, 2, 18, 6, 6), 1938 datetime(1997, 9, 2, 18, 6, 18), 1939 datetime(1997, 9, 2, 18, 18, 6)]) 1940 1941 def testMinutelyBySetPos(self): 1942 self.assertEqual(list(rrule(MINUTELY, 1943 count=3, 1944 bysecond=(15, 30, 45), 1945 bysetpos=(3, -3), 1946 dtstart=datetime(1997, 9, 2, 9, 0))), 1947 [datetime(1997, 9, 2, 9, 0, 15), 1948 datetime(1997, 9, 2, 9, 0, 45), 1949 datetime(1997, 9, 2, 9, 1, 15)]) 1950 1951 def testSecondly(self): 1952 self.assertEqual(list(rrule(SECONDLY, 1953 count=3, 1954 dtstart=datetime(1997, 9, 2, 9, 0))), 1955 [datetime(1997, 9, 2, 9, 0, 0), 1956 datetime(1997, 9, 2, 9, 0, 1), 1957 datetime(1997, 9, 2, 9, 0, 2)]) 1958 1959 def testSecondlyInterval(self): 1960 self.assertEqual(list(rrule(SECONDLY, 1961 count=3, 1962 interval=2, 1963 dtstart=datetime(1997, 9, 2, 9, 0))), 1964 [datetime(1997, 9, 2, 9, 0, 0), 1965 datetime(1997, 9, 2, 9, 0, 2), 1966 datetime(1997, 9, 2, 9, 0, 4)]) 1967 1968 def testSecondlyIntervalLarge(self): 1969 self.assertEqual(list(rrule(SECONDLY, 1970 count=3, 1971 interval=90061, 1972 dtstart=datetime(1997, 9, 2, 9, 0))), 1973 [datetime(1997, 9, 2, 9, 0, 0), 1974 datetime(1997, 9, 3, 10, 1, 1), 1975 datetime(1997, 9, 4, 11, 2, 2)]) 1976 1977 def testSecondlyByMonth(self): 1978 self.assertEqual(list(rrule(SECONDLY, 1979 count=3, 1980 bymonth=(1, 3), 1981 dtstart=datetime(1997, 9, 2, 9, 0))), 1982 [datetime(1998, 1, 1, 0, 0, 0), 1983 datetime(1998, 1, 1, 0, 0, 1), 1984 datetime(1998, 1, 1, 0, 0, 2)]) 1985 1986 def testSecondlyByMonthDay(self): 1987 self.assertEqual(list(rrule(SECONDLY, 1988 count=3, 1989 bymonthday=(1, 3), 1990 dtstart=datetime(1997, 9, 2, 9, 0))), 1991 [datetime(1997, 9, 3, 0, 0, 0), 1992 datetime(1997, 9, 3, 0, 0, 1), 1993 datetime(1997, 9, 3, 0, 0, 2)]) 1994 1995 def testSecondlyByMonthAndMonthDay(self): 1996 self.assertEqual(list(rrule(SECONDLY, 1997 count=3, 1998 bymonth=(1, 3), 1999 bymonthday=(5, 7), 2000 dtstart=datetime(1997, 9, 2, 9, 0))), 2001 [datetime(1998, 1, 5, 0, 0, 0), 2002 datetime(1998, 1, 5, 0, 0, 1), 2003 datetime(1998, 1, 5, 0, 0, 2)]) 2004 2005 def testSecondlyByWeekDay(self): 2006 self.assertEqual(list(rrule(SECONDLY, 2007 count=3, 2008 byweekday=(TU, TH), 2009 dtstart=datetime(1997, 9, 2, 9, 0))), 2010 [datetime(1997, 9, 2, 9, 0, 0), 2011 datetime(1997, 9, 2, 9, 0, 1), 2012 datetime(1997, 9, 2, 9, 0, 2)]) 2013 2014 def testSecondlyByNWeekDay(self): 2015 self.assertEqual(list(rrule(SECONDLY, 2016 count=3, 2017 byweekday=(TU(1), TH(-1)), 2018 dtstart=datetime(1997, 9, 2, 9, 0))), 2019 [datetime(1997, 9, 2, 9, 0, 0), 2020 datetime(1997, 9, 2, 9, 0, 1), 2021 datetime(1997, 9, 2, 9, 0, 2)]) 2022 2023 def testSecondlyByMonthAndWeekDay(self): 2024 self.assertEqual(list(rrule(SECONDLY, 2025 count=3, 2026 bymonth=(1, 3), 2027 byweekday=(TU, TH), 2028 dtstart=datetime(1997, 9, 2, 9, 0))), 2029 [datetime(1998, 1, 1, 0, 0, 0), 2030 datetime(1998, 1, 1, 0, 0, 1), 2031 datetime(1998, 1, 1, 0, 0, 2)]) 2032 2033 def testSecondlyByMonthAndNWeekDay(self): 2034 self.assertEqual(list(rrule(SECONDLY, 2035 count=3, 2036 bymonth=(1, 3), 2037 byweekday=(TU(1), TH(-1)), 2038 dtstart=datetime(1997, 9, 2, 9, 0))), 2039 [datetime(1998, 1, 1, 0, 0, 0), 2040 datetime(1998, 1, 1, 0, 0, 1), 2041 datetime(1998, 1, 1, 0, 0, 2)]) 2042 2043 def testSecondlyByMonthDayAndWeekDay(self): 2044 self.assertEqual(list(rrule(SECONDLY, 2045 count=3, 2046 bymonthday=(1, 3), 2047 byweekday=(TU, TH), 2048 dtstart=datetime(1997, 9, 2, 9, 0))), 2049 [datetime(1998, 1, 1, 0, 0, 0), 2050 datetime(1998, 1, 1, 0, 0, 1), 2051 datetime(1998, 1, 1, 0, 0, 2)]) 2052 2053 def testSecondlyByMonthAndMonthDayAndWeekDay(self): 2054 self.assertEqual(list(rrule(SECONDLY, 2055 count=3, 2056 bymonth=(1, 3), 2057 bymonthday=(1, 3), 2058 byweekday=(TU, TH), 2059 dtstart=datetime(1997, 9, 2, 9, 0))), 2060 [datetime(1998, 1, 1, 0, 0, 0), 2061 datetime(1998, 1, 1, 0, 0, 1), 2062 datetime(1998, 1, 1, 0, 0, 2)]) 2063 2064 def testSecondlyByYearDay(self): 2065 self.assertEqual(list(rrule(SECONDLY, 2066 count=4, 2067 byyearday=(1, 100, 200, 365), 2068 dtstart=datetime(1997, 9, 2, 9, 0))), 2069 [datetime(1997, 12, 31, 0, 0, 0), 2070 datetime(1997, 12, 31, 0, 0, 1), 2071 datetime(1997, 12, 31, 0, 0, 2), 2072 datetime(1997, 12, 31, 0, 0, 3)]) 2073 2074 def testSecondlyByYearDayNeg(self): 2075 self.assertEqual(list(rrule(SECONDLY, 2076 count=4, 2077 byyearday=(-365, -266, -166, -1), 2078 dtstart=datetime(1997, 9, 2, 9, 0))), 2079 [datetime(1997, 12, 31, 0, 0, 0), 2080 datetime(1997, 12, 31, 0, 0, 1), 2081 datetime(1997, 12, 31, 0, 0, 2), 2082 datetime(1997, 12, 31, 0, 0, 3)]) 2083 2084 def testSecondlyByMonthAndYearDay(self): 2085 self.assertEqual(list(rrule(SECONDLY, 2086 count=4, 2087 bymonth=(4, 7), 2088 byyearday=(1, 100, 200, 365), 2089 dtstart=datetime(1997, 9, 2, 9, 0))), 2090 [datetime(1998, 4, 10, 0, 0, 0), 2091 datetime(1998, 4, 10, 0, 0, 1), 2092 datetime(1998, 4, 10, 0, 0, 2), 2093 datetime(1998, 4, 10, 0, 0, 3)]) 2094 2095 def testSecondlyByMonthAndYearDayNeg(self): 2096 self.assertEqual(list(rrule(SECONDLY, 2097 count=4, 2098 bymonth=(4, 7), 2099 byyearday=(-365, -266, -166, -1), 2100 dtstart=datetime(1997, 9, 2, 9, 0))), 2101 [datetime(1998, 4, 10, 0, 0, 0), 2102 datetime(1998, 4, 10, 0, 0, 1), 2103 datetime(1998, 4, 10, 0, 0, 2), 2104 datetime(1998, 4, 10, 0, 0, 3)]) 2105 2106 def testSecondlyByWeekNo(self): 2107 self.assertEqual(list(rrule(SECONDLY, 2108 count=3, 2109 byweekno=20, 2110 dtstart=datetime(1997, 9, 2, 9, 0))), 2111 [datetime(1998, 5, 11, 0, 0, 0), 2112 datetime(1998, 5, 11, 0, 0, 1), 2113 datetime(1998, 5, 11, 0, 0, 2)]) 2114 2115 def testSecondlyByWeekNoAndWeekDay(self): 2116 self.assertEqual(list(rrule(SECONDLY, 2117 count=3, 2118 byweekno=1, 2119 byweekday=MO, 2120 dtstart=datetime(1997, 9, 2, 9, 0))), 2121 [datetime(1997, 12, 29, 0, 0, 0), 2122 datetime(1997, 12, 29, 0, 0, 1), 2123 datetime(1997, 12, 29, 0, 0, 2)]) 2124 2125 def testSecondlyByWeekNoAndWeekDayLarge(self): 2126 self.assertEqual(list(rrule(SECONDLY, 2127 count=3, 2128 byweekno=52, 2129 byweekday=SU, 2130 dtstart=datetime(1997, 9, 2, 9, 0))), 2131 [datetime(1997, 12, 28, 0, 0, 0), 2132 datetime(1997, 12, 28, 0, 0, 1), 2133 datetime(1997, 12, 28, 0, 0, 2)]) 2134 2135 def testSecondlyByWeekNoAndWeekDayLast(self): 2136 self.assertEqual(list(rrule(SECONDLY, 2137 count=3, 2138 byweekno=-1, 2139 byweekday=SU, 2140 dtstart=datetime(1997, 9, 2, 9, 0))), 2141 [datetime(1997, 12, 28, 0, 0, 0), 2142 datetime(1997, 12, 28, 0, 0, 1), 2143 datetime(1997, 12, 28, 0, 0, 2)]) 2144 2145 def testSecondlyByWeekNoAndWeekDay53(self): 2146 self.assertEqual(list(rrule(SECONDLY, 2147 count=3, 2148 byweekno=53, 2149 byweekday=MO, 2150 dtstart=datetime(1997, 9, 2, 9, 0))), 2151 [datetime(1998, 12, 28, 0, 0, 0), 2152 datetime(1998, 12, 28, 0, 0, 1), 2153 datetime(1998, 12, 28, 0, 0, 2)]) 2154 2155 def testSecondlyByEaster(self): 2156 self.assertEqual(list(rrule(SECONDLY, 2157 count=3, 2158 byeaster=0, 2159 dtstart=datetime(1997, 9, 2, 9, 0))), 2160 [datetime(1998, 4, 12, 0, 0, 0), 2161 datetime(1998, 4, 12, 0, 0, 1), 2162 datetime(1998, 4, 12, 0, 0, 2)]) 2163 2164 def testSecondlyByEasterPos(self): 2165 self.assertEqual(list(rrule(SECONDLY, 2166 count=3, 2167 byeaster=1, 2168 dtstart=datetime(1997, 9, 2, 9, 0))), 2169 [datetime(1998, 4, 13, 0, 0, 0), 2170 datetime(1998, 4, 13, 0, 0, 1), 2171 datetime(1998, 4, 13, 0, 0, 2)]) 2172 2173 def testSecondlyByEasterNeg(self): 2174 self.assertEqual(list(rrule(SECONDLY, 2175 count=3, 2176 byeaster=-1, 2177 dtstart=datetime(1997, 9, 2, 9, 0))), 2178 [datetime(1998, 4, 11, 0, 0, 0), 2179 datetime(1998, 4, 11, 0, 0, 1), 2180 datetime(1998, 4, 11, 0, 0, 2)]) 2181 2182 def testSecondlyByHour(self): 2183 self.assertEqual(list(rrule(SECONDLY, 2184 count=3, 2185 byhour=(6, 18), 2186 dtstart=datetime(1997, 9, 2, 9, 0))), 2187 [datetime(1997, 9, 2, 18, 0, 0), 2188 datetime(1997, 9, 2, 18, 0, 1), 2189 datetime(1997, 9, 2, 18, 0, 2)]) 2190 2191 def testSecondlyByMinute(self): 2192 self.assertEqual(list(rrule(SECONDLY, 2193 count=3, 2194 byminute=(6, 18), 2195 dtstart=datetime(1997, 9, 2, 9, 0))), 2196 [datetime(1997, 9, 2, 9, 6, 0), 2197 datetime(1997, 9, 2, 9, 6, 1), 2198 datetime(1997, 9, 2, 9, 6, 2)]) 2199 2200 def testSecondlyBySecond(self): 2201 self.assertEqual(list(rrule(SECONDLY, 2202 count=3, 2203 bysecond=(6, 18), 2204 dtstart=datetime(1997, 9, 2, 9, 0))), 2205 [datetime(1997, 9, 2, 9, 0, 6), 2206 datetime(1997, 9, 2, 9, 0, 18), 2207 datetime(1997, 9, 2, 9, 1, 6)]) 2208 2209 def testSecondlyByHourAndMinute(self): 2210 self.assertEqual(list(rrule(SECONDLY, 2211 count=3, 2212 byhour=(6, 18), 2213 byminute=(6, 18), 2214 dtstart=datetime(1997, 9, 2, 9, 0))), 2215 [datetime(1997, 9, 2, 18, 6, 0), 2216 datetime(1997, 9, 2, 18, 6, 1), 2217 datetime(1997, 9, 2, 18, 6, 2)]) 2218 2219 def testSecondlyByHourAndSecond(self): 2220 self.assertEqual(list(rrule(SECONDLY, 2221 count=3, 2222 byhour=(6, 18), 2223 bysecond=(6, 18), 2224 dtstart=datetime(1997, 9, 2, 9, 0))), 2225 [datetime(1997, 9, 2, 18, 0, 6), 2226 datetime(1997, 9, 2, 18, 0, 18), 2227 datetime(1997, 9, 2, 18, 1, 6)]) 2228 2229 def testSecondlyByMinuteAndSecond(self): 2230 self.assertEqual(list(rrule(SECONDLY, 2231 count=3, 2232 byminute=(6, 18), 2233 bysecond=(6, 18), 2234 dtstart=datetime(1997, 9, 2, 9, 0))), 2235 [datetime(1997, 9, 2, 9, 6, 6), 2236 datetime(1997, 9, 2, 9, 6, 18), 2237 datetime(1997, 9, 2, 9, 18, 6)]) 2238 2239 def testSecondlyByHourAndMinuteAndSecond(self): 2240 self.assertEqual(list(rrule(SECONDLY, 2241 count=3, 2242 byhour=(6, 18), 2243 byminute=(6, 18), 2244 bysecond=(6, 18), 2245 dtstart=datetime(1997, 9, 2, 9, 0))), 2246 [datetime(1997, 9, 2, 18, 6, 6), 2247 datetime(1997, 9, 2, 18, 6, 18), 2248 datetime(1997, 9, 2, 18, 18, 6)]) 2249 2250 def testSecondlyByHourAndMinuteAndSecondBug(self): 2251 # This explores a bug found by Mathieu Bridon. 2252 self.assertEqual(list(rrule(SECONDLY, 2253 count=3, 2254 bysecond=(0,), 2255 byminute=(1,), 2256 dtstart=datetime(2010, 3, 22, 12, 1))), 2257 [datetime(2010, 3, 22, 12, 1), 2258 datetime(2010, 3, 22, 13, 1), 2259 datetime(2010, 3, 22, 14, 1)]) 2260 2261 def testLongIntegers(self): 2262 if not PY3: # There is no longs in python3 2263 self.assertEqual(list(rrule(MINUTELY, 2264 count=long(2), 2265 interval=long(2), 2266 bymonth=long(2), 2267 byweekday=long(3), 2268 byhour=long(6), 2269 byminute=long(6), 2270 bysecond=long(6), 2271 dtstart=datetime(1997, 9, 2, 9, 0))), 2272 [datetime(1998, 2, 5, 6, 6, 6), 2273 datetime(1998, 2, 12, 6, 6, 6)]) 2274 self.assertEqual(list(rrule(YEARLY, 2275 count=long(2), 2276 bymonthday=long(5), 2277 byweekno=long(2), 2278 dtstart=datetime(1997, 9, 2, 9, 0))), 2279 [datetime(1998, 1, 5, 9, 0), 2280 datetime(2004, 1, 5, 9, 0)]) 2281 2282 def testHourlyBadRRule(self): 2283 """ 2284 When `byhour` is specified with `freq=HOURLY`, there are certain 2285 combinations of `dtstart` and `byhour` which result in an rrule with no 2286 valid values. 2287 2288 See https://github.com/dateutil/dateutil/issues/4 2289 """ 2290 2291 self.assertRaises(ValueError, rrule, HOURLY, 2292 **dict(interval=4, byhour=(7, 11, 15, 19), 2293 dtstart=datetime(1997, 9, 2, 9, 0))) 2294 2295 def testMinutelyBadRRule(self): 2296 """ 2297 See :func:`testHourlyBadRRule` for details. 2298 """ 2299 2300 self.assertRaises(ValueError, rrule, MINUTELY, 2301 **dict(interval=12, byminute=(10, 11, 25, 39, 50), 2302 dtstart=datetime(1997, 9, 2, 9, 0))) 2303 2304 def testSecondlyBadRRule(self): 2305 """ 2306 See :func:`testHourlyBadRRule` for details. 2307 """ 2308 2309 self.assertRaises(ValueError, rrule, SECONDLY, 2310 **dict(interval=10, bysecond=(2, 15, 37, 42, 59), 2311 dtstart=datetime(1997, 9, 2, 9, 0))) 2312 2313 def testMinutelyBadComboRRule(self): 2314 """ 2315 Certain values of :param:`interval` in :class:`rrule`, when combined 2316 with certain values of :param:`byhour` create rules which apply to no 2317 valid dates. The library should detect this case in the iterator and 2318 raise a :exception:`ValueError`. 2319 """ 2320 2321 # In Python 2.7 you can use a context manager for this. 2322 def make_bad_rrule(): 2323 list(rrule(MINUTELY, interval=120, byhour=(10, 12, 14, 16), 2324 count=2, dtstart=datetime(1997, 9, 2, 9, 0))) 2325 2326 self.assertRaises(ValueError, make_bad_rrule) 2327 2328 def testSecondlyBadComboRRule(self): 2329 """ 2330 See :func:`testMinutelyBadComboRRule' for details. 2331 """ 2332 2333 # In Python 2.7 you can use a context manager for this. 2334 def make_bad_minute_rrule(): 2335 list(rrule(SECONDLY, interval=360, byminute=(10, 28, 49), 2336 count=4, dtstart=datetime(1997, 9, 2, 9, 0))) 2337 2338 def make_bad_hour_rrule(): 2339 list(rrule(SECONDLY, interval=43200, byhour=(2, 10, 18, 23), 2340 count=4, dtstart=datetime(1997, 9, 2, 9, 0))) 2341 2342 self.assertRaises(ValueError, make_bad_minute_rrule) 2343 self.assertRaises(ValueError, make_bad_hour_rrule) 2344 2345 def testBadUntilCountRRule(self): 2346 """ 2347 See rfc-2445 4.3.10 - This checks for the deprecation warning, and will 2348 eventually check for an error. 2349 """ 2350 with self.assertWarns(DeprecationWarning): 2351 rrule(DAILY, dtstart=datetime(1997, 9, 2, 9, 0), 2352 count=3, until=datetime(1997, 9, 4, 9, 0)) 2353 2354 def testUntilNotMatching(self): 2355 self.assertEqual(list(rrule(DAILY, 2356 dtstart=datetime(1997, 9, 2, 9, 0), 2357 until=datetime(1997, 9, 5, 8, 0))), 2358 [datetime(1997, 9, 2, 9, 0), 2359 datetime(1997, 9, 3, 9, 0), 2360 datetime(1997, 9, 4, 9, 0)]) 2361 2362 def testUntilMatching(self): 2363 self.assertEqual(list(rrule(DAILY, 2364 dtstart=datetime(1997, 9, 2, 9, 0), 2365 until=datetime(1997, 9, 4, 9, 0))), 2366 [datetime(1997, 9, 2, 9, 0), 2367 datetime(1997, 9, 3, 9, 0), 2368 datetime(1997, 9, 4, 9, 0)]) 2369 2370 def testUntilSingle(self): 2371 self.assertEqual(list(rrule(DAILY, 2372 dtstart=datetime(1997, 9, 2, 9, 0), 2373 until=datetime(1997, 9, 2, 9, 0))), 2374 [datetime(1997, 9, 2, 9, 0)]) 2375 2376 def testUntilEmpty(self): 2377 self.assertEqual(list(rrule(DAILY, 2378 dtstart=datetime(1997, 9, 2, 9, 0), 2379 until=datetime(1997, 9, 1, 9, 0))), 2380 []) 2381 2382 def testUntilWithDate(self): 2383 self.assertEqual(list(rrule(DAILY, 2384 dtstart=datetime(1997, 9, 2, 9, 0), 2385 until=date(1997, 9, 5))), 2386 [datetime(1997, 9, 2, 9, 0), 2387 datetime(1997, 9, 3, 9, 0), 2388 datetime(1997, 9, 4, 9, 0)]) 2389 2390 def testWkStIntervalMO(self): 2391 self.assertEqual(list(rrule(WEEKLY, 2392 count=3, 2393 interval=2, 2394 byweekday=(TU, SU), 2395 wkst=MO, 2396 dtstart=datetime(1997, 9, 2, 9, 0))), 2397 [datetime(1997, 9, 2, 9, 0), 2398 datetime(1997, 9, 7, 9, 0), 2399 datetime(1997, 9, 16, 9, 0)]) 2400 2401 def testWkStIntervalSU(self): 2402 self.assertEqual(list(rrule(WEEKLY, 2403 count=3, 2404 interval=2, 2405 byweekday=(TU, SU), 2406 wkst=SU, 2407 dtstart=datetime(1997, 9, 2, 9, 0))), 2408 [datetime(1997, 9, 2, 9, 0), 2409 datetime(1997, 9, 14, 9, 0), 2410 datetime(1997, 9, 16, 9, 0)]) 2411 2412 def testDTStartIsDate(self): 2413 self.assertEqual(list(rrule(DAILY, 2414 count=3, 2415 dtstart=date(1997, 9, 2))), 2416 [datetime(1997, 9, 2, 0, 0), 2417 datetime(1997, 9, 3, 0, 0), 2418 datetime(1997, 9, 4, 0, 0)]) 2419 2420 def testDTStartWithMicroseconds(self): 2421 self.assertEqual(list(rrule(DAILY, 2422 count=3, 2423 dtstart=datetime(1997, 9, 2, 9, 0, 0, 500000))), 2424 [datetime(1997, 9, 2, 9, 0), 2425 datetime(1997, 9, 3, 9, 0), 2426 datetime(1997, 9, 4, 9, 0)]) 2427 2428 def testMaxYear(self): 2429 self.assertEqual(list(rrule(YEARLY, 2430 count=3, 2431 bymonth=2, 2432 bymonthday=31, 2433 dtstart=datetime(9997, 9, 2, 9, 0, 0))), 2434 []) 2435 2436 def testGetItem(self): 2437 self.assertEqual(rrule(DAILY, 2438 count=3, 2439 dtstart=datetime(1997, 9, 2, 9, 0))[0], 2440 datetime(1997, 9, 2, 9, 0)) 2441 2442 def testGetItemNeg(self): 2443 self.assertEqual(rrule(DAILY, 2444 count=3, 2445 dtstart=datetime(1997, 9, 2, 9, 0))[-1], 2446 datetime(1997, 9, 4, 9, 0)) 2447 2448 def testGetItemSlice(self): 2449 self.assertEqual(rrule(DAILY, 2450 # count=3, 2451 dtstart=datetime(1997, 9, 2, 9, 0))[1:2], 2452 [datetime(1997, 9, 3, 9, 0)]) 2453 2454 def testGetItemSliceEmpty(self): 2455 self.assertEqual(rrule(DAILY, 2456 count=3, 2457 dtstart=datetime(1997, 9, 2, 9, 0))[:], 2458 [datetime(1997, 9, 2, 9, 0), 2459 datetime(1997, 9, 3, 9, 0), 2460 datetime(1997, 9, 4, 9, 0)]) 2461 2462 def testGetItemSliceStep(self): 2463 self.assertEqual(rrule(DAILY, 2464 count=3, 2465 dtstart=datetime(1997, 9, 2, 9, 0))[::-2], 2466 [datetime(1997, 9, 4, 9, 0), 2467 datetime(1997, 9, 2, 9, 0)]) 2468 2469 def testCount(self): 2470 self.assertEqual(rrule(DAILY, 2471 count=3, 2472 dtstart=datetime(1997, 9, 2, 9, 0)).count(), 2473 3) 2474 2475 def testContains(self): 2476 rr = rrule(DAILY, count=3, dtstart=datetime(1997, 9, 2, 9, 0)) 2477 self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True) 2478 2479 def testContainsNot(self): 2480 rr = rrule(DAILY, count=3, dtstart=datetime(1997, 9, 2, 9, 0)) 2481 self.assertEqual(datetime(1997, 9, 3, 9, 0) not in rr, False) 2482 2483 def testBefore(self): 2484 self.assertEqual(rrule(DAILY, # count=5 2485 dtstart=datetime(1997, 9, 2, 9, 0)).before(datetime(1997, 9, 5, 9, 0)), 2486 datetime(1997, 9, 4, 9, 0)) 2487 2488 def testBeforeInc(self): 2489 self.assertEqual(rrule(DAILY, 2490 #count=5, 2491 dtstart=datetime(1997, 9, 2, 9, 0)) 2492 .before(datetime(1997, 9, 5, 9, 0), inc=True), 2493 datetime(1997, 9, 5, 9, 0)) 2494 2495 def testAfter(self): 2496 self.assertEqual(rrule(DAILY, 2497 #count=5, 2498 dtstart=datetime(1997, 9, 2, 9, 0)) 2499 .after(datetime(1997, 9, 4, 9, 0)), 2500 datetime(1997, 9, 5, 9, 0)) 2501 2502 def testAfterInc(self): 2503 self.assertEqual(rrule(DAILY, 2504 #count=5, 2505 dtstart=datetime(1997, 9, 2, 9, 0)) 2506 .after(datetime(1997, 9, 4, 9, 0), inc=True), 2507 datetime(1997, 9, 4, 9, 0)) 2508 2509 def testXAfter(self): 2510 self.assertEqual(list(rrule(DAILY, 2511 dtstart=datetime(1997, 9, 2, 9, 0)) 2512 .xafter(datetime(1997, 9, 8, 9, 0), count=12)), 2513 [datetime(1997, 9, 9, 9, 0), 2514 datetime(1997, 9, 10, 9, 0), 2515 datetime(1997, 9, 11, 9, 0), 2516 datetime(1997, 9, 12, 9, 0), 2517 datetime(1997, 9, 13, 9, 0), 2518 datetime(1997, 9, 14, 9, 0), 2519 datetime(1997, 9, 15, 9, 0), 2520 datetime(1997, 9, 16, 9, 0), 2521 datetime(1997, 9, 17, 9, 0), 2522 datetime(1997, 9, 18, 9, 0), 2523 datetime(1997, 9, 19, 9, 0), 2524 datetime(1997, 9, 20, 9, 0)]) 2525 2526 def testXAfterInc(self): 2527 self.assertEqual(list(rrule(DAILY, 2528 dtstart=datetime(1997, 9, 2, 9, 0)) 2529 .xafter(datetime(1997, 9, 8, 9, 0), count=12, inc=True)), 2530 [datetime(1997, 9, 8, 9, 0), 2531 datetime(1997, 9, 9, 9, 0), 2532 datetime(1997, 9, 10, 9, 0), 2533 datetime(1997, 9, 11, 9, 0), 2534 datetime(1997, 9, 12, 9, 0), 2535 datetime(1997, 9, 13, 9, 0), 2536 datetime(1997, 9, 14, 9, 0), 2537 datetime(1997, 9, 15, 9, 0), 2538 datetime(1997, 9, 16, 9, 0), 2539 datetime(1997, 9, 17, 9, 0), 2540 datetime(1997, 9, 18, 9, 0), 2541 datetime(1997, 9, 19, 9, 0)]) 2542 2543 def testBetween(self): 2544 self.assertEqual(rrule(DAILY, 2545 #count=5, 2546 dtstart=datetime(1997, 9, 2, 9, 0)) 2547 .between(datetime(1997, 9, 2, 9, 0), 2548 datetime(1997, 9, 6, 9, 0)), 2549 [datetime(1997, 9, 3, 9, 0), 2550 datetime(1997, 9, 4, 9, 0), 2551 datetime(1997, 9, 5, 9, 0)]) 2552 2553 def testBetweenInc(self): 2554 self.assertEqual(rrule(DAILY, 2555 #count=5, 2556 dtstart=datetime(1997, 9, 2, 9, 0)) 2557 .between(datetime(1997, 9, 2, 9, 0), 2558 datetime(1997, 9, 6, 9, 0), inc=True), 2559 [datetime(1997, 9, 2, 9, 0), 2560 datetime(1997, 9, 3, 9, 0), 2561 datetime(1997, 9, 4, 9, 0), 2562 datetime(1997, 9, 5, 9, 0), 2563 datetime(1997, 9, 6, 9, 0)]) 2564 2565 def testCachePre(self): 2566 rr = rrule(DAILY, count=15, cache=True, 2567 dtstart=datetime(1997, 9, 2, 9, 0)) 2568 self.assertEqual(list(rr), 2569 [datetime(1997, 9, 2, 9, 0), 2570 datetime(1997, 9, 3, 9, 0), 2571 datetime(1997, 9, 4, 9, 0), 2572 datetime(1997, 9, 5, 9, 0), 2573 datetime(1997, 9, 6, 9, 0), 2574 datetime(1997, 9, 7, 9, 0), 2575 datetime(1997, 9, 8, 9, 0), 2576 datetime(1997, 9, 9, 9, 0), 2577 datetime(1997, 9, 10, 9, 0), 2578 datetime(1997, 9, 11, 9, 0), 2579 datetime(1997, 9, 12, 9, 0), 2580 datetime(1997, 9, 13, 9, 0), 2581 datetime(1997, 9, 14, 9, 0), 2582 datetime(1997, 9, 15, 9, 0), 2583 datetime(1997, 9, 16, 9, 0)]) 2584 2585 def testCachePost(self): 2586 rr = rrule(DAILY, count=15, cache=True, 2587 dtstart=datetime(1997, 9, 2, 9, 0)) 2588 for x in rr: pass 2589 self.assertEqual(list(rr), 2590 [datetime(1997, 9, 2, 9, 0), 2591 datetime(1997, 9, 3, 9, 0), 2592 datetime(1997, 9, 4, 9, 0), 2593 datetime(1997, 9, 5, 9, 0), 2594 datetime(1997, 9, 6, 9, 0), 2595 datetime(1997, 9, 7, 9, 0), 2596 datetime(1997, 9, 8, 9, 0), 2597 datetime(1997, 9, 9, 9, 0), 2598 datetime(1997, 9, 10, 9, 0), 2599 datetime(1997, 9, 11, 9, 0), 2600 datetime(1997, 9, 12, 9, 0), 2601 datetime(1997, 9, 13, 9, 0), 2602 datetime(1997, 9, 14, 9, 0), 2603 datetime(1997, 9, 15, 9, 0), 2604 datetime(1997, 9, 16, 9, 0)]) 2605 2606 def testCachePostInternal(self): 2607 rr = rrule(DAILY, count=15, cache=True, 2608 dtstart=datetime(1997, 9, 2, 9, 0)) 2609 for x in rr: pass 2610 self.assertEqual(rr._cache, 2611 [datetime(1997, 9, 2, 9, 0), 2612 datetime(1997, 9, 3, 9, 0), 2613 datetime(1997, 9, 4, 9, 0), 2614 datetime(1997, 9, 5, 9, 0), 2615 datetime(1997, 9, 6, 9, 0), 2616 datetime(1997, 9, 7, 9, 0), 2617 datetime(1997, 9, 8, 9, 0), 2618 datetime(1997, 9, 9, 9, 0), 2619 datetime(1997, 9, 10, 9, 0), 2620 datetime(1997, 9, 11, 9, 0), 2621 datetime(1997, 9, 12, 9, 0), 2622 datetime(1997, 9, 13, 9, 0), 2623 datetime(1997, 9, 14, 9, 0), 2624 datetime(1997, 9, 15, 9, 0), 2625 datetime(1997, 9, 16, 9, 0)]) 2626 2627 def testCachePreContains(self): 2628 rr = rrule(DAILY, count=3, cache=True, 2629 dtstart=datetime(1997, 9, 2, 9, 0)) 2630 self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True) 2631 2632 def testCachePostContains(self): 2633 rr = rrule(DAILY, count=3, cache=True, 2634 dtstart=datetime(1997, 9, 2, 9, 0)) 2635 for x in rr: pass 2636 self.assertEqual(datetime(1997, 9, 3, 9, 0) in rr, True) 2637 2638 def testStr(self): 2639 self.assertEqual(list(rrulestr( 2640 "DTSTART:19970902T090000\n" 2641 "RRULE:FREQ=YEARLY;COUNT=3\n" 2642 )), 2643 [datetime(1997, 9, 2, 9, 0), 2644 datetime(1998, 9, 2, 9, 0), 2645 datetime(1999, 9, 2, 9, 0)]) 2646 2647 def testStrType(self): 2648 self.assertEqual(isinstance(rrulestr( 2649 "DTSTART:19970902T090000\n" 2650 "RRULE:FREQ=YEARLY;COUNT=3\n" 2651 ), rrule), True) 2652 2653 def testStrForceSetType(self): 2654 self.assertEqual(isinstance(rrulestr( 2655 "DTSTART:19970902T090000\n" 2656 "RRULE:FREQ=YEARLY;COUNT=3\n" 2657 , forceset=True), rruleset), True) 2658 2659 def testStrSetType(self): 2660 self.assertEqual(isinstance(rrulestr( 2661 "DTSTART:19970902T090000\n" 2662 "RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n" 2663 "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n" 2664 ), rruleset), True) 2665 2666 def testStrCase(self): 2667 self.assertEqual(list(rrulestr( 2668 "dtstart:19970902T090000\n" 2669 "rrule:freq=yearly;count=3\n" 2670 )), 2671 [datetime(1997, 9, 2, 9, 0), 2672 datetime(1998, 9, 2, 9, 0), 2673 datetime(1999, 9, 2, 9, 0)]) 2674 2675 def testStrSpaces(self): 2676 self.assertEqual(list(rrulestr( 2677 " DTSTART:19970902T090000 " 2678 " RRULE:FREQ=YEARLY;COUNT=3 " 2679 )), 2680 [datetime(1997, 9, 2, 9, 0), 2681 datetime(1998, 9, 2, 9, 0), 2682 datetime(1999, 9, 2, 9, 0)]) 2683 2684 def testStrSpacesAndLines(self): 2685 self.assertEqual(list(rrulestr( 2686 " DTSTART:19970902T090000 \n" 2687 " \n" 2688 " RRULE:FREQ=YEARLY;COUNT=3 \n" 2689 )), 2690 [datetime(1997, 9, 2, 9, 0), 2691 datetime(1998, 9, 2, 9, 0), 2692 datetime(1999, 9, 2, 9, 0)]) 2693 2694 def testStrNoDTStart(self): 2695 self.assertEqual(list(rrulestr( 2696 "RRULE:FREQ=YEARLY;COUNT=3\n" 2697 , dtstart=datetime(1997, 9, 2, 9, 0))), 2698 [datetime(1997, 9, 2, 9, 0), 2699 datetime(1998, 9, 2, 9, 0), 2700 datetime(1999, 9, 2, 9, 0)]) 2701 2702 def testStrValueOnly(self): 2703 self.assertEqual(list(rrulestr( 2704 "FREQ=YEARLY;COUNT=3\n" 2705 , dtstart=datetime(1997, 9, 2, 9, 0))), 2706 [datetime(1997, 9, 2, 9, 0), 2707 datetime(1998, 9, 2, 9, 0), 2708 datetime(1999, 9, 2, 9, 0)]) 2709 2710 def testStrUnfold(self): 2711 self.assertEqual(list(rrulestr( 2712 "FREQ=YEA\n RLY;COUNT=3\n", unfold=True, 2713 dtstart=datetime(1997, 9, 2, 9, 0))), 2714 [datetime(1997, 9, 2, 9, 0), 2715 datetime(1998, 9, 2, 9, 0), 2716 datetime(1999, 9, 2, 9, 0)]) 2717 2718 def testStrSet(self): 2719 self.assertEqual(list(rrulestr( 2720 "DTSTART:19970902T090000\n" 2721 "RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n" 2722 "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n" 2723 )), 2724 [datetime(1997, 9, 2, 9, 0), 2725 datetime(1997, 9, 4, 9, 0), 2726 datetime(1997, 9, 9, 9, 0)]) 2727 2728 def testStrSetDate(self): 2729 self.assertEqual(list(rrulestr( 2730 "DTSTART:19970902T090000\n" 2731 "RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TU\n" 2732 "RDATE:19970904T090000\n" 2733 "RDATE:19970909T090000\n" 2734 )), 2735 [datetime(1997, 9, 2, 9, 0), 2736 datetime(1997, 9, 4, 9, 0), 2737 datetime(1997, 9, 9, 9, 0)]) 2738 2739 def testStrSetExRule(self): 2740 self.assertEqual(list(rrulestr( 2741 "DTSTART:19970902T090000\n" 2742 "RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n" 2743 "EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n" 2744 )), 2745 [datetime(1997, 9, 2, 9, 0), 2746 datetime(1997, 9, 9, 9, 0), 2747 datetime(1997, 9, 16, 9, 0)]) 2748 2749 def testStrSetExDate(self): 2750 self.assertEqual(list(rrulestr( 2751 "DTSTART:19970902T090000\n" 2752 "RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n" 2753 "EXDATE:19970904T090000\n" 2754 "EXDATE:19970911T090000\n" 2755 "EXDATE:19970918T090000\n" 2756 )), 2757 [datetime(1997, 9, 2, 9, 0), 2758 datetime(1997, 9, 9, 9, 0), 2759 datetime(1997, 9, 16, 9, 0)]) 2760 2761 def testStrSetDateAndExDate(self): 2762 self.assertEqual(list(rrulestr( 2763 "DTSTART:19970902T090000\n" 2764 "RDATE:19970902T090000\n" 2765 "RDATE:19970904T090000\n" 2766 "RDATE:19970909T090000\n" 2767 "RDATE:19970911T090000\n" 2768 "RDATE:19970916T090000\n" 2769 "RDATE:19970918T090000\n" 2770 "EXDATE:19970904T090000\n" 2771 "EXDATE:19970911T090000\n" 2772 "EXDATE:19970918T090000\n" 2773 )), 2774 [datetime(1997, 9, 2, 9, 0), 2775 datetime(1997, 9, 9, 9, 0), 2776 datetime(1997, 9, 16, 9, 0)]) 2777 2778 def testStrSetDateAndExRule(self): 2779 self.assertEqual(list(rrulestr( 2780 "DTSTART:19970902T090000\n" 2781 "RDATE:19970902T090000\n" 2782 "RDATE:19970904T090000\n" 2783 "RDATE:19970909T090000\n" 2784 "RDATE:19970911T090000\n" 2785 "RDATE:19970916T090000\n" 2786 "RDATE:19970918T090000\n" 2787 "EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n" 2788 )), 2789 [datetime(1997, 9, 2, 9, 0), 2790 datetime(1997, 9, 9, 9, 0), 2791 datetime(1997, 9, 16, 9, 0)]) 2792 2793 def testStrKeywords(self): 2794 self.assertEqual(list(rrulestr( 2795 "DTSTART:19970902T090000\n" 2796 "RRULE:FREQ=YEARLY;COUNT=3;INTERVAL=3;" 2797 "BYMONTH=3;BYWEEKDAY=TH;BYMONTHDAY=3;" 2798 "BYHOUR=3;BYMINUTE=3;BYSECOND=3\n" 2799 )), 2800 [datetime(2033, 3, 3, 3, 3, 3), 2801 datetime(2039, 3, 3, 3, 3, 3), 2802 datetime(2072, 3, 3, 3, 3, 3)]) 2803 2804 def testStrNWeekDay(self): 2805 self.assertEqual(list(rrulestr( 2806 "DTSTART:19970902T090000\n" 2807 "RRULE:FREQ=YEARLY;COUNT=3;BYDAY=1TU,-1TH\n" 2808 )), 2809 [datetime(1997, 12, 25, 9, 0), 2810 datetime(1998, 1, 6, 9, 0), 2811 datetime(1998, 12, 31, 9, 0)]) 2812 2813 def testStrUntil(self): 2814 self.assertEqual(list(rrulestr( 2815 "DTSTART:19970902T090000\n" 2816 "RRULE:FREQ=YEARLY;" 2817 "UNTIL=19990101T000000;BYDAY=1TU,-1TH\n" 2818 )), 2819 [datetime(1997, 12, 25, 9, 0), 2820 datetime(1998, 1, 6, 9, 0), 2821 datetime(1998, 12, 31, 9, 0)]) 2822 2823 def testStrInvalidUntil(self): 2824 with self.assertRaises(ValueError): 2825 list(rrulestr("DTSTART:19970902T090000\n" 2826 "RRULE:FREQ=YEARLY;" 2827 "UNTIL=TheCowsComeHome;BYDAY=1TU,-1TH\n")) 2828 2829 def testStrEmptyByDay(self): 2830 with self.assertRaises(ValueError): 2831 list(rrulestr("DTSTART:19970902T090000\n" 2832 "FREQ=WEEKLY;" 2833 "BYDAY=;" # This part is invalid 2834 "WKST=SU")) 2835 2836 def testStrInvalidByDay(self): 2837 with self.assertRaises(ValueError): 2838 list(rrulestr("DTSTART:19970902T090000\n" 2839 "FREQ=WEEKLY;" 2840 "BYDAY=-1OK;" # This part is invalid 2841 "WKST=SU")) 2842 2843 def testBadBySetPos(self): 2844 self.assertRaises(ValueError, 2845 rrule, MONTHLY, 2846 count=1, 2847 bysetpos=0, 2848 dtstart=datetime(1997, 9, 2, 9, 0)) 2849 2850 def testBadBySetPosMany(self): 2851 self.assertRaises(ValueError, 2852 rrule, MONTHLY, 2853 count=1, 2854 bysetpos=(-1, 0, 1), 2855 dtstart=datetime(1997, 9, 2, 9, 0)) 2856 2857 # Tests to ensure that str(rrule) works 2858 def testToStrYearly(self): 2859 rule = rrule(YEARLY, count=3, dtstart=datetime(1997, 9, 2, 9, 0)) 2860 self._rrulestr_reverse_test(rule) 2861 2862 def testToStrYearlyInterval(self): 2863 rule = rrule(YEARLY, count=3, interval=2, 2864 dtstart=datetime(1997, 9, 2, 9, 0)) 2865 self._rrulestr_reverse_test(rule) 2866 2867 def testToStrYearlyByMonth(self): 2868 rule = rrule(YEARLY, count=3, bymonth=(1, 3), 2869 dtstart=datetime(1997, 9, 2, 9, 0)) 2870 2871 self._rrulestr_reverse_test(rule) 2872 2873 def testToStrYearlyByMonth(self): 2874 self._rrulestr_reverse_test(rrule(YEARLY, 2875 count=3, 2876 bymonth=(1, 3), 2877 dtstart=datetime(1997, 9, 2, 9, 0))) 2878 2879 def testToStrYearlyByMonthDay(self): 2880 self._rrulestr_reverse_test(rrule(YEARLY, 2881 count=3, 2882 bymonthday=(1, 3), 2883 dtstart=datetime(1997, 9, 2, 9, 0))) 2884 2885 def testToStrYearlyByMonthAndMonthDay(self): 2886 self._rrulestr_reverse_test(rrule(YEARLY, 2887 count=3, 2888 bymonth=(1, 3), 2889 bymonthday=(5, 7), 2890 dtstart=datetime(1997, 9, 2, 9, 0))) 2891 2892 def testToStrYearlyByWeekDay(self): 2893 self._rrulestr_reverse_test(rrule(YEARLY, 2894 count=3, 2895 byweekday=(TU, TH), 2896 dtstart=datetime(1997, 9, 2, 9, 0))) 2897 2898 def testToStrYearlyByNWeekDay(self): 2899 self._rrulestr_reverse_test(rrule(YEARLY, 2900 count=3, 2901 byweekday=(TU(1), TH(-1)), 2902 dtstart=datetime(1997, 9, 2, 9, 0))) 2903 2904 def testToStrYearlyByNWeekDayLarge(self): 2905 self._rrulestr_reverse_test(rrule(YEARLY, 2906 count=3, 2907 byweekday=(TU(3), TH(-3)), 2908 dtstart=datetime(1997, 9, 2, 9, 0))) 2909 2910 def testToStrYearlyByMonthAndWeekDay(self): 2911 self._rrulestr_reverse_test(rrule(YEARLY, 2912 count=3, 2913 bymonth=(1, 3), 2914 byweekday=(TU, TH), 2915 dtstart=datetime(1997, 9, 2, 9, 0))) 2916 2917 def testToStrYearlyByMonthAndNWeekDay(self): 2918 self._rrulestr_reverse_test(rrule(YEARLY, 2919 count=3, 2920 bymonth=(1, 3), 2921 byweekday=(TU(1), TH(-1)), 2922 dtstart=datetime(1997, 9, 2, 9, 0))) 2923 2924 def testToStrYearlyByMonthAndNWeekDayLarge(self): 2925 # This is interesting because the TH(-3) ends up before 2926 # the TU(3). 2927 self._rrulestr_reverse_test(rrule(YEARLY, 2928 count=3, 2929 bymonth=(1, 3), 2930 byweekday=(TU(3), TH(-3)), 2931 dtstart=datetime(1997, 9, 2, 9, 0))) 2932 2933 def testToStrYearlyByMonthDayAndWeekDay(self): 2934 self._rrulestr_reverse_test(rrule(YEARLY, 2935 count=3, 2936 bymonthday=(1, 3), 2937 byweekday=(TU, TH), 2938 dtstart=datetime(1997, 9, 2, 9, 0))) 2939 2940 def testToStrYearlyByMonthAndMonthDayAndWeekDay(self): 2941 self._rrulestr_reverse_test(rrule(YEARLY, 2942 count=3, 2943 bymonth=(1, 3), 2944 bymonthday=(1, 3), 2945 byweekday=(TU, TH), 2946 dtstart=datetime(1997, 9, 2, 9, 0))) 2947 2948 def testToStrYearlyByYearDay(self): 2949 self._rrulestr_reverse_test(rrule(YEARLY, 2950 count=4, 2951 byyearday=(1, 100, 200, 365), 2952 dtstart=datetime(1997, 9, 2, 9, 0))) 2953 2954 def testToStrYearlyByYearDayNeg(self): 2955 self._rrulestr_reverse_test(rrule(YEARLY, 2956 count=4, 2957 byyearday=(-365, -266, -166, -1), 2958 dtstart=datetime(1997, 9, 2, 9, 0))) 2959 2960 def testToStrYearlyByMonthAndYearDay(self): 2961 self._rrulestr_reverse_test(rrule(YEARLY, 2962 count=4, 2963 bymonth=(4, 7), 2964 byyearday=(1, 100, 200, 365), 2965 dtstart=datetime(1997, 9, 2, 9, 0))) 2966 2967 def testToStrYearlyByMonthAndYearDayNeg(self): 2968 self._rrulestr_reverse_test(rrule(YEARLY, 2969 count=4, 2970 bymonth=(4, 7), 2971 byyearday=(-365, -266, -166, -1), 2972 dtstart=datetime(1997, 9, 2, 9, 0))) 2973 2974 def testToStrYearlyByWeekNo(self): 2975 self._rrulestr_reverse_test(rrule(YEARLY, 2976 count=3, 2977 byweekno=20, 2978 dtstart=datetime(1997, 9, 2, 9, 0))) 2979 2980 def testToStrYearlyByWeekNoAndWeekDay(self): 2981 # That's a nice one. The first days of week number one 2982 # may be in the last year. 2983 self._rrulestr_reverse_test(rrule(YEARLY, 2984 count=3, 2985 byweekno=1, 2986 byweekday=MO, 2987 dtstart=datetime(1997, 9, 2, 9, 0))) 2988 2989 def testToStrYearlyByWeekNoAndWeekDayLarge(self): 2990 # Another nice test. The last days of week number 52/53 2991 # may be in the next year. 2992 self._rrulestr_reverse_test(rrule(YEARLY, 2993 count=3, 2994 byweekno=52, 2995 byweekday=SU, 2996 dtstart=datetime(1997, 9, 2, 9, 0))) 2997 2998 def testToStrYearlyByWeekNoAndWeekDayLast(self): 2999 self._rrulestr_reverse_test(rrule(YEARLY, 3000 count=3, 3001 byweekno=-1, 3002 byweekday=SU, 3003 dtstart=datetime(1997, 9, 2, 9, 0))) 3004 3005 def testToStrYearlyByEaster(self): 3006 self._rrulestr_reverse_test(rrule(YEARLY, 3007 count=3, 3008 byeaster=0, 3009 dtstart=datetime(1997, 9, 2, 9, 0))) 3010 3011 def testToStrYearlyByEasterPos(self): 3012 self._rrulestr_reverse_test(rrule(YEARLY, 3013 count=3, 3014 byeaster=1, 3015 dtstart=datetime(1997, 9, 2, 9, 0))) 3016 3017 def testToStrYearlyByEasterNeg(self): 3018 self._rrulestr_reverse_test(rrule(YEARLY, 3019 count=3, 3020 byeaster=-1, 3021 dtstart=datetime(1997, 9, 2, 9, 0))) 3022 3023 def testToStrYearlyByWeekNoAndWeekDay53(self): 3024 self._rrulestr_reverse_test(rrule(YEARLY, 3025 count=3, 3026 byweekno=53, 3027 byweekday=MO, 3028 dtstart=datetime(1997, 9, 2, 9, 0))) 3029 3030 def testToStrYearlyByHour(self): 3031 self._rrulestr_reverse_test(rrule(YEARLY, 3032 count=3, 3033 byhour=(6, 18), 3034 dtstart=datetime(1997, 9, 2, 9, 0))) 3035 3036 def testToStrYearlyByMinute(self): 3037 self._rrulestr_reverse_test(rrule(YEARLY, 3038 count=3, 3039 byminute=(6, 18), 3040 dtstart=datetime(1997, 9, 2, 9, 0))) 3041 3042 def testToStrYearlyBySecond(self): 3043 self._rrulestr_reverse_test(rrule(YEARLY, 3044 count=3, 3045 bysecond=(6, 18), 3046 dtstart=datetime(1997, 9, 2, 9, 0))) 3047 3048 def testToStrYearlyByHourAndMinute(self): 3049 self._rrulestr_reverse_test(rrule(YEARLY, 3050 count=3, 3051 byhour=(6, 18), 3052 byminute=(6, 18), 3053 dtstart=datetime(1997, 9, 2, 9, 0))) 3054 3055 def testToStrYearlyByHourAndSecond(self): 3056 self._rrulestr_reverse_test(rrule(YEARLY, 3057 count=3, 3058 byhour=(6, 18), 3059 bysecond=(6, 18), 3060 dtstart=datetime(1997, 9, 2, 9, 0))) 3061 3062 def testToStrYearlyByMinuteAndSecond(self): 3063 self._rrulestr_reverse_test(rrule(YEARLY, 3064 count=3, 3065 byminute=(6, 18), 3066 bysecond=(6, 18), 3067 dtstart=datetime(1997, 9, 2, 9, 0))) 3068 3069 def testToStrYearlyByHourAndMinuteAndSecond(self): 3070 self._rrulestr_reverse_test(rrule(YEARLY, 3071 count=3, 3072 byhour=(6, 18), 3073 byminute=(6, 18), 3074 bysecond=(6, 18), 3075 dtstart=datetime(1997, 9, 2, 9, 0))) 3076 3077 def testToStrYearlyBySetPos(self): 3078 self._rrulestr_reverse_test(rrule(YEARLY, 3079 count=3, 3080 bymonthday=15, 3081 byhour=(6, 18), 3082 bysetpos=(3, -3), 3083 dtstart=datetime(1997, 9, 2, 9, 0))) 3084 3085 def testToStrMonthly(self): 3086 self._rrulestr_reverse_test(rrule(MONTHLY, 3087 count=3, 3088 dtstart=datetime(1997, 9, 2, 9, 0))) 3089 3090 def testToStrMonthlyInterval(self): 3091 self._rrulestr_reverse_test(rrule(MONTHLY, 3092 count=3, 3093 interval=2, 3094 dtstart=datetime(1997, 9, 2, 9, 0))) 3095 3096 def testToStrMonthlyIntervalLarge(self): 3097 self._rrulestr_reverse_test(rrule(MONTHLY, 3098 count=3, 3099 interval=18, 3100 dtstart=datetime(1997, 9, 2, 9, 0))) 3101 3102 def testToStrMonthlyByMonth(self): 3103 self._rrulestr_reverse_test(rrule(MONTHLY, 3104 count=3, 3105 bymonth=(1, 3), 3106 dtstart=datetime(1997, 9, 2, 9, 0))) 3107 3108 def testToStrMonthlyByMonthDay(self): 3109 self._rrulestr_reverse_test(rrule(MONTHLY, 3110 count=3, 3111 bymonthday=(1, 3), 3112 dtstart=datetime(1997, 9, 2, 9, 0))) 3113 3114 def testToStrMonthlyByMonthAndMonthDay(self): 3115 self._rrulestr_reverse_test(rrule(MONTHLY, 3116 count=3, 3117 bymonth=(1, 3), 3118 bymonthday=(5, 7), 3119 dtstart=datetime(1997, 9, 2, 9, 0))) 3120 3121 def testToStrMonthlyByWeekDay(self): 3122 self._rrulestr_reverse_test(rrule(MONTHLY, 3123 count=3, 3124 byweekday=(TU, TH), 3125 dtstart=datetime(1997, 9, 2, 9, 0))) 3126 3127 # Third Monday of the month 3128 self.assertEqual(rrule(MONTHLY, 3129 byweekday=(MO(+3)), 3130 dtstart=datetime(1997, 9, 1)).between(datetime(1997, 3131 9, 3132 1), 3133 datetime(1997, 3134 12, 3135 1)), 3136 [datetime(1997, 9, 15, 0, 0), 3137 datetime(1997, 10, 20, 0, 0), 3138 datetime(1997, 11, 17, 0, 0)]) 3139 3140 def testToStrMonthlyByNWeekDay(self): 3141 self._rrulestr_reverse_test(rrule(MONTHLY, 3142 count=3, 3143 byweekday=(TU(1), TH(-1)), 3144 dtstart=datetime(1997, 9, 2, 9, 0))) 3145 3146 def testToStrMonthlyByNWeekDayLarge(self): 3147 self._rrulestr_reverse_test(rrule(MONTHLY, 3148 count=3, 3149 byweekday=(TU(3), TH(-3)), 3150 dtstart=datetime(1997, 9, 2, 9, 0))) 3151 3152 def testToStrMonthlyByMonthAndWeekDay(self): 3153 self._rrulestr_reverse_test(rrule(MONTHLY, 3154 count=3, 3155 bymonth=(1, 3), 3156 byweekday=(TU, TH), 3157 dtstart=datetime(1997, 9, 2, 9, 0))) 3158 3159 def testToStrMonthlyByMonthAndNWeekDay(self): 3160 self._rrulestr_reverse_test(rrule(MONTHLY, 3161 count=3, 3162 bymonth=(1, 3), 3163 byweekday=(TU(1), TH(-1)), 3164 dtstart=datetime(1997, 9, 2, 9, 0))) 3165 3166 def testToStrMonthlyByMonthAndNWeekDayLarge(self): 3167 self._rrulestr_reverse_test(rrule(MONTHLY, 3168 count=3, 3169 bymonth=(1, 3), 3170 byweekday=(TU(3), TH(-3)), 3171 dtstart=datetime(1997, 9, 2, 9, 0))) 3172 3173 def testToStrMonthlyByMonthDayAndWeekDay(self): 3174 self._rrulestr_reverse_test(rrule(MONTHLY, 3175 count=3, 3176 bymonthday=(1, 3), 3177 byweekday=(TU, TH), 3178 dtstart=datetime(1997, 9, 2, 9, 0))) 3179 3180 def testToStrMonthlyByMonthAndMonthDayAndWeekDay(self): 3181 self._rrulestr_reverse_test(rrule(MONTHLY, 3182 count=3, 3183 bymonth=(1, 3), 3184 bymonthday=(1, 3), 3185 byweekday=(TU, TH), 3186 dtstart=datetime(1997, 9, 2, 9, 0))) 3187 3188 def testToStrMonthlyByYearDay(self): 3189 self._rrulestr_reverse_test(rrule(MONTHLY, 3190 count=4, 3191 byyearday=(1, 100, 200, 365), 3192 dtstart=datetime(1997, 9, 2, 9, 0))) 3193 3194 def testToStrMonthlyByYearDayNeg(self): 3195 self._rrulestr_reverse_test(rrule(MONTHLY, 3196 count=4, 3197 byyearday=(-365, -266, -166, -1), 3198 dtstart=datetime(1997, 9, 2, 9, 0))) 3199 3200 def testToStrMonthlyByMonthAndYearDay(self): 3201 self._rrulestr_reverse_test(rrule(MONTHLY, 3202 count=4, 3203 bymonth=(4, 7), 3204 byyearday=(1, 100, 200, 365), 3205 dtstart=datetime(1997, 9, 2, 9, 0))) 3206 3207 def testToStrMonthlyByMonthAndYearDayNeg(self): 3208 self._rrulestr_reverse_test(rrule(MONTHLY, 3209 count=4, 3210 bymonth=(4, 7), 3211 byyearday=(-365, -266, -166, -1), 3212 dtstart=datetime(1997, 9, 2, 9, 0))) 3213 3214 def testToStrMonthlyByWeekNo(self): 3215 self._rrulestr_reverse_test(rrule(MONTHLY, 3216 count=3, 3217 byweekno=20, 3218 dtstart=datetime(1997, 9, 2, 9, 0))) 3219 3220 def testToStrMonthlyByWeekNoAndWeekDay(self): 3221 # That's a nice one. The first days of week number one 3222 # may be in the last year. 3223 self._rrulestr_reverse_test(rrule(MONTHLY, 3224 count=3, 3225 byweekno=1, 3226 byweekday=MO, 3227 dtstart=datetime(1997, 9, 2, 9, 0))) 3228 3229 def testToStrMonthlyByWeekNoAndWeekDayLarge(self): 3230 # Another nice test. The last days of week number 52/53 3231 # may be in the next year. 3232 self._rrulestr_reverse_test(rrule(MONTHLY, 3233 count=3, 3234 byweekno=52, 3235 byweekday=SU, 3236 dtstart=datetime(1997, 9, 2, 9, 0))) 3237 3238 def testToStrMonthlyByWeekNoAndWeekDayLast(self): 3239 self._rrulestr_reverse_test(rrule(MONTHLY, 3240 count=3, 3241 byweekno=-1, 3242 byweekday=SU, 3243 dtstart=datetime(1997, 9, 2, 9, 0))) 3244 3245 def testToStrMonthlyByWeekNoAndWeekDay53(self): 3246 self._rrulestr_reverse_test(rrule(MONTHLY, 3247 count=3, 3248 byweekno=53, 3249 byweekday=MO, 3250 dtstart=datetime(1997, 9, 2, 9, 0))) 3251 3252 def testToStrMonthlyByEaster(self): 3253 self._rrulestr_reverse_test(rrule(MONTHLY, 3254 count=3, 3255 byeaster=0, 3256 dtstart=datetime(1997, 9, 2, 9, 0))) 3257 3258 def testToStrMonthlyByEasterPos(self): 3259 self._rrulestr_reverse_test(rrule(MONTHLY, 3260 count=3, 3261 byeaster=1, 3262 dtstart=datetime(1997, 9, 2, 9, 0))) 3263 3264 def testToStrMonthlyByEasterNeg(self): 3265 self._rrulestr_reverse_test(rrule(MONTHLY, 3266 count=3, 3267 byeaster=-1, 3268 dtstart=datetime(1997, 9, 2, 9, 0))) 3269 3270 def testToStrMonthlyByHour(self): 3271 self._rrulestr_reverse_test(rrule(MONTHLY, 3272 count=3, 3273 byhour=(6, 18), 3274 dtstart=datetime(1997, 9, 2, 9, 0))) 3275 3276 def testToStrMonthlyByMinute(self): 3277 self._rrulestr_reverse_test(rrule(MONTHLY, 3278 count=3, 3279 byminute=(6, 18), 3280 dtstart=datetime(1997, 9, 2, 9, 0))) 3281 3282 def testToStrMonthlyBySecond(self): 3283 self._rrulestr_reverse_test(rrule(MONTHLY, 3284 count=3, 3285 bysecond=(6, 18), 3286 dtstart=datetime(1997, 9, 2, 9, 0))) 3287 3288 def testToStrMonthlyByHourAndMinute(self): 3289 self._rrulestr_reverse_test(rrule(MONTHLY, 3290 count=3, 3291 byhour=(6, 18), 3292 byminute=(6, 18), 3293 dtstart=datetime(1997, 9, 2, 9, 0))) 3294 3295 def testToStrMonthlyByHourAndSecond(self): 3296 self._rrulestr_reverse_test(rrule(MONTHLY, 3297 count=3, 3298 byhour=(6, 18), 3299 bysecond=(6, 18), 3300 dtstart=datetime(1997, 9, 2, 9, 0))) 3301 3302 def testToStrMonthlyByMinuteAndSecond(self): 3303 self._rrulestr_reverse_test(rrule(MONTHLY, 3304 count=3, 3305 byminute=(6, 18), 3306 bysecond=(6, 18), 3307 dtstart=datetime(1997, 9, 2, 9, 0))) 3308 3309 def testToStrMonthlyByHourAndMinuteAndSecond(self): 3310 self._rrulestr_reverse_test(rrule(MONTHLY, 3311 count=3, 3312 byhour=(6, 18), 3313 byminute=(6, 18), 3314 bysecond=(6, 18), 3315 dtstart=datetime(1997, 9, 2, 9, 0))) 3316 3317 def testToStrMonthlyBySetPos(self): 3318 self._rrulestr_reverse_test(rrule(MONTHLY, 3319 count=3, 3320 bymonthday=(13, 17), 3321 byhour=(6, 18), 3322 bysetpos=(3, -3), 3323 dtstart=datetime(1997, 9, 2, 9, 0))) 3324 3325 def testToStrWeekly(self): 3326 self._rrulestr_reverse_test(rrule(WEEKLY, 3327 count=3, 3328 dtstart=datetime(1997, 9, 2, 9, 0))) 3329 3330 def testToStrWeeklyInterval(self): 3331 self._rrulestr_reverse_test(rrule(WEEKLY, 3332 count=3, 3333 interval=2, 3334 dtstart=datetime(1997, 9, 2, 9, 0))) 3335 3336 def testToStrWeeklyIntervalLarge(self): 3337 self._rrulestr_reverse_test(rrule(WEEKLY, 3338 count=3, 3339 interval=20, 3340 dtstart=datetime(1997, 9, 2, 9, 0))) 3341 3342 def testToStrWeeklyByMonth(self): 3343 self._rrulestr_reverse_test(rrule(WEEKLY, 3344 count=3, 3345 bymonth=(1, 3), 3346 dtstart=datetime(1997, 9, 2, 9, 0))) 3347 3348 def testToStrWeeklyByMonthDay(self): 3349 self._rrulestr_reverse_test(rrule(WEEKLY, 3350 count=3, 3351 bymonthday=(1, 3), 3352 dtstart=datetime(1997, 9, 2, 9, 0))) 3353 3354 def testToStrWeeklyByMonthAndMonthDay(self): 3355 self._rrulestr_reverse_test(rrule(WEEKLY, 3356 count=3, 3357 bymonth=(1, 3), 3358 bymonthday=(5, 7), 3359 dtstart=datetime(1997, 9, 2, 9, 0))) 3360 3361 def testToStrWeeklyByWeekDay(self): 3362 self._rrulestr_reverse_test(rrule(WEEKLY, 3363 count=3, 3364 byweekday=(TU, TH), 3365 dtstart=datetime(1997, 9, 2, 9, 0))) 3366 3367 def testToStrWeeklyByNWeekDay(self): 3368 self._rrulestr_reverse_test(rrule(WEEKLY, 3369 count=3, 3370 byweekday=(TU(1), TH(-1)), 3371 dtstart=datetime(1997, 9, 2, 9, 0))) 3372 3373 def testToStrWeeklyByMonthAndWeekDay(self): 3374 # This test is interesting, because it crosses the year 3375 # boundary in a weekly period to find day '1' as a 3376 # valid recurrence. 3377 self._rrulestr_reverse_test(rrule(WEEKLY, 3378 count=3, 3379 bymonth=(1, 3), 3380 byweekday=(TU, TH), 3381 dtstart=datetime(1997, 9, 2, 9, 0))) 3382 3383 def testToStrWeeklyByMonthAndNWeekDay(self): 3384 self._rrulestr_reverse_test(rrule(WEEKLY, 3385 count=3, 3386 bymonth=(1, 3), 3387 byweekday=(TU(1), TH(-1)), 3388 dtstart=datetime(1997, 9, 2, 9, 0))) 3389 3390 def testToStrWeeklyByMonthDayAndWeekDay(self): 3391 self._rrulestr_reverse_test(rrule(WEEKLY, 3392 count=3, 3393 bymonthday=(1, 3), 3394 byweekday=(TU, TH), 3395 dtstart=datetime(1997, 9, 2, 9, 0))) 3396 3397 def testToStrWeeklyByMonthAndMonthDayAndWeekDay(self): 3398 self._rrulestr_reverse_test(rrule(WEEKLY, 3399 count=3, 3400 bymonth=(1, 3), 3401 bymonthday=(1, 3), 3402 byweekday=(TU, TH), 3403 dtstart=datetime(1997, 9, 2, 9, 0))) 3404 3405 def testToStrWeeklyByYearDay(self): 3406 self._rrulestr_reverse_test(rrule(WEEKLY, 3407 count=4, 3408 byyearday=(1, 100, 200, 365), 3409 dtstart=datetime(1997, 9, 2, 9, 0))) 3410 3411 def testToStrWeeklyByYearDayNeg(self): 3412 self._rrulestr_reverse_test(rrule(WEEKLY, 3413 count=4, 3414 byyearday=(-365, -266, -166, -1), 3415 dtstart=datetime(1997, 9, 2, 9, 0))) 3416 3417 def testToStrWeeklyByMonthAndYearDay(self): 3418 self._rrulestr_reverse_test(rrule(WEEKLY, 3419 count=4, 3420 bymonth=(1, 7), 3421 byyearday=(1, 100, 200, 365), 3422 dtstart=datetime(1997, 9, 2, 9, 0))) 3423 3424 def testToStrWeeklyByMonthAndYearDayNeg(self): 3425 self._rrulestr_reverse_test(rrule(WEEKLY, 3426 count=4, 3427 bymonth=(1, 7), 3428 byyearday=(-365, -266, -166, -1), 3429 dtstart=datetime(1997, 9, 2, 9, 0))) 3430 3431 def testToStrWeeklyByWeekNo(self): 3432 self._rrulestr_reverse_test(rrule(WEEKLY, 3433 count=3, 3434 byweekno=20, 3435 dtstart=datetime(1997, 9, 2, 9, 0))) 3436 3437 def testToStrWeeklyByWeekNoAndWeekDay(self): 3438 # That's a nice one. The first days of week number one 3439 # may be in the last year. 3440 self._rrulestr_reverse_test(rrule(WEEKLY, 3441 count=3, 3442 byweekno=1, 3443 byweekday=MO, 3444 dtstart=datetime(1997, 9, 2, 9, 0))) 3445 3446 def testToStrWeeklyByWeekNoAndWeekDayLarge(self): 3447 # Another nice test. The last days of week number 52/53 3448 # may be in the next year. 3449 self._rrulestr_reverse_test(rrule(WEEKLY, 3450 count=3, 3451 byweekno=52, 3452 byweekday=SU, 3453 dtstart=datetime(1997, 9, 2, 9, 0))) 3454 3455 def testToStrWeeklyByWeekNoAndWeekDayLast(self): 3456 self._rrulestr_reverse_test(rrule(WEEKLY, 3457 count=3, 3458 byweekno=-1, 3459 byweekday=SU, 3460 dtstart=datetime(1997, 9, 2, 9, 0))) 3461 3462 def testToStrWeeklyByWeekNoAndWeekDay53(self): 3463 self._rrulestr_reverse_test(rrule(WEEKLY, 3464 count=3, 3465 byweekno=53, 3466 byweekday=MO, 3467 dtstart=datetime(1997, 9, 2, 9, 0))) 3468 3469 def testToStrWeeklyByEaster(self): 3470 self._rrulestr_reverse_test(rrule(WEEKLY, 3471 count=3, 3472 byeaster=0, 3473 dtstart=datetime(1997, 9, 2, 9, 0))) 3474 3475 def testToStrWeeklyByEasterPos(self): 3476 self._rrulestr_reverse_test(rrule(WEEKLY, 3477 count=3, 3478 byeaster=1, 3479 dtstart=datetime(1997, 9, 2, 9, 0))) 3480 3481 def testToStrWeeklyByEasterNeg(self): 3482 self._rrulestr_reverse_test(rrule(WEEKLY, 3483 count=3, 3484 byeaster=-1, 3485 dtstart=datetime(1997, 9, 2, 9, 0))) 3486 3487 def testToStrWeeklyByHour(self): 3488 self._rrulestr_reverse_test(rrule(WEEKLY, 3489 count=3, 3490 byhour=(6, 18), 3491 dtstart=datetime(1997, 9, 2, 9, 0))) 3492 3493 def testToStrWeeklyByMinute(self): 3494 self._rrulestr_reverse_test(rrule(WEEKLY, 3495 count=3, 3496 byminute=(6, 18), 3497 dtstart=datetime(1997, 9, 2, 9, 0))) 3498 3499 def testToStrWeeklyBySecond(self): 3500 self._rrulestr_reverse_test(rrule(WEEKLY, 3501 count=3, 3502 bysecond=(6, 18), 3503 dtstart=datetime(1997, 9, 2, 9, 0))) 3504 3505 def testToStrWeeklyByHourAndMinute(self): 3506 self._rrulestr_reverse_test(rrule(WEEKLY, 3507 count=3, 3508 byhour=(6, 18), 3509 byminute=(6, 18), 3510 dtstart=datetime(1997, 9, 2, 9, 0))) 3511 3512 def testToStrWeeklyByHourAndSecond(self): 3513 self._rrulestr_reverse_test(rrule(WEEKLY, 3514 count=3, 3515 byhour=(6, 18), 3516 bysecond=(6, 18), 3517 dtstart=datetime(1997, 9, 2, 9, 0))) 3518 3519 def testToStrWeeklyByMinuteAndSecond(self): 3520 self._rrulestr_reverse_test(rrule(WEEKLY, 3521 count=3, 3522 byminute=(6, 18), 3523 bysecond=(6, 18), 3524 dtstart=datetime(1997, 9, 2, 9, 0))) 3525 3526 def testToStrWeeklyByHourAndMinuteAndSecond(self): 3527 self._rrulestr_reverse_test(rrule(WEEKLY, 3528 count=3, 3529 byhour=(6, 18), 3530 byminute=(6, 18), 3531 bysecond=(6, 18), 3532 dtstart=datetime(1997, 9, 2, 9, 0))) 3533 3534 def testToStrWeeklyBySetPos(self): 3535 self._rrulestr_reverse_test(rrule(WEEKLY, 3536 count=3, 3537 byweekday=(TU, TH), 3538 byhour=(6, 18), 3539 bysetpos=(3, -3), 3540 dtstart=datetime(1997, 9, 2, 9, 0))) 3541 3542 def testToStrDaily(self): 3543 self._rrulestr_reverse_test(rrule(DAILY, 3544 count=3, 3545 dtstart=datetime(1997, 9, 2, 9, 0))) 3546 3547 def testToStrDailyInterval(self): 3548 self._rrulestr_reverse_test(rrule(DAILY, 3549 count=3, 3550 interval=2, 3551 dtstart=datetime(1997, 9, 2, 9, 0))) 3552 3553 def testToStrDailyIntervalLarge(self): 3554 self._rrulestr_reverse_test(rrule(DAILY, 3555 count=3, 3556 interval=92, 3557 dtstart=datetime(1997, 9, 2, 9, 0))) 3558 3559 def testToStrDailyByMonth(self): 3560 self._rrulestr_reverse_test(rrule(DAILY, 3561 count=3, 3562 bymonth=(1, 3), 3563 dtstart=datetime(1997, 9, 2, 9, 0))) 3564 3565 def testToStrDailyByMonthDay(self): 3566 self._rrulestr_reverse_test(rrule(DAILY, 3567 count=3, 3568 bymonthday=(1, 3), 3569 dtstart=datetime(1997, 9, 2, 9, 0))) 3570 3571 def testToStrDailyByMonthAndMonthDay(self): 3572 self._rrulestr_reverse_test(rrule(DAILY, 3573 count=3, 3574 bymonth=(1, 3), 3575 bymonthday=(5, 7), 3576 dtstart=datetime(1997, 9, 2, 9, 0))) 3577 3578 def testToStrDailyByWeekDay(self): 3579 self._rrulestr_reverse_test(rrule(DAILY, 3580 count=3, 3581 byweekday=(TU, TH), 3582 dtstart=datetime(1997, 9, 2, 9, 0))) 3583 3584 def testToStrDailyByNWeekDay(self): 3585 self._rrulestr_reverse_test(rrule(DAILY, 3586 count=3, 3587 byweekday=(TU(1), TH(-1)), 3588 dtstart=datetime(1997, 9, 2, 9, 0))) 3589 3590 def testToStrDailyByMonthAndWeekDay(self): 3591 self._rrulestr_reverse_test(rrule(DAILY, 3592 count=3, 3593 bymonth=(1, 3), 3594 byweekday=(TU, TH), 3595 dtstart=datetime(1997, 9, 2, 9, 0))) 3596 3597 def testToStrDailyByMonthAndNWeekDay(self): 3598 self._rrulestr_reverse_test(rrule(DAILY, 3599 count=3, 3600 bymonth=(1, 3), 3601 byweekday=(TU(1), TH(-1)), 3602 dtstart=datetime(1997, 9, 2, 9, 0))) 3603 3604 def testToStrDailyByMonthDayAndWeekDay(self): 3605 self._rrulestr_reverse_test(rrule(DAILY, 3606 count=3, 3607 bymonthday=(1, 3), 3608 byweekday=(TU, TH), 3609 dtstart=datetime(1997, 9, 2, 9, 0))) 3610 3611 def testToStrDailyByMonthAndMonthDayAndWeekDay(self): 3612 self._rrulestr_reverse_test(rrule(DAILY, 3613 count=3, 3614 bymonth=(1, 3), 3615 bymonthday=(1, 3), 3616 byweekday=(TU, TH), 3617 dtstart=datetime(1997, 9, 2, 9, 0))) 3618 3619 def testToStrDailyByYearDay(self): 3620 self._rrulestr_reverse_test(rrule(DAILY, 3621 count=4, 3622 byyearday=(1, 100, 200, 365), 3623 dtstart=datetime(1997, 9, 2, 9, 0))) 3624 3625 def testToStrDailyByYearDayNeg(self): 3626 self._rrulestr_reverse_test(rrule(DAILY, 3627 count=4, 3628 byyearday=(-365, -266, -166, -1), 3629 dtstart=datetime(1997, 9, 2, 9, 0))) 3630 3631 def testToStrDailyByMonthAndYearDay(self): 3632 self._rrulestr_reverse_test(rrule(DAILY, 3633 count=4, 3634 bymonth=(1, 7), 3635 byyearday=(1, 100, 200, 365), 3636 dtstart=datetime(1997, 9, 2, 9, 0))) 3637 3638 def testToStrDailyByMonthAndYearDayNeg(self): 3639 self._rrulestr_reverse_test(rrule(DAILY, 3640 count=4, 3641 bymonth=(1, 7), 3642 byyearday=(-365, -266, -166, -1), 3643 dtstart=datetime(1997, 9, 2, 9, 0))) 3644 3645 def testToStrDailyByWeekNo(self): 3646 self._rrulestr_reverse_test(rrule(DAILY, 3647 count=3, 3648 byweekno=20, 3649 dtstart=datetime(1997, 9, 2, 9, 0))) 3650 3651 def testToStrDailyByWeekNoAndWeekDay(self): 3652 # That's a nice one. The first days of week number one 3653 # may be in the last year. 3654 self._rrulestr_reverse_test(rrule(DAILY, 3655 count=3, 3656 byweekno=1, 3657 byweekday=MO, 3658 dtstart=datetime(1997, 9, 2, 9, 0))) 3659 3660 def testToStrDailyByWeekNoAndWeekDayLarge(self): 3661 # Another nice test. The last days of week number 52/53 3662 # may be in the next year. 3663 self._rrulestr_reverse_test(rrule(DAILY, 3664 count=3, 3665 byweekno=52, 3666 byweekday=SU, 3667 dtstart=datetime(1997, 9, 2, 9, 0))) 3668 3669 def testToStrDailyByWeekNoAndWeekDayLast(self): 3670 self._rrulestr_reverse_test(rrule(DAILY, 3671 count=3, 3672 byweekno=-1, 3673 byweekday=SU, 3674 dtstart=datetime(1997, 9, 2, 9, 0))) 3675 3676 def testToStrDailyByWeekNoAndWeekDay53(self): 3677 self._rrulestr_reverse_test(rrule(DAILY, 3678 count=3, 3679 byweekno=53, 3680 byweekday=MO, 3681 dtstart=datetime(1997, 9, 2, 9, 0))) 3682 3683 def testToStrDailyByEaster(self): 3684 self._rrulestr_reverse_test(rrule(DAILY, 3685 count=3, 3686 byeaster=0, 3687 dtstart=datetime(1997, 9, 2, 9, 0))) 3688 3689 def testToStrDailyByEasterPos(self): 3690 self._rrulestr_reverse_test(rrule(DAILY, 3691 count=3, 3692 byeaster=1, 3693 dtstart=datetime(1997, 9, 2, 9, 0))) 3694 3695 def testToStrDailyByEasterNeg(self): 3696 self._rrulestr_reverse_test(rrule(DAILY, 3697 count=3, 3698 byeaster=-1, 3699 dtstart=datetime(1997, 9, 2, 9, 0))) 3700 3701 def testToStrDailyByHour(self): 3702 self._rrulestr_reverse_test(rrule(DAILY, 3703 count=3, 3704 byhour=(6, 18), 3705 dtstart=datetime(1997, 9, 2, 9, 0))) 3706 3707 def testToStrDailyByMinute(self): 3708 self._rrulestr_reverse_test(rrule(DAILY, 3709 count=3, 3710 byminute=(6, 18), 3711 dtstart=datetime(1997, 9, 2, 9, 0))) 3712 3713 def testToStrDailyBySecond(self): 3714 self._rrulestr_reverse_test(rrule(DAILY, 3715 count=3, 3716 bysecond=(6, 18), 3717 dtstart=datetime(1997, 9, 2, 9, 0))) 3718 3719 def testToStrDailyByHourAndMinute(self): 3720 self._rrulestr_reverse_test(rrule(DAILY, 3721 count=3, 3722 byhour=(6, 18), 3723 byminute=(6, 18), 3724 dtstart=datetime(1997, 9, 2, 9, 0))) 3725 3726 def testToStrDailyByHourAndSecond(self): 3727 self._rrulestr_reverse_test(rrule(DAILY, 3728 count=3, 3729 byhour=(6, 18), 3730 bysecond=(6, 18), 3731 dtstart=datetime(1997, 9, 2, 9, 0))) 3732 3733 def testToStrDailyByMinuteAndSecond(self): 3734 self._rrulestr_reverse_test(rrule(DAILY, 3735 count=3, 3736 byminute=(6, 18), 3737 bysecond=(6, 18), 3738 dtstart=datetime(1997, 9, 2, 9, 0))) 3739 3740 def testToStrDailyByHourAndMinuteAndSecond(self): 3741 self._rrulestr_reverse_test(rrule(DAILY, 3742 count=3, 3743 byhour=(6, 18), 3744 byminute=(6, 18), 3745 bysecond=(6, 18), 3746 dtstart=datetime(1997, 9, 2, 9, 0))) 3747 3748 def testToStrDailyBySetPos(self): 3749 self._rrulestr_reverse_test(rrule(DAILY, 3750 count=3, 3751 byhour=(6, 18), 3752 byminute=(15, 45), 3753 bysetpos=(3, -3), 3754 dtstart=datetime(1997, 9, 2, 9, 0))) 3755 3756 def testToStrHourly(self): 3757 self._rrulestr_reverse_test(rrule(HOURLY, 3758 count=3, 3759 dtstart=datetime(1997, 9, 2, 9, 0))) 3760 3761 def testToStrHourlyInterval(self): 3762 self._rrulestr_reverse_test(rrule(HOURLY, 3763 count=3, 3764 interval=2, 3765 dtstart=datetime(1997, 9, 2, 9, 0))) 3766 3767 def testToStrHourlyIntervalLarge(self): 3768 self._rrulestr_reverse_test(rrule(HOURLY, 3769 count=3, 3770 interval=769, 3771 dtstart=datetime(1997, 9, 2, 9, 0))) 3772 3773 def testToStrHourlyByMonth(self): 3774 self._rrulestr_reverse_test(rrule(HOURLY, 3775 count=3, 3776 bymonth=(1, 3), 3777 dtstart=datetime(1997, 9, 2, 9, 0))) 3778 3779 def testToStrHourlyByMonthDay(self): 3780 self._rrulestr_reverse_test(rrule(HOURLY, 3781 count=3, 3782 bymonthday=(1, 3), 3783 dtstart=datetime(1997, 9, 2, 9, 0))) 3784 3785 def testToStrHourlyByMonthAndMonthDay(self): 3786 self._rrulestr_reverse_test(rrule(HOURLY, 3787 count=3, 3788 bymonth=(1, 3), 3789 bymonthday=(5, 7), 3790 dtstart=datetime(1997, 9, 2, 9, 0))) 3791 3792 def testToStrHourlyByWeekDay(self): 3793 self._rrulestr_reverse_test(rrule(HOURLY, 3794 count=3, 3795 byweekday=(TU, TH), 3796 dtstart=datetime(1997, 9, 2, 9, 0))) 3797 3798 def testToStrHourlyByNWeekDay(self): 3799 self._rrulestr_reverse_test(rrule(HOURLY, 3800 count=3, 3801 byweekday=(TU(1), TH(-1)), 3802 dtstart=datetime(1997, 9, 2, 9, 0))) 3803 3804 def testToStrHourlyByMonthAndWeekDay(self): 3805 self._rrulestr_reverse_test(rrule(HOURLY, 3806 count=3, 3807 bymonth=(1, 3), 3808 byweekday=(TU, TH), 3809 dtstart=datetime(1997, 9, 2, 9, 0))) 3810 3811 def testToStrHourlyByMonthAndNWeekDay(self): 3812 self._rrulestr_reverse_test(rrule(HOURLY, 3813 count=3, 3814 bymonth=(1, 3), 3815 byweekday=(TU(1), TH(-1)), 3816 dtstart=datetime(1997, 9, 2, 9, 0))) 3817 3818 def testToStrHourlyByMonthDayAndWeekDay(self): 3819 self._rrulestr_reverse_test(rrule(HOURLY, 3820 count=3, 3821 bymonthday=(1, 3), 3822 byweekday=(TU, TH), 3823 dtstart=datetime(1997, 9, 2, 9, 0))) 3824 3825 def testToStrHourlyByMonthAndMonthDayAndWeekDay(self): 3826 self._rrulestr_reverse_test(rrule(HOURLY, 3827 count=3, 3828 bymonth=(1, 3), 3829 bymonthday=(1, 3), 3830 byweekday=(TU, TH), 3831 dtstart=datetime(1997, 9, 2, 9, 0))) 3832 3833 def testToStrHourlyByYearDay(self): 3834 self._rrulestr_reverse_test(rrule(HOURLY, 3835 count=4, 3836 byyearday=(1, 100, 200, 365), 3837 dtstart=datetime(1997, 9, 2, 9, 0))) 3838 3839 def testToStrHourlyByYearDayNeg(self): 3840 self._rrulestr_reverse_test(rrule(HOURLY, 3841 count=4, 3842 byyearday=(-365, -266, -166, -1), 3843 dtstart=datetime(1997, 9, 2, 9, 0))) 3844 3845 def testToStrHourlyByMonthAndYearDay(self): 3846 self._rrulestr_reverse_test(rrule(HOURLY, 3847 count=4, 3848 bymonth=(4, 7), 3849 byyearday=(1, 100, 200, 365), 3850 dtstart=datetime(1997, 9, 2, 9, 0))) 3851 3852 def testToStrHourlyByMonthAndYearDayNeg(self): 3853 self._rrulestr_reverse_test(rrule(HOURLY, 3854 count=4, 3855 bymonth=(4, 7), 3856 byyearday=(-365, -266, -166, -1), 3857 dtstart=datetime(1997, 9, 2, 9, 0))) 3858 3859 def testToStrHourlyByWeekNo(self): 3860 self._rrulestr_reverse_test(rrule(HOURLY, 3861 count=3, 3862 byweekno=20, 3863 dtstart=datetime(1997, 9, 2, 9, 0))) 3864 3865 def testToStrHourlyByWeekNoAndWeekDay(self): 3866 self._rrulestr_reverse_test(rrule(HOURLY, 3867 count=3, 3868 byweekno=1, 3869 byweekday=MO, 3870 dtstart=datetime(1997, 9, 2, 9, 0))) 3871 3872 def testToStrHourlyByWeekNoAndWeekDayLarge(self): 3873 self._rrulestr_reverse_test(rrule(HOURLY, 3874 count=3, 3875 byweekno=52, 3876 byweekday=SU, 3877 dtstart=datetime(1997, 9, 2, 9, 0))) 3878 3879 def testToStrHourlyByWeekNoAndWeekDayLast(self): 3880 self._rrulestr_reverse_test(rrule(HOURLY, 3881 count=3, 3882 byweekno=-1, 3883 byweekday=SU, 3884 dtstart=datetime(1997, 9, 2, 9, 0))) 3885 3886 def testToStrHourlyByWeekNoAndWeekDay53(self): 3887 self._rrulestr_reverse_test(rrule(HOURLY, 3888 count=3, 3889 byweekno=53, 3890 byweekday=MO, 3891 dtstart=datetime(1997, 9, 2, 9, 0))) 3892 3893 def testToStrHourlyByEaster(self): 3894 self._rrulestr_reverse_test(rrule(HOURLY, 3895 count=3, 3896 byeaster=0, 3897 dtstart=datetime(1997, 9, 2, 9, 0))) 3898 3899 def testToStrHourlyByEasterPos(self): 3900 self._rrulestr_reverse_test(rrule(HOURLY, 3901 count=3, 3902 byeaster=1, 3903 dtstart=datetime(1997, 9, 2, 9, 0))) 3904 3905 def testToStrHourlyByEasterNeg(self): 3906 self._rrulestr_reverse_test(rrule(HOURLY, 3907 count=3, 3908 byeaster=-1, 3909 dtstart=datetime(1997, 9, 2, 9, 0))) 3910 3911 def testToStrHourlyByHour(self): 3912 self._rrulestr_reverse_test(rrule(HOURLY, 3913 count=3, 3914 byhour=(6, 18), 3915 dtstart=datetime(1997, 9, 2, 9, 0))) 3916 3917 def testToStrHourlyByMinute(self): 3918 self._rrulestr_reverse_test(rrule(HOURLY, 3919 count=3, 3920 byminute=(6, 18), 3921 dtstart=datetime(1997, 9, 2, 9, 0))) 3922 3923 def testToStrHourlyBySecond(self): 3924 self._rrulestr_reverse_test(rrule(HOURLY, 3925 count=3, 3926 bysecond=(6, 18), 3927 dtstart=datetime(1997, 9, 2, 9, 0))) 3928 3929 def testToStrHourlyByHourAndMinute(self): 3930 self._rrulestr_reverse_test(rrule(HOURLY, 3931 count=3, 3932 byhour=(6, 18), 3933 byminute=(6, 18), 3934 dtstart=datetime(1997, 9, 2, 9, 0))) 3935 3936 def testToStrHourlyByHourAndSecond(self): 3937 self._rrulestr_reverse_test(rrule(HOURLY, 3938 count=3, 3939 byhour=(6, 18), 3940 bysecond=(6, 18), 3941 dtstart=datetime(1997, 9, 2, 9, 0))) 3942 3943 def testToStrHourlyByMinuteAndSecond(self): 3944 self._rrulestr_reverse_test(rrule(HOURLY, 3945 count=3, 3946 byminute=(6, 18), 3947 bysecond=(6, 18), 3948 dtstart=datetime(1997, 9, 2, 9, 0))) 3949 3950 def testToStrHourlyByHourAndMinuteAndSecond(self): 3951 self._rrulestr_reverse_test(rrule(HOURLY, 3952 count=3, 3953 byhour=(6, 18), 3954 byminute=(6, 18), 3955 bysecond=(6, 18), 3956 dtstart=datetime(1997, 9, 2, 9, 0))) 3957 3958 def testToStrHourlyBySetPos(self): 3959 self._rrulestr_reverse_test(rrule(HOURLY, 3960 count=3, 3961 byminute=(15, 45), 3962 bysecond=(15, 45), 3963 bysetpos=(3, -3), 3964 dtstart=datetime(1997, 9, 2, 9, 0))) 3965 3966 def testToStrMinutely(self): 3967 self._rrulestr_reverse_test(rrule(MINUTELY, 3968 count=3, 3969 dtstart=datetime(1997, 9, 2, 9, 0))) 3970 3971 def testToStrMinutelyInterval(self): 3972 self._rrulestr_reverse_test(rrule(MINUTELY, 3973 count=3, 3974 interval=2, 3975 dtstart=datetime(1997, 9, 2, 9, 0))) 3976 3977 def testToStrMinutelyIntervalLarge(self): 3978 self._rrulestr_reverse_test(rrule(MINUTELY, 3979 count=3, 3980 interval=1501, 3981 dtstart=datetime(1997, 9, 2, 9, 0))) 3982 3983 def testToStrMinutelyByMonth(self): 3984 self._rrulestr_reverse_test(rrule(MINUTELY, 3985 count=3, 3986 bymonth=(1, 3), 3987 dtstart=datetime(1997, 9, 2, 9, 0))) 3988 3989 def testToStrMinutelyByMonthDay(self): 3990 self._rrulestr_reverse_test(rrule(MINUTELY, 3991 count=3, 3992 bymonthday=(1, 3), 3993 dtstart=datetime(1997, 9, 2, 9, 0))) 3994 3995 def testToStrMinutelyByMonthAndMonthDay(self): 3996 self._rrulestr_reverse_test(rrule(MINUTELY, 3997 count=3, 3998 bymonth=(1, 3), 3999 bymonthday=(5, 7), 4000 dtstart=datetime(1997, 9, 2, 9, 0))) 4001 4002 def testToStrMinutelyByWeekDay(self): 4003 self._rrulestr_reverse_test(rrule(MINUTELY, 4004 count=3, 4005 byweekday=(TU, TH), 4006 dtstart=datetime(1997, 9, 2, 9, 0))) 4007 4008 def testToStrMinutelyByNWeekDay(self): 4009 self._rrulestr_reverse_test(rrule(MINUTELY, 4010 count=3, 4011 byweekday=(TU(1), TH(-1)), 4012 dtstart=datetime(1997, 9, 2, 9, 0))) 4013 4014 def testToStrMinutelyByMonthAndWeekDay(self): 4015 self._rrulestr_reverse_test(rrule(MINUTELY, 4016 count=3, 4017 bymonth=(1, 3), 4018 byweekday=(TU, TH), 4019 dtstart=datetime(1997, 9, 2, 9, 0))) 4020 4021 def testToStrMinutelyByMonthAndNWeekDay(self): 4022 self._rrulestr_reverse_test(rrule(MINUTELY, 4023 count=3, 4024 bymonth=(1, 3), 4025 byweekday=(TU(1), TH(-1)), 4026 dtstart=datetime(1997, 9, 2, 9, 0))) 4027 4028 def testToStrMinutelyByMonthDayAndWeekDay(self): 4029 self._rrulestr_reverse_test(rrule(MINUTELY, 4030 count=3, 4031 bymonthday=(1, 3), 4032 byweekday=(TU, TH), 4033 dtstart=datetime(1997, 9, 2, 9, 0))) 4034 4035 def testToStrMinutelyByMonthAndMonthDayAndWeekDay(self): 4036 self._rrulestr_reverse_test(rrule(MINUTELY, 4037 count=3, 4038 bymonth=(1, 3), 4039 bymonthday=(1, 3), 4040 byweekday=(TU, TH), 4041 dtstart=datetime(1997, 9, 2, 9, 0))) 4042 4043 def testToStrMinutelyByYearDay(self): 4044 self._rrulestr_reverse_test(rrule(MINUTELY, 4045 count=4, 4046 byyearday=(1, 100, 200, 365), 4047 dtstart=datetime(1997, 9, 2, 9, 0))) 4048 4049 def testToStrMinutelyByYearDayNeg(self): 4050 self._rrulestr_reverse_test(rrule(MINUTELY, 4051 count=4, 4052 byyearday=(-365, -266, -166, -1), 4053 dtstart=datetime(1997, 9, 2, 9, 0))) 4054 4055 def testToStrMinutelyByMonthAndYearDay(self): 4056 self._rrulestr_reverse_test(rrule(MINUTELY, 4057 count=4, 4058 bymonth=(4, 7), 4059 byyearday=(1, 100, 200, 365), 4060 dtstart=datetime(1997, 9, 2, 9, 0))) 4061 4062 def testToStrMinutelyByMonthAndYearDayNeg(self): 4063 self._rrulestr_reverse_test(rrule(MINUTELY, 4064 count=4, 4065 bymonth=(4, 7), 4066 byyearday=(-365, -266, -166, -1), 4067 dtstart=datetime(1997, 9, 2, 9, 0))) 4068 4069 def testToStrMinutelyByWeekNo(self): 4070 self._rrulestr_reverse_test(rrule(MINUTELY, 4071 count=3, 4072 byweekno=20, 4073 dtstart=datetime(1997, 9, 2, 9, 0))) 4074 4075 def testToStrMinutelyByWeekNoAndWeekDay(self): 4076 self._rrulestr_reverse_test(rrule(MINUTELY, 4077 count=3, 4078 byweekno=1, 4079 byweekday=MO, 4080 dtstart=datetime(1997, 9, 2, 9, 0))) 4081 4082 def testToStrMinutelyByWeekNoAndWeekDayLarge(self): 4083 self._rrulestr_reverse_test(rrule(MINUTELY, 4084 count=3, 4085 byweekno=52, 4086 byweekday=SU, 4087 dtstart=datetime(1997, 9, 2, 9, 0))) 4088 4089 def testToStrMinutelyByWeekNoAndWeekDayLast(self): 4090 self._rrulestr_reverse_test(rrule(MINUTELY, 4091 count=3, 4092 byweekno=-1, 4093 byweekday=SU, 4094 dtstart=datetime(1997, 9, 2, 9, 0))) 4095 4096 def testToStrMinutelyByWeekNoAndWeekDay53(self): 4097 self._rrulestr_reverse_test(rrule(MINUTELY, 4098 count=3, 4099 byweekno=53, 4100 byweekday=MO, 4101 dtstart=datetime(1997, 9, 2, 9, 0))) 4102 4103 def testToStrMinutelyByEaster(self): 4104 self._rrulestr_reverse_test(rrule(MINUTELY, 4105 count=3, 4106 byeaster=0, 4107 dtstart=datetime(1997, 9, 2, 9, 0))) 4108 4109 def testToStrMinutelyByEasterPos(self): 4110 self._rrulestr_reverse_test(rrule(MINUTELY, 4111 count=3, 4112 byeaster=1, 4113 dtstart=datetime(1997, 9, 2, 9, 0))) 4114 4115 def testToStrMinutelyByEasterNeg(self): 4116 self._rrulestr_reverse_test(rrule(MINUTELY, 4117 count=3, 4118 byeaster=-1, 4119 dtstart=datetime(1997, 9, 2, 9, 0))) 4120 4121 def testToStrMinutelyByHour(self): 4122 self._rrulestr_reverse_test(rrule(MINUTELY, 4123 count=3, 4124 byhour=(6, 18), 4125 dtstart=datetime(1997, 9, 2, 9, 0))) 4126 4127 def testToStrMinutelyByMinute(self): 4128 self._rrulestr_reverse_test(rrule(MINUTELY, 4129 count=3, 4130 byminute=(6, 18), 4131 dtstart=datetime(1997, 9, 2, 9, 0))) 4132 4133 def testToStrMinutelyBySecond(self): 4134 self._rrulestr_reverse_test(rrule(MINUTELY, 4135 count=3, 4136 bysecond=(6, 18), 4137 dtstart=datetime(1997, 9, 2, 9, 0))) 4138 4139 def testToStrMinutelyByHourAndMinute(self): 4140 self._rrulestr_reverse_test(rrule(MINUTELY, 4141 count=3, 4142 byhour=(6, 18), 4143 byminute=(6, 18), 4144 dtstart=datetime(1997, 9, 2, 9, 0))) 4145 4146 def testToStrMinutelyByHourAndSecond(self): 4147 self._rrulestr_reverse_test(rrule(MINUTELY, 4148 count=3, 4149 byhour=(6, 18), 4150 bysecond=(6, 18), 4151 dtstart=datetime(1997, 9, 2, 9, 0))) 4152 4153 def testToStrMinutelyByMinuteAndSecond(self): 4154 self._rrulestr_reverse_test(rrule(MINUTELY, 4155 count=3, 4156 byminute=(6, 18), 4157 bysecond=(6, 18), 4158 dtstart=datetime(1997, 9, 2, 9, 0))) 4159 4160 def testToStrMinutelyByHourAndMinuteAndSecond(self): 4161 self._rrulestr_reverse_test(rrule(MINUTELY, 4162 count=3, 4163 byhour=(6, 18), 4164 byminute=(6, 18), 4165 bysecond=(6, 18), 4166 dtstart=datetime(1997, 9, 2, 9, 0))) 4167 4168 def testToStrMinutelyBySetPos(self): 4169 self._rrulestr_reverse_test(rrule(MINUTELY, 4170 count=3, 4171 bysecond=(15, 30, 45), 4172 bysetpos=(3, -3), 4173 dtstart=datetime(1997, 9, 2, 9, 0))) 4174 4175 def testToStrSecondly(self): 4176 self._rrulestr_reverse_test(rrule(SECONDLY, 4177 count=3, 4178 dtstart=datetime(1997, 9, 2, 9, 0))) 4179 4180 def testToStrSecondlyInterval(self): 4181 self._rrulestr_reverse_test(rrule(SECONDLY, 4182 count=3, 4183 interval=2, 4184 dtstart=datetime(1997, 9, 2, 9, 0))) 4185 4186 def testToStrSecondlyIntervalLarge(self): 4187 self._rrulestr_reverse_test(rrule(SECONDLY, 4188 count=3, 4189 interval=90061, 4190 dtstart=datetime(1997, 9, 2, 9, 0))) 4191 4192 def testToStrSecondlyByMonth(self): 4193 self._rrulestr_reverse_test(rrule(SECONDLY, 4194 count=3, 4195 bymonth=(1, 3), 4196 dtstart=datetime(1997, 9, 2, 9, 0))) 4197 4198 def testToStrSecondlyByMonthDay(self): 4199 self._rrulestr_reverse_test(rrule(SECONDLY, 4200 count=3, 4201 bymonthday=(1, 3), 4202 dtstart=datetime(1997, 9, 2, 9, 0))) 4203 4204 def testToStrSecondlyByMonthAndMonthDay(self): 4205 self._rrulestr_reverse_test(rrule(SECONDLY, 4206 count=3, 4207 bymonth=(1, 3), 4208 bymonthday=(5, 7), 4209 dtstart=datetime(1997, 9, 2, 9, 0))) 4210 4211 def testToStrSecondlyByWeekDay(self): 4212 self._rrulestr_reverse_test(rrule(SECONDLY, 4213 count=3, 4214 byweekday=(TU, TH), 4215 dtstart=datetime(1997, 9, 2, 9, 0))) 4216 4217 def testToStrSecondlyByNWeekDay(self): 4218 self._rrulestr_reverse_test(rrule(SECONDLY, 4219 count=3, 4220 byweekday=(TU(1), TH(-1)), 4221 dtstart=datetime(1997, 9, 2, 9, 0))) 4222 4223 def testToStrSecondlyByMonthAndWeekDay(self): 4224 self._rrulestr_reverse_test(rrule(SECONDLY, 4225 count=3, 4226 bymonth=(1, 3), 4227 byweekday=(TU, TH), 4228 dtstart=datetime(1997, 9, 2, 9, 0))) 4229 4230 def testToStrSecondlyByMonthAndNWeekDay(self): 4231 self._rrulestr_reverse_test(rrule(SECONDLY, 4232 count=3, 4233 bymonth=(1, 3), 4234 byweekday=(TU(1), TH(-1)), 4235 dtstart=datetime(1997, 9, 2, 9, 0))) 4236 4237 def testToStrSecondlyByMonthDayAndWeekDay(self): 4238 self._rrulestr_reverse_test(rrule(SECONDLY, 4239 count=3, 4240 bymonthday=(1, 3), 4241 byweekday=(TU, TH), 4242 dtstart=datetime(1997, 9, 2, 9, 0))) 4243 4244 def testToStrSecondlyByMonthAndMonthDayAndWeekDay(self): 4245 self._rrulestr_reverse_test(rrule(SECONDLY, 4246 count=3, 4247 bymonth=(1, 3), 4248 bymonthday=(1, 3), 4249 byweekday=(TU, TH), 4250 dtstart=datetime(1997, 9, 2, 9, 0))) 4251 4252 def testToStrSecondlyByYearDay(self): 4253 self._rrulestr_reverse_test(rrule(SECONDLY, 4254 count=4, 4255 byyearday=(1, 100, 200, 365), 4256 dtstart=datetime(1997, 9, 2, 9, 0))) 4257 4258 def testToStrSecondlyByYearDayNeg(self): 4259 self._rrulestr_reverse_test(rrule(SECONDLY, 4260 count=4, 4261 byyearday=(-365, -266, -166, -1), 4262 dtstart=datetime(1997, 9, 2, 9, 0))) 4263 4264 def testToStrSecondlyByMonthAndYearDay(self): 4265 self._rrulestr_reverse_test(rrule(SECONDLY, 4266 count=4, 4267 bymonth=(4, 7), 4268 byyearday=(1, 100, 200, 365), 4269 dtstart=datetime(1997, 9, 2, 9, 0))) 4270 4271 def testToStrSecondlyByMonthAndYearDayNeg(self): 4272 self._rrulestr_reverse_test(rrule(SECONDLY, 4273 count=4, 4274 bymonth=(4, 7), 4275 byyearday=(-365, -266, -166, -1), 4276 dtstart=datetime(1997, 9, 2, 9, 0))) 4277 4278 def testToStrSecondlyByWeekNo(self): 4279 self._rrulestr_reverse_test(rrule(SECONDLY, 4280 count=3, 4281 byweekno=20, 4282 dtstart=datetime(1997, 9, 2, 9, 0))) 4283 4284 def testToStrSecondlyByWeekNoAndWeekDay(self): 4285 self._rrulestr_reverse_test(rrule(SECONDLY, 4286 count=3, 4287 byweekno=1, 4288 byweekday=MO, 4289 dtstart=datetime(1997, 9, 2, 9, 0))) 4290 4291 def testToStrSecondlyByWeekNoAndWeekDayLarge(self): 4292 self._rrulestr_reverse_test(rrule(SECONDLY, 4293 count=3, 4294 byweekno=52, 4295 byweekday=SU, 4296 dtstart=datetime(1997, 9, 2, 9, 0))) 4297 4298 def testToStrSecondlyByWeekNoAndWeekDayLast(self): 4299 self._rrulestr_reverse_test(rrule(SECONDLY, 4300 count=3, 4301 byweekno=-1, 4302 byweekday=SU, 4303 dtstart=datetime(1997, 9, 2, 9, 0))) 4304 4305 def testToStrSecondlyByWeekNoAndWeekDay53(self): 4306 self._rrulestr_reverse_test(rrule(SECONDLY, 4307 count=3, 4308 byweekno=53, 4309 byweekday=MO, 4310 dtstart=datetime(1997, 9, 2, 9, 0))) 4311 4312 def testToStrSecondlyByEaster(self): 4313 self._rrulestr_reverse_test(rrule(SECONDLY, 4314 count=3, 4315 byeaster=0, 4316 dtstart=datetime(1997, 9, 2, 9, 0))) 4317 4318 def testToStrSecondlyByEasterPos(self): 4319 self._rrulestr_reverse_test(rrule(SECONDLY, 4320 count=3, 4321 byeaster=1, 4322 dtstart=datetime(1997, 9, 2, 9, 0))) 4323 4324 def testToStrSecondlyByEasterNeg(self): 4325 self._rrulestr_reverse_test(rrule(SECONDLY, 4326 count=3, 4327 byeaster=-1, 4328 dtstart=datetime(1997, 9, 2, 9, 0))) 4329 4330 def testToStrSecondlyByHour(self): 4331 self._rrulestr_reverse_test(rrule(SECONDLY, 4332 count=3, 4333 byhour=(6, 18), 4334 dtstart=datetime(1997, 9, 2, 9, 0))) 4335 4336 def testToStrSecondlyByMinute(self): 4337 self._rrulestr_reverse_test(rrule(SECONDLY, 4338 count=3, 4339 byminute=(6, 18), 4340 dtstart=datetime(1997, 9, 2, 9, 0))) 4341 4342 def testToStrSecondlyBySecond(self): 4343 self._rrulestr_reverse_test(rrule(SECONDLY, 4344 count=3, 4345 bysecond=(6, 18), 4346 dtstart=datetime(1997, 9, 2, 9, 0))) 4347 4348 def testToStrSecondlyByHourAndMinute(self): 4349 self._rrulestr_reverse_test(rrule(SECONDLY, 4350 count=3, 4351 byhour=(6, 18), 4352 byminute=(6, 18), 4353 dtstart=datetime(1997, 9, 2, 9, 0))) 4354 4355 def testToStrSecondlyByHourAndSecond(self): 4356 self._rrulestr_reverse_test(rrule(SECONDLY, 4357 count=3, 4358 byhour=(6, 18), 4359 bysecond=(6, 18), 4360 dtstart=datetime(1997, 9, 2, 9, 0))) 4361 4362 def testToStrSecondlyByMinuteAndSecond(self): 4363 self._rrulestr_reverse_test(rrule(SECONDLY, 4364 count=3, 4365 byminute=(6, 18), 4366 bysecond=(6, 18), 4367 dtstart=datetime(1997, 9, 2, 9, 0))) 4368 4369 def testToStrSecondlyByHourAndMinuteAndSecond(self): 4370 self._rrulestr_reverse_test(rrule(SECONDLY, 4371 count=3, 4372 byhour=(6, 18), 4373 byminute=(6, 18), 4374 bysecond=(6, 18), 4375 dtstart=datetime(1997, 9, 2, 9, 0))) 4376 4377 def testToStrSecondlyByHourAndMinuteAndSecondBug(self): 4378 # This explores a bug found by Mathieu Bridon. 4379 self._rrulestr_reverse_test(rrule(SECONDLY, 4380 count=3, 4381 bysecond=(0,), 4382 byminute=(1,), 4383 dtstart=datetime(2010, 3, 22, 12, 1))) 4384 4385 def testToStrWithWkSt(self): 4386 self._rrulestr_reverse_test(rrule(WEEKLY, 4387 count=3, 4388 wkst=SU, 4389 dtstart=datetime(1997, 9, 2, 9, 0))) 4390 4391 def testToStrLongIntegers(self): 4392 if not PY3: # There is no longs in python3 4393 self._rrulestr_reverse_test(rrule(MINUTELY, 4394 count=long(2), 4395 interval=long(2), 4396 bymonth=long(2), 4397 byweekday=long(3), 4398 byhour=long(6), 4399 byminute=long(6), 4400 bysecond=long(6), 4401 dtstart=datetime(1997, 9, 2, 9, 0))) 4402 4403 self._rrulestr_reverse_test(rrule(YEARLY, 4404 count=long(2), 4405 bymonthday=long(5), 4406 byweekno=long(2), 4407 dtstart=datetime(1997, 9, 2, 9, 0))) 4408 4409 def testReplaceIfSet(self): 4410 rr = rrule(YEARLY, 4411 count=1, 4412 bymonthday=5, 4413 dtstart=datetime(1997, 1, 1)) 4414 newrr = rr.replace(bymonthday=6) 4415 self.assertEqual(list(rr), [datetime(1997, 1, 5)]) 4416 self.assertEqual(list(newrr), 4417 [datetime(1997, 1, 6)]) 4418 4419 def testReplaceIfNotSet(self): 4420 rr = rrule(YEARLY, 4421 count=1, 4422 dtstart=datetime(1997, 1, 1)) 4423 newrr = rr.replace(bymonthday=6) 4424 self.assertEqual(list(rr), [datetime(1997, 1, 1)]) 4425 self.assertEqual(list(newrr), 4426 [datetime(1997, 1, 6)]) 4427 4428 4429class RRuleSetTest(unittest.TestCase): 4430 def testSet(self): 4431 rrset = rruleset() 4432 rrset.rrule(rrule(YEARLY, count=2, byweekday=TU, 4433 dtstart=datetime(1997, 9, 2, 9, 0))) 4434 rrset.rrule(rrule(YEARLY, count=1, byweekday=TH, 4435 dtstart=datetime(1997, 9, 2, 9, 0))) 4436 self.assertEqual(list(rrset), 4437 [datetime(1997, 9, 2, 9, 0), 4438 datetime(1997, 9, 4, 9, 0), 4439 datetime(1997, 9, 9, 9, 0)]) 4440 4441 def testSetDate(self): 4442 rrset = rruleset() 4443 rrset.rrule(rrule(YEARLY, count=1, byweekday=TU, 4444 dtstart=datetime(1997, 9, 2, 9, 0))) 4445 rrset.rdate(datetime(1997, 9, 4, 9)) 4446 rrset.rdate(datetime(1997, 9, 9, 9)) 4447 self.assertEqual(list(rrset), 4448 [datetime(1997, 9, 2, 9, 0), 4449 datetime(1997, 9, 4, 9, 0), 4450 datetime(1997, 9, 9, 9, 0)]) 4451 4452 def testSetExRule(self): 4453 rrset = rruleset() 4454 rrset.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH), 4455 dtstart=datetime(1997, 9, 2, 9, 0))) 4456 rrset.exrule(rrule(YEARLY, count=3, byweekday=TH, 4457 dtstart=datetime(1997, 9, 2, 9, 0))) 4458 self.assertEqual(list(rrset), 4459 [datetime(1997, 9, 2, 9, 0), 4460 datetime(1997, 9, 9, 9, 0), 4461 datetime(1997, 9, 16, 9, 0)]) 4462 4463 def testSetExDate(self): 4464 rrset = rruleset() 4465 rrset.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH), 4466 dtstart=datetime(1997, 9, 2, 9, 0))) 4467 rrset.exdate(datetime(1997, 9, 4, 9)) 4468 rrset.exdate(datetime(1997, 9, 11, 9)) 4469 rrset.exdate(datetime(1997, 9, 18, 9)) 4470 self.assertEqual(list(rrset), 4471 [datetime(1997, 9, 2, 9, 0), 4472 datetime(1997, 9, 9, 9, 0), 4473 datetime(1997, 9, 16, 9, 0)]) 4474 4475 def testSetExDateRevOrder(self): 4476 rrset = rruleset() 4477 rrset.rrule(rrule(MONTHLY, count=5, bymonthday=10, 4478 dtstart=datetime(2004, 1, 1, 9, 0))) 4479 rrset.exdate(datetime(2004, 4, 10, 9, 0)) 4480 rrset.exdate(datetime(2004, 2, 10, 9, 0)) 4481 self.assertEqual(list(rrset), 4482 [datetime(2004, 1, 10, 9, 0), 4483 datetime(2004, 3, 10, 9, 0), 4484 datetime(2004, 5, 10, 9, 0)]) 4485 4486 def testSetDateAndExDate(self): 4487 rrset = rruleset() 4488 rrset.rdate(datetime(1997, 9, 2, 9)) 4489 rrset.rdate(datetime(1997, 9, 4, 9)) 4490 rrset.rdate(datetime(1997, 9, 9, 9)) 4491 rrset.rdate(datetime(1997, 9, 11, 9)) 4492 rrset.rdate(datetime(1997, 9, 16, 9)) 4493 rrset.rdate(datetime(1997, 9, 18, 9)) 4494 rrset.exdate(datetime(1997, 9, 4, 9)) 4495 rrset.exdate(datetime(1997, 9, 11, 9)) 4496 rrset.exdate(datetime(1997, 9, 18, 9)) 4497 self.assertEqual(list(rrset), 4498 [datetime(1997, 9, 2, 9, 0), 4499 datetime(1997, 9, 9, 9, 0), 4500 datetime(1997, 9, 16, 9, 0)]) 4501 4502 def testSetDateAndExRule(self): 4503 rrset = rruleset() 4504 rrset.rdate(datetime(1997, 9, 2, 9)) 4505 rrset.rdate(datetime(1997, 9, 4, 9)) 4506 rrset.rdate(datetime(1997, 9, 9, 9)) 4507 rrset.rdate(datetime(1997, 9, 11, 9)) 4508 rrset.rdate(datetime(1997, 9, 16, 9)) 4509 rrset.rdate(datetime(1997, 9, 18, 9)) 4510 rrset.exrule(rrule(YEARLY, count=3, byweekday=TH, 4511 dtstart=datetime(1997, 9, 2, 9, 0))) 4512 self.assertEqual(list(rrset), 4513 [datetime(1997, 9, 2, 9, 0), 4514 datetime(1997, 9, 9, 9, 0), 4515 datetime(1997, 9, 16, 9, 0)]) 4516 4517 def testSetCount(self): 4518 rrset = rruleset() 4519 rrset.rrule(rrule(YEARLY, count=6, byweekday=(TU, TH), 4520 dtstart=datetime(1997, 9, 2, 9, 0))) 4521 rrset.exrule(rrule(YEARLY, count=3, byweekday=TH, 4522 dtstart=datetime(1997, 9, 2, 9, 0))) 4523 self.assertEqual(rrset.count(), 3) 4524 4525 def testSetCachePre(self): 4526 rrset = rruleset() 4527 rrset.rrule(rrule(YEARLY, count=2, byweekday=TU, 4528 dtstart=datetime(1997, 9, 2, 9, 0))) 4529 rrset.rrule(rrule(YEARLY, count=1, byweekday=TH, 4530 dtstart=datetime(1997, 9, 2, 9, 0))) 4531 self.assertEqual(list(rrset), 4532 [datetime(1997, 9, 2, 9, 0), 4533 datetime(1997, 9, 4, 9, 0), 4534 datetime(1997, 9, 9, 9, 0)]) 4535 4536 def testSetCachePost(self): 4537 rrset = rruleset(cache=True) 4538 rrset.rrule(rrule(YEARLY, count=2, byweekday=TU, 4539 dtstart=datetime(1997, 9, 2, 9, 0))) 4540 rrset.rrule(rrule(YEARLY, count=1, byweekday=TH, 4541 dtstart=datetime(1997, 9, 2, 9, 0))) 4542 for x in rrset: pass 4543 self.assertEqual(list(rrset), 4544 [datetime(1997, 9, 2, 9, 0), 4545 datetime(1997, 9, 4, 9, 0), 4546 datetime(1997, 9, 9, 9, 0)]) 4547 4548 def testSetCachePostInternal(self): 4549 rrset = rruleset(cache=True) 4550 rrset.rrule(rrule(YEARLY, count=2, byweekday=TU, 4551 dtstart=datetime(1997, 9, 2, 9, 0))) 4552 rrset.rrule(rrule(YEARLY, count=1, byweekday=TH, 4553 dtstart=datetime(1997, 9, 2, 9, 0))) 4554 for x in rrset: pass 4555 self.assertEqual(list(rrset._cache), 4556 [datetime(1997, 9, 2, 9, 0), 4557 datetime(1997, 9, 4, 9, 0), 4558 datetime(1997, 9, 9, 9, 0)]) 4559 4560 def testSetRRuleCount(self): 4561 # Test that the count is updated when an rrule is added 4562 rrset = rruleset(cache=False) 4563 for cache in (True, False): 4564 rrset = rruleset(cache=cache) 4565 rrset.rrule(rrule(YEARLY, count=2, byweekday=TH, 4566 dtstart=datetime(1983, 4, 1))) 4567 rrset.rrule(rrule(WEEKLY, count=4, byweekday=FR, 4568 dtstart=datetime(1991, 6, 3))) 4569 4570 # Check the length twice - first one sets a cache, second reads it 4571 self.assertEqual(rrset.count(), 6) 4572 self.assertEqual(rrset.count(), 6) 4573 4574 # This should invalidate the cache and force an update 4575 rrset.rrule(rrule(MONTHLY, count=3, dtstart=datetime(1994, 1, 3))) 4576 4577 self.assertEqual(rrset.count(), 9) 4578 self.assertEqual(rrset.count(), 9) 4579 4580 def testSetRDateCount(self): 4581 # Test that the count is updated when an rdate is added 4582 rrset = rruleset(cache=False) 4583 for cache in (True, False): 4584 rrset = rruleset(cache=cache) 4585 rrset.rrule(rrule(YEARLY, count=2, byweekday=TH, 4586 dtstart=datetime(1983, 4, 1))) 4587 rrset.rrule(rrule(WEEKLY, count=4, byweekday=FR, 4588 dtstart=datetime(1991, 6, 3))) 4589 4590 # Check the length twice - first one sets a cache, second reads it 4591 self.assertEqual(rrset.count(), 6) 4592 self.assertEqual(rrset.count(), 6) 4593 4594 # This should invalidate the cache and force an update 4595 rrset.rdate(datetime(1993, 2, 14)) 4596 4597 self.assertEqual(rrset.count(), 7) 4598 self.assertEqual(rrset.count(), 7) 4599 4600 def testSetExRuleCount(self): 4601 # Test that the count is updated when an exrule is added 4602 rrset = rruleset(cache=False) 4603 for cache in (True, False): 4604 rrset = rruleset(cache=cache) 4605 rrset.rrule(rrule(YEARLY, count=2, byweekday=TH, 4606 dtstart=datetime(1983, 4, 1))) 4607 rrset.rrule(rrule(WEEKLY, count=4, byweekday=FR, 4608 dtstart=datetime(1991, 6, 3))) 4609 4610 # Check the length twice - first one sets a cache, second reads it 4611 self.assertEqual(rrset.count(), 6) 4612 self.assertEqual(rrset.count(), 6) 4613 4614 # This should invalidate the cache and force an update 4615 rrset.exrule(rrule(WEEKLY, count=2, interval=2, 4616 dtstart=datetime(1991, 6, 14))) 4617 4618 self.assertEqual(rrset.count(), 4) 4619 self.assertEqual(rrset.count(), 4) 4620 4621 def testSetExDateCount(self): 4622 # Test that the count is updated when an rdate is added 4623 for cache in (True, False): 4624 rrset = rruleset(cache=cache) 4625 rrset.rrule(rrule(YEARLY, count=2, byweekday=TH, 4626 dtstart=datetime(1983, 4, 1))) 4627 rrset.rrule(rrule(WEEKLY, count=4, byweekday=FR, 4628 dtstart=datetime(1991, 6, 3))) 4629 4630 # Check the length twice - first one sets a cache, second reads it 4631 self.assertEqual(rrset.count(), 6) 4632 self.assertEqual(rrset.count(), 6) 4633 4634 # This should invalidate the cache and force an update 4635 rrset.exdate(datetime(1991, 6, 28)) 4636 4637 self.assertEqual(rrset.count(), 5) 4638 self.assertEqual(rrset.count(), 5) 4639 4640 4641class WeekdayTest(unittest.TestCase): 4642 def testInvalidNthWeekday(self): 4643 with self.assertRaises(ValueError): 4644 zeroth_friday = FR(0) 4645 4646 def testWeekdayCallable(self): 4647 # Calling a weekday instance generates a new weekday instance with the 4648 # value of n changed. 4649 from dateutil.rrule import weekday 4650 self.assertEqual(MO(1), weekday(0, 1)) 4651 4652 # Calling a weekday instance with the identical n returns the original 4653 # object 4654 FR_3 = weekday(4, 3) 4655 self.assertIs(FR_3(3), FR_3) 4656 4657 def testWeekdayEquality(self): 4658 # Two weekday objects are not equal if they have different values for n 4659 self.assertNotEqual(TH, TH(-1)) 4660 self.assertNotEqual(SA(3), SA(2)) 4661 4662 def testWeekdayEqualitySubclass(self): 4663 # Two weekday objects equal if their "weekday" and "n" attributes are 4664 # available and the same 4665 class BasicWeekday(object): 4666 def __init__(self, weekday): 4667 self.weekday = weekday 4668 4669 class BasicNWeekday(BasicWeekday): 4670 def __init__(self, weekday, n=None): 4671 super(BasicNWeekday, self).__init__(weekday) 4672 self.n = n 4673 4674 MO_Basic = BasicWeekday(0) 4675 4676 self.assertNotEqual(MO, MO_Basic) 4677 self.assertNotEqual(MO(1), MO_Basic) 4678 4679 TU_BasicN = BasicNWeekday(1) 4680 4681 self.assertEqual(TU, TU_BasicN) 4682 self.assertNotEqual(TU(3), TU_BasicN) 4683 4684 WE_Basic3 = BasicNWeekday(2, 3) 4685 self.assertEqual(WE(3), WE_Basic3) 4686 self.assertNotEqual(WE(2), WE_Basic3) 4687 4688 def testWeekdayReprNoN(self): 4689 no_n_reprs = ('MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU') 4690 no_n_wdays = (MO, TU, WE, TH, FR, SA, SU) 4691 4692 for repstr, wday in zip(no_n_reprs, no_n_wdays): 4693 self.assertEqual(repr(wday), repstr) 4694 4695 def testWeekdayReprWithN(self): 4696 with_n_reprs = ('WE(+1)', 'TH(-2)', 'SU(+3)') 4697 with_n_wdays = (WE(1), TH(-2), SU(+3)) 4698 4699 for repstr, wday in zip(with_n_reprs, with_n_wdays): 4700 self.assertEqual(repr(wday), repstr) 4701 4702