sapor 0.3.3

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 (332) hide show
  1. checksums.yaml +7 -0
  2. data/Area Class Diagram.dia +0 -0
  3. data/Area Class Diagram.png +0 -0
  4. data/Class Diagram.dia +0 -0
  5. data/Class Diagram.png +0 -0
  6. data/Example-Catalonia.md +361 -0
  7. data/Example-Flanders.md +486 -0
  8. data/Example-Greece.md +25 -0
  9. data/Example-Oslo.md +678 -0
  10. data/Example-UnitedKingdom-Referendum.md +132 -0
  11. data/Examples.md +15 -0
  12. data/LICENSE +674 -0
  13. data/README.md +103 -0
  14. data/Rakefile +18 -0
  15. data/Technical Documentation.md +14 -0
  16. data/bin/create_installation_package.sh +49 -0
  17. data/bin/install.sh +45 -0
  18. data/bin/sapor.rb +24 -0
  19. data/bin/sapor.sh +106 -0
  20. data/data/hu/hungary-2014.txt +1680 -0
  21. data/data/hu/hungary_2014_screen_scraper.rb +48 -0
  22. data/data/hu/hungary_2014_to_psv.rb +80 -0
  23. data/data/hu/index-2014.txt +106 -0
  24. data/data/pl/2015-gl-lis-okr.csv +42 -0
  25. data/data/pl/poland_2015_to_psv.rb +79 -0
  26. data/data/pl/poland_2015_to_psv_with_ko_and_rsw.rb +94 -0
  27. data/data/pl/poland_2015_to_psv_with_ko_konf_kp_l_and_zp.rb +100 -0
  28. data/data/pl/poland_2015_to_psv_with_ko_sld_and_wi.rb +92 -0
  29. data/data/pl/poland_2015_to_psv_with_sld.rb +84 -0
  30. data/data/pl/poland_2015_to_psv_with_sld_and_wi.rb +85 -0
  31. data/data/uk/inject_ukip_2015_as_brexit_2019_in_2017.rb +54 -0
  32. data/data/uk/united_kingdom_2015.txt +651 -0
  33. data/data/uk/united_kingdom_2015_to_psv.rb +104 -0
  34. data/data/uk/united_kingdom_2017.txt +651 -0
  35. data/data/uk/united_kingdom_2017_to_psv.rb +104 -0
  36. data/data/uk/united_kingdom_2017_to_psv_with_brexit_and_chuk.rb +113 -0
  37. data/data/uk/united_kingdom_2017_to_psv_with_tig.rb +111 -0
  38. data/lib/sapor.rb +150 -0
  39. data/lib/sapor/binomials_cache.rb +45 -0
  40. data/lib/sapor/combinations_distribution.rb +222 -0
  41. data/lib/sapor/denominators.rb +67 -0
  42. data/lib/sapor/dichotomies.rb +138 -0
  43. data/lib/sapor/dichotomy.rb +164 -0
  44. data/lib/sapor/first_past_the_post.rb +82 -0
  45. data/lib/sapor/largest_remainder.rb +118 -0
  46. data/lib/sapor/log4r_logger.rb +49 -0
  47. data/lib/sapor/log_facade.rb +40 -0
  48. data/lib/sapor/multi_district_leveled_proportional.rb +64 -0
  49. data/lib/sapor/multi_district_proportional.rb +123 -0
  50. data/lib/sapor/multi_district_variable_threshold_proportional.rb +128 -0
  51. data/lib/sapor/number_formatter.rb +45 -0
  52. data/lib/sapor/options.rb +73 -0
  53. data/lib/sapor/poll.rb +286 -0
  54. data/lib/sapor/polychotomy.rb +200 -0
  55. data/lib/sapor/pseudorandom_multirange_enumerator.rb +87 -0
  56. data/lib/sapor/referendum_polychotomy.rb +165 -0
  57. data/lib/sapor/regional_data/area.rb +82 -0
  58. data/lib/sapor/regional_data/austria.rb +84 -0
  59. data/lib/sapor/regional_data/belgium-brussels-2014.psv +46 -0
  60. data/lib/sapor/regional_data/belgium-brussels-20190526.psv +33 -0
  61. data/lib/sapor/regional_data/belgium-flanders-2014.psv +80 -0
  62. data/lib/sapor/regional_data/belgium-flanders-20190526.psv +74 -0
  63. data/lib/sapor/regional_data/belgium-wallonia-2014.psv +114 -0
  64. data/lib/sapor/regional_data/belgium-wallonia-20190526.psv +93 -0
  65. data/lib/sapor/regional_data/belgium.rb +97 -0
  66. data/lib/sapor/regional_data/belgium_brussels.rb +62 -0
  67. data/lib/sapor/regional_data/belgium_flanders.rb +64 -0
  68. data/lib/sapor/regional_data/belgium_wallonia.rb +63 -0
  69. data/lib/sapor/regional_data/catalonia-2012-2015.psv +100 -0
  70. data/lib/sapor/regional_data/catalonia-2012.psv +87 -0
  71. data/lib/sapor/regional_data/catalonia-2015-jxcat.psv +68 -0
  72. data/lib/sapor/regional_data/catalonia-2015-no-jxsi.psv +68 -0
  73. data/lib/sapor/regional_data/catalonia-2015.psv +63 -0
  74. data/lib/sapor/regional_data/catalonia-jxcat.rb +109 -0
  75. data/lib/sapor/regional_data/catalonia-no-jxsi.rb +96 -0
  76. data/lib/sapor/regional_data/catalonia.rb +96 -0
  77. data/lib/sapor/regional_data/denmark-20150618-with-e-and-p.psv +164 -0
  78. data/lib/sapor/regional_data/denmark-20150618-with-e.psv +153 -0
  79. data/lib/sapor/regional_data/denmark-20150618-with-p.psv +153 -0
  80. data/lib/sapor/regional_data/denmark-20150618.psv +142 -0
  81. data/lib/sapor/regional_data/denmark.rb +128 -0
  82. data/lib/sapor/regional_data/denmark_with_e.rb +128 -0
  83. data/lib/sapor/regional_data/denmark_with_e_and_p.rb +128 -0
  84. data/lib/sapor/regional_data/denmark_with_p.rb +128 -0
  85. data/lib/sapor/regional_data/estonia.rb +88 -0
  86. data/lib/sapor/regional_data/european-union-great-britain-20140522-brexit-chuk.psv +172 -0
  87. data/lib/sapor/regional_data/european-union-great-britain-20140522.psv +146 -0
  88. data/lib/sapor/regional_data/european-union-great-britain-20190523.psv +141 -0
  89. data/lib/sapor/regional_data/european-union-ireland-2014-ia-ri-sd.psv +64 -0
  90. data/lib/sapor/regional_data/european-union-ireland-2014-ia-sd.psv +60 -0
  91. data/lib/sapor/regional_data/european-union-ireland-2014-ia.psv +56 -0
  92. data/lib/sapor/regional_data/european-union-ireland-2014-sd.psv +56 -0
  93. data/lib/sapor/regional_data/european-union-ireland-2014.psv +50 -0
  94. data/lib/sapor/regional_data/european-union-ireland-20190524-ia.psv +58 -0
  95. data/lib/sapor/regional_data/european-union-ireland-20190524.psv +52 -0
  96. data/lib/sapor/regional_data/european_union_27_austria.rb +76 -0
  97. data/lib/sapor/regional_data/european_union_27_croatia.rb +81 -0
  98. data/lib/sapor/regional_data/european_union_27_denmark.rb +77 -0
  99. data/lib/sapor/regional_data/european_union_27_estonia.rb +74 -0
  100. data/lib/sapor/regional_data/european_union_27_finland.rb +74 -0
  101. data/lib/sapor/regional_data/european_union_27_ireland.rb +96 -0
  102. data/lib/sapor/regional_data/european_union_27_ireland_with_ia.rb +97 -0
  103. data/lib/sapor/regional_data/european_union_27_italy.rb +84 -0
  104. data/lib/sapor/regional_data/european_union_27_netherlands.rb +81 -0
  105. data/lib/sapor/regional_data/european_union_27_poland.rb +84 -0
  106. data/lib/sapor/regional_data/european_union_27_romania.rb +78 -0
  107. data/lib/sapor/regional_data/european_union_27_slovakia.rb +80 -0
  108. data/lib/sapor/regional_data/european_union_27_spain.rb +82 -0
  109. data/lib/sapor/regional_data/european_union_27_sweden.rb +76 -0
  110. data/lib/sapor/regional_data/european_union_austria.rb +76 -0
  111. data/lib/sapor/regional_data/european_union_bulgaria.rb +81 -0
  112. data/lib/sapor/regional_data/european_union_croatia.rb +81 -0
  113. data/lib/sapor/regional_data/european_union_cyprus.rb +72 -0
  114. data/lib/sapor/regional_data/european_union_czech_republic.rb +82 -0
  115. data/lib/sapor/regional_data/european_union_denmark.rb +77 -0
  116. data/lib/sapor/regional_data/european_union_estonia.rb +74 -0
  117. data/lib/sapor/regional_data/european_union_finland.rb +74 -0
  118. data/lib/sapor/regional_data/european_union_flanders.rb +74 -0
  119. data/lib/sapor/regional_data/european_union_france.rb +84 -0
  120. data/lib/sapor/regional_data/european_union_france_2019.rb +84 -0
  121. data/lib/sapor/regional_data/european_union_french_community_of_belgium.rb +73 -0
  122. data/lib/sapor/regional_data/european_union_germany.rb +86 -0
  123. data/lib/sapor/regional_data/european_union_great_britain.rb +98 -0
  124. data/lib/sapor/regional_data/european_union_greece.rb +77 -0
  125. data/lib/sapor/regional_data/european_union_hungary.rb +76 -0
  126. data/lib/sapor/regional_data/european_union_ireland.rb +96 -0
  127. data/lib/sapor/regional_data/european_union_ireland_with_ia.rb +97 -0
  128. data/lib/sapor/regional_data/european_union_italy.rb +84 -0
  129. data/lib/sapor/regional_data/european_union_latvia.rb +81 -0
  130. data/lib/sapor/regional_data/european_union_lithuania.rb +80 -0
  131. data/lib/sapor/regional_data/european_union_luxembourg.rb +75 -0
  132. data/lib/sapor/regional_data/european_union_malta.rb +71 -0
  133. data/lib/sapor/regional_data/european_union_netherlands.rb +81 -0
  134. data/lib/sapor/regional_data/european_union_northern_ireland.rb +75 -0
  135. data/lib/sapor/regional_data/european_union_poland.rb +84 -0
  136. data/lib/sapor/regional_data/european_union_portugal.rb +75 -0
  137. data/lib/sapor/regional_data/european_union_romania.rb +78 -0
  138. data/lib/sapor/regional_data/european_union_slovakia.rb +81 -0
  139. data/lib/sapor/regional_data/european_union_slovenia.rb +85 -0
  140. data/lib/sapor/regional_data/european_union_spain.rb +82 -0
  141. data/lib/sapor/regional_data/european_union_sweden.rb +76 -0
  142. data/lib/sapor/regional_data/finland-20150419-with-sin.psv +224 -0
  143. data/lib/sapor/regional_data/finland-20150419.psv +212 -0
  144. data/lib/sapor/regional_data/finland.rb +107 -0
  145. data/lib/sapor/regional_data/finland_with_sin.rb +107 -0
  146. data/lib/sapor/regional_data/flanders-2014.psv +96 -0
  147. data/lib/sapor/regional_data/flanders-20190526.psv +87 -0
  148. data/lib/sapor/regional_data/flanders.rb +115 -0
  149. data/lib/sapor/regional_data/france.rb +38 -0
  150. data/lib/sapor/regional_data/greece.rb +92 -0
  151. data/lib/sapor/regional_data/hungary-2014.psv +2104 -0
  152. data/lib/sapor/regional_data/hungary.rb +116 -0
  153. data/lib/sapor/regional_data/iceland-20161029-midflokkurinn.psv +94 -0
  154. data/lib/sapor/regional_data/iceland-20161029.psv +88 -0
  155. data/lib/sapor/regional_data/iceland-20171028.psv +85 -0
  156. data/lib/sapor/regional_data/iceland.rb +133 -0
  157. data/lib/sapor/regional_data/latvia-20141004-kpv-p-par.psv +109 -0
  158. data/lib/sapor/regional_data/latvia-20141004-kpv-par.psv +103 -0
  159. data/lib/sapor/regional_data/latvia-20141004-kpv.psv +97 -0
  160. data/lib/sapor/regional_data/latvia-20141004.psv +89 -0
  161. data/lib/sapor/regional_data/latvia.rb +112 -0
  162. data/lib/sapor/regional_data/latvia_kpv.rb +112 -0
  163. data/lib/sapor/regional_data/latvia_kpv_p_par.rb +112 -0
  164. data/lib/sapor/regional_data/latvia_kpv_par.rb +112 -0
  165. data/lib/sapor/regional_data/luxembourg-20131020.psv +76 -0
  166. data/lib/sapor/regional_data/luxembourg.rb +82 -0
  167. data/lib/sapor/regional_data/netherlands.rb +108 -0
  168. data/lib/sapor/regional_data/norway.rb +425 -0
  169. data/lib/sapor/regional_data/norwegian_municipality.rb +68 -0
  170. data/lib/sapor/regional_data/poland-20151025-with-ko-and-l-without-n-po-r-and-zl.psv +321 -0
  171. data/lib/sapor/regional_data/poland-20151025-with-ko-konf-kp-l-and-zp-without-k-k15-n-pis-po-psl-r-and-zl.psv +280 -0
  172. data/lib/sapor/regional_data/poland-20151025-with-ko-sld-and-wi-without-n-po-and-zl.psv +403 -0
  173. data/lib/sapor/regional_data/poland-20151025-with-sld-and-wi-without-zl.psv +444 -0
  174. data/lib/sapor/regional_data/poland-20151025-with-sld-without-zl.psv +403 -0
  175. data/lib/sapor/regional_data/poland-20151025.psv +403 -0
  176. data/lib/sapor/regional_data/poland.rb +125 -0
  177. data/lib/sapor/regional_data/poland_with_ko_and_l_without_n_po_r_and_zl.rb +122 -0
  178. data/lib/sapor/regional_data/poland_with_ko_konf_kp_l_and_zp_without_k_k15_n_pis_po_psl_r_and_zl.rb +123 -0
  179. data/lib/sapor/regional_data/poland_with_ko_sld_and_wi_without_n_po_and_zl.rb +125 -0
  180. data/lib/sapor/regional_data/poland_with_sld_and_wi_without_zl.rb +126 -0
  181. data/lib/sapor/regional_data/poland_with_sld_without_zl.rb +126 -0
  182. data/lib/sapor/regional_data/portugal-20151004-with-a-and-ch-without-paf.psv +438 -0
  183. data/lib/sapor/regional_data/portugal-20151004-with-a-and-il-without-paf.psv +438 -0
  184. data/lib/sapor/regional_data/portugal-20151004-with-a-ch-and-il-without-paf.psv +461 -0
  185. data/lib/sapor/regional_data/portugal-20151004-with-a-without-paf.psv +415 -0
  186. data/lib/sapor/regional_data/portugal-20151004-with-ch-and-il-without-paf.psv +438 -0
  187. data/lib/sapor/regional_data/portugal-20151004-without-paf.psv +392 -0
  188. data/lib/sapor/regional_data/portugal-20151004.psv +370 -0
  189. data/lib/sapor/regional_data/portugal.rb +101 -0
  190. data/lib/sapor/regional_data/portugal_with_a_and_ch_without_paf.rb +92 -0
  191. data/lib/sapor/regional_data/portugal_with_a_and_il_without_paf.rb +92 -0
  192. data/lib/sapor/regional_data/portugal_with_a_ch_and_il_without_paf.rb +92 -0
  193. data/lib/sapor/regional_data/portugal_with_a_without_paf.rb +92 -0
  194. data/lib/sapor/regional_data/portugal_with_ch_and_il_without_paf.rb +92 -0
  195. data/lib/sapor/regional_data/portugal_without_paf.rb +92 -0
  196. data/lib/sapor/regional_data/slovakia.rb +81 -0
  197. data/lib/sapor/regional_data/slovenia.rb +114 -0
  198. data/lib/sapor/regional_data/spain-20160626.psv +619 -0
  199. data/lib/sapor/regional_data/spain.rb +136 -0
  200. data/lib/sapor/regional_data/sweden.rb +92 -0
  201. data/lib/sapor/regional_data/sweden_20140914.rb +89 -0
  202. data/lib/sapor/regional_data/united_kingdom-2015.psv +4358 -0
  203. data/lib/sapor/regional_data/united_kingdom-20170608-brexit-chuk.psv +5154 -0
  204. data/lib/sapor/regional_data/united_kingdom-20170608-brexit.psv +4521 -0
  205. data/lib/sapor/regional_data/united_kingdom-20170608-tig.psv +4529 -0
  206. data/lib/sapor/regional_data/united_kingdom-20170608.psv +3894 -0
  207. data/lib/sapor/regional_data/united_kingdom.rb +94 -0
  208. data/lib/sapor/regional_data/united_kingdom_with_brexit.rb +110 -0
  209. data/lib/sapor/regional_data/united_kingdom_with_brexit_and_chuk.rb +111 -0
  210. data/lib/sapor/regional_data/united_kingdom_with_tig.rb +111 -0
  211. data/lib/sapor/regional_data/utopia.rb +66 -0
  212. data/lib/sapor/regional_data/wallonia-2014.psv +101 -0
  213. data/lib/sapor/regional_data/wallonia-20190526.psv +88 -0
  214. data/lib/sapor/regional_data/wallonia.rb +112 -0
  215. data/lib/sapor/representatives_polychotomy.rb +338 -0
  216. data/lib/sapor/single_district_proportional.rb +75 -0
  217. data/sapor.gemspec +35 -0
  218. data/spec/integration/area_spec.rb +28 -0
  219. data/spec/integration/poll_spec.rb +112 -0
  220. data/spec/integration/sample.poll +8 -0
  221. data/spec/spec_helper.rb +31 -0
  222. data/spec/unit/area_spec.rb +115 -0
  223. data/spec/unit/austria_spec.rb +76 -0
  224. data/spec/unit/belgium_brussels_spec.rb +58 -0
  225. data/spec/unit/belgium_flanders_spec.rb +62 -0
  226. data/spec/unit/belgium_spec.rb +26 -0
  227. data/spec/unit/belgium_wallonia_spec.rb +65 -0
  228. data/spec/unit/binomials_cache_spec.rb +34 -0
  229. data/spec/unit/catalonia_spec.rb +74 -0
  230. data/spec/unit/combinations_distribution_spec.rb +241 -0
  231. data/spec/unit/denmark_spec.rb +56 -0
  232. data/spec/unit/denmark_with_e_and_p_spec.rb +58 -0
  233. data/spec/unit/denmark_with_e_spec.rb +57 -0
  234. data/spec/unit/denmark_with_p_spec.rb +57 -0
  235. data/spec/unit/denominators_spec.rb +40 -0
  236. data/spec/unit/dichotomies_spec.rb +154 -0
  237. data/spec/unit/dichotomy_spec.rb +320 -0
  238. data/spec/unit/estonia_spec.rb +65 -0
  239. data/spec/unit/european_union_27_austria_spec.rb +61 -0
  240. data/spec/unit/european_union_27_croatia_spec.rb +60 -0
  241. data/spec/unit/european_union_27_denmark_spec.rb +62 -0
  242. data/spec/unit/european_union_27_estonia_spec.rb +94 -0
  243. data/spec/unit/european_union_27_finland_spec.rb +75 -0
  244. data/spec/unit/european_union_27_ireland_spec.rb +72 -0
  245. data/spec/unit/european_union_27_ireland_with_ia_spec.rb +74 -0
  246. data/spec/unit/european_union_27_italy_spec.rb +69 -0
  247. data/spec/unit/european_union_27_netherlands_spec.rb +81 -0
  248. data/spec/unit/european_union_27_poland_spec.rb +69 -0
  249. data/spec/unit/european_union_27_romania_spec.rb +67 -0
  250. data/spec/unit/european_union_27_slovakia_spec.rb +111 -0
  251. data/spec/unit/european_union_27_spain_spec.rb +130 -0
  252. data/spec/unit/european_union_27_sweden_spec.rb +89 -0
  253. data/spec/unit/european_union_austria_spec.rb +61 -0
  254. data/spec/unit/european_union_bulgaria_spec.rb +97 -0
  255. data/spec/unit/european_union_croatia_spec.rb +59 -0
  256. data/spec/unit/european_union_cyprus_spec.rb +65 -0
  257. data/spec/unit/european_union_czech_republic_spec.rb +125 -0
  258. data/spec/unit/european_union_denmark_spec.rb +61 -0
  259. data/spec/unit/european_union_estonia_spec.rb +93 -0
  260. data/spec/unit/european_union_finland_spec.rb +75 -0
  261. data/spec/unit/european_union_flanders_spec.rb +56 -0
  262. data/spec/unit/european_union_france_2019_spec.rb +73 -0
  263. data/spec/unit/european_union_france_spec.rb +73 -0
  264. data/spec/unit/european_union_french_community_of_belgium_spec.rb +61 -0
  265. data/spec/unit/european_union_germany_spec.rb +90 -0
  266. data/spec/unit/european_union_great_britain_spec.rb +87 -0
  267. data/spec/unit/european_union_greece_spec.rb +148 -0
  268. data/spec/unit/european_union_hungary_spec.rb +57 -0
  269. data/spec/unit/european_union_ireland_spec.rb +72 -0
  270. data/spec/unit/european_union_ireland_with_ia_spec.rb +74 -0
  271. data/spec/unit/european_union_italy_spec.rb +69 -0
  272. data/spec/unit/european_union_latvia_spec.rb +76 -0
  273. data/spec/unit/european_union_lithuania_spec.rb +68 -0
  274. data/spec/unit/european_union_luxembourg_spec.rb +63 -0
  275. data/spec/unit/european_union_malta_spec.rb +60 -0
  276. data/spec/unit/european_union_netherlands_spec.rb +81 -0
  277. data/spec/unit/european_union_northern_ireland_spec.rb +66 -0
  278. data/spec/unit/european_union_poland_spec.rb +69 -0
  279. data/spec/unit/european_union_portugal_spec.rb +77 -0
  280. data/spec/unit/european_union_romania_spec.rb +67 -0
  281. data/spec/unit/european_union_slovakia_spec.rb +111 -0
  282. data/spec/unit/european_union_slovenia_spec.rb +77 -0
  283. data/spec/unit/european_union_spain_spec.rb +129 -0
  284. data/spec/unit/european_union_sweden_spec.rb +89 -0
  285. data/spec/unit/finland_spec.rb +65 -0
  286. data/spec/unit/finland_with_sin_spec.rb +67 -0
  287. data/spec/unit/first_past_the_post_spec.rb +54 -0
  288. data/spec/unit/flanders_spec.rb +70 -0
  289. data/spec/unit/france_spec.rb +32 -0
  290. data/spec/unit/greece_spec.rb +118 -0
  291. data/spec/unit/hungary_spec.rb +132 -0
  292. data/spec/unit/iceland_spec.rb +57 -0
  293. data/spec/unit/largest_remainder_spec.rb +79 -0
  294. data/spec/unit/latvia_kpv_p_par_spec.rb +38 -0
  295. data/spec/unit/latvia_kpv_par_spec.rb +38 -0
  296. data/spec/unit/latvia_kpv_spec.rb +38 -0
  297. data/spec/unit/latvia_spec.rb +60 -0
  298. data/spec/unit/luxembourg_spec.rb +54 -0
  299. data/spec/unit/multi_district_leveled_proportional_spec.rb +49 -0
  300. data/spec/unit/multi_district_proportional_spec.rb +81 -0
  301. data/spec/unit/netherlands_spec.rb +107 -0
  302. data/spec/unit/norway_spec.rb +64 -0
  303. data/spec/unit/norwegian_municipality_spec.rb +89 -0
  304. data/spec/unit/number_formatter_spec.rb +173 -0
  305. data/spec/unit/poland_spec.rb +62 -0
  306. data/spec/unit/poland_with_ko_and_l_without_n_po_r_and_zl_spec.rb +60 -0
  307. data/spec/unit/poland_with_ko_konf_kp_l_and_zp_without_k_k15_n_pis_po_psl_r_and_zl_spec.rb +59 -0
  308. data/spec/unit/poland_with_ko_sld_and_wi_without_n_po_and_zl_spec.rb +62 -0
  309. data/spec/unit/poland_with_sld_and_wi_without_zl_spec.rb +63 -0
  310. data/spec/unit/poland_with_sld_without_zl_spec.rb +62 -0
  311. data/spec/unit/poll_spec.rb +110 -0
  312. data/spec/unit/portugal_spec.rb +66 -0
  313. data/spec/unit/portugal_with_a_and_ch_without_paf_spec.rb +68 -0
  314. data/spec/unit/portugal_with_a_and_il_without_paf_spec.rb +68 -0
  315. data/spec/unit/portugal_with_a_ch_and_il_without_paf_spec.rb +69 -0
  316. data/spec/unit/portugal_with_a_without_paf_spec.rb +67 -0
  317. data/spec/unit/portugal_with_ch_and_il_without_paf_spec.rb +68 -0
  318. data/spec/unit/portugal_without_paf_spec.rb +66 -0
  319. data/spec/unit/pseudorandom_multirange_enumerator_spec.rb +82 -0
  320. data/spec/unit/referendum_polychotomy_spec.rb +289 -0
  321. data/spec/unit/representatives_polychotomy_spec.rb +332 -0
  322. data/spec/unit/slovakia_spec.rb +99 -0
  323. data/spec/unit/slovenia_spec.rb +80 -0
  324. data/spec/unit/spain_spec.rb +101 -0
  325. data/spec/unit/sweden_20140914_spec.rb +112 -0
  326. data/spec/unit/sweden_spec.rb +113 -0
  327. data/spec/unit/united_kingdom_spec.rb +65 -0
  328. data/spec/unit/united_kingdom_with_brexit_and_chuk_spec.rb +67 -0
  329. data/spec/unit/united_kingdom_with_brexit_spec.rb +66 -0
  330. data/spec/unit/united_kingdom_with_tig_spec.rb +66 -0
  331. data/spec/unit/wallonia_spec.rb +70 -0
  332. metadata +490 -0
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ describe Sapor::Flanders, '#area_code' do
23
+ it 'returns BE-VLG as the area code' do
24
+ expect(Sapor::Flanders.instance.area_code).to eq('BE-VLG')
25
+ end
26
+ end
27
+
28
+ describe Sapor::Flanders, '#no_of_seats' do
29
+ it 'returns 124 as the number of seats' do
30
+ expect(Sapor::Flanders.instance.no_of_seats).to eq(124)
31
+ end
32
+ end
33
+
34
+ describe Sapor::Flanders, '#population_size' do
35
+ it 'returns a population size of 4,238,274' do
36
+ expect(Sapor::Flanders.instance.population_size).to eq(4_238_274)
37
+ end
38
+ end
39
+
40
+ describe Sapor::Flanders, '#seats' do
41
+ it 'calculates the number of seats for the election of 2019' do
42
+ flanders = Sapor::Flanders.instance
43
+ results = flanders.overall_election_results_of_2019
44
+ seats = flanders.seats(results)
45
+ expect(seats['Nieuw-Vlaamse Alliantie']).to eq(35)
46
+ expect(seats['Christen-Democratisch en Vlaams']).to eq(19)
47
+ expect(seats['Open Vlaamse Liberalen en Democraten']).to eq(16)
48
+ expect(seats['Socialistische Partij Anders']).to eq(13)
49
+ expect(seats['Groen']).to eq(14)
50
+ expect(seats['Vlaams Belang']).to eq(23)
51
+ expect(seats['Partij van de Arbeid van België']).to eq(4)
52
+ expect(seats['BE.ONE']).to eq(0)
53
+ expect(seats['Burgerlijst']).to eq(0)
54
+ expect(seats['de coöperatie']).to eq(0)
55
+ expect(seats['Democratisch-Solidair Appèl']).to eq(0)
56
+ expect(seats['DierAnimal']).to eq(0)
57
+ expect(seats['Genoeg voor iedereen']).to eq(0)
58
+ expect(seats['Piratenpartij']).to eq(0)
59
+ expect(seats['Partij Vrede en Solidariteit']).to eq(0)
60
+ expect(seats['PRO']).to eq(0)
61
+ expect(seats['Referendumpartij']).to eq(0)
62
+ expect(seats['Union des Francophones']).to eq(0)
63
+ end
64
+ end
65
+
66
+ describe Sapor::Flanders, '#threshold' do
67
+ it 'returns a threshold of 5%' do
68
+ expect(Sapor::Flanders.instance.threshold).to eq(0.05)
69
+ end
70
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ describe Sapor::France, '#area_code' do
23
+ it 'returns FR as the area code' do
24
+ expect(Sapor::France.instance.area_code).to eq('FR')
25
+ end
26
+ end
27
+
28
+ describe Sapor::France, '#population_size' do
29
+ it 'returns a population size of 44,834,000' do
30
+ expect(Sapor::France.instance.population_size).to eq(44_834_000)
31
+ end
32
+ end
@@ -0,0 +1,118 @@
1
+
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ describe Sapor::Greece, '#area_code' do
23
+ it 'returns GR as the area code' do
24
+ expect(Sapor::Greece.instance.area_code).to eq('GR')
25
+ end
26
+ end
27
+
28
+ describe Sapor::Greece, '#no_of_seats' do
29
+ it 'returns 300 as the number of seats' do
30
+ expect(Sapor::Greece.instance.no_of_seats).to eq(300)
31
+ end
32
+ end
33
+
34
+ describe Sapor::Greece, '#population_size' do
35
+ it 'returns a population size of 5,567,930' do
36
+ expect(Sapor::Greece.instance.population_size).to eq(5_567_930)
37
+ end
38
+ end
39
+
40
+ describe Sapor::Greece, '#seats' do
41
+ it 'calculates the number of seats for the election of 20 September 2015' \
42
+ ' correctly' do
43
+ greece = Sapor::Greece.instance
44
+ results = { 'Συνασπισμός Ριζοσπαστικής Αριστεράς' => 1_925_904,
45
+ 'Νέα Δημοκρατία' => 1_526_205,
46
+ 'Χρυσή Αυγή' => 379_581,
47
+ 'Δημοκρατική Συμπαράταξη' => 341_390,
48
+ 'Κομμουνιστικό Κόμμα Ελλάδας' => 301_632,
49
+ 'Το Ποτάμι' => 222_166,
50
+ 'Ανεξάρτητοι Έλληνες' => 200_423,
51
+ 'Ένωση Κεντρώων' => 186_457,
52
+ 'Λαϊκή Ενότητα' => 155_242,
53
+ 'Αντικαπιταλιστική Αριστερή Συνεργασία για την Ανατροπή Εργατικό Επαναστατικό Κόμμα' => 46_096,
54
+ 'Ενιαίο Παλλαϊκό Μέτωπο' => 41_631,
55
+ 'Κοινωνία' => 35_534,
56
+ 'δημιουργία, ξανά!' => 28_936,
57
+ 'Δημοκρατικοί–Κοινωνία Αξιών–Κόμμα Πειρατών' => 15_257,
58
+ 'Κομμουνιστικό Κόμμα Ελλάδας (μ-λ)–Μ-Λ Κομμουνιστικό Κόμμα Ελλάδας' => 8_944,
59
+ 'Πατριωτική Ένωση–Ελληνική Λαϊκή Συσπείρωση' => 6_253,
60
+ 'Ελληνική Λαϊκή Δημοκρατική Απελευθέρωση' => 4_425,
61
+ 'Οργάνωση Κομμουνιστών Διεθνιστών Ελλάδας' => 2_372,
62
+ 'Οργάνωση για την Ανασυγκρότηση του Κ.Κ.Ε.' => 2_263,
63
+ 'Independent candidates' => 1_139 }
64
+ seats = greece.seats(results)
65
+ expect(seats['Συνασπισμός Ριζοσπαστικής Αριστεράς']).to eq(145)
66
+ expect(seats['Νέα Δημοκρατία']).to eq(75)
67
+ expect(seats['Χρυσή Αυγή']).to eq(18)
68
+ expect(seats['Δημοκρατική Συμπαράταξη']).to eq(17)
69
+ expect(seats['Κομμουνιστικό Κόμμα Ελλάδας']).to eq(15)
70
+ expect(seats['Το Ποτάμι']).to eq(11)
71
+ expect(seats['Ανεξάρτητοι Έλληνες']).to eq(10)
72
+ expect(seats['Ένωση Κεντρώων']).to eq(9)
73
+ expect(seats['Λαϊκή Ενότητα']).to eq(0)
74
+ expect(seats['Αντικαπιταλιστική Αριστερή Συνεργασία για την Ανατροπή Εργατικό Επαναστατικό Κόμμα']).to eq(0)
75
+ expect(seats['Ενιαίο Παλλαϊκό Μέτωπο']).to eq(0)
76
+ expect(seats['Κοινωνία']).to eq(0)
77
+ expect(seats['δημιουργία, ξανά!']).to eq(0)
78
+ expect(seats['Δημοκρατικοί–Κοινωνία Αξιών–Κόμμα Πειρατών']).to eq(0)
79
+ expect(seats['Κομμουνιστικό Κόμμα Ελλάδας (μ-λ)–Μ-Λ Κομμουνιστικό Κόμμα Ελλάδας']).to eq(0)
80
+ expect(seats['Πατριωτική Ένωση–Ελληνική Λαϊκή Συσπείρωση']).to eq(0)
81
+ expect(seats['Ελληνική Λαϊκή Δημοκρατική Απελευθέρωση']).to eq(0)
82
+ expect(seats['Οργάνωση Κομμουνιστών Διεθνιστών Ελλάδας']).to eq(0)
83
+ expect(seats['Οργάνωση για την Ανασυγκρότηση του Κ.Κ.Ε.']).to eq(0)
84
+ expect(seats['Independent candidates']).to eq(0)
85
+ end
86
+
87
+ it 'calculates the number of seats for the election of 20 September 2015' \
88
+ ' correctly with small parties aggregated as OTHER' do
89
+ greece = Sapor::Greece.instance
90
+ results = { 'Συνασπισμός Ριζοσπαστικής Αριστεράς' => 1_925_904,
91
+ 'Νέα Δημοκρατία' => 1_526_205,
92
+ 'Χρυσή Αυγή' => 379_581,
93
+ 'Δημοκρατική Συμπαράταξη' => 341_390,
94
+ 'Κομμουνιστικό Κόμμα Ελλάδας' => 301_632,
95
+ 'Το Ποτάμι' => 222_166,
96
+ 'Ανεξάρτητοι Έλληνες' => 200_423,
97
+ 'Ένωση Κεντρώων' => 186_457,
98
+ Sapor::OTHER => 155_242 + 46_096 + 41_631 + 35_534 + 28_936 \
99
+ + 15_257 + 8_944 + 6_253 + 4_425 + 2_372 \
100
+ + 2_263 + 1_139 }
101
+ seats = greece.seats(results)
102
+ expect(seats['Συνασπισμός Ριζοσπαστικής Αριστεράς']).to eq(145)
103
+ expect(seats['Νέα Δημοκρατία']).to eq(75)
104
+ expect(seats['Χρυσή Αυγή']).to eq(18)
105
+ expect(seats['Δημοκρατική Συμπαράταξη']).to eq(17)
106
+ expect(seats['Κομμουνιστικό Κόμμα Ελλάδας']).to eq(15)
107
+ expect(seats['Το Ποτάμι']).to eq(11)
108
+ expect(seats['Ανεξάρτητοι Έλληνες']).to eq(10)
109
+ expect(seats['Ένωση Κεντρώων']).to eq(9)
110
+ expect(seats[Sapor::OTHER]).to eq(0)
111
+ end
112
+ end
113
+
114
+ describe Sapor::Greece, '#threshold' do
115
+ it 'returns a threshold of 3%' do
116
+ expect(Sapor::Greece.instance.threshold).to eq(0.03)
117
+ end
118
+ end
@@ -0,0 +1,132 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ describe Sapor::Hungary, '#area_code' do
23
+ it 'returns HU as the area code' do
24
+ expect(Sapor::Hungary.instance.area_code).to eq('HU')
25
+ end
26
+ end
27
+
28
+ describe Sapor::Hungary, '#coalitions' do
29
+ def hungarian_coalitions
30
+ Sapor::Hungary.instance.coalitions
31
+ end
32
+
33
+ it 'returns Fidesz–KDNP as a coalition to track' do
34
+ expect(hungarian_coalitions).to include(['Fidesz–KDNP'])
35
+ end
36
+
37
+ it 'returns DK + Együtt + MLP + MSZP + PM as a coalition to track' do
38
+ expect(hungarian_coalitions).to include(%w(DK Együtt MLP MSZP Párbeszéd))
39
+ end
40
+ end
41
+
42
+ describe Sapor::Hungary, '#individual_constituencies_seats' do
43
+ it 'calculates the number of seats in the individual constituencies for ' \
44
+ 'the election of 2014 correctly' do
45
+ hungary = Sapor::Hungary.instance
46
+ results = hungary \
47
+ .overall_individual_constituencies_election_results_of_2014.dup
48
+ results['MSZP'] = results['MSZP'] * 5
49
+ results['DK'] = 1
50
+ results['Együtt'] = 1
51
+ results['MLP'] = 1
52
+ results['Párbeszéd'] = 1
53
+ seats = hungary.individual_constituencies_seats(results)
54
+ expect(seats['Fidesz–KDNP']).to eq(87 + 9)
55
+ expect(seats['MSZP']).to eq(8 + 1 + 1 + 0 + 0)
56
+ expect(seats['Jobbik']).to eq(0)
57
+ expect(seats['LMP']).to eq(0)
58
+ expect(seats['Munkáspárt']).to eq(0)
59
+ expect(seats['ZÖP']).to eq(0)
60
+ expect(seats['Szociáldemokraták']).to eq(0)
61
+ expect(seats['ÖP']).to eq(0)
62
+ expect(seats['ÚDP']).to eq(0)
63
+ expect(seats['ÚMP']).to eq(0)
64
+ end
65
+ end
66
+
67
+ describe Sapor::Hungary, '#no_of_seats' do
68
+ it 'returns 199 as the number of seats' do
69
+ expect(Sapor::Hungary.instance.no_of_seats).to eq(199)
70
+ end
71
+ end
72
+
73
+ describe Sapor::Hungary, '#party_list_seats' do
74
+ it 'calculates the number of seats for the party lists for the election of ' \
75
+ '2014 correctly' do
76
+ hungary = Sapor::Hungary.instance
77
+ results = { 'Fidesz–KDNP' => 2_264_780, 'MSZP' => 1_290_806, 'DK' => 0,
78
+ 'Együtt' => 0, 'MLP' => 0, 'Párbeszéd' => 0,
79
+ 'Jobbik' => 1_020_476, 'LMP' => 269_414, 'Munkáspárt' => 28_323,
80
+ 'ZÖP' => 18_557, 'Szociáldemokraták' => 15_073, 'ÖP' => 6_552,
81
+ 'ÚDP' => 2_100, 'ÚMP' => 1_578,
82
+ 'Other' => 23_507 + 22_219 + 14_085 + 12_563 + 10_969 + \
83
+ 9_925 + 8_810 + 8_083 + 19_543 }
84
+ seats = hungary.party_list_seats(results)
85
+ expect(seats['Fidesz–KDNP']).to eq(44) # Was: 30 + 7
86
+ expect(seats['MSZP']).to eq(25) # Was: 21 + 2 + 3 + 1 + 1
87
+ expect(seats['Jobbik']).to eq(19) # Was: 23
88
+ expect(seats['LMP']).to eq(5)
89
+ expect(seats['Munkáspárt']).to eq(0)
90
+ expect(seats['ZÖP']).to eq(0)
91
+ expect(seats['Szociáldemokraták']).to eq(0)
92
+ expect(seats['ÖP']).to eq(0)
93
+ expect(seats['ÚDP']).to eq(0)
94
+ expect(seats['ÚMP']).to eq(0)
95
+ end
96
+ end
97
+
98
+ describe Sapor::Hungary, '#population_size' do
99
+ it 'returns a population size of 5,047,363' do
100
+ expect(Sapor::Hungary.instance.population_size).to eq(5_047_363)
101
+ end
102
+ end
103
+
104
+ describe Sapor::Hungary, '#seats' do
105
+ it 'calculates the number of seats for the election of 2014 correctly' do
106
+ hungary = Sapor::Hungary.instance
107
+ results = hungary \
108
+ .overall_individual_constituencies_election_results_of_2014.dup
109
+ results['MSZP'] = results['MSZP'] * 5
110
+ results['DK'] = 1
111
+ results['Együtt'] = 1
112
+ results['MLP'] = 1
113
+ results['PM'] = 1
114
+ seats = hungary.seats(results)
115
+ expect(seats['Fidesz–KDNP']).to eq(141)
116
+ expect(seats['MSZP']).to eq(37)
117
+ expect(seats['Jobbik']).to eq(21)
118
+ expect(seats['LMP']).to eq(0)
119
+ expect(seats['Munkáspárt']).to eq(0)
120
+ expect(seats['ZÖP']).to eq(0)
121
+ expect(seats['Szociáldemokraták']).to eq(0)
122
+ expect(seats['ÖP']).to eq(0)
123
+ expect(seats['ÚDP']).to eq(0)
124
+ expect(seats['ÚMP']).to eq(0)
125
+ end
126
+ end
127
+
128
+ describe Sapor::Hungary, '#threshold' do
129
+ it 'returns a threshold of 5%' do
130
+ expect(Sapor::Hungary.instance.threshold).to eq(0.05)
131
+ end
132
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ describe Sapor::Iceland, '#area_code' do
23
+ it 'returns IS as the area code' do
24
+ expect(Sapor::Iceland.instance.area_code).to eq('IS')
25
+ end
26
+ end
27
+
28
+ describe Sapor::Iceland, '#no_of_seats' do
29
+ it 'returns 63 as the number of seats' do
30
+ expect(Sapor::Iceland.instance.no_of_seats).to eq(63)
31
+ end
32
+ end
33
+
34
+ describe Sapor::Iceland, '#population_size' do
35
+ it 'returns a population size of 195,204' do
36
+ expect(Sapor::Iceland.instance.population_size).to eq(196_246)
37
+ end
38
+ end
39
+
40
+ describe Sapor::Iceland, '#seats' do
41
+ it 'calculates the number of seats for the election of 2017 correctly' do
42
+ iceland = Sapor::Iceland.instance
43
+ results = iceland.overall_election_results_of_2017
44
+ seats = iceland.seats(results)
45
+ expect(seats['Sjálfstæðisflokkurinn']).to eq(16)
46
+ expect(seats['Vinstrihreyfingin – grænt framboð']).to eq(11)
47
+ expect(seats['Framsóknarflokkurinn']).to eq(8)
48
+ expect(seats['Samfylkingin']).to eq(7)
49
+ expect(seats['Miðflokkurinn']).to eq(7)
50
+ expect(seats['Píratar']).to eq(6)
51
+ expect(seats['Flokkur fólksins']).to eq(4)
52
+ expect(seats['Viðreisn']).to eq(4)
53
+ expect(seats['Björt framtíð']).to eq(0)
54
+ expect(seats['Dögun']).to eq(0)
55
+ expect(seats['Alþýðufylkingin']).to eq(0)
56
+ end
57
+ end
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
5
+ #
6
+ # This file is part of SAPoR.
7
+ #
8
+ # SAPoR is free software: you can redistribute it and/or modify it under the
9
+ # terms of the GNU General Public License as published by the Free Software
10
+ # Foundation, either version 3 of the License, or (at your option) any later
11
+ # version.
12
+ #
13
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
14
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+ #
17
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
18
+ #
19
+
20
+ require 'spec_helper'
21
+
22
+ SAMPLE_ELECTION_RESULT = { 'Yellow' => 47_000, 'White' => 16_000,
23
+ 'Red' => 15_800, 'Green' => 12_000, 'Blue' => 6_100,
24
+ 'Pink' => 3_100 }.freeze
25
+
26
+ ALABAMA_PARADOX_ELECTION_RESULT = { 'Yellow' => 1500, 'White' => 1500,
27
+ 'Red' => 900, 'Green' => 500, 'Blue' => 500,
28
+ 'Pink' => 200 }.freeze
29
+
30
+ NO_OF_SEATS = 10
31
+
32
+ HARE_QUOTA = Sapor::LargestRemainder.new(NO_OF_SEATS, Sapor::HareQuota)
33
+ DROOP_QUOTA = Sapor::LargestRemainder.new(NO_OF_SEATS, Sapor::DroopQuota)
34
+
35
+ describe Sapor::LargestRemainder, '#project' do
36
+ it 'produces the correct result for the Hare quota' do
37
+ projection = HARE_QUOTA.project(SAMPLE_ELECTION_RESULT)
38
+ expect(projection['Yellow']).to eq(5)
39
+ expect(projection['White']).to eq(2)
40
+ expect(projection['Red']).to eq(1)
41
+ expect(projection['Green']).to eq(1)
42
+ expect(projection['Blue']).to eq(1)
43
+ expect(projection['Pink']).to eq(0)
44
+ end
45
+
46
+ it 'produces the correct result for the 25 seat Alabama paradox for the ' \
47
+ 'Hare quota' do
48
+ alabama25 = Sapor::LargestRemainder.new(25, Sapor::HareQuota)
49
+ projection = alabama25.project(ALABAMA_PARADOX_ELECTION_RESULT)
50
+ expect(projection['Yellow']).to eq(7)
51
+ expect(projection['White']).to eq(7)
52
+ expect(projection['Red']).to eq(4)
53
+ expect(projection['Green']).to eq(3)
54
+ expect(projection['Blue']).to eq(3)
55
+ expect(projection['Pink']).to eq(1)
56
+ end
57
+
58
+ it 'produces the correct result for the 26 seat Alabama paradox for the ' \
59
+ 'Hare quota' do
60
+ alabama26 = Sapor::LargestRemainder.new(26, Sapor::HareQuota)
61
+ projection = alabama26.project(ALABAMA_PARADOX_ELECTION_RESULT)
62
+ expect(projection['Yellow']).to eq(8)
63
+ expect(projection['White']).to eq(8)
64
+ expect(projection['Red']).to eq(5)
65
+ expect(projection['Green']).to eq(2)
66
+ expect(projection['Blue']).to eq(2)
67
+ expect(projection['Pink']).to eq(1)
68
+ end
69
+
70
+ it 'produces the correct result for the Droop quota' do
71
+ projection = DROOP_QUOTA.project(SAMPLE_ELECTION_RESULT)
72
+ expect(projection['Yellow']).to eq(5)
73
+ expect(projection['White']).to eq(2)
74
+ expect(projection['Red']).to eq(2)
75
+ expect(projection['Green']).to eq(1)
76
+ expect(projection['Blue']).to eq(0)
77
+ expect(projection['Pink']).to eq(0)
78
+ end
79
+ end