test adding condorcet vote
This commit is contained in:
204
include/Condorcet/Tests/src/CondorcetTest.php
Normal file
204
include/Condorcet/Tests/src/CondorcetTest.php
Normal file
@ -0,0 +1,204 @@
|
||||
<?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('kemeny–Young')
|
||||
);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user