| // 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 a class', () { |
| expect( |
| Class((b) => b..name = 'Foo'), |
| equalsDart(r''' |
| class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create an abstract class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..abstract = true), |
| equalsDart(r''' |
| abstract class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create an abstract base class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..abstract = true |
| ..modifier = ClassModifier.base), |
| equalsDart(r''' |
| abstract base class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a final class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..modifier = ClassModifier.final$), |
| equalsDart(r''' |
| final class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a sealed class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..sealed = true), |
| equalsDart(r''' |
| sealed class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create an abstract interface class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..abstract = true |
| ..modifier = ClassModifier.interface), |
| equalsDart(r''' |
| abstract interface class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a mixin class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..mixin = true), |
| equalsDart(r''' |
| mixin class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create an abstract mixin class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..abstract = true |
| ..mixin = true), |
| equalsDart(r''' |
| abstract mixin class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a base mixin class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..mixin = true |
| ..modifier = ClassModifier.base), |
| equalsDart(r''' |
| base mixin class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create an abstract base mixin class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..abstract = true |
| ..mixin = true |
| ..modifier = ClassModifier.base), |
| equalsDart(r''' |
| abstract base mixin class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class with documentations', () { |
| expect( |
| Class( |
| (b) => b |
| ..name = 'Foo' |
| ..docs.addAll( |
| const [ |
| '/// My favorite class.', |
| ], |
| ), |
| ), |
| equalsDart(r''' |
| /// My favorite class. |
| class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class with annotations', () { |
| expect( |
| Class( |
| (b) => b |
| ..name = 'Foo' |
| ..annotations.addAll([ |
| refer('deprecated'), |
| refer('Deprecated').call([literalString('This is an old class')]) |
| ]), |
| ), |
| equalsDart(r''' |
| @deprecated |
| @Deprecated('This is an old class') |
| class Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a generic type', () { |
| expect( |
| Class((b) => b |
| ..name = 'List' |
| ..types.add(refer('T'))), |
| equalsDart(r''' |
| class List<T> {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class with multiple generic types', () { |
| expect( |
| Class( |
| (b) => b |
| ..name = 'Map' |
| ..types.addAll([ |
| refer('K'), |
| refer('V'), |
| ]), |
| ), |
| equalsDart(r''' |
| class Map<K, V> {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a bound generic type', () { |
| expect( |
| Class((b) => b |
| ..name = 'Comparable' |
| ..types.add(TypeReference((b) => b |
| ..symbol = 'T' |
| ..bound = TypeReference((b) => b |
| ..symbol = 'Comparable' |
| ..types.add(refer('T').type))))), |
| equalsDart(r''' |
| class Comparable<T extends Comparable<T>> {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class extending another class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..extend = TypeReference((b) => b.symbol = 'Bar')), |
| equalsDart(r''' |
| class Foo extends Bar {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class mixing in another class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..extend = TypeReference((b) => b.symbol = 'Bar') |
| ..mixins.add(TypeReference((b) => b.symbol = 'Foo'))), |
| equalsDart(r''' |
| class Foo extends Bar with Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class implementing another class', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..extend = TypeReference((b) => b.symbol = 'Bar') |
| ..implements.add(TypeReference((b) => b.symbol = 'Foo'))), |
| equalsDart(r''' |
| class Foo extends Bar implements Foo {} |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor())), |
| equalsDart(r''' |
| class Foo { |
| Foo(); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a constructor with initializers', () { |
| expect( |
| Class( |
| (b) => b |
| ..name = 'Foo' |
| ..constructors.add( |
| Constructor( |
| (b) => b |
| ..initializers.addAll([ |
| const Code('a = 5'), |
| const Code('super()'), |
| ]), |
| ), |
| ), |
| ), |
| equalsDart(r''' |
| class Foo { |
| Foo() : a = 5, super(); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a annotated constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors |
| .add(Constructor((b) => b..annotations.add(refer('deprecated'))))), |
| equalsDart(r''' |
| class Foo { |
| @deprecated |
| Foo(); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a named constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b..name = 'named'))), |
| equalsDart(r''' |
| class Foo { |
| Foo.named(); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a const constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b..constant = true))), |
| equalsDart(r''' |
| class Foo { |
| const Foo(); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with an external constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b..external = true))), |
| equalsDart(r''' |
| class Foo { |
| external Foo(); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a factory constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b |
| ..factory = true |
| ..redirect = refer('_Foo')))), |
| equalsDart(r''' |
| class Foo { |
| factory Foo() = _Foo; |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a const factory constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b |
| ..factory = true |
| ..constant = true |
| ..redirect = refer('_Foo')))), |
| equalsDart(r''' |
| class Foo { |
| const factory Foo() = _Foo; |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a factory lambda constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b |
| ..factory = true |
| ..lambda = true |
| ..body = const Code('_Foo()')))), |
| equalsDart(r''' |
| class Foo { |
| factory Foo() => _Foo(); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with an implicit factory lambda constructor', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b |
| ..factory = true |
| ..body = refer('_Foo').newInstance([]).code))), |
| equalsDart(r''' |
| class Foo { |
| factory Foo() => _Foo(); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a constructor with a body', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b |
| ..factory = true |
| ..body = const Code('return _Foo();')))), |
| equalsDart(r''' |
| class Foo { |
| factory Foo() { |
| return _Foo(); |
| } |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a constructor with parameters', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b |
| ..requiredParameters.addAll([ |
| Parameter((b) => b..name = 'a'), |
| Parameter((b) => b..name = 'b'), |
| ]) |
| ..optionalParameters.addAll([ |
| Parameter((b) => b |
| ..name = 'c' |
| ..named = true), |
| ])))), |
| equalsDart(r''' |
| class Foo { |
| Foo(a, b, {c, }); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a constructor+field-formal parameters', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b |
| ..requiredParameters.addAll([ |
| Parameter((b) => b |
| ..name = 'a' |
| ..toThis = true), |
| Parameter((b) => b |
| ..name = 'b' |
| ..toThis = true), |
| ]) |
| ..optionalParameters.addAll([ |
| Parameter((b) => b |
| ..name = 'c' |
| ..named = true |
| ..toThis = true), |
| ])))), |
| equalsDart(r''' |
| class Foo { |
| Foo(this.a, this.b, {this.c, }); |
| } |
| '''), |
| ); |
| }); |
| |
| test('should create a class with a constructor+super-formal parameters', () { |
| expect( |
| Class((b) => b |
| ..name = 'Foo' |
| ..constructors.add(Constructor((b) => b |
| ..requiredParameters.addAll([ |
| Parameter((b) => b |
| ..name = 'a' |
| ..toSuper = true), |
| Parameter((b) => b |
| ..name = 'b' |
| ..toSuper = true), |
| ]) |
| ..optionalParameters.addAll([ |
| Parameter((b) => b |
| ..name = 'c' |
| ..named = true |
| ..toSuper = true), |
| ])))), |
| equalsDart(r''' |
| class Foo { |
| Foo(super.a, super.b, {super.c, }); |
| } |
| '''), |
| ); |
| }); |
| } |