The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -T

# This checks to make sure the module is actually  there  and  that
# %HTML::DOM::Interface has something in it.  It also makes sure  that
# changes made since its introduction are not undone. Is there any way to
# test this  fully  without  simply  copying  the  entire  hash  into  this
# test file?

use lib 't';
use strict; use warnings;

use HTML::DOM::Interface;

# -------------------------#
use tests 1; # is the hash there (and does it have somthing in it?)

ok(%HTML::DOM::Interface);

# -------------------------#
# Make sure all constants are defined
BEGIN {
    $::constests = 0;
    for (values %HTML::DOM::Interface) {
	if (ref && $$_{_constants}) { $::constests += @{$$_{_constants}} }
    }
}
use tests $::constests;

for (values %HTML::DOM::Interface) {
 for(@{ref || next; $$_{_constants} || next}) {
  ok defined eval, "$_ is defined";
 }
}

# -------------------------#
use tests 4; # changes made in 0.009

ok !exists $HTML::DOM::Interface{Document}, '{Document} doesn\'t exist';
ok exists $HTML::DOM::Interface{HTMLDocument}{createComment},
	"{HTMLDocument}{createComment} exists";
is $HTML::DOM::Interface{HTMLDocument}{_isa}, "Node",
	'HTMLDocument isa Node';
ok exists $HTML::DOM::Interface{'HTML::DOM::Collection::Options'},
	'HTML::DOM::Collection::Options is there';

# -------------------------#
use tests 25; # changes made in 0.010

ok exists $HTML::DOM::Interface{$_}, $_ for map "HTML::DOM::Element::$_",
	qw/ Table Caption TableColumn TableSection TR TableCell
	    FrameSet Frame IFrame /;
ok exists $HTML::DOM::Interface{HTMLFormElement}{reset},
	'form reset';

# DOM 2 core stuff
{
	my $constants = join ' ', '',
		@{ $HTML::DOM::Interface{DOMException}{_constants} }, '';
	like $constants, qr/ HTML::DOM::Exception::$_ /, $_,
		for qw/ INVALID_STATE_ERR SYNTAX_ERR
		       INVALID_MODIFICATION_ERR NAMESPACE_ERR
		     INVALID_ACCESS_ERR /;
}
ok exists $HTML::DOM::Interface{Attr}{ownerElement}, 'Attr->ownerElement';
ok exists $HTML::DOM::Interface{HTMLDocument}{importNode},
	'Document->importNode';
ok exists $HTML::DOM::Interface{Node}{$_}, "Node->$_"
	for qw/ isSupported hasAttributes normalize /;
ok !exists $HTML::DOM::Interface{HTMLElement}{normalize},
	"Element->normalize is gone";
ok exists $HTML::DOM::Interface{HTMLElement}{hasAttribute},
	"Element->hasAttribute";

# DOM 2 view stuff
ok exists $HTML::DOM::Interface{HTMLDocument}{defaultView}, 'defaultView';
ok exists $HTML::DOM::Interface{AbstractView};

# CSS stuff
ok exists $HTML::DOM::Interface{HTMLElement}{style}, 'style';

# -------------------------#
use tests 3; # changes made in 0.011

ok exists $HTML::DOM::Interface{HTMLLinkElement}{sheet},
	'HTMLLinkElement sheet';
ok exists $HTML::DOM::Interface{HTMLStyleElement}{sheet},
	'HTMLStyleElement sheet';
ok exists $HTML::DOM::Interface{HTMLDocument}{styleSheets}, 'styleSheets';

# -------------------------#
use tests 2; # changes made in 0.012

is $HTML::DOM::Interface{'HTML::DOM::Collection::Options'},
	'HTMLOptionsCollection',
	'HTML::DOM::Collection::Options maps to HTMLOptionsCollection';
ok exists $HTML::DOM::Interface{HTMLOptionsCollection},
	'HTMLOptionsCollection';

# -------------------------#
use tests 11; # changes made in 0.013

ok $HTML::DOM::Interface{CharacterData}{length} & &
	HTML::DOM::Interface::UTF16, 'length16';
ok $HTML::DOM::Interface{CharacterData}{substringData} & &
	HTML::DOM::Interface::UTF16, 'substringData16';
ok $HTML::DOM::Interface{CharacterData}{insertData} & &
	HTML::DOM::Interface::UTF16, 'insertData16';
ok $HTML::DOM::Interface{CharacterData}{deleteData} & &
	HTML::DOM::Interface::UTF16, 'deleteData16';
ok $HTML::DOM::Interface{CharacterData}{replaceData} & &
	HTML::DOM::Interface::UTF16, 'replaceData16';
