<!DOCTYPE html>
<!-- Copyright © 2017 World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<meta charset="utf-8">
<title>Payment Method Basic Card: Tests that basic card is a supported method</title>
<link rel="help" href="https://w3c.github.io/browser-payment-api/#show-method">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
const basicCard = Object.freeze({ supportedMethods: "basic-card", data: {} });
const defaultMethods = Object.freeze([basicCard]);
const defaultDetails = Object.freeze({
  total: {
    label: "Total",
    amount: {
      currency: "USD",
      value: "1.00",
    },
  },
});

const notSupportedMethod = Object.freeze({
  supportedMethods: "this-is-not-supported",
});

promise_test(async t => {
  const request = new PaymentRequest([notSupportedMethod], defaultDetails);
  assert_false(
    await request.canMakePayment(),
    `canMakePaymentPromise should be false`
  );
}, `Must return false when the PMI is not supported at by the user agent.`);

function* pmiGenerator(howMany = 256) {
  for (i = 0; i < howMany; i++) {
    yield {
      supportedMethods: `this-is-not-supported-${i}`,
      data: { key: "value" },
    };
  }
}

promise_test(async t => {
  //Smoke test
  const canMakePaymentPromise = new PaymentRequest(
    [notSupportedMethod],
    defaultDetails
  ).canMakePayment();
  assert_false(
    await canMakePaymentPromise,
    "Expected canMakePaymentPromise smoke test to resolve with false"
  );
  // Actual test - Make a big array with random PMIs,
  // put basic-card in the middle of it!
  const pmis = []
    .concat(Array.from(pmiGenerator(250)))
    .concat(basicCard)
    .concat(Array.from(pmiGenerator(250)));
  const request = new PaymentRequest(pmis, defaultDetails);
  assert_true(
    await request.canMakePayment(),
    `canMakePaymentPromise should be true, because basic-card is present`
  );
}, `Must return true when basic-card is amongst unsupported PMIs.`);

promise_test(async t => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  try {
    assert_true(
      await request.canMakePayment(),
      `canMakePaymentPromise must resolve to true`
    );
    assert_true(
      await request.canMakePayment(),
      `canMakePaymentPromise must resolve to true`
    );
    // try to trigger optional behavior
    for (let i = 0; i < 1024; i++) {
      const temp = new PaymentRequest(defaultMethods, defaultDetails);
      await Promise.all([temp.canMakePayment(), request.canMakePayment()]);
    }
  } catch (err) {
    assert_equals(
      err.name,
      "NotAllowedError",
      "if it throws, then it must be a NotAllowedError."
    );
  }
}, `If basic-card is supported, then return a promise that resolves to true.`);
</script>
