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,58 @@
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::BelgiumBrussels, '#area_code' do
23
+ it 'returns BE[BRU] as the area code' do
24
+ expect(Sapor::BelgiumBrussels.instance.area_code).to eq('BE[BRU]')
25
+ end
26
+ end
27
+
28
+ describe Sapor::BelgiumBrussels, '#no_of_seats' do
29
+ it 'returns 15 as the number of seats' do
30
+ expect(Sapor::BelgiumBrussels.instance.no_of_seats).to eq(15)
31
+ end
32
+ end
33
+
34
+ describe Sapor::BelgiumBrussels, '#population_size' do
35
+ it 'returns a population size of 501,459' do
36
+ expect(Sapor::BelgiumBrussels.instance.population_size).to eq(501_459)
37
+ end
38
+ end
39
+
40
+ describe Sapor::BelgiumBrussels, '#seats' do
41
+ it 'calculates the number of seats for the election of 2014' do
42
+ belgium_brussels = Sapor::BelgiumBrussels.instance
43
+ results = belgium_brussels.overall_election_results_of_2019
44
+ seats = belgium_brussels.seats(results)
45
+ expect(seats['Ecolo']).to eq(4)
46
+ expect(seats['Parti Socialiste']).to eq(3)
47
+ expect(seats['Mouvement Réformateur']).to eq(3)
48
+ expect(seats['Parti du Travail de Belgique']).to eq(2)
49
+ expect(seats['DéFI']).to eq(2)
50
+ expect(seats['Centre démocrate humaniste']).to eq(1)
51
+ expect(seats['Nieuw-Vlaamse Alliantie']).to eq(0)
52
+ expect(seats['Listes Destexhe']).to eq(0)
53
+ expect(seats['Open Vlaamse Liberalen en Democraten']).to eq(0)
54
+ expect(seats['Parti Populaire']).to eq(0)
55
+ expect(seats['Vlaams Belang']).to eq(0)
56
+ expect(seats['Christen-Democratisch en Vlaams']).to eq(0)
57
+ end
58
+ end
@@ -0,0 +1,62 @@
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::BelgiumFlanders, '#area_code' do
23
+ it 'returns BE[VLG] as the area code' do
24
+ expect(Sapor::BelgiumFlanders.instance.area_code).to eq('BE[VLG]')
25
+ end
26
+ end
27
+
28
+ describe Sapor::BelgiumFlanders, '#no_of_seats' do
29
+ it 'returns 87 as the number of seats' do
30
+ expect(Sapor::BelgiumFlanders.instance.no_of_seats).to eq(87)
31
+ end
32
+ end
33
+
34
+ describe Sapor::BelgiumFlanders, '#population_size' do
35
+ it 'returns a population size of 4,206,305' do
36
+ expect(Sapor::BelgiumFlanders.instance.population_size).to eq(4_206_305)
37
+ end
38
+ end
39
+
40
+ describe Sapor::BelgiumFlanders, '#seats' do
41
+ it 'calculates the number of seats for the election of 2019' do
42
+ belgium_flanders = Sapor::BelgiumFlanders.instance
43
+ results = belgium_flanders.overall_election_results_of_2019
44
+ seats = belgium_flanders.seats(results)
45
+ expect(seats['Nieuw-Vlaamse Alliantie']).to eq(25)
46
+ expect(seats['Vlaams Belang']).to eq(18)
47
+ expect(seats['Open Vlaamse Liberalen en Democraten']).to eq(12)
48
+ expect(seats['Christen-Democratisch en Vlaams']).to eq(12)
49
+ expect(seats['Socialistische Partij Anders']).to eq(9)
50
+ expect(seats['Groen']).to eq(8)
51
+ expect(seats['Partij van de Arbeid van België']).to eq(3)
52
+ expect(seats['Belgische Unie – Union Belge']).to eq(0)
53
+ expect(seats['de coöperatie']).to eq(0)
54
+ expect(seats['DéFI']).to eq(0)
55
+ expect(seats['Democratisch-Solidair Appèl']).to eq(0)
56
+ expect(seats['DierAnimal']).to eq(0)
57
+ expect(seats['Partij Vrede en Solidariteit']).to eq(0)
58
+ expect(seats['Piratenpartij']).to eq(0)
59
+ expect(seats['PRO']).to eq(0)
60
+ expect(seats['Volt']).to eq(0)
61
+ end
62
+ end
@@ -0,0 +1,26 @@
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::Belgium, '#threshold' do
23
+ it 'returns a threshold of 5%' do
24
+ expect(Sapor::Belgium.instance.threshold).to eq(0.05)
25
+ end
26
+ end
@@ -0,0 +1,65 @@
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::BelgiumWallonia, '#area_code' do
23
+ it 'returns BE[WAL] as the area code' do
24
+ expect(Sapor::BelgiumWallonia.instance.area_code).to eq('BE[WAL]')
25
+ end
26
+ end
27
+
28
+ describe Sapor::BelgiumWallonia, '#no_of_seats' do
29
+ it 'returns 48 as the number of seats' do
30
+ expect(Sapor::BelgiumWallonia.instance.no_of_seats).to eq(48)
31
+ end
32
+ end
33
+
34
+ describe Sapor::BelgiumWallonia, '#population_size' do
35
+ it 'returns a population size of 2,072,774' do
36
+ expect(Sapor::BelgiumWallonia.instance.population_size).to eq(2_072_774)
37
+ end
38
+ end
39
+
40
+ describe Sapor::BelgiumWallonia, '#seats' do
41
+ it 'calculates the number of seats for the election of 2019' do
42
+ belgium_wallonia = Sapor::BelgiumWallonia.instance
43
+ results = belgium_wallonia.overall_election_results_of_2019
44
+ seats = belgium_wallonia.seats(results)
45
+ expect(seats['Parti Socialiste']).to eq(17)
46
+ expect(seats['Mouvement Réformateur']).to eq(11)
47
+ expect(seats['Ecolo']).to eq(9)
48
+ expect(seats['Parti du Travail de Belgique']).to eq(7)
49
+ expect(seats['Centre démocrate humaniste']).to eq(4)
50
+ expect(seats['DéFI']).to eq(0)
51
+ expect(seats['AGIR']).to eq(0)
52
+ expect(seats['Collectif Citoyen']).to eq(0)
53
+ expect(seats['DierAnimal']).to eq(0)
54
+ expect(seats['La Droite']).to eq(0)
55
+ expect(seats['Les Belges d’Abord']).to eq(0)
56
+ expect(seats['Listes Destexhe']).to eq(0)
57
+ expect(seats['Lutte Ouvrière']).to eq(0)
58
+ expect(seats['NATION']).to eq(0)
59
+ expect(seats['Parti Communiste de Belgique']).to eq(0)
60
+ expect(seats['Parti Populaire']).to eq(0)
61
+ expect(seats['Turquoise']).to eq(0)
62
+ expect(seats['Vlaams Belang']).to eq(0)
63
+ expect(seats['Wallonie Insoumise']).to eq(0)
64
+ end
65
+ end
@@ -0,0 +1,34 @@
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::BinomialsCache, '#binomial' do
23
+ it 'returns the correct binomial' do
24
+ actual = Sapor::BinomialsCache.binomial(10, 20)
25
+ expected = 10.large_float_binomial_by_product_of_divisions(20)
26
+ expect(actual).to eq(expected)
27
+ end
28
+
29
+ it 'returns the same binomial when asked a second time' do
30
+ first = Sapor::BinomialsCache.binomial(10, 21)
31
+ second = Sapor::BinomialsCache.binomial(10, 21)
32
+ expect(second).to eq(first)
33
+ end
34
+ end
@@ -0,0 +1,74 @@
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::Catalonia, '#area_code' do
23
+ it 'returns ES-CT as the area code' do
24
+ expect(Sapor::Catalonia.instance.area_code).to eq('ES-CT')
25
+ end
26
+ end
27
+
28
+ describe Sapor::Catalonia, '#coalitions' do
29
+ it 'returns JS and JS+CUP as the coalitions to track' do
30
+ expect(Sapor::Catalonia.instance.coalitions).to include(['Junts pel Sí'])
31
+ expect(Sapor::Catalonia.instance.coalitions).to \
32
+ include(['Junts pel Sí', 'Candidatura d’Unitat Popular'])
33
+ expect(Sapor::Catalonia.instance.coalitions).to \
34
+ include(['Ciutadans–Partido de la Ciudadanía',
35
+ 'Partit dels Socialistes de Catalunya (PSC-PSOE)',
36
+ 'Catalunya en Comú', 'Partit Popular'])
37
+ end
38
+ end
39
+
40
+ describe Sapor::Catalonia, '#no_of_seats' do
41
+ it 'returns 135 as the number of seats' do
42
+ expect(Sapor::Catalonia.instance.no_of_seats).to eq(135)
43
+ end
44
+ end
45
+
46
+ describe Sapor::Catalonia, '#population_size' do
47
+ it 'returns a population size of 5,510,853' do
48
+ expect(Sapor::Catalonia.instance.population_size).to eq(5_510_853)
49
+ end
50
+ end
51
+
52
+ describe Sapor::Catalonia, '#seats' do
53
+ it 'calculates the number of seats for the election of 2015 correctly' do
54
+ catalonia = Sapor::Catalonia.instance
55
+ results = catalonia.overall_election_results_of_2015
56
+ seats = catalonia.seats(results)
57
+ expect(seats['Junts pel Sí']).to eq(62)
58
+ expect(seats['Ciutadans–Partido de la Ciudadanía']).to eq(25)
59
+ expect(seats['Partit dels Socialistes de Catalunya (PSC-PSOE)']).to eq(16)
60
+ expect(seats['Catalunya en Comú']).to eq(11)
61
+ expect(seats['Partit Popular']).to eq(11)
62
+ expect(seats['Candidatura d’Unitat Popular']).to eq(10)
63
+ expect(seats['Unió Democràtica de Catalunya']).to eq(0)
64
+ expect(seats['Partit Animalista contra el Maltractament Animal']).to eq(0)
65
+ expect(seats['Pirates de Catalunya–Per decidir-ho tot']).to eq(0)
66
+ expect(seats['Guanyem Catalunya']).to eq(0)
67
+ end
68
+ end
69
+
70
+ describe Sapor::Catalonia, '#threshold' do
71
+ it 'returns a threshold of 3%' do
72
+ expect(Sapor::Catalonia.instance.threshold).to eq(0.03)
73
+ end
74
+ end
@@ -0,0 +1,241 @@
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::CombinationsDistribution, '#new' do
23
+ it 'creates an empty distribution' do
24
+ distribution = Sapor::CombinationsDistribution.new
25
+ expect(distribution).to be_empty
26
+ end
27
+ end
28
+
29
+ describe Sapor::CombinationsDistribution, '#[]=' do
30
+ it 'sets a value-combinations pair' do
31
+ distribution = Sapor::CombinationsDistribution.new
32
+ distribution[1] = 2
33
+ expect(distribution[1]).to eq(2)
34
+ end
35
+ end
36
+
37
+ describe Sapor::CombinationsDistribution, '#+' do
38
+ it 'adds two combiation distributions together' do
39
+ a = Sapor::CombinationsDistribution.new
40
+ a[10] = 2
41
+ a[21] = 3
42
+ a[23] = 11
43
+ b = Sapor::CombinationsDistribution.new
44
+ b[10] = 5
45
+ b[21] = 7
46
+ b[29] = 13
47
+ sum = Sapor::CombinationsDistribution.new
48
+ sum[10] = 7
49
+ sum[21] = 10
50
+ sum[23] = 11
51
+ sum[29] = 13
52
+ expect((a + b)[10]).to eq(sum[10])
53
+ expect((a + b)[21]).to eq(sum[21])
54
+ expect((a + b)[23]).to eq(sum[23])
55
+ expect((a + b)[29]).to eq(sum[29])
56
+ end
57
+ end
58
+
59
+ describe Sapor::CombinationsDistribution, '#confidence_interval' do
60
+ it 'returns the single value as boundaries (default)' do
61
+ distribution = Sapor::CombinationsDistribution.new
62
+ distribution[5] = 2
63
+ expect(distribution.confidence_interval(0.95)).to eq([5, 5])
64
+ end
65
+
66
+ it 'returns the full interval as boundaries if single value (extensive)' do
67
+ distribution = Sapor::CombinationsDistribution.new
68
+ distribution[5] = 2
69
+ expect(distribution.confidence_interval(0.95, 10)).to eq([0, 10])
70
+ end
71
+
72
+ it 'returns the boundaries (default)' do
73
+ distribution = Sapor::CombinationsDistribution.new
74
+ distribution[3] = 2
75
+ distribution[7] = 2
76
+ expect(distribution.confidence_interval(0.95)).to eq([3, 7])
77
+ end
78
+
79
+ it 'returns the full interval as boundaries (extensive)' do
80
+ distribution = Sapor::CombinationsDistribution.new
81
+ distribution[3] = 2
82
+ distribution[7] = 2
83
+ expect(distribution.confidence_interval(0.95, 10)).to eq([0, 10])
84
+ end
85
+
86
+ it 'returns the full interval if level too high' do
87
+ distribution = Sapor::CombinationsDistribution.new
88
+ distribution[5] = 1
89
+ distribution[10] = 98
90
+ distribution[15] = 1
91
+ expect(distribution.confidence_interval(0.99)).to eq([5, 15])
92
+ end
93
+
94
+ it 'returns the values in between as boundaries (even)' do
95
+ distribution = Sapor::CombinationsDistribution.new
96
+ distribution[5] = 1
97
+ distribution[10] = 98
98
+ distribution[15] = 1
99
+ expect(distribution.confidence_interval(0.95)).to eq([8, 12])
100
+ end
101
+
102
+ it 'returns the values in between as boundaries (odd)' do
103
+ distribution = Sapor::CombinationsDistribution.new
104
+ distribution[6] = 1.to_lf
105
+ distribution[10] = 98.to_lf
106
+ distribution[14] = 1.to_lf
107
+ expect(distribution.confidence_interval(0.95)).to eq([8, 12])
108
+ end
109
+ end
110
+
111
+ describe Sapor::CombinationsDistribution, '#confidence_interval_values' do
112
+ it 'extracts the single value as confidence interval value' do
113
+ distribution = Sapor::CombinationsDistribution.new
114
+ distribution[5] = 2.to_lf
115
+ expect(distribution.confidence_interval_values(0.95)).to eq([5])
116
+ end
117
+
118
+ it 'extracts all values as confidence intervalue values' do
119
+ distribution = Sapor::CombinationsDistribution.new
120
+ distribution[3] = 2.to_lf
121
+ distribution[7] = 2.to_lf
122
+ expect(distribution.confidence_interval_values(0.95).sort).to eq([3, 7])
123
+ end
124
+
125
+ it 'extracts the middle values as confidence interval values' do
126
+ distribution = Sapor::CombinationsDistribution.new
127
+ distribution[5] = 1.to_lf
128
+ distribution[10] = 98.to_lf
129
+ distribution[15] = 1.to_lf
130
+ expect(distribution.confidence_interval_values(0.95)).to eq([10])
131
+ end
132
+ end
133
+
134
+ describe Sapor::CombinationsDistribution, '#empty?' do
135
+ it 'returns true if no value-combinations pair has been added' do
136
+ distribution = Sapor::CombinationsDistribution.new
137
+ expect(distribution.empty?).to be true
138
+ end
139
+
140
+ it 'returns false if a value-combinations pair has been added' do
141
+ distribution = Sapor::CombinationsDistribution.new
142
+ distribution[1] = 2.to_lf
143
+ expect(distribution.empty?).to be false
144
+ end
145
+ end
146
+
147
+ describe Sapor::CombinationsDistribution, '#most_probable_rounded_fraction' do
148
+ it "returns the median rounded fraction if there's more than one with" \
149
+ ' maximal probability' do
150
+ distribution = Sapor::CombinationsDistribution.new
151
+ distribution[500] = 2.to_lf
152
+ expect(distribution.most_probable_rounded_fraction(1000)).to eq(0.5)
153
+ end
154
+
155
+ it 'returns the rounded fraction with the maximal probability' do
156
+ distribution = Sapor::CombinationsDistribution.new
157
+ distribution[199] = 2.to_lf
158
+ distribution[200] = 3.to_lf
159
+ distribution[201] = 2.to_lf
160
+ expect(distribution.most_probable_rounded_fraction(1000)).to eq(0.2)
161
+ end
162
+ end
163
+
164
+ describe Sapor::CombinationsDistribution, '#most_probable_value' do
165
+ it "returns the single value if there's only one value" do
166
+ distribution = Sapor::CombinationsDistribution.new
167
+ distribution[1] = 2
168
+ expect(distribution.most_probable_value).to eq(1)
169
+ end
170
+
171
+ it 'returns the first of two values if that has the greatest number ' \
172
+ 'of combinations' do
173
+ distribution = Sapor::CombinationsDistribution.new
174
+ distribution[1] = 2
175
+ distribution[2] = 1
176
+ expect(distribution.most_probable_value).to eq(1)
177
+ end
178
+
179
+ it 'returns the second of two values if that has the greatest number ' \
180
+ 'of combinations' do
181
+ distribution = Sapor::CombinationsDistribution.new
182
+ distribution[1] = 1
183
+ distribution[2] = 2
184
+ expect(distribution.most_probable_value).to eq(2)
185
+ end
186
+ end
187
+
188
+ describe Sapor::CombinationsDistribution, '#size' do
189
+ it 'returns 0 for an empty distribution' do
190
+ distribution = Sapor::CombinationsDistribution.new
191
+ expect(distribution.size).to eq(0)
192
+ end
193
+
194
+ it 'returns 1 when a value-combinations pair has been added' do
195
+ distribution = Sapor::CombinationsDistribution.new
196
+ distribution[1] = 2
197
+ expect(distribution.size).to eq(1)
198
+ end
199
+ end
200
+
201
+ describe Sapor::CombinationsDistribution, '#threshold_probability' do
202
+ it 'returns 1 if the single value is above the threshold' do
203
+ distribution = Sapor::CombinationsDistribution.new
204
+ distribution[5] = 2.to_lf
205
+ expect(distribution.threshold_probability(0.1, 10)).to eq(1)
206
+ end
207
+
208
+ it 'returns 0 if the single value is below the threshold' do
209
+ distribution = Sapor::CombinationsDistribution.new
210
+ distribution[5] = 2.to_lf
211
+ expect(distribution.threshold_probability(0.6, 10)).to eq(0)
212
+ end
213
+
214
+ it 'returns 0.8 if the threshold is between combinations 2 and 8' do
215
+ distribution = Sapor::CombinationsDistribution.new
216
+ distribution[2] = 2.to_lf
217
+ distribution[7] = 8.to_lf
218
+ expect(distribution.threshold_probability(0.5, 10)).to eq(0.8)
219
+ end
220
+
221
+ it 'includes the probability at the threshold' do
222
+ distribution = Sapor::CombinationsDistribution.new
223
+ distribution[2] = 2.to_lf
224
+ distribution[5] = 5.to_lf
225
+ distribution[7] = 3.to_lf
226
+ expect(distribution.threshold_probability(0.5, 10)).to eq(0.8)
227
+ end
228
+ end
229
+
230
+ describe Sapor::CombinationsDistribution, '#values' do
231
+ it 'returns an empty array for an empty distribution' do
232
+ distribution = Sapor::CombinationsDistribution.new
233
+ expect(distribution.values).to eq([])
234
+ end
235
+
236
+ it 'returns 1 when a value-combinations pair has been added' do
237
+ distribution = Sapor::CombinationsDistribution.new
238
+ distribution[1] = 2
239
+ expect(distribution.values).to eq([1])
240
+ end
241
+ end