<strong>Test</strong>: Code for the diff Module
Contents
This is a utility module called ‘diff’ that returns a nice human readable list of differences between two trees.
If you have not already done so you need to create a “diff” module in your project, and paste this code into it.
diff={}
local function trace(a,b,c,d) return end
local function DisplayParent(Parent)
local P = ''
local Root = Parent.Root
local i = 1
while i <= #Parent.Address do
if Root:nodeType() == 'segment_repeated' then
P = P..Root:nodeName()..'['..Parent.Address[i]..']'
Root = Root[Parent.Address[i]][Parent.Address[i+1]]
i = i + 2
else
if Root:nodeType() == 'segment' then
P = P..Root:nodeName()
elseif Root:nodeType() == 'message' then
P = P..Root:nodeName()..'.'
else
P = P..'['..Parent.Address[i-1]..']'
end
Root = Root[Parent.Address[i]]
i = i + 1
end
end
return P
end
local function Compare(Orig, New, List, Parent)
trace(List)
if #Orig ~= #New then
List[#List+1] = DisplayParent(Parent)..Orig:nodeName()..' has different number of children.'
end
for i=1,#Orig do
Parent.Address[#Parent.Address+1] = i
if #Orig[i] == 0 then
trace(Orig[i]:nodeName())
if Orig[i]:isNull() then
if New[i]:childCount() == 0 then
if not New[i]:isNull() then
List[#List+1] = New[i]:nodeName()..' should be empty but it is now '..New[i]
end
end
elseif Orig[i]:nodeValue() ~= New[i]:nodeValue() then
List[#List+1] = DisplayParent(Parent)..'['..i..'] was |'..
Orig[i]:nodeValue()..'| but is now |'..New[i]:nodeValue().."|"
end
else
Compare(Orig[i], New[i], List, Parent)
end
Parent.Address[#Parent.Address] = nil
end
return List
end
local function CheckHl7Message(P, Usage)
if type(P) ~= 'userdata' or P:nodeType() ~= 'message' then
error(Usage,3)
end
end
local DiffUsage=[[
Compares two HL7 messages for differences
Expects two HL7 strings and a VMD as
arguments and returns a table listing
differences - if any.
e.g. local List = diff.Compare(Orig, New)
]]
function diff.Compare(Orig, New, Vmd)
Orig = hl7.parse{data=Orig, vmd=Vmd}
New = hl7.parse{data=New, vmd=Vmd}
CheckHl7Message(Orig, DiffUsage)
CheckHl7Message(New, DiffUsage)
return Compare(Orig, New, {}, {Root=Orig, Address={}})
end
Next Step?
The final step is to tweak the code and the VMD file to cope with the last two errors.
Continue: <strong>Test</strong>: Final Code Tweaks