The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- mode: perl; coding: utf-8; tab-width: 4 -*-

use strict;
use Test::More qw(no_plan);
# use Test::More tests => 63;

BEGIN {
	use_ok('Cv', -more);
}

my $stor = Cv::MemStorage->new;

if (1) {
	no warnings;
	my $destroy = 0;
	local *{Cv::Seq::DESTROY} = sub { $destroy++; };
	foreach my $cn (1 .. 4) {
		my $type = CV_MAKETYPE(CV_32S, $cn);
		my $seq = Cv::Seq->new($type, $stor);
		isa_ok($seq, 'Cv::Seq');
		is(&CV_MAT_TYPE($seq->flags), $type, 'MAT_TYPE(flags)');
		is(&CV_MAT_DEPTH($seq->flags), CV_32S, 'MAT_DEPTH(flags)');
		is(&CV_MAT_CN($seq->flags), $cn, 'MAT_CN(flags)');
		my $elem_type = &CV_MAT_TYPE($seq->flags);
		is(&CV_ELEM_SIZE($elem_type), 4 * $cn, 'ELEM_SIZE(type)');
	}
	is($destroy, 4);

	my $new = 0;
	local *{Cv::Seq::new} = sub { $new++; };
	Cv->CreateSeq();
	is($new, 1);

	my $Cv = bless [], 'Cv';
	eval { $Cv->CreateSeq() };
	like($@, qr/class name needed/);

	my $Cv_Seq = bless [], 'Cv::Seq';
	eval { $Cv_Seq->CreateSeq() };
	like($@, qr/class name needed/);
}


if (2) {
	my $cn = 3;
	foreach (
		[ CV_8S,  1 ], [ CV_8U,  1 ],
		[ CV_16S, 2 ], [ CV_16U, 2 ],
		[ CV_32S, 4 ], [ CV_64F, 8 ],
		) {
		my ($ty, $sz) = @$_;
		my $type = CV_MAKETYPE($ty, $cn);
		# my $seq = Cv::Seq::Point->new($type, $stor);
		my $seq = Cv::Seq->new($type, $stor);
		isa_ok($seq, 'Cv::Seq');
		is(&CV_MAT_TYPE($seq->flags), $type, 'MAT_TYPE(flags)');
		is(&CV_MAT_DEPTH($seq->flags), $ty, 'MAT_DEPTH(flags)');
		is(&CV_MAT_CN($seq->flags), $cn, 'MAT_CN(flags)');
		my $elem_type = &CV_MAT_TYPE($seq->flags);
		is(&CV_ELEM_SIZE($elem_type), $sz * $cn, 'ELEM_SIZE(type)');
	}
}

if (3) {
	my $seq = Cv::Seq->new;

	$seq->push(pack("i2", 100, 200));
	my @pt = unpack("i2", $seq->pop);
	is($pt[0], 100);
	is($pt[1], 200);

	$seq->push(pack("i2", 101, 201));
	my @pt2 = unpack("i2", $seq->get(0));
	is($pt2[0], 101);
	is($pt2[1], 201);

	$seq->set(0, pack("i2", 111, 222));
	my @pt3 = unpack("i2", $seq->shift);
	is($pt3[0], 111);
	is($pt3[1], 222);

	$seq->unshift(pack("i2", @pt3));
	my @pt4 = unpack("i2", $seq->shift);
	is($pt4[0], 111);
	is($pt4[1], 222);
}