mirror of
https://github.com/opensupports/opensupports.git
synced 2025-07-28 00:04:31 +02:00
add test for linear congruential generator
This commit is contained in:
parent
3fabdfbe2f
commit
1b48369e27
@ -3,6 +3,7 @@ language: php
|
|||||||
php:
|
php:
|
||||||
- '5.6'
|
- '5.6'
|
||||||
- '7.0'
|
- '7.0'
|
||||||
|
- '7.1'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- mysql
|
- mysql
|
||||||
@ -27,5 +28,7 @@ before_install:
|
|||||||
script:
|
script:
|
||||||
- cd client
|
- cd client
|
||||||
- npm test
|
- npm test
|
||||||
|
- cd ../server
|
||||||
|
- ./run-tests.sh
|
||||||
- cd ../tests
|
- cd ../tests
|
||||||
- bacon init.rb
|
- bacon init.rb
|
||||||
|
@ -30,6 +30,8 @@ class Hashing {
|
|||||||
$sqrt = sqrt($number);
|
$sqrt = sqrt($number);
|
||||||
$prime = true;
|
$prime = true;
|
||||||
|
|
||||||
|
if($number <= 1) return false;
|
||||||
|
|
||||||
for($i = 2; $i <= $sqrt; $i++) {
|
for($i = 2; $i <= $sqrt; $i++) {
|
||||||
if($number % $i === 0) {
|
if($number % $i === 0) {
|
||||||
$prime = false;
|
$prime = false;
|
||||||
|
73
server/tests/libs/HashingTest.php
Normal file
73
server/tests/libs/HashingTest.php
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
include_once 'libs/Hashing.php';
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class HashingTest extends TestCase {
|
||||||
|
|
||||||
|
public function testShouldGenerateRandomToken() {
|
||||||
|
$token1 = Hashing::generateRandomToken();
|
||||||
|
$token2 = Hashing::generateRandomToken();
|
||||||
|
|
||||||
|
$this->assertNotEquals($token1, $token2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testShouldHashAndVerifyPassword() {
|
||||||
|
$TEST_TIMES = 5;
|
||||||
|
|
||||||
|
for ($i = 0; $i < $TEST_TIMES; $i++) {
|
||||||
|
$password = Hashing::generateRandomToken();
|
||||||
|
$passwordHash = Hashing::hashPassword($password);
|
||||||
|
|
||||||
|
$this->assertTrue(Hashing::verifyPassword($password, $passwordHash));
|
||||||
|
$this->assertFalse(Hashing::verifyPassword('', $passwordHash));
|
||||||
|
$this->assertFalse(Hashing::verifyPassword($password, ''));
|
||||||
|
$this->assertFalse(Hashing::verifyPassword('', ''));
|
||||||
|
$this->assertFalse(Hashing::verifyPassword($password . 'a', $passwordHash));
|
||||||
|
$this->assertFalse(Hashing::verifyPassword($password, $passwordHash . 'a'));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testShouldGenerateNumber() {
|
||||||
|
$TEST_TIMES = 10;
|
||||||
|
|
||||||
|
for ($i = 0; $i < $TEST_TIMES; $i++) {
|
||||||
|
$min = $i*1000;
|
||||||
|
$max = $TEST_TIMES*6000;
|
||||||
|
|
||||||
|
$number1 = Hashing::generateRandomNumber($min, $max);
|
||||||
|
$number2 = Hashing::generateRandomNumber($min, $max);
|
||||||
|
|
||||||
|
$this->assertTrue($min < $number1 && $number1 < $max);
|
||||||
|
$this->assertTrue($min < $number2 && $number2 < $max);
|
||||||
|
$this->assertNotEquals($number1, $number2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testShouldRecognizePrime() {
|
||||||
|
$primes = [2, 3, 5, 7, 11, 17, 53, 163, 379, 401, 443, 449, 701];
|
||||||
|
$nonPrimes = [0, 1, 4, 27, 40, 51, 155, 363, 381, 511, 703, 928];
|
||||||
|
|
||||||
|
foreach($primes as $number) $this->assertTrue(Hashing::isPrime($number));
|
||||||
|
foreach($nonPrimes as $number) $this->assertFalse(Hashing::isPrime($number));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testShouldGenerateRandsomPrime() {
|
||||||
|
$TEST_TIMES = 10;
|
||||||
|
|
||||||
|
for ($i = 0; $i < $TEST_TIMES; $i++) {
|
||||||
|
$min = $i*1000;
|
||||||
|
$max = $TEST_TIMES*6000;
|
||||||
|
|
||||||
|
$number1 = Hashing::generateRandomPrime($min, $max);
|
||||||
|
$number2 = Hashing::generateRandomPrime($min, $max);
|
||||||
|
|
||||||
|
$this->assertTrue($min < $number1 && $number1 < $max);
|
||||||
|
$this->assertTrue($min < $number2 && $number2 < $max);
|
||||||
|
$this->assertNotEquals($number1, $number2);
|
||||||
|
$this->assertTrue(Hashing::isPrime($number1));
|
||||||
|
$this->assertTrue(Hashing::isPrime($number2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
server/tests/libs/LinearCongruentialGeneratorTest.php
Normal file
30
server/tests/libs/LinearCongruentialGeneratorTest.php
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
include_once 'libs/Hashing.php';
|
||||||
|
include_once 'libs/LinearCongruentialGenerator.php';
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class LinearCongruentialGeneratorTest extends TestCase {
|
||||||
|
|
||||||
|
public function testAvoidCollisions() {
|
||||||
|
$TEST_TIMES = 10;
|
||||||
|
$GENERATE_TIMES = 500000;
|
||||||
|
$min = 100000;
|
||||||
|
$max = 999999;
|
||||||
|
|
||||||
|
for($i = 0; $i < $TEST_TIMES; $i++) {
|
||||||
|
$linearCongruentialGenerator = new LinearCongruentialGenerator();
|
||||||
|
$linearCongruentialGenerator->setRange($min, $max);
|
||||||
|
$linearCongruentialGenerator->setGap(Hashing::generateRandomPrime($min, $max));
|
||||||
|
$linearCongruentialGenerator->setFirst($linearCongruentialGenerator->generateFirst());
|
||||||
|
|
||||||
|
$used = [];
|
||||||
|
|
||||||
|
for($j = 0; $j < $GENERATE_TIMES; $j++) {
|
||||||
|
$generatedNumber = $linearCongruentialGenerator->generate($j);
|
||||||
|
$this->assertFalse(array_key_exists($generatedNumber, $used));
|
||||||
|
$used[$generatedNumber] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user