Commit c4195e0e authored by James Zern's avatar James Zern

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
parent 3db60c8c
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#ifndef LIBVPX_TEST_ACM_RANDOM_H_ #ifndef LIBVPX_TEST_ACM_RANDOM_H_
#define 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" #include "vpx/vpx_integer.h"
...@@ -19,24 +19,23 @@ namespace libvpx_test { ...@@ -19,24 +19,23 @@ namespace libvpx_test {
class ACMRandom { class ACMRandom {
public: public:
ACMRandom() { ACMRandom() : random_(DeterministicSeed()) {}
Reset(DeterministicSeed());
}
explicit ACMRandom(int seed) { explicit ACMRandom(int seed) : random_(seed) {}
Reset(seed);
}
void Reset(int seed) { void Reset(int seed) {
srand(seed); random_.Reseed(seed);
} }
uint8_t Rand8(void) { 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) { int PseudoUniform(int range) {
return (rand() >> 8) % range; return random_.Generate(range);
} }
int operator()(int n) { int operator()(int n) {
...@@ -46,6 +45,9 @@ class ACMRandom { ...@@ -46,6 +45,9 @@ class ACMRandom {
static int DeterministicSeed(void) { static int DeterministicSeed(void) {
return 0xbaba; return 0xbaba;
} }
private:
testing::internal::Random random_;
}; };
} // namespace libvpx_test } // namespace libvpx_test
......
...@@ -51,11 +51,15 @@ TEST(VP9Fdct8x8Test, SignBiasCheck) { ...@@ -51,11 +51,15 @@ TEST(VP9Fdct8x8Test, SignBiasCheck) {
} }
for (int j = 0; j < 64; ++j) { for (int j = 0; j < 64; ++j) {
const bool bias_acceptable = (abs(count_sign_block[j][0] - const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
count_sign_block[j][1]) < 1000); const int max_diff = 1125;
EXPECT_TRUE(bias_acceptable) EXPECT_LT(diff, max_diff)
<< "Error: 8x8 FDCT has a sign bias > 1%" << "Error: 8x8 FDCT has a sign bias > "
<< " for input range [-255, 255] at index " << j; << 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)); memset(count_sign_block, 0, sizeof(count_sign_block));
...@@ -76,11 +80,15 @@ TEST(VP9Fdct8x8Test, SignBiasCheck) { ...@@ -76,11 +80,15 @@ TEST(VP9Fdct8x8Test, SignBiasCheck) {
} }
for (int j = 0; j < 64; ++j) { for (int j = 0; j < 64; ++j) {
const bool bias_acceptable = (abs(count_sign_block[j][0] - const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
count_sign_block[j][1]) < 10000); const int max_diff = 10000;
EXPECT_TRUE(bias_acceptable) EXPECT_LT(diff, max_diff)
<< "Error: 8x8 FDCT has a sign bias > 10%" << "Error: 4x4 FDCT has a sign bias > "
<< " for input range [-15, 15] at index " << j; << 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;
} }
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment