use strict;
use warnings;
use Test::More qw(no_plan);

use Data::Range::Compare::Stream;
use Data::Range::Compare::Stream::Iterator::Array;

use_ok('Data::Range::Compare::Stream::Iterator::Validate');

{
  eval{ Data::Range::Compare::Stream::Iterator::Validate->new };
  ok($@,'should croak with an error when no iterator is passed in');
}

{
  my $o=Data::Range::Compare::Stream::Iterator::Array->new(sorted=>1);
  my $c='Data::Range::Compare::Stream';
  # bad ranges
  $o->insert_range($c->new);          # 1
  $o->insert_range($c->new(0));       # 2
  $o->insert_range($c->new(undef,0)); # 3
  $o->insert_range($c->new(1,0));     # 4

  # good ranges
  $o->insert_range($c->new(0,0));
  $o->insert_range($c->new(1,2));

  my $check;
  my $sub=sub { ++$check };
  my $s=Data::Range::Compare::Stream::Iterator::Validate->new($o,on_bad_range=>$sub);
  {
    ok($s->has_next,'object should have next');
    my $result=$s->get_next;
    my $string=$result->to_string;
    cmp_ok($string,'eq','0 - 0','range check');
  }
  {
    ok($s->has_next,'object should have next');
    my $result=$s->get_next;
    my $string=$result->to_string;
    cmp_ok($string,'eq','1 - 2','range check');
  }
  ok(!$s->has_next,'iterator should be empty');
  cmp_ok($check,'==',4,'invalid range count');
}