entropy_coder_test.cc (1847B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 // TODO(deymo): Move these tests to dec_ans.h and common.h 7 8 #include <stdint.h> 9 10 #include "lib/jxl/base/random.h" 11 #include "lib/jxl/dec_ans.h" 12 #include "lib/jxl/pack_signed.h" 13 #include "lib/jxl/testing.h" 14 15 namespace jxl { 16 namespace { 17 18 TEST(EntropyCoderTest, PackUnpack) { 19 for (int32_t i = -31; i < 32; ++i) { 20 uint32_t packed = PackSigned(i); 21 EXPECT_LT(packed, 63u); 22 int32_t unpacked = UnpackSigned(packed); 23 EXPECT_EQ(i, unpacked); 24 } 25 } 26 27 struct MockBitReader { 28 uint32_t nbits, bits; 29 void Consume(uint32_t nbits) {} 30 uint32_t PeekBits(uint32_t n) { 31 EXPECT_EQ(n, nbits); 32 return bits; 33 } 34 }; 35 36 void HybridUintRoundtrip(HybridUintConfig config, size_t limit = 1 << 24) { 37 Rng rng(0); 38 constexpr size_t kNumIntegers = 1 << 20; 39 std::vector<uint32_t> integers(kNumIntegers); 40 std::vector<uint32_t> token(kNumIntegers); 41 std::vector<uint32_t> nbits(kNumIntegers); 42 std::vector<uint32_t> bits(kNumIntegers); 43 for (size_t i = 0; i < kNumIntegers; i++) { 44 integers[i] = rng.UniformU(0, limit + 1); 45 config.Encode(integers[i], &token[i], &nbits[i], &bits[i]); 46 } 47 for (size_t i = 0; i < kNumIntegers; i++) { 48 MockBitReader br{nbits[i], bits[i]}; 49 EXPECT_EQ(integers[i], 50 ANSSymbolReader::ReadHybridUintConfig(config, token[i], &br)); 51 } 52 } 53 54 TEST(HybridUintTest, Test000) { 55 HybridUintRoundtrip(HybridUintConfig{0, 0, 0}); 56 } 57 TEST(HybridUintTest, Test411) { 58 HybridUintRoundtrip(HybridUintConfig{4, 1, 1}); 59 } 60 TEST(HybridUintTest, Test420) { 61 HybridUintRoundtrip(HybridUintConfig{4, 2, 0}); 62 } 63 TEST(HybridUintTest, Test421) { 64 HybridUintRoundtrip(HybridUintConfig{4, 2, 1}, 256); 65 } 66 67 } // namespace 68 } // namespace jxl