| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // TODO(yjbanov): this depends on integration_test that's not null-safe yet |
| // https://github.com/flutter/flutter/issues/84014 |
| // @dart=2.6 |
| |
| import 'dart:html' as html; |
| import 'package:flutter/material.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:integration_test/integration_test.dart'; |
| import 'package:regular_integration_tests/treeshaking_main.dart' as app; |
| |
| void main() { |
| IntegrationTestWidgetsFlutterBinding.ensureInitialized(); |
| |
| testWidgets('debug+Fill+Properties for widgets is tree shaken', |
| (WidgetTester tester) async { |
| // About 11 instances are used by DiagnosticsNode and diagnostics |
| // for flutter framework itself. Widgets have > 100. So we check for 20 to |
| // so this test fails when tree-shaking is broken. |
| await testOccurenceCountBelow(tester, '${debugPrefix}FillProperties', 20); |
| }); |
| } |
| |
| // Used to prevent compiler optimization that will generate const string. |
| // Preventing counting test strings. |
| String get debugPrefix => <String>['d','e','b','u','g'].join(''); |
| |
| Future<void> testOccurenceCountBelow(WidgetTester tester, String methodName, int count) async { |
| app.main(); |
| await tester.pumpAndSettle(); |
| |
| // Make sure app loaded. |
| final Finder finder = find.byKey(const Key('mainapp')); |
| expect(finder, findsOneWidget); |
| |
| await _loadBundleAndCheck(methodName, count); |
| } |
| |
| String fileContents; |
| |
| Future<void> _loadBundleAndCheck(String methodName, int count) async { |
| fileContents ??= await html.HttpRequest.getString('main.dart.js'); |
| expect(fileContents, contains('RenderObjectToWidgetElement')); |
| expect(occurrenceCount(fileContents, methodName), lessThan(count)); |
| } |
| |
| int occurrenceCount(String contents, String word) { |
| int count = 0; |
| final int wordLength = word.length; |
| int pos = contents.indexOf(word); |
| final int contentLength = contents.length; |
| while (pos != -1) { |
| ++count; |
| pos += wordLength; |
| if (pos >= contentLength || count > 100) { |
| break; |
| } |
| pos = contents.indexOf(word, pos); |
| } |
| return count; |
| } |