// 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';

void main() {
  test('MaterialStatesController constructor', () {
    expect(MaterialStatesController().value, <MaterialState>{});
    expect(MaterialStatesController(<MaterialState>{}).value, <MaterialState>{});
    expect(MaterialStatesController(<MaterialState>{MaterialState.selected}).value, <MaterialState>{MaterialState.selected});
  });

  test('MaterialStatesController update, listener', () {
    int count = 0;
    void valueChanged() {
      count += 1;
    }
    final MaterialStatesController controller = MaterialStatesController();
    controller.addListener(valueChanged);

    controller.update(MaterialState.selected, true);
    expect(controller.value, <MaterialState>{MaterialState.selected});
    expect(count, 1);
    controller.update(MaterialState.selected, true);
    expect(controller.value, <MaterialState>{MaterialState.selected});
    expect(count, 1);

    controller.update(MaterialState.hovered, false);
    expect(count, 1);
    expect(controller.value, <MaterialState>{MaterialState.selected});
    controller.update(MaterialState.selected, false);
    expect(count, 2);
    expect(controller.value, <MaterialState>{});

    controller.update(MaterialState.hovered, true);
    expect(controller.value, <MaterialState>{MaterialState.hovered});
    expect(count, 3);
    controller.update(MaterialState.hovered, true);
    expect(controller.value, <MaterialState>{MaterialState.hovered});
    expect(count, 3);
    controller.update(MaterialState.pressed, true);
    expect(controller.value, <MaterialState>{MaterialState.hovered, MaterialState.pressed});
    expect(count, 4);
    controller.update(MaterialState.selected, true);
    expect(controller.value, <MaterialState>{MaterialState.hovered, MaterialState.pressed, MaterialState.selected});
    expect(count, 5);
    controller.update(MaterialState.selected, false);
    expect(controller.value, <MaterialState>{MaterialState.hovered, MaterialState.pressed});
    expect(count, 6);
    controller.update(MaterialState.selected, false);
    expect(controller.value, <MaterialState>{MaterialState.hovered, MaterialState.pressed});
    expect(count, 6);
    controller.update(MaterialState.pressed, false);
    expect(controller.value, <MaterialState>{MaterialState.hovered});
    expect(count, 7);
    controller.update(MaterialState.hovered, false);
    expect(controller.value, <MaterialState>{});
    expect(count, 8);

    controller.removeListener(valueChanged);
    controller.update(MaterialState.selected, true);
    expect(controller.value, <MaterialState>{MaterialState.selected});
    expect(count, 8);
  });


  test('MaterialStatesController const initial value', () {
    int count = 0;
    void valueChanged() {
      count += 1;
    }
    final MaterialStatesController controller = MaterialStatesController(const <MaterialState>{MaterialState.selected});
    controller.addListener(valueChanged);

    controller.update(MaterialState.selected, true);
    expect(controller.value, <MaterialState>{MaterialState.selected});
    expect(count, 0);

    controller.update(MaterialState.selected, false);
    expect(controller.value, <MaterialState>{});
    expect(count, 1);
  });
}
