use warnings;
use autodie;

use Statistics::RserveClient::Connection;
use Statistics::RserveClient::REXP::Logical;
use Statistics::RserveClient::REXP::Symbol;
use Statistics::RserveClient::REXP::String;
use Statistics::RserveClient::REXP::Integer;
use Statistics::RserveClient::REXP::Double;

use Test::More;# tests => 12;

SKIP: {
    eval {
	my $object = Statistics::RserveClient::Connection->new('localhost');
	if ( !ref ($object) || ! UNIVERSAL::can($object, 'can') ) {
	    die "Can't create a connection\n";
	}
    };
    skip "Looks like Rserve is not reachable.  Skipping test.", 12 if $@;

    my $cnx = new_ok('Statistics::RserveClient::Connection' => ['localhost']);
    
    my @expected_true_scalar = (1);
    my $x = new Statistics::RserveClient::REXP::Logical;
    $x->setValues(\@expected_true_scalar);
    $cnx->assign('x', $x);
    my @true_scalar = $cnx->evalString('x');
# print join(':', @true_scalar) . "\n";
# print join(':', @expected_true_scalar) . "\n";
    is_deeply(\@true_scalar, \@expected_true_scalar, 'scalar TRUE value') or
	diag explain @true_scalar;
    
    my @expected_false_scalar = (0);
    $x->setValues(\@expected_false_scalar);
    $cnx->assign('x', $x);
    my @false_scalar = $cnx->evalString('x');
    is_deeply(\@false_scalar, \@expected_false_scalar, 'scalar FALSE value') or
	diag explain @false_scalar;
    
    my @expected_bool_vector = (1, 0, 1);
    $x->setValues(\@expected_bool_vector);
    $cnx->assign('x', $x);
    my @bool_vector = $cnx->evalString('x');
    is_deeply(\@bool_vector, \@expected_bool_vector, 'boolean array') or
	diag explain @bool_vector;
    
    my @expected_char_scalar = 'z';
    $x = new Statistics::RserveClient::REXP::String;
    $x->setValues(\@expected_char_scalar);
    $cnx->assign('x', $x);
    my @char_scalar = $cnx->evalString('x');
    is_deeply(\@char_scalar, \@expected_char_scalar,
	      'single-char string scalar') or
		  diag explain @char_scalar;
    
    my @expected_char_vector = ('a', 'b', 'c', 'd');
    $x->setValues(\@expected_char_vector);
    $cnx->assign('x', $x);
    my @char_vector = $cnx->evalString('x');
    is_deeply(\@char_vector, \@expected_char_vector,
	      'vector of single-char strings') or
		  diag explain @char_vector;
    
    my @expected_string_scalar = 'Dec';
    $x->setValues(\@expected_string_scalar);
    $cnx->assign('x', $x);
    my @string_scalar = $cnx->evalString('x');
    is_deeply(\@string_scalar, \@expected_string_scalar,
	      'string scalar') or
		  diag explain @string_scalar;
    
    my @expected_string_vector = ('Jan', 'Feb', 'Mar');
    $x->setValues(\@expected_string_vector);
    $cnx->assign('x', $x);
    
    my @string_vector = $cnx->evalString('x');
    is_deeply(\@string_vector, \@expected_string_vector,
	      'vector of strings') or
		  diag explain @string_vector;
    
    my @expected_int_scalar = 123;
    $x = new Statistics::RserveClient::REXP::Integer;
    $x->setValues(\@expected_int_scalar);
    $cnx->assign('x', $x);
    my @int_scalar = $cnx->evalString('x');
    is_deeply(\@int_scalar, \@expected_int_scalar,
	      'single-int scalar') or
		  diag explain @int_scalar;
    
    my @expected_int_vector = (101..110);
    $x->setValues(\@expected_int_vector);
    $cnx->assign('x', $x);
    my @int_vector = $cnx->evalString('x');
    is_deeply(\@int_vector, \@expected_int_vector,
	      'vector of ints') or
		  diag explain @int_vector;
    
    my @expected_double_scalar = 1.5;
    $x = new Statistics::RserveClient::REXP::Double;
    $x->setValues(\@expected_double_scalar);
    $cnx->assign('x', $x);
    my @double_scalar = $cnx->evalString('x');
    is_deeply(\@double_scalar, \@expected_double_scalar,
	      'double scalar') or
		  diag explain @double_scalar;
    
    my @expected_double_vector = (0.5, 1, 1.5, 2);
    $x->setValues(\@expected_double_vector);
    $cnx->assign('x', $x);
    my @double_vector = $cnx->evalString('x');
    is_deeply(\@double_vector, \@expected_double_vector,
	      'vector of doubles') or
		  diag explain @double_vector;
    
}

done_testing();
