blob: 3c024b1ed7efd6f0953231af83324401cd95c3fd [file] [log] [blame]
Daniel Jasperd07c8402013-07-29 08:19:24 +00001#include "ClangTidyTest.h"
Daniel Jasperd07c8402013-07-29 08:19:24 +00002#include "google/GoogleTidyModule.h"
Alexander Kornienko09887162014-02-27 14:28:02 +00003#include "gtest/gtest.h"
Daniel Jasperd07c8402013-07-29 08:19:24 +00004
5namespace clang {
6namespace tidy {
Alexander Kornienko09887162014-02-27 14:28:02 +00007namespace test {
Daniel Jasperd07c8402013-07-29 08:19:24 +00008
Alexander Kornienko09887162014-02-27 14:28:02 +00009#define EXPECT_NO_CHANGES(Check, Code) \
10 EXPECT_EQ(Code, runCheckOnCode<Check>(Code))
Daniel Jasperd07c8402013-07-29 08:19:24 +000011
Alexander Kornienko09887162014-02-27 14:28:02 +000012TEST(ExplicitConstructorCheckTest, SingleArgumentConstructorsOnly) {
13 EXPECT_NO_CHANGES(ExplicitConstructorCheck, "class C { C(); };");
14 EXPECT_NO_CHANGES(ExplicitConstructorCheck, "class C { C(int i, int j); };");
Alexander Kornienkof65a5492014-03-20 09:39:36 +000015 EXPECT_NO_CHANGES(ExplicitConstructorCheck, "class C { C(const C&); };");
16 EXPECT_NO_CHANGES(ExplicitConstructorCheck, "class C { C(C&&); };");
Alexander Kornienkof9a7b462014-03-19 12:48:22 +000017 EXPECT_NO_CHANGES(ExplicitConstructorCheck,
18 "class C { C(const C&) = delete; };");
Alexander Kornienkof65a5492014-03-20 09:39:36 +000019 EXPECT_NO_CHANGES(ExplicitConstructorCheck,
20 "class C { C(int) = delete; };");
Daniel Jasperd07c8402013-07-29 08:19:24 +000021}
22
Alexander Kornienko09887162014-02-27 14:28:02 +000023TEST(ExplicitConstructorCheckTest, Basic) {
Daniel Jasperd07c8402013-07-29 08:19:24 +000024 EXPECT_EQ("class C { explicit C(int i); };",
Alexander Kornienko09887162014-02-27 14:28:02 +000025 runCheckOnCode<ExplicitConstructorCheck>("class C { C(int i); };"));
Daniel Jasperd07c8402013-07-29 08:19:24 +000026}
27
Alexander Kornienko09887162014-02-27 14:28:02 +000028TEST(ExplicitConstructorCheckTest, DefaultParameters) {
Daniel Jasperd07c8402013-07-29 08:19:24 +000029 EXPECT_EQ("class C { explicit C(int i, int j = 0); };",
Alexander Kornienko09887162014-02-27 14:28:02 +000030 runCheckOnCode<ExplicitConstructorCheck>(
31 "class C { C(int i, int j = 0); };"));
Daniel Jasperd07c8402013-07-29 08:19:24 +000032}
33
Alexander Kornienko09887162014-02-27 14:28:02 +000034TEST(ExplicitConstructorCheckTest, OutOfLineDefinitions) {
Alexander Kornienko32eaa372014-02-13 10:11:48 +000035 EXPECT_EQ("class C { explicit C(int i); }; C::C(int i) {}",
Alexander Kornienko09887162014-02-27 14:28:02 +000036 runCheckOnCode<ExplicitConstructorCheck>(
37 "class C { C(int i); }; C::C(int i) {}"));
Alexander Kornienko32eaa372014-02-13 10:11:48 +000038}
39
Alexander Kornienko014225e2014-04-29 15:07:08 +000040TEST(ExplicitConstructorCheckTest, RemoveExplicit) {
41 EXPECT_EQ("class A { A(const A&); };\n"
42 "class B { /*asdf*/ B(const B&); };\n"
43 "class C { /*asdf*/ C(const C&); };",
44 runCheckOnCode<ExplicitConstructorCheck>(
45 "class A { explicit A(const A&); };\n"
46 "class B { explicit /*asdf*/ B(const B&); };\n"
47 "class C { explicit/*asdf*/ C(const C&); };"));
48}
49
Alexander Kornienko09887162014-02-27 14:28:02 +000050} // namespace test
Daniel Jasperd07c8402013-07-29 08:19:24 +000051} // namespace tidy
52} // namespace clang