Program Listing for File testing-entrypoint.h

Return to documentation for file (common/maplab-common/include/maplab-common/test/testing-entrypoint.h)

/*
* Copyright (C) 2014 Simon Lynen, ASL, ETH Zurich, Switzerland
* You can contact the author at <slynen at ethz dot ch>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* NOTICE:
* The abstraction of the entry point into class and base class has been done by
* Titus Cieslewski,
* ASL, ETH Zurich, Switzerland in 2015.
*/
#ifndef MAPLAB_COMMON_TESTING_ENTRYPOINT_H_
#define MAPLAB_COMMON_TESTING_ENTRYPOINT_H_

#include <gflags/gflags.h>
#include <glog/logging.h>
#include <gtest/gtest.h>

// Let the Eclipse parser see the macro.
#ifndef TEST
#define TEST(a, b) int Test_##a##_##b()
#endif

#ifndef TEST_F
#define TEST_F(a, b) int Test_##a##_##b()
#endif

#ifndef TEST_P
#define TEST_P(a, b) int Test_##a##_##b()
#endif

#ifndef TYPED_TEST
#define TYPED_TEST(a, b) int Test_##a##_##b()
#endif

#ifndef TYPED_TEST_P
#define TYPED_TEST_P(a, b) int Test_##a##_##b()
#endif

#ifndef TYPED_TEST_CASE
#define TYPED_TEST_CASE(a, b) int Test_##a##_##b()
#endif

#ifndef REGISTER_TYPED_TEST_CASE_P
#define REGISTER_TYPED_TEST_CASE_P(a, ...) int Test_##a()
#endif

#ifndef INSTANTIATE_TYPED_TEST_CASE_P
#define INSTANTIATE_TYPED_TEST_CASE_P(a, ...) int Test_##a()
#endif

namespace common {

class UnitTestEntryPointBase {
 public:
  virtual ~UnitTestEntryPointBase();
  // This function must be inline to avoid linker errors.
  inline int run(int argc, char** argv) {
    google::InitGoogleLogging(argv[0]);
    google::InstallFailureSignalHandler();
    testing::InitGoogleTest(&argc, argv);
    google::ParseCommandLineFlags(&argc, &argv, true);
    ::testing::FLAGS_gtest_death_test_style = "threadsafe";
    FLAGS_alsologtostderr = true;
    FLAGS_colorlogtostderr = true;
    FLAGS_v = 1;
    customInit();
    return RUN_ALL_TESTS();
  }

 private:
  virtual void customInit() = 0;
};

class UnitTestEntryPoint : public UnitTestEntryPointBase {
 public:
  virtual ~UnitTestEntryPoint();

 private:
  virtual void customInit();
};

}  // namespace common

#define MAPLAB_UNITTEST_ENTRYPOINT          \
  int main(int argc, char** argv) {         \
    common::UnitTestEntryPoint entry_point; \
    return entry_point.run(argc, argv);     \
  }

#endif  // MAPLAB_COMMON_TESTING_ENTRYPOINT_H_