serenity/Tests/LibAudio/TestFLACSpec.cpp
kleines Filmröllchen 5f1dbbaaa6 LibAudio: Extract loader stream creation from the plugins
This removes a lot of duplicated stream creation code from the plugins,
and also simplifies the way that the appropriate plugin is found. This
mirrors the ImageDecoderPlugin design and necessitates new sniffing
methods on the loaders.
2023-06-27 15:28:22 +01:00

58 lines
2.7 KiB
C++

/*
* Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/LexicalPath.h>
#include <LibAudio/FlacLoader.h>
#include <LibCore/Directory.h>
#include <LibTest/TestCase.h>
struct DiscoverFLACTestsHack {
DiscoverFLACTestsHack()
{
// FIXME: Also run (our own) tests in this directory.
(void)Core::Directory::for_each_entry("./FLAC/SpecTests"sv, Core::DirIterator::Flags::SkipParentAndBaseDir, [](auto const& entry, auto const& directory) -> ErrorOr<IterationDecision> {
auto path = LexicalPath::join(directory.path().string(), entry.name);
if (path.extension() == "flac"sv) {
Test::add_test_case_to_suite(adopt_ref(*new ::Test::TestCase(
DeprecatedString::formatted("flac_spec_test_{}", path.basename()),
[path = move(path)]() {
auto file = Core::File::open(path.string(), Core::File::OpenMode::Read);
if (file.is_error()) {
FAIL(DeprecatedString::formatted("{}", file.error()));
return;
}
auto buffered_file = Core::InputBufferedFile::create(file.release_value());
if (buffered_file.is_error()) {
FAIL(DeprecatedString::formatted("{}", buffered_file.error()));
return;
}
auto result = Audio::FlacLoaderPlugin::create(buffered_file.release_value());
if (result.is_error()) {
FAIL(DeprecatedString::formatted("{}", result.error()));
return;
}
auto loader = result.release_value();
while (true) {
auto maybe_samples = loader->load_chunks(2 * MiB);
if (maybe_samples.is_error()) {
FAIL(DeprecatedString::formatted("{}", maybe_samples.error()));
return;
}
maybe_samples.value().remove_all_matching([](auto& chunk) { return chunk.is_empty(); });
if (maybe_samples.value().is_empty())
return;
}
},
false)));
}
return IterationDecision::Continue;
});
}
};
// Hack taken from TEST_CASE; the above constructor will run as part of global initialization before the tests are actually executed
static struct DiscoverFLACTestsHack hack;