// Copyright (C) 2022 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

import 'package:flutter_test/flutter_test.dart';
import 'package:wyatt_form_bloc/wyatt_form_bloc.dart';

void main() {
  group('FormInput', () {
    test('contains key', () {
      final input = FormInput<String?, Name, void>('key', const Name.pure());
      expect(input.key, 'key');
    });

    test('contains validator', () {
      final input = FormInput<String?, Name, void>('key', const Name.pure());
      expect(input.validator, const Name.pure());
    });

    test('contains metadata', () {
      final input = FormInput<String?, Name, int>(
        'key',
        const Name.pure(),
        metadata: const FormInputMetadata<int>(
          extra: 42,
        ),
      );
      expect(input.metadata.extra, 42);
    });

    test('== to another form input', () {
      final input1 = FormInput<String?, Name, void>(
        'key',
        const Name.pure(),
        metadata: const FormInputMetadata<int>(
          extra: 42,
        ),
      );
      final input2 = FormInput<String?, Name, void>(
        'key',
        const Name.pure(),
        metadata: const FormInputMetadata<int>(
          extra: 42,
        ),
      );
      expect(input1 == input2, isTrue);
    });

    test('!= to a different form input', () {
      final input1 = FormInput<String?, Name, void>(
        'key',
        const Name.pure(),
        metadata: const FormInputMetadata<int>(
          extra: 43, // little difference here
        ),
      );
      final input2 = FormInput<String?, Name, void>(
        'key',
        const Name.pure(),
        metadata: const FormInputMetadata<int>(
          extra: 42,
        ),
      );
      expect(input1 == input2, isFalse);
    });
  });
}
