mirror of
https://github.com/google/styleguide.git
synced 2024-03-22 13:11:43 +08:00
Add a unit test to test indentation in Emacs.
Right now this just uses the snippets from the styleguide.
This commit is contained in:
parent
af78b49ac4
commit
eaa4cabb4c
207
google-c-style-resources/golden.cc
Normal file
207
google-c-style-resources/golden.cc
Normal file
|
@ -0,0 +1,207 @@
|
|||
// Copyright 2022 Google LLC
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// https://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.
|
||||
|
||||
// Golden file to test indentation. The commented-out snippets aren't correct
|
||||
// yet.
|
||||
|
||||
ReturnType ClassName::FunctionName(Type par_name1, Type par_name2) {
|
||||
DoSomething();
|
||||
// ...
|
||||
}
|
||||
|
||||
ReturnType ClassName::ReallyLongFunctionName(Type par_name1, Type par_name2,
|
||||
Type par_name3) {
|
||||
DoSomething();
|
||||
// ...
|
||||
}
|
||||
|
||||
ReturnType LongClassName::ReallyReallyReallyLongFunctionName(
|
||||
Type par_name1, // 4 space indent
|
||||
Type par_name2,
|
||||
Type par_name3) {
|
||||
DoSomething(); // 2 space indent
|
||||
// ...
|
||||
}
|
||||
|
||||
class Foo {
|
||||
public:
|
||||
Foo(const Foo&) = delete;
|
||||
Foo& operator=(const Foo&) = delete;
|
||||
};
|
||||
|
||||
class Shape {
|
||||
public:
|
||||
virtual void Rotate(double radians) = 0;
|
||||
};
|
||||
|
||||
class Circle : public Shape {
|
||||
public:
|
||||
void Rotate(double radians) override;
|
||||
};
|
||||
|
||||
void Function() {
|
||||
// std::set<int> to_remove = {7, 8, 9};
|
||||
// std::vector<int> digits = {3, 9, 1, 8, 4, 7, 1};
|
||||
// digits.erase(std::remove_if(digits.begin(), digits.end(), [&to_remove](int i) {
|
||||
// return to_remove.find(i) != to_remove.end();
|
||||
// }),
|
||||
// digits.end());
|
||||
|
||||
bool result = DoSomething(averyveryveryverylongargument1,
|
||||
argument2, argument3);
|
||||
|
||||
if (...) {
|
||||
// ...
|
||||
// ...
|
||||
if (...) {
|
||||
bool result = DoSomething(
|
||||
argument1, argument2, // 4 space indent
|
||||
argument3, argument4);
|
||||
// ...
|
||||
}
|
||||
}
|
||||
|
||||
// When you have to wrap.
|
||||
SomeFunction(
|
||||
{"assume a zero-length name before {"},
|
||||
some_other_function_parameter);
|
||||
// SomeType variable{
|
||||
// some, other, values,
|
||||
// {"assume a zero-length name before {"},
|
||||
// SomeOtherType{
|
||||
// "Very long string requiring the surrounding breaks.",
|
||||
// some, other, values},
|
||||
// SomeOtherType{"Slightly shorter string",
|
||||
// some, other, values}};
|
||||
// SomeType variable{
|
||||
// "This is too long to fit all in one line"};
|
||||
// MyType m = { // Here, you could also break before {.
|
||||
// superlongvariablename1,
|
||||
// superlongvariablename2,
|
||||
// {short, interior, list},
|
||||
// {interiorwrappinglist,
|
||||
// interiorwrappinglist2}};
|
||||
|
||||
if (condition) { // no spaces inside parentheses, space before brace
|
||||
DoOneThing(); // two space indent
|
||||
DoAnotherThing();
|
||||
} else if (int a = f(); a != 3) { // closing brace on new line, else on same line
|
||||
DoAThirdThing(a);
|
||||
} else {
|
||||
DoNothing();
|
||||
}
|
||||
|
||||
if (x == kBar)
|
||||
return new Bar(arg1, arg2, arg3);
|
||||
|
||||
switch (var) {
|
||||
case 0: { // 2 space indent
|
||||
// ... // 4 space indent
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
// ...
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < kSomeNumber; ++i)
|
||||
printf("I love you\n");
|
||||
|
||||
for (int i = 0; i < kSomeNumber; ++i) {
|
||||
printf("I take it back\n");
|
||||
}
|
||||
|
||||
while (condition) {
|
||||
// Repeat test until it returns false.
|
||||
}
|
||||
|
||||
if (this_one_thing > this_other_thing &&
|
||||
a_third_thing == a_fourth_thing &&
|
||||
yet_another && last_one) {
|
||||
// ...
|
||||
}
|
||||
|
||||
return result; // No parentheses in the simple case.
|
||||
// Parentheses OK to make a complex expression more readable.
|
||||
return (some_long_condition &&
|
||||
another_condition);
|
||||
|
||||
// Good - directives at beginning of line
|
||||
if (lopsided_score) {
|
||||
#if DISASTER_PENDING // Correct -- Starts at beginning of line
|
||||
DropEverything();
|
||||
# if NOTIFY // OK but not required -- Spaces after #
|
||||
NotifyClient();
|
||||
# endif
|
||||
#endif
|
||||
BackToNormal();
|
||||
}
|
||||
}
|
||||
|
||||
class MyClass : public OtherClass {
|
||||
public: // Note the 1 space indent!
|
||||
MyClass(); // Regular 2 space indent.
|
||||
explicit MyClass(int var);
|
||||
~MyClass() {}
|
||||
|
||||
void SomeFunction();
|
||||
void SomeFunctionThatDoesNothing() {
|
||||
}
|
||||
|
||||
void set_some_var(int var) { some_var_ = var; }
|
||||
int some_var() const { return some_var_; }
|
||||
|
||||
private:
|
||||
bool SomeInternalFunction();
|
||||
|
||||
int some_var_;
|
||||
int some_other_var_;
|
||||
};
|
||||
|
||||
// When everything fits on one line:
|
||||
MyClass::MyClass(int var) : some_var_(var) {
|
||||
DoSomething();
|
||||
}
|
||||
|
||||
// If the signature and initializer list are not all on one line,
|
||||
// you must wrap before the colon and indent 4 spaces:
|
||||
MyClass::MyClass(int var)
|
||||
: some_var_(var), some_other_var_(var + 1) {
|
||||
DoSomething();
|
||||
}
|
||||
|
||||
// When the list spans multiple lines, put each member on its own line
|
||||
// and align them:
|
||||
MyClass::MyClass(int var)
|
||||
: some_var_(var), // 4 space indent
|
||||
some_other_var_(var + 1) { // lined up
|
||||
DoSomething();
|
||||
}
|
||||
|
||||
// As with any other code block, the close curly can be on the same
|
||||
// line as the open curly, if it fits.
|
||||
MyClass::MyClass(int var)
|
||||
: some_var_(var) {}
|
||||
|
||||
namespace {
|
||||
|
||||
void foo() { // Correct. No extra indentation within namespace.
|
||||
// ...
|
||||
}
|
||||
|
||||
} // namespace
|
37
google-c-style-test.el
Normal file
37
google-c-style-test.el
Normal file
|
@ -0,0 +1,37 @@
|
|||
;;; google-c-style-test.el --- unit tests for google-c-style.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright 2022 Google LLC
|
||||
;;
|
||||
;; 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
|
||||
;;
|
||||
;; https://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.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Unit tests for ‘google-c-style.el’.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'google-c-style)
|
||||
|
||||
(require 'cc-mode)
|
||||
(require 'ert)
|
||||
(require 'ert-x)
|
||||
|
||||
(ert-deftest google-c-style-test/indent ()
|
||||
"Check that a golden file remains unchanged."
|
||||
(ert-with-test-buffer (:name "golden")
|
||||
(insert-file-contents (ert-resource-file "golden.cc"))
|
||||
(c++-mode)
|
||||
(google-set-c-style)
|
||||
(should (equal (buffer-string) (ert-buffer-string-reindented)))))
|
||||
|
||||
;;; google-c-style-test.el ends here
|
Loading…
Reference in New Issue
Block a user