diff options
author | kleines Filmröllchen <filmroellchen@serenityos.org> | 2022-07-25 13:28:16 +0200 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-09-02 23:54:50 +0100 |
commit | c91511b883a4a342daecf447a0ca0f1ba0995b03 (patch) | |
tree | 451d5265d71d7ef6980c9c73ca095b0bac659a31 /Tests/LibAudio | |
parent | 6587638ffe3f761ccedb3ff381841d045dbe6549 (diff) | |
download | serenity-c91511b883a4a342daecf447a0ca0f1ba0995b03.zip |
Meta+Tests: Allow running FLAC spec tests
The FLAC "spec tests", or rather the test suite by xiph that exercises
weird FLAC features and edge cases, can be found at
https://github.com/ietf-wg-cellar/flac-test-files and is a good
challenge for our FLAC decoder to become more spec compliant. Running
these tests is similar to LibWasm spec tests, you need to pass
INCLUDE_FLAC_SPEC_TESTS to CMake.
As of integrating these tests, 23 out of 63 fail. :yakplus:
Diffstat (limited to 'Tests/LibAudio')
-rw-r--r-- | Tests/LibAudio/CMakeLists.txt | 9 | ||||
-rw-r--r-- | Tests/LibAudio/TestFLACSpec.cpp | 59 |
2 files changed, 68 insertions, 0 deletions
diff --git a/Tests/LibAudio/CMakeLists.txt b/Tests/LibAudio/CMakeLists.txt new file mode 100644 index 0000000000..5e70e6c524 --- /dev/null +++ b/Tests/LibAudio/CMakeLists.txt @@ -0,0 +1,9 @@ +set(TEST_SOURCES + TestFLACSpec.cpp +) + +foreach(source IN LISTS TEST_SOURCES) + serenity_test("${source}" LibAudio LIBS LibAudio) +endforeach() + +install(DIRECTORY ${FLAC_SPEC_TEST_PATH} DESTINATION usr/Tests/LibAudio) diff --git a/Tests/LibAudio/TestFLACSpec.cpp b/Tests/LibAudio/TestFLACSpec.cpp new file mode 100644 index 0000000000..23a040d1e1 --- /dev/null +++ b/Tests/LibAudio/TestFLACSpec.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <AK/LexicalPath.h> +#include <AK/Types.h> +#include <LibAudio/FlacLoader.h> +#include <LibCore/DirIterator.h> +#include <LibCore/Stream.h> +#include <LibTest/TestCase.h> + +struct FlacTest : Test::TestCase { + FlacTest(LexicalPath path) + : Test::TestCase( + String::formatted("flac_spec_test_{}", path.basename()), [this]() { run(); }, false) + , m_path(std::move(path)) + { + } + + void run() const + { + auto loader = Audio::FlacLoaderPlugin { m_path.string() }; + if (auto result = loader.initialize(); result.is_error()) { + FAIL(String::formatted("{} (at {})", result.error().description, result.error().index)); + return; + } + + while (true) { + auto maybe_samples = loader.get_more_samples(2 * MiB); + if (maybe_samples.is_error()) { + FAIL(String::formatted("{} (at {})", maybe_samples.error().description, maybe_samples.error().index)); + return; + } + if (maybe_samples.value().is_empty()) + return; + } + } + + LexicalPath m_path; +}; + +struct DiscoverFLACTestsHack { + DiscoverFLACTestsHack() + { + // FIXME: Also run (our own) tests in this directory. + auto test_iterator = Core::DirIterator { "./SpecTests", Core::DirIterator::Flags::SkipParentAndBaseDir }; + + while (test_iterator.has_next()) { + auto file = LexicalPath { test_iterator.next_full_path() }; + if (file.extension() == "flac"sv) { + Test::add_test_case_to_suite(make_ref_counted<FlacTest>(move(file))); + } + } + } +}; +// 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; |