|
@@ -0,0 +1,182 @@ |
|
|
|
|
|
#include <lol/lib/doctest> |
|
|
|
|
|
#include <lol/audio/stream> |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("sample saturated add: int8_t") |
|
|
|
|
|
{ |
|
|
|
|
|
// Underflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>(-0x80, -0x80) == -0x80); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>(-0x41, -0x41) == -0x80); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>(-0x40, -0x41) == -0x80); |
|
|
|
|
|
|
|
|
|
|
|
// Standard operating mode |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>(-0x40, -0x40) == -0x80); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>(-0x3f, -0x3f) == -0x7e); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>(-0x01, -0x01) == -0x02); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>(-0x01, 0x00) == -0x01); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>( 0x00, 0x00) == 0x00); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>( 0x00, 0x01) == 0x01); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>( 0x01, 0x01) == 0x02); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>( 0x3f, 0x3f) == 0x7e); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>( 0x3f, 0x40) == 0x7f); |
|
|
|
|
|
|
|
|
|
|
|
// Overflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>( 0x40, 0x40) == 0x7f); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int8_t>( 0x7f, 0x7f) == 0x7f); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("sample saturated add: uint8_t") |
|
|
|
|
|
{ |
|
|
|
|
|
// Underflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x00, 0x00) == 0x00); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x3f, 0x3f) == 0x00); |
|
|
|
|
|
|
|
|
|
|
|
// Standard operating mode |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x40, 0x40) == 0x00); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x41, 0x41) == 0x02); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x7f, 0x7f) == 0x7e); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x7f, 0x80) == 0x7f); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x80, 0x80) == 0x80); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x80, 0x81) == 0x81); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0x81, 0x81) == 0x82); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0xbf, 0xbf) == 0xfe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0xbf, 0xc0) == 0xff); |
|
|
|
|
|
|
|
|
|
|
|
// Overflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0xc0, 0xc0) == 0xff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint8_t>(0xff, 0xff) == 0xff); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("sample saturated add: int16_t") |
|
|
|
|
|
{ |
|
|
|
|
|
// Underflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>(-0x8000, -0x8000) == -0x8000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>(-0x4001, -0x4001) == -0x8000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>(-0x4000, -0x4001) == -0x8000); |
|
|
|
|
|
|
|
|
|
|
|
// Standard operating mode |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>(-0x4000, -0x4000) == -0x8000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>(-0x3fff, -0x3fff) == -0x7ffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>(-0x0001, -0x0001) == -0x0002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>(-0x0001, 0x0000) == -0x0001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>( 0x0000, 0x0000) == 0x0000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>( 0x0000, 0x0001) == 0x0001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>( 0x0001, 0x0001) == 0x0002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>( 0x3fff, 0x3fff) == 0x7ffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>( 0x3fff, 0x4000) == 0x7fff); |
|
|
|
|
|
|
|
|
|
|
|
// Overflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>( 0x4000, 0x4000) == 0x7fff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int16_t>( 0x7fff, 0x7fff) == 0x7fff); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("sample saturated add: uint16_t") |
|
|
|
|
|
{ |
|
|
|
|
|
// Underflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x0000, 0x0000) == 0x0000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x3fff, 0x3fff) == 0x0000); |
|
|
|
|
|
|
|
|
|
|
|
// Standard operating mode |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x4000, 0x4000) == 0x0000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x4001, 0x4001) == 0x0002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x7fff, 0x7fff) == 0x7ffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x7fff, 0x8000) == 0x7fff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x8000, 0x8000) == 0x8000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x8000, 0x8001) == 0x8001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0x8001, 0x8001) == 0x8002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0xbfff, 0xbfff) == 0xfffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0xbfff, 0xc000) == 0xffff); |
|
|
|
|
|
|
|
|
|
|
|
// Overflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0xc000, 0xc000) == 0xffff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint16_t>(0xffff, 0xffff) == 0xffff); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("sample saturated add: uint32_t") |
|
|
|
|
|
{ |
|
|
|
|
|
// Underflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x00000000, 0x00000000) == 0x00000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x3fffffff, 0x3fffffff) == 0x00000000); |
|
|
|
|
|
|
|
|
|
|
|
// Standard operating mode |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x40000000, 0x40000000) == 0x00000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x40000001, 0x40000001) == 0x00000002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x7fffffff, 0x7fffffff) == 0x7ffffffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x7fffffff, 0x80000000) == 0x7fffffff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x80000000, 0x80000000) == 0x80000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x80000000, 0x80000001) == 0x80000001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0x80000001, 0x80000001) == 0x80000002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0xbfffffff, 0xbfffffff) == 0xfffffffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0xbfffffff, 0xc0000000) == 0xffffffff); |
|
|
|
|
|
|
|
|
|
|
|
// Overflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0xc0000000, 0xc0000000) == 0xffffffff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint32_t>(0xffffffff, 0xffffffff) == 0xffffffff); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("sample saturated add: int32_t") |
|
|
|
|
|
{ |
|
|
|
|
|
// Underflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>(-0x80000000, -0x80000000) == -0x80000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>(-0x40000001, -0x40000001) == -0x80000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>(-0x40000000, -0x40000001) == -0x80000000); |
|
|
|
|
|
|
|
|
|
|
|
// Standard operating mode |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>(-0x40000000, -0x40000000) == -0x80000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>(-0x3fffffff, -0x3fffffff) == -0x7ffffffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>(-0x00000001, -0x00000001) == -0x00000002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>(-0x00000001, 0x00000000) == -0x00000001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>( 0x00000000, 0x00000000) == 0x00000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>( 0x00000000, 0x00000001) == 0x00000001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>( 0x00000001, 0x00000001) == 0x00000002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>( 0x3fffffff, 0x3fffffff) == 0x7ffffffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>( 0x3fffffff, 0x40000000) == 0x7fffffff); |
|
|
|
|
|
|
|
|
|
|
|
// Overflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>( 0x40000000, 0x40000000) == 0x7fffffff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int32_t>( 0x7fffffff, 0x7fffffff) == 0x7fffffff); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("sample saturated add: uint64_t") |
|
|
|
|
|
{ |
|
|
|
|
|
// Underflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x0000000000000000, 0x0000000000000000) == 0x0000000000000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x3fffffffffffffff, 0x3fffffffffffffff) == 0x0000000000000000); |
|
|
|
|
|
|
|
|
|
|
|
// Standard operating mode |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x4000000000000000, 0x4000000000000000) == 0x0000000000000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x4000000000000001, 0x4000000000000001) == 0x0000000000000002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x7fffffffffffffff, 0x7fffffffffffffff) == 0x7ffffffffffffffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x7fffffffffffffff, 0x8000000000000000) == 0x7fffffffffffffff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x8000000000000000, 0x8000000000000000) == 0x8000000000000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x8000000000000000, 0x8000000000000001) == 0x8000000000000001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0x8000000000000001, 0x8000000000000001) == 0x8000000000000002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0xbfffffffffffffff, 0xbfffffffffffffff) == 0xfffffffffffffffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0xbfffffffffffffff, 0xc000000000000000) == 0xffffffffffffffff); |
|
|
|
|
|
|
|
|
|
|
|
// Overflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0xc000000000000000, 0xc000000000000000) == 0xffffffffffffffff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<uint64_t>(0xffffffffffffffff, 0xffffffffffffffff) == 0xffffffffffffffff); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("sample saturated add: int64_t") |
|
|
|
|
|
{ |
|
|
|
|
|
// Underflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>(-0x8000000000000000, -0x8000000000000000) == -0x8000000000000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>(-0x4000000000000001, -0x4000000000000001) == -0x8000000000000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>(-0x4000000000000000, -0x4000000000000001) == -0x8000000000000000); |
|
|
|
|
|
|
|
|
|
|
|
// Standard operating mode |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>(-0x4000000000000000, -0x4000000000000000) == -0x8000000000000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>(-0x3fffffffffffffff, -0x3fffffffffffffff) == -0x7ffffffffffffffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>(-0x0000000000000001, -0x0000000000000001) == -0x0000000000000002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>(-0x0000000000000001, 0x0000000000000000) == -0x0000000000000001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>( 0x0000000000000000, 0x0000000000000000) == 0x0000000000000000); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>( 0x0000000000000000, 0x0000000000000001) == 0x0000000000000001); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>( 0x0000000000000001, 0x0000000000000001) == 0x0000000000000002); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>( 0x3fffffffffffffff, 0x3fffffffffffffff) == 0x7ffffffffffffffe); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>( 0x3fffffffffffffff, 0x4000000000000000) == 0x7fffffffffffffff); |
|
|
|
|
|
|
|
|
|
|
|
// Overflow |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>( 0x4000000000000000, 0x4000000000000000) == 0x7fffffffffffffff); |
|
|
|
|
|
CHECK(lol::audio::sample::sadd<int64_t>( 0x7fffffffffffffff, 0x7fffffffffffffff) == 0x7fffffffffffffff); |
|
|
|
|
|
} |