// 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/material.dart';
import 'package:flutter_test/flutter_test.dart';

import '../widgets/semantics_tester.dart';

void main() {
  testWidgets('Traversal order handles touching elements', (WidgetTester tester) async {
    final SemanticsTester semantics = SemanticsTester(tester);
    await tester.pumpWidget(
      MaterialApp(
        home: Column(
          children: List<Widget>.generate(3, (int column) {
            return Row(
              children: List<Widget>.generate(3, (int row) {
                return Semantics(
                  child: SizedBox(
                    width: 50.0,
                    height: 50.0,
                    child: Text('$column - $row'),
                  ),
                );
              }),
            );
          }),
        ),
      ),
    );

    final TestSemantics expected = TestSemantics.root(
      children: <TestSemantics>[
        TestSemantics(
          id: 1,
          textDirection: TextDirection.ltr,
          children: <TestSemantics>[
            TestSemantics(
              id: 2,
              children: <TestSemantics>[
                TestSemantics(
                  id: 3,
                  flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
                  children: <TestSemantics>[
                    TestSemantics(
                      id: 4,
                      label: '0 - 0',
                      textDirection: TextDirection.ltr,
                    ),
                    TestSemantics(
                      id: 5,
                      label: '0 - 1',
                      textDirection: TextDirection.ltr,
                    ),
                    TestSemantics(
                      id: 6,
                      label: '0 - 2',
                      textDirection: TextDirection.ltr,
                    ),
                    TestSemantics(
                      id: 7,
                      label: '1 - 0',
                      textDirection: TextDirection.ltr,
                    ),
                    TestSemantics(
                      id: 8,
                      label: '1 - 1',
                      textDirection: TextDirection.ltr,
                    ),
                    TestSemantics(
                      id: 9,
                      label: '1 - 2',
                      textDirection: TextDirection.ltr,
                    ),
                    TestSemantics(
                      id: 10,
                      label: '2 - 0',
                      textDirection: TextDirection.ltr,
                    ),
                    TestSemantics(
                      id: 11,
                      label: '2 - 1',
                      textDirection: TextDirection.ltr,
                    ),
                    TestSemantics(
                      id: 12,
                      label: '2 - 2',
                      textDirection: TextDirection.ltr,
                    ),
                  ],
                ),
              ],
            ),
          ],
        ),
      ],
    );
    expect(semantics, hasSemantics(expected, ignoreRect: true, ignoreTransform: true));
    semantics.dispose();
  });
}
