blob: aa80b5cc66a9d00318386cb8857623aae59dc4bd [file] [log] [blame]
// Copyright (c) 2021, 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.
@Timeout.factor(4)
import 'dart:convert';
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:build_test/build_test.dart';
import 'package:test/test.dart';
import 'builder_test_base.dart';
void main() {
InMemoryAssetWriter writer;
Future<LibraryElement> resolveGeneratedLibrary() async {
var rendererAsset = AssetId('foo', 'lib/foo.aot_renderers_for_html.dart');
var writtenStrings = writer.assets
.map((id, content) => MapEntry(id.toString(), utf8.decode(content)));
return await resolveSources(writtenStrings,
(Resolver resolver) => resolver.libraryFor(rendererAsset));
}
setUp(() {
writer = InMemoryAssetWriter();
});
test('builds renderers from multiple annotations', () async {
await testMustachioBuilder(
writer,
'''
class Foo {}
class Bar {}
class Baz {}
''',
libraryFrontMatter: '''
@Renderer(#renderFoo, Context<Foo>(), 'foo')
@Renderer(#renderBar, Context<Bar>(), 'bar')
library foo;
import 'package:mustachio/annotations.dart';
''',
additionalAssets: {
'foo|lib/templates/html/foo.html': '{{ >foo_header }}',
'foo|lib/templates/html/_foo_header.html': 'EMPTY',
},
);
var renderersLibrary = await resolveGeneratedLibrary();
expect(renderersLibrary.getTopLevelFunction('renderFoo'), isNotNull);
expect(renderersLibrary.getTopLevelFunction('renderBar'), isNotNull);
expect(
renderersLibrary.getTopLevelFunction('_renderFoo_partial_foo_header_0'),
isNotNull);
}, timeout: Timeout.factor(2));
test('builds a public API render function', () async {
await testMustachioBuilder(writer, '''
class Foo<T> {}
''', libraryFrontMatter: '''
@Renderer(#renderFoo, Context<Foo>(), 'foo')
library foo;
import 'package:mustachio/annotations.dart';
''');
var rendererAsset = AssetId('foo', 'lib/foo.aot_renderers_for_html.dart');
var generatedContent = utf8.decode(writer.assets[rendererAsset]);
expect(
generatedContent, contains('String renderFoo<T>(_i1.Foo<T> context0)'));
});
test('builds a private render function for a partial', () async {
await testMustachioBuilder(
writer,
'''
class Foo<T> {}
''',
libraryFrontMatter: '''
@Renderer(#renderFoo, Context<Foo>(), 'foo')
library foo;
import 'package:mustachio/annotations.dart';
''',
additionalAssets: {
'foo|lib/templates/html/foo.html': '{{ >foo_header }}',
'foo|lib/templates/html/_foo_header.html': 'EMPTY',
},
);
var rendererAsset = AssetId('foo', 'lib/foo.aot_renderers_for_html.dart');
var generatedContent = utf8.decode(writer.assets[rendererAsset]);
expect(
generatedContent,
contains(
'String _renderFoo_partial_foo_header_0<T>(_i1.Foo<T> context0)'));
});
test('builds a renderer for a generic, bounded type', () async {
await testMustachioBuilder(writer, '''
class Foo<T extends num> {}
class Bar {}
class Baz {}
''');
var renderersLibrary = await resolveGeneratedLibrary();
var fooRenderFunction = renderersLibrary.getTopLevelFunction('renderFoo');
expect(fooRenderFunction.typeParameters, hasLength(1));
var fBound = fooRenderFunction.typeParameters.single.bound;
expect(fBound.getDisplayString(withNullability: false), equals('num'));
});
}