You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.6 KiB
Scheme

;;; Copyright 2022 Edward L. Platt
;;;
;;; Licensed under the Apache License, Version 2.0 (the "License");
;;; you may not use this file except in compliance with the License.
;;; You may obtain a copy of the License at
;;;
;;; http://www.apache.org/licenses/LICENSE-2.0
;;;
;;; Unless required by applicable law or agreed to in writing, software
;;; distributed under the License is distributed on an "AS IS" BASIS,
;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;; See the License for the specific language governing permissions and
;;; limitations under the License.
(define-module (tests test-preference)
#:use-module (srfi srfi-64)
#:use-module (goblins)
#:use-module (goblins vrun)
#:use-module (goblins actor-lib methods)
#:use-module (deliberate))
(define a-vat (spawn-vat))
(define-vat-run a-run a-vat)
(test-begin "test-deliberate")
;; Tests for ^deliberation-info
(define info (a-run (spawn ^deliberation-info "Power Generator")))
(test-equal "Power Generator"
(a-run ($ info 'topic)))
(a-run ($ info 'set-topic "Energy"))
(test-equal "Energy"
(a-run ($ info 'topic)))
;; Tests for ^deliberation
(define delib (a-run (spawn ^deliberation "Power Generator")))
(test-equal "Power Generator"
(a-run ($ delib 'topic)))
;; Tests for ^ranked-choice-vote
(define vote (a-run ($ delib 'add-vote "What type of generator?")))
(a-run ($ delib 'votes))
(a-run ($ vote 'ballots))
;; Add alternatives
(a-run ($ vote 'add-alternative "solar"))
(a-run ($ vote 'add-alternative "wind"))
(a-run ($ vote 'add-alternative "hydro"))
;; Tests for ^ranked-ballot
(define ballot (a-run ($ vote 'add-ballot)))
(a-run ($ vote 'ballots))
(a-run ($ ballot 'alternatives))
(a-run ($ ballot 'question))
;; Example ranking functions
(define (f-wind-solar-hydro alts) '(3 1 2))
(define (f-hydro-solar-wind alts) '(1 3 2))
(define (f-solar-wind-hydro alts) '(3 2 1))
;; Cast a single vote
(a-run ($ ballot 'update-vote f-wind-solar-hydro))
(test-equal '("wind" "solar" "hydro")
(a-run ($ ballot 'ranking)))
;; Add more votes to test voting methods
(let ((ballot (a-run ($ vote 'add-ballot))))
(a-run ($ ballot 'update-vote f-wind-solar-hydro)))
(let ((ballot (a-run ($ vote 'add-ballot))))
(a-run ($ ballot 'update-vote f-hydro-solar-wind)))
(let ((ballot (a-run ($ vote 'add-ballot))))
(a-run ($ ballot 'update-vote f-hydro-solar-wind)))
(let ((ballot (a-run ($ vote 'add-ballot))))
(a-run ($ ballot 'update-vote f-solar-wind-hydro)))
;; Test instant-runoff
(test-equal '("wind")
(a-run ($ vote 'irv-winner)))
;; Test Borda method
(test-equal '("solar")
(a-run ($ vote 'borda-winner)))
(test-end "test-deliberate")