sapor 0.3.6
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.
- checksums.yaml +7 -0
- data/Area Class Diagram.dia +0 -0
- data/Area Class Diagram.png +0 -0
- data/Class Diagram.dia +0 -0
- data/Class Diagram.png +0 -0
- data/Example-Catalonia.md +361 -0
- data/Example-Flanders.md +486 -0
- data/Example-Greece.md +25 -0
- data/Example-Oslo.md +678 -0
- data/Example-UnitedKingdom-Referendum.md +132 -0
- data/Examples.md +15 -0
- data/LICENSE +674 -0
- data/README.md +103 -0
- data/Rakefile +18 -0
- data/Technical Documentation.md +14 -0
- data/bin/create_installation_package.sh +49 -0
- data/bin/install.sh +45 -0
- data/bin/sapor.rb +24 -0
- data/bin/sapor.sh +106 -0
- data/data/hu/hungary-2014.txt +1680 -0
- data/data/hu/hungary_2014_screen_scraper.rb +48 -0
- data/data/hu/hungary_2014_to_psv.rb +80 -0
- data/data/hu/index-2014.txt +106 -0
- data/data/ie/2016-04-28_general-election-2016-candidate-details-csv_en.csv +552 -0
- data/data/ie/ireland_2016_to_psv.rb +138 -0
- data/data/no/2020-01-01_partifordeling_1_st_2017.csv +335 -0
- data/data/no/norway_2017_to_psv.rb +61 -0
- data/data/pl/2015-gl-lis-okr.csv +42 -0
- data/data/pl/poland_2015_to_psv.rb +79 -0
- data/data/pl/poland_2015_to_psv_with_ko_and_rsw.rb +94 -0
- data/data/pl/poland_2015_to_psv_with_ko_konf_kp_l_and_zp.rb +100 -0
- data/data/pl/poland_2015_to_psv_with_ko_sld_and_wi.rb +92 -0
- data/data/pl/poland_2015_to_psv_with_sld.rb +84 -0
- data/data/pl/poland_2015_to_psv_with_sld_and_wi.rb +85 -0
- data/data/uk/inject_ukip_2015_as_brexit_2019_in_2017.rb +54 -0
- data/data/uk/united_kingdom_2015.txt +651 -0
- data/data/uk/united_kingdom_2015_to_psv.rb +104 -0
- data/data/uk/united_kingdom_2017.txt +651 -0
- data/data/uk/united_kingdom_2017_to_psv.rb +104 -0
- data/data/uk/united_kingdom_2017_to_psv_with_brexit_and_chuk.rb +113 -0
- data/data/uk/united_kingdom_2017_to_psv_with_tig.rb +111 -0
- data/lib/sapor.rb +147 -0
- data/lib/sapor/binomials_cache.rb +45 -0
- data/lib/sapor/combinations_distribution.rb +222 -0
- data/lib/sapor/denominators.rb +67 -0
- data/lib/sapor/dichotomies.rb +138 -0
- data/lib/sapor/dichotomy.rb +164 -0
- data/lib/sapor/first_past_the_post.rb +82 -0
- data/lib/sapor/largest_remainder.rb +118 -0
- data/lib/sapor/log4r_logger.rb +49 -0
- data/lib/sapor/log_facade.rb +40 -0
- data/lib/sapor/many_past_the_post.rb +113 -0
- data/lib/sapor/multi_district_leveled_proportional.rb +64 -0
- data/lib/sapor/multi_district_proportional.rb +123 -0
- data/lib/sapor/multi_district_variable_threshold_proportional.rb +128 -0
- data/lib/sapor/number_formatter.rb +45 -0
- data/lib/sapor/options.rb +73 -0
- data/lib/sapor/poll.rb +282 -0
- data/lib/sapor/polychotomy.rb +200 -0
- data/lib/sapor/pseudorandom_multirange_enumerator.rb +87 -0
- data/lib/sapor/referendum_polychotomy.rb +165 -0
- data/lib/sapor/regional_data/area.rb +100 -0
- data/lib/sapor/regional_data/austria.rb +84 -0
- data/lib/sapor/regional_data/belgium-brussels-2014.psv +46 -0
- data/lib/sapor/regional_data/belgium-brussels-20190526.psv +33 -0
- data/lib/sapor/regional_data/belgium-flanders-2014.psv +80 -0
- data/lib/sapor/regional_data/belgium-flanders-20190526.psv +74 -0
- data/lib/sapor/regional_data/belgium-wallonia-2014.psv +114 -0
- data/lib/sapor/regional_data/belgium-wallonia-20190526.psv +93 -0
- data/lib/sapor/regional_data/belgium.rb +97 -0
- data/lib/sapor/regional_data/belgium_brussels.rb +62 -0
- data/lib/sapor/regional_data/belgium_flanders.rb +64 -0
- data/lib/sapor/regional_data/belgium_wallonia.rb +63 -0
- data/lib/sapor/regional_data/catalonia-2012-2015.psv +100 -0
- data/lib/sapor/regional_data/catalonia-2012.psv +87 -0
- data/lib/sapor/regional_data/catalonia-2015-jxcat.psv +68 -0
- data/lib/sapor/regional_data/catalonia-2015-no-jxsi.psv +68 -0
- data/lib/sapor/regional_data/catalonia-2015.psv +63 -0
- data/lib/sapor/regional_data/catalonia-20171221-with-vox.psv +67 -0
- data/lib/sapor/regional_data/catalonia-20171221.psv +61 -0
- data/lib/sapor/regional_data/catalonia.rb +124 -0
- data/lib/sapor/regional_data/denmark-20150618-with-e-and-p.psv +164 -0
- data/lib/sapor/regional_data/denmark-20150618-with-e.psv +153 -0
- data/lib/sapor/regional_data/denmark-20150618-with-p.psv +153 -0
- data/lib/sapor/regional_data/denmark-20150618.psv +142 -0
- data/lib/sapor/regional_data/denmark.rb +128 -0
- data/lib/sapor/regional_data/denmark_with_e.rb +128 -0
- data/lib/sapor/regional_data/denmark_with_e_and_p.rb +128 -0
- data/lib/sapor/regional_data/denmark_with_p.rb +128 -0
- data/lib/sapor/regional_data/estonia.rb +88 -0
- data/lib/sapor/regional_data/european-union-great-britain-20140522-brexit-chuk.psv +172 -0
- data/lib/sapor/regional_data/european-union-great-britain-20140522.psv +146 -0
- data/lib/sapor/regional_data/european-union-great-britain-20190523.psv +141 -0
- data/lib/sapor/regional_data/european-union-ireland-2014-ia-ri-sd.psv +64 -0
- data/lib/sapor/regional_data/european-union-ireland-2014-ia-sd.psv +60 -0
- data/lib/sapor/regional_data/european-union-ireland-2014-ia.psv +56 -0
- data/lib/sapor/regional_data/european-union-ireland-2014-sd.psv +56 -0
- data/lib/sapor/regional_data/european-union-ireland-2014.psv +50 -0
- data/lib/sapor/regional_data/european-union-ireland-20190524-ia.psv +58 -0
- data/lib/sapor/regional_data/european-union-ireland-20190524.psv +52 -0
- data/lib/sapor/regional_data/european_union_27_austria.rb +76 -0
- data/lib/sapor/regional_data/european_union_27_croatia.rb +83 -0
- data/lib/sapor/regional_data/european_union_27_denmark.rb +77 -0
- data/lib/sapor/regional_data/european_union_27_estonia.rb +74 -0
- data/lib/sapor/regional_data/european_union_27_finland.rb +74 -0
- data/lib/sapor/regional_data/european_union_27_france.rb +84 -0
- data/lib/sapor/regional_data/european_union_27_ireland.rb +96 -0
- data/lib/sapor/regional_data/european_union_27_ireland_with_ia.rb +97 -0
- data/lib/sapor/regional_data/european_union_27_italy.rb +84 -0
- data/lib/sapor/regional_data/european_union_27_netherlands.rb +81 -0
- data/lib/sapor/regional_data/european_union_27_poland.rb +84 -0
- data/lib/sapor/regional_data/european_union_27_romania.rb +78 -0
- data/lib/sapor/regional_data/european_union_27_slovakia.rb +80 -0
- data/lib/sapor/regional_data/european_union_27_spain.rb +82 -0
- data/lib/sapor/regional_data/european_union_27_sweden.rb +76 -0
- data/lib/sapor/regional_data/european_union_austria.rb +76 -0
- data/lib/sapor/regional_data/european_union_bulgaria.rb +82 -0
- data/lib/sapor/regional_data/european_union_croatia.rb +83 -0
- data/lib/sapor/regional_data/european_union_cyprus.rb +72 -0
- data/lib/sapor/regional_data/european_union_czech_republic.rb +82 -0
- data/lib/sapor/regional_data/european_union_denmark.rb +77 -0
- data/lib/sapor/regional_data/european_union_estonia.rb +74 -0
- data/lib/sapor/regional_data/european_union_finland.rb +74 -0
- data/lib/sapor/regional_data/european_union_flanders.rb +74 -0
- data/lib/sapor/regional_data/european_union_france.rb +84 -0
- data/lib/sapor/regional_data/european_union_french_community_of_belgium.rb +73 -0
- data/lib/sapor/regional_data/european_union_germany.rb +86 -0
- data/lib/sapor/regional_data/european_union_great_britain.rb +98 -0
- data/lib/sapor/regional_data/european_union_greece.rb +77 -0
- data/lib/sapor/regional_data/european_union_hungary.rb +76 -0
- data/lib/sapor/regional_data/european_union_ireland.rb +96 -0
- data/lib/sapor/regional_data/european_union_ireland_with_ia.rb +97 -0
- data/lib/sapor/regional_data/european_union_italy.rb +84 -0
- data/lib/sapor/regional_data/european_union_latvia.rb +81 -0
- data/lib/sapor/regional_data/european_union_lithuania.rb +80 -0
- data/lib/sapor/regional_data/european_union_luxembourg.rb +75 -0
- data/lib/sapor/regional_data/european_union_malta.rb +71 -0
- data/lib/sapor/regional_data/european_union_netherlands.rb +81 -0
- data/lib/sapor/regional_data/european_union_northern_ireland.rb +75 -0
- data/lib/sapor/regional_data/european_union_poland.rb +84 -0
- data/lib/sapor/regional_data/european_union_portugal.rb +75 -0
- data/lib/sapor/regional_data/european_union_romania.rb +78 -0
- data/lib/sapor/regional_data/european_union_slovakia.rb +81 -0
- data/lib/sapor/regional_data/european_union_slovenia.rb +85 -0
- data/lib/sapor/regional_data/european_union_spain.rb +82 -0
- data/lib/sapor/regional_data/european_union_sweden.rb +76 -0
- data/lib/sapor/regional_data/finland-20150419-with-sin.psv +224 -0
- data/lib/sapor/regional_data/finland-20150419.psv +212 -0
- data/lib/sapor/regional_data/finland.rb +107 -0
- data/lib/sapor/regional_data/finland_with_sin.rb +107 -0
- data/lib/sapor/regional_data/flanders-2014.psv +96 -0
- data/lib/sapor/regional_data/flanders-20190526.psv +87 -0
- data/lib/sapor/regional_data/flanders.rb +115 -0
- data/lib/sapor/regional_data/france.rb +38 -0
- data/lib/sapor/regional_data/greece.rb +92 -0
- data/lib/sapor/regional_data/hungary-2014.psv +2104 -0
- data/lib/sapor/regional_data/hungary.rb +116 -0
- data/lib/sapor/regional_data/iceland-20161029-midflokkurinn.psv +94 -0
- data/lib/sapor/regional_data/iceland-20161029.psv +88 -0
- data/lib/sapor/regional_data/iceland-20171028-with-j.psv +94 -0
- data/lib/sapor/regional_data/iceland-20171028.psv +85 -0
- data/lib/sapor/regional_data/iceland.rb +149 -0
- data/lib/sapor/regional_data/ireland-20160226-2020-candidates.psv +322 -0
- data/lib/sapor/regional_data/ireland-20160226-2020.psv +344 -0
- data/lib/sapor/regional_data/ireland-20160226.psv +348 -0
- data/lib/sapor/regional_data/ireland.rb +165 -0
- data/lib/sapor/regional_data/latvia-20141004-kpv-p-par.psv +109 -0
- data/lib/sapor/regional_data/latvia-20141004-kpv-par.psv +103 -0
- data/lib/sapor/regional_data/latvia-20141004-kpv.psv +97 -0
- data/lib/sapor/regional_data/latvia-20141004.psv +89 -0
- data/lib/sapor/regional_data/latvia-20181006.psv +104 -0
- data/lib/sapor/regional_data/latvia.rb +111 -0
- data/lib/sapor/regional_data/luxembourg-20131020.psv +60 -0
- data/lib/sapor/regional_data/luxembourg-20181014.psv +59 -0
- data/lib/sapor/regional_data/luxembourg.rb +88 -0
- data/lib/sapor/regional_data/netherlands.rb +108 -0
- data/lib/sapor/regional_data/norway-20170911.psv +331 -0
- data/lib/sapor/regional_data/norway.rb +130 -0
- data/lib/sapor/regional_data/norwegian_municipality.rb +68 -0
- data/lib/sapor/regional_data/poland-20151025-with-ko-and-l-without-n-po-r-and-zl.psv +321 -0
- 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
- data/lib/sapor/regional_data/poland-20151025-with-ko-sld-and-wi-without-n-po-and-zl.psv +403 -0
- data/lib/sapor/regional_data/poland-20151025-with-sld-and-wi-without-zl.psv +444 -0
- data/lib/sapor/regional_data/poland-20151025-with-sld-without-zl.psv +403 -0
- data/lib/sapor/regional_data/poland-20151025.psv +403 -0
- data/lib/sapor/regional_data/poland.rb +125 -0
- data/lib/sapor/regional_data/poland_with_ko_and_l_without_n_po_r_and_zl.rb +122 -0
- 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
- data/lib/sapor/regional_data/poland_with_ko_sld_and_wi_without_n_po_and_zl.rb +125 -0
- data/lib/sapor/regional_data/poland_with_sld_and_wi_without_zl.rb +126 -0
- data/lib/sapor/regional_data/poland_with_sld_without_zl.rb +126 -0
- data/lib/sapor/regional_data/portugal-20151004-with-a-and-ch-without-paf.psv +438 -0
- data/lib/sapor/regional_data/portugal-20151004-with-a-and-il-without-paf.psv +438 -0
- data/lib/sapor/regional_data/portugal-20151004-with-a-ch-and-il-without-paf.psv +461 -0
- data/lib/sapor/regional_data/portugal-20151004-with-a-without-paf.psv +415 -0
- data/lib/sapor/regional_data/portugal-20151004-with-ch-and-il-without-paf.psv +438 -0
- data/lib/sapor/regional_data/portugal-20151004-without-paf.psv +392 -0
- data/lib/sapor/regional_data/portugal-20151004.psv +370 -0
- data/lib/sapor/regional_data/portugal.rb +101 -0
- data/lib/sapor/regional_data/portugal_with_a_and_ch_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_with_a_and_il_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_with_a_ch_and_il_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_with_a_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_with_ch_and_il_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_without_paf.rb +92 -0
- data/lib/sapor/regional_data/slovakia.rb +81 -0
- data/lib/sapor/regional_data/slovenia.rb +114 -0
- data/lib/sapor/regional_data/spain-20160626.psv +619 -0
- data/lib/sapor/regional_data/spain.rb +136 -0
- data/lib/sapor/regional_data/sweden.rb +92 -0
- data/lib/sapor/regional_data/sweden_20140914.rb +89 -0
- data/lib/sapor/regional_data/united_kingdom-2015.psv +4358 -0
- data/lib/sapor/regional_data/united_kingdom-20170608-brexit-chuk.psv +5154 -0
- data/lib/sapor/regional_data/united_kingdom-20170608-brexit.psv +4521 -0
- data/lib/sapor/regional_data/united_kingdom-20170608-tig.psv +4529 -0
- data/lib/sapor/regional_data/united_kingdom-20170608.psv +3894 -0
- data/lib/sapor/regional_data/united_kingdom.rb +94 -0
- data/lib/sapor/regional_data/united_kingdom_with_brexit.rb +110 -0
- data/lib/sapor/regional_data/united_kingdom_with_brexit_and_chuk.rb +111 -0
- data/lib/sapor/regional_data/united_kingdom_with_tig.rb +111 -0
- data/lib/sapor/regional_data/utopia.rb +66 -0
- data/lib/sapor/regional_data/wallonia-2014.psv +101 -0
- data/lib/sapor/regional_data/wallonia-20190526.psv +88 -0
- data/lib/sapor/regional_data/wallonia.rb +112 -0
- data/lib/sapor/representatives_polychotomy.rb +338 -0
- data/lib/sapor/single_district_proportional.rb +75 -0
- data/sapor.gemspec +35 -0
- data/spec/integration/area_spec.rb +28 -0
- data/spec/integration/poll_spec.rb +112 -0
- data/spec/integration/sample.poll +8 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/unit/area_spec.rb +115 -0
- data/spec/unit/austria_spec.rb +76 -0
- data/spec/unit/belgium_brussels_spec.rb +58 -0
- data/spec/unit/belgium_flanders_spec.rb +62 -0
- data/spec/unit/belgium_spec.rb +26 -0
- data/spec/unit/belgium_wallonia_spec.rb +65 -0
- data/spec/unit/binomials_cache_spec.rb +34 -0
- data/spec/unit/catalonia_spec.rb +61 -0
- data/spec/unit/catalonia_with_vox_spec.rb +62 -0
- data/spec/unit/combinations_distribution_spec.rb +241 -0
- data/spec/unit/denmark_spec.rb +56 -0
- data/spec/unit/denmark_with_e_and_p_spec.rb +58 -0
- data/spec/unit/denmark_with_e_spec.rb +57 -0
- data/spec/unit/denmark_with_p_spec.rb +57 -0
- data/spec/unit/denominators_spec.rb +40 -0
- data/spec/unit/dichotomies_spec.rb +154 -0
- data/spec/unit/dichotomy_spec.rb +320 -0
- data/spec/unit/estonia_spec.rb +65 -0
- data/spec/unit/european_union_27_austria_spec.rb +61 -0
- data/spec/unit/european_union_27_croatia_spec.rb +60 -0
- data/spec/unit/european_union_27_denmark_spec.rb +62 -0
- data/spec/unit/european_union_27_estonia_spec.rb +94 -0
- data/spec/unit/european_union_27_finland_spec.rb +75 -0
- data/spec/unit/european_union_27_france_spec.rb +73 -0
- data/spec/unit/european_union_27_ireland_spec.rb +72 -0
- data/spec/unit/european_union_27_ireland_with_ia_spec.rb +74 -0
- data/spec/unit/european_union_27_italy_spec.rb +69 -0
- data/spec/unit/european_union_27_netherlands_spec.rb +81 -0
- data/spec/unit/european_union_27_poland_spec.rb +69 -0
- data/spec/unit/european_union_27_romania_spec.rb +67 -0
- data/spec/unit/european_union_27_slovakia_spec.rb +111 -0
- data/spec/unit/european_union_27_spain_spec.rb +130 -0
- data/spec/unit/european_union_27_sweden_spec.rb +89 -0
- data/spec/unit/european_union_austria_spec.rb +61 -0
- data/spec/unit/european_union_bulgaria_spec.rb +97 -0
- data/spec/unit/european_union_croatia_spec.rb +59 -0
- data/spec/unit/european_union_cyprus_spec.rb +65 -0
- data/spec/unit/european_union_czech_republic_spec.rb +125 -0
- data/spec/unit/european_union_denmark_spec.rb +61 -0
- data/spec/unit/european_union_estonia_spec.rb +93 -0
- data/spec/unit/european_union_finland_spec.rb +75 -0
- data/spec/unit/european_union_flanders_spec.rb +56 -0
- data/spec/unit/european_union_france_spec.rb +73 -0
- data/spec/unit/european_union_french_community_of_belgium_spec.rb +61 -0
- data/spec/unit/european_union_germany_spec.rb +90 -0
- data/spec/unit/european_union_great_britain_spec.rb +87 -0
- data/spec/unit/european_union_greece_spec.rb +148 -0
- data/spec/unit/european_union_hungary_spec.rb +57 -0
- data/spec/unit/european_union_ireland_spec.rb +72 -0
- data/spec/unit/european_union_ireland_with_ia_spec.rb +74 -0
- data/spec/unit/european_union_italy_spec.rb +69 -0
- data/spec/unit/european_union_latvia_spec.rb +76 -0
- data/spec/unit/european_union_lithuania_spec.rb +68 -0
- data/spec/unit/european_union_luxembourg_spec.rb +63 -0
- data/spec/unit/european_union_malta_spec.rb +60 -0
- data/spec/unit/european_union_netherlands_spec.rb +81 -0
- data/spec/unit/european_union_northern_ireland_spec.rb +66 -0
- data/spec/unit/european_union_poland_spec.rb +69 -0
- data/spec/unit/european_union_portugal_spec.rb +77 -0
- data/spec/unit/european_union_romania_spec.rb +67 -0
- data/spec/unit/european_union_slovakia_spec.rb +111 -0
- data/spec/unit/european_union_slovenia_spec.rb +77 -0
- data/spec/unit/european_union_spain_spec.rb +129 -0
- data/spec/unit/european_union_sweden_spec.rb +89 -0
- data/spec/unit/finland_spec.rb +65 -0
- data/spec/unit/finland_with_sin_spec.rb +67 -0
- data/spec/unit/first_past_the_post_spec.rb +54 -0
- data/spec/unit/flanders_spec.rb +70 -0
- data/spec/unit/france_spec.rb +32 -0
- data/spec/unit/greece_spec.rb +118 -0
- data/spec/unit/hungary_spec.rb +132 -0
- data/spec/unit/iceland_spec.rb +57 -0
- data/spec/unit/iceland_with_j_spec.rb +58 -0
- data/spec/unit/ireland_2016_spec.rb +62 -0
- data/spec/unit/ireland_spec.rb +62 -0
- data/spec/unit/largest_remainder_spec.rb +79 -0
- data/spec/unit/latvia_spec.rb +62 -0
- data/spec/unit/luxembourg_spec.rb +55 -0
- data/spec/unit/multi_district_leveled_proportional_spec.rb +49 -0
- data/spec/unit/multi_district_proportional_spec.rb +81 -0
- data/spec/unit/netherlands_spec.rb +107 -0
- data/spec/unit/norway_spec.rb +69 -0
- data/spec/unit/norwegian_municipality_spec.rb +89 -0
- data/spec/unit/number_formatter_spec.rb +173 -0
- data/spec/unit/poland_spec.rb +62 -0
- data/spec/unit/poland_with_ko_and_l_without_n_po_r_and_zl_spec.rb +60 -0
- 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
- data/spec/unit/poland_with_ko_sld_and_wi_without_n_po_and_zl_spec.rb +62 -0
- data/spec/unit/poland_with_sld_and_wi_without_zl_spec.rb +63 -0
- data/spec/unit/poland_with_sld_without_zl_spec.rb +62 -0
- data/spec/unit/poll_spec.rb +110 -0
- data/spec/unit/portugal_spec.rb +66 -0
- data/spec/unit/portugal_with_a_and_ch_without_paf_spec.rb +68 -0
- data/spec/unit/portugal_with_a_and_il_without_paf_spec.rb +68 -0
- data/spec/unit/portugal_with_a_ch_and_il_without_paf_spec.rb +69 -0
- data/spec/unit/portugal_with_a_without_paf_spec.rb +67 -0
- data/spec/unit/portugal_with_ch_and_il_without_paf_spec.rb +68 -0
- data/spec/unit/portugal_without_paf_spec.rb +66 -0
- data/spec/unit/pseudorandom_multirange_enumerator_spec.rb +82 -0
- data/spec/unit/referendum_polychotomy_spec.rb +289 -0
- data/spec/unit/representatives_polychotomy_spec.rb +332 -0
- data/spec/unit/slovakia_spec.rb +99 -0
- data/spec/unit/slovenia_spec.rb +80 -0
- data/spec/unit/spain_spec.rb +101 -0
- data/spec/unit/sweden_20140914_spec.rb +112 -0
- data/spec/unit/sweden_spec.rb +113 -0
- data/spec/unit/united_kingdom_spec.rb +65 -0
- data/spec/unit/united_kingdom_with_brexit_and_chuk_spec.rb +67 -0
- data/spec/unit/united_kingdom_with_brexit_spec.rb +66 -0
- data/spec/unit/united_kingdom_with_tig_spec.rb +66 -0
- data/spec/unit/wallonia_spec.rb +70 -0
- metadata +502 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2020 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::Ireland, '#area_code' do
|
|
23
|
+
it 'returns IE as the area code' do
|
|
24
|
+
expect(Sapor::Ireland.instance.area_code).to eq('IE')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe Sapor::Ireland, '#no_of_seats' do
|
|
29
|
+
it 'returns 160 as the number of seats' do
|
|
30
|
+
expect(Sapor::Ireland.instance.no_of_seats).to eq(160)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe Sapor::Ireland, '#population_size' do
|
|
35
|
+
it 'returns a population size of 2,132,895' do
|
|
36
|
+
expect(Sapor::Ireland.instance.population_size).to eq(2_132_895)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe Sapor::Ireland, '#seats' do
|
|
41
|
+
it 'calculates the number of seats for the election of 2016 correctly' do
|
|
42
|
+
Ireland = Sapor::Ireland.instance
|
|
43
|
+
results = Ireland.overall_election_results_of_2016
|
|
44
|
+
seats = Ireland.seats(results)
|
|
45
|
+
expect(seats['Fine Gael']).to eq(49 - 1 - 2)
|
|
46
|
+
expect(seats['Fianna Fáil']).to eq(44 + 3 + 1 - 2)
|
|
47
|
+
expect(seats['Sinn Féin']).to eq(23 + 4 + 1)
|
|
48
|
+
expect(seats['Labour Party']).to eq(7 + 1 + 1)
|
|
49
|
+
expect(seats['Solidarity–People Before Profit']).to eq(6 - 1)
|
|
50
|
+
expect(seats['Independents 4 Change']).to eq(4 - 1 - 1)
|
|
51
|
+
expect(seats['Social Democrats']).to eq(3 + 2)
|
|
52
|
+
expect(seats['Green Party/Comhaontas Glas']).to eq(2 - 1)
|
|
53
|
+
expect(seats['Catholic Democrats']).to eq(0)
|
|
54
|
+
expect(seats['Communist Party of Ireland']).to eq(0)
|
|
55
|
+
expect(seats['Direct Democracy Ireland']).to eq(0)
|
|
56
|
+
expect(seats['Fís Nua']).to eq(0)
|
|
57
|
+
expect(seats['Irish Democratic Party']).to eq(0)
|
|
58
|
+
expect(seats['Renua Ireland']).to eq(0)
|
|
59
|
+
expect(seats['Workers’ Party']).to eq(0)
|
|
60
|
+
expect(seats['Independent']).to eq(20 - 3 - 1 + 2)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2020 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
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
3
|
+
# Copyright (C) 2020 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
4
|
+
#
|
|
5
|
+
# This file is part of SAPoR.
|
|
6
|
+
#
|
|
7
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
8
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
9
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
10
|
+
# version.
|
|
11
|
+
#
|
|
12
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
13
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
14
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'spec_helper'
|
|
20
|
+
|
|
21
|
+
describe Sapor::Latvia, '#area_code' do
|
|
22
|
+
it 'returns LV as the area code' do
|
|
23
|
+
expect(Sapor::Latvia.instance.area_code).to eq('LV')
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe Sapor::Latvia, '#no_of_seats' do
|
|
28
|
+
it 'returns 100 as the number of seats' do
|
|
29
|
+
expect(Sapor::Latvia.instance.no_of_seats).to eq(100)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe Sapor::Latvia, '#population_size' do
|
|
34
|
+
it 'returns a population size of 839,000' do
|
|
35
|
+
expect(Sapor::Latvia.instance.population_size).to eq(839_000)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe Sapor::Latvia, '#seats' do
|
|
40
|
+
it 'calculates the number of seats for the election of 2018 correctly' do
|
|
41
|
+
Latvia = Sapor::Latvia.instance
|
|
42
|
+
results = Latvia.overall_election_results_of_2018
|
|
43
|
+
seats = Latvia.seats(results)
|
|
44
|
+
expect(seats['Sociāldemokrātiskā partija “Saskaņa”']).to eq(23)
|
|
45
|
+
expect(seats['Politiskā partija „KPV LV”']).to eq(16)
|
|
46
|
+
expect(seats['Jaunā konservatīvā partija']).to eq(16)
|
|
47
|
+
expect(seats['Nacionālā apvienība „Visu Latvijai!”–„Tēvzemei un ' \
|
|
48
|
+
'Brīvībai/LNNK”']).to eq(13)
|
|
49
|
+
expect(seats['Attīstībai/Par!']).to eq(13)
|
|
50
|
+
expect(seats['Zaļo un Zemnieku savienība']).to eq(11)
|
|
51
|
+
expect(seats['Jaunā VIENOTĪBA']).to eq(8)
|
|
52
|
+
expect(seats['Latvijas Reģionu Apvienība']).to eq(0)
|
|
53
|
+
expect(seats['Latvijas Krievu savienība']).to eq(0)
|
|
54
|
+
expect(seats['PROGRESĪVIE']).to eq(0)
|
|
55
|
+
expect(seats['No sirds Latvijai']).to eq(0)
|
|
56
|
+
expect(seats['Latviešu Nacionālisti']).to eq(0)
|
|
57
|
+
expect(seats['Par Alternatīvu']).to eq(0)
|
|
58
|
+
expect(seats['Apvienība SKG']).to eq(0)
|
|
59
|
+
expect(seats['Rīcības partija']).to eq(0)
|
|
60
|
+
expect(seats['Latvijas centriskā partija']).to eq(0)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
3
|
+
# Copyright (C) 2020 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
4
|
+
#
|
|
5
|
+
# This file is part of SAPoR.
|
|
6
|
+
#
|
|
7
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
8
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
9
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
10
|
+
# version.
|
|
11
|
+
#
|
|
12
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
13
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
14
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'spec_helper'
|
|
20
|
+
|
|
21
|
+
describe Sapor::Luxembourg, '#area_code' do
|
|
22
|
+
it 'returns LU as the area code' do
|
|
23
|
+
expect(Sapor::Luxembourg.instance.area_code).to eq('LU')
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe Sapor::Luxembourg, '#no_of_seats' do
|
|
28
|
+
it 'returns 60 as the number of seats' do
|
|
29
|
+
expect(Sapor::Luxembourg.instance.no_of_seats).to eq(60)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe Sapor::Luxembourg, '#population_size' do
|
|
34
|
+
it 'returns a population size of 3,529,969' do
|
|
35
|
+
expect(Sapor::Luxembourg.instance.population_size).to eq(3_529_969)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe Sapor::Luxembourg, '#seats' do
|
|
40
|
+
it 'calculates the number of seats for the election of 2018 correctly' do
|
|
41
|
+
Luxembourg = Sapor::Luxembourg.instance
|
|
42
|
+
results = Luxembourg.overall_election_results_of_2018
|
|
43
|
+
seats = Luxembourg.seats(results)
|
|
44
|
+
expect(seats['Chrëschtlech-Sozial Vollekspartei']).to eq(21)
|
|
45
|
+
expect(seats['Lëtzebuerger Sozialistesch Aarbechterpartei']).to eq(10)
|
|
46
|
+
expect(seats['Demokratesch Partei']).to eq(12)
|
|
47
|
+
expect(seats['déi gréng']).to eq(9)
|
|
48
|
+
expect(seats['Alternativ Demokratesch Reformpartei']).to eq(4)
|
|
49
|
+
expect(seats['déi Lénk']).to eq(2)
|
|
50
|
+
expect(seats['Piratepartei Lëtzebuerg']).to eq(2)
|
|
51
|
+
expect(seats['Kommunistesch Partei Lëtzebuerg']).to eq(0)
|
|
52
|
+
expect(seats['Demokratie']).to eq(0)
|
|
53
|
+
expect(seats['déi Konservativ']).to eq(0)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2020 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 = { 'Red' => 120, 'Green' => 120, 'Blue' => 100 }.freeze
|
|
23
|
+
|
|
24
|
+
SAMPLE_DETAILED_ELECTION_RESULT = { 'North' => { 'Red' => 50, 'Green' => 70 },
|
|
25
|
+
'South' => { 'Red' => 70, 'Green' => 50,
|
|
26
|
+
'Blue' => 100 } }.freeze
|
|
27
|
+
|
|
28
|
+
SAMPLE_SEAT_DISTRIBUTION = { 'North' => 3, 'South' => 5 }.freeze
|
|
29
|
+
|
|
30
|
+
SAMPLE_LEVELING_SEATS = 2
|
|
31
|
+
|
|
32
|
+
SAMPLE_LEVELING_THRESHOLD = 0.05
|
|
33
|
+
|
|
34
|
+
SAMPLE_POLL_RESULT = { 'Red' => 120, 'Green' => 120 }.freeze
|
|
35
|
+
|
|
36
|
+
LEVELED = Sapor::MultiDistrictLeveledProportional.new( \
|
|
37
|
+
SAMPLE_ELECTION_RESULT, SAMPLE_DETAILED_ELECTION_RESULT,
|
|
38
|
+
SAMPLE_SEAT_DISTRIBUTION, SAMPLE_LEVELING_SEATS, SAMPLE_LEVELING_THRESHOLD,
|
|
39
|
+
Sapor::SainteLague14Denominators
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
describe Sapor::MultiDistrictLeveledProportional, '#project' do
|
|
43
|
+
it 'projects same result as last result if fed with last election result' do
|
|
44
|
+
projection = LEVELED.project(SAMPLE_POLL_RESULT)
|
|
45
|
+
expect(projection['Red']).to eq(4)
|
|
46
|
+
expect(projection['Green']).to eq(4)
|
|
47
|
+
expect(projection['Blue']).to eq(2)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2020 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
|
+
SAMPLE_RGB_ELECTION_RESULT = { 'Red' => 120, 'Green' => 120, 'Blue' => 100 }
|
|
21
|
+
|
|
22
|
+
SAMPLE_DETAILED_ELECTION_RESULT = { 'North' => { 'Red' => 50, 'Green' => 70
|
|
23
|
+
},
|
|
24
|
+
'South' => { 'Red' => 70, 'Green' => 50,
|
|
25
|
+
'Blue' => 100 } }
|
|
26
|
+
|
|
27
|
+
SAMPLE_SEAT_DISTRIBUTION = { 'North' => 3, 'South' => 5 }
|
|
28
|
+
|
|
29
|
+
PROPORTIONAL = Sapor::MultiDistrictProportional.new( \
|
|
30
|
+
SAMPLE_RGB_ELECTION_RESULT, SAMPLE_DETAILED_ELECTION_RESULT,
|
|
31
|
+
SAMPLE_SEAT_DISTRIBUTION, Sapor::DhondtDenominators)
|
|
32
|
+
|
|
33
|
+
describe Sapor::MultiDistrictProportional, '#project' do
|
|
34
|
+
# Seat distribution:
|
|
35
|
+
# North: Green 1 70, Red 1 50, Green 2 35, (Red 2 25)
|
|
36
|
+
# South: Blue 1 100, Red 1 70, Green 1 50, Blue 2 50, Red 2 35, (Blue 3 33)
|
|
37
|
+
it 'projects same result as last result if fed with last election result' do
|
|
38
|
+
projection = PROPORTIONAL.project(SAMPLE_RGB_ELECTION_RESULT)
|
|
39
|
+
expect(projection['Red']).to eq(3)
|
|
40
|
+
expect(projection['Green']).to eq(3)
|
|
41
|
+
expect(projection['Blue']).to eq(2)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Seat distribution:
|
|
45
|
+
# North: Green 1 62, Red 1 44, Green 2 31, (Red 2 22)
|
|
46
|
+
# South: Blue 1 128, Red 1 62, Green 1 44, Blue 2 64, Blue 3 42, (Red 2 31)
|
|
47
|
+
it 'extrapolates the seat distribution according to the new result' do
|
|
48
|
+
new_result = { 'Red' => 100, 'Green' => 100, 'Blue' => 120 }
|
|
49
|
+
projection = PROPORTIONAL.project(new_result)
|
|
50
|
+
expect(projection['Red']).to eq(2)
|
|
51
|
+
expect(projection['Green']).to eq(3)
|
|
52
|
+
expect(projection['Blue']).to eq(3)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Seat distribution:
|
|
56
|
+
# North: Green 1 70, Red 1 50, Green 2 35 (Red 2 25, Green 3 23)
|
|
57
|
+
# South: Blue 1 100, Red 1 70, Blue 2 50, Red 2 35, Blue 3 33, (Blue 4 25,
|
|
58
|
+
# Red 3 23, Green below threshold)
|
|
59
|
+
it 'excludes parties below the threshold' do
|
|
60
|
+
proportional = Sapor::MultiDistrictProportional.new( \
|
|
61
|
+
SAMPLE_RGB_ELECTION_RESULT, SAMPLE_DETAILED_ELECTION_RESULT,
|
|
62
|
+
SAMPLE_SEAT_DISTRIBUTION, Sapor::DhondtDenominators, 51.to_f / 220)
|
|
63
|
+
projection = proportional.project(SAMPLE_RGB_ELECTION_RESULT)
|
|
64
|
+
expect(projection['Red']).to eq(3)
|
|
65
|
+
expect(projection['Green']).to eq(2)
|
|
66
|
+
expect(projection['Blue']).to eq(3)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Seat distribution:
|
|
70
|
+
# North: Green 1 70, Red 1 50, Green 2 35, (Red 2 25)
|
|
71
|
+
# South: Blue 1 100, Red 1 70, Green 1 50, Blue 2 50, Red 2 35, (Blue 3 33)
|
|
72
|
+
it 'includes parties at the threshold' do
|
|
73
|
+
proportional = Sapor::MultiDistrictProportional.new( \
|
|
74
|
+
SAMPLE_RGB_ELECTION_RESULT, SAMPLE_DETAILED_ELECTION_RESULT,
|
|
75
|
+
SAMPLE_SEAT_DISTRIBUTION, Sapor::DhondtDenominators, 50.to_f / 220)
|
|
76
|
+
projection = proportional.project(SAMPLE_RGB_ELECTION_RESULT)
|
|
77
|
+
expect(projection['Red']).to eq(3)
|
|
78
|
+
expect(projection['Green']).to eq(3)
|
|
79
|
+
expect(projection['Blue']).to eq(2)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
3
|
+
# Copyright (C) 2020 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
4
|
+
#
|
|
5
|
+
# This file is part of SAPoR.
|
|
6
|
+
#
|
|
7
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
8
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
9
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
10
|
+
# version.
|
|
11
|
+
#
|
|
12
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
13
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
14
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'spec_helper'
|
|
20
|
+
|
|
21
|
+
describe Sapor::Netherlands, '#area_code' do
|
|
22
|
+
it 'returns NL as the area code' do
|
|
23
|
+
expect(Sapor::Netherlands.instance.area_code).to eq('NL')
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe Sapor::Netherlands, '#no_of_seats' do
|
|
28
|
+
it 'returns 150 as the number of seats' do
|
|
29
|
+
expect(Sapor::Netherlands.instance.no_of_seats).to eq(150)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe Sapor::Netherlands, '#population_size' do
|
|
34
|
+
it 'returns a population size of 10,516,041' do
|
|
35
|
+
expect(Sapor::Netherlands.instance.population_size).to eq(10_516_041)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe Sapor::Netherlands, '#threshold' do
|
|
40
|
+
it 'returns a threshold of 1/150' do
|
|
41
|
+
expect(Sapor::Netherlands.instance.threshold).to eq(1 / 150.to_f)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe Sapor::Netherlands, '#seats' do
|
|
46
|
+
it 'calculates the number of seats for the election of 2017' do
|
|
47
|
+
results = { 'Volkspartij voor Vrijheid en Democratie' => 2_238_351,
|
|
48
|
+
'Partij voor de Vrijheid' => 1_372_941,
|
|
49
|
+
'Christen-Democratisch Appèl' => 1_301_796,
|
|
50
|
+
'Democraten 66' => 1_285_819,
|
|
51
|
+
'GroenLinks' => 959_600,
|
|
52
|
+
'Socialistische Partij' => 955_633,
|
|
53
|
+
'Partij van de Arbeid' => 599_699,
|
|
54
|
+
'ChristenUnie' => 356_271,
|
|
55
|
+
'Partij voor de Dieren' => 335_214,
|
|
56
|
+
'50Plus' => 327_131,
|
|
57
|
+
'Staatkundig Gereformeerde Partij' => 218_950,
|
|
58
|
+
'DENK' => 216_147,
|
|
59
|
+
'Forum voor Democratie' => 187_162,
|
|
60
|
+
'VoorNederland' => 38_209,
|
|
61
|
+
'Piratenpartij' => 35_478,
|
|
62
|
+
'Artikel 1' => 28_700,
|
|
63
|
+
'Nieuwe Wegen' => 14_362,
|
|
64
|
+
'OndernemersPartij' => 12_570,
|
|
65
|
+
'Lokaal in de Kamer' => 6_858,
|
|
66
|
+
'Niet Stemmers' => 6_025,
|
|
67
|
+
'De Burger Beweging' => 5_221,
|
|
68
|
+
'GeenPeil' => 4_945,
|
|
69
|
+
'Jezus Leeft' => 3_099,
|
|
70
|
+
'Vrijzinnige Partij' => 2_938,
|
|
71
|
+
'Libertarische Partij' => 1_492,
|
|
72
|
+
'Partij voor Mens en Spirit–Basisinkomen Partij–Vrede en ' \
|
|
73
|
+
'Recht' => 726,
|
|
74
|
+
'StemNL' => 527,
|
|
75
|
+
'Vrije Democratische Partij' => 177 }
|
|
76
|
+
seats = Sapor::Netherlands.instance.seats(results)
|
|
77
|
+
expect(seats['Volkspartij voor Vrijheid en Democratie']).to eq(33)
|
|
78
|
+
expect(seats['Partij voor de Vrijheid']).to eq(20)
|
|
79
|
+
expect(seats['Christen-Democratisch Appèl']).to eq(19)
|
|
80
|
+
expect(seats['Democraten 66']).to eq(19)
|
|
81
|
+
expect(seats['GroenLinks']).to eq(14)
|
|
82
|
+
expect(seats['Socialistische Partij']).to eq(14)
|
|
83
|
+
expect(seats['Partij van de Arbeid']).to eq(9)
|
|
84
|
+
expect(seats['ChristenUnie']).to eq(5)
|
|
85
|
+
expect(seats['Partij voor de Dieren']).to eq(5)
|
|
86
|
+
expect(seats['50Plus']).to eq(4)
|
|
87
|
+
expect(seats['Staatkundig Gereformeerde Partij']).to eq(3)
|
|
88
|
+
expect(seats['DENK']).to eq(3)
|
|
89
|
+
expect(seats['Forum voor Democratie']).to eq(2)
|
|
90
|
+
expect(seats['VoorNederland']).to eq(0)
|
|
91
|
+
expect(seats['Piratenpartij']).to eq(0)
|
|
92
|
+
expect(seats['Artikel 1']).to eq(0)
|
|
93
|
+
expect(seats['Nieuwe Wegen']).to eq(0)
|
|
94
|
+
expect(seats['OndernemersPartij']).to eq(0)
|
|
95
|
+
expect(seats['Lokaal in de Kamer']).to eq(0)
|
|
96
|
+
expect(seats['Niet Stemmers']).to eq(0)
|
|
97
|
+
expect(seats['De Burger Beweging']).to eq(0)
|
|
98
|
+
expect(seats['GeenPeil']).to eq(0)
|
|
99
|
+
expect(seats['Jezus Leeft']).to eq(0)
|
|
100
|
+
expect(seats['Vrijzinnige Partij']).to eq(0)
|
|
101
|
+
expect(seats['Libertarische Partij']).to eq(0)
|
|
102
|
+
expect(seats['Partij voor Mens en Spirit–Basisinkomen Partij–Vrede en ' \
|
|
103
|
+
'Recht']).to eq(0)
|
|
104
|
+
expect(seats['StemNL']).to eq(0)
|
|
105
|
+
expect(seats['Vrije Democratische Partij']).to eq(0)
|
|
106
|
+
end
|
|
107
|
+
end
|