#!/usr/bin/env perl

BEGIN {
  unless(grep /blib/, @INC) {
    chdir 't' if -d 't';
    unshift @INC, '../lib' if -d '../lib';
  }
}

use strict;
use Test;

use SOAP::Lite
  on_fault => sub {
    my $soap = shift;
    my $res = shift;
    ref $res ? warn(join "\n", "--- SOAP FAULT ---", $res->faultcode, $res->faultstring, '')
             : warn(join "\n", "--- TRANSPORT ERROR ---", $soap->transport->status, '');
    return new SOAP::SOM;
  }
;

my($a, $s, $r, $serialized, $deserialized);

# ------------------------------------------------------
use SOAP::Test;

$s = SOAP::Lite->uri('http://something/somewhere')->proxy('http://services.xmethods.net/soap/servlet/rpcrouter')->on_fault(sub{});
eval { $s->transport->timeout($SOAP::Test::TIMEOUT = $SOAP::Test::TIMEOUT) };
$r = $s->test_connection;

unless (defined $r && defined $r->envelope) {
  print "1..0 # Skip: ", $s->transport->status, "\n";
  exit;
}
# ------------------------------------------------------

plan tests => 12;

{
# Service description (WSDL) (http://www.xmethods.net/)
  print "Service description (WSDL) test(s)...\n";
  $s = SOAP::Lite
    -> service('http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl');

  ok($s->getQuote('MSFT') > 1);

  ok(SOAP::Lite
    -> service('http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl')
    -> getQuote('MSFT') > 1);

  # WSDL with <import> element and multiple ports (non-SOAP bindings)
  ok(SOAP::Lite
    -> service('http://www.xmethods.net/sd/StockQuoteImport.wsdl')
    -> getQuote('MSFT') > 1);

  my $schema = SOAP::Schema
    -> schema('http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl')
    -> parse('net.xmethods.services.stockquote.StockQuoteService');

  foreach (keys %{$schema->services}) {
    eval { $schema->stub($_) } or die;
  }

  # SOAP::Schema converts
  # net.xmethods.services.stockquote.StockQuoteService
  # into
  # net_xmethods_services_stockquote_StockQuoteService

  print "Service description static stub test(s)...\n";
  ok(net_xmethods_services_stockquote_StockQuoteService->getQuote('MSFT') > 1);

  ok(defined net_xmethods_services_stockquote_StockQuoteService->self);

  ok(net_xmethods_services_stockquote_StockQuoteService->self->call);

  print "Service description static stub with import test(s)...\n";
  net_xmethods_services_stockquote_StockQuoteService->import(':all');

  ok(getQuote('MSFT') > 1);

  ok(defined net_xmethods_services_stockquote_StockQuoteService->self);

  ok(net_xmethods_services_stockquote_StockQuoteService->self->call);

  # ok, now we'll test for passing SOAP::Data and SOAP::Headers as a parameters

  my @params;
  {
    package TestStockQuoteService;
    @TestStockQuoteService::ISA = 'net_xmethods_services_stockquote_StockQuoteService';
    sub call { shift; @params = @_; new SOAP::SOM }
  }

  my @testparams = (SOAP::Data->name(param1 => 'MSFT'),
                    SOAP::Data->name('param2'),
                    SOAP::Header->name(header1 => 'value'));
  TestStockQuoteService->new->getQuote(@testparams);

  ok($params[1]->value->name eq 'param1');
  ok($params[2]->name eq 'param2');
  ok(ref $params[3] eq 'SOAP::Header' && $params[3]->name eq 'header1');
}