revised_holidays 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +25 -0
  3. data/CHANGELOG.md +446 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +21 -0
  7. data/Makefile +45 -0
  8. data/README.md +337 -0
  9. data/Rakefile +109 -0
  10. data/bin/console +7 -0
  11. data/bin/setup +6 -0
  12. data/definitions/.github/workflows/ruby.yml +25 -0
  13. data/definitions/.gitignore +5 -0
  14. data/definitions/CHANGELOG.md +352 -0
  15. data/definitions/Gemfile +6 -0
  16. data/definitions/LICENSE +21 -0
  17. data/definitions/METHODS.yml +26 -0
  18. data/definitions/Makefile +9 -0
  19. data/definitions/README.md +22 -0
  20. data/definitions/ar.yaml +268 -0
  21. data/definitions/at.yaml +116 -0
  22. data/definitions/au.yaml +907 -0
  23. data/definitions/be_fr.yaml +153 -0
  24. data/definitions/be_nl.yaml +153 -0
  25. data/definitions/bg.yaml +186 -0
  26. data/definitions/br.yaml +178 -0
  27. data/definitions/ca.yaml +969 -0
  28. data/definitions/ch.yaml +277 -0
  29. data/definitions/cl.yaml +294 -0
  30. data/definitions/co.yaml +437 -0
  31. data/definitions/cr.yaml +100 -0
  32. data/definitions/cz.yaml +137 -0
  33. data/definitions/de.yaml +401 -0
  34. data/definitions/dk.yaml +220 -0
  35. data/definitions/doc/CONTRIBUTING.md +44 -0
  36. data/definitions/doc/MAINTAINERS.md +39 -0
  37. data/definitions/doc/SYNTAX.md +435 -0
  38. data/definitions/doc/architecture/README.md +15 -0
  39. data/definitions/doc/architecture/adr-001.md +86 -0
  40. data/definitions/doc/architecture/adr-002.md +64 -0
  41. data/definitions/ecbtarget.yaml +74 -0
  42. data/definitions/ee.yaml +123 -0
  43. data/definitions/es.yaml +495 -0
  44. data/definitions/federalreserve.yaml +389 -0
  45. data/definitions/federalreservebanks.yaml +821 -0
  46. data/definitions/fedex.yaml +102 -0
  47. data/definitions/fi.yaml +234 -0
  48. data/definitions/fr.yaml +157 -0
  49. data/definitions/gb.yaml +565 -0
  50. data/definitions/ge.yaml +158 -0
  51. data/definitions/gr.yaml +158 -0
  52. data/definitions/hk.yaml +287 -0
  53. data/definitions/hr.yaml +171 -0
  54. data/definitions/hu.yaml +156 -0
  55. data/definitions/ie.yaml +172 -0
  56. data/definitions/index.yaml +80 -0
  57. data/definitions/is.yaml +247 -0
  58. data/definitions/it.yaml +246 -0
  59. data/definitions/jp.yaml +761 -0
  60. data/definitions/ke.yaml +107 -0
  61. data/definitions/kr.yaml +166 -0
  62. data/definitions/kz.yaml +128 -0
  63. data/definitions/li.yaml +154 -0
  64. data/definitions/lib/validation/custom_method_validator.rb +38 -0
  65. data/definitions/lib/validation/definition_validator.rb +35 -0
  66. data/definitions/lib/validation/error.rb +11 -0
  67. data/definitions/lib/validation/month_validator.rb +58 -0
  68. data/definitions/lib/validation/run.rb +66 -0
  69. data/definitions/lib/validation/test_validator.rb +83 -0
  70. data/definitions/lt.yaml +198 -0
  71. data/definitions/lu.yaml +123 -0
  72. data/definitions/lv.yaml +229 -0
  73. data/definitions/ma.yaml +96 -0
  74. data/definitions/mt_en.yaml +131 -0
  75. data/definitions/mt_mt.yaml +131 -0
  76. data/definitions/mx.yaml +160 -0
  77. data/definitions/my.yaml +79 -0
  78. data/definitions/nerc.yaml +94 -0
  79. data/definitions/ng.yaml +97 -0
  80. data/definitions/nl.yaml +127 -0
  81. data/definitions/no.yaml +169 -0
  82. data/definitions/northamericainformal.yaml +105 -0
  83. data/definitions/nyse.yaml +137 -0
  84. data/definitions/nz.yaml +346 -0
  85. data/definitions/pe.yaml +208 -0
  86. data/definitions/ph.yaml +130 -0
  87. data/definitions/pl.yaml +796 -0
  88. data/definitions/pt.yaml +187 -0
  89. data/definitions/ro.yaml +240 -0
  90. data/definitions/rs_cyrl.yaml +129 -0
  91. data/definitions/rs_la.yaml +129 -0
  92. data/definitions/ru.yaml +108 -0
  93. data/definitions/se.yaml +238 -0
  94. data/definitions/sg.yaml +89 -0
  95. data/definitions/si.yaml +162 -0
  96. data/definitions/sk.yaml +154 -0
  97. data/definitions/spec/coverage_report.rb +7 -0
  98. data/definitions/spec/data/invalid/months/malformed/bad.yaml +15 -0
  99. data/definitions/spec/data/invalid/months/missing/no_months.yaml +9 -0
  100. data/definitions/spec/data/valid/simple.yaml +15 -0
  101. data/definitions/spec/spec_helper.rb +7 -0
  102. data/definitions/spec/validation/custom_method_validator_spec.rb +60 -0
  103. data/definitions/spec/validation/definition_validator_spec.rb +43 -0
  104. data/definitions/spec/validation/month_validator_spec.rb +175 -0
  105. data/definitions/spec/validation/test_validator_spec.rb +169 -0
  106. data/definitions/th.yaml +111 -0
  107. data/definitions/tn.yaml +83 -0
  108. data/definitions/tr.yaml +174 -0
  109. data/definitions/ua.yaml +161 -0
  110. data/definitions/unitednations.yaml +189 -0
  111. data/definitions/ups.yaml +102 -0
  112. data/definitions/us.yaml +965 -0
  113. data/definitions/ve.yaml +118 -0
  114. data/definitions/vi.yaml +54 -0
  115. data/definitions/za.yaml +139 -0
  116. data/doc/CONTRIBUTING.md +72 -0
  117. data/doc/MAINTAINERS.md +81 -0
  118. data/doc/REFERENCES +19 -0
  119. data/lib/generated_definitions/MANIFEST +83 -0
  120. data/lib/generated_definitions/REGIONS.rb +6 -0
  121. data/lib/generated_definitions/ar.rb +60 -0
  122. data/lib/generated_definitions/at.rb +37 -0
  123. data/lib/generated_definitions/au.rb +177 -0
  124. data/lib/generated_definitions/be.rb +42 -0
  125. data/lib/generated_definitions/be_fr.rb +36 -0
  126. data/lib/generated_definitions/be_nl.rb +36 -0
  127. data/lib/generated_definitions/bg.rb +53 -0
  128. data/lib/generated_definitions/br.rb +37 -0
  129. data/lib/generated_definitions/ca.rb +88 -0
  130. data/lib/generated_definitions/ch.rb +95 -0
  131. data/lib/generated_definitions/cl.rb +71 -0
  132. data/lib/generated_definitions/co.rb +121 -0
  133. data/lib/generated_definitions/cr.rb +35 -0
  134. data/lib/generated_definitions/cz.rb +37 -0
  135. data/lib/generated_definitions/de.rb +65 -0
  136. data/lib/generated_definitions/dk.rb +48 -0
  137. data/lib/generated_definitions/ecbtarget.rb +30 -0
  138. data/lib/generated_definitions/ee.rb +36 -0
  139. data/lib/generated_definitions/el.rb +38 -0
  140. data/lib/generated_definitions/es.rb +56 -0
  141. data/lib/generated_definitions/europe.rb +638 -0
  142. data/lib/generated_definitions/federalreserve.rb +35 -0
  143. data/lib/generated_definitions/federalreservebanks.rb +35 -0
  144. data/lib/generated_definitions/fedex.rb +36 -0
  145. data/lib/generated_definitions/fi.rb +61 -0
  146. data/lib/generated_definitions/fr.rb +39 -0
  147. data/lib/generated_definitions/gb.rb +51 -0
  148. data/lib/generated_definitions/ge.rb +41 -0
  149. data/lib/generated_definitions/gr.rb +38 -0
  150. data/lib/generated_definitions/hk.rb +106 -0
  151. data/lib/generated_definitions/hr.rb +40 -0
  152. data/lib/generated_definitions/hu.rb +35 -0
  153. data/lib/generated_definitions/ie.rb +33 -0
  154. data/lib/generated_definitions/is.rb +60 -0
  155. data/lib/generated_definitions/it.rb +45 -0
  156. data/lib/generated_definitions/jp.rb +166 -0
  157. data/lib/generated_definitions/ke.rb +34 -0
  158. data/lib/generated_definitions/kr.rb +40 -0
  159. data/lib/generated_definitions/kz.rb +38 -0
  160. data/lib/generated_definitions/li.rb +44 -0
  161. data/lib/generated_definitions/lt.rb +38 -0
  162. data/lib/generated_definitions/lu.rb +35 -0
  163. data/lib/generated_definitions/lv.rb +56 -0
  164. data/lib/generated_definitions/ma.rb +33 -0
  165. data/lib/generated_definitions/mt_en.rb +38 -0
  166. data/lib/generated_definitions/mt_mt.rb +38 -0
  167. data/lib/generated_definitions/mx.rb +54 -0
  168. data/lib/generated_definitions/my.rb +30 -0
  169. data/lib/generated_definitions/nerc.rb +30 -0
  170. data/lib/generated_definitions/ng.rb +33 -0
  171. data/lib/generated_definitions/nl.rb +37 -0
  172. data/lib/generated_definitions/no.rb +40 -0
  173. data/lib/generated_definitions/northamerica.rb +229 -0
  174. data/lib/generated_definitions/nyse.rb +34 -0
  175. data/lib/generated_definitions/nz.rb +105 -0
  176. data/lib/generated_definitions/pe.rb +43 -0
  177. data/lib/generated_definitions/ph.rb +50 -0
  178. data/lib/generated_definitions/pl.rb +73 -0
  179. data/lib/generated_definitions/pt.rb +40 -0
  180. data/lib/generated_definitions/ro.rb +39 -0
  181. data/lib/generated_definitions/rs_cyrl.rb +39 -0
  182. data/lib/generated_definitions/rs_la.rb +39 -0
  183. data/lib/generated_definitions/ru.rb +37 -0
  184. data/lib/generated_definitions/scandinavia.rb +166 -0
  185. data/lib/generated_definitions/se.rb +53 -0
  186. data/lib/generated_definitions/sg.rb +31 -0
  187. data/lib/generated_definitions/si.rb +39 -0
  188. data/lib/generated_definitions/sk.rb +39 -0
  189. data/lib/generated_definitions/southamerica.rb +248 -0
  190. data/lib/generated_definitions/th.rb +36 -0
  191. data/lib/generated_definitions/tn.rb +32 -0
  192. data/lib/generated_definitions/tr.rb +64 -0
  193. data/lib/generated_definitions/ua.rb +37 -0
  194. data/lib/generated_definitions/unitednations.rb +81 -0
  195. data/lib/generated_definitions/ups.rb +36 -0
  196. data/lib/generated_definitions/us.rb +153 -0
  197. data/lib/generated_definitions/ve.rb +36 -0
  198. data/lib/generated_definitions/vi.rb +29 -0
  199. data/lib/generated_definitions/za.rb +36 -0
  200. data/lib/holidays/core_extensions/date.rb +57 -0
  201. data/lib/holidays/core_extensions/time.rb +23 -0
  202. data/lib/holidays/date_calculator/day_of_month.rb +68 -0
  203. data/lib/holidays/date_calculator/easter.rb +91 -0
  204. data/lib/holidays/date_calculator/lunar_date.rb +371 -0
  205. data/lib/holidays/date_calculator/weekend_modifier.rb +80 -0
  206. data/lib/holidays/definition/context/function_processor.rb +91 -0
  207. data/lib/holidays/definition/context/generator.rb +209 -0
  208. data/lib/holidays/definition/context/load.rb +29 -0
  209. data/lib/holidays/definition/context/merger.rb +22 -0
  210. data/lib/holidays/definition/decorator/custom_method_proc.rb +28 -0
  211. data/lib/holidays/definition/decorator/custom_method_source.rb +30 -0
  212. data/lib/holidays/definition/decorator/test.rb +37 -0
  213. data/lib/holidays/definition/entity/custom_method.rb +11 -0
  214. data/lib/holidays/definition/entity/test.rb +11 -0
  215. data/lib/holidays/definition/generator/module.rb +54 -0
  216. data/lib/holidays/definition/generator/regions.rb +55 -0
  217. data/lib/holidays/definition/generator/test.rb +51 -0
  218. data/lib/holidays/definition/parser/custom_method.rb +67 -0
  219. data/lib/holidays/definition/parser/test.rb +86 -0
  220. data/lib/holidays/definition/repository/cache.rb +47 -0
  221. data/lib/holidays/definition/repository/custom_methods.rb +27 -0
  222. data/lib/holidays/definition/repository/holidays_by_month.rb +57 -0
  223. data/lib/holidays/definition/repository/proc_result_cache.rb +51 -0
  224. data/lib/holidays/definition/repository/regions.rb +46 -0
  225. data/lib/holidays/definition/validator/custom_method.rb +31 -0
  226. data/lib/holidays/definition/validator/region.rb +36 -0
  227. data/lib/holidays/definition/validator/test.rb +71 -0
  228. data/lib/holidays/errors.rb +11 -0
  229. data/lib/holidays/factory/date_calculator.rb +42 -0
  230. data/lib/holidays/factory/definition.rb +143 -0
  231. data/lib/holidays/factory/finder.rb +70 -0
  232. data/lib/holidays/finder/context/between.rb +45 -0
  233. data/lib/holidays/finder/context/dates_driver_builder.rb +64 -0
  234. data/lib/holidays/finder/context/next_holiday.rb +57 -0
  235. data/lib/holidays/finder/context/parse_options.rb +104 -0
  236. data/lib/holidays/finder/context/search.rb +111 -0
  237. data/lib/holidays/finder/context/year_holiday.rb +57 -0
  238. data/lib/holidays/finder/rules/in_region.rb +31 -0
  239. data/lib/holidays/finder/rules/year_range.rb +58 -0
  240. data/lib/holidays/load_all_definitions.rb +56 -0
  241. data/lib/holidays/version.rb +3 -0
  242. data/lib/holidays.rb +130 -0
  243. data/lib/revised_holidays.rb +1 -0
  244. data/revised_holidays.gemspec +31 -0
  245. data/test/coverage_report.rb +26 -0
  246. data/test/data/test_custom_govt_holiday_defs.yaml +5 -0
  247. data/test/data/test_custom_informal_holidays_defs.yaml +11 -0
  248. data/test/data/test_custom_year_range_holiday_defs.yaml +31 -0
  249. data/test/data/test_invalid_region.rb +15 -0
  250. data/test/data/test_multiple_custom_holiday_defs.yaml +12 -0
  251. data/test/data/test_multiple_regions_with_conflicts_region_1.yaml +38 -0
  252. data/test/data/test_multiple_regions_with_conflicts_region_2.yaml +38 -0
  253. data/test/data/test_region.rb +15 -0
  254. data/test/data/test_single_custom_holiday_defs.yaml +12 -0
  255. data/test/data/test_single_custom_holiday_with_custom_procs.yaml +28 -0
  256. data/test/defs/test_defs_ar.rb +69 -0
  257. data/test/defs/test_defs_at.rb +31 -0
  258. data/test/defs/test_defs_au.rb +233 -0
  259. data/test/defs/test_defs_be_fr.rb +45 -0
  260. data/test/defs/test_defs_be_nl.rb +45 -0
  261. data/test/defs/test_defs_bg.rb +41 -0
  262. data/test/defs/test_defs_br.rb +49 -0
  263. data/test/defs/test_defs_ca.rb +289 -0
  264. data/test/defs/test_defs_ch.rb +51 -0
  265. data/test/defs/test_defs_cl.rb +69 -0
  266. data/test/defs/test_defs_co.rb +113 -0
  267. data/test/defs/test_defs_cr.rb +29 -0
  268. data/test/defs/test_defs_cz.rb +37 -0
  269. data/test/defs/test_defs_de.rb +89 -0
  270. data/test/defs/test_defs_dk.rb +47 -0
  271. data/test/defs/test_defs_ecbtarget.rb +27 -0
  272. data/test/defs/test_defs_ee.rb +41 -0
  273. data/test/defs/test_defs_es.rb +137 -0
  274. data/test/defs/test_defs_europe.rb +1522 -0
  275. data/test/defs/test_defs_fed_ex.rb +24 -0
  276. data/test/defs/test_defs_federalreserve.rb +119 -0
  277. data/test/defs/test_defs_federalreservebanks.rb +251 -0
  278. data/test/defs/test_defs_fedex.rb +31 -0
  279. data/test/defs/test_defs_fi.rb +59 -0
  280. data/test/defs/test_defs_fr.rb +43 -0
  281. data/test/defs/test_defs_gb.rb +159 -0
  282. data/test/defs/test_defs_ge.rb +53 -0
  283. data/test/defs/test_defs_gr.rb +41 -0
  284. data/test/defs/test_defs_hk.rb +59 -0
  285. data/test/defs/test_defs_hr.rb +45 -0
  286. data/test/defs/test_defs_hu.rb +47 -0
  287. data/test/defs/test_defs_ie.rb +53 -0
  288. data/test/defs/test_defs_is.rb +51 -0
  289. data/test/defs/test_defs_it.rb +55 -0
  290. data/test/defs/test_defs_jp.rb +159 -0
  291. data/test/defs/test_defs_ke.rb +31 -0
  292. data/test/defs/test_defs_kr.rb +37 -0
  293. data/test/defs/test_defs_kz.rb +39 -0
  294. data/test/defs/test_defs_li.rb +35 -0
  295. data/test/defs/test_defs_lt.rb +65 -0
  296. data/test/defs/test_defs_lu.rb +35 -0
  297. data/test/defs/test_defs_lv.rb +98 -0
  298. data/test/defs/test_defs_ma.rb +29 -0
  299. data/test/defs/test_defs_mt_en.rb +41 -0
  300. data/test/defs/test_defs_mt_mt.rb +41 -0
  301. data/test/defs/test_defs_mx.rb +49 -0
  302. data/test/defs/test_defs_my.rb +23 -0
  303. data/test/defs/test_defs_nerc.rb +29 -0
  304. data/test/defs/test_defs_ng.rb +29 -0
  305. data/test/defs/test_defs_nl.rb +33 -0
  306. data/test/defs/test_defs_no.rb +43 -0
  307. data/test/defs/test_defs_northamerica.rb +667 -0
  308. data/test/defs/test_defs_nyse.rb +46 -0
  309. data/test/defs/test_defs_nz.rb +67 -0
  310. data/test/defs/test_defs_pe.rb +47 -0
  311. data/test/defs/test_defs_ph.rb +29 -0
  312. data/test/defs/test_defs_pl.rb +229 -0
  313. data/test/defs/test_defs_pt.rb +47 -0
  314. data/test/defs/test_defs_ro.rb +65 -0
  315. data/test/defs/test_defs_rs_cyrl.rb +46 -0
  316. data/test/defs/test_defs_rs_la.rb +46 -0
  317. data/test/defs/test_defs_ru.rb +34 -0
  318. data/test/defs/test_defs_scandinavia.rb +215 -0
  319. data/test/defs/test_defs_se.rb +59 -0
  320. data/test/defs/test_defs_sg.rb +25 -0
  321. data/test/defs/test_defs_si.rb +105 -0
  322. data/test/defs/test_defs_sk.rb +41 -0
  323. data/test/defs/test_defs_southamerica.rb +327 -0
  324. data/test/defs/test_defs_th.rb +33 -0
  325. data/test/defs/test_defs_tn.rb +27 -0
  326. data/test/defs/test_defs_tr.rb +60 -0
  327. data/test/defs/test_defs_ua.rb +41 -0
  328. data/test/defs/test_defs_unitednations.rb +11 -0
  329. data/test/defs/test_defs_ups.rb +31 -0
  330. data/test/defs/test_defs_us.rb +387 -0
  331. data/test/defs/test_defs_ve.rb +35 -0
  332. data/test/defs/test_defs_vi.rb +22 -0
  333. data/test/defs/test_defs_za.rb +35 -0
  334. data/test/holidays/core_extensions/test_date.rb +122 -0
  335. data/test/holidays/core_extensions/test_date_time.rb +60 -0
  336. data/test/holidays/date_calculator/test_day_of_month.rb +27 -0
  337. data/test/holidays/date_calculator/test_easter_gregorian.rb +30 -0
  338. data/test/holidays/date_calculator/test_easter_julian.rb +36 -0
  339. data/test/holidays/date_calculator/test_lunar_date.rb +89 -0
  340. data/test/holidays/date_calculator/test_weekend_modifier.rb +54 -0
  341. data/test/holidays/definition/context/test_function_processor.rb +199 -0
  342. data/test/holidays/definition/context/test_generator.rb +226 -0
  343. data/test/holidays/definition/context/test_load.rb +37 -0
  344. data/test/holidays/definition/context/test_merger.rb +25 -0
  345. data/test/holidays/definition/decorator/test_custom_method_proc.rb +113 -0
  346. data/test/holidays/definition/decorator/test_custom_method_source.rb +96 -0
  347. data/test/holidays/definition/decorator/test_test.rb +123 -0
  348. data/test/holidays/definition/generator/test_module.rb +268 -0
  349. data/test/holidays/definition/generator/test_regions.rb +97 -0
  350. data/test/holidays/definition/generator/test_test.rb +113 -0
  351. data/test/holidays/definition/parser/test_custom_method.rb +79 -0
  352. data/test/holidays/definition/parser/test_test.rb +142 -0
  353. data/test/holidays/definition/repository/test_cache.rb +123 -0
  354. data/test/holidays/definition/repository/test_custom_methods.rb +43 -0
  355. data/test/holidays/definition/repository/test_holidays_by_month.rb +275 -0
  356. data/test/holidays/definition/repository/test_proc_result_cache.rb +91 -0
  357. data/test/holidays/definition/repository/test_regions.rb +104 -0
  358. data/test/holidays/definition/validator/test_custom_method.rb +94 -0
  359. data/test/holidays/definition/validator/test_region.rb +54 -0
  360. data/test/holidays/definition/validator/test_test.rb +60 -0
  361. data/test/holidays/finder/context/test_between.rb +172 -0
  362. data/test/holidays/finder/context/test_dates_driver_builder.rb +91 -0
  363. data/test/holidays/finder/context/test_next_holiday.rb +156 -0
  364. data/test/holidays/finder/context/test_parse_options.rb +141 -0
  365. data/test/holidays/finder/context/test_search.rb +232 -0
  366. data/test/holidays/finder/context/test_year_holiday.rb +202 -0
  367. data/test/holidays/finder/rules/test_in_region.rb +42 -0
  368. data/test/holidays/finder/rules/test_year_range.rb +166 -0
  369. data/test/integration/README.md +9 -0
  370. data/test/integration/test_all_regions.rb +49 -0
  371. data/test/integration/test_any_holidays_during_work_week.rb +90 -0
  372. data/test/integration/test_available_regions.rb +23 -0
  373. data/test/integration/test_custom_holidays.rb +41 -0
  374. data/test/integration/test_custom_informal_holidays.rb +15 -0
  375. data/test/integration/test_custom_year_range_holidays.rb +35 -0
  376. data/test/integration/test_holidays.rb +243 -0
  377. data/test/integration/test_holidays_between.rb +87 -0
  378. data/test/integration/test_multiple_regions.rb +71 -0
  379. data/test/integration/test_multiple_regions_with_conflict.rb +29 -0
  380. data/test/integration/test_nonstandard_regions.rb +25 -0
  381. data/test/test_helper.rb +37 -0
  382. metadata +649 -0
