// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library selectelement_test;

import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';
import 'dart:html';

main() {
  useHtmlConfiguration();

  test('selectedOptions', () {
    var element = new SelectElement();
    element.multiple = false;
    var options = [
      new OptionElement(),
      new DivElement(),
      new OptionElement(data: 'data', value: 'two', selected: true),
      new DivElement(),
      new OptionElement(data: 'data', value: 'two', selected: true),
      new OptionElement(),
    ];
    element.children.addAll(options);
    expect(element.selectedOptions.length, 1);
    expect(element.selectedOptions[0], equals(options[4]));
  });

  test('multiple selectedOptions', () {
    var element = new SelectElement();
    element.multiple = true;
    var options = [
      new OptionElement(),
      new DivElement(),
      new OptionElement(data: 'data', value: 'two', selected: true),
      new DivElement(),
      new OptionElement(data: 'data', value: 'two', selected: true),
      new OptionElement(),
      new OptionElement(data: 'data', value: 'two', selected: false),
    ];
    element.children.addAll(options);
    expect(element.selectedOptions.length, 2);
    expect(element.selectedOptions[0], equals(options[2]));
    expect(element.selectedOptions[1], equals(options[4]));
  });

  test('options', () {
    var element = new SelectElement();
    var options = [
      new OptionElement(),
      new OptionElement(data: 'data', value: 'two', selected: true),
      new OptionElement(data: 'data', value: 'two', selected: true),
      new OptionElement(),
    ];
    element.children.addAll(options);
    // Use last to make sure that the list was correctly wrapped.
    expect(element.options.last, equals(options[3]));
  });

  test('optgroup', () {
    var element = new Element.html('<select>'
        '<option>1</option>'
        '<optgroup>'
        '<option>2</option>'
        '</optgroup>'
        '</select>');

    expect(element.options.length, 2);
    element.selectedIndex = 1;

    var optGroup = element.children[1];
    expect(optGroup is OptGroupElement, isTrue);
    expect(optGroup.children.single.selected, isTrue);
    expect(element.selectedOptions, optGroup.children);
  });
}
