// Copyright 2013 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:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart' as ui;

import '../common/test_initialization.dart';

void main() {
  internalBootstrapBrowserTest(() => testMain);
}

Future<void> testMain() async {
  setUpUnitTests(
    emulateTesterEnvironment: false,
    setUpTestViewDimensions: false,
  );

  test('blanks are equal to each other', () {
    final ui.ParagraphStyle a = ui.ParagraphStyle();
    final ui.ParagraphStyle b = ui.ParagraphStyle();
    expect(a, b);
    expect(a.hashCode, b.hashCode);
  });

  test('each property individually equal', () {
    for (final String property in _populatorsA.keys) {
      final _ParagraphStylePropertyPopulator populator = _populatorsA[property]!;

      final _TestParagraphStyleBuilder aBuilder = _TestParagraphStyleBuilder();
      populator(aBuilder);
      final ui.ParagraphStyle a = aBuilder.build();

      final _TestParagraphStyleBuilder bBuilder = _TestParagraphStyleBuilder();
      populator(bBuilder);
      final ui.ParagraphStyle b = bBuilder.build();

      expect(reason: '$property property is equal', a, b);
      expect(reason: '$property hashCode is equal', a.hashCode, b.hashCode);
    }
  });

  test('each property individually not equal', () {
    for (final String property in _populatorsA.keys) {
      final _ParagraphStylePropertyPopulator populatorA = _populatorsA[property]!;

      final _TestParagraphStyleBuilder aBuilder = _TestParagraphStyleBuilder();
      populatorA(aBuilder);
      final ui.ParagraphStyle a = aBuilder.build();

      final _ParagraphStylePropertyPopulator populatorB = _populatorsB[property]!;
      final _TestParagraphStyleBuilder bBuilder = _TestParagraphStyleBuilder();
      populatorB(bBuilder);
      final ui.ParagraphStyle b = bBuilder.build();

      expect(reason: '$property property is not equal', a, isNot(b));
      expect(reason: '$property hashCode is not equal', a.hashCode, isNot(b.hashCode));
    }
  });

  test('all properties altogether equal', () {
    final _TestParagraphStyleBuilder aBuilder = _TestParagraphStyleBuilder();
    final _TestParagraphStyleBuilder bBuilder = _TestParagraphStyleBuilder();

    for (final String property in _populatorsA.keys) {
      final _ParagraphStylePropertyPopulator populator = _populatorsA[property]!;
      populator(aBuilder);
      populator(bBuilder);
    }

    final ui.ParagraphStyle a = aBuilder.build();
    final ui.ParagraphStyle b = bBuilder.build();

    expect(a, b);
    expect(a.hashCode, b.hashCode);
  });

  test('all properties altogether not equal', () {
    final _TestParagraphStyleBuilder aBuilder = _TestParagraphStyleBuilder();
    final _TestParagraphStyleBuilder bBuilder = _TestParagraphStyleBuilder();

    for (final String property in _populatorsA.keys) {
      final _ParagraphStylePropertyPopulator populatorA = _populatorsA[property]!;
      populatorA(aBuilder);

      final _ParagraphStylePropertyPopulator populatorB = _populatorsB[property]!;
      populatorB(bBuilder);
    }

    final ui.ParagraphStyle a = aBuilder.build();
    final ui.ParagraphStyle b = bBuilder.build();

    expect(a, isNot(b));
    expect(a.hashCode, isNot(b.hashCode));
  });
}

typedef _ParagraphStylePropertyPopulator = void Function(_TestParagraphStyleBuilder builder);

final Map<String, _ParagraphStylePropertyPopulator> _populatorsA = <String, _ParagraphStylePropertyPopulator>{
  'textAlign': (_TestParagraphStyleBuilder builder) { builder.textAlign = ui.TextAlign.left; },
  'textDirection': (_TestParagraphStyleBuilder builder) { builder.textDirection = ui.TextDirection.rtl; },
  'fontWeight': (_TestParagraphStyleBuilder builder) { builder.fontWeight = ui.FontWeight.w400; },
  'fontStyle': (_TestParagraphStyleBuilder builder) { builder.fontStyle = ui.FontStyle.normal; },
  'maxLines': (_TestParagraphStyleBuilder builder) { builder.maxLines = 1; },
  'fontFamily': (_TestParagraphStyleBuilder builder) { builder.fontFamily = 'Arial'; },
  'fontSize': (_TestParagraphStyleBuilder builder) { builder.fontSize = 12; },
  'height': (_TestParagraphStyleBuilder builder) { builder.height = 13; },
  'textHeightBehavior': (_TestParagraphStyleBuilder builder) { builder.textHeightBehavior = const ui.TextHeightBehavior(); },
  'strutStyle': (_TestParagraphStyleBuilder builder) { builder.strutStyle = ui.StrutStyle(fontFamily: 'Times New Roman'); },
  'ellipsis': (_TestParagraphStyleBuilder builder) { builder.ellipsis = '...'; },
  'locale': (_TestParagraphStyleBuilder builder) { builder.locale = const ui.Locale('en', 'US'); },
};

final Map<String, _ParagraphStylePropertyPopulator> _populatorsB = <String, _ParagraphStylePropertyPopulator>{
  'textAlign': (_TestParagraphStyleBuilder builder) { builder.textAlign = ui.TextAlign.right; },
  'textDirection': (_TestParagraphStyleBuilder builder) { builder.textDirection = ui.TextDirection.ltr; },
  'fontWeight': (_TestParagraphStyleBuilder builder) { builder.fontWeight = ui.FontWeight.w600; },
  'fontStyle': (_TestParagraphStyleBuilder builder) { builder.fontStyle = ui.FontStyle.italic; },
  'maxLines': (_TestParagraphStyleBuilder builder) { builder.maxLines = 2; },
  'fontFamily': (_TestParagraphStyleBuilder builder) { builder.fontFamily = 'Noto'; },
  'fontSize': (_TestParagraphStyleBuilder builder) { builder.fontSize = 12.1; },
  'height': (_TestParagraphStyleBuilder builder) { builder.height = 13.1; },
  'textHeightBehavior': (_TestParagraphStyleBuilder builder) { builder.textHeightBehavior = const ui.TextHeightBehavior(applyHeightToFirstAscent: false); },
  'strutStyle': (_TestParagraphStyleBuilder builder) { builder.strutStyle = ui.StrutStyle(fontFamily: 'sans-serif'); },
  'ellipsis': (_TestParagraphStyleBuilder builder) { builder.ellipsis = '___'; },
  'locale': (_TestParagraphStyleBuilder builder) { builder.locale = const ui.Locale('fr', 'CA'); },
};

class _TestParagraphStyleBuilder {
  ui.TextAlign? textAlign;
  ui.TextDirection? textDirection;
  ui.FontWeight? fontWeight;
  ui.FontStyle? fontStyle;
  int? maxLines;
  String? fontFamily;
  double? fontSize;
  double? height;
  ui.TextHeightBehavior? textHeightBehavior;
  ui.StrutStyle? strutStyle;
  String? ellipsis;
  ui.Locale? locale;

  ui.ParagraphStyle build() {
    return ui.ParagraphStyle(
      textAlign: textAlign,
      textDirection: textDirection,
      fontWeight: fontWeight,
      fontStyle: fontStyle,
      maxLines: maxLines,
      fontFamily: fontFamily,
      fontSize: fontSize,
      height: height,
      textHeightBehavior: textHeightBehavior,
      strutStyle: strutStyle,
      ellipsis: ellipsis,
      locale: locale,
    );
  }
}
