| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'package:code_builder/code_builder.dart'; | |
| import 'package:test/test.dart'; | |
| import '../common.dart'; | |
| void main() { | |
| useDartfmt(); | |
| test('should create an extension', () { | |
| expect( | |
| Extension( | |
| (b) => b | |
| ..name = 'Foo' | |
| ..on = TypeReference((b) => b.symbol = 'Bar'), | |
| ), | |
| equalsDart(r''' | |
| extension Foo on Bar {} | |
| '''), | |
| ); | |
| }); | |
| test('should create an extension without an identifier', () { | |
| expect( | |
| Extension((b) => b..on = TypeReference((b) => b.symbol = 'Bar')), | |
| equalsDart(r''' | |
| extension on Bar {} | |
| '''), | |
| ); | |
| }); | |
| test('should create an extension with documentation', () { | |
| expect( | |
| Extension( | |
| (b) => b | |
| ..name = 'Foo' | |
| ..on = TypeReference((b) => b.symbol = 'Bar') | |
| ..docs.addAll(const ['/// My favorite extension.']), | |
| ), | |
| equalsDart(r''' | |
| /// My favorite extension. | |
| extension Foo on Bar {} | |
| '''), | |
| ); | |
| }); | |
| test('should create an extension with annotations', () { | |
| expect( | |
| Extension( | |
| (b) => b | |
| ..name = 'Foo' | |
| ..on = TypeReference((b) => b.symbol = 'Bar') | |
| ..annotations.addAll([ | |
| refer('deprecated'), | |
| refer( | |
| 'Deprecated', | |
| ).call([literalString('This is an old extension')]), | |
| ]), | |
| ), | |
| equalsDart(r''' | |
| @deprecated | |
| @Deprecated('This is an old extension') | |
| extension Foo on Bar {} | |
| '''), | |
| ); | |
| }); | |
| test('should create an extension with a generic type', () { | |
| expect( | |
| Extension( | |
| (b) => b | |
| ..name = 'Foo' | |
| ..on = TypeReference((b) => b.symbol = 'Bar') | |
| ..types.add(refer('T')), | |
| ), | |
| equalsDart(r''' | |
| extension Foo<T> on Bar {} | |
| '''), | |
| ); | |
| }); | |
| test('should create an extension with multiple generic types', () { | |
| expect( | |
| Extension( | |
| (b) => b | |
| ..name = 'Map' | |
| ..on = TypeReference((b) => b.symbol = 'Bar') | |
| ..types.addAll([refer('K'), refer('V')]), | |
| ), | |
| equalsDart(r''' | |
| extension Map<K, V> on Bar {} | |
| '''), | |
| ); | |
| }); | |
| test('should create an extension with a bound generic type', () { | |
| expect( | |
| Extension( | |
| (b) => b | |
| ..name = 'Foo' | |
| ..on = TypeReference((b) => b.symbol = 'Bar') | |
| ..types.add( | |
| TypeReference( | |
| (b) => b | |
| ..symbol = 'T' | |
| ..bound = TypeReference( | |
| (b) => b | |
| ..symbol = 'Comparable' | |
| ..types.add(refer('T').type), | |
| ), | |
| ), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| extension Foo<T extends Comparable<T>> on Bar {} | |
| '''), | |
| ); | |
| }); | |
| test('should create an extension with a method', () { | |
| expect( | |
| Extension( | |
| (b) => b | |
| ..name = 'Foo' | |
| ..on = TypeReference((b) => b.symbol = 'Bar') | |
| ..methods.add( | |
| Method( | |
| (b) => b | |
| ..name = 'parseInt' | |
| ..returns = refer('int') | |
| ..body = Code.scope((a) => 'return int.parse(this);'), | |
| ), | |
| ), | |
| ), | |
| equalsDart(r''' | |
| extension Foo on Bar { | |
| int parseInt() { | |
| return int.parse(this); | |
| } | |
| } | |
| '''), | |
| ); | |
| }); | |
| } |