<!DOCTYPE html>
<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<meta charset="utf-8">
<title>Test for onshippingaddresschange attribute</title>
<link rel="help" href="https://w3c.github.io/browser-payment-api/#onshippingaddresschange-attribute">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";
const basicCard = Object.freeze({ supportedMethods: "basic-card" });
const defaultMethods = Object.freeze([basicCard]);
const defaultDetails = Object.freeze({
  total: {
    label: "Total",
    amount: {
      currency: "USD",
      value: "1.00",
    },
  },
});

test(() => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  assert_idl_attribute(request, "onshippingaddresschange");
}, "Must have a onshippingaddresschange IDL attribute");

test(() => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const ev = new Event("shippingaddresschange");
  let didHandle = false;
  request.onshippingaddresschange = evt => {
    assert_equals(ev, evt, "must be same event");
    didHandle = true;
  };
  request.dispatchEvent(ev);
  assert_true(didHandle, "event did not fire");
}, `onshippingaddresschange attribute is a generic handler for "shippingaddresschange"`);

test(() => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const ev = new PaymentRequestUpdateEvent("shippingaddresschange");
  let didHandle = false;
  request.onshippingaddresschange = evt => {
    assert_equals(ev, evt, "must be same event");
    didHandle = true;
  };
  request.dispatchEvent(ev);
  assert_true(didHandle, "event did not fire");
}, `onshippingaddresschange attribute is a handler for PaymentRequestUpdateEvent`);

test(() => {
  const request = new PaymentRequest(defaultMethods, defaultDetails);
  const ev = new PaymentRequestUpdateEvent("shippingaddresschange");
  let didHandle = false;
  let didListen = false;
  request.onshippingaddresschange = evt => {
    assert_equals(ev, evt, "must be same event");
    didHandle = true;
  };
  request.addEventListener("shippingaddresschange", evt => {
    assert_equals(ev, evt, "must be same event");
    didListen = true;
  });
  request.dispatchEvent(ev);
  assert_true(didHandle, "onshippingaddresschange did not receive the event");
  assert_true(didListen, "addEventListener did not receive the event");
}, `onshippingaddresschange attribute and listeners both work`);
</script>
