CMake/Tests/RunCMake/GenerateExportHeader/exportheader_test.cpp
Matthew Woehlke 612d6f29f8 Tests: Refactor GenerateExportHeader test code
Refactor the library code used in the GenerateExportHeader test to use
an improved naming convention that more directly identifies what it
being tested, making use of namespaces to avoid possible symbol
collisions. This also eliminates duplicate cases such as `libshared()`
and `libshared_not_exported()` which had the same decoration, and adds
consistent pairings of <name>_EXPORT and <name>_DEPRECATED_EXPORT which
were missing previously. The data tests from the previous commit are
also added to `libstatic` and `libshared_and_static` for consistency.

Note that there are no exported members of exported classes, as these
are not allowed on Windows.
2016-09-12 10:29:20 -04:00

170 lines
4.2 KiB
C++

#include "libshared.h"
#include "libstatic.h"
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <string>
void compare(const char* refName, const char* testName)
{
std::ifstream ref;
ref.open(refName);
if (!ref.is_open()) {
std::cout << "Could not open \"" << refName << "\"." << std::endl;
exit(1);
}
std::ifstream test;
test.open(testName);
if (!test.is_open()) {
std::cout << "Could not open \"" << testName << "\"." << std::endl;
exit(1);
}
while (!ref.eof() && !test.eof()) {
std::string refLine;
std::string testLine;
std::getline(ref, refLine);
std::getline(test, testLine);
// Some very old Borland runtimes (C++ Builder 5 WITHOUT Update 1) add a
// trailing null to the string that we need to strip before testing for a
// trailing space.
if (refLine.size() && refLine[refLine.size() - 1] == 0) {
refLine = refLine.substr(0, refLine.size() - 1);
}
if (testLine.size() && testLine[testLine.size() - 1] == 0) {
testLine = testLine.substr(0, testLine.size() - 1);
}
// The reference files never have trailing spaces:
if (testLine.size() && testLine[testLine.size() - 1] == ' ') {
testLine = testLine.substr(0, testLine.size() - 1);
}
if (refLine != testLine) {
std::cout << "Ref and test are not the same:\n Ref: \"" << refLine
<< "\"\n Test: \"" << testLine << "\"\n";
exit(1);
}
}
if (!ref.eof() || !test.eof()) {
std::cout << "Ref and test have differing numbers of lines.";
exit(1);
}
}
int main()
{
{
libshared::Class l;
// l.method(); LINK ERROR
l.method_exported();
// l.method_deprecated(); LINK ERROR
l.method_deprecated_exported();
// l.method_excluded(); LINK ERROR
// use_int(l.data); LINK ERROR
use_int(l.data_exported);
// use_int(l.data_excluded); LINK ERROR
}
{
libshared::ExportedClass l;
l.method();
l.method_deprecated();
#if defined(_WIN32) || defined(__CYGWIN__)
l.method_excluded();
#else
// l.method_excluded(); LINK ERROR (NOT WIN32 AND NOT CYGWIN)
#endif
use_int(l.data);
#if defined(_WIN32) || defined(__CYGWIN__)
use_int(l.data_excluded);
#else
// use_int(l.data_excluded); LINK ERROR (NOT WIN32 AND NOT CYGWIN)
#endif
}
{
libshared::ExcludedClass l;
// l.method(); LINK ERROR
l.method_exported();
// l.method_deprecated(); LINK ERROR
l.method_deprecated_exported();
// l.method_excluded(); LINK ERROR
// use_int(l.data); LINK ERROR
use_int(l.data_exported);
// use_int(l.data_excluded); LINK ERROR
}
// libshared::function(); LINK ERROR
libshared::function_exported();
// libshared::function_deprecated(); LINK ERROR
libshared::function_deprecated_exported();
// libshared::function_excluded(); LINK ERROR
// use_int(libshared::data); LINK ERROR
use_int(libshared::data_exported);
// use_int(libshared::data_excluded); LINK ERROR
{
libstatic::Class l;
l.method();
l.method_exported();
l.method_deprecated();
l.method_deprecated_exported();
l.method_excluded();
use_int(l.data);
use_int(l.data_exported);
use_int(l.data_excluded);
}
{
libstatic::ExportedClass l;
l.method();
l.method_exported();
l.method_deprecated();
l.method_deprecated_exported();
l.method_excluded();
use_int(l.data);
use_int(l.data_exported);
use_int(l.data_excluded);
}
{
libstatic::ExcludedClass l;
l.method();
l.method_exported();
l.method_deprecated();
l.method_deprecated_exported();
l.method_excluded();
use_int(l.data);
use_int(l.data_exported);
use_int(l.data_excluded);
}
libstatic::function();
libstatic::function_exported();
libstatic::function_deprecated();
libstatic::function_deprecated_exported();
libstatic::function_excluded();
use_int(libstatic::data);
use_int(libstatic::data_exported);
use_int(libstatic::data_excluded);
#if defined(SRC_DIR) && defined(BIN_DIR)
compare(SRC_DIR "/libshared_export.h",
BIN_DIR "/libshared/libshared_export.h");
compare(SRC_DIR "/libstatic_export.h",
BIN_DIR "/libstatic/libstatic_export.h");
#endif
return 0;
}