// 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);
  let alternateInterface = new USBAlternateInterface(
      usbInterface, usbInterface.alternates[1].alternateSetting);
  let inEndpoint = new USBEndpoint(
      alternateInterface, alternateInterface.endpoints[0].endpointNumber, 'in');
  let outEndpoint = new USBEndpoint(
      alternateInterface,
      alternateInterface.endpoints[1].endpointNumber,
      'out');
  assertDeviceInfoEquals(
      inEndpoint,
      fakeDeviceInit.configurations[1].interfaces[0].alternates[1]
          .endpoints[0]);
  assertDeviceInfoEquals(
      outEndpoint,
      fakeDeviceInit.configurations[1].interfaces[0].alternates[1]
          .endpoints[1]);
}, 'Can construct a USBEndpoint.');

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);
  let alternateInterface = new USBAlternateInterface(
      usbInterface, usbInterface.alternates[1].alternateSetting);
  try {
    let endpoint = new USBEndpoint(
        alternateInterface, alternateInterface.endpoints.length, 'in');
    assert_unreached('USBEndpoint should reject an invalid endpoint number');
  } catch (error) {
    assert_equals(error.name, 'RangeError');
  }
}, 'Constructing a USBEndpoint with an invalid endpoint number  throws a ' +
    'range error.');
