sapor 0.1b1
Sign up to get free protection for your applications and to get access to all the features.
- 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/Examples.md +361 -0
- data/LICENSE +674 -0
- data/README.md +70 -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 +22 -0
- data/bin/sapor.sh +105 -0
- data/lib/sapor.rb +44 -0
- data/lib/sapor/binomials_cache.rb +45 -0
- data/lib/sapor/combinations_distribution.rb +180 -0
- data/lib/sapor/dichotomies.rb +98 -0
- data/lib/sapor/dichotomy.rb +138 -0
- data/lib/sapor/first_past_the_post.rb +78 -0
- data/lib/sapor/leveled_proportional.rb +64 -0
- data/lib/sapor/log4r_logger.rb +49 -0
- data/lib/sapor/log_facade.rb +40 -0
- data/lib/sapor/number_formatter.rb +45 -0
- data/lib/sapor/poll.rb +137 -0
- data/lib/sapor/polychotomy.rb +359 -0
- data/lib/sapor/proportional.rb +128 -0
- data/lib/sapor/pseudorandom_multirange_enumerator.rb +87 -0
- data/lib/sapor/regional_data/area.rb +80 -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.rb +90 -0
- data/lib/sapor/regional_data/norway.rb +408 -0
- data/lib/sapor/regional_data/united_kingdom.rb +1075 -0
- data/lib/sapor/regional_data/utopia.rb +66 -0
- data/sapor.gemspec +35 -0
- data/spec/integration/area_spec.rb +28 -0
- data/spec/integration/poll_spec.rb +107 -0
- data/spec/integration/sample.poll +7 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/unit/area_spec.rb +115 -0
- data/spec/unit/binomials_cache_spec.rb +34 -0
- data/spec/unit/catalonia_spec.rb +82 -0
- data/spec/unit/combinations_distribution_spec.rb +241 -0
- data/spec/unit/denominators_spec.rb +34 -0
- data/spec/unit/dichotomies_spec.rb +154 -0
- data/spec/unit/dichotomy_spec.rb +320 -0
- data/spec/unit/first_past_the_post_spec.rb +53 -0
- data/spec/unit/leveled_proportional_spec.rb +51 -0
- data/spec/unit/norway_spec.rb +47 -0
- data/spec/unit/number_formatter_spec.rb +173 -0
- data/spec/unit/poll_spec.rb +105 -0
- data/spec/unit/polychotomy_spec.rb +332 -0
- data/spec/unit/proportional_spec.rb +86 -0
- data/spec/unit/pseudorandom_multirange_enumerator_spec.rb +82 -0
- metadata +119 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
4
|
+
# Copyright (C) 2014 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
|
+
# The regional data for Utopia, an area for testing purposes.
|
23
|
+
#
|
24
|
+
class Utopia
|
25
|
+
include Singleton
|
26
|
+
|
27
|
+
LAST_ELECTION_RESULT = { 'Red' => 91_811, 'Green' => 190_934,
|
28
|
+
'Blue' => 290_647, 'Yellow' => 356_473 }
|
29
|
+
|
30
|
+
LAST_DETAILED_ELECTION_RESULT = { 'North' => { 'Red' => 50, 'Green' => 70
|
31
|
+
},
|
32
|
+
'South' => { 'Red' => 70, 'Green' => 50,
|
33
|
+
'Blue' => 100 },
|
34
|
+
'East' => { 'Red' => 90, 'Green' => 70,
|
35
|
+
'Blue' => 90 },
|
36
|
+
'West' => { 'Red' => 110, 'Green' => 50,
|
37
|
+
'Yellow' => 120 } }
|
38
|
+
|
39
|
+
ELECTORAL_SYSTEM = FirstPastThePost.new(LAST_ELECTION_RESULT,
|
40
|
+
LAST_DETAILED_ELECTION_RESULT)
|
41
|
+
|
42
|
+
def area_code
|
43
|
+
'UT'
|
44
|
+
end
|
45
|
+
|
46
|
+
def coalitions
|
47
|
+
[['Red', 'Green'], ['Red', 'Blue']]
|
48
|
+
end
|
49
|
+
|
50
|
+
def population_size
|
51
|
+
1_000_000
|
52
|
+
end
|
53
|
+
|
54
|
+
def threshold
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def no_of_seats
|
59
|
+
LAST_DETAILED_ELECTION_RESULT.size
|
60
|
+
end
|
61
|
+
|
62
|
+
def seats(simulation)
|
63
|
+
ELECTORAL_SYSTEM.project(simulation)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/sapor.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
4
|
+
# Copyright (C) 2014 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.1b1'
|
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) 2014 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.instance
|
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,107 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
4
|
+
# Copyright (C) 2014 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 first result' do
|
58
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
59
|
+
expect(poll.result('Red')).to eq(1)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'reads a poll from a file and extracts last result' do
|
63
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
64
|
+
expect(poll.result('Blue')).to eq(3)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe Sapor::Poll, '#analyze' do
|
69
|
+
it 'logs “Analyzing as a set of dichotomies...”' do
|
70
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
71
|
+
poll.analyze(MAX_ERROR)
|
72
|
+
expect(poll.logger.messages).to include('Analyzing as a set of' \
|
73
|
+
' dichotomies...')
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'logs “Analyzing as a polychotomy...”' do
|
77
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
78
|
+
poll.analyze(MAX_ERROR)
|
79
|
+
expect(poll.logger.messages).to include('Analyzing as a polychotomy...')
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'logs “Done.” at the end' do
|
83
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
84
|
+
poll.analyze(MAX_ERROR)
|
85
|
+
expect(poll.logger.messages.last).to eq('Done.')
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'logs error estimates' do
|
89
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
90
|
+
poll.analyze(MAX_ERROR)
|
91
|
+
expect(poll.logger.messages).to include('Error estimate: ε ≤ 33.3%.')
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'logs MPV and CI(95%) reports from Dichotomies' do
|
95
|
+
poll = Sapor::Poll.from_file(SAMPLE_FILE)
|
96
|
+
poll.analyze(MAX_ERROR)
|
97
|
+
expected_report = 'Most probable fractions and 95% confidence' \
|
98
|
+
" intervals:\n" \
|
99
|
+
"Choice MPF CI(95%)\n" \
|
100
|
+
"Yellow 46.3% 22.2%– 74.1%\n" \
|
101
|
+
"Blue 24.1% 7.4%– 51.9%\n" \
|
102
|
+
"Green 16.7% 3.7%– 44.4%\n" \
|
103
|
+
"Red 9.3% 0.0%– 37.0%\n" \
|
104
|
+
'Other 9.3% 0.0%– 37.0%'
|
105
|
+
expect(poll.logger.messages).to include(expected_report)
|
106
|
+
end
|
107
|
+
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) 2014 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(1) 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) 2014 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.instance
|
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.instance
|
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.instance
|
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.instance
|
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.instance
|
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.instance
|
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.instance
|
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.instance
|
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.instance
|
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.instance
|
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.instance
|
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,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
4
|
+
# Copyright (C) 2014 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,82 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
4
|
+
# Copyright (C) 2014 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-CAT 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í',
|
33
|
+
"Candidatura d'Unitat Popular – Alternativa d'Esquerres"])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe Sapor::Catalonia, '#no_of_seats' do
|
38
|
+
it 'returns 135 as the number of seats' do
|
39
|
+
expect(Sapor::Catalonia.instance.no_of_seats).to eq(135)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe Sapor::Catalonia, '#population_size' do
|
44
|
+
it 'returns a population size of 3,668,310' do
|
45
|
+
expect(Sapor::Catalonia.instance.population_size).to eq(3_668_310)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe Sapor::Catalonia, '#seats' do
|
50
|
+
it 'calculates the number of seats for the election of 2012 (adapted to' \
|
51
|
+
' 2015) correctly' do
|
52
|
+
catalonia = Sapor::Catalonia.instance
|
53
|
+
results = catalonia.overall_election_results_of_2012_adapted_to_2015
|
54
|
+
seats = catalonia.seats(results)
|
55
|
+
expect(seats['Junts pel Sí']).to eq(64)
|
56
|
+
expect(seats['Partit dels Socialistes de Catalunya']).to eq(20)
|
57
|
+
expect(seats['Partit Popular de Catalunya']).to eq(19)
|
58
|
+
expect(seats['Catalunya Sí que es Pot']).to eq(13)
|
59
|
+
expect(seats['Ciutadans-Partido de la Ciudadanía']).to eq(9)
|
60
|
+
expect(seats['Unió Democràtica de Catalunya']).to eq(7)
|
61
|
+
expect(seats["Candidatura d'Unitat Popular – Alternativa d'Esquerres"]).to \
|
62
|
+
eq(3)
|
63
|
+
expect(seats['Plataforma per Catalunya']).to eq(0)
|
64
|
+
expect(seats['Solidaritat Catalana per la Independència']).to eq(0)
|
65
|
+
expect(seats['Escons en Blanc']).to eq(0)
|
66
|
+
expect(seats['Partido Animalista Contra el Maltrato Animal']).to eq(0)
|
67
|
+
expect(seats['Pirates de Catalunya']).to eq(0)
|
68
|
+
expect(seats['Unió, Progrés i Democràcia']).to eq(0)
|
69
|
+
expect(seats['Farts.cat']).to eq(0)
|
70
|
+
expect(seats['Via Democràtica']).to eq(0)
|
71
|
+
expect(seats["Unificació Comunista d'Espanya"]).to eq(0)
|
72
|
+
expect(seats["Partit Republicà d'Esquerra – Izquierda Republicana"]).to \
|
73
|
+
eq(0)
|
74
|
+
expect(seats['Socialistes i Republicans']).to eq(0)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe Sapor::Catalonia, '#threshold' do
|
79
|
+
it 'returns a threshold of 3%' do
|
80
|
+
expect(Sapor::Catalonia.instance.threshold).to eq(0.03)
|
81
|
+
end
|
82
|
+
end
|