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,94 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/definition/validator/custom_method'
4
+
5
+ class CustomMethodValidatorTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::Definition::Validator::CustomMethod.new
8
+ end
9
+
10
+ def test_valid_returns_true_if_valid
11
+ m = {:name => "good_method", :arguments => "year", :source => "source"}
12
+ assert @subject.valid?(m)
13
+ end
14
+
15
+ def test_valid_returns_true_with_multiple_arguments
16
+ m = {:name => "good_method", :arguments => "year,month", :source => "source"}
17
+ assert @subject.valid?(m)
18
+ end
19
+
20
+ def test_valid_returns_true_with_date_argument
21
+ m = {:name => "good_method", :arguments => "date", :source => "source"}
22
+ assert @subject.valid?(m)
23
+ end
24
+
25
+ def test_valid_returns_true_with_year_argument
26
+ m = {:name => "good_method", :arguments => "year", :source => "source"}
27
+ assert @subject.valid?(m)
28
+ end
29
+
30
+ def test_valid_returns_true_with_month_argument
31
+ m = {:name => "good_method", :arguments => "month", :source => "source"}
32
+ assert @subject.valid?(m)
33
+ end
34
+
35
+ def test_valid_returns_true_with_day_argument
36
+ m = {:name => "good_method", :arguments => "day", :source => "source"}
37
+ assert @subject.valid?(m)
38
+ end
39
+
40
+ def test_valid_returns_true_with_region_argument
41
+ m = {:name => "good_method", :arguments => "region", :source => "source"}
42
+ assert @subject.valid?(m)
43
+ end
44
+
45
+ def test_valid_returns_true_multiple_arguments_with_whitespace
46
+ m = {:name => "good_method", :arguments => "year , month", :source => "source"}
47
+ assert @subject.valid?(m)
48
+ end
49
+
50
+ def test_valid_returns_false_if_single_argument_contain_carriage_return
51
+ m = {:name => "bad_method", :arguments =>"year\n", :source =>"d = Date.civil(year, 1, 1)\nd + 2\n"}
52
+ assert_false @subject.valid?(m)
53
+ end
54
+
55
+ def test_valid_returns_false_if_multiple_arguments_contain_carriage_return
56
+ m = {:name => "bad_method", :arguments =>"year,month\n", :source =>"d = Date.civil(year, 1, 1)\nd + 2\n"}
57
+ assert_false @subject.valid?(m)
58
+ end
59
+
60
+ def test_valid_returns_false_if_multiple_arguments_contain_carriage_return_with_whitespace
61
+ m = {:name => "bad_method", :arguments =>"year , month\n", :source =>"d = Date.civil(year, 1, 1)\nd + 2\n"}
62
+ assert_false @subject.valid?(m)
63
+ end
64
+
65
+ def test_valid_returns_false_if_no_source
66
+ m = {:name => "bad_method", :arguments => "day"}
67
+ assert_false @subject.valid?(m)
68
+ end
69
+
70
+ def test_valid_returns_false_if_source_is_empty
71
+ m = {:name => "bad_method", :arguments => "day", :source => ""}
72
+ assert_false @subject.valid?(m)
73
+ end
74
+
75
+ def test_valid_returns_false_if_name_is_missing
76
+ m = {:arguments => "day", :source => "source"}
77
+ assert_false @subject.valid?(m)
78
+ end
79
+
80
+ def test_valid_returns_false_if_name_is_empty
81
+ m = {:name => "", :arguments => "day", :source => "source"}
82
+ assert_false @subject.valid?(m)
83
+ end
84
+
85
+ def test_returns_false_if_multiple_arguments_contain_unrecognized_value
86
+ m = {:name => "bad_method", :arguments => "year,month,day,date,unknown", :source => "source"}
87
+ assert_false @subject.valid?(m)
88
+ end
89
+
90
+ def test_returns_false_if_single_argument_contains_unrecognized_value
91
+ m = {:name => "bad_method", :arguments => "unknown", :source => "source"}
92
+ assert_false @subject.valid?(m)
93
+ end
94
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/definition/validator/region'
4
+
5
+ class RegionValidatorTests < Test::Unit::TestCase
6
+ def setup
7
+ @regions_repo = mock()
8
+ @regions_repo.stubs(:loaded?).returns(false)
9
+ @regions_repo.stubs(:all_generated).returns([])
10
+
11
+ @subject = Holidays::Definition::Validator::Region.new(@regions_repo)
12
+ end
13
+
14
+ def test_returns_true_if_region_loaded_in_generated_files
15
+ @regions_repo.expects(:all_generated).returns([:us])
16
+ assert(@subject.valid?(:us))
17
+ end
18
+
19
+ def test_returns_true_if_region_is_in_regions_repository
20
+ @regions_repo.expects(:loaded?).with(:custom).returns(true)
21
+ assert(@subject.valid?(:custom))
22
+ end
23
+
24
+ def test_returns_false_if_region_does_not_exist_in_generated_files_or_regions_repo
25
+ @regions_repo.expects(:loaded?).with(:unknown_region).returns(false)
26
+ assert_equal(false, @subject.valid?(:unknown_region))
27
+ end
28
+
29
+ def test_returns_false_if_region_is_not_a_symbol
30
+ assert_equal(false, @subject.valid?('not-a-symbol'))
31
+ end
32
+
33
+ def test_returns_true_if_region_is_any
34
+ assert(@subject.valid?(:any))
35
+ end
36
+
37
+ def test_returns_true_if_wildcard_region_is_valid
38
+ @regions_repo.expects(:all_generated).returns([:gb])
39
+ assert(@subject.valid?(:gb_))
40
+ end
41
+
42
+ def test_returns_false_if_wildcard_region_is_invalid
43
+ assert_equal(false, @subject.valid?(:somethingweird_))
44
+ end
45
+
46
+ def test_returns_false_if_malicious_region_is_given
47
+ assert_equal(false, @subject.valid?(:"../../../test"))
48
+ end
49
+
50
+ def test_returns_true_with_multiple_underscores
51
+ @regions_repo.expects(:loaded?).with(:some_test_region).returns(true)
52
+ assert(@subject.valid?(:some_test_region))
53
+ end
54
+ end
@@ -0,0 +1,60 @@
1
+ # Heh at this file name
2
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
3
+
4
+ require 'holidays/definition/validator/test'
5
+
6
+ class TestValidatorTests < Test::Unit::TestCase
7
+ def setup
8
+ @subject = Holidays::Definition::Validator::Test.new
9
+ end
10
+
11
+ def test_returns_true_if_valid
12
+ t = {:dates => ['2016-01-01'], :regions => ['us'], :name => 'test', holiday: true, :options => ['option1']}
13
+ assert @subject.valid?(t)
14
+ end
15
+
16
+ def test_returns_false_if_missing_dates
17
+ t = {:regions => ['us'], :name => 'test'}
18
+ assert_equal false, @subject.valid?(t)
19
+ end
20
+
21
+ def test_returns_false_if_dates_contains_invalid_value
22
+ t = {:dates => ['2016-01-01', 'invalid-date'], :regions => ['us'], :name => 'test'}
23
+ assert_equal false, @subject.valid?(t)
24
+ end
25
+
26
+ def test_returns_false_if_missing_regions
27
+ t = {:dates => ['2016-01-01'], :name => 'test'}
28
+ assert_equal false, @subject.valid?(t)
29
+ end
30
+
31
+ def test_returns_false_if_regions_contains_non_string
32
+ t = {:dates => ['2016-01-01'], :regions => [3], :name => 'test'}
33
+ assert_equal false, @subject.valid?(t)
34
+ end
35
+
36
+ def test_returns_false_if_name_not_a_string
37
+ t = {:dates => ['2016-01-01'], :regions => ['us'], :name => 3}
38
+ assert_equal false, @subject.valid?(t)
39
+ end
40
+
41
+ def test_returns_false_if_holiday_not_a_boolean
42
+ t = {:dates => ['2016-01-01'], :regions => ['us'], :name => 'Test', :holiday => 'invalid'}
43
+ assert_equal false, @subject.valid?(t)
44
+ end
45
+
46
+ def test_returns_true_if_options_not_array_but_is_string
47
+ t = {:dates => ['2016-01-01'], :regions => ['us'], :name => 'test', :options => 'option1'}
48
+ assert @subject.valid?(t)
49
+ end
50
+
51
+ def test_returns_false_if_options_contains_non_string
52
+ t = {:dates => ['2016-01-01'], :regions => ['us'], :name => 'Test', :options => [3]}
53
+ assert_equal false, @subject.valid?(t)
54
+ end
55
+
56
+ def test_returns_false_if_both_holiday_and_name_are_missing
57
+ t = {:dates => ['2016-01-01'], :regions => ['us']}
58
+ assert_equal false, @subject.valid?(t)
59
+ end
60
+ end
@@ -0,0 +1,172 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/finder/context/between'
4
+
5
+ class BetweenTests < Test::Unit::TestCase
6
+ def setup
7
+ @regions = [:us]
8
+ @observed = false
9
+ @informal = false
10
+
11
+ @definition_search = mock()
12
+ @dates_driver_builder = mock()
13
+ @options_parser = mock()
14
+
15
+ @subject = Holidays::Finder::Context::Between.new(
16
+ @definition_search,
17
+ @dates_driver_builder,
18
+ @options_parser,
19
+ )
20
+
21
+ @start_date = Date.civil(2015, 1, 1)
22
+ @end_date = Date.civil(2015, 1, 1)
23
+ @dates_driver = {2015 => [0, 1, 2], 2014 => [0, 12]}
24
+ @options = [@regions, @observed, @informal]
25
+
26
+ @definition_search.expects(:call).at_most_once.with(
27
+ @dates_driver,
28
+ @regions,
29
+ [],
30
+ ).returns([{
31
+ :date => Date.civil(2015, 1, 1),
32
+ :name => "Test",
33
+ :regions => [:us],
34
+ }])
35
+
36
+ @dates_driver_builder.expects(:call).at_most_once.with(
37
+ @start_date, @end_date,
38
+ ).returns(
39
+ @dates_driver,
40
+ )
41
+
42
+ @options_parser.expects(:call).at_most_once.with(@options).returns(@options)
43
+ end
44
+
45
+ def test_returns_error_if_start_date_is_missing
46
+ assert_raise ArgumentError do
47
+ @subject.call(nil, @end_date, @options)
48
+ end
49
+ end
50
+
51
+ def test_returns_error_if_end_date_is_missing
52
+ assert_raise ArgumentError do
53
+ @subject.call(@start_date, nil, @options)
54
+ end
55
+ end
56
+
57
+ def test_returns_single_holiday
58
+ assert_equal(
59
+ [
60
+ {
61
+ :date => Date.civil(2015, 1, 1),
62
+ :name => "Test",
63
+ :regions => [:us],
64
+ }
65
+ ],
66
+ @subject.call(@start_date, @end_date, @options)
67
+ )
68
+ end
69
+
70
+ def test_returns_sorted_multiple_holidays
71
+ @start_date = Date.civil(2015, 1, 1)
72
+ @end_date = Date.civil(2016, 12, 31)
73
+
74
+ @definition_search.expects(:call).at_most_once.with(
75
+ @dates_driver,
76
+ @regions,
77
+ [],
78
+ ).returns([
79
+ {
80
+ :date => Date.civil(2015, 6, 1),
81
+ :name => "2015-June",
82
+ :regions => [:us],
83
+ },
84
+ {
85
+ :date => Date.civil(2015, 1, 1),
86
+ :name => "2015-Jan",
87
+ :regions => [:us],
88
+ },
89
+ {
90
+ :date => Date.civil(2016, 6, 1),
91
+ :name => "2016-June",
92
+ :regions => [:us],
93
+ },
94
+ ])
95
+
96
+ @dates_driver_builder.expects(:call).at_most_once.with(
97
+ @start_date, @end_date,
98
+ ).returns(
99
+ @dates_driver,
100
+ )
101
+
102
+ assert_equal(
103
+ [
104
+ {
105
+ :date => Date.civil(2015, 1, 1),
106
+ :name => "2015-Jan",
107
+ :regions => [:us],
108
+ },
109
+ {
110
+ :date => Date.civil(2015, 6, 1),
111
+ :name => "2015-June",
112
+ :regions => [:us],
113
+ },
114
+ {
115
+ :date => Date.civil(2016, 6, 1),
116
+ :name => "2016-June",
117
+ :regions => [:us],
118
+ },
119
+ ],
120
+ @subject.call(@start_date, @end_date, @options)
121
+ )
122
+ end
123
+
124
+ def test_filters_holidays_returned_by_search_if_not_in_date_range
125
+ @start_date = Date.civil(2015, 1, 1)
126
+ @end_date = Date.civil(2015, 12, 31)
127
+
128
+ @definition_search.expects(:call).at_most_once.with(
129
+ @dates_driver,
130
+ @regions,
131
+ [],
132
+ ).returns([
133
+ {
134
+ :date => Date.civil(2015, 6, 1),
135
+ :name => "2015-June",
136
+ :regions => [:us],
137
+ },
138
+ {
139
+ :date => Date.civil(2015, 1, 1),
140
+ :name => "2015-Jan",
141
+ :regions => [:us],
142
+ },
143
+ {
144
+ :date => Date.civil(2016, 6, 1),
145
+ :name => "2016-June",
146
+ :regions => [:us],
147
+ },
148
+ ])
149
+
150
+ @dates_driver_builder.expects(:call).at_most_once.with(
151
+ @start_date, @end_date,
152
+ ).returns(
153
+ @dates_driver,
154
+ )
155
+
156
+ assert_equal(
157
+ [
158
+ {
159
+ :date => Date.civil(2015, 1, 1),
160
+ :name => "2015-Jan",
161
+ :regions => [:us],
162
+ },
163
+ {
164
+ :date => Date.civil(2015, 6, 1),
165
+ :name => "2015-June",
166
+ :regions => [:us],
167
+ },
168
+ ],
169
+ @subject.call(@start_date, @end_date, @options)
170
+ )
171
+ end
172
+ end
@@ -0,0 +1,91 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/finder/context/dates_driver_builder'
4
+
5
+ class DatesDriverBuilderTests < Test::Unit::TestCase
6
+ def setup
7
+ @subject = Holidays::Finder::Context::DatesDriverBuilder.new
8
+ end
9
+
10
+ def test_returns_appropriately_formatted_hash
11
+ start_date = Date.civil(2015, 1, 1)
12
+ end_date = Date.civil(2015, 1, 31)
13
+
14
+ dates_driver = @subject.call(start_date, end_date)
15
+
16
+ assert(dates_driver.is_a?(Hash))
17
+
18
+ dates_driver.each do |year, months|
19
+ assert(year.is_a?(Integer))
20
+ assert(months.is_a?(Array))
21
+ end
22
+ end
23
+
24
+ def test_all_years_always_contains_variable_month
25
+ start_date = Date.civil(2010, 1, 1)
26
+ end_date = Date.civil(2020, 1, 1)
27
+
28
+ dates_driver = @subject.call(start_date, end_date)
29
+
30
+ assert(dates_driver[2010].include?(0))
31
+ assert(dates_driver[2011].include?(0))
32
+ assert(dates_driver[2012].include?(0))
33
+ assert(dates_driver[2013].include?(0))
34
+ assert(dates_driver[2014].include?(0))
35
+ assert(dates_driver[2015].include?(0))
36
+ assert(dates_driver[2016].include?(0))
37
+ assert(dates_driver[2017].include?(0))
38
+ assert(dates_driver[2018].include?(0))
39
+ assert(dates_driver[2019].include?(0))
40
+ assert(dates_driver[2020].include?(0))
41
+ end
42
+
43
+ def test_january_includes_february
44
+ dates_driver = @subject.call(Date.civil(2015, 1, 1), Date.civil(2015, 1, 1))
45
+
46
+ assert(dates_driver[2015].include?(1))
47
+ assert(dates_driver[2015].include?(2))
48
+ end
49
+
50
+ def test_january_includes_previous_year_december
51
+ dates_driver = @subject.call(Date.civil(2015, 1, 1), Date.civil(2015, 1, 1))
52
+
53
+ assert(dates_driver[2015].include?(1))
54
+ assert(dates_driver[2014].include?(12))
55
+ end
56
+
57
+ def test_december_includes_november
58
+ dates_driver = @subject.call(Date.civil(2015, 12, 1), Date.civil(2015, 12, 1))
59
+
60
+ assert(dates_driver[2015].include?(12))
61
+ assert(dates_driver[2015].include?(11))
62
+ end
63
+
64
+ def test_december_includes_next_year_january
65
+ dates_driver = @subject.call(Date.civil(2015, 12, 1), Date.civil(2015, 12, 1))
66
+
67
+ assert(dates_driver[2015].include?(12))
68
+ assert(dates_driver[2016].include?(1))
69
+ end
70
+
71
+ def test_middle_months_include_border_months
72
+ dates_driver = @subject.call(Date.civil(2015, 5, 1), Date.civil(2015, 5, 1))
73
+ assert(dates_driver[2015].include?(4))
74
+ assert(dates_driver[2015].include?(5))
75
+ assert(dates_driver[2015].include?(6))
76
+
77
+ dates_driver = @subject.call(Date.civil(2015, 10, 1), Date.civil(2015, 10, 1))
78
+ assert(dates_driver[2015].include?(9))
79
+ assert(dates_driver[2015].include?(10))
80
+ assert(dates_driver[2015].include?(11))
81
+
82
+ dates_driver = @subject.call(Date.civil(2015, 3, 1), Date.civil(2015, 7, 1))
83
+ assert(dates_driver[2015].include?(2))
84
+ assert(dates_driver[2015].include?(3))
85
+ assert(dates_driver[2015].include?(4))
86
+ assert(dates_driver[2015].include?(5))
87
+ assert(dates_driver[2015].include?(6))
88
+ assert(dates_driver[2015].include?(7))
89
+ assert(dates_driver[2015].include?(8))
90
+ end
91
+ end
@@ -0,0 +1,156 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
2
+
3
+ require 'holidays/finder/context/next_holiday'
4
+
5
+ class NextHolidayTests < Test::Unit::TestCase
6
+ def setup
7
+ @regions = [:us]
8
+ @observed = false
9
+ @informal = false
10
+
11
+ @definition_search = mock()
12
+ @dates_driver_builder = mock()
13
+ @options_parser = mock()
14
+
15
+ @subject = Holidays::Finder::Context::NextHoliday.new(
16
+ @definition_search,
17
+ @dates_driver_builder,
18
+ @options_parser,
19
+ )
20
+
21
+ @holiday_count = 1
22
+ @from_date= Date.civil(2015, 1, 1)
23
+ @dates_driver = {2015 => [0, 1, 2], 2014 => [0, 12]}
24
+ @options = [@regions, @observed, @informal]
25
+
26
+ @definition_search.expects(:call).at_most_once.with(
27
+ @dates_driver,
28
+ @regions,
29
+ [],
30
+ ).returns([{
31
+ :date => Date.civil(2015, 1, 1),
32
+ :name => "Test",
33
+ :regions => [:us],
34
+ }])
35
+
36
+ @dates_driver_builder.expects(:call).at_most_once.with(
37
+ @from_date, @from_date >> 12,
38
+ ).returns(
39
+ @dates_driver,
40
+ )
41
+
42
+ @options_parser.expects(:call).at_most_once.with(@options).returns(@options)
43
+ end
44
+
45
+ def test_returns_error_if_holidays_count_is_missing
46
+ assert_raise ArgumentError do
47
+ @subject.call(nil, @from_date, @options)
48
+ end
49
+ end
50
+
51
+ def test_returns_error_if_holidays_count_is_less_than_or_equal_to_zero
52
+ assert_raise ArgumentError do
53
+ @subject.call(0, @from_date, @options)
54
+ end
55
+ end
56
+
57
+ def test_returns_error_if_from_date_is_missing
58
+ assert_raise ArgumentError do
59
+ @subject.call(@holiday_count, nil, @options)
60
+ end
61
+ end
62
+
63
+ def test_returns_single_holiday
64
+ assert_equal(
65
+ [
66
+ {
67
+ :date => Date.civil(2015, 1, 1),
68
+ :name => "Test",
69
+ :regions => [:us],
70
+ }
71
+ ],
72
+ @subject.call(@holiday_count, @from_date, @options)
73
+ )
74
+ end
75
+
76
+ def test_returns_correct_holidays_based_on_holiday_count
77
+ @definition_search.expects(:call).at_most_once.with(
78
+ @dates_driver,
79
+ @regions,
80
+ [],
81
+ ).returns([
82
+ {
83
+ :date => Date.civil(2015, 1, 1),
84
+ :name => "Test",
85
+ :regions => [:us],
86
+ },
87
+ {
88
+ :date => Date.civil(2015, 2, 1),
89
+ :name => "Test",
90
+ :regions => [:us],
91
+ },
92
+ {
93
+ :date => Date.civil(2015, 12, 1),
94
+ :name => "Test",
95
+ :regions => [:us],
96
+ },
97
+ ])
98
+
99
+ assert_equal(
100
+ [
101
+ {
102
+ :date => Date.civil(2015, 1, 1),
103
+ :name => "Test",
104
+ :regions => [:us],
105
+ },
106
+ {
107
+ :date => Date.civil(2015, 2, 1),
108
+ :name => "Test",
109
+ :regions => [:us],
110
+ }
111
+ ],
112
+ @subject.call(2, @from_date, @options)
113
+ )
114
+ end
115
+
116
+ def test_returns_correctly_sorted_holidays_based_on_holiday_count_if_holidays_are_out_of_order
117
+ @definition_search.expects(:call).at_most_once.with(
118
+ @dates_driver,
119
+ @regions,
120
+ [],
121
+ ).returns([
122
+ {
123
+ :date => Date.civil(2015, 1, 1),
124
+ :name => "Test",
125
+ :regions => [:us],
126
+ },
127
+ {
128
+ :date => Date.civil(2015, 12, 1),
129
+ :name => "Test",
130
+ :regions => [:us],
131
+ },
132
+ {
133
+ :date => Date.civil(2015, 2, 1),
134
+ :name => "Test",
135
+ :regions => [:us],
136
+ },
137
+ ]
138
+ )
139
+
140
+ assert_equal(
141
+ [
142
+ {
143
+ :date => Date.civil(2015, 1, 1),
144
+ :name => "Test",
145
+ :regions => [:us],
146
+ },
147
+ {
148
+ :date => Date.civil(2015, 2, 1),
149
+ :name => "Test",
150
+ :regions => [:us],
151
+ }
152
+ ],
153
+ @subject.call(2, @from_date, @options)
154
+ )
155
+ end
156
+ end