36#include "gtest/gtest.h"
48 HybridPrimeTable(
bool force_on_the_fly,
int max_precalculated)
50 precalc_impl_(force_on_the_fly
53 max_precalculated_(max_precalculated) {}
54 ~HybridPrimeTable()
override {
55 delete on_the_fly_impl_;
59 bool IsPrime(
int n)
const override {
60 if (precalc_impl_ !=
nullptr && n < max_precalculated_)
61 return precalc_impl_->IsPrime(n);
63 return on_the_fly_impl_->IsPrime(n);
66 int GetNextPrime(
int p)
const override {
68 if (precalc_impl_ !=
nullptr && p < max_precalculated_)
69 next_prime = precalc_impl_->GetNextPrime(p);
71 return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);
77 int max_precalculated_;
81using ::testing::Combine;
82using ::testing::TestWithParam;
83using ::testing::Values;
90class PrimeTableTest :
public TestWithParam< ::std::tuple<bool, int> > {
92 void SetUp()
override {
93 bool force_on_the_fly;
94 int max_precalculated;
95 std::tie(force_on_the_fly, max_precalculated) = GetParam();
96 table_ =
new HybridPrimeTable(force_on_the_fly, max_precalculated);
98 void TearDown()
override {
102 HybridPrimeTable* table_;
105TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
112 EXPECT_FALSE(table_->IsPrime(-5));
113 EXPECT_FALSE(table_->IsPrime(0));
114 EXPECT_FALSE(table_->IsPrime(1));
115 EXPECT_FALSE(table_->IsPrime(4));
116 EXPECT_FALSE(table_->IsPrime(6));
117 EXPECT_FALSE(table_->IsPrime(100));
120TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
121 EXPECT_TRUE(table_->IsPrime(2));
122 EXPECT_TRUE(table_->IsPrime(3));
123 EXPECT_TRUE(table_->IsPrime(5));
124 EXPECT_TRUE(table_->IsPrime(7));
125 EXPECT_TRUE(table_->IsPrime(11));
126 EXPECT_TRUE(table_->IsPrime(131));
129TEST_P(PrimeTableTest, CanGetNextPrime) {
130 EXPECT_EQ(2, table_->GetNextPrime(0));
131 EXPECT_EQ(3, table_->GetNextPrime(2));
132 EXPECT_EQ(5, table_->GetNextPrime(3));
133 EXPECT_EQ(7, table_->GetNextPrime(5));
134 EXPECT_EQ(11, table_->GetNextPrime(7));
135 EXPECT_EQ(131, table_->GetNextPrime(128));
149INSTANTIATE_TEST_SUITE_P(MeaningfulTestParameters, PrimeTableTest,
150 Combine(Bool(), Values(1, 10)));