# -*- ruby -*-
# This is a test script for xpath.
# Note that this is not W3C XPath!

require 'xtemplate'

$data = {
  'members' => {
    'man' => [
      {'@uid' => 1, 'name' => 'name1', 'age' => 20},
      {'@uid' => 2, 'name' => 'name2', 'age' => 21},
      {'@uid' => 3, 'name' => 'name3', 'age' => 22},
    ],
    'woman' => [
      {'@uid' => 4, 'name' => 'name4', 'age' => 20},
      {'@uid' => 5, 'name' => 'name5', 'age' => 21},
      {'@uid' => 6, 'name' => 'name6', 'age' => 22},
    ]
  },
  'others' => [
    {'@uid' => 10, 'name' => 'name10'},
    {'@uid' => 11, 'name' => 'name11'},
  ]
}

def xpath(path)
  XTemplate::XPath::xpath(path,$data)
end

def test(path, val)
  if( xpath(path) == val )
    print("#{path}: ok\n")
  else
    print("#{path}: fail\n")
  end
end


test("/members/man", $data['members']['man'])
test("/members/woman|/members/man", $data['members']['woman'] + $data['members']['man'])
test("/members/man[0,2]", $data['members']['man'][0,2])
test("/members/man[0,2]/name", $data['members']['man'][0,2].collect{|x| x['name']})
test("/members/man[0..1]/name", $data['members']['man'][0..1].collect{|x| x['name']})
test("/members/man/@uid", $data['members']['man'].collect{|x| x['@uid']})
test("/members/*/@uid", xpath("/members/man/@uid") + xpath("/members/woman/@uid"))
test("/**/@uid", xpath("/*/@uid") + xpath("/*/*/@uid"))

# age is an integer value in given data. we don't need to convert it.
test("/**/man[int(age)>20]", xpath("/**/man").select{|n| n.is_a?(Hash) && n['age']>20})
test("/**[age and age>20]", xpath("/**").select{|n| n.is_a?(Hash) && n['age'] && n['age']>20})
test("/**[name =~ /1/]",  xpath("/**").select{|n| n.is_a?(Hash) && n['name'] =~ /1/ })
test("/**[name = 'name10']",  xpath("/**").select{|n| n.is_a?(Hash) && n['name'] == 'name10' })

test("/members/./man/.", xpath("/members/man"))
test("/members/man[0]/../woman/name", xpath("/members/woman/name"))