#!/usr/bin/perl -w use strict; use Test::More tests=>4; use_ok qw(Parse::Eyapp::Node) or exit; our $test_datacompare_installed; BEGIN { $test_datacompare_installed = 1; eval { require Data::Compare }; $test_datacompare_installed = 0 if $@; } SKIP: { skip "Data::Compare not installed", 3 unless $test_datacompare_installed; my $handler = sub { Data::Compare::Compare($_[0], $_[1]) }; my $t1 = bless( { 'types' => { 'CHAR' => bless( { 'children' => [] }, 'CHAR' ), 'VOID' => bless( { 'children' => [] }, 'VOID' ), 'INT' => bless( { 'children' => [] }, 'INT' ), 'F(X_0(),INT)' => bless( { 'children' => [ bless( { 'children' => [] }, 'X_0' ), bless( { 'children' => [] }, 'INT' ) ] }, 'F' ) }, 'symboltable' => { 'f' => { 'type' => 'F(X_0(),INT)', 'line' => 1 } }, 'lines' => 2, 'children' => [ bless( { 'symboltable' => {}, 'fatherblock' => {}, 'children' => [], 'depth' => 1, 'parameters' => [], 'function_name' => [ 'f', 1 ], 'symboltableLabel' => {}, 'line' => 1 }, 'FUNCTION' ) ], 'depth' => 0, 'line' => 1 }, 'PROGRAM' ); $t1->{'children'}[0]{'fatherblock'} = $t1; # Tree similar to $t1 but without some attttributes (line, depth, etc.) my $t2 = bless( { 'types' => { 'CHAR' => bless( { 'children' => [] }, 'CHAR' ), 'VOID' => bless( { 'children' => [] }, 'VOID' ), 'INT' => bless( { 'children' => [] }, 'INT' ), 'F(X_0(),INT)' => bless( { 'children' => [ bless( { 'children' => [] }, 'X_0' ), bless( { 'children' => [] }, 'INT' ) ] }, 'F' ) }, 'symboltable' => { 'f' => { 'type' => 'F(X_0(),INT)', 'line' => 1 } }, 'children' => [ bless( { 'symboltable' => {}, 'fatherblock' => {}, 'children' => [], 'parameters' => [], 'function_name' => [ 'f', 1 ], }, 'FUNCTION' ) ], }, 'PROGRAM' ); $t2->{'children'}[0]{'fatherblock'} = $t2; # Tree similar to $t1 but without some attttributes (line, depth, etc.) # and without the symboltable attribute my $t3 = bless( { 'types' => { 'CHAR' => bless( { 'children' => [] }, 'CHAR' ), 'VOID' => bless( { 'children' => [] }, 'VOID' ), 'INT' => bless( { 'children' => [] }, 'INT' ), 'F(X_0(),INT)' => bless( { 'children' => [ bless( { 'children' => [] }, 'X_0' ), bless( { 'children' => [] }, 'INT' ) ] }, 'F' ) }, 'children' => [ bless( { 'symboltable' => {}, 'fatherblock' => {}, 'children' => [], 'parameters' => [], 'function_name' => [ 'f', 1 ], }, 'FUNCTION' ) ], }, 'PROGRAM' ); $t3->{'children'}[0]{'fatherblock'} = $t2; # Without attributes ok(Parse::Eyapp::Node::equal($t1, $t2), "Not considering attributes: Equal"); # Equality with attributes ok(Parse::Eyapp::Node::equal( $t1, $t2, symboltable => $handler, types => $handler, ), "Considering attributes: Equal"); # Equality with attributes ok(!Parse::Eyapp::Node::equal( $t1, $t3, symboltable => $handler, types => $handler,), "Considering attributes: Not Equal"); }