use lib qw(t);
use strict;
use Carp;
use Test::More;
use Test::Deep;
use Storable qw(dclone);
require 'autohash.TieMV.pm';	# example tied hash class
use autohashUtil;
use Hash::AutoHash qw(autohash_new autohash_hash autohash_tie 
			      autohash_wrap autohash_wraptie autohash_wrapobj);
use Hash::AutoHash qw(autohash_get);
our @keys;

sub test_set (*\@@) {
  my($label,$hash,@values)=@_;
  my $autohash_sav=dclone($autohash);	# copy since first test clobbers it
  my %hash=@$hash;
  # test key=>value form
  $label="set $label: key=>value form";
  autohash_set($autohash,%hash);
  my(@ok,@fail);
  for my $key (@keys) {
    my $value=shift @values;
    eq_deeply(autohash_get($autohash,$key),$value)? push(@ok,$key): push(@fail,$key);
  }
  report($label,@ok,@fail);
  # test separate ARRAYs form
  my($label,$hash,@values)=@_;	# restore parameters changed by first test
  $autohash=$autohash_sav;
  $label="set $label: separate ARRAYs form";
  my $keys=[keys %hash];
  my $values=[values %hash];
  autohash_set($autohash,$keys,$values);
  my(@ok,@fail);
  for my $key (@keys) {
    my $value=shift @values;
    eq_deeply(autohash_get($autohash,$key),$value)? push(@ok,$key): push(@fail,$key);
  }
  report($label,@ok,@fail);
}

# set 0 keys
use Hash::AutoHash qw(autohash_get autohash_set);
our @keys=qw(key0 key1 key2 key3);
my @hash=();
$autohash=autohash_new (key1=>'value10',key2=>'value20');
my @correct=(undef,'value10','value20',undef);
test_set('0 keys autohash_new',@hash,@correct);
$autohash=autohash_tie TieMV;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(undef,['value10'],['value20'],undef);
test_set('0 keys autohash_tie',@hash,@correct);
$autohash=autohash_wrap %hash,(key1=>'value10',key2=>'value20');
my @correct=(undef,'value10','value20',undef);
test_set('0 keys autohash_wrap',@hash,@correct);
$autohash=autohash_wraptie %tie,TieMV;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(undef,['value10'],['value20'],undef);
test_set('0 keys autohash_wraptie',@hash,@correct);
$object=tie %tie,'TieMV';
$autohash=autohash_wrapobj $object;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(undef,['value10'],['value20'],undef);
test_set('0 keys autohash_wrapobj',@hash,@correct);

# set 1 key
use Hash::AutoHash qw(autohash_get autohash_set);
our @keys=qw(key0 key1 key2 key3);
my @hash=(key2=>'value21');
$autohash=autohash_new (key1=>'value10',key2=>'value20');
my @correct=(undef,'value10','value21',undef);
test_set('1 key autohash_new',@hash,@correct);
$autohash=autohash_tie TieMV;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(undef,['value10'],['value20','value21'],undef);
test_set('1 key autohash_tie',@hash,@correct);
$autohash=autohash_wrap %hash,(key1=>'value10',key2=>'value20');
my @correct=(undef,'value10','value21',undef);
test_set('1 key autohash_wrap',@hash,@correct);
$autohash=autohash_wraptie %tie,TieMV;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(undef,['value10'],['value20','value21'],undef);
test_set('1 key autohash_wraptie',@hash,@correct);
$object=tie %tie,'TieMV';
$autohash=autohash_wrapobj $object;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(undef,['value10'],['value20','value21'],undef);
test_set('1 key autohash_wrapobj',@hash,@correct);

# set 2 keys
use Hash::AutoHash qw(autohash_set);
our @keys=qw(key0 key1 key2 key3);
my @hash=(key0=>'value01',key2=>'value21');
$autohash=autohash_new (key1=>'value10',key2=>'value20');
my @correct=('value01','value10','value21',undef);
test_set('2 keys autohash_new',@hash,@correct);
$autohash=autohash_tie TieMV;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(['value01'],['value10'],['value20','value21'],undef);
test_set('2 keys autohash_tie',@hash,@correct);
$autohash=autohash_wrap %hash,(key1=>'value10',key2=>'value20');
my @correct=('value01','value10','value21',undef);
test_set('2 keys autohash_wrap',@hash,@correct);
$autohash=autohash_wraptie %tie,TieMV;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(['value01'],['value10'],['value20','value21'],undef);
test_set('2 keys autohash_wraptie',@hash,@correct);
$object=tie %tie,'TieMV';
$autohash=autohash_wrapobj $object;
$autohash->key1('value10'); $autohash->key2('value20');
my @correct=(['value01'],['value10'],['value20','value21'],undef);
test_set('2 keys autohash_wrapobj',@hash,@correct);

done_testing();