diff --git a/lib/src/generate_for_element.dart b/lib/src/generate_for_element.dart index 98d1cde..79dfd77 100644 --- a/lib/src/generate_for_element.dart +++ b/lib/src/generate_for_element.dart @@ -17,8 +17,9 @@ final _testAnnotationWarnings = {}; Future generateForElement( GeneratorForAnnotation generator, LibraryReader libraryReader, - String name, -) async { + String name, { + String Function(String code)? formatOutput, +}) async { final elements = libraryReader.allElements.where((e) => e.name3 == name).toList(); @@ -93,11 +94,11 @@ Future generateForElement( final generated = await generatedStream.join('\n\n'); - final formatter = dart_style.DartFormatter( + formatOutput ??= dart_style.DartFormatter( languageVersion: libraryReader.element.languageVersion.effective, - ); + ).format; - return formatter.format(generated); + return formatOutput(generated); } class _MockBuildStep extends BuildStep { diff --git a/lib/src/test_annotated_classes.dart b/lib/src/test_annotated_classes.dart index ea45533..b4fdc59 100644 --- a/lib/src/test_annotated_classes.dart +++ b/lib/src/test_annotated_classes.dart @@ -33,6 +33,7 @@ void testAnnotatedElements( Map>? additionalGenerators, Iterable? expectedAnnotatedTests, Iterable? defaultConfiguration, + String Function(String code)? formatOutput, }) { for (var entry in getAnnotatedClasses( libraryReader, @@ -40,6 +41,7 @@ void testAnnotatedElements( additionalGenerators: additionalGenerators, expectedAnnotatedTests: expectedAnnotatedTests, defaultConfiguration: defaultConfiguration, + formatOutput: formatOutput, )) { entry._registerTest(); } @@ -54,6 +56,7 @@ List> getAnnotatedClasses( Map>? additionalGenerators, Iterable? expectedAnnotatedTests, Iterable? defaultConfiguration, + String Function(String code)? formatOutput, }) { final generators = >{ _defaultConfigurationName: defaultGenerator, @@ -181,6 +184,7 @@ List> getAnnotatedClasses( configuration, entry.elementName, entry.expectation, + formatOutput: formatOutput, ), ); } @@ -216,6 +220,7 @@ class AnnotatedTest { final LibraryReader _libraryReader; final TestExpectation expectation; final String _elementName; + final String Function(String code)? _formatOutput; String get _testName { var value = _elementName; @@ -230,8 +235,9 @@ class AnnotatedTest { this.generator, this.configuration, this._elementName, - this.expectation, - ); + this.expectation, { + String Function(String code)? formatOutput, + }) : _formatOutput = formatOutput; void _registerTest() { if (expectation is ShouldGenerate) { @@ -247,8 +253,12 @@ class AnnotatedTest { throw StateError('Should never get here.'); } - Future _generate() => - generateForElement(generator, _libraryReader, _elementName); + Future _generate() => generateForElement( + generator, + _libraryReader, + _elementName, + formatOutput: _formatOutput, + ); Future _shouldGenerateTest() async { final output = await _generate(); diff --git a/test/generate_for_element_test.dart b/test/generate_for_element_test.dart index 83a463e..f3266fc 100644 --- a/test/generate_for_element_test.dart +++ b/test/generate_for_element_test.dart @@ -92,6 +92,75 @@ const TestClass2NameLength = 10; const TestClass2NameLowerCase = 'testclass2'; '''); }); + + group( + 'formatOutput', + () { + test( + 'should format the generated source code with `DartFormatter` when `formatOutput` is `null`.', + () async { + final output = await generateForElement( + const TestGenerator(), + reader, + 'TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANop', + formatOutput: null, + ); + printOnFailure(output); + expect( + output, + r''' +const TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANopNameLength = + 68; + +const TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANopNameLowerCase = + testclassthathasaverylongnamethatshouldnotwrapwhenformatoutputisanop; +''', + ); + }, + ); + + test( + 'should not format the generated source code when `formatOutput` is a NOP.', + () async { + final output = await generateForElement( + const TestGenerator(), + reader, + 'TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANop', + formatOutput: (code) => code, + ); + printOnFailure(output); + expect( + output, + r''' +const TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANopNameLength = 68; + +const TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANopNameLowerCase = testclassthathasaverylongnamethatshouldnotwrapwhenformatoutputisanop;''', + ); + }, + ); + + test( + 'should format the generated source code with a custom formatter when `formatOutput` is a custom formatter.', + () async { + final output = await generateForElement( + const TestGenerator(), + reader, + 'TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANop', + formatOutput: (code) => '$code\n', + ); + printOnFailure(output); + expect( + output, + r''' +const TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANopNameLength = 68; + +const TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANopNameLowerCase = testclassthathasaverylongnamethatshouldnotwrapwhenformatoutputisanop; +''', + ); + }, + ); + }, + ); }); test('throwsInvalidGenerationSourceError', () async { diff --git a/test/init_library_reader_test.dart b/test/init_library_reader_test.dart index 72b7e6c..86c0496 100644 --- a/test/init_library_reader_test.dart +++ b/test/init_library_reader_test.dart @@ -29,6 +29,7 @@ void main() { 'class TestClassWithBadMember', 'int badTestFunc()', 'int badTestField', + 'class TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANop', 'class TestClass2', ]), ); diff --git a/test/src/test_library.dart b/test/src/test_library.dart index 8167672..ede58ad 100644 --- a/test/src/test_library.dart +++ b/test/src/test_library.dart @@ -89,3 +89,6 @@ int badTestFunc() => 42; @ShouldThrow('Uh...', configurations: ['vague'], element: false) @TestAnnotation() const badTestField = 42; + +@TestAnnotation() +class TestClassThatHasAVeryLongNameThatShouldNotWrapWhenFormatOutputIsANop {}