tags:

views:

49

answers:

2

Hi all, I'm trying to compare two arrays in groovy. My attempts so far have yielded a mixed response and therefore I'm turning to the collective for advice.

In the following code I'm taking 2 REST responses, parsing them and placing everything under the Invoice node into an array. I then further qualify my array so I have a list of InvoiceIDs and then try to compare the results of the two responses to ensure they are the same.

When I compare the array of InvoiceIDs (Guids) they match - this is not what I expect as the invoice order is currently different between my my 2 response sources.

When I sort the arrays of Invoices IDs the results differ.

I'm suspecting my code is faulty, but have spent an hour rattling through it, to no avail.

Any advice on sorting arrays in groovy or on the code below would be most appreciated:

gu = new com.eviware.soapui.support.GroovyUtils( context )
def xmlSlurper = new groovy.util.XmlSlurper()

// Setting up the response parameters
def responseSTAGE = xmlSlurper.parseText(context.expand('${GET Invoices - STAGE#Response}'));
def responseSTAGE2 = xmlSlurper.parseText(context.expand('${GET Invoices - STAGE2#Response}'));
responseInvoicesSTAGE = responseSTAGE.Invoices
responseInvoicesSTAGE2 = responseSTAGE2.Invoices

def arrayOfInvoicesSTAGE = []
def arrayOfInvoicesSTAGE2 = []

def counter = 0

for (invoice in responseInvoicesSTAGE.Invoice) {
    arrayOfInvoicesSTAGE[counter] = responseInvoicesSTAGE.Invoice[counter].InvoiceID
    //log.info counter+" STAGE"+arrayOfInvoicesSTAGE[counter]
    arrayOfInvoicesSTAGE2[counter] = responseInvoicesSTAGE2.Invoice[counter].InvoiceID
    //log.info counter+" STAGE2"+arrayOfInvoicesSTAGE2[counter]
    counter++
}

log.info arrayOfInvoicesSTAGE
log.info arrayOfInvoicesSTAGE2


def sortedSTAGE = arrayOfInvoicesSTAGE.sort()
def sortedSTAGE2 = arrayOfInvoicesSTAGE2.sort()
log.info sortedSTAGE
+1  A: 

Two arrays are considered equal in Groovy if they have they have the same number of elements and each element in the same position are equal. You can verify this by running the following code in the Groovy console

Integer[] foo = [1,2,3,4]
Integer[] bar = [4,3,2,1]

assert foo != bar

bar.sort()

assert foo == bar
Don
Hi Don! This confirms my original understanding. The issue I was facing above was that my unsorted pair or arrays matched before the sort and didn't match after.
richfort
A: 

As an aside, can't you replace:

def arrayOfInvoicesSTAGE = []
def arrayOfInvoicesSTAGE2 = []

def counter = 0

for (invoice in responseInvoicesSTAGE.Invoice) {
    arrayOfInvoicesSTAGE[counter] = responseInvoicesSTAGE.Invoice[counter].InvoiceID
    //log.info counter+" STAGE"+arrayOfInvoicesSTAGE[counter]
    arrayOfInvoicesSTAGE2[counter] = responseInvoicesSTAGE2.Invoice[counter].InvoiceID
    //log.info counter+" STAGE2"+arrayOfInvoicesSTAGE2[counter]
    counter++
}

with

def arrayOfInvoicesSTAGE  = responseInvoicesSTAGE.Invoice*.InvoiceID
def arrayOfInvoicesSTAGE2 = responseInvoicesSTAGE2.Invoice*.InvoiceID
tim_yates
Brilliant, thanks for this Tim. This is infintely prettier code!
richfort