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