111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright 2008 Google Inc. 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// All Rights Reserved. 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Redistribution and use in source and binary forms, with or without 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// modification, are permitted provided that the following conditions are 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// met: 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Redistributions of source code must retain the above copyright 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// notice, this list of conditions and the following disclaimer. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Redistributions in binary form must reproduce the above 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// copyright notice, this list of conditions and the following disclaimer 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// in the documentation and/or other materials provided with the 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// distribution. 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// * Neither the name of Google Inc. nor the names of its 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// contributors may be used to endorse or promote products derived from 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// this software without specific prior written permission. 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Author: vladl@google.com (Vlad Losev) 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This sample shows how to test common properties of multiple 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// implementations of an interface (aka interface tests) using 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// value-parameterized tests. Each test in the test case has 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a parameter that is an interface pointer to an implementation 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// tested. 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The interface and its implementations are in this header. 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "prime_tables.h" 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "gtest/gtest.h" 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if GTEST_HAS_PARAM_TEST 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertusing ::testing::TestWithParam; 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertusing ::testing::Values; 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// As a general rule, to prevent a test from affecting the tests that come 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// after it, you should create and destroy the tested objects for each test 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// instead of reusing them. In this sample we will define a simple factory 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// function for PrimeTable objects. We will instantiate objects in test's 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// SetUp() method and delete them in TearDown() method. 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef PrimeTable* CreatePrimeTableFunc(); 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertPrimeTable* CreateOnTheFlyPrimeTable() { 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return new OnTheFlyPrimeTable(); 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <size_t max_precalculated> 6011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertPrimeTable* CreatePreCalculatedPrimeTable() { 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return new PreCalculatedPrimeTable(max_precalculated); 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Inside the test body, fixture constructor, SetUp(), and TearDown() you 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// can refer to the test parameter by GetParam(). In this case, the test 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// parameter is a factory function which we call in fixture's SetUp() to 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// create and store an instance of PrimeTable. 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass PrimeTableTest : public TestWithParam<CreatePrimeTableFunc*> { 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual ~PrimeTableTest() { delete table_; } 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual void SetUp() { table_ = (*GetParam())(); } 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual void TearDown() { 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert delete table_; 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert table_ = NULL; 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert PrimeTable* table_; 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8111cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) { 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_FALSE(table_->IsPrime(-5)); 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_FALSE(table_->IsPrime(0)); 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_FALSE(table_->IsPrime(1)); 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_FALSE(table_->IsPrime(4)); 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_FALSE(table_->IsPrime(6)); 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_FALSE(table_->IsPrime(100)); 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_P(PrimeTableTest, ReturnsTrueForPrimes) { 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_TRUE(table_->IsPrime(2)); 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_TRUE(table_->IsPrime(3)); 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_TRUE(table_->IsPrime(5)); 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_TRUE(table_->IsPrime(7)); 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_TRUE(table_->IsPrime(11)); 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_TRUE(table_->IsPrime(131)); 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9911cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST_P(PrimeTableTest, CanGetNextPrime) { 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(2, table_->GetNextPrime(0)); 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(3, table_->GetNextPrime(2)); 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(5, table_->GetNextPrime(3)); 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(7, table_->GetNextPrime(5)); 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(11, table_->GetNextPrime(7)); 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert EXPECT_EQ(131, table_->GetNextPrime(128)); 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// In order to run value-parameterized tests, you need to instantiate them, 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// or bind them to a list of values which will be used as test parameters. 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You can instantiate them in a different translation module, or even 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// instantiate them several times. 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Here, we instantiate our tests with a list of two PrimeTable object 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// factory functions: 11511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINSTANTIATE_TEST_CASE_P( 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert OnTheFlyAndPreCalculated, 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert PrimeTableTest, 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>)); 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Google Test may not support value-parameterized tests with some 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// compilers. If we use conditional compilation to compile out all 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// code referring to the gtest_main library, MSVC linker will not link 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// that library at all and consequently complain about missing entry 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// point defined in that library (fatal error LNK1561: entry point 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// must be defined). This dummy test keeps gtest_main linked in. 12811cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertTEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {} 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // GTEST_HAS_PARAM_TEST 131