From 31cdf3d99d39555c7bbdf5b6e1571ac35d60198c Mon Sep 17 00:00:00 2001 From: RunasSudo Date: Thu, 26 Aug 2021 22:13:23 +1000 Subject: [PATCH] Add validation test for Church of England rules --- docs/options.md | 2 +- docs/validation.md | 1 + tests/coe.rs | 39 +++++++++++++++++++++++++++++++++++++++ tests/data/ers97_coe.csv | 14 ++++++++++++++ tests/data/ers97_coe.ods | Bin 0 -> 14785 bytes 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/coe.rs create mode 100644 tests/data/ers97_coe.csv create mode 100644 tests/data/ers97_coe.ods diff --git a/docs/options.md b/docs/options.md index a0aabbe..62d77af 100644 --- a/docs/options.md +++ b/docs/options.md @@ -22,7 +22,7 @@ The preset dropdown allows you to choose from a hardcoded list of preloaded STV | [ERS97](https://www.electoral-reform.org.uk/latest-news-and-research/publications/how-to-conduct-an-election-by-the-single-transferable-vote-3rd-edition/) | More complex rules designed for hand counting, using the exclusive Gregory method. | [E6] | ✓ | | • ERS76 | Former rules from the 1976 2nd edition. | [E6] [E7] | ✓ | | • ERS73 | Former rules from the 1973 1st edition. | [E6] [E7] | | -| Church of England | Rules from the Church of England [*Single Transferable Vote Rules 2020*](https://www.churchofengland.org/sites/default/files/2020-02/STV%20Rules%202020%20-%20final.pdf), similar to ERS73. | | +| Church of England | Rules from the Church of England [*Single Transferable Vote Rules 2020*](https://www.churchofengland.org/sites/default/files/2020-02/STV%20Rules%202020%20-%20final.pdf), similar to ERS73. | | ✓ | Exceptions: diff --git a/docs/validation.md b/docs/validation.md index 10c3832..b717fed 100644 --- a/docs/validation.md +++ b/docs/validation.md @@ -19,6 +19,7 @@ STV-counting software is frequently validated empirically by comparing the resul | ERS97 | [Reverse engineered ballot papers for the ERS97 model election](https://yingtongli.me/blog/2021/01/04/ers97.html) | [Model result](https://www.electoral-reform.org.uk/latest-news-and-research/publications/how-to-conduct-an-election-by-the-single-transferable-vote-3rd-edition/#sub-section-24) (official) | ✓ | | ERS97 | [Joe Otten/eSTV ballot papers for the ERS97 model election](https://web.archive.org/web/20020606014623/http://estv.otten.co.uk/) | [Model result](https://www.electoral-reform.org.uk/latest-news-and-research/publications/how-to-conduct-an-election-by-the-single-transferable-vote-3rd-edition/#sub-section-24) (official) | ✓ | | ERS76 | Ballot papers adapted from Joe Otten/eSTV ERS97 papers | Model result (official) | ✓ | +| Church of England | Joe Otten/eSTV ballot papers for the ERS97 model election | [eSTV 1.47](https://web.archive.org/web/20040607021930/http://www.electoral-reform.org.uk/votingsystems/estv.htm) | ✓ | # References diff --git a/tests/coe.rs b/tests/coe.rs new file mode 100644 index 0000000..82ebab4 --- /dev/null +++ b/tests/coe.rs @@ -0,0 +1,39 @@ +/* OpenTally: Open-source election vote counting + * Copyright © 2021 Lee Yingtong Li (RunasSudo) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +mod utils; + +use opentally::numbers::Rational; +use opentally::stv; + +#[test] +fn ers97_coe_rational() { + let stv_opts = stv::STVOptionsBuilder::default() + .round_surplus_fractions(Some(2)) + .round_values(Some(2)) + .round_votes(Some(2)) + .round_quota(Some(2)) + .sum_surplus_transfers(stv::SumSurplusTransfersMode::PerBallot) + .quota_criterion(stv::QuotaCriterion::GreaterOrEqual) + .surplus(stv::SurplusMethod::EG) + .transferable_only(true) + .exclusion(stv::ExclusionMethod::ByValue) + .defer_surpluses(true) + .build().unwrap(); + + utils::read_validate_election::("tests/data/ers97_coe.csv", "tests/data/ers97.blt", stv_opts, None, &["nt"]); +} diff --git a/tests/data/ers97_coe.csv b/tests/data/ers97_coe.csv new file mode 100644 index 0000000..60dce3d --- /dev/null +++ b/tests/data/ers97_coe.csv @@ -0,0 +1,14 @@ +Stage:,1,,2,,4,,6,,8,,9,,10, +Comment:,First preferences,,Surplus of Smith,,Exclusion of Monk,,Exclusion of Glazier,,Exclusion of Wright,,Surplus of Carpenter,,Exclusion of Abbot, +Smith,134,EL,107.58,EL,107.58,EL,107.58,EL,107.58,EL,107.58,EL,107.58,EL +Duke,105,H,106.68,H,108.68,EL,108.68,EL,108.68,EL,108.68,EL,108.68,EL +Prince,91,H,91.63,H,95.63,H,98.47,H,102.31,H,104.31,H,104.31,EL +Freeman,90,H,92.94,H,93.94,H,96.99,H,99.62,H,100.62,H,101.62,EL +Carpenter,81,H,88.14,H,88.35,H,104.35,H,122.35,EL,107.58,EL,107.58,EL +Baron,64,H,64.21,H,64.21,H,65.84,H,68.26,H,68.26,H,79.26,H +Abbot,59,H,59.84,H,64.84,H,66.47,H,67.1,H,67.1,H,2.1,EX +Vicar,55,H,55.21,H,65.21,H,67.47,H,70.31,H,70.31,H,111.31,EL +Wright,27,H,32.25,H,32.25,H,32.25,H,0,EX,0,EX,0, +Glazier,24,H,30.51,H,30.51,H,0,EX,0,EX,0,EX,0, +Monk,23,H,23.42,H,0,EX,0,EX,0,EX,0,EX,0, +Non-transferable,0,,0.59,,1.8,,4.9,,6.79,,18.56,,30.56, diff --git a/tests/data/ers97_coe.ods b/tests/data/ers97_coe.ods new file mode 100644 index 0000000000000000000000000000000000000000..da7018e15d3c3ebdecb8879210bbbdea4f8c52f2 GIT binary patch literal 14785 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 KI>Jo9&;AcOV`5kU literal 0 HcmV?d00001