private function denormaliseAddresses(\ArrayAccess $array)
 {
     $addressData = $array['address'];
     if (is_null($addressData)) {
         return null;
     }
     $addresses = array();
     foreach ($addressData as $address) {
         $address = new SafeArrayAccess($address);
         $addressObject = new Address();
         $addressObject->addType($address['@type'])->addCode($address['code'])->addCountry($address['country']);
         $addresses[] = $addressObject;
     }
     return $addresses;
 }
 /**
  * Tests and invalid currency value (null)
  */
 public function testNullValueOnCurrency()
 {
     $card = new Card();
     $card->addExpiryDate(SampleXmlValidationUtils::CARD_EXPIRY_DATE)->addNumber(SampleXmlValidationUtils::CARD_NUMBER)->addCardType(new CardType(CardType::VISA))->addCardHolderName(SampleXmlValidationUtils::CARD_HOLDER_NAME)->addCvn(SampleXmlValidationUtils::CARD_CVN_NUMBER)->addCvnPresenceIndicator(SampleXmlValidationUtils::$CARD_CVN_PRESENCE)->addIssueNumber(SampleXmlValidationUtils::CARD_ISSUE_NUMBER);
     $tssInfo = new TssInfo();
     $businessAddress = new Address();
     $businessAddress->addType(SampleXmlValidationUtils::$ADDRESS_TYPE_BUSINESS)->addCode(SampleXmlValidationUtils::ADDRESS_CODE_BUSINESS)->addCountry(SampleXmlValidationUtils::ADDRESS_COUNTRY_BUSINESS);
     $shippingAddress = new Address();
     $shippingAddress->addType(SampleXmlValidationUtils::$ADDRESS_TYPE_SHIPPING)->addCode(SampleXmlValidationUtils::ADDRESS_CODE_SHIPPING)->addCountry(SampleXmlValidationUtils::ADDRESS_COUNTRY_SHIPPING);
     $tssInfo->addCustomerNumber(SampleXmlValidationUtils::CUSTOMER_NUMBER)->addProductId(SampleXmlValidationUtils::PRODUCT_ID)->addVariableReference(SampleXmlValidationUtils::VARIABLE_REFERENCE)->addCustomerIpAddress(SampleXmlValidationUtils::CUSTOMER_IP)->addAddress($businessAddress)->addAddress($shippingAddress);
     $autoSettle = new AutoSettle();
     $autoSettle = $autoSettle->addFlag(SampleXmlValidationUtils::$AUTO_SETTLE_FLAG);
     $mpi = new Mpi();
     $mpi->addCavv(SampleXmlValidationUtils::THREE_D_SECURE_CAVV)->addXid(SampleXmlValidationUtils::THREE_D_SECURE_XID)->addEci(SampleXmlValidationUtils::THREE_D_SECURE_ECI);
     $recurring = new Recurring();
     $recurring->addFlag(SampleXmlValidationUtils::$RECURRING_FLAG)->addSequence(SampleXmlValidationUtils::$RECURRING_SEQUENCE)->addType(SampleXmlValidationUtils::$RECURRING_TYPE);
     $expectedCurrency = null;
     $request = new PaymentRequest();
     $request->addAccount(SampleXmlValidationUtils::ACCOUNT)->addMerchantId(SampleXmlValidationUtils::MERCHANT_ID)->addType(PaymentType::AUTH)->addAmount(SampleXmlValidationUtils::AMOUNT)->addCurrency($expectedCurrency)->addCard($card)->addAutoSettle($autoSettle)->addTimestamp(SampleXmlValidationUtils::TIMESTAMP)->addChannel(SampleXmlValidationUtils::CHANNEL)->addOrderId(SampleXmlValidationUtils::ORDER_ID)->addHash(SampleXmlValidationUtils::REQUEST_HASH)->addComment(SampleXmlValidationUtils::COMMENT1)->addComment(SampleXmlValidationUtils::COMMENT2)->addPaymentsReference(SampleXmlValidationUtils::PASREF)->addAuthCode(SampleXmlValidationUtils::AUTH_CODE)->addRefundHash(SampleXmlValidationUtils::REFUND_HASH)->addFraudFilter(SampleXmlValidationUtils::FRAUD_FILTER)->addRecurring($recurring)->addTssInfo($tssInfo)->addMpi($mpi);
     // convert to XML
     $xml = $request->toXml();
     // Convert from XML back to PaymentRequest
     /* @var PaymentRequest $fromXmlRequest */
     $fromXmlRequest = new PaymentRequest();
     $fromXmlRequest = $fromXmlRequest->fromXml($xml);
     $this->assertEquals($expectedCurrency, $fromXmlRequest->getAmount()->getCurrency());
 }
 /**
  * <p>
  * This helper method adds Address Verification Service (AVS) fields to the request.
  * </p>
  * <p>
  * The Address Verification Service (AVS) verifies the cardholder's address by checking the
  * information provided by at the time of sale against the issuing bank's records.
  * </p>
  *
  * @param string $addressLine
  * @param string $postcode
  * @param string $country
  *
  * @return PaymentRequest
  */
 public function addAddressVerificationServiceDetails($addressLine, $postcode, $country)
 {
     //build code in format <digits from postcode>|<digits from address>
     $postcodeDigits = preg_replace("/\\D+/", "", $postcode);
     $addressLineDigits = preg_replace("/\\D+/", "", $addressLine);
     $code = $postcodeDigits . "|" . $addressLineDigits;
     //construct billing address from code
     $address = new Address();
     $address->addCode($code)->addCountry($country)->addType(AddressType::BILLING);
     //add address to TSS Info
     if (is_null($this->tssInfo)) {
         $this->tssInfo = new TssInfo();
     }
     $this->tssInfo->addAddress($address);
     return $this;
 }