# $Id$
##
# this test checks the DOM Characterdata interface of XML::LibXML
use strict;
use warnings;
use Test::More tests => 59;
use XML::LibXML;
my $doc = XML::LibXML::Document->new();
{
# 1. creation
my $foo = "foobar";
my $textnode = $doc->createTextNode($foo);
# TEST
ok( $textnode, 'creation 1');
# TEST
is( $textnode->nodeName(), '#text', 'creation 2');
# TEST
is( $textnode->nodeValue(), $foo, 'creation 3',);
{
# Test for https://rt.cpan.org/Ticket/Display.html?id=112470
my @attributes = $textnode->attributes();
# TEST
is_deeply(
(\@attributes),
[],
'::Text->attributes() returns an empty list in list context (RT#112470)',
);
}
# 2. substring
my $tnstr = $textnode->substringData( 1,2 );
# TEST
is( $tnstr , "oo", 'substring 1');
$tnstr = $textnode->substringData( 0,3 );
# TEST
is( $tnstr , "foo", 'substring 2');
# TEST
is( $textnode->nodeValue(), $foo, 'substring - text node unchanged' );
# 3. Expansion
$textnode->appendData( $foo );
# TEST
is( $textnode->nodeValue(), $foo . $foo, 'expansion 1');
$textnode->insertData( 6, "FOO" );
# TEST
is( $textnode->nodeValue(), $foo."FOO".$foo, 'expansion 2' );
$textnode->setData( $foo );
$textnode->insertData( 6, "FOO" );
# TEST
is( $textnode->nodeValue(), $foo."FOO", 'expansion 3');
$textnode->setData( $foo );
$textnode->insertData( 3, "" );
# TEST
is( $textnode->nodeValue(), $foo, 'Empty insertion does not change value');
# 4. Removal
$textnode->deleteData( 1,2 );
# TEST
is( $textnode->nodeValue(), "fbar", 'Removal 1');
$textnode->setData( $foo );
$textnode->deleteData( 1,10 );
# TEST
is( $textnode->nodeValue(), "f", 'Removal 2');
$textnode->setData( $foo );
$textnode->deleteData( 10,1 );
# TEST
is( $textnode->nodeValue(), $foo, 'Removal 3');
$textnode->deleteData( 1,0 );
# TEST
is( $textnode->nodeValue(), $foo, 'Removal 4');
$textnode->deleteData( 0,0 );
# TEST
is( $textnode->nodeValue(), $foo, 'Removal 5');
$textnode->deleteData( 0,2 );
# TEST
is( $textnode->nodeValue(), "obar", 'Removal 6');
# 5. Replacement
$textnode->setData( "test" );
$textnode->replaceData( 1,2, "phish" );
# TEST
is( $textnode->nodeValue(), "tphisht", 'Replacement 1');
$textnode->setData( "test" );
$textnode->replaceData( 1,4, "phish" );
# TEST
is( $textnode->nodeValue(), "tphish", 'Replacement 2');
$textnode->setData( "test" );
$textnode->replaceData( 1,0, "phish" );
# TEST
is( $textnode->nodeValue(), "tphishest", 'Replacement 3');
# 6. XML::LibXML features
$textnode->setData( "test" );
$textnode->replaceDataString( "es", "new" );
# TEST
is( $textnode->nodeValue(), "tnewt", 'replaceDataString() 1');
$textnode->replaceDataRegEx( 'n(.)w', '$1s' );
# TEST
is( $textnode->nodeValue(), "test", 'replaceDataRegEx() 2');
$textnode->setData( "blue phish, white phish, no phish" );
$textnode->replaceDataRegEx( 'phish', 'test' );
# TEST
is( $textnode->nodeValue(), "blue test, white phish, no phish",
'replaceDataRegEx 3',);
# replace them all!
$textnode->replaceDataRegEx( 'phish', 'test', 'g' );
# TEST
is( $textnode->nodeValue(), "blue test, white test, no test",
'replaceDataRegEx g',);
# check if special chars are encoded properly
$textnode->setData( "te?st" );
$textnode->replaceDataString( "e?s", 'ne\w' );
# TEST
is( $textnode->nodeValue(), 'tne\wt', ' TODO : Add test name' );
# check if "." is encoded properly
$textnode->setData( "h.thrt");
$textnode->replaceDataString( "h.t", 'new', 1 );
# TEST
is( $textnode->nodeValue(), 'newhrt', ' TODO : Add test name' );
# check if deleteDataString does not delete dots.
$textnode->setData( 'hitpit' );
$textnode->deleteDataString( 'h.t' );
# TEST
is( $textnode->nodeValue(), 'hitpit', ' TODO : Add test name' );
# check if deleteDataString works
$textnode->setData( 'hitpithit' );
$textnode->deleteDataString( 'hit' );
# TEST
is( $textnode->nodeValue(), 'pithit', ' TODO : Add test name' );
# check if deleteDataString all works
$textnode->setData( 'hitpithit' );
$textnode->deleteDataString( 'hit', 1 );
# TEST
is( $textnode->nodeValue(), 'pit', ' TODO : Add test name' );
# check if entities don't get translated
$textnode->setData(q(foo&bar));
# TEST
is ( $textnode->getData(), q(foo&bar), ' TODO : Add test name' );
}
{
# UTF-8 tests
my $test_str = "te\xDFt";
# Latin1 strings still fail.
utf8::upgrade($test_str);
# 1. creation
my $textnode = $doc->createTextNode($test_str);
# TEST
ok( $textnode, 'UTF-8 creation 1');
# TEST
is( $textnode->nodeValue(), $test_str, 'UTF-8 creation 2',);
my $foo_str = "\x{0444}oo\x{0431}ar";
$textnode = $doc->createTextNode($foo_str);
# TEST
ok( $textnode, 'UTF-8 creation 3');
# TEST
is( $textnode->nodeValue(), $foo_str, 'UTF-8 creation 4',);
# 2. substring
my $tnstr = $textnode->substringData( 1,2 );
# TEST
is( $tnstr , "oo", 'UTF-8 substring 1');
$tnstr = $textnode->substringData( 0,3 );
# TEST
is( $tnstr , "\x{0444}oo", 'UTF-8 substring 2');
# 3. Expansion
$textnode->appendData( $foo_str );
# TEST
is( $textnode->nodeValue(), $foo_str . $foo_str, 'UTF-8 expansion 1');
my $ins_str = "\x{0424}OO";
$textnode->insertData( 6, $ins_str );
# TEST
is( $textnode->nodeValue(), $foo_str.$ins_str.$foo_str,
'UTF-8 expansion 2' );
$textnode->setData( $foo_str );
$textnode->insertData( 6, $ins_str );
# TEST
is( $textnode->nodeValue(), $foo_str.$ins_str, 'UTF-8 expansion 3');
# 4. Removal
$textnode->setData( $foo_str );
$textnode->deleteData( 1,3 );
# TEST
is( $textnode->nodeValue(), "\x{0444}ar", 'UTF-8 Removal 1');
$textnode->setData( $foo_str );
$textnode->deleteData( 1,10 );
# TEST
is( $textnode->nodeValue(), "\x{0444}", 'UTF-8 Removal 2');
$textnode->setData( $foo_str );
$textnode->deleteData( 6,100 );
# TEST
is( $textnode->nodeValue(), $foo_str, 'UTF-8 Removal 3');
# 5. Replacement
my $phish_str = "ph\x{2160}sh";
$textnode->setData( $test_str );
$textnode->replaceData( 1,2, $phish_str );
# TEST
is( $textnode->nodeValue(), "t".$phish_str."t", 'UTF-8 Replacement 1');
$textnode->setData( $test_str );
$textnode->replaceData( 1,4, $phish_str );
# TEST
is( $textnode->nodeValue(), "t".$phish_str, 'UTF-8 Replacement 2');
$textnode->setData( $test_str );
$textnode->replaceData( 1,0, $phish_str );
# TEST
is( $textnode->nodeValue(), "t".$phish_str."e\xDFt",
'UTF-8 Replacement 3');
# 6. XML::LibXML features
$textnode->setData( $test_str );
my $new_str = "n\x{1D522}w";
$textnode->replaceDataString( "e\xDF", $new_str );
# TEST
is( $textnode->nodeValue(), "t".$new_str."t",
'UTF-8 replaceDataString() 1');
$textnode->replaceDataRegEx( 'n(.)w', '$1s' );
# TEST
is( $textnode->nodeValue(), "t\x{1D522}st", 'UTF-8 replaceDataRegEx() 2');
$textnode->setData( "blue $phish_str, white $phish_str, no $phish_str" );
$textnode->replaceDataRegEx( $phish_str, $test_str );
# TEST
is( $textnode->nodeValue(),
"blue $test_str, white $phish_str, no $phish_str",
'UTF-8 replaceDataRegEx 3',);
# replace them all!
$textnode->replaceDataRegEx( $phish_str, $test_str, 'g' );
# TEST
is( $textnode->nodeValue(),
"blue $test_str, white $test_str, no $test_str",
'UTF-8 replaceDataRegEx g',);
# check if deleteDataString works
my $hit_str = "hi\x{1D54B}";
my $pit_str = "\x{2119}it";
$textnode->setData( "$hit_str$pit_str$hit_str" );
$textnode->deleteDataString( $hit_str );
# TEST
is( $textnode->nodeValue(), "$pit_str$hit_str", 'UTF-8 deleteDataString 1' );
# check if deleteDataString all works
$textnode->setData( "$hit_str$pit_str$hit_str" );
$textnode->deleteDataString( $hit_str, 1 );
# TEST
is( $textnode->nodeValue(), $pit_str, 'UTF-8 deleteDataString 2' );
}
{
# standalone test
my $node = XML::LibXML::Text->new("foo");
# TEST
ok($node, ' TODO : Add test name');
# TEST
is($node->nodeValue, "foo", ' TODO : Add test name' );
}
{
# CDATA node name test
my $node = XML::LibXML::CDATASection->new("test");
# TEST
is( $node->string_value(), "test", ' TODO : Add test name' );
# TEST
is( $node->nodeName(), "#cdata-section", ' TODO : Add test name' );
}
{
# Comment node name test
my $node = XML::LibXML::Comment->new("test");
# TEST
is( $node->string_value(), "test", ' TODO : Add test name' );
# TEST
is( $node->nodeName(), "#comment", ' TODO : Add test name' );
}
{
# Document node name test
my $node = XML::LibXML::Document->new();
# TEST
is( $node->nodeName(), "#document", ' TODO : Add test name' );
}
{
# Document fragment node name test
my $node = XML::LibXML::DocumentFragment->new();
# TEST
is( $node->nodeName(), "#document-fragment", ' TODO : Add test name' );
}