tests: use a portable rand() implementation

the one from gtest in this case: testing::internal::Random.
this will make the tests deterministic between platforms. addresses
issue #568.

Change-Id: I5a8a92f5c33f52cb0a219c1dd3d02335acbbf163
This commit is contained in:
James Zern 2013-04-04 19:00:31 -07:00
Родитель 3db60c8c6c
Коммит c4195e0eb8
2 изменённых файлов: 30 добавлений и 20 удалений

Просмотреть файл

@ -11,7 +11,7 @@
#ifndef LIBVPX_TEST_ACM_RANDOM_H_
#define LIBVPX_TEST_ACM_RANDOM_H_
#include <stdlib.h>
#include "third_party/googletest/src/include/gtest/gtest.h"
#include "vpx/vpx_integer.h"
@ -19,24 +19,23 @@ namespace libvpx_test {
class ACMRandom {
public:
ACMRandom() {
Reset(DeterministicSeed());
}
ACMRandom() : random_(DeterministicSeed()) {}
explicit ACMRandom(int seed) {
Reset(seed);
}
explicit ACMRandom(int seed) : random_(seed) {}
void Reset(int seed) {
srand(seed);
random_.Reseed(seed);
}
uint8_t Rand8(void) {
return (rand() >> 8) & 0xff;
const uint32_t value =
random_.Generate(testing::internal::Random::kMaxRange);
// There's a bit more entropy in the upper bits of this implementation.
return (value >> 24) & 0xff;
}
int PseudoUniform(int range) {
return (rand() >> 8) % range;
return random_.Generate(range);
}
int operator()(int n) {
@ -46,6 +45,9 @@ class ACMRandom {
static int DeterministicSeed(void) {
return 0xbaba;
}
private:
testing::internal::Random random_;
};
} // namespace libvpx_test

Просмотреть файл

@ -51,11 +51,15 @@ TEST(VP9Fdct8x8Test, SignBiasCheck) {
}
for (int j = 0; j < 64; ++j) {
const bool bias_acceptable = (abs(count_sign_block[j][0] -
count_sign_block[j][1]) < 1000);
EXPECT_TRUE(bias_acceptable)
<< "Error: 8x8 FDCT has a sign bias > 1%"
<< " for input range [-255, 255] at index " << j;
const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
const int max_diff = 1125;
EXPECT_LT(diff, max_diff)
<< "Error: 8x8 FDCT has a sign bias > "
<< 1. * max_diff / count_test_block * 100 << "%"
<< " for input range [-255, 255] at index " << j
<< " count0: " << count_sign_block[j][0]
<< " count1: " << count_sign_block[j][1]
<< " diff: " << diff;
}
memset(count_sign_block, 0, sizeof(count_sign_block));
@ -76,11 +80,15 @@ TEST(VP9Fdct8x8Test, SignBiasCheck) {
}
for (int j = 0; j < 64; ++j) {
const bool bias_acceptable = (abs(count_sign_block[j][0] -
count_sign_block[j][1]) < 10000);
EXPECT_TRUE(bias_acceptable)
<< "Error: 8x8 FDCT has a sign bias > 10%"
<< " for input range [-15, 15] at index " << j;
const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
const int max_diff = 10000;
EXPECT_LT(diff, max_diff)
<< "Error: 4x4 FDCT has a sign bias > "
<< 1. * max_diff / count_test_block * 100 << "%"
<< " for input range [-15, 15] at index " << j
<< " count0: " << count_sign_block[j][0]
<< " count1: " << count_sign_block[j][1]
<< " diff: " << diff;
}
};