#include "zeroerr/assert.h" #include "zeroerr/unittest.h" #include "medialoader/sound/WaveDecoder.h" #include "sound/Decoder.h" #include #include #include #include namespace { #include "PathBesideSource.h" EVE_DEFINE_PATH_BESIDE_SOURCE() std::unique_ptr decoder(zeroerr::TestContext *_ZEROERR_TEST_CONTEXT) { std::ifstream input(pathBesideThisSource("fixtures/resource_formats/tone.wav"), std::ios::binary); REQUIRE(input.good()); std::vector bytes{std::istreambuf_iterator(input), std::istreambuf_iterator()}; auto provider = std::make_unique(bytes.data(), bytes.size(), 1024); return std::make_unique(std::move(provider), std::move(bytes)); } std::vector drain(zeroerr::TestContext *_ZEROERR_TEST_CONTEXT, eve::sound::Decoder &stream) { std::vector result; for (int count = 0; count < 100 && !stream.isFinished(); ++count) { const int size = stream.decode(); REQUIRE(size >= 0); const auto *buffer = static_cast(stream.getBuffer()); result.insert(result.end(), buffer, buffer + size); if (size == 0) break; } REQUIRE_EQ(result.size(), 44100u); return result; } } // namespace TEST_CASE("resourceFormats.sound.clone.originalDestroyedFirst") { const auto expected = drain(_ZEROERR_TEST_CONTEXT, *decoder(_ZEROERR_TEST_CONTEXT)); auto original = decoder(_ZEROERR_TEST_CONTEXT); std::unique_ptr clone(original->clone()); original.reset(); CHECK(drain(_ZEROERR_TEST_CONTEXT, *clone) == expected); } TEST_CASE("resourceFormats.sound.clone.cloneDestroyedFirst") { const auto expected = drain(_ZEROERR_TEST_CONTEXT, *decoder(_ZEROERR_TEST_CONTEXT)); auto original = decoder(_ZEROERR_TEST_CONTEXT); { std::unique_ptr clone(original->clone()); CHECK(drain(_ZEROERR_TEST_CONTEXT, *clone) == expected); } CHECK(drain(_ZEROERR_TEST_CONTEXT, *original) == expected); } TEST_CASE("resourceFormats.sound.clone.nestedClonesRetainStorageAndIndependentPosition") { const auto expected = drain(_ZEROERR_TEST_CONTEXT, *decoder(_ZEROERR_TEST_CONTEXT)); auto original = decoder(_ZEROERR_TEST_CONTEXT); REQUIRE(original->decode() > 0); std::unique_ptr clone(original->clone()); std::unique_ptr nested(clone->clone()); original.reset(); CHECK(drain(_ZEROERR_TEST_CONTEXT, *clone) == expected); clone.reset(); CHECK(drain(_ZEROERR_TEST_CONTEXT, *nested) == expected); }