=encoding utf8

=head1 NAME

XML::Compile::Tester - support XML::Compile related regression testing

=head1 INHERITANCE

 XML::Compile::Tester
   is a Exporter

=head1 SYNOPSIS

 use XML::Compile::Tester;

 # default additional compile flags, avoids repetition
 set_compile_defaults(validation => 0, @other_opts);
 set_compile_defaults();  # reset

 # set default namespace, such that $type only needs to use local
 my $ns     = 'some-schemas-targetNamespace';
 my $type   = pack_type($ns, 'localName'); # X::C::Util
 set_default_namespace($ns);
 my $type   = 'localName'; # now implicit in $ns

 my $reader = reader_create($schema, "my reader", $type, @opts);
 my $data   = $reader->($xml);  # $xml is string, filename, node

 my $writer = writer_create($schema, "my writer", $type, @opts);
 my $xml    = $writer->($doc, $data);
 my $xml    = writer_test($writer, $data);

 my $rerror = reader_error($schema, $type, $xml);
 my $werror = writer_error($schema, $type, $data);

 my $output = templ_xml($schema, $type, @options);
 my $output = templ_perl($schema, $type, @options);

=head1 DESCRIPTION

The XML::Compile module suite has extensive regression testing.  Probably,
you want to do regression testing as well.  This module provide functions
which simplify writing tests for XML::Compile related distributions.

=head1 FUNCTIONS

=head2 Reader checks

=over 4

=item B<reader_create>($schema, $comment, $type, %options)

Create a reader for $type.  One test is created, reporting
success or failure of the creation.

Of course, XML::Compile::Schema subroutine compile is being called, with some
options.  By default, C<check_values> is true, and C<include_namespaces>
is false.  These values can be overruled using L<set_compile_defaults()|XML::Compile::Tester/"Helpers">,
and with the %options parameter list.

example: reader_create

 my $type   = pack_type('namespace', 'localName');
 my $reader = reader_create($schema, 'my test', $type
   , check_occurs => 0, @other_options);

 my $data   = $reader->($xml);
 is_deeply($data, $expected, 'my test');  # Test::More
 cmp_deeply($data, $expected, 'my test'); # Test::Deep

 # alternative for $type:
 set_default_namespace('namespace');
 my $reader = reader_create($schema, 'my test', 'localName'
   , check_occurs => 0, @other_options);

=item B<reader_error>($schema, $type, $xml)

Parsing the $xml to interpret the $type should return an error.  The
error text is returned.

example: reader_error

 my $error = reader_error($schema, $type, <<_XML);
 <test1>...</test1>
 _XML

 is($error, 'error text', 'my test');
 like($error, qr/error pattern/, 'my test');

=back

=head2 Writer checks

=over 4

=item B<writer_create>($schema, $comment, $type, %options)

Create a writer for $type.  One test (in the Test::More sense) is created,
reporting success or failure of the creation.

Of course, XML::Compile::Schema subroutine compile is being called, with some
options.  By default, C<check_values> and C<use_default_namespace> are true,
and C<include_namespaces> is false.  These values can be overruled using
L<set_compile_defaults()|XML::Compile::Tester/"Helpers">, and with the %options parameter list.

example: writer_create

 set_default_namespace('namespace');
 my $writer = writer_create($schema, 'my test', 'test1');

 my $doc    = XML::LibXML::Document->new('1.0', 'UTF-8');
 my $xml    = $writer->($doc, $data);
 compare_xml($xml, <<_EXPECTED, 'my test');
   <test1>...</test1>
 _EXPECTED

 # implicit creation of $doc
 my $xml    = writer_test($writer, $data);

=item B<writer_error>($schema, $type, $data)

Translating the Perl $data into the XML type should return a validation
error, which is returned.

example: writer_error

 my $error = writer_error($schema, $type, $data);

 is($error, 'error text', 'my test');
 like($error, qr/error pattern/, 'my test');

=item B<writer_test>( $writer, $data, [$doc] )

Run the test with a compiled $writer, which was created with L<writer_create()|XML::Compile::Tester/"Writer checks">.
When no $doc (XML::LibXML::Document object) was specified, then one will
be created for you.

=back

=head2 Check templates

=over 4

=item B<templ_perl>($schema, $type, %options)

=item B<templ_xml>($schema, $type, %options)

Create an example template for $type, as XML message.
The %options are passed to XML::Compile::Schema subroutine template.

example: templ_xml

 my $out = templ_xml($schema, $type, show => 'ALL');
 is($out, $expected);

=back

=head2 Helpers

=over 4

=item B<compare_xml>( $created, $expected, [$comment] )

Compare the $created XML (either a string or an XML::LibXML::Element)
with the $expected string.  Both sources are stripped from layout before
comparing.

In a future release, this algorithm will get improved to compare
the parsed XML node trees, not the strings.

example: compare_xml

 compare_xml($xml, <<_XML, 'my test');
   <test1>...</test1>
 _XML

=item B<set_compile_defaults>(%options)

Each call to create a reader or writer (also indirectly) with
XML::Compile::Schema subroutine compile will get these %options passed, on top
(and overruling) the usual settings.

example: 

 # defaults for XML::Compile::Schema::compile()
 set_compile_defaults(include_namespaces => 1, validate => 0
   , sloppy_intergers => 1, sloppy_floats => 1);

 set_compile_defaults();   # reset

=item B<set_default_namespace>($testns)

Defined which namespace to use when a relative (only localName) type
is provided.  By default, this is C<undef> (an error when used)

=back

=head1 SEE ALSO

This module is part of XML-Compile-Tester distribution version 0.91,
built on May 11, 2018. Website: F<http://perl.overmeer.net/CPAN/>

=head1 LICENSE

Copyrights 2008-2018 by [Mark Overmeer <markov@cpan.org>]. For other contributors see ChangeLog.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
See F<http://dev.perl.org/licenses/>