@@ -0,0 +1,60 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../test_helper'
2
+
3
+ require 'holidays/core_extensions/date'
4
+ require 'holidays/core_extensions/time'
5
+
6
+ class Date
7
+ include Holidays::CoreExtensions::Date
8
+ end
9
+
10
+ class Time
11
+ include Holidays::CoreExtensions::Time
12
+ end
13
+
14
+ class CoreExtensionDateTimeTests < Test::Unit::TestCase
15
+ def setup
16
+ @date = Date.civil(2008,1,1)
17
+ end
18
+
19
+ def test_change_method
20
+ actual = @date.change(day: 5)
21
+ assert_equal Date.civil(2008,1,5), actual
22
+
23
+ actual = @date.change(year: 2016)
24
+ assert_equal Date.civil(2016,1,1), actual
25
+
26
+ actual = @date.change(month: 5)
27
+ assert_equal Date.civil(2008,5,1), actual
28
+
29
+ actual = @date.change(year: 2015, month: 5, day: 3)
30
+ assert_equal Date.civil(2015,5,3), actual
31
+ end
32
+
33
+ def test_end_of_month_method
34
+ # Works for month with 31 days
35
+ actual = @date.end_of_month
36
+ assert_equal Date.civil(2008,1,31), actual
37
+
38
+ # Works for month with 30 days
39
+ actual = Date.civil(2008,9,5).end_of_month
40
+ assert_equal Date.civil(2008,9,30), actual
41
+
42
+ # Works for leap year
43
+ actual = Date.civil(2016,2,1).end_of_month
44
+ assert_equal Date.civil(2016,2,29), actual
45
+ end
46
+
47
+ def test_days_in_month_method
48
+ # Works for month with 31 days
49
+ actual = Time.days_in_month(1, 2008)
50
+ assert_equal 31, actual
51
+
52
+ # Works for month with 30 days
53
+ actual = Time.days_in_month(9, 2008)
54
+ assert_equal 30, actual
55
+
56
+ # Works for leap year
57
+ actual = Time.days_in_month(2, 2016)
58
+ assert_equal 29, actual
59
+ end
60
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../test_helper'
2
+
3
+ require 'holidays/date_calculator/day_of_month'
4
+
5
+ class DayOfMonthDateCalculatorTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::DateCalculator::DayOfMonth.new
8
+ end
9
+
10
+ def test_call_returns_expected_results
11
+ assert_equal 7, @subject.call(2008, 1, :first, :monday)
12
+ assert_equal 18, @subject.call(2008, 12, :third, :thursday)
13
+ assert_equal 28, @subject.call(2008, 1, :last, 1)
14
+ end
15
+
16
+ def test_returns_argument_error_with_invalid_week_parameter
17
+ assert_raises ArgumentError do
18
+ @subject.call(2008, 1, :wrong_week_argument, :monday)
19
+ end
20
+ end
21
+
22
+ def test_returns_argument_error_with_invalid_day_parameter
23
+ assert_raises ArgumentError do
24
+ @subject.call(2008, 1, :first, :bad_wday)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../test_helper'
2
+
3
+ require 'holidays/date_calculator/easter'
4
+
5
+ class GregorianEasterDateCalculatorTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::DateCalculator::Easter::Gregorian.new
8
+ end
9
+
10
+ def test_calculate_easter_for_returns_expected_results
11
+ assert_equal '0960-04-20', @subject.calculate_easter_for(960).to_s
12
+ assert_equal '1800-04-13', @subject.calculate_easter_for(1800).to_s
13
+ assert_equal '1899-04-02', @subject.calculate_easter_for(1899).to_s
14
+ assert_equal '1900-04-15', @subject.calculate_easter_for(1900).to_s
15
+ assert_equal '1999-04-04', @subject.calculate_easter_for(1999).to_s
16
+ assert_equal '2000-04-23', @subject.calculate_easter_for(2000).to_s
17
+ assert_equal '2025-04-20', @subject.calculate_easter_for(2025).to_s
18
+ assert_equal '2035-03-25', @subject.calculate_easter_for(2035).to_s
19
+ assert_equal '2067-04-03', @subject.calculate_easter_for(2067).to_s
20
+ assert_equal '2099-04-12', @subject.calculate_easter_for(2099).to_s
21
+ end
22
+
23
+ def test_calculate_orthodox_easter_for_returns_expects_results
24
+ assert_equal '2000-04-30', @subject.calculate_orthodox_easter_for(2000).to_s
25
+ assert_equal '2008-04-27', @subject.calculate_orthodox_easter_for(2008).to_s
26
+ assert_equal '2009-04-19', @subject.calculate_orthodox_easter_for(2009).to_s
27
+ assert_equal '2011-04-24', @subject.calculate_orthodox_easter_for(2011).to_s
28
+ assert_equal '2020-04-19', @subject.calculate_orthodox_easter_for(2020).to_s
29
+ end
30
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../test_helper'
2
+
3
+ require 'holidays/date_calculator/easter'
4
+
5
+ class JulianEasterDateCalculatorTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::DateCalculator::Easter::Julian.new
8
+ end
9
+
10
+ def test_calculate_easter_for_returns_expected_results
11
+ assert_equal '0960-04-20', @subject.calculate_easter_for(960).to_s
12
+ assert_equal '1800-04-13', @subject.calculate_easter_for(1800).to_s
13
+ assert_equal '1899-04-02', @subject.calculate_easter_for(1899).to_s
14
+ assert_equal '1900-04-15', @subject.calculate_easter_for(1900).to_s
15
+ assert_equal '1999-04-04', @subject.calculate_easter_for(1999).to_s
16
+ assert_equal '2000-04-23', @subject.calculate_easter_for(2000).to_s
17
+ assert_equal '2025-04-20', @subject.calculate_easter_for(2025).to_s
18
+ assert_equal '2035-03-25', @subject.calculate_easter_for(2035).to_s
19
+ assert_equal '2067-04-03', @subject.calculate_easter_for(2067).to_s
20
+ assert_equal '2099-04-12', @subject.calculate_easter_for(2099).to_s
21
+ end
22
+
23
+ def test_calculate_orthodox_easter_for_returns_expects_results
24
+ assert_equal '0960-04-22', @subject.calculate_orthodox_easter_for(960).to_s
25
+ assert_equal '1500-04-19', @subject.calculate_orthodox_easter_for(1500).to_s
26
+ assert_equal '2000-04-17', @subject.calculate_orthodox_easter_for(2000).to_s
27
+ assert_equal '2001-04-02', @subject.calculate_orthodox_easter_for(2001).to_s
28
+ assert_equal '2015-03-30', @subject.calculate_orthodox_easter_for(2015).to_s
29
+ assert_equal '2016-04-18', @subject.calculate_orthodox_easter_for(2016).to_s
30
+ assert_equal '2017-04-03', @subject.calculate_orthodox_easter_for(2017).to_s
31
+ assert_equal '2020-04-06', @subject.calculate_orthodox_easter_for(2020).to_s
32
+ assert_equal '2050-04-04', @subject.calculate_orthodox_easter_for(2050).to_s
33
+ assert_equal '2100-04-18', @subject.calculate_orthodox_easter_for(2100).to_s
34
+ assert_equal '2500-04-08', @subject.calculate_orthodox_easter_for(2500).to_s
35
+ end
36
+ end
@@ -0,0 +1,89 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../test_helper'
2
+
3
+ require 'holidays/date_calculator/lunar_date.rb'
4
+
5
+ class LunarHolidaysCalculatorTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::DateCalculator::LunarDate.new
8
+ end
9
+
10
+ def test_korean_new_year_returns_expected_results
11
+ assert_equal '1994-02-10', @subject.to_solar(1994,1,1, :kr).to_s
12
+ assert_equal '1995-01-31', @subject.to_solar(1995,1,1, :kr).to_s
13
+ assert_equal '1999-02-16', @subject.to_solar(1999,1,1, :kr).to_s
14
+ assert_equal '2000-02-05', @subject.to_solar(2000,1,1, :kr).to_s
15
+ assert_equal '2001-01-24', @subject.to_solar(2001,1,1, :kr).to_s
16
+ assert_equal '2002-02-12', @subject.to_solar(2002,1,1, :kr).to_s
17
+ assert_equal '2008-02-07', @subject.to_solar(2008,1,1, :kr).to_s
18
+ assert_equal '2009-01-26', @subject.to_solar(2009,1,1, :kr).to_s
19
+ assert_equal '2010-02-14', @subject.to_solar(2010,1,1, :kr).to_s
20
+ assert_equal '2011-02-03', @subject.to_solar(2011,1,1, :kr).to_s
21
+ assert_equal '2012-01-23', @subject.to_solar(2012,1,1, :kr).to_s
22
+ assert_equal '2013-02-10', @subject.to_solar(2013,1,1, :kr).to_s
23
+ assert_equal '2014-01-31', @subject.to_solar(2014,1,1, :kr).to_s
24
+ assert_equal '2015-02-19', @subject.to_solar(2015,1,1, :kr).to_s
25
+ assert_equal '2016-02-08', @subject.to_solar(2016,1,1, :kr).to_s
26
+ assert_equal '2017-01-28', @subject.to_solar(2017,1,1, :kr).to_s
27
+ assert_equal '2018-02-16', @subject.to_solar(2018,1,1, :kr).to_s
28
+ assert_equal '2019-02-05', @subject.to_solar(2019,1,1, :kr).to_s
29
+ assert_equal '2020-01-25', @subject.to_solar(2020,1,1, :kr).to_s
30
+ assert_equal '2022-02-01', @subject.to_solar(2022,1,1, :kr).to_s
31
+ assert_equal '2025-01-29', @subject.to_solar(2025,1,1, :kr).to_s
32
+ end
33
+
34
+ def test_buddahs_birthday_returns_expected_results
35
+ assert_equal '1994-05-18', @subject.to_solar(1994,4,8, :kr).to_s
36
+ assert_equal '1995-05-07', @subject.to_solar(1995,4,8, :kr).to_s
37
+ assert_equal '1999-05-22', @subject.to_solar(1999,4,8, :kr).to_s
38
+ assert_equal '2000-05-11', @subject.to_solar(2000,4,8, :kr).to_s
39
+ assert_equal '2001-05-01', @subject.to_solar(2001,4,8, :kr).to_s
40
+ assert_equal '2002-05-19', @subject.to_solar(2002,4,8, :kr).to_s
41
+ assert_equal '2008-05-12', @subject.to_solar(2008,4,8, :kr).to_s
42
+ assert_equal '2009-05-02', @subject.to_solar(2009,4,8, :kr).to_s
43
+ assert_equal '2010-05-21', @subject.to_solar(2010,4,8, :kr).to_s
44
+ assert_equal '2011-05-10', @subject.to_solar(2011,4,8, :kr).to_s
45
+ assert_equal '2012-05-28', @subject.to_solar(2012,4,8, :kr).to_s
46
+ assert_equal '2013-05-17', @subject.to_solar(2013,4,8, :kr).to_s
47
+ assert_equal '2014-05-06', @subject.to_solar(2014,4,8, :kr).to_s
48
+ assert_equal '2015-05-25', @subject.to_solar(2015,4,8, :kr).to_s
49
+ assert_equal '2016-05-14', @subject.to_solar(2016,4,8, :kr).to_s
50
+ assert_equal '2017-05-03', @subject.to_solar(2017,4,8, :kr).to_s
51
+ assert_equal '2018-05-22', @subject.to_solar(2018,4,8, :kr).to_s
52
+ assert_equal '2019-05-12', @subject.to_solar(2019,4,8, :kr).to_s
53
+ assert_equal '2020-04-30', @subject.to_solar(2020,4,8, :kr).to_s
54
+ assert_equal '2022-05-08', @subject.to_solar(2022,4,8, :kr).to_s
55
+ assert_equal '2025-05-05', @subject.to_solar(2025,4,8, :kr).to_s
56
+ end
57
+
58
+ def test_korean_thanksgiving_returns_expected_results
59
+ assert_equal '1994-09-20', @subject.to_solar(1994,8,15, :kr).to_s
60
+ assert_equal '1995-09-09', @subject.to_solar(1995,8,15, :kr).to_s
61
+ assert_equal '1999-09-24', @subject.to_solar(1999,8,15, :kr).to_s
62
+ assert_equal '2000-09-12', @subject.to_solar(2000,8,15, :kr).to_s
63
+ assert_equal '2001-10-01', @subject.to_solar(2001,8,15, :kr).to_s
64
+ assert_equal '2002-09-21', @subject.to_solar(2002,8,15, :kr).to_s
65
+ assert_equal '2008-09-14', @subject.to_solar(2008,8,15, :kr).to_s
66
+ assert_equal '2009-10-03', @subject.to_solar(2009,8,15, :kr).to_s
67
+ assert_equal '2010-09-22', @subject.to_solar(2010,8,15, :kr).to_s
68
+ assert_equal '2011-09-12', @subject.to_solar(2011,8,15, :kr).to_s
69
+ assert_equal '2012-09-30', @subject.to_solar(2012,8,15, :kr).to_s
70
+ assert_equal '2013-09-19', @subject.to_solar(2013,8,15, :kr).to_s
71
+ assert_equal '2014-09-08', @subject.to_solar(2014,8,15, :kr).to_s
72
+ assert_equal '2015-09-27', @subject.to_solar(2015,8,15, :kr).to_s
73
+ assert_equal '2016-09-15', @subject.to_solar(2016,8,15, :kr).to_s
74
+ assert_equal '2017-10-04', @subject.to_solar(2017,8,15, :kr).to_s
75
+ assert_equal '2018-09-24', @subject.to_solar(2018,8,15, :kr).to_s
76
+ assert_equal '2019-09-13', @subject.to_solar(2019,8,15, :kr).to_s
77
+ assert_equal '2020-10-01', @subject.to_solar(2020,8,15, :kr).to_s
78
+ assert_equal '2022-09-10', @subject.to_solar(2022,8,15, :kr).to_s
79
+ assert_equal '2025-10-06', @subject.to_solar(2025,8,15, :kr).to_s
80
+ end
81
+
82
+ def test_hung_kings_festival_returns_expected_results
83
+ assert_equal '2014-04-09', @subject.to_solar(2014,3,10, :vi).to_s
84
+ assert_equal '2015-04-28', @subject.to_solar(2015,3,10, :vi).to_s
85
+ assert_equal '2016-04-16', @subject.to_solar(2016,3,10, :vi).to_s
86
+ assert_equal '2017-04-06', @subject.to_solar(2017,3,10, :vi).to_s
87
+ assert_equal '2018-03-27', @subject.to_solar(2018,3,10, :vi).to_s
88
+ end
89
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../test_helper'
2
+
3
+ require 'holidays/date_calculator/weekend_modifier'
4
+
5
+ class WeekendModifierDateCalculatorTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::DateCalculator::WeekendModifier.new
8
+ end
9
+
10
+ def test_to_monday_if_weekend
11
+ assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_weekend(Date.civil(2015, 5, 3))
12
+ assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_weekend(Date.civil(2015, 5, 2))
13
+ assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_weekend(Date.civil(2015, 5, 4))
14
+ assert_equal Date.civil(2015, 5, 1), @subject.to_monday_if_weekend(Date.civil(2015, 5, 1))
15
+ end
16
+
17
+ def test_to_monday_if_sunday
18
+ assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_sunday(Date.civil(2015, 5, 3))
19
+ assert_equal Date.civil(2015, 5, 4), @subject.to_monday_if_sunday(Date.civil(2015, 5, 4))
20
+ assert_equal Date.civil(2015, 5, 1), @subject.to_monday_if_sunday(Date.civil(2015, 5, 1))
21
+ assert_equal Date.civil(2015, 5, 2), @subject.to_monday_if_sunday(Date.civil(2015, 5, 2))
22
+ end
23
+
24
+ def test_to_weekday_if_boxing_weekend
25
+ assert_equal Date.civil(2015, 12, 25), @subject.to_weekday_if_boxing_weekend(Date.civil(2015, 12, 25))
26
+ assert_equal Date.civil(2015, 12, 28), @subject.to_weekday_if_boxing_weekend(Date.civil(2015, 12, 26))
27
+ assert_equal Date.civil(2015, 12, 29), @subject.to_weekday_if_boxing_weekend(Date.civil(2015, 12, 27))
28
+ end
29
+
30
+ def test_to_weekday_if_weekend
31
+ assert_equal Date.civil(2015, 5, 4), @subject.to_weekday_if_weekend(Date.civil(2015, 5, 3))
32
+ assert_equal Date.civil(2015, 5, 1), @subject.to_weekday_if_weekend(Date.civil(2015, 5, 2))
33
+ end
34
+
35
+ def test_to_weekday_if_boxing_weekend_from_year
36
+ assert_equal Date.civil(2015, 12, 28), @subject.to_weekday_if_boxing_weekend_from_year(2015)
37
+ end
38
+
39
+ def test_to_weekday_if_boxing_weekend_from_year_or_to_tuesday_if_monday
40
+ assert_equal Date.civil(2015, 12, 28), @subject.to_weekday_if_boxing_weekend_from_year_or_to_tuesday_if_monday(2015) # saturday to monday
41
+ assert_equal Date.civil(2016, 12, 27), @subject.to_weekday_if_boxing_weekend_from_year_or_to_tuesday_if_monday(2016) # monday to tuesday
42
+ end
43
+
44
+ def test_to_tuesday_if_sunday_or_monday_if_saturday
45
+ assert_equal Date.civil(2016, 12, 26), @subject.to_tuesday_if_sunday_or_monday_if_saturday(Date.civil(2016, 12, 24)) # sat to mon
46
+ assert_equal Date.civil(2016, 12, 27), @subject.to_tuesday_if_sunday_or_monday_if_saturday(Date.civil(2016, 12, 25)) # sun to tue
47
+ end
48
+
49
+ def test_to_next_weekday
50
+ assert_equal Date.civil(2016, 3, 21), @subject.to_next_weekday(Date.civil(2016, 3, 20))
51
+ assert_equal Date.civil(2016, 3, 22), @subject.to_next_weekday(Date.civil(2016, 3, 21))
52
+ assert_equal Date.civil(2016, 3, 28), @subject.to_next_weekday(Date.civil(2016, 3, 25))
53
+ end
54
+ end
@@ -0,0 +1,199 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/definition/context/function_processor'
4
+
5
+ class FunctionProcessorTests < Test::Unit::TestCase
6
+ def setup
7
+ @year = 2016
8
+ @month = 1
9
+ @day = 15
10
+ @region = :test
11
+ @input = { year: @year, month: @month, day: @day, region: @region }
12
+
13
+ @func_id = "custom_function_id"
14
+ @func_args = [:year]
15
+ @func_modifier = 1
16
+
17
+ @custom_methods_repo = mock()
18
+ @proc_result_cache_repo = mock()
19
+
20
+ @custom_func = mock()
21
+
22
+ @custom_methods_repo.expects(:find).at_most_once.with(@func_id).returns(@custom_func)
23
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @year).returns(Date.civil(@year, @month, @day))
24
+
25
+ @subject = Holidays::Definition::Context::FunctionProcessor.new(
26
+ @custom_methods_repo,
27
+ @proc_result_cache_repo,
28
+ )
29
+ end
30
+
31
+ def test_no_function_arguments_returns_error
32
+ assert_raises ArgumentError do
33
+ @subject.call(@input, @func_id, nil, @func_modifier)
34
+ end
35
+
36
+ assert_raises ArgumentError do
37
+ @subject.call(@input, @func_id, [], @func_modifier)
38
+ end
39
+ end
40
+
41
+ def test_unknown_function_argument_returns_error
42
+ assert_raises ArgumentError do
43
+ @subject.call(@input, @func_id, [:something], @func_modifier)
44
+ end
45
+ end
46
+
47
+ def test_unknown_function_id_returns_error
48
+ bad_id = "some-bad-id"
49
+ @custom_methods_repo.expects(:find).at_most_once.with(bad_id).returns(nil)
50
+
51
+ assert_raises Holidays::FunctionNotFound do
52
+ @subject.call(@input, bad_id, @func_args, @func_modifier)
53
+ end
54
+ end
55
+
56
+ def test_year_arg_passed_to_func_call
57
+ @func_args = [:year]
58
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @year).returns(Date.civil(2016, 1, 15))
59
+
60
+ @subject.call(@input, @func_id, @func_args, @func_modifier)
61
+ end
62
+
63
+ def test_month_arg_passed_to_func_call
64
+ @func_args = [:month]
65
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @month).returns(Date.civil(2016, 1, 15))
66
+
67
+ @subject.call(@input, @func_id, @func_args, @func_modifier)
68
+ end
69
+
70
+ def test_day_arg_passed_to_func_call
71
+ @func_args = [:day]
72
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @day).returns(Date.civil(2016, 1, 15))
73
+
74
+ @subject.call(@input, @func_id, @func_args, @func_modifier)
75
+ end
76
+
77
+ def test_date_arg_passed_to_func_call
78
+ @func_args = [:date]
79
+ date = Date.civil(@year, @month, @day)
80
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, date).returns(date)
81
+
82
+ @subject.call(@input, @func_id, @func_args, @func_modifier)
83
+ end
84
+
85
+ def test_multiple_args_passed_to_func_call
86
+ @func_args = [:month, :day]
87
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @month, @day).returns(Date.civil(2016, 1, 15))
88
+
89
+ @subject.call(@input, @func_id, @func_args, @func_modifier)
90
+ end
91
+
92
+ def test_multiple_args_with_region_passed_to_func_call
93
+ @func_args = [:month, :day, :region]
94
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @month, @day, @region).returns(Date.civil(2016, 1, 15))
95
+
96
+ @subject.call(@input, @func_id, @func_args, @func_modifier)
97
+ end
98
+
99
+ def test_call_returns_error_if_target_function_returns_unknown_value
100
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @year).returns("bad-response")
101
+
102
+ assert_raises Holidays::InvalidFunctionResponse do
103
+ @subject.call(@input, @func_id, @func_args, @func_modifier)
104
+ end
105
+ end
106
+
107
+ def test_call_returns_date_with_modifier
108
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @year).returns(Date.civil(2016, 3, 10))
109
+
110
+ result = @subject.call(@input, @func_id, @func_args, @func_modifier)
111
+
112
+ assert_equal(Date.civil(2016, 3, 10) + @func_modifier, result)
113
+ end
114
+
115
+ def test_call_returns_date_no_modifier
116
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @year).returns(Date.civil(2016, 3, 10))
117
+
118
+ result = @subject.call(@input, @func_id, @func_args, nil)
119
+
120
+ assert_equal(Date.civil(2016, 3, 10), result)
121
+ end
122
+
123
+ def test_call_returns_errors_when_custom_function_returns_non_date
124
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @year).returns("bad")
125
+
126
+ assert_raises Holidays::InvalidFunctionResponse do
127
+ @subject.call(@input, @func_id, @func_args, nil)
128
+ end
129
+ end
130
+
131
+ def test_call_returns_error_when_custom_function_returns_mday_but_resulting_date_is_invalid
132
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @year).returns(32)
133
+
134
+ assert_raises Holidays::InvalidFunctionResponse do
135
+ @subject.call(@input, @func_id, @func_args, nil)
136
+ end
137
+ end
138
+
139
+ def test_call_returns_integer_returns_modified_date
140
+ @proc_result_cache_repo.expects(:lookup).at_most_once.with(@custom_func, @year).returns(7)
141
+
142
+ result = @subject.call(@input, @func_id, @func_args, nil)
143
+
144
+ assert_equal(Date.civil(2016, 1, 7), result)
145
+ end
146
+
147
+ def test_func_modifier_not_required
148
+ result = @subject.call(@input, @func_id, @func_args)
149
+ assert_equal(Date.civil(2016, 1, 15), result)
150
+ end
151
+
152
+ def test_validate_returns_error_if_year_not_a_number
153
+ @input[:year] = 'bad-year'
154
+ assert_raises ArgumentError do
155
+ @subject.call(@input, @func_id, @func_args)
156
+ end
157
+ end
158
+
159
+ def test_validate_returns_error_if_month_not_valid
160
+ @input[:month] = 'bad-month'
161
+ assert_raises ArgumentError do
162
+ @subject.call(@input, @func_id, [:month])
163
+ end
164
+
165
+ @input[:month] = -1
166
+ assert_raises ArgumentError do
167
+ @subject.call(@input, @func_id, [:month])
168
+ end
169
+
170
+ @input[:month] = 13
171
+ assert_raises ArgumentError do
172
+ @subject.call(@input, @func_id, [:month])
173
+ end
174
+ end
175
+
176
+ def test_validate_returns_error_if_day_is_not_valid
177
+ @input[:day] = 0
178
+ assert_raises ArgumentError do
179
+ @subject.call(@input, @func_id, [:day])
180
+ end
181
+
182
+ @input[:day] = 32
183
+ assert_raises ArgumentError do
184
+ @subject.call(@input, @func_id, [:day])
185
+ end
186
+
187
+ @input[:day] = 'bad-day'
188
+ assert_raises ArgumentError do
189
+ @subject.call(@input, @func_id, [:day])
190
+ end
191
+ end
192
+
193
+ def test_validate_returns_error_if_region_not_a_symbol
194
+ @input[:region] = 'blah'
195
+ assert_raises ArgumentError do
196
+ @subject.call(@input, @func_id, [:region])
197
+ end
198
+ end
199
+ end