text_test.dart 6.89 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 20 21 22 23 24
// 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(
        routes: <String, WidgetBuilder>{
          '/next': (BuildContext context) {
            return const Text('Next');
          },
        },
25
        localizationsDelegates: GlobalMaterialLocalizations.delegates,
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
        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>>[
43
                      const PopupMenuItem<int>(
44 45 46 47 48 49
                        value: 1,
                        child: Text(
                          'hello, world',
                          style: TextStyle(color: Colors.blue),
                        ),
                      ),
50
                      const PopupMenuItem<int>(
51 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
                        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'));

78 79 80 81
    expect(topLeft, const Offset(392.0, 299.5));
    expect(topRight, const Offset(596.0, 299.5));
    expect(bottomLeft, const Offset(392.0, 316.5));
    expect(bottomRight, const Offset(596.0, 316.5));
82 83 84 85 86 87

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

88 89 90 91
    expect(topLeft, const Offset(392.0, 347.5));
    expect(topRight, const Offset(477.0, 347.5));
    expect(bottomLeft, const Offset(392.0, 364.5));
    expect(bottomRight, const Offset(477.0, 364.5));
92
  });
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

  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(
        routes: <String, WidgetBuilder>{
          '/next': (BuildContext context) {
            return const Text('Next');
          },
        },
109
        localizationsDelegates: GlobalMaterialLocalizations.delegates,
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
        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>>[
127
                      const PopupMenuItem<int>(
128 129 130 131 132 133
                        value: 1,
                        child: Text(
                          'hello, world',
                          style: TextStyle(color: Colors.blue),
                        ),
                      ),
134
                      const PopupMenuItem<int>(
135 136 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
                        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'));

162 163 164 165
    expect(topLeft, const Offset(392.0, 300.0));
    expect(topRight, const Offset(584.0, 300.0));
    expect(bottomLeft, const Offset(392.0, 316));
    expect(bottomRight, const Offset(584.0, 316));
166 167 168 169 170 171

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

172 173 174 175
    expect(topLeft, const Offset(392.0, 348.0));
    expect(topRight, const Offset(472.0, 348.0));
    expect(bottomLeft, const Offset(392.0, 364.0));
    expect(bottomRight, const Offset(472.0, 364.0));
176
  });
177
}