text: // Copyright 2019 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  import axe from 'axe-core';
  import userEvent from '@testing-library/user-event';
  import {fireEvent} from '@testing-library/react';
  
  // TODO(seanmccullough): Move this into crdx/chopsui-npm if we decide this
  // is worth using in other projects.
  
  /**
   * @param {HTMLElement} element The element to audit accessibility for.
   */
  export async function auditA11y(element) {
    // Performance tip: try restricting the analysis using
    // https://github.com/dequelabs/axe-core/blob/develop/doc/API.md#use-resulttypes
    const options = {};
  
    // Adjust this set to make tests more/less permissible.
    const reportImpact = new Set(['critical', 'serious', 'moderate', 'minor']);
    const results = await axe.run(element, options);
  
    if (results.violations.length == 0) {
      return;
    }
  
    const msgs = ['Accessibility violations:'];
    results.violations.forEach((result) => {
      if (reportImpact.has(result.impact)) {
        msgs.push(`\n[${result.impact}] ${result.help}`);
        for (const node of result.nodes) {
          if (node.failureSummary) {
            msgs.push(node.failureSummary);
          }
          msgs.push(node.html);
        }
        msgs.push('---');
      }
    });
  
    throw new Error(msgs.join('\n'));
  }
  
  /**
   * Types text into an input field and presses Enter.
   * @param {HTMLInputElement} input The input field to enter text in.
   * @param {string} value The text to enter in the input field.
   */
  export function enterInput(input, value) {
    userEvent.clear(input);
  
    userEvent.type(input, value);
  
    fireEvent.keyDown(input, {key: 'Enter', code: 'Enter'});
  }
  
  