#!perl

# $Id: Line.t,v 1.3 2010/10/12 21:18:13 Paulo Exp $

use strict;
use warnings;

use Test::More;
use_ok 'Asm::Preproc::Line';

my $line;
my $line1;
my $line2;

#------------------------------------------------------------------------------
# new / clone
isa_ok 	$line = Asm::Preproc::Line->new(),
		'Asm::Preproc::Line';

is		$line->text, 	undef, 		"no text";
is		$line->file, 	undef, 		"no file";
is		$line->line_nr, undef, 		"no line_nr";


isa_ok 	$line = Asm::Preproc::Line->new("text\n", "f1", 3),
		'Asm::Preproc::Line';
is		$line->text, 	"text\n", 	"text";
is		$line->file, 	"f1", 		"file";
is		$line->line_nr, 3, 			"line_nr";

isa_ok	$line2 = $line->clone,
		'Asm::Preproc::Line';
is		$line2->text, 	"text\n", 	"text";
is		$line2->file, 	"f1", 		"file";
is		$line2->line_nr, 3,			"line_nr";

$line->text('');
$line->line_nr('');
$line->file('');

is		$line->text, 	'', 		"no text";
is		$line->line_nr, '', 		"no line_nr";
is		$line->file, 	'', 		"no file";

is		$line2->text, 	"text\n", 	"text";
is		$line2->line_nr, 3,			"line_nr";
is		$line2->file, 	"f1", 		"file";

$line->text("ola");

is		$line->text, 	"ola", 		"no text";
is		$line->line_nr, '', 		"no line_nr";
is		$line->file, 	'', 		"no file";

$line->text(undef);

is		$line->text, 	undef, 		"no text";
is		$line->line_nr, '', 		"no line_nr";
is		$line->file, 	'', 		"no file";


#------------------------------------------------------------------------------
# regexp match on text
isa_ok 	$line = Asm::Preproc::Line->new("text\n", "f1", 3),
		'Asm::Preproc::Line';
ok $line->text =~ /\G(.)/gcxs, "match";
is $1, "t", "t";
ok $line->text =~ /\G(.)/gcxs, "match";
is $1, "e", "e";
ok $line->text =~ /\G(.)/gcxs, "match";
is $1, "x", "x";
ok $line->text =~ /\G(.)/gcxs, "match";
is $1, "t", "t";
ok $line->text =~ /\G(.)/gcxs, "match";
is $1, "\n", "newline";
ok $line->text =~ /\G\z/gcxs, "match";

#------------------------------------------------------------------------------
# error
my $warn; 
$SIG{__WARN__} = sub {$warn = shift};

sub test_error { 
	my($error_msg, $expected_error, $expected_warning) = @_;
	my $line_nr = (caller)[2];
	my $test_name = "[line $line_nr]";
		
	eval {	$line->error($error_msg) };
	is		$@, $expected_error, "$test_name die()";
	
			$warn = "";
			$line->warning($error_msg);
	is 		$warn, $expected_warning, "$test_name warning()";
	$warn = undef;
}
	
isa_ok 	$line = Asm::Preproc::Line->new(),
		'Asm::Preproc::Line';

test_error(undef, "error: \n", "warning: \n");
test_error("test error", "error: test error\n", "warning: test error\n");
test_error("test error\n", "error: test error\n", "warning: test error\n");

$line->text("");
test_error("test error", "error: test error\n", "warning: test error\n");

$line->text("0");
test_error("test error", "error: test error\n", "warning: test error\n");

$line->text("this line");
test_error("test error","error: test error\n", "warning: test error\n");

$line->line_nr(1);
test_error("test error","(1) : error: test error\n", "(1) : warning: test error\n");

$line->file("f1.asm");
test_error("test error","f1.asm(1) : error: test error\n", "f1.asm(1) : warning: test error\n");

$line->line_nr(0);
test_error("test error","f1.asm : error: test error\n", "f1.asm : warning: test error\n");

is $warn, undef, "no warnings";

#------------------------------------------------------------------------------
# is_equal, is_different
sub is_equal {
	my $line = "(line ". (caller)[2] .")";
	ok	  $line1 == $line2,  "  == $line";
	ok	!($line1 != $line2), "! != $line";
}

sub is_different {
	my $line = "(line ". (caller)[2] .")";
	ok	  $line1 != $line2,  "  != $line";
	ok	!($line1 == $line2), "! == $line";
}

isa_ok 	$line1 = Asm::Preproc::Line->new(),
		'Asm::Preproc::Line';
isa_ok 	$line2 = Asm::Preproc::Line->new(),
		'Asm::Preproc::Line';

is_equal;

$line1->text("hello");
is_different;
$line2->text("hello world");
is_different;
$line1->text("hello world");
is_equal;

$line1->line_nr(11);
is_different;
$line2->line_nr(12);
is_different;
$line1->line_nr(12);
is_equal;

$line1->file("hello");
is_different;
$line2->file("hello world");
is_different;
$line1->file("hello world");
is_equal;

#------------------------------------------------------------------------------
# overload fallback
isa_ok 	$line = Asm::Preproc::Line->new("text\n", "f1", 3),
		'Asm::Preproc::Line';
like "$line", qr/^Asm::Preproc::Line=ARRAY\(0x[0-9a-f]+\)$/i, "overload fallback";

done_testing();
