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,75 @@
|
|
|
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
|
+
module Sapor
|
|
21
|
+
#
|
|
22
|
+
# Class representing a proportional electoral system with only one district.
|
|
23
|
+
#
|
|
24
|
+
class SingleDistrictProportional
|
|
25
|
+
def initialize(no_of_seats, denominators_class, threshold = 0, bonus = 0)
|
|
26
|
+
@no_of_seats = no_of_seats
|
|
27
|
+
@denominators_class = denominators_class
|
|
28
|
+
@threshold = threshold
|
|
29
|
+
@bonus = bonus
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def project(simulation)
|
|
33
|
+
threshold = simulation.values.inject(:+).to_f * @threshold
|
|
34
|
+
quotients = quotients(simulation, threshold)
|
|
35
|
+
sorted_quotients = quotients.sort { |a, b| b.last <=> a.last }
|
|
36
|
+
seats = sorted_quotients.map(&:first).slice(0, @no_of_seats)
|
|
37
|
+
result = create_empty_result(simulation)
|
|
38
|
+
add_seats_to_result(result, seats)
|
|
39
|
+
result
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def create_empty_result(simulation)
|
|
45
|
+
result = {}
|
|
46
|
+
simulation.each_key do |choice|
|
|
47
|
+
result[choice] = 0
|
|
48
|
+
end
|
|
49
|
+
result[simulation.max { |a, b| a.last <=> b.last }[0]] = @bonus
|
|
50
|
+
result[OTHER] = 0
|
|
51
|
+
result
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def add_seats_to_result(result, seats)
|
|
55
|
+
seats.each do |seat|
|
|
56
|
+
if result.key?(seat)
|
|
57
|
+
result[seat] += 1
|
|
58
|
+
else
|
|
59
|
+
result[seat] = 1
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def quotients(votes, threshold)
|
|
65
|
+
quotients = []
|
|
66
|
+
votes.each_pair do |choice, new_value|
|
|
67
|
+
next if new_value < threshold
|
|
68
|
+
@denominators_class.get(@no_of_seats).each do |d|
|
|
69
|
+
quotients << [choice, new_value.to_f / d]
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
quotients
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
data/sapor.gemspec
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
Gem::Specification.new do |gem|
|
|
21
|
+
gem.name = 'sapor'
|
|
22
|
+
gem.version = '0.3.6'
|
|
23
|
+
gem.authors = ['Filip van Laenen']
|
|
24
|
+
gem.email = ['f.a.vanlaenen@ieee.org']
|
|
25
|
+
|
|
26
|
+
gem.description = 'SAPoR'
|
|
27
|
+
gem.summary = 'Statistical Analysis of Polling Results'
|
|
28
|
+
gem.homepage = 'https://github.com/filipvanlaenen/sapor'
|
|
29
|
+
gem.license = 'GPL'
|
|
30
|
+
|
|
31
|
+
gem.require_paths = ['lib']
|
|
32
|
+
gem.files = `git ls-files`.split("\n")
|
|
33
|
+
gem.test_files = `git ls-files -- spec`.split("\n")
|
|
34
|
+
gem.extra_rdoc_files = %w(LICENSE README.md)
|
|
35
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
describe Sapor::Area, '#load_election_results' do
|
|
23
|
+
it 'loads four constituencies for the 2012 election results for Catalonia' do
|
|
24
|
+
area = Sapor::Area.new
|
|
25
|
+
catalonia_2012 = area.load_election_results('catalonia-2012.psv')
|
|
26
|
+
expect(catalonia_2012.size).to eq(4)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
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_FILE = File.join('spec', 'integration', 'sample.poll')
|
|
23
|
+
MAX_ERROR = 0.05
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Logger logging messages to an array.
|
|
27
|
+
#
|
|
28
|
+
class ArrayLogger
|
|
29
|
+
attr_reader :messages
|
|
30
|
+
|
|
31
|
+
def initialize
|
|
32
|
+
@messages = []
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def info(message)
|
|
36
|
+
@messages << message
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
#
|
|
41
|
+
# LoggerBuilder that creates ArrayLogger instances.
|
|
42
|
+
#
|
|
43
|
+
class ArrayLoggerBuilder
|
|
44
|
+
def create_logger
|
|
45
|
+
ArrayLogger.new
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
Sapor::LogFacade.logger_builder = ArrayLoggerBuilder.new
|
|
50
|
+
|
|
51
|
+
describe Sapor::Poll, '#from_file' do
|
|
52
|
+
it 'reads a poll from a file and extracts area' do
|
|
53
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
54
|
+
expect(poll.area.area_code).to eq('UT')
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'reads a poll from a file and extracts type' do
|
|
58
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
59
|
+
expect(poll.type).to eq('Election')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'reads a poll from a file and extracts first result' do
|
|
63
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
64
|
+
expect(poll.result('Red')).to eq(1)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'reads a poll from a file and extracts last result' do
|
|
68
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
69
|
+
expect(poll.result('Blue')).to eq(3)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe Sapor::Poll, '#analyze' do
|
|
74
|
+
it 'logs “Analyzing as a set of dichotomies...”' do
|
|
75
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
76
|
+
poll.analyze(MAX_ERROR)
|
|
77
|
+
expect(poll.logger.messages).to include('Analyzing as a set of' \
|
|
78
|
+
' dichotomies...')
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it 'logs “Analyzing as a polychotomy...”' do
|
|
82
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
83
|
+
poll.analyze(MAX_ERROR)
|
|
84
|
+
expect(poll.logger.messages).to include('Analyzing as a polychotomy...')
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'logs “Done.” at the end' do
|
|
88
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
89
|
+
poll.analyze(MAX_ERROR)
|
|
90
|
+
expect(poll.logger.messages.last).to eq('Done.')
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'logs error estimates' do
|
|
94
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
95
|
+
poll.analyze(MAX_ERROR)
|
|
96
|
+
expect(poll.logger.messages).to include('Error estimate: ε ≤ 33.3%.')
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it 'logs MPV and CI(95%) reports from Dichotomies' do
|
|
100
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
|
101
|
+
poll.analyze(MAX_ERROR)
|
|
102
|
+
expected_report = 'Most probable fractions and 95% confidence' \
|
|
103
|
+
" intervals:\n" \
|
|
104
|
+
"Choice MPF CI(95%)\n" \
|
|
105
|
+
"Yellow 46.3% 22.2%– 74.1%\n" \
|
|
106
|
+
"Blue 24.1% 7.4%– 51.9%\n" \
|
|
107
|
+
"Green 16.7% 3.7%– 44.4%\n" \
|
|
108
|
+
"Red 9.3% 0.0%– 37.0%\n" \
|
|
109
|
+
'Other 9.3% 0.0%– 37.0%'
|
|
110
|
+
expect(poll.logger.messages).to include(expected_report)
|
|
111
|
+
end
|
|
112
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
$LOAD_PATH << 'lib'
|
|
21
|
+
require 'sapor'
|
|
22
|
+
|
|
23
|
+
require 'timeout'
|
|
24
|
+
|
|
25
|
+
RSpec.configure do |config|
|
|
26
|
+
config.around do |example|
|
|
27
|
+
Timeout.timeout(2) do
|
|
28
|
+
example.run
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
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
|
+
NORTH = 'North'
|
|
23
|
+
SOUTH = 'South'
|
|
24
|
+
|
|
25
|
+
RED = 'Red'
|
|
26
|
+
BLUE = 'Blue'
|
|
27
|
+
|
|
28
|
+
NORTH_RED_LINE = "#{NORTH} | #{RED} | 5"
|
|
29
|
+
NORTH_BLUE_LINE = "#{NORTH} | #{BLUE} | 6"
|
|
30
|
+
SOUTH_RED_LINE = "#{SOUTH} | #{RED} | 7"
|
|
31
|
+
SOUTH_BLUE_LINE_WITH_THOUSANDS_SEPARATOR = "#{SOUTH} | #{BLUE} | 8,888,888"
|
|
32
|
+
EMPTY_LINE = ' '
|
|
33
|
+
COMMENT = '# A comment'
|
|
34
|
+
BROKEN_LINE = 'Broken line'
|
|
35
|
+
|
|
36
|
+
describe Sapor::Area, '#lines_to_election_results' do
|
|
37
|
+
it 'converts a single line to 1 constituency' do
|
|
38
|
+
area = Sapor::Area.new
|
|
39
|
+
election_results = area.lines_to_election_results(NORTH_RED_LINE)
|
|
40
|
+
expect(election_results.size).to eq(1)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'converts two lines for the same constituency to 1 constituency' do
|
|
44
|
+
area = Sapor::Area.new
|
|
45
|
+
lines = [NORTH_RED_LINE, NORTH_BLUE_LINE].join("\n")
|
|
46
|
+
election_results = area.lines_to_election_results(lines)
|
|
47
|
+
expect(election_results.size).to eq(1)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'converts two lines for two constituencies to 2 constituencies' do
|
|
51
|
+
area = Sapor::Area.new
|
|
52
|
+
lines = [NORTH_RED_LINE, SOUTH_RED_LINE].join("\n")
|
|
53
|
+
election_results = area.lines_to_election_results(lines)
|
|
54
|
+
expect(election_results.size).to eq(2)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'ignores empty lines' do
|
|
58
|
+
area = Sapor::Area.new
|
|
59
|
+
lines = [NORTH_RED_LINE, EMPTY_LINE].join("\n")
|
|
60
|
+
election_results = area.lines_to_election_results(lines)
|
|
61
|
+
expect(election_results.size).to eq(1)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'ignores comments' do
|
|
65
|
+
area = Sapor::Area.new
|
|
66
|
+
lines = [NORTH_RED_LINE, COMMENT].join("\n")
|
|
67
|
+
election_results = area.lines_to_election_results(lines)
|
|
68
|
+
expect(election_results.size).to eq(1)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'sets the number of votes for a party in a constituency correctly' do
|
|
72
|
+
area = Sapor::Area.new
|
|
73
|
+
election_results = area.lines_to_election_results(NORTH_RED_LINE)
|
|
74
|
+
expect(election_results[NORTH][RED]).to eq(5)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'ignores thousands separators' do
|
|
78
|
+
area = Sapor::Area.new
|
|
79
|
+
election_results = area.lines_to_election_results(\
|
|
80
|
+
SOUTH_BLUE_LINE_WITH_THOUSANDS_SEPARATOR)
|
|
81
|
+
expect(election_results[SOUTH][BLUE]).to eq(8_888_888)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'raises an ArgumentError when a line is broken' do
|
|
85
|
+
area = Sapor::Area.new
|
|
86
|
+
expect { area.lines_to_election_results(BROKEN_LINE) }.to \
|
|
87
|
+
raise_error(ArgumentError, "Broken line: #{BROKEN_LINE}.")
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'raises an ArgumentError if the same choice is added twice to the same ' \
|
|
91
|
+
'constituency' do
|
|
92
|
+
area = Sapor::Area.new
|
|
93
|
+
lines = [NORTH_RED_LINE, NORTH_RED_LINE].join("\n")
|
|
94
|
+
expect { area.lines_to_election_results(lines) }.to \
|
|
95
|
+
raise_error(ArgumentError, "Choice #{RED} appeared twice in " \
|
|
96
|
+
"constituency #{NORTH}.")
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
describe Sapor::Area, '#summarize_election_results' do
|
|
101
|
+
it 'summarizes one result to one result' do
|
|
102
|
+
area = Sapor::Area.new
|
|
103
|
+
election_results = area.lines_to_election_results(NORTH_RED_LINE)
|
|
104
|
+
summary = area.summarize_election_results(election_results)
|
|
105
|
+
expect(summary[RED]).to eq(5)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'summarizes results of same choice in two constituencies' do
|
|
109
|
+
area = Sapor::Area.new
|
|
110
|
+
lines = [NORTH_RED_LINE, SOUTH_RED_LINE].join("\n")
|
|
111
|
+
election_results = area.lines_to_election_results(lines)
|
|
112
|
+
summary = area.summarize_election_results(election_results)
|
|
113
|
+
expect(summary[RED]).to eq(12)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
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::Austria, '#area_code' do
|
|
22
|
+
it 'returns AT as the area code' do
|
|
23
|
+
expect(Sapor::Austria.instance.area_code).to eq('AT')
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe Sapor::Austria, '#no_of_seats' do
|
|
28
|
+
it 'returns 183 as the number of seats' do
|
|
29
|
+
expect(Sapor::Austria.instance.no_of_seats).to eq(183)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe Sapor::Austria, '#population_size' do
|
|
34
|
+
it 'returns a population size of 5,069,929' do
|
|
35
|
+
expect(Sapor::Austria.instance.population_size).to \
|
|
36
|
+
eq(5_069_929)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe Sapor::Austria, '#seats' do
|
|
41
|
+
it 'calculates the number of seats for the election of 2017' do
|
|
42
|
+
results = { 'Österreichische Volkspartei' => 1_595_526,
|
|
43
|
+
'Sozialdemokratische Partei Österreichs' => 1_361_746,
|
|
44
|
+
'Freiheitliche Partei Österreichs' => 1_316_442,
|
|
45
|
+
'NEOS–Das Neue Österreich und Liberales Forum' => 268_518,
|
|
46
|
+
'Liste Peter Pilz' => 223_544,
|
|
47
|
+
'Die Grünen–Die Grüne Alternative' => 192_638,
|
|
48
|
+
'Meine Stimme GILT' => 48_233,
|
|
49
|
+
'Kommunistische Partei Österreichs' => 39_689,
|
|
50
|
+
'Die Weissen' => 9_167,
|
|
51
|
+
'Freie Liste Österreich' => 8_889,
|
|
52
|
+
'Neue Bewegung für die Zukunft' => 2_724,
|
|
53
|
+
'Obdachlose in der Politik' => 761,
|
|
54
|
+
'Sozialistische Linkspartei' => 713,
|
|
55
|
+
'EU-Austrittspartei' => 693,
|
|
56
|
+
'Christliche Partei Österreichs' => 425,
|
|
57
|
+
'Männerpartei' => 221 }
|
|
58
|
+
seats = Sapor::Austria.instance.seats(results)
|
|
59
|
+
expect(seats['Österreichische Volkspartei']).to eq(62)
|
|
60
|
+
expect(seats['Sozialdemokratische Partei Österreichs']).to eq(52)
|
|
61
|
+
expect(seats['Freiheitliche Partei Österreichs']).to eq(51)
|
|
62
|
+
expect(seats['NEOS–Das Neue Österreich und Liberales Forum']).to eq(10)
|
|
63
|
+
expect(seats['Liste Peter Pilz']).to eq(8)
|
|
64
|
+
expect(seats['Die Grünen–Die Grüne Alternative']).to eq(0)
|
|
65
|
+
expect(seats['Meine Stimme GILT']).to eq(0)
|
|
66
|
+
expect(seats['Kommunistische Partei Österreichs']).to eq(0)
|
|
67
|
+
expect(seats['Die Weissen']).to eq(0)
|
|
68
|
+
expect(seats['Freie Liste Österreich']).to eq(0)
|
|
69
|
+
expect(seats['Neue Bewegung für die Zukunft']).to eq(0)
|
|
70
|
+
expect(seats['Obdachlose in der Politik']).to eq(0)
|
|
71
|
+
expect(seats['Sozialistische Linkspartei']).to eq(0)
|
|
72
|
+
expect(seats['EU-Austrittspartei']).to eq(0)
|
|
73
|
+
expect(seats['Christliche Partei Österreichs']).to eq(0)
|
|
74
|
+
expect(seats['Männerpartei']).to eq(0)
|
|
75
|
+
end
|
|
76
|
+
end
|