1
0
This repository has been archived on 2023-11-30. You can view files and clone it, but cannot push or open issues or pull requests.
dtux__serveur-vote-lalis/include/condorcet/Tests/src/CondorcetTest.php
2022-09-21 14:01:45 +02:00

205 lines
5.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace CondorcetPHP\Condorcet\Tests;
use CondorcetPHP\Condorcet\{Condorcet, Result};
use CondorcetPHP\Condorcet\Algo\{Method, MethodInterface};
use CondorcetPHP\Condorcet\Throwable\AlgorithmException;
use PHPUnit\Framework\TestCase;
class CondorcetTest extends TestCase
{
public function testgetVersion(): void
{
self::assertSame(Condorcet::VERSION, CONDORCET::getVersion());
self::assertMatchesRegularExpression('/^[1-9]+\.[0-9]+$/', CONDORCET::getVersion(true));
}
public function testAddExistingMethod(): void
{
$algoClassPath = Condorcet::getDefaultMethod();
self::assertEquals($algoClassPath, Condorcet::getMethodClass($algoClassPath));
self::assertFalse(Condorcet::addMethod($algoClassPath));
}
public function testBadClassMethod(): never
{
$this->expectException(AlgorithmException::class);
$this->expectExceptionMessage("The voting algorithm is not available: no class found for 'sjskkdlkkzksh'");
Condorcet::addMethod('sjskkdlkkzksh');
}
public function testAuthMethod(): void
{
self::assertFalse(Condorcet::isAuthMethod('skzljdpmzk'));
self::assertNull(Condorcet::getMethodClass('skzljdpmzk'));
self::assertSame(\CondorcetPHP\Condorcet\Algo\Methods\Schulze\SchulzeWinning::class, Condorcet::getMethodClass('Schulze Winning'));
}
/**
* @preserveGlobalState disabled
* @backupStaticAttributes disabled
* @runInSeparateProcess
*/
public function testAddMethod(): never
{
$this->expectException(AlgorithmException::class);
$this->expectExceptionMessage('The voting algorithm is not available: the given class is using an existing alias');
$algoClassPath = CondorcetTest_ValidAlgorithmName::class;
self::assertTrue(Condorcet::addMethod($algoClassPath));
self::assertEquals($algoClassPath, Condorcet::getMethodClass($algoClassPath));
// Try to add existing alias
$algoClassPath = CondorcetTest_DuplicateAlgorithmAlias::class;
self::assertFalse(Condorcet::addMethod($algoClassPath));
}
public function testAddUnvalidMethod(): never
{
$this->expectException(AlgorithmException::class);
$this->expectExceptionMessage('The voting algorithm is not available: the given class is not correct');
$algoClassPath = CondorcetTest_UnvalidAlgorithmName::class;
self::assertFalse(Condorcet::addMethod($algoClassPath));
self::assertSame(
CondorcetTest_UnvalidAlgorithmName::class,
Condorcet::getMethodClass('FirstMethodName')
);
}
public function testUnvalidDefaultMethod(): void
{
self::assertFalse(Condorcet::setDefaultMethod('dgfbdwcd'));
}
public function testEmptyMethod(): never
{
$this->expectException(AlgorithmException::class);
$this->expectExceptionMessage('The voting algorithm is not available: no method name given');
Condorcet::isAuthMethod('');
}
public function testMethodAlias(): void
{
self::assertSame(
\CondorcetPHP\Condorcet\Algo\Methods\KemenyYoung\KemenyYoung::class,
Condorcet::getMethodClass('kemenyYoung')
);
self::assertSame(
\CondorcetPHP\Condorcet\Algo\Methods\KemenyYoung\KemenyYoung::class,
Condorcet::getMethodClass('Maximum likelihood Method')
);
}
}
class CondorcetTest_ValidAlgorithmName extends Method implements MethodInterface
{
public const METHOD_NAME = ['FirstMethodName', 'Alias1', 'Alias_2', 'Alias 3'];
// Get the Result object
public function getResult($options = null): Result
{
// Cache
if ($this->Result !== null) {
return $this->Result;
}
//////
// Ranking calculation
$this->makeRanking();
// Return
return $this->Result;
}
// Compute the Stats
protected function getStats(): array
{
return []; // You are free to do all you wants. Must be an array.;
}
/////////// COMPUTE ///////////
//:: ALGORITHM. :://
protected function makeRanking(): void
{
$this->selfElection->get()->getPairwise();
$result = [0=>1, 1=>2, 2=>3]; // Candidate must be valid candidates
$this->Result = $this->createResult($result);
}
}
class CondorcetTest_DuplicateAlgorithmAlias extends CondorcetTest_ValidAlgorithmName implements MethodInterface
{
public const METHOD_NAME = ['SecondMethodName', 'Alias_2'];
}
class CondorcetTest_UnvalidAlgorithmName
{
public const METHOD_NAME = ['FirstMethodName', 'Alias1', 'Alias_2', 'Alias 3'];
// Get the Result object
public function getResult($options = null): Result
{
// Cache
if ($thisResult !== null) {
return $this->Result;
}
// Ranking calculation
$this->makeRanking();
// Return
return $this->Result;
}
// Compute the Stats
protected function getStats(): array
{
return []; // You are free to do all you wants. Must be an array.;
}
/////////// COMPUTE ///////////
//:: ALGORITHM. :://
protected function makeRanking(): void
{
$this->selfElection->getPairwise();
$result = [0=>0, 1=> [1, 2], 2=> 3]; // Candidate must be valid internal candidate key.
$this->Result = $result;
}
}