blob: 42d240f333674ce43298b7aba6cb183894365cd8 [file] [log] [blame]
// Copyright 2011 Google Inc.
//
// 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.
//
// Author: jmarantz@google.com (Joshua Marantz)
#include "pagespeed/kernel/base/function.h"
#include "pagespeed/kernel/base/gtest.h"
namespace {
const char kCharData = 'x';
const int kIntData = 42;
const double kDoubleData = 5.5;
const bool kBoolData = true;
} // namespace
namespace net_instaweb {
class FunctionTest : public testing::Test {
public:
FunctionTest() {
Clear();
}
void Clear() {
char_ = '\0';
int_ = 0;
double_ = 0.0;
bool_ = false;
was_run_ = false;
was_cancelled_ = false;
}
void Run0() {
was_run_ = true;
}
void Run1(char c) {
char_ = c;
was_run_ = true;
}
void Run2(char c, int i) {
char_ = c;
int_ = i;
was_run_ = true;
}
void Run3(char c, int i, double d) {
char_ = c;
int_ = i;
double_ = d;
was_run_ = true;
}
void Run4(char c, int i, double d, bool b) {
char_ = c;
int_ = i;
double_ = d;
bool_ = b;
was_run_ = true;
}
void Cancel0() {
was_cancelled_ = true;
}
void Cancel1(char c) {
was_cancelled_ = true;
}
void Cancel2(char c, int i) {
was_cancelled_ = true;
}
void Cancel3(char c, int i, double d) {
was_cancelled_ = true;
}
void Cancel4(char c, int i, double d, bool b) {
was_cancelled_ = true;
}
bool Matches(char c, int i, double d, bool b) const {
return ((c == char_) && (i == int_) && (d == double_) && (b == bool_));
}
protected:
char char_;
int int_;
double double_;
bool bool_;
bool was_run_;
bool was_cancelled_;
};
TEST_F(FunctionTest, Run0NoCancel) {
FunctionTest* function_test = this;
Function* f = MakeFunction(function_test, &FunctionTest::Run0);
f->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches('\0', 0, 0.0, false));
}
TEST_F(FunctionTest, Run0NoCancelNoAutoDelete) {
FunctionTest* function_test = this;
Function* f = MakeFunction(function_test, &FunctionTest::Run0);
f->set_delete_after_callback(false);
f->CallRun();
delete f;
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches('\0', 0, 0.0, false));
}
TEST_F(FunctionTest, Run0WithCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run0,
&FunctionTest::Cancel0)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches('\0', 0, 0.0, false));
Clear();
MakeFunction(function_test, &FunctionTest::Run0,
&FunctionTest::Cancel0)->CallCancel();
EXPECT_FALSE(was_run_);
EXPECT_TRUE(was_cancelled_);
EXPECT_TRUE(Matches('\0', 0, 0.0, false));
}
TEST_F(FunctionTest, Run1NoCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run1,
kCharData)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches(kCharData, 0, 0.0, false));
}
TEST_F(FunctionTest, Run1WithCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run1, &FunctionTest::Cancel1,
kCharData)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches(kCharData, 0, 0.0, false));
Clear();
MakeFunction(function_test, &FunctionTest::Run1, &FunctionTest::Cancel1,
kCharData)->CallCancel();
EXPECT_FALSE(was_run_);
EXPECT_TRUE(was_cancelled_);
EXPECT_TRUE(Matches('\0', 0, 0.0, false));
}
TEST_F(FunctionTest, Run2NoCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run2,
kCharData, kIntData)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches(kCharData, kIntData, 0.0, false));
}
TEST_F(FunctionTest, Run2WithCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run2, &FunctionTest::Cancel2,
kCharData, kIntData)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches(kCharData, kIntData, 0.0, false));
Clear();
MakeFunction(function_test, &FunctionTest::Run2, &FunctionTest::Cancel2,
kCharData, kIntData)->CallCancel();
EXPECT_FALSE(was_run_);
EXPECT_TRUE(was_cancelled_);
EXPECT_TRUE(Matches('\0', 0, 0.0, false));
}
TEST_F(FunctionTest, Run3NoCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run3,
kCharData, kIntData, kDoubleData)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches(kCharData, kIntData, kDoubleData, false));
}
TEST_F(FunctionTest, Run3WithCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run3, &FunctionTest::Cancel3,
kCharData, kIntData, kDoubleData)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches(kCharData, kIntData, kDoubleData, false));
Clear();
MakeFunction(function_test, &FunctionTest::Run3, &FunctionTest::Cancel3,
kCharData, kIntData, kDoubleData)->CallCancel();
EXPECT_FALSE(was_run_);
EXPECT_TRUE(was_cancelled_);
EXPECT_TRUE(Matches('\0', 0, 0.0, false));
}
TEST_F(FunctionTest, Run4NoCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run4,
kCharData, kIntData, kDoubleData, kBoolData)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches(kCharData, kIntData, kDoubleData, kBoolData));
}
TEST_F(FunctionTest, Run4WithCancel) {
FunctionTest* function_test = this;
MakeFunction(function_test, &FunctionTest::Run4, &FunctionTest::Cancel4,
kCharData, kIntData, kDoubleData, kBoolData)->CallRun();
EXPECT_TRUE(was_run_);
EXPECT_FALSE(was_cancelled_);
EXPECT_TRUE(Matches(kCharData, kIntData, kDoubleData, kBoolData));
Clear();
MakeFunction(function_test, &FunctionTest::Run4, &FunctionTest::Cancel4,
kCharData, kIntData, kDoubleData, kBoolData)->CallCancel();
EXPECT_FALSE(was_run_);
EXPECT_TRUE(was_cancelled_);
EXPECT_TRUE(Matches('\0', 0, 0.0, false));
}
} // namespace net_instaweb