import 'dart:html';

import 'package:expect/minitest.dart';

void check(InputElement element, String type, [bool supported = true]) {
  expect(element is InputElement, true);
  if (supported) {
    expect(element.type, type);
  } else {
    expect(element.type, 'text');
  }
}

main() {
  group('supported_search', () {
    test('supported', () {
      expect(SearchInputElement.supported, true);
    });
  });

  group('supported_url', () {
    test('supported', () {
      expect(UrlInputElement.supported, true);
    });
  });

  group('supported_tel', () {
    test('supported', () {
      expect(TelephoneInputElement.supported, true);
    });
  });

  group('supported_email', () {
    test('supported', () {
      expect(EmailInputElement.supported, true);
    });
  });

  group('supported_date', () {
    test('supported', () {
      expect(DateInputElement.supported, true);
    });
  });

  group('supported_month', () {
    test('supported', () {
      expect(MonthInputElement.supported, true);
    });
  });

  group('supported_week', () {
    test('supported', () {
      expect(WeekInputElement.supported, true);
    });
  });

  group('supported_time', () {
    test('supported', () {
      expect(TimeInputElement.supported, true);
    });
  });

  group('supported_datetime-local', () {
    test('supported', () {
      expect(LocalDateTimeInputElement.supported, true);
    });
  });

  group('supported_number', () {
    test('supported', () {
      expect(NumberInputElement.supported, true);
    });
  });

  group('supported_range', () {
    test('supported', () {
      expect(RangeInputElement.supported, true);
    });
  });

  group('constructors', () {
    test('hidden', () {
      check(new HiddenInputElement(), 'hidden');
    });

    test('search', () {
      check(new SearchInputElement(), 'search', SearchInputElement.supported);
    });

    test('text', () {
      check(new TextInputElement(), 'text');
    });

    test('url', () {
      check(new UrlInputElement(), 'url', UrlInputElement.supported);
    });

    test('telephone', () {
      check(new TelephoneInputElement(), 'tel',
          TelephoneInputElement.supported);
    });

    test('email', () {
      check(new EmailInputElement(), 'email', EmailInputElement.supported);
    });

    test('password', () {
      check(new PasswordInputElement(), 'password');
    });

    test('date', () {
      check(new DateInputElement(), 'date', DateInputElement.supported);
    });

    test('month', () {
      check(new MonthInputElement(), 'month', MonthInputElement.supported);
    });

    test('week', () {
      check(new WeekInputElement(), 'week', WeekInputElement.supported);
    });

    test('time', () {
      check(new TimeInputElement(), 'time', TimeInputElement.supported);
      if (TimeInputElement.supported) {
        var element = new TimeInputElement();
        var now = new DateTime.now();
        element.valueAsDate = now;
        expect(element.valueAsDate is DateTime, isTrue);

        // Bug 8813, setting it is just going to the epoch.
        //expect(element.valueAsDate, now);
      }
    });

    test('datetime-local', () {
      check(new LocalDateTimeInputElement(), 'datetime-local',
          LocalDateTimeInputElement.supported);
    });

    test('number', () {
      check(new NumberInputElement(), 'number', NumberInputElement.supported);
    });

    test('range', () {
      check(new RangeInputElement(), 'range', RangeInputElement.supported);
    });

    test('checkbox', () {
      check(new CheckboxInputElement(), 'checkbox');
    });

    test('radio', () {
      check(new RadioButtonInputElement(), 'radio');
    });

    test('file', () {
      check(new FileUploadInputElement(), 'file');
    });

    test('submit', () {
      check(new SubmitButtonInputElement(), 'submit');
    });

    test('image', () {
      check(new ImageButtonInputElement(), 'image');
    });

    test('reset', () {
      check(new ResetButtonInputElement(), 'reset');
    });

    test('button', () {
      check(new ButtonInputElement(), 'button');
    });
  });

  group('attributes', () {
    test('valueSetNull', () {
      final e = new TextInputElement();
      e.value = null;
      expect(e.value, '');
    });
    test('valueSetNullProxy', () {
      final e = new TextInputElement();
      e.value = _undefined;
      expect(e.value, '');
    });
  });
}

var _undefined = (() => new List(5)[0])();
