Bob Nystrom | f14db24 | 2014-09-17 16:33:37 -0700 | [diff] [blame] | 1 | // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 | // for details. All rights reserved. Use of this source code is governed by a |
| 3 | // BSD-style license that can be found in the LICENSE file. |
| 4 | |
Bob Nystrom | b3cc810 | 2015-06-19 12:36:37 -0700 | [diff] [blame] | 5 | @TestOn("vm") |
Bob Nystrom | f14db24 | 2014-09-17 16:33:37 -0700 | [diff] [blame] | 6 | library dart_style.test.formatter_test; |
| 7 | |
Kevin Moore | 786d4a0 | 2015-06-10 21:25:54 +0200 | [diff] [blame] | 8 | import 'package:test/test.dart'; |
Bob Nystrom | f14db24 | 2014-09-17 16:33:37 -0700 | [diff] [blame] | 9 | |
Bob Nystrom | 76398fc | 2014-09-29 09:50:01 -0700 | [diff] [blame] | 10 | import 'package:dart_style/dart_style.dart'; |
Bob Nystrom | 3a7a05a | 2014-09-18 09:51:50 -0700 | [diff] [blame] | 11 | |
Bob Nystrom | 9eb5c5d | 2018-06-08 12:40:17 -0700 | [diff] [blame] | 12 | import 'utils.dart'; |
| 13 | |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 14 | void main() { |
Bob Nystrom | f1dbc59 | 2014-11-21 13:22:22 -0800 | [diff] [blame] | 15 | testDirectory("comments"); |
Bob Nystrom | f41c5e0 | 2014-11-11 11:21:39 -0800 | [diff] [blame] | 16 | testDirectory("regression"); |
Bob Nystrom | 119b00b | 2015-01-07 16:36:55 -0800 | [diff] [blame] | 17 | testDirectory("selections"); |
Bob Nystrom | 19dd27e | 2014-12-04 16:16:12 -0800 | [diff] [blame] | 18 | testDirectory("splitting"); |
| 19 | testDirectory("whitespace"); |
Bob Nystrom | 3400298 | 2014-09-28 22:34:32 -0700 | [diff] [blame] | 20 | |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 21 | test("throws a FormatterException on failed parse", () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 22 | var formatter = new DartFormatter(); |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 23 | expect(() => formatter.format('wat?!'), |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 24 | throwsA(new isInstanceOf<FormatterException>())); |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 25 | }); |
Bob Nystrom | f14db24 | 2014-09-17 16:33:37 -0700 | [diff] [blame] | 26 | |
Bob Nystrom | 94bdd6f | 2015-06-16 09:12:11 -0700 | [diff] [blame] | 27 | test("FormatterException.message() does not throw", () { |
| 28 | // This is a regression test for #358 where an error whose position is |
| 29 | // past the end of the source caused FormatterException to throw. |
| 30 | try { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 31 | new DartFormatter().format("library"); |
Bob Nystrom | 94bdd6f | 2015-06-16 09:12:11 -0700 | [diff] [blame] | 32 | } on FormatterException catch (err) { |
| 33 | var message = err.message(); |
| 34 | expect(message, contains("Could not format")); |
| 35 | } |
| 36 | }); |
| 37 | |
Bob Nystrom | 2419d61 | 2014-12-05 13:46:21 -0800 | [diff] [blame] | 38 | test("FormatterException describes parse errors", () { |
| 39 | try { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 40 | new DartFormatter().format(""" |
Bob Nystrom | 2419d61 | 2014-12-05 13:46:21 -0800 | [diff] [blame] | 41 | |
| 42 | var a = some error; |
| 43 | |
| 44 | var b = another one; |
Bob Nystrom | 9f9efe2 | 2017-07-05 17:10:42 -0700 | [diff] [blame] | 45 | """, uri: "my_file.dart"); |
Bob Nystrom | 2419d61 | 2014-12-05 13:46:21 -0800 | [diff] [blame] | 46 | |
| 47 | fail("Should throw."); |
| 48 | } on FormatterException catch (err) { |
| 49 | var message = err.message(); |
| 50 | expect(message, contains("my_file.dart")); |
| 51 | expect(message, contains("line 2")); |
| 52 | expect(message, contains("line 4")); |
| 53 | } |
| 54 | }); |
| 55 | |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 56 | test("adds newline to unit", () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 57 | expect(new DartFormatter().format("var x = 1;"), equals("var x = 1;\n")); |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 58 | }); |
Bob Nystrom | f14db24 | 2014-09-17 16:33:37 -0700 | [diff] [blame] | 59 | |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 60 | test("adds newline to unit after trailing comment", () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 61 | expect(new DartFormatter().format("library foo; //zamm"), |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 62 | equals("library foo; //zamm\n")); |
| 63 | }); |
| 64 | |
| 65 | test("removes extra newlines", () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 66 | expect( |
| 67 | new DartFormatter().format("var x = 1;\n\n\n"), equals("var x = 1;\n")); |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 68 | }); |
| 69 | |
| 70 | test("does not add newline to statement", () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 71 | expect(new DartFormatter().formatStatement("var x = 1;"), |
| 72 | equals("var x = 1;")); |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 73 | }); |
| 74 | |
Bob Nystrom | 04b3684 | 2015-06-25 10:08:05 -0700 | [diff] [blame] | 75 | test("fails if anything is after the statement", () { |
| 76 | try { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 77 | new DartFormatter().formatStatement("var x = 1;;"); |
Bob Nystrom | 04b3684 | 2015-06-25 10:08:05 -0700 | [diff] [blame] | 78 | |
| 79 | fail("Should throw."); |
Bob Nystrom | eca548c | 2016-10-19 14:34:45 -0700 | [diff] [blame] | 80 | } on FormatterException catch (ex) { |
| 81 | expect(ex.errors.length, equals(1)); |
| 82 | expect(ex.errors.first.offset, equals(10)); |
Bob Nystrom | 04b3684 | 2015-06-25 10:08:05 -0700 | [diff] [blame] | 83 | } |
| 84 | }); |
| 85 | |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 86 | test('preserves initial indent', () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 87 | var formatter = new DartFormatter(indent: 3); |
Bob Nystrom | efd3886 | 2015-06-15 14:04:15 -0700 | [diff] [blame] | 88 | expect( |
Bob Nystrom | 4568225 | 2015-07-30 14:19:08 -0700 | [diff] [blame] | 89 | formatter.formatStatement('if (foo) {bar;}'), |
| 90 | equals(' if (foo) {\n' |
Bob Nystrom | efd3886 | 2015-06-15 14:04:15 -0700 | [diff] [blame] | 91 | ' bar;\n' |
| 92 | ' }')); |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 93 | }); |
Bob Nystrom | 8eb9f96 | 2014-11-03 17:23:56 -0800 | [diff] [blame] | 94 | |
Jacob Richman | 2b241cb | 2017-04-24 14:06:18 -0700 | [diff] [blame] | 95 | group("line endings", () { |
| 96 | test("uses given line ending", () { |
| 97 | // Use zero width no-break space character as the line ending. We have |
| 98 | // to use a whitespace character for the line ending as the formatter |
| 99 | // will throw an error if it accidentally makes non-whitespace changes |
| 100 | // as will occur |
| 101 | var lineEnding = "\t"; |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 102 | expect(new DartFormatter(lineEnding: lineEnding).format("var i = 1;"), |
Jacob Richman | 2b241cb | 2017-04-24 14:06:18 -0700 | [diff] [blame] | 103 | equals("var i = 1;\t")); |
Bob Nystrom | 8eb9f96 | 2014-11-03 17:23:56 -0800 | [diff] [blame] | 104 | }); |
| 105 | |
Bob Nystrom | b3460d4 | 2014-11-04 13:16:36 -0800 | [diff] [blame] | 106 | test('infers \\r\\n if the first newline uses that', () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 107 | expect(new DartFormatter().format("var\r\ni\n=\n1;\n"), |
Bob Nystrom | 81c715b | 2015-01-08 17:30:51 -0800 | [diff] [blame] | 108 | equals("var i = 1;\r\n")); |
Bob Nystrom | 8eb9f96 | 2014-11-03 17:23:56 -0800 | [diff] [blame] | 109 | }); |
| 110 | |
Bob Nystrom | b3460d4 | 2014-11-04 13:16:36 -0800 | [diff] [blame] | 111 | test('infers \\n if the first newline uses that', () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 112 | expect(new DartFormatter().format("var\ni\r\n=\r\n1;\r\n"), |
Bob Nystrom | 81c715b | 2015-01-08 17:30:51 -0800 | [diff] [blame] | 113 | equals("var i = 1;\n")); |
Bob Nystrom | b3460d4 | 2014-11-04 13:16:36 -0800 | [diff] [blame] | 114 | }); |
| 115 | |
| 116 | test('defaults to \\n if there are no newlines', () { |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 117 | expect(new DartFormatter().format("var i =1;"), equals("var i = 1;\n")); |
Bob Nystrom | 81c715b | 2015-01-08 17:30:51 -0800 | [diff] [blame] | 118 | }); |
| 119 | |
| 120 | test('handles Windows line endings in multiline strings', () { |
Bob Nystrom | efd3886 | 2015-06-15 14:04:15 -0700 | [diff] [blame] | 121 | expect( |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 122 | new DartFormatter(lineEnding: "\r\n").formatStatement(' """first\r\n' |
Bob Nystrom | 05712e0 | 2015-07-23 10:44:47 -0700 | [diff] [blame] | 123 | 'second\r\n' |
Bob Nystrom | 4568225 | 2015-07-30 14:19:08 -0700 | [diff] [blame] | 124 | 'third""" ;'), |
| 125 | equals('"""first\r\n' |
Bob Nystrom | efd3886 | 2015-06-15 14:04:15 -0700 | [diff] [blame] | 126 | 'second\r\n' |
| 127 | 'third""";')); |
Bob Nystrom | 8eb9f96 | 2014-11-03 17:23:56 -0800 | [diff] [blame] | 128 | }); |
| 129 | }); |
Jacob Richman | 2b241cb | 2017-04-24 14:06:18 -0700 | [diff] [blame] | 130 | |
Bob Nystrom | 23e6720 | 2017-04-25 11:26:28 -0700 | [diff] [blame] | 131 | test('throws an UnexpectedOutputException on non-whitespace changes', () { |
Jacob Richman | 2b241cb | 2017-04-24 14:06:18 -0700 | [diff] [blame] | 132 | // Use an invalid line ending character to ensure the formatter will |
| 133 | // attempt to make non-whitespace changes. |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 134 | var formatter = new DartFormatter(lineEnding: '%'); |
Jacob Richman | 2b241cb | 2017-04-24 14:06:18 -0700 | [diff] [blame] | 135 | expect(() => formatter.format("var i = 1;"), |
Bob Nystrom | 8d6511e | 2018-06-18 14:53:10 -0700 | [diff] [blame] | 136 | throwsA(new isInstanceOf<UnexpectedOutputException>())); |
Jacob Richman | 2b241cb | 2017-04-24 14:06:18 -0700 | [diff] [blame] | 137 | }); |
Bob Nystrom | 926a41e | 2014-11-03 16:51:09 -0800 | [diff] [blame] | 138 | } |