<!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 PaymentRequest shippingAddress attribute</title>
<link rel="help" href="https://w3c.github.io/payment-request/#shippingaddress-attribute">
<link rel="help" href="https://w3c.github.io/payment-request/#onshippingaddresschange-attribute">
<script src="/js-test-resources/ui-helper.js"></script>
<script src="/resources/payment-request.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
setup({ explicit_done: true, explicit_timeout: true });
const applePay = Object.freeze({
    supportedMethods: "https://apple.com/apple-pay",
    data: {
        version: 2,
        merchantIdentifier: '',
        merchantCapabilities: ['supports3DS'],
        supportedNetworks: ['visa', 'masterCard'],
        countryCode: 'US',
    },
});
const validMethods = Object.freeze([applePay]);
const validAmount = Object.freeze({ currency: "USD", value: "5.00" });
const validTotal = Object.freeze({
  label: "label",
  amount: validAmount,
});
const validShippingOption = Object.freeze({
  id: "valid",
  label: "Shipping Option",
  amount: validAmount,
  selected: false,
});
const validDetails = Object.freeze({
  total: validTotal,
  shippingOptions: [validShippingOption],
});
const requestShipping = Object.freeze({
  requestShipping: true,
});

function testShippingAddressChange() {
  const shippingAddress = {
      countryCode: 'US',
      addressLines: [''],
      administrativeArea: '',
      locality: '',
      subLocality: '',
      postalCode: '',
      localizedName: '',
      phoneNumber: '',
      emailAddress: '',
  };
  internals.mockPaymentCoordinator.setShippingAddress(shippingAddress);
  user_activation_test(async t => {
    const request = new PaymentRequest(
      validMethods,
      validDetails,
      requestShipping
    );
    assert_equals(
      request.shippingAddress,
      null,
      "request.shippingAddress must initially be null"
    );
    request.onmerchantvalidation = event => {
        event.complete({ });
    };
    const listenerPromise = new Promise(resolve => {
      request.addEventListener("shippingaddresschange", () => {
        resolve(request.shippingAddress);
      });
    });
    const handlerPromise = new Promise(resolve => {
      request.onshippingaddresschange = (event) => {
        event.updateWith({});
        resolve(request.shippingAddress);
      };
    });
    request.show().catch(err => err);
    const results = await Promise.all([listenerPromise, handlerPromise]);
    assert_true(
      results.every(obj => obj instanceof PaymentAddress),
      "Expected instances of PaymentAddress"
    );
    await request.abort();
  });
  done();
}
testShippingAddressChange();
</script>

