Browse Source

Text,Trade: properly test that close() is called from open*().

This was apparently never tested, so accidentally omitting the close()
call during a refactor wouldn't trigger any test failure until
accidental discovery months later. 100% coverage and yet.
pull/482/merge
Vladimír Vondruš 1 week ago
parent
commit
91cea657c5
  1. 50
      src/Magnum/Text/Test/AbstractFontTest.cpp
  2. 96
      src/Magnum/Trade/Test/AbstractImporterTest.cpp

50
src/Magnum/Text/Test/AbstractFontTest.cpp

@ -196,6 +196,17 @@ struct AbstractFontTest: TestSuite::Tester {
#endif #endif
}; };
const struct {
const char* name;
bool openedBefore;
/** @todo remove this once the deprecated APIs are gone */
UnsignedInt fontId;
} OpenDataFileData[]{
{"", false, 0},
{"opened before", true, 0},
{"non-zero font ID", false, 1}
};
/** @todo remove this once the deprecated APIs are gone */ /** @todo remove this once the deprecated APIs are gone */
const struct { const struct {
const char* name; const char* name;
@ -256,7 +267,7 @@ AbstractFontTest::AbstractFontTest() {
&AbstractFontTest::dataFontCountNotSupported}); &AbstractFontTest::dataFontCountNotSupported});
addInstancedTests({&AbstractFontTest::openData}, addInstancedTests({&AbstractFontTest::openData},
Containers::arraySize(OpenData)); Containers::arraySize(OpenDataFileData));
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
addTests({&AbstractFontTest::openDataDeprecated, addTests({&AbstractFontTest::openDataDeprecated,
@ -271,7 +282,7 @@ AbstractFontTest::AbstractFontTest() {
#endif #endif
addInstancedTests({&AbstractFontTest::openFile}, addInstancedTests({&AbstractFontTest::openFile},
Containers::arraySize(OpenData)); Containers::arraySize(OpenDataFileData));
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
addTests({&AbstractFontTest::openFileDeprecated, addTests({&AbstractFontTest::openFileDeprecated,
@ -900,24 +911,25 @@ void AbstractFontTest::dataFontCountNotSupported() {
} }
void AbstractFontTest::openData() { void AbstractFontTest::openData() {
auto&& data = OpenData[testCaseInstanceId()]; auto&& data = OpenDataFileData[testCaseInstanceId()];
setTestCaseDescription(data.name); setTestCaseDescription(data.name);
struct: AbstractFont { struct: AbstractFont {
FontFeatures doFeatures() const override { return FontFeature::OpenData; } FontFeatures doFeatures() const override { return FontFeature::OpenData; }
bool doIsOpened() const override { return _opened; } bool doIsOpened() const override { return opened; }
void doClose() override { void doClose() override {
CORRADE_VERIFY(_opened); CORRADE_VERIFY(opened);
_opened = false; opened = false;
} }
void doOpenData(Containers::ArrayView<const char> data, Float size, UnsignedInt fontId) override { void doOpenData(Containers::ArrayView<const char> data, Float size, UnsignedInt fontId) override {
CORRADE_VERIFY(!opened);
CORRADE_COMPARE_AS(data, CORRADE_COMPARE_AS(data,
Containers::arrayView({'\xa5'}), Containers::arrayView({'\xa5'}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(size, 13.0f); CORRADE_COMPARE(size, 13.0f);
CORRADE_COMPARE(fontId, expectedFontId); CORRADE_COMPARE(fontId, expectedFontId);
_opened = true; opened = true;
} }
Properties doProperties() override { Properties doProperties() override {
@ -930,13 +942,12 @@ void AbstractFontTest::openData() {
Containers::Pointer<AbstractShaper> doCreateShaper() override { return {}; } Containers::Pointer<AbstractShaper> doCreateShaper() override { return {}; }
UnsignedInt expectedFontId; UnsignedInt expectedFontId;
bool opened;
private:
bool _opened = false;
} font; } font;
font.expectedFontId = data.fontId; font.expectedFontId = data.fontId;
font.opened = data.openedBefore;
CORRADE_COMPARE(font.isOpened(), data.openedBefore);
CORRADE_VERIFY(!font.isOpened());
const char a5[]{'\xa5'}; const char a5[]{'\xa5'};
/* Verify that even with font ID 0 it delegates to the non-deprecated /* Verify that even with font ID 0 it delegates to the non-deprecated
doOpenData() overload */ doOpenData() overload */
@ -1103,22 +1114,22 @@ void AbstractFontTest::openDataFailedDeprecated() {
#endif #endif
void AbstractFontTest::openFile() { void AbstractFontTest::openFile() {
auto&& data = OpenData[testCaseInstanceId()]; auto&& data = OpenDataFileData[testCaseInstanceId()];
setTestCaseDescription(data.name); setTestCaseDescription(data.name);
struct: AbstractFont { struct: AbstractFont {
FontFeatures doFeatures() const override { return {}; } FontFeatures doFeatures() const override { return {}; }
bool doIsOpened() const override { return _opened; } bool doIsOpened() const override { return opened; }
void doClose() override { void doClose() override {
CORRADE_VERIFY(_opened); CORRADE_VERIFY(opened);
_opened = false; opened = false;
} }
void doOpenFile(Containers::StringView filename, Float size, UnsignedInt fontId) override { void doOpenFile(Containers::StringView filename, Float size, UnsignedInt fontId) override {
CORRADE_COMPARE(filename, "hello.ttf"); CORRADE_COMPARE(filename, "hello.ttf");
CORRADE_COMPARE(size, 13.0f); CORRADE_COMPARE(size, 13.0f);
CORRADE_COMPARE(fontId, expectedFontId); CORRADE_COMPARE(fontId, expectedFontId);
_opened = true; opened = true;
} }
Properties doProperties() override { Properties doProperties() override {
@ -1131,13 +1142,12 @@ void AbstractFontTest::openFile() {
Containers::Pointer<AbstractShaper> doCreateShaper() override { return {}; } Containers::Pointer<AbstractShaper> doCreateShaper() override { return {}; }
UnsignedInt expectedFontId; UnsignedInt expectedFontId;
bool opened;
private:
bool _opened = false;
} font; } font;
font.expectedFontId = data.fontId; font.expectedFontId = data.fontId;
font.opened = data.openedBefore;
CORRADE_COMPARE(font.isOpened(), data.openedBefore);
CORRADE_VERIFY(!font.isOpened());
/* Verify that even with font ID 0 it delegates to the non-deprecated /* Verify that even with font ID 0 it delegates to the non-deprecated
doOpenFile() overload */ doOpenFile() overload */
/** @todo remove the instanced font ID once the deprecated APIs are gone, /** @todo remove the instanced font ID once the deprecated APIs are gone,

96
src/Magnum/Trade/Test/AbstractImporterTest.cpp

@ -395,10 +395,29 @@ struct AbstractImporterTest: TestSuite::Tester {
const struct { const struct {
const char* name; const char* name;
bool openMemory; bool openMemory;
bool openedBefore;
DataFlags expectedFlags; DataFlags expectedFlags;
} OpenDataMemoryData[]{ } OpenDataMemoryData[]{
{"open data", false, {}}, {"open data", false, false, {}},
{"open memory", true, DataFlag::ExternallyOwned}, {"open data, opened before", false, true, {}},
{"open memory", true, false, DataFlag::ExternallyOwned},
{"open memory, opened before", true, true, DataFlag::ExternallyOwned},
};
const struct {
const char* name;
bool openMemory;
} OpenDataMemoryFailedData[]{
{"open data", false},
{"open memory", true},
};
const struct {
const char* name;
bool openedBefore;
} OpenFileStateData[]{
{"", false},
{"opened before", true},
}; };
const struct { const struct {
@ -429,22 +448,29 @@ AbstractImporterTest::AbstractImporterTest() {
&AbstractImporterTest::setFlagsFileOpened, &AbstractImporterTest::setFlagsFileOpened,
&AbstractImporterTest::setFlagsNotImplemented}); &AbstractImporterTest::setFlagsNotImplemented});
addInstancedTests({&AbstractImporterTest::openDataMemory, addInstancedTests({&AbstractImporterTest::openDataMemory},
&AbstractImporterTest::openDataMemoryFailed},
Containers::arraySize(OpenDataMemoryData)); Containers::arraySize(OpenDataMemoryData));
addInstancedTests({&AbstractImporterTest::openDataMemoryFailed},
Containers::arraySize(OpenDataMemoryFailedData));
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
addTests({&AbstractImporterTest::openDataDeprecatedFallback, addTests({&AbstractImporterTest::openDataDeprecatedFallback,
&AbstractImporterTest::openDataDeprecatedFallbackFailed}); &AbstractImporterTest::openDataDeprecatedFallbackFailed});
#endif #endif
addTests({&AbstractImporterTest::openFile, addInstancedTests({&AbstractImporterTest::openFile},
&AbstractImporterTest::openFileFailed, Containers::arraySize(OpenFileStateData));
addTests({&AbstractImporterTest::openFileFailed,
&AbstractImporterTest::openFileAsData, &AbstractImporterTest::openFileAsData,
&AbstractImporterTest::openFileAsDataNotFound, &AbstractImporterTest::openFileAsDataNotFound,
&AbstractImporterTest::openFileAsDataFailed, &AbstractImporterTest::openFileAsDataFailed});
&AbstractImporterTest::openState,
&AbstractImporterTest::openStateFailed, addInstancedTests({&AbstractImporterTest::openState},
Containers::arraySize(OpenFileStateData));
addTests({&AbstractImporterTest::openStateFailed,
&AbstractImporterTest::openFileNotImplemented, &AbstractImporterTest::openFileNotImplemented,
&AbstractImporterTest::openDataNotSupported, &AbstractImporterTest::openDataNotSupported,
@ -903,30 +929,30 @@ void AbstractImporterTest::openDataMemory() {
struct: AbstractImporter { struct: AbstractImporter {
ImporterFeatures doFeatures() const override { return ImporterFeature::OpenData; } ImporterFeatures doFeatures() const override { return ImporterFeature::OpenData; }
bool doIsOpened() const override { return _opened; } bool doIsOpened() const override { return opened; }
void doClose() override { void doClose() override {
CORRADE_VERIFY(_opened); CORRADE_VERIFY(opened);
_opened = false; opened = false;
} }
void doOpenData(Containers::Array<char>&& data, DataFlags dataFlags) override { void doOpenData(Containers::Array<char>&& data, DataFlags dataFlags) override {
CORRADE_VERIFY(!opened);
CORRADE_COMPARE_AS(data, CORRADE_COMPARE_AS(data,
Containers::arrayView({'\xa5'}), Containers::arrayView({'\xa5'}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(dataFlags, expectedFlags); CORRADE_COMPARE(dataFlags, expectedFlags);
/* The array should have a custom no-op deleter */ /* The array should have a custom no-op deleter */
CORRADE_VERIFY(data.deleter()); CORRADE_VERIFY(data.deleter());
_opened = true; opened = true;
} }
DataFlags expectedFlags; DataFlags expectedFlags;
bool opened;
private:
bool _opened = false;
} importer; } importer;
importer.expectedFlags = data.expectedFlags; importer.expectedFlags = data.expectedFlags;
importer.opened = data.openedBefore;
CORRADE_COMPARE(importer.isOpened(), data.openedBefore);
CORRADE_VERIFY(!importer.isOpened());
const char a5 = '\xa5'; const char a5 = '\xa5';
if(data.openMemory) if(data.openMemory)
CORRADE_VERIFY(importer.openMemory({&a5, 1})); CORRADE_VERIFY(importer.openMemory({&a5, 1}));
@ -939,7 +965,7 @@ void AbstractImporterTest::openDataMemory() {
} }
void AbstractImporterTest::openDataMemoryFailed() { void AbstractImporterTest::openDataMemoryFailed() {
auto&& data = OpenDataMemoryData[testCaseInstanceId()]; auto&& data = OpenDataMemoryFailedData[testCaseInstanceId()];
setTestCaseDescription(data.name); setTestCaseDescription(data.name);
struct: AbstractImporter { struct: AbstractImporter {
@ -1023,23 +1049,28 @@ void AbstractImporterTest::openDataDeprecatedFallbackFailed() {
#endif #endif
void AbstractImporterTest::openFile() { void AbstractImporterTest::openFile() {
auto&& data = OpenFileStateData[testCaseInstanceId()];
setTestCaseDescription(data.name);
struct: AbstractImporter { struct: AbstractImporter {
ImporterFeatures doFeatures() const override { return {}; } ImporterFeatures doFeatures() const override { return {}; }
bool doIsOpened() const override { return _opened; } bool doIsOpened() const override { return opened; }
void doClose() override { void doClose() override {
CORRADE_VERIFY(_opened); CORRADE_VERIFY(opened);
_opened = false; opened = false;
} }
void doOpenFile(Containers::StringView filename) override { void doOpenFile(Containers::StringView filename) override {
CORRADE_VERIFY(!opened);
CORRADE_COMPARE(filename, "yello.foo"); CORRADE_COMPARE(filename, "yello.foo");
_opened = true; opened = true;
} }
bool _opened = false; bool opened;
} importer; } importer;
importer.opened = data.openedBefore;
CORRADE_COMPARE(importer.isOpened(), data.openedBefore);
CORRADE_VERIFY(!importer.isOpened());
CORRADE_VERIFY(importer.openFile("yello.foo")); CORRADE_VERIFY(importer.openFile("yello.foo"));
CORRADE_VERIFY(importer.isOpened()); CORRADE_VERIFY(importer.isOpened());
@ -1148,26 +1179,31 @@ void AbstractImporterTest::openFileAsDataFailed() {
} }
void AbstractImporterTest::openState() { void AbstractImporterTest::openState() {
auto&& data = OpenFileStateData[testCaseInstanceId()];
setTestCaseDescription(data.name);
struct: AbstractImporter { struct: AbstractImporter {
ImporterFeatures doFeatures() const override { ImporterFeatures doFeatures() const override {
return ImporterFeature::OpenState; return ImporterFeature::OpenState;
} }
bool doIsOpened() const override { return _opened; } bool doIsOpened() const override { return opened; }
void doClose() override { void doClose() override {
CORRADE_VERIFY(_opened); CORRADE_VERIFY(opened);
_opened = false; opened = false;
} }
void doOpenState(const void* state, Containers::StringView filePath) override { void doOpenState(const void* state, Containers::StringView filePath) override {
CORRADE_VERIFY(!opened);
CORRADE_COMPARE(state, reinterpret_cast<const void*>(std::size_t{0xbadcafe})); CORRADE_COMPARE(state, reinterpret_cast<const void*>(std::size_t{0xbadcafe}));
CORRADE_COMPARE(filePath, "yello/foo/"); CORRADE_COMPARE(filePath, "yello/foo/");
_opened = true; opened = true;
} }
bool _opened = false; bool opened;
} importer; } importer;
importer.opened = data.openedBefore;
CORRADE_COMPARE(importer.isOpened(), data.openedBefore);
CORRADE_VERIFY(!importer.isOpened());
CORRADE_VERIFY(importer.openState(reinterpret_cast<const void*>(std::size_t{0xbadcafe}), "yello/foo/")); CORRADE_VERIFY(importer.openState(reinterpret_cast<const void*>(std::size_t{0xbadcafe}), "yello/foo/"));
CORRADE_VERIFY(importer.isOpened()); CORRADE_VERIFY(importer.isOpened());

Loading…
Cancel
Save