// META: script=/webusb/resources/fake-devices.js
// META: script=/webusb/resources/usb-helpers.js
'use strict';

usb_test(async () => {
  let { device } =  await getFakeDevice();
  let configuration = new USBConfiguration(
      device, device.configurations[1].configurationValue);
  let usbInterface = new USBInterface(
      configuration, configuration.interfaces[0].interfaceNumber);
  assertDeviceInfoEquals(
      usbInterface, fakeDeviceInit.configurations[1].interfaces[0]);
}, 'Can construct a USBInterface.');

usb_test(async () => {
  let { device } =  await getFakeDevice();
  let configuration = new USBConfiguration(
      device, device.configurations[1].configurationValue);
  try {
    let usbInterface = new USBInterface(
        configuration, configuration.interfaces.length);
    assert_unreached('USBInterface should reject an invalid interface number');
  } catch (error) {
    assert_equals(error.name, 'RangeError');
  }
}, 'Constructing a USBInterface with an invalid interface number ' +
    'throws a range error.');

usb_test(async () => {
  let { device } =  await getFakeDevice();
  await device.open();
  await device.selectConfiguration(2);
  let configuration = new USBConfiguration(
      device, device.configurations[1].configurationValue);
  let usbInterface = new USBInterface(
      configuration, configuration.interfaces[0].interfaceNumber);
  assert_equals(usbInterface.alternate, null);
}, 'The alternate attribute of USBInterface returns null if the interface' +
    'has not been claimed.');

usb_test(async () => {
  let { device } =  await getFakeDevice();
  await device.open();
  await device.selectConfiguration(2);
  await device.claimInterface(0);
  await device.selectAlternateInterface(0, 1);
  let configuration = new USBConfiguration(
      device, device.configurations[1].configurationValue);
  let usbInterface = new USBInterface(
      configuration, configuration.interfaces[0].interfaceNumber);
  assert_equals(usbInterface.alternate.alternateSetting, 1);
}, 'The alternate attribute of USBInterface returns the active alternate ' +
    'interface.');
