text_test.dart 6.99 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('Text baseline with CJK locale', (WidgetTester tester) async {
    // This test in combination with 'Text baseline with EN locale' verify the baselines
    // used to align text with ideographic baselines are reasonable. We are currently
    // using the alphabetic baseline to lay out as the ideographic baseline is not yet
    // properly implemented. When the ideographic baseline is better defined and implemented,
    // the values of this test should change very slightly. See the issue this is based off
    // of: https://github.com/flutter/flutter/issues/25782.
    final Key targetKey = UniqueKey();
    await tester.pumpWidget(
      MaterialApp(
20
        theme: ThemeData(useMaterial3: true),
21 22 23 24 25
        routes: <String, WidgetBuilder>{
          '/next': (BuildContext context) {
            return const Text('Next');
          },
        },
26
        localizationsDelegates: GlobalMaterialLocalizations.delegates,
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
        supportedLocales: const <Locale>[
          Locale('en', 'US'),
          Locale('es', 'ES'),
          Locale('zh', 'CN'),
        ],
        locale: const Locale('zh', 'CN'),
        home: Material(
          child: Center(
            child: Builder(
              key: targetKey,
              builder: (BuildContext context) {
                return PopupMenuButton<int>(
                  onSelected: (int value) {
                    Navigator.pushNamed(context, '/next');
                  },
                  itemBuilder: (BuildContext context) {
                    return <PopupMenuItem<int>>[
44
                      const PopupMenuItem<int>(
45 46 47 48 49 50
                        value: 1,
                        child: Text(
                          'hello, world',
                          style: TextStyle(color: Colors.blue),
                        ),
                      ),
51
                      const PopupMenuItem<int>(
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
                        value: 2,
                        child: Text(
                          '你好,世界',
                          style: TextStyle(color: Colors.blue),
                        ),
                      ),
                    ];
                  },
                );
              },
            ),
          ),
        ),
      ),
    );

    await tester.tap(find.byKey(targetKey));
    await tester.pumpAndSettle();

    expect(find.text('hello, world'), findsOneWidget);
    expect(find.text('你好,世界'), findsOneWidget);

    Offset topLeft = tester.getTopLeft(find.text('hello, world'));
    Offset topRight = tester.getTopRight(find.text('hello, world'));
    Offset bottomLeft = tester.getBottomLeft(find.text('hello, world'));
    Offset bottomRight = tester.getBottomRight(find.text('hello, world'));

79 80 81 82
    expect(topLeft, const Offset(392.0, 298.0));
    expect(topRight, const Offset(562.0, 298.0));
    expect(bottomLeft, const Offset(392.0, 318.0));
    expect(bottomRight, const Offset(562.0, 318.0));
83 84 85 86 87 88

    topLeft = tester.getTopLeft(find.text('你好,世界'));
    topRight = tester.getTopRight(find.text('你好,世界'));
    bottomLeft = tester.getBottomLeft(find.text('你好,世界'));
    bottomRight = tester.getBottomRight(find.text('你好,世界'));

89 90 91 92
    expect(topLeft, const Offset(392.0, 346.0));
    expect(topRight, const Offset(463.0, 346.0));
    expect(bottomLeft, const Offset(392.0, 366.0));
    expect(bottomRight, const Offset(463.0, 366.0));
93
  });
94 95 96 97 98 99 100 101 102 103 104

  testWidgets('Text baseline with EN locale', (WidgetTester tester) async {
    // This test in combination with 'Text baseline with CJK locale' verify the baselines
    // used to align text with ideographic baselines are reasonable. We are currently
    // using the alphabetic baseline to lay out as the ideographic baseline is not yet
    // properly implemented. When the ideographic baseline is better defined and implemented,
    // the values of this test should change very slightly. See the issue this is based off
    // of: https://github.com/flutter/flutter/issues/25782.
    final Key targetKey = UniqueKey();
    await tester.pumpWidget(
      MaterialApp(
105
        theme: ThemeData(useMaterial3: true),
106 107 108 109 110
        routes: <String, WidgetBuilder>{
          '/next': (BuildContext context) {
            return const Text('Next');
          },
        },
111
        localizationsDelegates: GlobalMaterialLocalizations.delegates,
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
        supportedLocales: const <Locale>[
          Locale('en', 'US'),
          Locale('es', 'ES'),
          Locale('zh', 'CN'),
        ],
        locale: const Locale('en', 'US'),
        home: Material(
          child: Center(
            child: Builder(
              key: targetKey,
              builder: (BuildContext context) {
                return PopupMenuButton<int>(
                  onSelected: (int value) {
                    Navigator.pushNamed(context, '/next');
                  },
                  itemBuilder: (BuildContext context) {
                    return <PopupMenuItem<int>>[
129
                      const PopupMenuItem<int>(
130 131 132 133 134 135
                        value: 1,
                        child: Text(
                          'hello, world',
                          style: TextStyle(color: Colors.blue),
                        ),
                      ),
136
                      const PopupMenuItem<int>(
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
                        value: 2,
                        child: Text(
                          '你好,世界',
                          style: TextStyle(color: Colors.blue),
                        ),
                      ),
                    ];
                  },
                );
              },
            ),
          ),
        ),
      ),
    );

    await tester.tap(find.byKey(targetKey));
    await tester.pumpAndSettle();

    expect(find.text('hello, world'), findsOneWidget);
    expect(find.text('你好,世界'), findsOneWidget);

    Offset topLeft = tester.getTopLeft(find.text('hello, world'));
    Offset topRight = tester.getTopRight(find.text('hello, world'));
    Offset bottomLeft = tester.getBottomLeft(find.text('hello, world'));
    Offset bottomRight = tester.getBottomRight(find.text('hello, world'));

164 165 166 167
    expect(topLeft, const Offset(392.0, 298.0));
    expect(topRight, const Offset(562.0, 298.0));
    expect(bottomLeft, const Offset(392.0, 318.0));
    expect(bottomRight, const Offset(562.0, 318.0));
168 169 170 171 172 173

    topLeft = tester.getTopLeft(find.text('你好,世界'));
    topRight = tester.getTopRight(find.text('你好,世界'));
    bottomLeft = tester.getBottomLeft(find.text('你好,世界'));
    bottomRight = tester.getBottomRight(find.text('你好,世界'));

174 175 176 177
    expect(topLeft, const Offset(392.0, 346.0));
    expect(topRight, const Offset(463.0, 346.0));
    expect(bottomLeft, const Offset(392.0, 366.0));
    expect(bottomRight, const Offset(463.0, 366.0));
178
  });
179
}