| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:io' as io; |
| |
| import 'package:litetest/litetest.dart'; |
| import 'package:path/path.dart' as path; |
| |
| import '../bin/format.dart' as target; |
| |
| final io.File script = io.File.fromUri(io.Platform.script).absolute; |
| final io.Directory repoDir = script.parent.parent.parent; |
| |
| class FileContentPair { |
| FileContentPair(this.original, this.formatted); |
| |
| final String original; |
| final String formatted; |
| } |
| |
| final FileContentPair ccContentPair = FileContentPair( |
| 'int main(){return 0;}\n', 'int main() {\n return 0;\n}\n'); |
| final FileContentPair hContentPair = |
| FileContentPair('int\nmain\n()\n;\n', 'int main();\n'); |
| final FileContentPair gnContentPair = FileContentPair( |
| 'test\n(){testvar=true}\n', 'test() {\n testvar = true\n}\n'); |
| final FileContentPair javaContentPair = FileContentPair( |
| 'class Test{public static void main(String args[]){System.out.println("Test");}}\n', |
| 'class Test {\n public static void main(String args[]) {\n System.out.println("Test");\n }\n}\n'); |
| final FileContentPair pythonContentPair = FileContentPair( |
| "if __name__=='__main__':\n sys.exit(\nMain(sys.argv)\n)\n", |
| "if __name__ == '__main__':\n sys.exit(Main(sys.argv))\n"); |
| final FileContentPair whitespaceContentPair = FileContentPair( |
| 'int main() {\n return 0; \n}\n', |
| 'int main() {\n return 0;\n}\n'); |
| final FileContentPair headerContentPair = FileContentPair( |
| <String>[ |
| '#ifndef FOO_H_', |
| '#define FOO_H_', |
| '', |
| '#endif // FOO_H_', |
| ].join('\n'), |
| <String>[ |
| '#ifndef FLUTTER_FORMAT_TEST_H_', |
| '#define FLUTTER_FORMAT_TEST_H_', |
| '', |
| '#endif // FLUTTER_FORMAT_TEST_H_', |
| '', |
| ].join('\n'), |
| ); |
| |
| class TestFileFixture { |
| TestFileFixture(this.type) { |
| switch (type) { |
| case target.FormatCheck.clang: |
| final io.File ccFile = io.File('${repoDir.path}/format_test.cc'); |
| ccFile.writeAsStringSync(ccContentPair.original); |
| files.add(ccFile); |
| |
| final io.File hFile = io.File('${repoDir.path}/format_test.h'); |
| hFile.writeAsStringSync(hContentPair.original); |
| files.add(hFile); |
| case target.FormatCheck.gn: |
| final io.File gnFile = io.File('${repoDir.path}/format_test.gn'); |
| gnFile.writeAsStringSync(gnContentPair.original); |
| files.add(gnFile); |
| case target.FormatCheck.java: |
| final io.File javaFile = io.File('${repoDir.path}/format_test.java'); |
| javaFile.writeAsStringSync(javaContentPair.original); |
| files.add(javaFile); |
| case target.FormatCheck.python: |
| final io.File pyFile = io.File('${repoDir.path}/format_test.py'); |
| pyFile.writeAsStringSync(pythonContentPair.original); |
| files.add(pyFile); |
| case target.FormatCheck.whitespace: |
| final io.File whitespaceFile = io.File('${repoDir.path}/format_test.c'); |
| whitespaceFile.writeAsStringSync(whitespaceContentPair.original); |
| files.add(whitespaceFile); |
| case target.FormatCheck.header: |
| final io.File headerFile = io.File('${repoDir.path}/format_test.h'); |
| headerFile.writeAsStringSync(headerContentPair.original); |
| files.add(headerFile); |
| } |
| } |
| |
| final target.FormatCheck type; |
| final List<io.File> files = <io.File>[]; |
| |
| void gitAdd() { |
| final List<String> args = <String>['add']; |
| for (final io.File file in files) { |
| args.add(file.path); |
| } |
| |
| io.Process.runSync('git', args); |
| } |
| |
| void gitRemove() { |
| final List<String> args = <String>['rm', '-f']; |
| for (final io.File file in files) { |
| args.add(file.path); |
| } |
| io.Process.runSync('git', args); |
| } |
| |
| Iterable<FileContentPair> getFileContents() { |
| return files.map((io.File file) { |
| String content = file.readAsStringSync(); |
| // Avoid clang-tidy formatting CRLF EOL on Windows |
| content = content.replaceAll('\r\n', '\n'); |
| switch (type) { |
| case target.FormatCheck.clang: |
| return FileContentPair( |
| content, |
| path.extension(file.path) == '.cc' |
| ? ccContentPair.formatted |
| : hContentPair.formatted, |
| ); |
| case target.FormatCheck.gn: |
| return FileContentPair( |
| content, |
| gnContentPair.formatted, |
| ); |
| case target.FormatCheck.java: |
| return FileContentPair( |
| content, |
| javaContentPair.formatted, |
| ); |
| case target.FormatCheck.python: |
| return FileContentPair( |
| content, |
| pythonContentPair.formatted, |
| ); |
| case target.FormatCheck.whitespace: |
| return FileContentPair( |
| content, |
| whitespaceContentPair.formatted, |
| ); |
| case target.FormatCheck.header: |
| return FileContentPair( |
| content, |
| headerContentPair.formatted, |
| ); |
| } |
| }); |
| } |
| } |
| |
| void main() { |
| final String formatterPath = |
| '${repoDir.path}/ci/format.${io.Platform.isWindows ? 'bat' : 'sh'}'; |
| |
| test('Can fix C++ formatting errors', () { |
| final TestFileFixture fixture = TestFileFixture(target.FormatCheck.clang); |
| try { |
| fixture.gitAdd(); |
| io.Process.runSync(formatterPath, <String>['--check', 'clang', '--fix'], |
| workingDirectory: repoDir.path); |
| |
| final Iterable<FileContentPair> files = fixture.getFileContents(); |
| for (final FileContentPair pair in files) { |
| expect(pair.original, equals(pair.formatted)); |
| } |
| } finally { |
| fixture.gitRemove(); |
| } |
| }); |
| |
| test('Can fix GN formatting errors', () { |
| final TestFileFixture fixture = TestFileFixture(target.FormatCheck.gn); |
| try { |
| fixture.gitAdd(); |
| io.Process.runSync(formatterPath, <String>['--check', 'gn', '--fix'], |
| workingDirectory: repoDir.path); |
| |
| final Iterable<FileContentPair> files = fixture.getFileContents(); |
| for (final FileContentPair pair in files) { |
| expect(pair.original, equals(pair.formatted)); |
| } |
| } finally { |
| fixture.gitRemove(); |
| } |
| }); |
| |
| test('Can fix Java formatting errors', () { |
| final TestFileFixture fixture = TestFileFixture(target.FormatCheck.java); |
| try { |
| fixture.gitAdd(); |
| io.Process.runSync(formatterPath, <String>['--check', 'java', '--fix'], |
| workingDirectory: repoDir.path); |
| |
| final Iterable<FileContentPair> files = fixture.getFileContents(); |
| for (final FileContentPair pair in files) { |
| expect(pair.original, equals(pair.formatted)); |
| } |
| } finally { |
| fixture.gitRemove(); |
| } |
| // TODO(mtolmacs): Fails if Java dependency is unavailable, |
| // https://github.com/flutter/flutter/issues/129221 |
| }, skip: true); |
| |
| test('Can fix Python formatting errors', () { |
| final TestFileFixture fixture = TestFileFixture(target.FormatCheck.python); |
| try { |
| fixture.gitAdd(); |
| io.Process.runSync(formatterPath, <String>['--check', 'python', '--fix'], |
| workingDirectory: repoDir.path); |
| |
| final Iterable<FileContentPair> files = fixture.getFileContents(); |
| for (final FileContentPair pair in files) { |
| expect(pair.original, equals(pair.formatted)); |
| } |
| } finally { |
| fixture.gitRemove(); |
| } |
| }); |
| |
| test('Can fix whitespace formatting errors', () { |
| final TestFileFixture fixture = |
| TestFileFixture(target.FormatCheck.whitespace); |
| try { |
| fixture.gitAdd(); |
| io.Process.runSync( |
| formatterPath, <String>['--check', 'whitespace', '--fix'], |
| workingDirectory: repoDir.path); |
| |
| final Iterable<FileContentPair> files = fixture.getFileContents(); |
| for (final FileContentPair pair in files) { |
| expect(pair.original, equals(pair.formatted)); |
| } |
| } finally { |
| fixture.gitRemove(); |
| } |
| }); |
| |
| test('Can fix header guard formatting errors', () { |
| final TestFileFixture fixture = TestFileFixture(target.FormatCheck.header); |
| try { |
| fixture.gitAdd(); |
| io.Process.runSync( |
| formatterPath, <String>['--check', 'header', '--fix'], |
| workingDirectory: repoDir.path, |
| ); |
| final Iterable<FileContentPair> files = fixture.getFileContents(); |
| for (final FileContentPair pair in files) { |
| expect(pair.original, equals(pair.formatted)); |
| } |
| } finally { |
| fixture.gitRemove(); |
| } |
| }); |
| } |