---
name: "XML::Compile::Tester"
section: "3pm"
platform: "linux"
package: "libxml-compile-tester-perl"
version: "0.91-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/XML::Compile::Tester"
---

# XML::Compile::Tester(3pm)

support XML::Compile related regression testing

## NAME

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

## INHERITANCE

```
 XML::Compile::Tester
   is a Exporter
```

## 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);
```

## 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.

## FUNCTIONS

### Reader checks

- **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, `"check_values"` is true, and `"include_namespaces"` is false.  These values can be overruled using **set\_compile\_defaults()**, 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);
  ```

- **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');
  ```

### Writer checks

- **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, `"check_values"` and `"use_default_namespace"` are true, and `"include_namespaces"` is false.  These values can be overruled using **set\_compile\_defaults()**, 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);
  ```

- **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');
  ```

- **writer\_test**( $writer, $data, \[$doc\] )

  Run the test with a compiled `$writer`, which was created with **writer\_create()**. When no `$doc` (XML::LibXML::Document object) was specified, then one will be created for you.

### Check templates

- **templ\_perl**($schema, $type, %options)

  - **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);
  ```

### Helpers

- **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
  ```

- **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
  ```

- **set\_default\_namespace**($testns)

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

## SEE ALSO

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

## 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 *http://dev.perl.org/licenses/*
