// 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/rendering.dart';
import 'package:flutter_test/flutter_test.dart' show TestVSync;
import '../flutter_test_alternative.dart';

import 'rendering_tester.dart';

int countSemanticsChildren(RenderObject object) {
  int count = 0;
  object.visitChildrenForSemantics((RenderObject child) {
    count += 1;
  });
  return count;
}

void main() {
  test('RenderOpacity and children and semantics', () {
    final RenderOpacity box = RenderOpacity(
      child: RenderParagraph(
        const TextSpan(),
        textDirection: TextDirection.ltr,
      ),
    );
    expect(countSemanticsChildren(box), 1);
    box.opacity = 0.5;
    expect(countSemanticsChildren(box), 1);
    box.opacity = 0.25;
    expect(countSemanticsChildren(box), 1);
    box.opacity = 0.125;
    expect(countSemanticsChildren(box), 1);
    box.opacity = 0.0;
    expect(countSemanticsChildren(box), 0);
    box.opacity = 0.125;
    expect(countSemanticsChildren(box), 1);
    box.opacity = 0.0;
    expect(countSemanticsChildren(box), 0);
  });

  test('RenderOpacity and children and semantics', () {
    final AnimationController controller = AnimationController(vsync: const TestVSync());
    final RenderAnimatedOpacity box = RenderAnimatedOpacity(
      alwaysIncludeSemantics: false,
      opacity: controller,
      child: RenderParagraph(
        const TextSpan(),
        textDirection: TextDirection.ltr,
      ),
    );
    expect(countSemanticsChildren(box), 0); // controller defaults to 0.0
    controller.value = 0.2; // has no effect, box isn't subscribed yet
    expect(countSemanticsChildren(box), 0);
    controller.value = 1.0; // ditto
    expect(countSemanticsChildren(box), 0); // alpha is still 0
    layout(box); // this causes the box to attach, which makes it subscribe
    expect(countSemanticsChildren(box), 1);
    controller.value = 1.0;
    expect(countSemanticsChildren(box), 1);
    controller.value = 0.5;
    expect(countSemanticsChildren(box), 1);
    controller.value = 0.25;
    expect(countSemanticsChildren(box), 1);
    controller.value = 0.125;
    expect(countSemanticsChildren(box), 1);
    controller.value = 0.0;
    expect(countSemanticsChildren(box), 0);
    controller.value = 0.125;
    expect(countSemanticsChildren(box), 1);
    controller.value = 0.0;
    expect(countSemanticsChildren(box), 0);
  });
}
