// Copyright 2014 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. import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { test('WidgetSpan codeUnitAt', () { const InlineSpan span = WidgetSpan(child: SizedBox()); expect(span.codeUnitAt(-1), isNull); expect(span.codeUnitAt(0), PlaceholderSpan.placeholderCodeUnit); expect(span.codeUnitAt(1), isNull); expect(span.codeUnitAt(2), isNull); const InlineSpan nestedSpan = TextSpan( text: 'AAA', children: <InlineSpan>[span, span], ); expect(nestedSpan.codeUnitAt(-1), isNull); expect(nestedSpan.codeUnitAt(0), 65); expect(nestedSpan.codeUnitAt(1), 65); expect(nestedSpan.codeUnitAt(2), 65); expect(nestedSpan.codeUnitAt(3), PlaceholderSpan.placeholderCodeUnit); expect(nestedSpan.codeUnitAt(4), PlaceholderSpan.placeholderCodeUnit); expect(nestedSpan.codeUnitAt(5), isNull); }); test('WidgetSpan.extractFromInlineSpan applies the correct scaling factor', () { const WidgetSpan a = WidgetSpan(child: SizedBox(), style: TextStyle(fontSize: 0)); const WidgetSpan b = WidgetSpan(child: SizedBox(), style: TextStyle(fontSize: 10)); const WidgetSpan c = WidgetSpan(child: SizedBox()); const WidgetSpan d = WidgetSpan(child: SizedBox(), style: TextStyle(letterSpacing: 999)); const TextSpan span = TextSpan( children: <InlineSpan>[ a, // fontSize = 0. TextSpan( children: <InlineSpan>[ b, // fontSize = 10. c, // fontSize = 20. ], style: TextStyle(fontSize: 20), ), d, // fontSize = 14. ] ); double effectiveTextScaleFactorFromWidget(Widget widget) { final Semantics child = (widget as ProxyWidget).child as Semantics; final dynamic grandChild = child.child; final double textScaleFactor = grandChild.textScaleFactor as double; // ignore: avoid_dynamic_calls return textScaleFactor; } final List<double> textScaleFactors = WidgetSpan.extractFromInlineSpan(span, const _QuadraticScaler()) .map(effectiveTextScaleFactorFromWidget).toList(); expect(textScaleFactors, <double>[ 0, // a 10, // b 20, // c 14, // d ]); }); } class _QuadraticScaler extends TextScaler { const _QuadraticScaler(); @override double scale(double fontSize) => fontSize * fontSize; @override double get textScaleFactor => throw UnimplementedError(); }