From e58ae4e756dbf7b373b782c47c92048e9253722e Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Thu, 3 Jun 2021 11:52:55 -0700 Subject: [PATCH] Add end-to-end tests for Mustachio AOT compiler (#2664) Add end-to-end tests for Mustachio AOT compiler These tests, in aot_compiler_render_test.dart, are a little irregular. The goal is to write short test cases in which we specify the text of a Mustache template, and the expected rendered text, visually near each other, which is a challenge, as there are several steps to get from Mustache template text to rendered output, including running the builders, and executing freshly generated Dart code. The solution here is a test system which takes a Mustache template text, runs the mustachio AOT compiler to generate a Dart script which renders a context object into that template, then executes the generated Dart script, and asserts on the output. Writing these tests revealed a few bugs that are fixed concurrently: * imports in the generated script should be accurate; this requires using code_builder, which requires a sizeable change to the AOT compiler code. code_builder allows you to "reference" symbols like types or top-level functions and the URL where they may be found. * handle partial template paths with dots and slashes. Additionally, fix some nits in runtime_renderer_builder_test.dart and runtime_renderer_render_test.dart. --- .../templates.aot_renderers_for_html.dart | 1525 ++++++++++------- .../templates.aot_renderers_for_md.dart | 996 +++++++---- pubspec.yaml | 1 + test/mustachio/aot_compiler_builder_test.dart | 49 +- test/mustachio/aot_compiler_render_test.dart | 458 ++++- test/mustachio/builder_test_base.dart | 32 + .../mustachio/foo.aot_renderers_for_html.dart | 35 +- test/mustachio/foo.aot_renderers_for_md.dart | 35 +- test/mustachio/render_tests_test.dart | 50 + .../runtime_renderer_builder_test.dart | 44 +- .../runtime_renderer_render_test.dart | 17 +- tool/mustachio/codegen_aot_compiler.dart | 186 +- 12 files changed, 2276 insertions(+), 1152 deletions(-) create mode 100644 test/mustachio/render_tests_test.dart diff --git a/lib/src/generator/templates.aot_renderers_for_html.dart b/lib/src/generator/templates.aot_renderers_for_html.dart index e0a6812855..355d22ed37 100644 --- a/lib/src/generator/templates.aot_renderers_for_html.dart +++ b/lib/src/generator/templates.aot_renderers_for_html.dart @@ -8,16 +8,27 @@ // non-bool, non-Iterable field is non-null. // ignore_for_file: unused_local_variable -// It is hard to track exact imports without using package:code_builder. -// ignore_for_file: unused_import - -import 'dart:convert' show htmlEscape; - -import 'package:dartdoc/dartdoc.dart'; -import 'package:dartdoc/src/generator/template_data.dart'; -import 'templates.dart'; - -String renderCategory(CategoryTemplateData context0) { +import 'dart:convert' as _i18; + +import 'package:dartdoc/src/generator/template_data.dart' as _i1; +import 'package:dartdoc/src/model/accessor.dart' as _i16; +import 'package:dartdoc/src/model/category.dart' as _i2; +import 'package:dartdoc/src/model/class.dart' as _i4; +import 'package:dartdoc/src/model/constructor.dart' as _i11; +import 'package:dartdoc/src/model/documentable.dart' as _i17; +import 'package:dartdoc/src/model/enum.dart' as _i12; +import 'package:dartdoc/src/model/extension.dart' as _i13; +import 'package:dartdoc/src/model/field.dart' as _i9; +import 'package:dartdoc/src/model/library.dart' as _i3; +import 'package:dartdoc/src/model/library_container.dart' as _i15; +import 'package:dartdoc/src/model/method.dart' as _i10; +import 'package:dartdoc/src/model/mixin.dart' as _i5; +import 'package:dartdoc/src/model/model_function.dart' as _i7; +import 'package:dartdoc/src/model/package.dart' as _i14; +import 'package:dartdoc/src/model/top_level_variable.dart' as _i6; +import 'package:dartdoc/src/model/typedef.dart' as _i8; + +String renderCategory(_i1.CategoryTemplateData context0) { final buffer = StringBuffer(); buffer.write(_renderCategory_partial_head_0(context0)); buffer.write(''' @@ -27,9 +38,9 @@ String renderCategory(CategoryTemplateData context0) { if (context1 != null) { buffer.write('''

'''); - buffer.write(htmlEscape.convert(context1.name.toString())); + buffer.writeEscaped(context1.name.toString()); buffer.write(''' '''); - buffer.write(htmlEscape.convert(context1.kind.toString())); + buffer.writeEscaped(context1.kind.toString()); buffer.write('''

'''); buffer.write(_renderCategory_partial_documentation_1(context1, context0)); @@ -214,9 +225,9 @@ String renderCategory(CategoryTemplateData context0) { buffer.write(_renderCategory_partial_search_sidebar_9(context0)); buffer.write('''
'''); - buffer.write(htmlEscape.convert(context0.parent.name.toString())); + buffer.writeEscaped(context0.parent.name.toString()); buffer.write(''' '''); - buffer.write(htmlEscape.convert(context0.parent.kind.toString())); + buffer.writeEscaped(context0.parent.kind.toString()); buffer.write('''
'''); buffer.write(_renderCategory_partial_packages_10(context0)); @@ -225,9 +236,9 @@ String renderCategory(CategoryTemplateData context0) { '''); } buffer.writeln(); + return buffer.toString(); } -String _renderCategory_partial_property_6(TopLevelVariable context2, - Category context1, CategoryTemplateData context0) { +String _renderCategory_partial_property_6(_i6.TopLevelVariable context2, + _i2.Category context1, _i1.CategoryTemplateData context0) { final buffer = StringBuffer(); buffer.write('''
'''); @@ -666,14 +697,15 @@ String __renderCategory_partial_property_6_partial_features_1( buffer.write(''''''); } buffer.writeln(); + return buffer.toString(); } -String _renderCategory_partial_callable_7(ModelFunctionTyped context2, - Category context1, CategoryTemplateData context0) { +String _renderCategory_partial_callable_7(_i7.ModelFunctionTyped context2, + _i2.Category context1, _i1.CategoryTemplateData context0) { final buffer = StringBuffer(); buffer.write('''
'''); @@ -746,18 +780,19 @@ String __renderCategory_partial_callable_7_partial_features_1( buffer.write(''''''); } buffer.writeln(); + return buffer.toString(); } -String _renderCategory_partial_typedef_8( - Typedef context2, Category context1, CategoryTemplateData context0) { +String _renderCategory_partial_typedef_8(_i8.Typedef context2, + _i2.Category context1, _i1.CategoryTemplateData context0) { final buffer = StringBuffer(); if (context2.isCallable == true) { var context3 = context2.asCallable; if (context3 != null) { buffer.write('''
'''); @@ -837,14 +874,15 @@ String __renderCategory_partial_typedef_8_partial_features_1( buffer.write(''''''); } buffer.writeln(); + return buffer.toString(); } -String __renderCategory_partial_typedef_8_partial_type_2( - Typedef context2, Category context1, CategoryTemplateData context0) { +String __renderCategory_partial_typedef_8_partial_type_2(_i8.Typedef context2, + _i2.Category context1, _i1.CategoryTemplateData context0) { final buffer = StringBuffer(); buffer.write('''
'''); @@ -914,10 +958,12 @@ String ___renderCategory_partial_typedef_8_partial_type_2_partial_features_1( buffer.write(''''''); } buffer.writeln(); + return buffer.toString(); } -String _renderCategory_partial_search_sidebar_9(CategoryTemplateData context0) { +String _renderCategory_partial_search_sidebar_9( + _i1.CategoryTemplateData context0) { final buffer = StringBuffer(); buffer.write('''
@@ -933,7 +979,7 @@ String _renderCategory_partial_search_sidebar_9(CategoryTemplateData context0) {
  • '''); - buffer.write(htmlEscape.convert(context2.name.toString())); + buffer.writeEscaped(context2.name.toString()); buffer.write('''
  • '''); } } @@ -944,7 +990,7 @@ String _renderCategory_partial_search_sidebar_9(CategoryTemplateData context0) {
  • '''); - buffer.write(htmlEscape.convert(context4.name.toString())); + buffer.writeEscaped(context4.name.toString()); if (context4.hasGenericParameters == true) { buffer.write(''''''); buffer.write(context4.genericParameters.toString()); @@ -971,10 +1017,11 @@ String _renderCategory_partial_search_sidebar_9(CategoryTemplateData context0) { '''); + return buffer.toString(); } -String _renderCategory_partial_packages_10(CategoryTemplateData context0) { +String _renderCategory_partial_packages_10(_i1.CategoryTemplateData context0) { final buffer = StringBuffer(); buffer.write('''
      '''); var context1 = context0.localPackages; @@ -1000,7 +1047,7 @@ String _renderCategory_partial_packages_10(CategoryTemplateData context0) { if (context2.isFirstPackage != true) { buffer.write('''
    1. '''); - buffer.write(htmlEscape.convert(context2.name.toString())); + buffer.writeEscaped(context2.name.toString()); buffer.write('''
    2. '''); } var context5 = context2.defaultCategory; @@ -1020,7 +1067,7 @@ String _renderCategory_partial_packages_10(CategoryTemplateData context0) { for (var context9 in context8) { buffer.write('''
    3. '''); - buffer.write(htmlEscape.convert(context9.name.toString())); + buffer.writeEscaped(context9.name.toString()); buffer.write('''
    4. '''); var context10 = context9.publicLibrariesSorted; if (context10 != null) { @@ -1038,11 +1085,12 @@ String _renderCategory_partial_packages_10(CategoryTemplateData context0) { buffer.write('''
    '''); + return buffer.toString(); } String _renderCategory_partial_sidebar_for_category_11( - CategoryTemplateData context0) { + _i1.CategoryTemplateData context0) { final buffer = StringBuffer(); buffer.write('''
      '''); var context1 = context0.self; @@ -1245,21 +1293,21 @@ String _renderCategory_partial_sidebar_for_category_11( buffer.write('''
    '''); + return buffer.toString(); } -String _renderCategory_partial_footer_12(CategoryTemplateData context0) { +String _renderCategory_partial_footer_12(_i1.CategoryTemplateData context0) { final buffer = StringBuffer(); buffer.write('''