ok $HTML::DOM::Interface{Text}{splitText} & &
	HTML::DOM::Interface::UTF16, 'splitText16';
ok !($HTML::DOM::Interface{HTMLOptionElement}{index} &
	&HTML::DOM::Interface::READONLY),
	'HTMLOptionElement.index is not read-only';
ok !($HTML::DOM::Interface{HTMLInputElement}{type} &
	&HTML::DOM::Interface::READONLY),
	'HTMLInputElement.type is not read-only';
ok exists $HTML::DOM::Interface{HTMLFrameElement}{contentDocument},
		'HTMLFrameElement contentDocument';
ok exists $HTML::DOM::Interface{HTMLIFrameElement}{contentDocument},
		'HTMLIFrameElement contentDocument';
ok exists $HTML::DOM::Interface{DOMException}{code}, 'DOMException.code';

# -------------------------#
use tests 5; # changes made in 0.016
ok exists $HTML::DOM::Interface{MouseEvent},'MouseEvent';
ok exists $HTML::DOM::Interface{UIEvent},'UIEvent';
ok exists $HTML::DOM::Interface{MutationEvent},'MutationEvent';
ok $HTML::DOM::Interface{HTMLOptionsCollection}{_hash},
	'options doess hash';
ok $HTML::DOM::Interface{HTMLOptionsCollection}{_array},
	'options doess ary';

# -------------------------#
use tests 3; # changes made in 0.018
ok exists $HTML::DOM::Interface{HTMLDocument}{innerHTML},'doc->innerHTML';
ok exists $HTML::DOM::Interface{HTMLElement}{innerHTML},'elem->innerHTML';
ok exists $HTML::DOM::Interface{HTMLDocument}{location},'doc->location';

# -------------------------#
use tests 6; # changes made in 0.019
ok exists $HTML::DOM::Interface{EventTarget}, 'EventTarget';
is $HTML::DOM::Interface{Node}{_isa}, 'EventTarget','Node isa EventTarget';
ok !exists $HTML::DOM::Interface{Node}{addEventListener},
	'Node no longer has addEventListener';
ok !exists $HTML::DOM::Interface{Node}{dispatchEvent},
	'Node no longer has dispatchEvent';
ok !exists $HTML::DOM::Interface{Node}{removeEventListener},
	'Node no longer has removeEventListener';
is $HTML::DOM::Interface{'HTML::DOM::EventTarget'}, 'EventTarget',
	'HTML::DOM::EventTarget';

# -------------------------#
use tests 34; # changes made in 0.019
for(qw(
	abort beforeunload blur change click contextmenu dblclick drag
	dragend dragenter dragleave dragover dragstart drop error focus
	hashchange keydown keypress keyup load message mousedown
	mousemove mouseout mouseover mouseup mousewheel resize scroll
	select storage submit unload 
)) {
	ok exists $HTML::DOM::Interface{EventTarget}{"on$_"}, "on$_";
}

# -------------------------#
use tests 16; # changes made in 0.030
ok exists $HTML::DOM::Interface{HTMLDocument}{lastModified};
ok exists $HTML::DOM::Interface{AbstractView}{getComputedStyle};
ok exists $HTML::DOM::Interface{HTMLAnchorElement}{$_} for
 qw/ hash host hostname pathname port protocol search /;
ok exists $HTML::DOM::Interface{HTMLAreaElement}{$_} for
 qw/ hash host hostname pathname port protocol search /;

# -------------------------#
use tests 3; # changes made in 0.032
ok exists $HTML::DOM::Interface{HTMLElement}{$_}
 for qw/ insertAdjacentHTML insertAdjacentElement /;
ok eval 'HTML::DOM::Interface->import("UTF16");1', 'UTF16 is exportable';

# -------------------------#
use tests 2; # changes made in 0.033
ok exists $HTML::DOM::Interface{$_}{contentWindow}, "$_->contentWindow",
 for qw/ HTMLFrameElement HTMLIFrameElement /;

# -------------------------#
use tests 2; # changes made in 0.036
ok !exists $HTML::DOM::Interface{"HTML::DOM::TreeBuilder"};
ok exists $HTML::DOM::Interface{"HTMLElement"}{innerText}, 'innerText';

# -------------------------#
use tests 2; # changes made in 0.037
ok exists $HTML::DOM::Interface{"HTMLDocument"}{getElementsByClassName};
ok exists $HTML::DOM::Interface{"HTMLElement"}{getElementsByClassName};

# -------------------------#
use tests 2; # changes made in 0.054
ok $HTML::DOM::Interface{"NamedNodeMap"}{_hash};
ok $HTML::DOM::Interface{"NamedNodeMap"}{_array};