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

void main() {
  testWidgets('IconTheme.of works', (WidgetTester tester) async {
    const IconThemeData data = IconThemeData(color: Color(0xAAAAAAAA), opacity: 0.5, size: 16.0);

    IconThemeData retrieved;
    await tester.pumpWidget(
      IconTheme(data: data, child: Builder(builder: (BuildContext context) {
        retrieved = IconTheme.of(context);
        return const SizedBox();
      }))
    );

    expect(retrieved, data);

    await tester.pumpWidget(
      IconTheme(
        data: const CupertinoIconThemeData(color: CupertinoColors.systemBlue),
        child: MediaQuery(
          data: const MediaQueryData(platformBrightness: Brightness.dark),
          child: Builder(builder: (BuildContext context) {
              retrieved = IconTheme.of(context);
              return const SizedBox();
            },
          )
        ),
      ),
    );

    expect(retrieved.color, isSameColorAs(CupertinoColors.systemBlue.darkColor));
  });
}
