// Copyright 2015 The Chromium 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:test/test.dart';

import 'test_semantics.dart';

void main() {
  test('Semantics 4', () {
    testWidgets((WidgetTester tester) {
      TestSemanticsListener client = new TestSemanticsListener();

      //    O
      //   / \       O=root
      //  L   L      L=node with label
      //     / \     C=node with checked
      //    C   C*   *=node removed next pass
      //
      tester.pumpWidget(
        new Stack(
          children: <Widget>[
            new Semantics(
              label: 'L1'
            ),
            new Semantics(
              label: 'L2',
              child: new Stack(
                children: <Widget>[
                  new Semantics(
                    checked: true
                  ),
                  new Semantics(
                    checked: false
                  )
                ]
              )
            )
          ]
        )
      );
      expect(client.updates.length, equals(2));
      expect(client.updates[0].id, equals(0));
      expect(client.updates[0].children.length, equals(2));
      expect(client.updates[0].children[0].id, equals(1));
      expect(client.updates[0].children[0].children.length, equals(0));
      expect(client.updates[0].children[1].id, equals(2));
      expect(client.updates[0].children[1].children.length, equals(2));
      expect(client.updates[0].children[1].children[0].id, equals(3));
      expect(client.updates[0].children[1].children[0].children.length, equals(0));
      expect(client.updates[0].children[1].children[1].id, equals(4));
      expect(client.updates[0].children[1].children[1].children.length, equals(0));
      expect(client.updates[1], isNull);
      client.updates.clear();

      //    O        O=root
      //   / \       L=node with label
      //  L* LC      C=node with checked
      //             *=node removed next pass
      //
      tester.pumpWidget(
        new Stack(
          children: <Widget>[
            new Semantics(
              label: 'L1'
            ),
            new Semantics(
              label: 'L2',
              child: new Stack(
                children: <Widget>[
                  new Semantics(
                    checked: true
                  ),
                  new Semantics()
                ]
              )
            )
          ]
        )
      );
      expect(client.updates.length, equals(2));
      expect(client.updates[0].id, equals(2));
      expect(client.updates[0].children.length, equals(0));
      expect(client.updates[1], isNull);
      client.updates.clear();

      //             O=root
      //    OLC      L=node with label
      //             C=node with checked
      //
      tester.pumpWidget(
        new Stack(
          children: <Widget>[
            new Semantics(),
            new Semantics(
              label: 'L2',
              child: new Stack(
                children: <Widget>[
                  new Semantics(
                    checked: true
                  ),
                  new Semantics()
                ]
              )
            )
          ]
        )
      );
      expect(client.updates.length, equals(2));
      expect(client.updates[0].id, equals(0));
      expect(client.updates[0].children.length, equals(0));
      expect(client.updates[1], isNull);
      client.updates.clear();

    });
  });
}