diff options
Diffstat (limited to 'xsd/tests/cxx/parser')
145 files changed, 10298 insertions, 0 deletions
| diff --git a/xsd/tests/cxx/parser/built-in/driver.cxx b/xsd/tests/cxx/parser/built-in/driver.cxx new file mode 100644 index 0000000..11cae41 --- /dev/null +++ b/xsd/tests/cxx/parser/built-in/driver.cxx @@ -0,0 +1,531 @@ +// file      : tests/cxx/parser/built-in/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test built-in type parsing. +// + +#include <string> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; +using xml_schema::ro_string; + +struct any_type_pimpl: xml_schema::any_type_pimpl +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  _start_any_element (ro_string const&,  +                      ro_string const& n, +		      ro_string const*) +  { +    cout << "  start any element '" << n << "'" << endl; +  } + +  virtual void +  _end_any_element (ro_string const&, ro_string const& n) +  { +    cout << "  end any element '" << n << "'" << endl; +  } + +  virtual void +  _any_attribute (ro_string const&, +                  ro_string const& n, +		  ro_string const& v) +  { +    cout << "  any attribute " << n << " = '" << v << "'" << endl; +  } + +  virtual void +  _any_characters (ro_string const& s) +  { +    cout << "  any text: '" << s << "'" << endl; +  } + +  virtual void +  post_any_type () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct any_simple_type_pimpl: xml_schema::any_simple_type_pimpl +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  _any_characters (ro_string const& s) +  { +    cout << "  any text: '" << s << "'" << endl; +  } + +  virtual void +  post_any_simple_type () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +  virtual void +  boolean (bool v) +  { +    cout << v << endl; +  } + +  virtual void +  byte (signed char v) +  { +    cout << short (v) << endl; +  } + +  virtual void +  unsigned_byte (unsigned char v) +  { +    cout << (unsigned short) (v) << endl; +  } + +  virtual void +  short_ (short v) +  { +    cout << v << endl; +  } + +  virtual void +  unsigned_short (unsigned short v) +  { +    cout << v << endl; +  } + +  virtual void +  int_ (int v) +  { +    cout << v << endl; +  } + +  virtual void +  unsigned_int (unsigned int v) +  { +    cout << v << endl; +  } + +  virtual void +  long_ (long long v) +  { +    cout << v << endl; +  } + +  virtual void +  unsigned_long (unsigned long long v) +  { +    cout << v << endl; +  } + +  virtual void +  integer (long long v) +  { +    cout << v << endl; +  } + +  virtual void +  negative_integer (long long v) +  { +    cout << v << endl; +  } + + +  virtual void +  non_positive_integer (long long v) +  { +    cout << v << endl; +  } + + +  virtual void +  positive_integer (unsigned long long v) +  { +    cout << v << endl; +  } + +  virtual void +  non_negative_integer (unsigned long long v) +  { +    cout << v << endl; +  } + +  virtual void +  float_ (float v) +  { +    cout << v << endl; +  } + +  virtual void +  double_ (double v) +  { +    cout << v << endl; +  } + +  virtual void +  decimal (double v) +  { +    cout << v << endl; +  } + +  virtual void +  string (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  normalized_string (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  token (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  name (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  nmtoken (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  nmtokens (xml_schema::string_sequence const& s) +  { +    cout << "'"; + +    for (xml_schema::string_sequence::const_iterator i (s.begin ()); +         i != s.end (); ++i) +      cout << *i << " "; + +    cout << "'" << endl; +  } + +  virtual void +  ncname (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  id (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  idref (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  idrefs (xml_schema::string_sequence const& s) +  { +    cout << "'"; + +    for (xml_schema::string_sequence::const_iterator i (s.begin ()); +         i != s.end (); ++i) +      cout << *i << " "; + +    cout << "'" << endl; +  } + +  virtual void +  language (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  uri (std::string const& v) +  { +    cout << "'" << v << "'" << endl; +  } + +  virtual void +  qname (xml_schema::qname const& v) +  { +    cout << "'" << v.prefix () << ":" << v.name () << "'" << endl; +  } + +  virtual void +  base64_binary (std::auto_ptr<xml_schema::buffer> v) +  { +    std::string tmp (v->data (), v->size ()); +    cout << "'" << tmp << "'" << endl; +  } + +  virtual void +  hex_binary (std::auto_ptr<xml_schema::buffer> v) +  { +    std::string tmp (v->data (), v->size ()); +    cout << "'" << tmp << "'" << endl; +  } + +  virtual void +  gday (xml_schema::gday const& v) +  { +    cout << v.day (); + +    if (v.zone_present ()) +      cout << (v.zone_hours () < 0 ? "" : "+") << v.zone_hours () +           << ':' << v.zone_minutes (); + +    cout << endl; +  } + +  virtual void +  gmonth (xml_schema::gmonth const& v) +  { +    cout << v.month (); + +    if (v.zone_present ()) +      cout << (v.zone_hours () < 0 ? "" : "+") << v.zone_hours () +           << ':' << v.zone_minutes (); + +    cout << endl; +  } + +  virtual void +  gyear (xml_schema::gyear const& v) +  { +    cout << v.year (); + +    if (v.zone_present ()) +      cout << (v.zone_hours () < 0 ? "" : "+") << v.zone_hours () +           << ':' << v.zone_minutes (); + +    cout << endl; +  } + +  virtual void +  gmonth_day (xml_schema::gmonth_day const& v) +  { +    cout << v.month () << '-' << v.day (); + +    if (v.zone_present ()) +      cout << (v.zone_hours () < 0 ? "" : "+") << v.zone_hours () +           << ':' << v.zone_minutes (); + +    cout << endl; +  } + +  virtual void +  gyear_month (xml_schema::gyear_month const& v) +  { +    cout << v.year () << '-' << v.month (); + +    if (v.zone_present ()) +      cout << (v.zone_hours () < 0 ? "" : "+") << v.zone_hours () +           << ':' << v.zone_minutes (); + +    cout << endl; +  } + +  virtual void +  date (xml_schema::date const& v) +  { +    cout << v.year () << '-' << v.month () << '-' << v.day (); + +    if (v.zone_present ()) +      cout << (v.zone_hours () < 0 ? "" : "+") << v.zone_hours () +           << ':' << v.zone_minutes (); + +    cout << endl; +  } + +  virtual void +  time (xml_schema::time const& v) +  { +    cout << v.hours () << ':' << v.minutes () << ':' << v.seconds (); + +    if (v.zone_present ()) +      cout << (v.zone_hours () < 0 ? "" : "+") << v.zone_hours () +           << ':' << v.zone_minutes (); + +    cout << endl; +  } + +  virtual void +  date_time (xml_schema::date_time const& v) +  { +    cout << v.year () << '-' << v.month () << '-' << v.day () << 'T' +         << v.hours () << ':' << v.minutes () << ':' << v.seconds (); + +    if (v.zone_present ()) +      cout << (v.zone_hours () < 0 ? "" : "+") << v.zone_hours () +           << ':' << v.zone_minutes (); + +    cout << endl; +  } + +  virtual void +  duration (xml_schema::duration const& v) +  { +    cout << (v.negative () ? "-" : "") << 'P' +         << v.years () << 'Y' +         << v.months () << 'M' +         << v.days () << 'D' +         << 'T' +         << v.hours () << 'H' +         << v.minutes () << 'M' +         << v.seconds () << 'S' +         << endl; +  } +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    any_type_pimpl any_type_p; +    any_simple_type_pimpl any_simple_type_p; + +    xml_schema::boolean_pimpl boolean_p; + +    xml_schema::byte_pimpl byte_p; +    xml_schema::unsigned_byte_pimpl unsigned_byte_p; +    xml_schema::short_pimpl short_p; +    xml_schema::unsigned_short_pimpl unsigned_short_p; +    xml_schema::int_pimpl int_p; +    xml_schema::unsigned_int_pimpl unsigned_int_p; +    xml_schema::long_pimpl long_p; +    xml_schema::unsigned_long_pimpl unsigned_long_p; + +    xml_schema::integer_pimpl integer_p; +    xml_schema::negative_integer_pimpl negative_integer_p; +    xml_schema::non_positive_integer_pimpl non_positive_integer_p; +    xml_schema::positive_integer_pimpl positive_integer_p; +    xml_schema::non_negative_integer_pimpl non_negative_integer_p; + +    xml_schema::float_pimpl float_p; +    xml_schema::double_pimpl double_p; +    xml_schema::decimal_pimpl decimal_p; + +    xml_schema::string_pimpl string_p; +    xml_schema::normalized_string_pimpl normalized_string_p; +    xml_schema::token_pimpl token_p; +    xml_schema::name_pimpl name_p; +    xml_schema::nmtoken_pimpl nmtoken_p; +    xml_schema::nmtokens_pimpl nmtokens_p; +    xml_schema::ncname_pimpl ncname_p; +    xml_schema::id_pimpl id_p; +    xml_schema::idref_pimpl idref_p; +    xml_schema::idrefs_pimpl idrefs_p; + +    xml_schema::language_pimpl language_p; +    xml_schema::uri_pimpl uri_p; +    xml_schema::qname_pimpl qname_p; + +    xml_schema::base64_binary_pimpl base64_binary_p; +    xml_schema::hex_binary_pimpl hex_binary_p; + +    xml_schema::gday_pimpl gday_p; +    xml_schema::gmonth_pimpl gmonth_p; +    xml_schema::gyear_pimpl gyear_p; +    xml_schema::gmonth_day_pimpl gmonth_day_p; +    xml_schema::gyear_month_pimpl gyear_month_p; +    xml_schema::date_pimpl date_p; +    xml_schema::time_pimpl time_p; +    xml_schema::date_time_pimpl date_time_p; +    xml_schema::duration_pimpl duration_p; + +    type_pimpl type_p; + +    type_p.parsers (any_type_p, +                    any_simple_type_p, +                    boolean_p, +                    byte_p, +                    unsigned_byte_p, +                    short_p, +                    unsigned_short_p, +                    int_p, +                    unsigned_int_p, +                    long_p, +                    unsigned_long_p, +                    integer_p, +                    negative_integer_p, +                    non_positive_integer_p, +                    positive_integer_p, +                    non_negative_integer_p, +                    float_p, +                    double_p, +                    decimal_p, +                    string_p, +                    normalized_string_p, +                    token_p, +                    name_p, +                    nmtoken_p, +                    nmtokens_p, +                    ncname_p, +                    id_p, +                    idref_p, +                    idrefs_p, +                    language_p, +                    uri_p, +                    qname_p, +                    base64_binary_p, +                    hex_binary_p, +                    gday_p, +                    gmonth_p, +                    gyear_p, +                    gmonth_day_p, +                    gyear_month_p, +                    date_p, +                    time_p, +                    date_time_p, +                    duration_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    type_p.pre (); +    doc_p.parse (argv[1]); +    type_p.post_type (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (std::ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/built-in/makefile b/xsd/tests/cxx/parser/built-in/makefile new file mode 100644 index 0000000..3164219 --- /dev/null +++ b/xsd/tests/cxx/parser/built-in/makefile @@ -0,0 +1,79 @@ +# file      : tests/cxx/parser/built-in/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                 \ +  $(addsuffix .cxx.clean,$(obj))                            \ +  $(addsuffix .cxx.clean,$(dep))                            \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/built-in/output b/xsd/tests/cxx/parser/built-in/output new file mode 100644 index 0000000..756abcd --- /dev/null +++ b/xsd/tests/cxx/parser/built-in/output @@ -0,0 +1,164 @@ +{ +  any attribute x = 'x' +  any text: ' +    ' +  start any element 'a' +  any text: 'a' +  end any element 'a' +  any text: ' +    ' +  start any element 'any-type' +  any attribute x = 'xxx' +  any text: 'aaa' +  start any element 'a' +  any text: 'bbb' +  end any element 'a' +  any text: 'ccc' +  end any element 'any-type' +  any text: ' +  ' +} + +{ +  any text: '123abc' +} + +1 +0 +1 +0 +0 +127 +-128 +123 +0 +255 +123 +0 +32767 +-32768 +-12345 +0 +65535 +12345 +0 +2147483647 +-2147483648 +-1234567890 +0 +4294967295 +1234567890 +0 +9223372036854775807 +-9223372036854775808 +-1234567890123456789 +0 +18446744073709551615 +12345678901234567890 +0 +2147483647 +-2147483648 +-1234567890 +-2147483648 +-1234567890 +0 +-2147483648 +-1234567890 +4294967295 +1234567890 +0 +4294967295 +1234567890 +0 +0 +-0 +inf +-inf +nan +123.567 +123.567 +-1.23567e+07 +-4.5e-06 +0 +0 +-0 +inf +-inf +nan +123.567 +123.567 +-1.23567e+07 +-4.5e-06 +0 +0 +-0 +123.567 +123.567 +-123.567 +'string space +newline +  ' +' string space newline    ' +'string space newline' +'as123:345-.abs' +'1as123:345-.abs' +'abc 123 ' +'as123_345-.abs' +'as123_345-.abs' +'abc' +'a123' +'as123_345-.abs' +'abc a123 ' +'x' +'en' +'en-us' +'one-two-three-four44-seven77-eight888' +'' +'relative' +'#id' +'http://www.example.com/foo#bar' +':schemaLocation' +'xsi:schemaLocation' +'12345abcjk' +'a' +'ab' +'abc' +'' +'12345abcjk' +12+12:0 +1 +31 +15+0:0 +15-14:0 +10+12:0 +1 +12+0:0 +2007+12:0 +1 +-20000+0:0 +10-28+12:0 +12-31 +1-1+0:0 +2007-12+12:0 +-2007-10 +20007-10+0:0 +-20007-1 +2007-12-26+12:0 +-2007-10-15 +20007-12-31+0:0 +-20007-1-1 +12:46:23.456+12:0 +12:13:14 +12:13:14+0:0 +2007-12-26T12:13:14.123+12:0 +-2007-10-15T12:13:14 +20007-12-31T12:13:14+0:0 +-20007-1-1T12:13:14 +-P2007Y13M32DT25H61M61.123S +P1Y0M0DT0H0M0S +P0Y1M0DT0H0M0S +P0Y0M1DT0H0M0S +P0Y0M0DT1H0M0S +P0Y0M0DT0H1M0S +P0Y0M0DT0H0M1.1S +P1Y0M0DT0H0M1S diff --git a/xsd/tests/cxx/parser/built-in/test.xml b/xsd/tests/cxx/parser/built-in/test.xml new file mode 100644 index 0000000..8d9332a --- /dev/null +++ b/xsd/tests/cxx/parser/built-in/test.xml @@ -0,0 +1,199 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <any-type x="x"> +    <a>a</a> +    <any-type x="xxx">aaa<a>bbb</a>ccc</any-type> +  </any-type> + +  <any-simple-type>123abc</any-simple-type> + +  <boolean>1</boolean> +  <boolean> 0 </boolean> +  <boolean>true</boolean> +  <boolean> false </boolean> + +  <byte>0</byte> +  <byte>+127</byte> +  <byte>-128</byte> +  <byte> 123 </byte> + +  <unsigned-byte>0</unsigned-byte> +  <unsigned-byte>255</unsigned-byte> +  <unsigned-byte> 123 </unsigned-byte> + +  <short>0</short> +  <short>+32767</short> +  <short>-32768</short> +  <short> -12345 </short> + +  <unsigned-short>0</unsigned-short> +  <unsigned-short>65535</unsigned-short> +  <unsigned-short> 12345 </unsigned-short> + +  <int>0</int> +  <int>+2147483647</int> +  <int>-2147483648</int> +  <int> -1234567890 </int> + +  <unsigned-int>0</unsigned-int> +  <unsigned-int>4294967295</unsigned-int> +  <unsigned-int> 1234567890 </unsigned-int> + +  <long>0</long> +  <long>+9223372036854775807</long> +  <long>-9223372036854775808</long> +  <long> -1234567890123456789 </long> + +  <unsigned-long>0</unsigned-long> +  <unsigned-long>18446744073709551615</unsigned-long> +  <unsigned-long> 12345678901234567890 </unsigned-long> + +  <integer>0</integer> +  <integer> +2147483647 </integer> +  <integer>-02147483648</integer> +  <integer>-1234567890</integer> + +  <negative-integer>-02147483648</negative-integer> +  <negative-integer> -1234567890 </negative-integer> + +  <non-positive-integer>0</non-positive-integer> +  <non-positive-integer>-02147483648</non-positive-integer> +  <non-positive-integer> -1234567890 </non-positive-integer> + +  <positive-integer>4294967295</positive-integer> +  <positive-integer> +01234567890 </positive-integer> + +  <non-negative-integer>0</non-negative-integer> +  <non-negative-integer>4294967295</non-negative-integer> +  <non-negative-integer> +01234567890 </non-negative-integer> + +  <float>0</float> +  <float>+0</float> +  <float>-0</float> +  <float>INF</float> +  <float>-INF</float> +  <float>NaN</float> +  <float> 123.567 </float> +  <float>+123.567</float> +  <float>-123.567e5</float> +  <float>-.45E-5</float> + +  <double>0</double> +  <double>+0</double> +  <double>-0</double> +  <double>INF</double> +  <double>-INF</double> +  <double>NaN</double> +  <double> 123.567 </double> +  <double>+123.567</double> +  <double>-123.567e5</double> +  <double>-.45E-5</double> + +  <decimal>0</decimal> +  <decimal>+0</decimal> +  <decimal>-0</decimal> +  <decimal> 123.567 </decimal> +  <decimal>+123.567</decimal> +  <decimal>-123.567</decimal> + +  <string>string space +newline +  </string> + +  <normalized-string> string space +newline + +  </normalized-string> + +  <token> string space +newline + +  </token> + +  <name> as123:345-.abs </name> + +  <nmtoken> 1as123:345-.abs </nmtoken> + +  <nmtokens> abc   123 </nmtokens> + +  <ncname> as123_345-.abs </ncname> + +  <id> as123_345-.abs </id> +  <id> abc </id> +  <id> a123 </id> + +  <idref> as123_345-.abs </idref> + +  <idrefs> abc   a123 </idrefs> + +  <language> x </language> +  <language> en </language> +  <language> en-us </language> +  <language>one-two-three-four44-seven77-eight888</language> + +  <uri>   </uri> +  <uri> relative </uri> +  <uri> #id </uri> +  <uri> http://www.example.com/foo#bar </uri> + +  <qname>schemaLocation</qname> +  <qname>xsi:schemaLocation</qname> + +  <base64_binary> MTIzND +                  VhYmNqaw = =</base64_binary> +  <base64_binary>YQ==</base64_binary> +  <base64_binary>YWI=</base64_binary> +  <base64_binary>YWJj</base64_binary> + +  <hex_binary>  </hex_binary> +  <hex_binary> 31323334356162636a6b   </hex_binary> + +  <gday>  ---12+12:00  </gday> +  <gday>---01</gday> +  <gday>---31</gday> +  <gday>---15Z</gday> +  <gday>---15-14:00</gday> + +  <gmonth>  --10+12:00  </gmonth> +  <gmonth>--01</gmonth> +  <gmonth>--12Z</gmonth> + +  <gyear>  2007+12:00  </gyear> +  <gyear>0001</gyear> +  <gyear>-20000Z</gyear> + +  <gmonth_day>  --10-28+12:00  </gmonth_day> +  <gmonth_day>--12-31</gmonth_day> +  <gmonth_day>--01-01Z</gmonth_day> + +  <gyear_month>  2007-12+12:00  </gyear_month> +  <gyear_month>-2007-10</gyear_month> +  <gyear_month>20007-10Z</gyear_month> +  <gyear_month>-20007-01</gyear_month> + +  <date>  2007-12-26+12:00  </date> +  <date>-2007-10-15</date> +  <date>20007-12-31Z</date> +  <date>-20007-01-01</date> + +  <time>  12:46:23.456+12:00  </time> +  <time>12:13:14</time> +  <time>12:13:14Z</time> + +  <date_time>  2007-12-26T12:13:14.123+12:00  </date_time> +  <date_time>-2007-10-15T12:13:14</date_time> +  <date_time>20007-12-31T12:13:14Z</date_time> +  <date_time>-20007-01-01T12:13:14</date_time> + +  <duration>  -P2007Y13M32DT25H61M61.123S  </duration> +  <duration>P1Y</duration> +  <duration>P1M</duration> +  <duration>P1D</duration> +  <duration>PT1H</duration> +  <duration>PT1M</duration> +  <duration>PT1.1S</duration> +  <duration>P1YT1S</duration> + +</t:root> diff --git a/xsd/tests/cxx/parser/built-in/test.xsd b/xsd/tests/cxx/parser/built-in/test.xsd new file mode 100644 index 0000000..9c00eb4 --- /dev/null +++ b/xsd/tests/cxx/parser/built-in/test.xsd @@ -0,0 +1,63 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="type"> +    <sequence> +      <element name="any-type" type="anyType" maxOccurs="unbounded"/> +      <element name="any-simple-type" type="anySimpleType" maxOccurs="unbounded"/> + +      <element name="boolean" type="boolean" maxOccurs="unbounded"/> + +      <element name="byte" type="byte" maxOccurs="unbounded"/> +      <element name="unsigned-byte" type="unsignedByte" maxOccurs="unbounded"/> +      <element name="short" type="short" maxOccurs="unbounded"/> +      <element name="unsigned-short" type="unsignedShort" maxOccurs="unbounded"/> +      <element name="int" type="int" maxOccurs="unbounded"/> +      <element name="unsigned-int" type="unsignedInt" maxOccurs="unbounded"/> +      <element name="long" type="long" maxOccurs="unbounded"/> +      <element name="unsigned-long" type="unsignedLong" maxOccurs="unbounded"/> + +      <element name="integer" type="integer" maxOccurs="unbounded"/> +      <element name="negative-integer" type="negativeInteger" maxOccurs="unbounded"/> +      <element name="non-positive-integer" type="nonPositiveInteger" maxOccurs="unbounded"/> +      <element name="positive-integer" type="positiveInteger" maxOccurs="unbounded"/> +      <element name="non-negative-integer" type="nonNegativeInteger" maxOccurs="unbounded"/> + +      <element name="float" type="float" maxOccurs="unbounded"/> +      <element name="double" type="double" maxOccurs="unbounded"/> +      <element name="decimal" type="decimal" maxOccurs="unbounded"/> + +      <element name="string" type="string" maxOccurs="unbounded"/> +      <element name="normalized-string" type="normalizedString" maxOccurs="unbounded"/> +      <element name="token" type="token" maxOccurs="unbounded"/> +      <element name="name" type="Name" maxOccurs="unbounded"/> +      <element name="nmtoken" type="NMTOKEN" maxOccurs="unbounded"/> +      <element name="nmtokens" type="NMTOKENS" maxOccurs="unbounded"/> +      <element name="ncname" type="NCName" maxOccurs="unbounded"/> +      <element name="id" type="ID" maxOccurs="unbounded"/> +      <element name="idref" type="IDREF" maxOccurs="unbounded"/> +      <element name="idrefs" type="IDREFS" maxOccurs="unbounded"/> + +      <element name="language" type="language" maxOccurs="unbounded"/> +      <element name="uri" type="anyURI" maxOccurs="unbounded"/> +      <element name="qname" type="QName" maxOccurs="unbounded"/> + +      <element name="base64_binary" type="base64Binary" maxOccurs="unbounded"/> +      <element name="hex_binary" type="hexBinary" maxOccurs="unbounded"/> + +      <element name="gday" type="gDay" maxOccurs="unbounded"/> +      <element name="gmonth" type="gMonth" maxOccurs="unbounded"/> +      <element name="gyear" type="gYear" maxOccurs="unbounded"/> +      <element name="gmonth_day" type="gMonthDay" maxOccurs="unbounded"/> +      <element name="gyear_month" type="gYearMonth" maxOccurs="unbounded"/> +      <element name="date" type="date" maxOccurs="unbounded"/> +      <element name="time" type="time" maxOccurs="unbounded"/> +      <element name="date_time" type="dateTime" maxOccurs="unbounded"/> +      <element name="duration" type="duration" maxOccurs="unbounded"/> + +    </sequence> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/enumeration/driver.cxx b/xsd/tests/cxx/parser/enumeration/driver.cxx new file mode 100644 index 0000000..fdb0134 --- /dev/null +++ b/xsd/tests/cxx/parser/enumeration/driver.cxx @@ -0,0 +1,83 @@ +// file      : tests/cxx/parser/enumeration/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test xsd:enumeration parsing. +// + +#include <string> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace xml_schema; + +struct digit_pimpl: test::digit_pskel, int_pimpl +{ +}; + +struct gender_pimpl: test::gender_pskel, string_pimpl +{ +  virtual ::gender +  post_gender () +  { +    std::string str (post_string ()); + +    if (str == "male") +      return male; +    else +      return female; +  } +}; + +struct type_pimpl: test::type_pskel +{ +  virtual void +  digit (int i) +  { +    cout << i << endl; +  } + +  virtual void +  gender (::gender g) +  { +    cout << g << endl; +  } +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    digit_pimpl digit_p; +    gender_pimpl gender_p; +    type_pimpl type_p; + +    type_p.parsers (digit_p, gender_p); + +    document doc_p (type_p, "test", "root"); + +    type_p.pre (); +    doc_p.parse (argv[1]); +    type_p.post_type (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (std::ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/enumeration/gender.hxx b/xsd/tests/cxx/parser/enumeration/gender.hxx new file mode 100644 index 0000000..8e5dbfd --- /dev/null +++ b/xsd/tests/cxx/parser/enumeration/gender.hxx @@ -0,0 +1,15 @@ +// file      : tests/cxx/parser/enumeration/gender.hxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef GENDER_HXX +#define GENDER_HXX + +enum gender +{ +  male, +  female +}; + +#endif // GENDER_HXX diff --git a/xsd/tests/cxx/parser/enumeration/makefile b/xsd/tests/cxx/parser/enumeration/makefile new file mode 100644 index 0000000..5776cbe --- /dev/null +++ b/xsd/tests/cxx/parser/enumeration/makefile @@ -0,0 +1,80 @@ +# file      : tests/cxx/parser/enumeration/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --type-map $(src_base)/test.map +$(gen): $(out_root)/xsd/xsd $(src_base)/test.map + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                 \ +  $(addsuffix .cxx.clean,$(obj))                            \ +  $(addsuffix .cxx.clean,$(dep))                            \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/enumeration/output b/xsd/tests/cxx/parser/enumeration/output new file mode 100644 index 0000000..16db301 --- /dev/null +++ b/xsd/tests/cxx/parser/enumeration/output @@ -0,0 +1,3 @@ +1 +0 +1 diff --git a/xsd/tests/cxx/parser/enumeration/test.map b/xsd/tests/cxx/parser/enumeration/test.map new file mode 100644 index 0000000..f8868d6 --- /dev/null +++ b/xsd/tests/cxx/parser/enumeration/test.map @@ -0,0 +1,7 @@ +namespace test +{ +  include "gender.hxx"; + +  digit int int; +  gender ::gender ::gender; +} diff --git a/xsd/tests/cxx/parser/enumeration/test.xml b/xsd/tests/cxx/parser/enumeration/test.xml new file mode 100644 index 0000000..a6fa893 --- /dev/null +++ b/xsd/tests/cxx/parser/enumeration/test.xml @@ -0,0 +1,10 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <digit>1</digit> + +  <gender>male</gender> +  <gender>female</gender> + +</t:root> diff --git a/xsd/tests/cxx/parser/enumeration/test.xsd b/xsd/tests/cxx/parser/enumeration/test.xsd new file mode 100644 index 0000000..ded3a18 --- /dev/null +++ b/xsd/tests/cxx/parser/enumeration/test.xsd @@ -0,0 +1,35 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <simpleType name="digit"> +    <restriction base="int"> +      <enumeration value="0"/> +      <enumeration value="1"/> +      <enumeration value="2"/> +      <enumeration value="3"/> +      <enumeration value="4"/> +      <enumeration value="5"/> +      <enumeration value="6"/> +      <enumeration value="7"/> +      <enumeration value="8"/> +      <enumeration value="9"/> +    </restriction> +  </simpleType> + +  <simpleType name="gender"> +    <restriction base="string"> +      <enumeration value="male"/> +      <enumeration value="female"/> +    </restriction> +  </simpleType> + +  <complexType name="type"> +    <choice maxOccurs="unbounded"> +      <element name="digit" type="t:digit"/> +      <element name="gender" type="t:gender"/> +    </choice> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/generated-impl/makefile b/xsd/tests/cxx/parser/generated-impl/makefile new file mode 100644 index 0000000..3733590 --- /dev/null +++ b/xsd/tests/cxx/parser/generated-impl/makefile @@ -0,0 +1,90 @@ +# file      : tests/cxx/parser/generated-impl/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +xsd := test.xsd + +obj := $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.o) $(xsd:.xsd=-pimpl.o) $(xsd:.xsd=-driver.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/$(xsd:.xsd=-driver) +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx)  \ +        $(xsd:.xsd=-pskel.ixx)  \ +        $(xsd:.xsd=-pskel.cxx)  \ +        $(xsd:.xsd=-pimpl.hxx)  \ +	$(xsd:.xsd=-pimpl.cxx)  \ +	$(xsd:.xsd=-driver.cxx) + +gen  := $(addprefix $(out_base)/,$(genf)) + + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-print-impl --generate-test-driver \ +--force-overwrite +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                  \ +  $(addsuffix .cxx.clean,$(obj))                             \ +  $(addsuffix .cxx.clean,$(dep))                             \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pimpl.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := $(xsd:.xsd=-driver) $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) + +xsd_parser_impl_suffix := -pimpl +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/generated-impl/output b/xsd/tests/cxx/parser/generated-impl/output new file mode 100644 index 0000000..7c58647 --- /dev/null +++ b/xsd/tests/cxx/parser/generated-impl/output @@ -0,0 +1,122 @@ +gender: male +foo: foo +gender: male +int: 0 +int: 1 +int: 2 +int: 3 +foo: foo +int: 3 +int: 2 +int: 1 +int: 0 +union: 9 +foo: foo +union: string +x: x +a: aaa +x: x +y: y +a: aaa +b: bbb +boolean: 1 +boolean: 0 +boolean: 1 +boolean: 0 +byte: 0 +byte: 123 +byte: -123 +unsigned-byte: 0 +unsigned-byte: 123 +short: 0 +short: -1234 +short: 1234 +unsigned-short: 0 +unsigned-short: 1234 +int: 0 +int: -12345 +int: 12345 +unsigned-int: 0 +unsigned-int: 12345 +long: 0 +long: -123456 +long: 123456 +unsigned-long: 0 +unsigned-long: 123456 +integer: 0 +integer: -123456 +integer: 123456 +negative-integer: -123456 +non-positive-integer: 0 +non-positive-integer: -123456 +positive-integer: 123456 +non-negative-integer: 0 +non-negative-integer: 123456 +float: 0 +float: 1.123 +float: -1.123 +double: 0 +double: 1.1234 +double: -1.1234 +decimal: 0 +decimal: 1.1234 +decimal: -1.1234 +string: string space newline +normalized-string: string space newline +token: string space newline +name: as123:345-.abs +nmtoken: 1as123:345-.abs +nmtokens: abc 123 +ncname: as123_345-.abs +id: abc +id: a123 +idref: abc +idrefs: abc a123 +language: en +language: en-us +uri: http://www.example.com/foo#bar +qname: schemaLocation +qname: xsi:schemaLocation +base64_binary: 10 bytes +base64_binary: 1 bytes +base64_binary: 2 bytes +base64_binary: 3 bytes +hex_binary: 0 bytes +hex_binary: 10 bytes +gday: ---12+12:0 +gday: ---1 +gday: ---31 +gday: ---15+0:0 +gday: ---15-14:0 +gmonth: --10+12:0 +gmonth: --1 +gmonth: --12+0:0 +gyear: 2007+12:0 +gyear: 1 +gyear: -20000+0:0 +gmonth_day: --10-28+12:0 +gmonth_day: --12-31 +gmonth_day: --1-1+0:0 +gyear_month: 2007-12+12:0 +gyear_month: -2007-10 +gyear_month: 20007-10+0:0 +gyear_month: -20007-1 +date: 2007-12-26+12:0 +date: -2007-10-15 +date: 20007-12-31+0:0 +date: -20007-1-1 +time: 12:46:23.456+12:0 +time: 12:13:14 +time: 12:13:14+0:0 +date_time: 2007-12-26T12:13:14.123+12:0 +date_time: -2007-10-15T12:13:14 +date_time: 20007-12-31T12:13:14+0:0 +date_time: -20007-1-1T12:13:14 +duration: -P2007Y13M32DT25H61M61.123S +duration: P1Y0M0DT0H0M0S +duration: P0Y1M0DT0H0M0S +duration: P0Y0M1DT0H0M0S +duration: P0Y0M0DT1H0M0S +duration: P0Y0M0DT0H1M0S +duration: P0Y0M0DT0H0M1.1S +duration: P1Y0M0DT0H0M1S diff --git a/xsd/tests/cxx/parser/generated-impl/test.xml b/xsd/tests/cxx/parser/generated-impl/test.xml new file mode 100644 index 0000000..2f29a39 --- /dev/null +++ b/xsd/tests/cxx/parser/generated-impl/test.xml @@ -0,0 +1,168 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <gender>male</gender> +  <gender-extension foo="foo">male</gender-extension> + +  <list>0 1 2 3</list> +  <list-extension foo="foo">3 2 1 0</list-extension> + +  <union>9</union> +  <union-extension foo="foo">string</union-extension> + +  <complex x="x"> +    <a>aaa</a> +  </complex> + +  <complex-extension x="x" y="y"> +    <a>aaa</a> +    <b>bbb</b> +  </complex-extension> + +  <any-type>aaa<b>bbb</b>ccc</any-type> +  <any-simple-type>abc123</any-simple-type> + +  <boolean>1</boolean> +  <boolean> 0 </boolean> +  <boolean>true</boolean> +  <boolean> false </boolean> + +  <byte>0</byte> +  <byte>123</byte> +  <byte>-123</byte> + +  <unsigned-byte>0</unsigned-byte> +  <unsigned-byte>123</unsigned-byte> + +  <short>0</short> +  <short>-1234</short> +  <short>1234</short> + +  <unsigned-short>0</unsigned-short> +  <unsigned-short>1234</unsigned-short> + +  <int>0</int> +  <int>-12345</int> +  <int>12345</int> + +  <unsigned-int>0</unsigned-int> +  <unsigned-int>12345</unsigned-int> + +  <long>0</long> +  <long>-123456</long> +  <long>123456</long> + +  <unsigned-long>0</unsigned-long> +  <unsigned-long>123456</unsigned-long> + +  <integer>0</integer> +  <integer>-123456</integer> +  <integer>123456</integer> + +  <negative-integer>-123456</negative-integer> + +  <non-positive-integer>0</non-positive-integer> +  <non-positive-integer>-123456</non-positive-integer> + +  <positive-integer>123456</positive-integer> + +  <non-negative-integer>0</non-negative-integer> +  <non-negative-integer>123456</non-negative-integer> + +  <float>0</float> +  <float>1.123</float> +  <float>-1.123</float> + +  <double>0</double> +  <double>1.1234</double> +  <double>-1.1234</double> + +  <decimal>0</decimal> +  <decimal>1.1234</decimal> +  <decimal>-1.1234</decimal> + +  <string>string space newline</string> + +  <normalized-string>string space newline</normalized-string> + +  <token> string space newline</token> + +  <name>as123:345-.abs</name> + +  <nmtoken>1as123:345-.abs</nmtoken> + +  <nmtokens>abc 123</nmtokens> + +  <ncname>as123_345-.abs</ncname> + +  <id>abc</id> +  <id>a123</id> + +  <idref>abc</idref> + +  <idrefs>abc a123</idrefs> + +  <language>en</language> +  <language>en-us</language> + +  <uri>http://www.example.com/foo#bar</uri> + +  <qname>schemaLocation</qname> +  <qname>xsi:schemaLocation</qname> + +  <base64_binary>MTIzNDVhYmNqaw==</base64_binary> +  <base64_binary>YQ==</base64_binary> +  <base64_binary>YWI=</base64_binary> +  <base64_binary>YWJj</base64_binary> + +  <hex_binary></hex_binary> +  <hex_binary>31323334356162636a6b</hex_binary> + +  <gday>---12+12:00</gday> +  <gday>---01</gday> +  <gday>---31</gday> +  <gday>---15Z</gday> +  <gday>---15-14:00</gday> + +  <gmonth>--10+12:00</gmonth> +  <gmonth>--01</gmonth> +  <gmonth>--12Z</gmonth> + +  <gyear>2007+12:00</gyear> +  <gyear>0001</gyear> +  <gyear>-20000Z</gyear> + +  <gmonth_day>--10-28+12:00</gmonth_day> +  <gmonth_day>--12-31</gmonth_day> +  <gmonth_day>--01-01Z</gmonth_day> + +  <gyear_month>2007-12+12:00</gyear_month> +  <gyear_month>-2007-10</gyear_month> +  <gyear_month>20007-10Z</gyear_month> +  <gyear_month>-20007-01</gyear_month> + +  <date>2007-12-26+12:00</date> +  <date>-2007-10-15</date> +  <date>20007-12-31Z</date> +  <date>-20007-01-01</date> + +  <time>12:46:23.456+12:00</time> +  <time>12:13:14</time> +  <time>12:13:14Z</time> + +  <date_time>2007-12-26T12:13:14.123+12:00</date_time> +  <date_time>-2007-10-15T12:13:14</date_time> +  <date_time>20007-12-31T12:13:14Z</date_time> +  <date_time>-20007-01-01T12:13:14</date_time> + +  <duration>-P2007Y13M32DT25H61M61.123S</duration> +  <duration>P1Y</duration> +  <duration>P1M</duration> +  <duration>P1D</duration> +  <duration>PT1H</duration> +  <duration>PT1M</duration> +  <duration>PT1.1S</duration> +  <duration>P1YT1S</duration> + +</t:root> diff --git a/xsd/tests/cxx/parser/generated-impl/test.xsd b/xsd/tests/cxx/parser/generated-impl/test.xsd new file mode 100644 index 0000000..7bc8f23 --- /dev/null +++ b/xsd/tests/cxx/parser/generated-impl/test.xsd @@ -0,0 +1,142 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <!-- enum --> + +  <simpleType name="gender"> +    <restriction base="string"> +      <enumeration value="male"/> +      <enumeration value="female"/> +    </restriction> +  </simpleType> + +  <complexType name="gender-extension"> +    <simpleContent> +      <extension base="t:gender"> +        <attribute name="foo" type="string"/> +      </extension> +    </simpleContent> +  </complexType> + +  <!-- list --> + +  <simpleType name="list"> +    <list itemType="int"/> +  </simpleType> + +  <complexType name="list-extension"> +    <simpleContent> +      <extension base="t:list"> +        <attribute name="foo" type="string"/> +      </extension> +    </simpleContent> +  </complexType> + +  <!-- union --> + +  <simpleType name="union"> +    <union memberTypes="int string"/> +  </simpleType> + +  <complexType name="union-extension"> +    <simpleContent> +      <extension base="t:union"> +        <attribute name="foo" type="string"/> +      </extension> +    </simpleContent> +  </complexType> + +  <!-- complex --> + +  <complexType name="complex"> +    <sequence> +      <element name="a" type="string"/> +    </sequence> +    <attribute name="x" type="string"/> +  </complexType> + +  <complexType name="complex-extension"> +    <complexContent> +      <extension base="t:complex"> +        <sequence> +          <element name="b" type="string"/> +        </sequence> +        <attribute name="y" type="string"/> +      </extension> +    </complexContent> +  </complexType> + +  <complexType name="type"> +    <sequence> +      <element name="gender" type="t:gender"/> +      <element name="gender-extension" type="t:gender-extension"/> + +      <element name="list" type="t:list"/> +      <element name="list-extension" type="t:list-extension"/> + +      <element name="union" type="t:union"/> +      <element name="union-extension" type="t:union-extension"/> + +      <element name="complex" type="t:complex"/> +      <element name="complex-extension" type="t:complex-extension"/> + +      <!-- Built-in types. --> + +      <element name="any-type" type="anyType" maxOccurs="unbounded"/> +      <element name="any-simple-type" type="anySimpleType" maxOccurs="unbounded"/> + +      <element name="boolean" type="boolean" maxOccurs="unbounded"/> + +      <element name="byte" type="byte" maxOccurs="unbounded"/> +      <element name="unsigned-byte" type="unsignedByte" maxOccurs="unbounded"/> +      <element name="short" type="short" maxOccurs="unbounded"/> +      <element name="unsigned-short" type="unsignedShort" maxOccurs="unbounded"/> +      <element name="int" type="int" maxOccurs="unbounded"/> +      <element name="unsigned-int" type="unsignedInt" maxOccurs="unbounded"/> +      <element name="long" type="long" maxOccurs="unbounded"/> +      <element name="unsigned-long" type="unsignedLong" maxOccurs="unbounded"/> + +      <element name="integer" type="integer" maxOccurs="unbounded"/> +      <element name="negative-integer" type="negativeInteger" maxOccurs="unbounded"/> +      <element name="non-positive-integer" type="nonPositiveInteger" maxOccurs="unbounded"/> +      <element name="positive-integer" type="positiveInteger" maxOccurs="unbounded"/> +      <element name="non-negative-integer" type="nonNegativeInteger" maxOccurs="unbounded"/> + +      <element name="float" type="float" maxOccurs="unbounded"/> +      <element name="double" type="double" maxOccurs="unbounded"/> +      <element name="decimal" type="decimal" maxOccurs="unbounded"/> + +      <element name="string" type="string" maxOccurs="unbounded"/> +      <element name="normalized-string" type="normalizedString" maxOccurs="unbounded"/> +      <element name="token" type="token" maxOccurs="unbounded"/> +      <element name="name" type="Name" maxOccurs="unbounded"/> +      <element name="nmtoken" type="NMTOKEN" maxOccurs="unbounded"/> +      <element name="nmtokens" type="NMTOKENS" maxOccurs="unbounded"/> +      <element name="ncname" type="NCName" maxOccurs="unbounded"/> +      <element name="id" type="ID" maxOccurs="unbounded"/> +      <element name="idref" type="IDREF" maxOccurs="unbounded"/> +      <element name="idrefs" type="IDREFS" maxOccurs="unbounded"/> + +      <element name="language" type="language" maxOccurs="unbounded"/> +      <element name="uri" type="anyURI" maxOccurs="unbounded"/> +      <element name="qname" type="QName" maxOccurs="unbounded"/> + +      <element name="base64_binary" type="base64Binary" maxOccurs="unbounded"/> +      <element name="hex_binary" type="hexBinary" maxOccurs="unbounded"/> + +      <element name="gday" type="gDay" maxOccurs="unbounded"/> +      <element name="gmonth" type="gMonth" maxOccurs="unbounded"/> +      <element name="gyear" type="gYear" maxOccurs="unbounded"/> +      <element name="gmonth_day" type="gMonthDay" maxOccurs="unbounded"/> +      <element name="gyear_month" type="gYearMonth" maxOccurs="unbounded"/> +      <element name="date" type="date" maxOccurs="unbounded"/> +      <element name="time" type="time" maxOccurs="unbounded"/> +      <element name="date_time" type="dateTime" maxOccurs="unbounded"/> +      <element name="duration" type="duration" maxOccurs="unbounded"/> + +    </sequence> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/list/driver.cxx b/xsd/tests/cxx/parser/list/driver.cxx new file mode 100644 index 0000000..d4ac4e2 --- /dev/null +++ b/xsd/tests/cxx/parser/list/driver.cxx @@ -0,0 +1,107 @@ +// file      : tests/cxx/parser/list/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test xsd:list parsing. +// + +#include <string> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; + +struct string_list_pimpl: string_list_pskel +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  item (string const& v) +  { +    cout << "  '" << v << "'" << endl; +  } + +  virtual void +  post_string_list () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct string_list_lang_pimpl: string_list_lang_pskel +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  item (string const& v) +  { +    cout << "  '" << v << "'" << endl; +  } + +  virtual void +  lang (string const& v) +  { +    cout << "  lang: '" << v << "'" << endl; +  } + +  virtual void +  post_string_list_lang () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    string_list_pimpl string_list_p; +    string_list_lang_pimpl string_list_lang_p; +    type_pimpl type_p; + +    string_list_p.parsers (string_p); +    string_list_lang_p.parsers (string_p, string_p); +    type_p.parsers (string_list_p, string_list_lang_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    type_p.pre (); +    doc_p.parse (argv[1]); +    type_p.post_type (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/list/makefile b/xsd/tests/cxx/parser/list/makefile new file mode 100644 index 0000000..deacdb9 --- /dev/null +++ b/xsd/tests/cxx/parser/list/makefile @@ -0,0 +1,79 @@ +# file      : tests/cxx/parser/list/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                 \ +  $(addsuffix .cxx.clean,$(obj))                            \ +  $(addsuffix .cxx.clean,$(dep))                            \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/list/output b/xsd/tests/cxx/parser/list/output new file mode 100644 index 0000000..3642c4d --- /dev/null +++ b/xsd/tests/cxx/parser/list/output @@ -0,0 +1,26 @@ +{ +} + +{ +} + +{ +} + +{ +  'one' +} + +{ +  'one' +  'two' +  'three' +} + +{ +  lang: 'en' +  'one' +  'two' +  'three' +} + diff --git a/xsd/tests/cxx/parser/list/test.xml b/xsd/tests/cxx/parser/list/test.xml new file mode 100644 index 0000000..52229db --- /dev/null +++ b/xsd/tests/cxx/parser/list/test.xml @@ -0,0 +1,25 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <string-list/> + +  <string-list> </string-list> + +  <string-list> + +  </string-list> + +  <string-list>one</string-list> + +  <string-list> +    one two +    three +  </string-list> + +  <string-list-lang lang="en"> +    one two +    three +  </string-list-lang> + +</t:root> diff --git a/xsd/tests/cxx/parser/list/test.xsd b/xsd/tests/cxx/parser/list/test.xsd new file mode 100644 index 0000000..79bd084 --- /dev/null +++ b/xsd/tests/cxx/parser/list/test.xsd @@ -0,0 +1,25 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <simpleType name="string-list"> +    <list itemType="string"/> +  </simpleType> + +  <complexType name="string-list-lang"> +    <simpleContent> +      <extension base="t:string-list"> +        <attribute name="lang" type="string"/> +      </extension> +    </simpleContent> +  </complexType> + +  <complexType name="type"> +    <choice maxOccurs="unbounded"> +      <element name="string-list" type="t:string-list"/> +      <element name="string-list-lang" type="t:string-list-lang"/> +    </choice> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/makefile b/xsd/tests/cxx/parser/makefile new file mode 100644 index 0000000..935345b --- /dev/null +++ b/xsd/tests/cxx/parser/makefile @@ -0,0 +1,20 @@ +# file      : tests/cxx/parser/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../build/bootstrap.make + +tests := built-in enumeration generated-impl list recursive \ +name-clash/inheritance polymorphism test-template validation \ +union + +default   := $(out_base)/ +test      := $(out_base)/.test +clean     := $(out_base)/.clean + +$(default): $(addprefix $(out_base)/,$(addsuffix /,$(tests))) +$(test): $(addprefix $(out_base)/,$(addsuffix /.test,$(tests))) +$(clean): $(addprefix $(out_base)/,$(addsuffix /.clean,$(tests))) + +$(foreach t,$(tests),$(call import,$(src_base)/$t/makefile)) diff --git a/xsd/tests/cxx/parser/name-clash/inheritance/driver.cxx b/xsd/tests/cxx/parser/name-clash/inheritance/driver.cxx new file mode 100644 index 0000000..81adb7f --- /dev/null +++ b/xsd/tests/cxx/parser/name-clash/inheritance/driver.cxx @@ -0,0 +1,64 @@ +// file      : tests/cxx/parser/name-clash/inheritance/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test for name clashes across inheritance hierarchy. +// + +#include <string> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; + +struct derived_pimpl: derived_pskel +{ +  virtual void +  e (string const& v) +  { +    cout << "e: " << v << endl; +  } + +  virtual void +  e1 (string const& v) +  { +    cout << "e1: " << v << endl; +  } +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    derived_pimpl derived_p; + +    derived_p.parsers (string_p, string_p); + +    xml_schema::document doc_p (derived_p, "test", "root"); + +    derived_p.pre (); +    doc_p.parse (argv[1]); +    derived_p.post_derived (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (std::ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/name-clash/inheritance/makefile b/xsd/tests/cxx/parser/name-clash/inheritance/makefile new file mode 100644 index 0000000..359b7e4 --- /dev/null +++ b/xsd/tests/cxx/parser/name-clash/inheritance/makefile @@ -0,0 +1,80 @@ +# file      : tests/cxx/parser/name-clash/inheritance/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                 \ +  $(addsuffix .cxx.clean,$(obj))                            \ +  $(addsuffix .cxx.clean,$(dep))                            \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/name-clash/inheritance/output b/xsd/tests/cxx/parser/name-clash/inheritance/output new file mode 100644 index 0000000..4efd51b --- /dev/null +++ b/xsd/tests/cxx/parser/name-clash/inheritance/output @@ -0,0 +1,2 @@ +e: e +e1: e1 diff --git a/xsd/tests/cxx/parser/name-clash/inheritance/test.xml b/xsd/tests/cxx/parser/name-clash/inheritance/test.xml new file mode 100644 index 0000000..8c17101 --- /dev/null +++ b/xsd/tests/cxx/parser/name-clash/inheritance/test.xml @@ -0,0 +1,8 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> +		 +  <e>e</e> +  <e>e1</e> +     +</t:root> diff --git a/xsd/tests/cxx/parser/name-clash/inheritance/test.xsd b/xsd/tests/cxx/parser/name-clash/inheritance/test.xsd new file mode 100644 index 0000000..62a782e --- /dev/null +++ b/xsd/tests/cxx/parser/name-clash/inheritance/test.xsd @@ -0,0 +1,22 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="base"> +    <sequence> +      <element name="e" type="string"/> +    </sequence> +  </complexType> + +  <complexType name="derived"> +    <complexContent> +      <extension base="t:base"> +        <sequence> +          <element name="e" type="string"/> +        </sequence> +      </extension> +    </complexContent> +  </complexType> + +  <element name="root" type="t:derived"/> + +</schema> diff --git a/xsd/tests/cxx/parser/polymorphism/makefile b/xsd/tests/cxx/parser/polymorphism/makefile new file mode 100644 index 0000000..42ac5c3 --- /dev/null +++ b/xsd/tests/cxx/parser/polymorphism/makefile @@ -0,0 +1,18 @@ +# file      : tests/cxx/parser/polymorphism/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +tests := same-type + +default   := $(out_base)/ +test      := $(out_base)/.test +clean     := $(out_base)/.clean + +$(default): $(addprefix $(out_base)/,$(addsuffix /,$(tests))) +$(test): $(addprefix $(out_base)/,$(addsuffix /.test,$(tests))) +$(clean): $(addprefix $(out_base)/,$(addsuffix /.clean,$(tests))) + +$(foreach t,$(tests),$(call import,$(src_base)/$t/makefile)) diff --git a/xsd/tests/cxx/parser/polymorphism/same-type/driver.cxx b/xsd/tests/cxx/parser/polymorphism/same-type/driver.cxx new file mode 100644 index 0000000..ea50776 --- /dev/null +++ b/xsd/tests/cxx/parser/polymorphism/same-type/driver.cxx @@ -0,0 +1,64 @@ +// file      : tests/cxx/parser/polymorphism/same-type/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test substitution group and xsi:type that don't change the type. +// + +#include <string> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; + +struct base_pimpl: base_pskel +{ +  virtual void +  a (string const& v) +  { +    cout << v << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    base_pimpl base_p; +    type_pimpl type_p; + +    base_p.parsers (string_p); +    type_p.parsers (base_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    type_p.pre (); +    doc_p.parse (argv[1]); +    type_p.post_type (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (std::ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/polymorphism/same-type/makefile b/xsd/tests/cxx/parser/polymorphism/same-type/makefile new file mode 100644 index 0000000..c357597 --- /dev/null +++ b/xsd/tests/cxx/parser/polymorphism/same-type/makefile @@ -0,0 +1,80 @@ +# file      : tests/cxx/parser/polymorphism/same-type/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-polymorphic +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                 \ +  $(addsuffix .cxx.clean,$(obj))                            \ +  $(addsuffix .cxx.clean,$(dep))                            \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/polymorphism/same-type/output b/xsd/tests/cxx/parser/polymorphism/same-type/output new file mode 100644 index 0000000..d418277 --- /dev/null +++ b/xsd/tests/cxx/parser/polymorphism/same-type/output @@ -0,0 +1,4 @@ +a1 +a2 +a3 +a4 diff --git a/xsd/tests/cxx/parser/polymorphism/same-type/test.xml b/xsd/tests/cxx/parser/polymorphism/same-type/test.xml new file mode 100644 index 0000000..f8b6d1e --- /dev/null +++ b/xsd/tests/cxx/parser/polymorphism/same-type/test.xml @@ -0,0 +1,10 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <t:base><a>a1</a></t:base> +  <t:derived><a>a2</a></t:derived> +  <t:base xsi:type="t:base"><a>a3</a></t:base> +  <t:derived xsi:type="t:base"><a>a4</a></t:derived> + +</t:root> diff --git a/xsd/tests/cxx/parser/polymorphism/same-type/test.xsd b/xsd/tests/cxx/parser/polymorphism/same-type/test.xsd new file mode 100644 index 0000000..a4157d3 --- /dev/null +++ b/xsd/tests/cxx/parser/polymorphism/same-type/test.xsd @@ -0,0 +1,21 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="base"> +    <sequence> +      <element name="a" type="string"/> +    </sequence> +  </complexType> + +  <element name="base" type="t:base"/> +  <element name="derived" type="t:base" substitutionGroup="t:base"/> + +  <complexType name="type"> +    <sequence> +      <element ref="t:base" maxOccurs="unbounded"/> +    </sequence> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/recursive/driver.cxx b/xsd/tests/cxx/parser/recursive/driver.cxx new file mode 100644 index 0000000..3f54f8f --- /dev/null +++ b/xsd/tests/cxx/parser/recursive/driver.cxx @@ -0,0 +1,141 @@ +// file      : tests/cxx/parser/recursive/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test recursive parser invocation. +// + +#include <iostream> +#include <string> + +#include "test-pskel.hxx" + +using namespace std; + +struct sub_pimpl: sub_type_pskel +{ +  virtual void +  pre () +  { +    cout << "sub::pre" << endl; +  } + +  virtual void +  sub () +  { +    cout << "sub::sub" << endl; +  } + +  virtual void +  sub2 () +  { +    cout << "sub::sub2" << endl; +  } + +  virtual void +  name (string const& n) +  { +    cout << "sub::name: " << n << endl; +  } + +  virtual void +  post_sub_type () +  { +    cout << "sub::post" << endl; +  } +}; + +struct indir_pimpl: indir_type_pskel +{ +  virtual void +  pre () +  { +    cout << "indir::pre" << endl; +  } + +  virtual void +  sub () +  { +    cout << "indir::sub" << endl; +  } + +  virtual void +  name (string const& n) +  { +    cout << "indir::name: " << n << endl; +  } + +  virtual void +  post_indir_type () +  { +    cout << "indir::post" << endl; +  } +}; + +struct test_pimpl: test_type_pskel +{ +  virtual void +  pre () +  { +    cout << "test::pre" << endl; +  } + +  virtual void +  sub () +  { +    cout << "test::sub" << endl; +  } + +  virtual void +  name (string const& n) +  { +    cout << "test::name: " << n << endl; +  } + +  virtual void +  post_test_type () +  { +    cout << "test::post" << endl; +  } +}; + + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; + +    sub_pimpl sub_p; +    indir_pimpl indir_p; +    test_pimpl test_p; + +    sub_p.parsers (sub_p, indir_p, sub_p, string_p); +    indir_p.parsers (sub_p, string_p); +    test_p.parsers (sub_p, string_p); + +    xml_schema::document doc_p (test_p, "test"); + +    test_p.pre (); +    doc_p.parse (argv[1]); +    test_p.post_test_type (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/recursive/makefile b/xsd/tests/cxx/parser/recursive/makefile new file mode 100644 index 0000000..bd78bef --- /dev/null +++ b/xsd/tests/cxx/parser/recursive/makefile @@ -0,0 +1,80 @@ +# file      : tests/cxx/parser/recursive/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                 \ +  $(addsuffix .cxx.clean,$(obj))                            \ +  $(addsuffix .cxx.clean,$(dep))                            \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/recursive/output b/xsd/tests/cxx/parser/recursive/output new file mode 100644 index 0000000..f26fb72 --- /dev/null +++ b/xsd/tests/cxx/parser/recursive/output @@ -0,0 +1,22 @@ +test::pre +test::name: testName +sub::pre +sub::name: subName +sub::pre +sub::name: sub-subName +sub::post +sub::sub +indir::pre +indir::name: sub-indirName +sub::pre +sub::name: sub-indir-subName +sub::post +indir::sub +indir::post +sub::pre +sub::name: sub-sub2Name +sub::post +sub::sub2 +sub::post +test::sub +test::post diff --git a/xsd/tests/cxx/parser/recursive/test.xml b/xsd/tests/cxx/parser/recursive/test.xml new file mode 100644 index 0000000..f6c219d --- /dev/null +++ b/xsd/tests/cxx/parser/recursive/test.xml @@ -0,0 +1,11 @@ +<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +      xsi:noNamespaceSchemaLocation="test.xsd" +      name="testName"> +       <sub name="subName"> +           <sub name="sub-subName"/> +           <indir name="sub-indirName"> +             <sub name="sub-indir-subName"/> +           </indir> +           <sub2 name="sub-sub2Name"/> +       </sub> +</test> diff --git a/xsd/tests/cxx/parser/recursive/test.xsd b/xsd/tests/cxx/parser/recursive/test.xsd new file mode 100644 index 0000000..33e1d2d --- /dev/null +++ b/xsd/tests/cxx/parser/recursive/test.xsd @@ -0,0 +1,27 @@ +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + +  <xs:complexType name="sub_type"> +    <xs:sequence> +      <xs:element name="sub" type="sub_type" minOccurs="0"/> +      <xs:element name="indir" type="indir_type" minOccurs="0"/> +      <xs:element name="sub2" type="sub_type" minOccurs="0"/> +    </xs:sequence> +    <xs:attribute name="name" type="xs:string" /> +  </xs:complexType> + +  <xs:complexType name="indir_type"> +    <xs:sequence> +      <xs:element name="sub" type="sub_type" minOccurs="0"/> +    </xs:sequence> +    <xs:attribute name="name" type="xs:string" /> +  </xs:complexType> + +  <xs:complexType name="test_type"> +    <xs:sequence> +      <xs:element name="sub" type="sub_type" /> +    </xs:sequence> +    <xs:attribute name="name" type="xs:string" /> +  </xs:complexType> + +  <xs:element name="test" type="test_type" /> +</xs:schema> diff --git a/xsd/tests/cxx/parser/test-template/driver.cxx b/xsd/tests/cxx/parser/test-template/driver.cxx new file mode 100644 index 0000000..b3379ff --- /dev/null +++ b/xsd/tests/cxx/parser/test-template/driver.cxx @@ -0,0 +1,68 @@ +// file      : tests/cxx/parser/test-template/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Insert test description here. +// + +#include <string> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; + +struct type_pimpl: type_pskel +{ +  virtual void +  pre () +  { +  } + +  virtual void +  a (string const& v) +  { +    cout << v << endl; +  } + +  virtual void +  post_type () +  { +  } +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    type_pimpl type_p; + +    type_p.parsers (string_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    type_p.pre (); +    doc_p.parse (argv[1]); +    type_p.post_type (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (std::ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/test-template/makefile b/xsd/tests/cxx/parser/test-template/makefile new file mode 100644 index 0000000..5f5f9bc --- /dev/null +++ b/xsd/tests/cxx/parser/test-template/makefile @@ -0,0 +1,79 @@ +# file      : tests/cxx/parser/test-template/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                 \ +  $(addsuffix .cxx.clean,$(obj))                            \ +  $(addsuffix .cxx.clean,$(dep))                            \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/test-template/output b/xsd/tests/cxx/parser/test-template/output new file mode 100644 index 0000000..7898192 --- /dev/null +++ b/xsd/tests/cxx/parser/test-template/output @@ -0,0 +1 @@ +a diff --git a/xsd/tests/cxx/parser/test-template/test.xml b/xsd/tests/cxx/parser/test-template/test.xml new file mode 100644 index 0000000..624a80c --- /dev/null +++ b/xsd/tests/cxx/parser/test-template/test.xml @@ -0,0 +1,7 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> +		 +  <a>a</a>	 +   +</t:root> diff --git a/xsd/tests/cxx/parser/test-template/test.xsd b/xsd/tests/cxx/parser/test-template/test.xsd new file mode 100644 index 0000000..07bebc7 --- /dev/null +++ b/xsd/tests/cxx/parser/test-template/test.xsd @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="type"> +    <sequence> +      <element name="a" type="string"/> +    </sequence> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/union/driver.cxx b/xsd/tests/cxx/parser/union/driver.cxx new file mode 100644 index 0000000..4a67f2f --- /dev/null +++ b/xsd/tests/cxx/parser/union/driver.cxx @@ -0,0 +1,62 @@ +// file      : tests/cxx/parser/union/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test xsd:union parsing. +// + +#include <string> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; + +struct int_string_union_pimpl: int_string_union_pskel +{ +  virtual void +  _characters (const xml_schema::ro_string& s) +  { +    cout << "'" << s << "'" << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    int_string_union_pimpl int_string_union_p; +    type_pimpl type_p; + +    type_p.parsers (int_string_union_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    type_p.pre (); +    doc_p.parse (argv[1]); +    type_p.post_type (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (std::ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/union/makefile b/xsd/tests/cxx/parser/union/makefile new file mode 100644 index 0000000..fa2b844 --- /dev/null +++ b/xsd/tests/cxx/parser/union/makefile @@ -0,0 +1,79 @@ +# file      : tests/cxx/parser/union/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) $(src_base)/test.xml $(src_base)/output +	$(call message,test $$1,$$1 $(src_base)/test.xml | diff -u $(src_base)/output -,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                 \ +  $(addsuffix .cxx.clean,$(obj))                            \ +  $(addsuffix .cxx.clean,$(dep))                            \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/union/output b/xsd/tests/cxx/parser/union/output new file mode 100644 index 0000000..a92ffc3 --- /dev/null +++ b/xsd/tests/cxx/parser/union/output @@ -0,0 +1,2 @@ +'one' +'1' diff --git a/xsd/tests/cxx/parser/union/test.xml b/xsd/tests/cxx/parser/union/test.xml new file mode 100644 index 0000000..5b3e799 --- /dev/null +++ b/xsd/tests/cxx/parser/union/test.xml @@ -0,0 +1,10 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <int-string-union/> +  <int-string-union> </int-string-union> +  <int-string-union>one</int-string-union> +  <int-string-union>1</int-string-union> + +</t:root> diff --git a/xsd/tests/cxx/parser/union/test.xsd b/xsd/tests/cxx/parser/union/test.xsd new file mode 100644 index 0000000..5bf3d47 --- /dev/null +++ b/xsd/tests/cxx/parser/union/test.xsd @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <simpleType name="int-string-union"> +    <union memberTypes="int string"/> +  </simpleType> + +  <complexType name="type"> +    <choice maxOccurs="unbounded"> +      <element name="int-string-union" type="t:int-string-union"/> +    </choice> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/validation/all/driver.cxx b/xsd/tests/cxx/parser/validation/all/driver.cxx new file mode 100644 index 0000000..d4a3839 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/driver.cxx @@ -0,0 +1,100 @@ +// file      : tests/cxx/parser/validation/all/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the all compositor validation. +// + +#include <string> +#include <fstream> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; + +struct all_pimpl: all_pskel +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  a (string const& v) +  { +    cout << "  a = " << v << endl; +  } + +  virtual void +  b (string const& v) +  { +    cout << "  b = " << v << endl; +  } + +  virtual void +  c (string const& v) +  { +    cout << "  c = " << v << endl; +  } + +  virtual void +  post_all () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    all_pimpl all_p; +    type_pimpl type_p; + +    all_p.parsers (string_p, string_p, string_p); +    type_p.parsers (all_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    try +    { +      ifstream ifs (argv[1]); +      type_p.pre (); +      doc_p.parse (ifs, argv[1], "", xml_schema::flags::dont_validate); +      type_p.post_type (); +    } +    catch (xml_schema::exception const& e) +    { +      cout << "  " << e << endl +           << "}" << endl +           << endl; +    } +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/validation/all/makefile b/xsd/tests/cxx/parser/validation/all/makefile new file mode 100644 index 0000000..6336fdc --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/makefile @@ -0,0 +1,89 @@ +# file      : tests/cxx/parser/validation/all/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +tests := 000 001 002 003 + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +test_targets := $(addprefix $(out_base)/.test-,$(tests)) + +$(test): $(test_targets) +$(test_targets): driver := $(driver) + +.PHONY: $(out_base)/.test-% +$(out_base)/.test-%: $(driver) $(src_base)/test.xsd $(src_base)/test-%.xml $(src_base)/test-%.std +	$(call message,test $(out_base)/$*,$(driver) $(src_base)/test-$*.xml | diff -u $(src_base)/test-$*.std -) + + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep))                           \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/validation/all/test-000.std b/xsd/tests/cxx/parser/validation/all/test-000.std new file mode 100644 index 0000000..b4445f2 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test-000.std @@ -0,0 +1,46 @@ +{ +  a = a +  b = b +  c = c +} + +{ +  a = a +  c = c +  b = b +} + +{ +  b = b +  a = a +  c = c +} + +{ +  b = b +  c = c +  a = a +} + +{ +  c = c +  a = a +  b = b +} + +{ +  c = c +  b = b +  a = a +} + +{ +  a = a +  b = b +} + +{ +  a = a +  b = b +} + diff --git a/xsd/tests/cxx/parser/validation/all/test-000.xml b/xsd/tests/cxx/parser/validation/all/test-000.xml new file mode 100644 index 0000000..6e46fae --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test-000.xml @@ -0,0 +1,53 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- all combinations --> +  <all> +    <a>a</a> +    <b>b</b> +    <c>c</c> +  </all> + +  <all> +    <a>a</a> +    <c>c</c> +    <b>b</b> +  </all> + +  <all> +    <b>b</b> +    <a>a</a> +    <c>c</c> +  </all> + +  <all> +    <b>b</b> +    <c>c</c> +    <a>a</a> +  </all> + +  <all> +    <c>c</c> +    <a>a</a> +    <b>b</b> +  </all> + +  <all> +    <c>c</c> +    <b>b</b> +    <a>a</a> +  </all> + +  <!-- optional c is not present --> +  <all> +    <a>a</a> +    <b>b</b> +  </all> + +  <all> +    <a>a</a> +    <b>b</b> +  </all> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/all/test-001.std b/xsd/tests/cxx/parser/validation/all/test-001.std new file mode 100644 index 0000000..0472ad9 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test-001.std @@ -0,0 +1,6 @@ +{ +  a = a +  c = c +  :9:9 error: expected element 'b' +} + diff --git a/xsd/tests/cxx/parser/validation/all/test-001.xml b/xsd/tests/cxx/parser/validation/all/test-001.xml new file mode 100644 index 0000000..3df5600 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test-001.xml @@ -0,0 +1,11 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- required b is not present (invalid) --> +  <all> +    <a>a</a> +    <c>c</c> +  </all> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/all/test-002.std b/xsd/tests/cxx/parser/validation/all/test-002.std new file mode 100644 index 0000000..c014230 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test-002.std @@ -0,0 +1,4 @@ +{ +  :7:9 error: expected element 'a' +} + diff --git a/xsd/tests/cxx/parser/validation/all/test-002.xml b/xsd/tests/cxx/parser/validation/all/test-002.xml new file mode 100644 index 0000000..aed0c0c --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test-002.xml @@ -0,0 +1,9 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- invalid --> +  <all> +  </all> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/all/test-003.std b/xsd/tests/cxx/parser/validation/all/test-003.std new file mode 100644 index 0000000..dd8c0d3 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test-003.std @@ -0,0 +1,6 @@ +{ +  a = a +  b = b +  :9:7 error: unexpected element 'a' +} + diff --git a/xsd/tests/cxx/parser/validation/all/test-003.xml b/xsd/tests/cxx/parser/validation/all/test-003.xml new file mode 100644 index 0000000..b147cba --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test-003.xml @@ -0,0 +1,12 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- invalid --> +  <all> +   <a>a</a> +   <b>b</b> +   <a>a</a> +  </all> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/all/test.xsd b/xsd/tests/cxx/parser/validation/all/test.xsd new file mode 100644 index 0000000..1f670e3 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/all/test.xsd @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="all"> +    <all minOccurs="1"> +      <element name="a" type="string"/> +      <element name="b" type="string"/> +      <element name="c" type="string" minOccurs="0"/> +    </all> +  </complexType> + +  <complexType name="type"> +    <sequence> +      <element name="all" type="t:all" maxOccurs="unbounded"/> +    </sequence> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/validation/any/driver.cxx b/xsd/tests/cxx/parser/validation/any/driver.cxx new file mode 100644 index 0000000..e858285 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/any/driver.cxx @@ -0,0 +1,123 @@ +// file      : tests/cxx/parser/validation/any/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the any particle validation. +// + +#include <string> +#include <fstream> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; +using xml_schema::ro_string; + +struct any_a_pimpl: any_a_pskel +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  a (string const& v) +  { +    cout << "  a = " << v << endl; +  } + +  virtual void +  x (string const& v) +  { +    cout << "  x = " << v << endl; +  } + +  virtual void +  _start_any_element (ro_string const&,  +                      ro_string const& n, +		      ro_string const*) +  { +    cout << "  start any element '" << n << "'" << endl; +  } + +  virtual void +  _end_any_element (ro_string const&, ro_string const& n) +  { +    cout << "  end any element '" << n << "'" << endl; +  } + +  virtual void +  _any_attribute (ro_string const&, +                  ro_string const& n, +		  ro_string const& v) +  { +    cout << "  any attribute " << n << " = '" << v << "'" << endl; +  } + +  virtual void +  _any_characters (ro_string const& s) +  { +    cout << "  any text: '" << s << "'" << endl; +  } + +  virtual void +  post_any_a () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    any_a_pimpl any_a_p; +    type_pimpl type_p; + +    any_a_p.parsers (string_p, string_p); +    type_p.parsers (any_a_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    try +    { +      ifstream ifs (argv[1]); +      type_p.pre (); +      doc_p.parse (ifs, argv[1], "", xml_schema::flags::dont_validate); +      type_p.post_type (); +    } +    catch (xml_schema::exception const& e) +    { +      cout << "  " << e << endl +           << "}" << endl +           << endl; +    } +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/validation/any/makefile b/xsd/tests/cxx/parser/validation/any/makefile new file mode 100644 index 0000000..084a131 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/any/makefile @@ -0,0 +1,89 @@ +# file      : tests/cxx/parser/validation/any/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +tests := 000 + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +test_targets := $(addprefix $(out_base)/.test-,$(tests)) + +$(test): $(test_targets) +$(test_targets): driver := $(driver) + +.PHONY: $(out_base)/.test-% +$(out_base)/.test-%: $(driver) $(src_base)/test.xsd $(src_base)/test-%.xml $(src_base)/test-%.std +	$(call message,test $(out_base)/$*,$(driver) $(src_base)/test-$*.xml | diff -u $(src_base)/test-$*.std -) + + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep))                           \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/validation/any/test-000.std b/xsd/tests/cxx/parser/validation/any/test-000.std new file mode 100644 index 0000000..a1cc6e3 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/any/test-000.std @@ -0,0 +1,29 @@ +{ +  start any element 'any' +  end any element 'any' +} + +{ +  start any element 'any' +  any attribute x = 'xxx' +  any text: 'aaa' +  start any element 'a' +  any text: 'bbb' +  end any element 'a' +  any text: 'ccc' +  end any element 'any' +} + +{ +  x = x +  a = a +  start any element 'any' +  any attribute x = 'xxx' +  any text: 'aaa' +  start any element 'a' +  any text: 'bbb' +  end any element 'a' +  any text: 'ccc' +  end any element 'any' +} + diff --git a/xsd/tests/cxx/parser/validation/any/test-000.xml b/xsd/tests/cxx/parser/validation/any/test-000.xml new file mode 100644 index 0000000..f1a0c83 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/any/test-000.xml @@ -0,0 +1,21 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- test dispatching of any-nested elements and attributes --> + +  <any-a> +    <o:any/> +  </any-a> + +  <any-a> +    <o:any x="xxx">aaa<a>bbb</a>ccc</o:any> +  </any-a> + +  <any-a x="x"> +    <a>a</a> +    <o:any x="xxx">aaa<a>bbb</a>ccc</o:any> +  </any-a> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/any/test.xsd b/xsd/tests/cxx/parser/validation/any/test.xsd new file mode 100644 index 0000000..c05aeb5 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/any/test.xsd @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="any-a"> +    <sequence> +      <element name="a" type="string" minOccurs="0"/> +      <any namespace="other" processContents="skip" maxOccurs="unbounded"/> +    </sequence> +    <attribute name="x" type="string"/> +  </complexType> + +  <complexType name="type"> +    <choice maxOccurs="unbounded"> +      <element name="any-a" type="t:any-a"/> +    </choice> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/validation/attribute/driver.cxx b/xsd/tests/cxx/parser/validation/attribute/driver.cxx new file mode 100644 index 0000000..e726ad8 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/attribute/driver.cxx @@ -0,0 +1,199 @@ +// file      : tests/cxx/parser/validation/attribute/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test attribute and attribute wildcard (anyAttribute) validation. +// + +#include <string> +#include <fstream> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; +using xml_schema::ro_string; + +struct pass_a_pimpl: pass_a_pskel +{ +  virtual void +  pre () +  { +    cout << "pass-a" << endl +         << "{" << endl; +  } + +  virtual void +  a (string const& v) +  { +    cout << "  a = " << v << endl; +  } + +  virtual void +  b (string const& v) +  { +    cout << "  b = " << v << endl; +  } + +  virtual void +  _any_attribute (ro_string const& ns, +                  ro_string const& name, +                  ro_string const& value) +  { +    cout << "  any: " << ns << "#" << name << " = " << value << endl; +  } + +  virtual void +  post_pass_a () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct pass_b_pimpl: pass_b_pskel +{ +  virtual void +  pre () +  { +    cout << "pass-b" << endl +         << "{" << endl; +  } + +  virtual void +  a (string const& v) +  { +    cout << "  a = " << v << endl; +  } + +  virtual void +  b (string const& v) +  { +    cout << "  b = " << v << endl; +  } + +  virtual void +  _any_attribute (ro_string const& ns, +                  ro_string const& name, +                  ro_string const& value) +  { +    cout << "  any: " << ns << "#" << name << " = " << value << endl; +  } + +  virtual void +  post_pass_b () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct pass_c_pimpl: pass_c_pskel +{ +  virtual void +  pre () +  { +    cout << "pass-c" << endl +         << "{" << endl; +  } + +  virtual void +  a (string const& v) +  { +    cout << "  a = " << v << endl; +  } + +  virtual void +  b (string const& v) +  { +    cout << "  b = " << v << endl; +  } + +  virtual void +  post_pass_c () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct fail_pimpl: fail_pskel +{ +  virtual void +  pre () +  { +    cout << "fail" << endl +         << "{" << endl; +  } + +  virtual void +  a (string const& v) +  { +    cout << "  a = " << v << endl; +  } + +  virtual void +  post_fail () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    pass_a_pimpl pass_a_p; +    pass_b_pimpl pass_b_p; +    pass_c_pimpl pass_c_p; +    fail_pimpl fail_p; +    type_pimpl type_p; + +    pass_a_p.parsers (string_p, string_p); +    pass_b_p.parsers (string_p, string_p); +    pass_c_p.parsers (string_p, string_p); +    fail_p.parsers (string_p); +    type_p.parsers (pass_a_p, pass_b_p, pass_c_p, fail_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    try +    { +      ifstream ifs (argv[1]); +      type_p.pre (); +      doc_p.parse (ifs, argv[1], "", xml_schema::flags::dont_validate); +      type_p.post_type (); +    } +    catch (xml_schema::exception const& e) +    { +      cout << "  " << e << endl +           << "}" << endl +           << endl; +    } +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/validation/attribute/makefile b/xsd/tests/cxx/parser/validation/attribute/makefile new file mode 100644 index 0000000..0f7df21 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/attribute/makefile @@ -0,0 +1,89 @@ +# file      : tests/cxx/parser/validation/attribute/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +tests := 000 + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +test_targets := $(addprefix $(out_base)/.test-,$(tests)) + +$(test): $(test_targets) +$(test_targets): driver := $(driver) + +.PHONY: $(out_base)/.test-% +$(out_base)/.test-%: $(driver) $(src_base)/test.xsd $(src_base)/test-%.xml $(src_base)/test-%.std +	$(call message,test $(out_base)/$*,$(driver) $(src_base)/test-$*.xml | diff -u $(src_base)/test-$*.std -) + + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep))                           \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/validation/attribute/test-000.std b/xsd/tests/cxx/parser/validation/attribute/test-000.std new file mode 100644 index 0000000..847b054 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/attribute/test-000.std @@ -0,0 +1,24 @@ +pass-a +{ +  b = b +  any: test#foo = foo +  any: test#bar = bar +} + +pass-b +{ +  a = a +  b = b +} + +pass-c +{ +  a = a +  b = b +} + +fail +{ +  :8:10 error: expected attribute 'a' +} + diff --git a/xsd/tests/cxx/parser/validation/attribute/test-000.xml b/xsd/tests/cxx/parser/validation/attribute/test-000.xml new file mode 100644 index 0000000..b994d1a --- /dev/null +++ b/xsd/tests/cxx/parser/validation/attribute/test-000.xml @@ -0,0 +1,10 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <pass-a b="b" t:foo="foo" t:bar="bar"/> +  <pass-b a="a" b="b"/> +  <pass-c a="a" b="b"/> +  <fail/> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/attribute/test.xsd b/xsd/tests/cxx/parser/validation/attribute/test.xsd new file mode 100644 index 0000000..833eb8e --- /dev/null +++ b/xsd/tests/cxx/parser/validation/attribute/test.xsd @@ -0,0 +1,71 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + + +  <!-- Test optional and required attributes as well as a wildcard. --> +  <complexType name="pass-a"> +    <attribute name="a" type="string" use="optional"/> +    <attribute name="b" type="string" use="required"/> +    <anyAttribute namespace="##targetNamespace" processContents="skip"/> +  </complexType> + + +  <!-- Test that in inheritance attributes are checked before wildcards. --> +  <complexType name="pass-b-base"> +    <attribute name="a" type="string"/> +    <anyAttribute namespace="#any" processContents="skip"/> +  </complexType> + +  <complexType name="pass-b"> +    <complexContent> +      <extension base="t:pass-b-base"> +        <attribute name="b" type="string"/> +	<anyAttribute namespace="#any" processContents="skip"/> +      </extension> +    </complexContent> +  </complexType> + + +  <!-- Test that in inheritance by restriction required attribute is +       checked for even though it is not explicitly mentioned in +       derived. --> +  <complexType name="pass-c-base"> +    <attribute name="a" type="string" use="required"/> +    <attribute name="b" type="string" use="optional"/> +  </complexType> + +  <complexType name="pass-c"> +    <complexContent> +      <restriction base="t:pass-c-base"> +        <attribute name="b" type="string" use="required"/> +      </restriction> +    </complexContent> +  </complexType> + + +  <!-- Test detection of missing required attribute. --> +  <complexType name="fail-base"> +    <attribute name="a" type="string" use="optional"/> +  </complexType> + +  <complexType name="fail"> +    <complexContent> +      <restriction base="t:fail-base"> +        <attribute name="a" type="string" use="required"/> +      </restriction> +    </complexContent> +  </complexType> + + +  <complexType name="type"> +    <sequence> +      <element name="pass-a" type="t:pass-a"/> +      <element name="pass-b" type="t:pass-b"/> +      <element name="pass-c" type="t:pass-c"/> +      <element name="fail" type="t:fail"/> +    </sequence> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/validation/built-in/any-type/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/any-type/driver.cxx new file mode 100644 index 0000000..46ccc96 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/any-type/driver.cxx @@ -0,0 +1,156 @@ +// file      : tests/cxx/parser/validation/built-in/any-type/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the anyType and anySimpleType validation. +// + +#include <string> +#include <fstream> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; +using xml_schema::ro_string; + +struct any_type_pimpl: xml_schema::any_type_pimpl +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  _start_any_element (ro_string const&,  +                      ro_string const& n, +		      ro_string const*) +  { +    cout << "  start any element '" << n << "'" << endl; +  } + +  virtual void +  _end_any_element (ro_string const&, ro_string const& n) +  { +    cout << "  end any element '" << n << "'" << endl; +  } + +  virtual void +  _any_attribute (ro_string const&, +                  ro_string const& n, +		  ro_string const& v) +  { +    cout << "  any attribute " << n << " = '" << v << "'" << endl; +  } + +  virtual void +  _any_characters (ro_string const& s) +  { +    cout << "  any text: '" << s << "'" << endl; +  } + +  virtual void +  post_any_type () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct any_simple_type_pimpl: xml_schema::any_simple_type_pimpl +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  _any_characters (ro_string const& s) +  { +    cout << "  any text: '" << s << "'" << endl; +  } + +  virtual void +  post_any_simple_type () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct any_extension_pimpl: virtual any_extension_pskel, +                            any_type_pimpl + +{ +  virtual void +  x (const string& v) +  { +    cout << "  x = " << v << endl; +  } +}; + +struct any_simple_extension_pimpl: virtual any_simple_extension_pskel, +                                   any_simple_type_pimpl +{ +  virtual void +  x (const string& v) +  { +    cout << "  x = " << v << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; + +    any_type_pimpl any_type_p; +    any_simple_type_pimpl any_simple_type_p; + +    any_extension_pimpl any_extension_p; +    any_simple_extension_pimpl any_simple_extension_p; + +    type_pimpl type_p; + +    any_extension_p.parsers (string_p); +    any_simple_extension_p.parsers (string_p); + +    type_p.parsers (any_type_p, +                    any_extension_p, +                    any_simple_extension_p, +                    any_simple_type_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    ifstream ifs (argv[1]); +    type_p.pre (); +    doc_p.parse (ifs, argv[1], "", xml_schema::flags::dont_validate); +    type_p.post_type (); +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/any-type/makefile b/xsd/tests/cxx/parser/validation/built-in/any-type/makefile new file mode 100644 index 0000000..bf42aac --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/any-type/makefile @@ -0,0 +1,89 @@ +# file      : tests/cxx/parser/validation/built-in/any-type/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +tests := 000 + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +test_targets := $(addprefix $(out_base)/.test-,$(tests)) + +$(test): $(test_targets) +$(test_targets): driver := $(driver) + +.PHONY: $(out_base)/.test-% +$(out_base)/.test-%: $(driver) $(src_base)/test.xsd $(src_base)/test-%.xml $(src_base)/test-%.std +	$(call message,test $(out_base)/$*,$(driver) $(src_base)/test-$*.xml | diff -u $(src_base)/test-$*.std -) + + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep))                           \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/validation/built-in/any-type/test-000.std b/xsd/tests/cxx/parser/validation/built-in/any-type/test-000.std new file mode 100644 index 0000000..84d7b3a --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/any-type/test-000.std @@ -0,0 +1,99 @@ +{ +  any text: '123abc' +} + +{ +  any text: ' +    ' +  start any element 'any' +  end any element 'any' +  any text: ' +  ' +} + +{ +  any text: ' +    ' +  start any element 'any' +  any attribute x = 'xxx' +  any text: 'aaa' +  start any element 'a' +  any text: 'bbb' +  end any element 'a' +  any text: 'ccc' +  end any element 'any' +  any text: ' +  ' +} + +{ +  any attribute x = 'x' +  any text: ' +    ' +  start any element 'a' +  any text: 'a' +  end any element 'a' +  any text: ' +    ' +  start any element 'any' +  any attribute x = 'xxx' +  any text: 'aaa' +  start any element 'a' +  any text: 'bbb' +  end any element 'a' +  any text: 'ccc' +  end any element 'any' +  any text: ' +  ' +} + +{ +  any text: ' +    ' +  start any element 'any' +  end any element 'any' +  any text: ' +  ' +} + +{ +  any text: ' +    ' +  start any element 'any' +  any attribute x = 'xxx' +  any text: 'aaa' +  start any element 'a' +  any text: 'bbb' +  end any element 'a' +  any text: 'ccc' +  end any element 'any' +  any text: ' +  ' +} + +{ +  x = x +  any text: ' +    ' +  start any element 'a' +  any text: 'a' +  end any element 'a' +  any text: ' +    ' +  start any element 'any' +  any attribute x = 'xxx' +  any text: 'aaa' +  start any element 'a' +  any text: 'bbb' +  end any element 'a' +  any text: 'ccc' +  end any element 'any' +  any text: ' +  ' +} + +{ +  x = x +  any text: 'abc123' +} + diff --git a/xsd/tests/cxx/parser/validation/built-in/any-type/test-000.xml b/xsd/tests/cxx/parser/validation/built-in/any-type/test-000.xml new file mode 100644 index 0000000..7875b7e --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/any-type/test-000.xml @@ -0,0 +1,41 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd" +        as="123abc"> + +  <!-- test dispatching of anyType nested elements and attributes --> + +  <a> +    <o:any/> +  </a> + +  <a> +    <o:any x="xxx">aaa<a>bbb</a>ccc</o:any> +  </a> + +  <a x="x"> +    <a>a</a> +    <o:any x="xxx">aaa<a>bbb</a>ccc</o:any> +  </a> + +  <!-- anyType extension --> + +  <a-extension> +    <o:any/> +  </a-extension> + +  <a-extension> +    <o:any x="xxx">aaa<a>bbb</a>ccc</o:any> +  </a-extension> + +  <a-extension x="x"> +    <a>a</a> +    <o:any x="xxx">aaa<a>bbb</a>ccc</o:any> +  </a-extension> + +  <!-- anySimpleType extension --> + +  <as-extension x="x">abc123</as-extension> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/built-in/any-type/test.xsd b/xsd/tests/cxx/parser/validation/built-in/any-type/test.xsd new file mode 100644 index 0000000..86a4e13 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/any-type/test.xsd @@ -0,0 +1,31 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="any-extension"> +    <complexContent mixed="true"> +      <extension base="anyType"> +	<attribute name="x" type="string"/> +      </extension> +    </complexContent> +  </complexType> + +  <complexType name="any-simple-extension"> +    <simpleContent> +      <extension base="anySimpleType"> +	<attribute name="x" type="string"/> +      </extension> +    </simpleContent> +  </complexType> + +  <complexType name="type"> +    <choice maxOccurs="unbounded"> +      <element name="a" type="anyType"/> +      <element name="a-extension" type="t:any-extension"/> +      <element name="as-extension" type="t:any-simple-extension"/> +    </choice> +    <attribute name="as" type="anySimpleType"/> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/validation/built-in/binary/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/binary/driver.cxx new file mode 100644 index 0000000..e75d55f --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/binary/driver.cxx @@ -0,0 +1,155 @@ +// file      : tests/cxx/parser/validation/built-in/binary/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in base64Binary and hexBinary types validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  typedef xsd::cxx::parser::buffer buffer; + +  // Good. +  // + +  // hexBinary +  // +  { +    hex_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("  "); +    p._post (); +    assert (*p.post_hex_binary () == buffer ()); +  } + +  { +    hex_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n313"); +    p._characters ("23334356162636a6b  "); +    p._post (); +    assert (*p.post_hex_binary () == buffer ("12345abcjk", 10)); +  } + +  // base64Binary +  // +  { +    base64_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("MTIzND  "); +    p._characters ("VhYmNqaw = = "); +    p._post (); +    assert (*p.post_base64_binary () == buffer ("12345abcjk", 10)); +  } + +  { +    base64_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("YQ=="); +    p._post (); +    assert (*p.post_base64_binary () == buffer ("a", 1)); +  } + +  { +    base64_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("YWI="); +    p._post (); +    assert (*p.post_base64_binary () == buffer ("ab", 2)); +  } + +  { +    base64_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("YWJj"); +    p._post (); +    assert (*p.post_base64_binary () == buffer ("abc", 3)); +  } + +  // Bad +  // + +  // hexBinary +  // +  { +    hex_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("313"); +    assert (test_post_fail (p)); +  } + +  { +    hex_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("313233343X6162636a6b"); +    assert (test_post_fail (p)); +  } + +  // base64Binary +  // +  { +    base64_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    base64_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("YQ"); +    assert (test_post_fail (p)); +  } + +  { +    base64_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("=="); +    assert (test_post_fail (p)); +  } + +  { +    base64_binary_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("MTIzNDVhYmNqaw=A"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/binary/makefile b/xsd/tests/cxx/parser/validation/built-in/binary/makefile new file mode 100644 index 0000000..b729cd0 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/binary/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/binary/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/boolean/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/boolean/driver.cxx new file mode 100644 index 0000000..85586a6 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/boolean/driver.cxx @@ -0,0 +1,147 @@ +// file      : tests/cxx/parser/validation/built-in/boolean/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in boolean type validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +bool +test_post_fail (boolean_pimpl<char>& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  // Good. +  // +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("true"); +    p._post (); +    assert (p.post_boolean ()); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1"); +    p._post (); +    assert (p.post_boolean ()); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("false"); +    p._post (); +    assert (!p.post_boolean ()); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (!p.post_boolean ()); +  } + + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("  true  "); +    p._post (); +    assert (p.post_boolean ()); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" "); +    p._characters (" \n  "); +    p._characters ("   fa"); +    p._characters ("l"); +    p._characters ("se   "); +    p._characters (" \n  "); +    p._characters (" "); +    p._post (); +    assert (!p.post_boolean ()); +  } + +  // Bad +  // +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    //p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("  "); +    assert (test_post_fail (p)); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("                        "); +    assert (test_post_fail (p)); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("fal"); +    p._characters ("s   "); +    p._characters ("e"); +    assert (test_post_fail (p)); +  } + +  { +    boolean_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("01"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/boolean/makefile b/xsd/tests/cxx/parser/validation/built-in/boolean/makefile new file mode 100644 index 0000000..39ca5e9 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/boolean/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/boolean/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/byte/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/byte/driver.cxx new file mode 100644 index 0000000..466f004 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/byte/driver.cxx @@ -0,0 +1,258 @@ +// file      : tests/cxx/parser/validation/built-in/byte/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in byte and unsigned byte types validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  // Good. +  // +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("123"); +    p._post (); +    assert (p.post_byte () == 123); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("\t +123 \n "); +    p._post (); +    assert (p.post_byte () == 123); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-123"); +    p._post (); +    assert (p.post_byte () == -123); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+123"); +    p._post (); +    assert (p.post_byte () == 123); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0000000000000000123"); +    p._post (); +    assert (p.post_byte () == 123); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+0000000000000000123"); +    p._post (); +    assert (p.post_byte () == 123); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-0000000000000000123"); +    p._post (); +    assert (p.post_byte () == -123); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("\t \n"); +    p._characters (" -"); +    p._characters ("00000"); +    p._characters ("001"); +    p._characters ("23   \n\t"); +    p._post (); +    assert (p.post_byte () == -123); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-128"); +    p._post (); +    assert (p.post_byte () == -128); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("127"); +    p._post (); +    assert (p.post_byte () == 127); +  } + +  { +    unsigned_byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+123"); +    p._post (); +    assert (p.post_unsigned_byte () == 123); +  } + +  { +    unsigned_byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_unsigned_byte () == 0); +  } + +  { +    unsigned_byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("255"); +    p._post (); +    assert (p.post_unsigned_byte () == 255); +  } + +  // Bad +  // +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n \t "); +    assert (test_post_fail (p)); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+"); +    assert (test_post_fail (p)); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-"); +    assert (test_post_fail (p)); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("++01"); +    assert (test_post_fail (p)); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--01"); +    assert (test_post_fail (p)); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-01"); +    p._characters ("    "); +    p._characters ("23    "); +    assert (test_post_fail (p)); +  } + +  { +    unsigned_byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-123"); +    assert (test_post_fail (p)); +  } + +  // Ranges +  // +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-129"); +    assert (test_post_fail (p)); +  } + +  { +    byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("128"); +    assert (test_post_fail (p)); +  } + +  { +    unsigned_byte_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("256"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/byte/makefile b/xsd/tests/cxx/parser/validation/built-in/byte/makefile new file mode 100644 index 0000000..32f4b91 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/byte/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/byte/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/date-time/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/date-time/driver.cxx new file mode 100644 index 0000000..6297912 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/date-time/driver.cxx @@ -0,0 +1,1535 @@ +// file      : tests/cxx/parser/validation/built-in/date-time/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in date and time types validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  typedef xsd::cxx::parser::gday gday; +  typedef xsd::cxx::parser::gmonth gmonth; +  typedef xsd::cxx::parser::gyear gyear; +  typedef xsd::cxx::parser::gmonth_day gmonth_day; +  typedef xsd::cxx::parser::gyear_month gyear_month; +  typedef xsd::cxx::parser::date date; +  typedef xsd::cxx::parser::time time; +  typedef xsd::cxx::parser::date_time date_time; +  typedef xsd::cxx::parser::duration duration; + +  // Good. +  // + +  // gday & time zone parsing +  // +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("---1"); +    p._characters ("2+12:00"); +    p._post (); +    assert (p.post_gday () == gday (12, 12, 00)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---01"); +    p._post (); +    assert (p.post_gday () == gday (1)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---31"); +    p._post (); +    assert (p.post_gday () == gday (31)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---15Z"); +    p._post (); +    assert (p.post_gday () == gday (15, 0, 0)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---15-14:00"); +    p._post (); +    assert (p.post_gday () == gday (15, -14, 0)); +  } + +  // gmonth +  // +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("--1"); +    p._characters ("0+12:00"); +    p._post (); +    assert (p.post_gmonth () == gmonth (10, 12, 0)); +  } + +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--01"); +    p._post (); +    assert (p.post_gmonth () == gmonth (1)); +  } + +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--12Z"); +    p._post (); +    assert (p.post_gmonth () == gmonth (12, 0, 0)); +  } + +  // gyear +  // +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("20"); +    p._characters ("07+12:00"); +    p._post (); +    assert (p.post_gyear () == gyear (2007, 12, 00)); +  } + +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0001"); +    p._post (); +    assert (p.post_gyear () == gyear (1)); +  } + +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-20000Z"); +    p._post (); +    assert (p.post_gyear () == gyear (-20000, 0, 0)); +  } + +  // gmonth_day +  // +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("--1"); +    p._characters ("0-28+12:00  "); +    p._post (); +    assert (p.post_gmonth_day () == gmonth_day (10, 28, 12, 00)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--12-31"); +    p._post (); +    assert (p.post_gmonth_day () == gmonth_day (12, 31)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--01-01Z"); +    p._post (); +    assert (p.post_gmonth_day () == gmonth_day (1, 1, 0, 0)); +  } + +  // gyear_month +  // +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("200"); +    p._characters ("7-12+12:00  "); +    p._post (); +    assert (p.post_gyear_month () == gyear_month (2007, 12, 12, 00)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-2007-10"); +    p._post (); +    assert (p.post_gyear_month () == gyear_month (-2007, 10)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("20007-10Z"); +    p._post (); +    assert (p.post_gyear_month () == gyear_month (20007, 10, 0, 0)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-20007-01"); +    p._post (); +    assert (p.post_gyear_month () == gyear_month (-20007, 1)); +  } + +  // date +  // +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("200"); +    p._characters ("7-12-26+12:00  "); +    p._post (); +    assert (p.post_date () == date (2007, 12, 26, 12, 0)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-2007-10-15"); +    p._post (); +    assert (p.post_date () == date (-2007, 10, 15)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("20007-12-31Z"); +    p._post (); +    assert (p.post_date () == date (20007, 12, 31, 0, 0)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-20007-01-01"); +    p._post (); +    assert (p.post_date () == date (-20007, 1, 1)); +  } + +  // time +  // +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("12:"); +    p._characters ("46:23.456+12:00  "); +    p._post (); +    assert (p.post_time () == time (12, 46, 23.456, 12, 0)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("12:13:14"); +    p._post (); +    assert (p.post_time () == time (12, 13, 14.0)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("12:13:14Z"); +    p._post (); +    assert (p.post_time () == time (12, 13, 14.0, 0, 0)); +  } + +  // date_time +  // +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("200"); +    p._characters ("7-12-26T12:13:14.123+12:00  "); +    p._post (); +    assert (p.post_date_time () == +            date_time (2007, 12, 26, 12, 13, 14.123, 12, 0)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-2007-10-15T12:13:14"); +    p._post (); +    assert (p.post_date_time () == date_time (-2007, 10, 15, 12, 13, 14.0)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("20007-12-31T12:13:14Z"); +    p._post (); +    assert (p.post_date_time () == +            date_time (20007, 12, 31, 12, 13, 14.0, 0, 0)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-20007-01-01T12:13:14"); +    p._post (); +    assert (p.post_date_time () == date_time (-20007, 1, 1, 12, 13, 14.0)); +  } + +  // duration +  // +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \t\n "); +    p._characters ("-P200"); +    p._characters ("7Y13M32DT25H61M61.123S  "); +    p._post (); +    assert (p.post_duration () == +            duration (true, 2007, 13, 32, 25, 61, 61.123)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P1Y"); +    p._post (); +    assert (p.post_duration () == duration (false, 1, 0, 0, 0, 0, 0.0)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P1M"); +    p._post (); +    assert (p.post_duration () == duration (false, 0, 1, 0, 0, 0, 0.0)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P1D"); +    p._post (); +    assert (p.post_duration () == duration (false, 0, 0, 1, 0, 0, 0.0)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("PT1H"); +    p._post (); +    assert (p.post_duration () == duration (false, 0, 0, 0, 1, 0, 0.0)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("PT1M"); +    p._post (); +    assert (p.post_duration () == duration (false, 0, 0, 0, 0, 1, 0.0)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("PT1.1S"); +    p._post (); +    assert (p.post_duration () == duration (false, 0, 0, 0, 0, 0, 1.1)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P1YT1S"); +    p._post (); +    assert (p.post_duration () == duration (false, 1, 0, 0, 0, 0, 1.0)); +  } + +  // Bad +  // + +  // gday & time zone parsing +  // +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--12"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---1"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---00"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---32"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---2X"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---12asd"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---12X"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---1212:00"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---12+2:00"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---12+1200"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---12+15:00"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---12+12:60"); +    assert (test_post_fail (p)); +  } + +  { +    gday_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("---12+14:01"); +    assert (test_post_fail (p)); +  } + +  // gmonth +  // +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-12"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--00"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--13"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--1X"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--11+12:3o"); +    assert (test_post_fail (p)); +  } + +  // gyear +  // +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("207"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-207"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-0000"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("20X7"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007+12:3o"); +    assert (test_post_fail (p)); +  } + +  // gmonth_day +  // +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-12-12"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--1212"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--12?12"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--00-12"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--12-00"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--13-23"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--12-32"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--1X-12"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--12-2X"); +    assert (test_post_fail (p)); +  } + +  { +    gmonth_day_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("--11-11+12:3o"); +    assert (test_post_fail (p)); +  } + +  // gyear_month +  // +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("207-01"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-207-01"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0000-01"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("20X7-01"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007?12"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-0"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-00"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-13"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-1X"); +    assert (test_post_fail (p)); +  } + +  { +    gyear_month_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01+12:3o"); +    assert (test_post_fail (p)); +  } + +  // date +  // +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("207-01-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-207-01-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0000-01-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("20X7-01-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007?01-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-0-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-00-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-13-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-1X-01"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10?12"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-0"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-00"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-32"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-2X"); +    assert (test_post_fail (p)); +  } + +  { +    date_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01+12:3o"); +    assert (test_post_fail (p)); +  } + +  // time +  // +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1:01:01"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2X:01:01"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23?01:01"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:0:01"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:60:01"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:4X:01"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:10"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:10?12"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:10:"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:10:0"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:10:01."); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:10:60"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:10:2X"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("24:01:00"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("24:00:01"); +    assert (test_post_fail (p)); +  } + +  { +    time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:01:01+12:3o"); +    assert (test_post_fail (p)); +  } + +  // date_time +  // +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("207-01-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-207-01-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0000-01-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("20X7-01-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007?01-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-0-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-00-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-13-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-1X-01T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10?12T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-0T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-00T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-32T12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-10-2XT12:13:14"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T1:01:01"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T2X:01:01"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23?01:01"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:0:01"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:60:01"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:4X:01"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:10"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:10?12"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:10:"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:10:0"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:10:01."); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:10:60"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T23:10:2X"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T24:01:00"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T24:00:01"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("23:01:01+12:3o"); +    assert (test_post_fail (p)); +  } + +  { +    date_time_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007-01-01T12:13:14+12:3o"); +    assert (test_post_fail (p)); +  } + +  // duration +  // +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    // p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2007Y"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-2007Y"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P-2007Y"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P-1M"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P-1D"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("PT-1H"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("PT-1M"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("PT-1.1S"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P1H1M1S"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P1M1Y"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("PT1S1H"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("PT1H1Y"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P1Ygarbage"); +    assert (test_post_fail (p)); +  } + +  { +    duration_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("P1YT"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/date-time/makefile b/xsd/tests/cxx/parser/validation/built-in/date-time/makefile new file mode 100644 index 0000000..d5e2edc --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/date-time/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/date-time/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/float/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/float/driver.cxx new file mode 100644 index 0000000..1f6f0bd --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/float/driver.cxx @@ -0,0 +1,287 @@ +// file      : tests/cxx/parser/validation/built-in/float/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in float, double, and decimal types validation. +// +#include <math.h> +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  // Good. +  // + +  // float +  // +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" 0000123.456 "); +    p._post (); +    assert (p.post_float () == 123.456F); +  } + +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-12.345E2"); +    p._post (); +    assert (p.post_float () == -12.345E2F); +  } + +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_float () == 0.0F); +  } + +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-0"); +    p._post (); +    assert (p.post_float () == -0.0F); +  } + +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("INF"); +    p._post (); +    assert (isinf (p.post_float ())); +  } + +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-INF"); +    p._post (); +    assert (isinf (p.post_float ())); +  } + +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("NaN"); +    p._post (); +    assert (isnan (p.post_float ())); +  } + +  // double +  // +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" 0000123.456789 "); +    p._post (); +    assert (p.post_double () == 123.456789); +  } + +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-12.3456789E2"); +    p._post (); +    assert (p.post_double () == -12.3456789E2); +  } + +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_double () == 0.0); +  } + +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-0"); +    p._post (); +    assert (p.post_double () == -0.0); +  } + +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("INF"); +    p._post (); +    assert (isinf (p.post_double ())); +  } + +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-INF"); +    p._post (); +    assert (isinf (p.post_double ())); +  } + +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("NaN"); +    p._post (); +    assert (isnan (p.post_double ())); +  } + +  // decimal +  // +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" 0000123.456789 "); +    p._post (); +    assert (p.post_decimal () == 123.456789); +  } + +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-123.45678912345"); +    p._post (); +    assert (p.post_decimal () == -123.45678912345); +  } + +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_decimal () == 0.0); +  } + +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-0"); +    p._post (); +    assert (p.post_decimal () == -0.0); +  } + + +  // Bad +  // + +  // float +  // +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+INF"); +    assert (test_post_fail (p)); +  } + +  { +    float_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1.45 E2"); +    assert (test_post_fail (p)); +  } + +  // double +  // +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+INF"); +    assert (test_post_fail (p)); +  } + +  { +    double_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1.45 E2"); +    assert (test_post_fail (p)); +  } + +  // decimal +  // +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("INF"); +    assert (test_post_fail (p)); +  } + +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+INF"); +    assert (test_post_fail (p)); +  } + +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-INF"); +    assert (test_post_fail (p)); +  } + +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("NaN"); +    assert (test_post_fail (p)); +  } + +  { +    decimal_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1.45 2"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/float/makefile b/xsd/tests/cxx/parser/validation/built-in/float/makefile new file mode 100644 index 0000000..8755f3a --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/float/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/float/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/int/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/int/driver.cxx new file mode 100644 index 0000000..00c5947 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/int/driver.cxx @@ -0,0 +1,118 @@ +// file      : tests/cxx/parser/validation/built-in/int/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in int and unsigned int types validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  // Good. +  // +  { +    int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-2147483648"); +    p._post (); +    assert (p.post_int () == -2147483648); +  } + +  { +    int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_int () == 0); +  } + +  { +    int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2147483647"); +    p._post (); +    assert (p.post_int () == 2147483647); +  } + +  { +    unsigned_int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_unsigned_int () == 0); +  } + +  { +    unsigned_int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("4294967295"); +    p._post (); +    assert (p.post_unsigned_int () == 4294967295); +  } + +  // Bad +  // + +  { +    unsigned_int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-123"); +    assert (test_post_fail (p)); +  } + + +  // Ranges +  // +  { +    int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-2147483649"); +    assert (test_post_fail (p)); +  } + +  { +    int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("2147483648"); +    assert (test_post_fail (p)); +  } + +  { +    unsigned_int_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("4294967296"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/int/makefile b/xsd/tests/cxx/parser/validation/built-in/int/makefile new file mode 100644 index 0000000..4cebe64 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/int/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/int/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/integer/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/integer/driver.cxx new file mode 100644 index 0000000..fa8e4e0 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/integer/driver.cxx @@ -0,0 +1,305 @@ +// file      : tests/cxx/parser/validation/built-in/int/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in integer & friends types validation. +// +#include <limits.h> + +#include <string> +#include <sstream> +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace std; +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  // Good. +  // + +  std::string min; +  std::string max; +  std::string umax; + +  { +    ostringstream ostr; +    ostr << LLONG_MIN; +    min = ostr.str (); +  } + +  { +    ostringstream ostr; +    ostr << LLONG_MAX; +    max = ostr.str (); +  } + +  { +    ostringstream ostr; +    ostr << ULLONG_MAX; +    umax = ostr.str (); +  } + +  // integer +  // +  { +    integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (min.c_str ()); +    p._post (); +    assert (p.post_integer () == LLONG_MIN); +  } + +  { +    integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_integer () == 0); +  } + +  { +    integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (max.c_str ()); +    p._post (); +    assert (p.post_integer () == LLONG_MAX); +  } + +  // negative_integer +  // +  { +    negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (min.c_str ()); +    p._post (); +    assert (p.post_negative_integer () == LLONG_MIN); +  } + +  { +    negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-1"); +    p._post (); +    assert (p.post_negative_integer () == -1); +  } + +  // non_positive_integer +  // +  { +    non_positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (min.c_str ()); +    p._post (); +    assert (p.post_non_positive_integer () == LLONG_MIN); +  } + +  { +    non_positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+0"); +    p._post (); +    assert (p.post_non_positive_integer () == 0); +  } + +  // positive_integer +  // +  { +    positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1"); +    p._post (); +    assert (p.post_positive_integer () == 1); +  } + +  { +    positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (umax.c_str ()); +    p._post (); +    assert (p.post_positive_integer () == ULLONG_MAX); +  } + +  // non_negative_integer +  // +  /* +  { +    non_negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-0"); +    p._post (); +    assert (p.post_non_negative_integer () == 0); +  } +  */ + +  { +    non_negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_non_negative_integer () == 0); +  } + +  { +    non_negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (umax.c_str ()); +    p._post (); +    assert (p.post_non_negative_integer () == ULLONG_MAX); +  } + + +  // Bad +  // + +  std::string past_min (min); +  std::string past_max (max); +  std::string past_umax (umax); + +  assert (*past_min.rbegin () != '9'); +  assert (*past_max.rbegin () != '9'); +  assert (*past_umax.rbegin () != '9'); + +  (*past_min.rbegin ())++; +  (*past_max.rbegin ())++; +  (*past_umax.rbegin ())++; + +  // integer +  // +  { +    integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (past_min.c_str ()); +    assert (test_post_fail (p)); +  } + +  { +    integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (past_max.c_str ()); +    assert (test_post_fail (p)); +  } + +  // negative_integer +  // +  { +    negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (past_min.c_str ()); +    assert (test_post_fail (p)); +  } + +  { +    negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-0"); +    assert (test_post_fail (p)); +  } + +  { +    negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1"); +    assert (test_post_fail (p)); +  } + +  // non_positive_integer +  // +  { +    non_positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (past_min.c_str ()); +    assert (test_post_fail (p)); +  } + +  { +    non_positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1"); +    assert (test_post_fail (p)); +  } + +  // positive_integer +  // +  { +    positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-1"); +    assert (test_post_fail (p)); +  } + +  { +    positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("+0"); +    assert (test_post_fail (p)); +  } + +  { +    positive_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (past_umax.c_str ()); +    assert (test_post_fail (p)); +  } + +  // non_negative_integer +  // +  { +    non_negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-1"); +    assert (test_post_fail (p)); +  } + +  { +    non_negative_integer_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (past_umax.c_str ()); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/integer/makefile b/xsd/tests/cxx/parser/validation/built-in/integer/makefile new file mode 100644 index 0000000..6b9d816 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/integer/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/integer/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/long/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/long/driver.cxx new file mode 100644 index 0000000..c7a66c4 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/long/driver.cxx @@ -0,0 +1,118 @@ +// file      : tests/cxx/parser/validation/built-in/long/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in long and unsigned long types validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  // Good. +  // +  { +    long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-9223372036854775808"); +    p._post (); +    assert (p.post_long () == (-9223372036854775807LL - 1)); +  } + +  { +    long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_long () == 0); +  } + +  { +    long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("9223372036854775807"); +    p._post (); +    assert (p.post_long () == 9223372036854775807LL); +  } + +  { +    unsigned_long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_unsigned_long () == 0); +  } + +  { +    unsigned_long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("18446744073709551615"); +    p._post (); +    assert (p.post_unsigned_long () == 18446744073709551615ULL); +  } + +  // Bad +  // + +  { +    unsigned_long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-123"); +    assert (test_post_fail (p)); +  } + + +  // Ranges +  // +  { +    long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-9223372036854775809"); +    assert (test_post_fail (p)); +  } + +  { +    long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("9223372036854775808"); +    assert (test_post_fail (p)); +  } + +  { +    unsigned_long_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("18446744073709551616"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/long/makefile b/xsd/tests/cxx/parser/validation/built-in/long/makefile new file mode 100644 index 0000000..2ab6368 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/long/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/long/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/makefile b/xsd/tests/cxx/parser/validation/built-in/makefile new file mode 100644 index 0000000..34bea8f --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/makefile @@ -0,0 +1,19 @@ +# file      : tests/cxx/parser/validation/built-in/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +tests := any-type binary boolean byte date-time float int integer long \ +qname short string uri + +default   := $(out_base)/ +test      := $(out_base)/.test +clean     := $(out_base)/.clean + +$(default): $(addprefix $(out_base)/,$(addsuffix /,$(tests))) +$(test): $(addprefix $(out_base)/,$(addsuffix /.test,$(tests))) +$(clean): $(addprefix $(out_base)/,$(addsuffix /.clean,$(tests))) + +$(foreach t,$(tests),$(call import,$(src_base)/$t/makefile)) diff --git a/xsd/tests/cxx/parser/validation/built-in/qname/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/qname/driver.cxx new file mode 100644 index 0000000..3a4bc90 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/qname/driver.cxx @@ -0,0 +1,107 @@ +// file      : tests/cxx/parser/validation/built-in/qname/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in QName type validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +bool +test_post_fail (qname_pimpl<char>& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  typedef xsd::cxx::parser::qname<char> qname; + +  // Good. +  // +  { +    qname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" xsi"); +    p._characters (":"); +    p._characters ("schemaLocation"); +    p._post (); +    assert (p.post_qname () == qname ("xsi", "schemaLocation")); +  } + +  { +    qname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("schemaLocation"); +    p._post (); +    assert (p.post_qname () == qname ("schemaLocation")); +  } + + +  // Bad +  // +  { +    qname_pimpl<char> p; +    p.pre (); +    p._pre (); +    //p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    qname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (":"); +    assert (test_post_fail (p)); +  } + +  { +    qname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("xsi:"); +    assert (test_post_fail (p)); +  } + +  { +    qname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (":schemaLocation"); +    assert (test_post_fail (p)); +  } + +  { +    qname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("x?i:schemaLocation"); +    assert (test_post_fail (p)); +  } + +  { +    qname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("xsi:schema Location"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/qname/makefile b/xsd/tests/cxx/parser/validation/built-in/qname/makefile new file mode 100644 index 0000000..5f53fea --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/qname/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/qname/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/short/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/short/driver.cxx new file mode 100644 index 0000000..2bb95d2 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/short/driver.cxx @@ -0,0 +1,118 @@ +// file      : tests/cxx/parser/validation/built-in/short/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in short and unsigned short types validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post (); +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  // Good. +  // +  { +    short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-32768"); +    p._post (); +    assert (p.post_short () == -32768); +  } + +  { +    short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_short () == 0); +  } + +  { +    short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("32767"); +    p._post (); +    assert (p.post_short () == 32767); +  } + +  { +    unsigned_short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("0"); +    p._post (); +    assert (p.post_unsigned_short () == 0); +  } + +  { +    unsigned_short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("65535"); +    p._post (); +    assert (p.post_unsigned_short () == 65535); +  } + +  // Bad +  // + +  { +    unsigned_short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-1234"); +    assert (test_post_fail (p)); +  } + + +  // Ranges +  // +  { +    short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-32769"); +    assert (test_post_fail (p)); +  } + +  { +    short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("32768"); +    assert (test_post_fail (p)); +  } + +  { +    unsigned_short_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("65536"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/short/makefile b/xsd/tests/cxx/parser/validation/built-in/short/makefile new file mode 100644 index 0000000..eee8382 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/short/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/short/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/string/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/string/driver.cxx new file mode 100644 index 0000000..2419d59 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/string/driver.cxx @@ -0,0 +1,514 @@ +// file      : tests/cxx/parser/validation/built-in/string/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in string & friends types validation. +// +#include <string> +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +template <typename T> +bool +test_post_fail (T& p) +{ +  try +  { +    p._post_impl (); // List implementation needs this to be post_impl. +  } +  catch (invalid_value<char> const&) +  { +    return true; +  } + +  return false; +} + +int +main () +{ +  typedef xsd::cxx::parser::string_sequence<char> strings; + +  // Good. +  // + +  // string +  // +  { +    string_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" aaa "); +    p._characters ("bbb"); +    p._characters (" "); +    p._post (); +    assert (p.post_string () == " \n\t aaa bbb "); +  } + +  // normalized_string +  // +  { +    normalized_string_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" aaa \n\t "); +    p._characters (" bbb"); +    p._characters ("  "); +    p._post (); +    assert (p.post_normalized_string () == "    aaa     bbb  "); +  } + +  // token +  // +  { +    token_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" aaa \n\t "); +    p._characters (" bbb \n\t"); +    p._characters ("  "); +    p._post (); +    assert (p.post_token () == "aaa bbb"); +  } + +  // name +  // +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" a:b-c_d123 "); +    p._characters ("  "); +    p._post (); +    assert (p.post_name () == "a:b-c_d123"); +  } + +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" _12 "); +    p._characters ("  "); +    p._post (); +    assert (p.post_name () == "_12"); +  } + +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" :12 "); +    p._characters ("  "); +    p._post (); +    assert (p.post_name () == ":12"); +  } + +  // nmtoken +  // +  { +    nmtoken_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" 123a:b-c_d123 "); +    p._characters (" \n\t"); +    p._characters ("  "); +    p._post (); +    assert (p.post_nmtoken () == "123a:b-c_d123"); +  } + +  // nmtokens +  // +  { +    strings s; +    s.push_back ("123"); +    s.push_back ("abc"); + +    nmtokens_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" 123 "); +    p._characters (" \n\t abc "); +    p._characters ("  "); +    p._post (); +    assert (p.post_nmtokens () == s); +  } + +  // ncname +  // +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" a.b-c_d123 "); +    p._characters ("  "); +    p._post (); +    assert (p.post_ncname () == "a.b-c_d123"); +  } + +  // id +  // +  { +    id_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" a.b-c_d123 "); +    p._characters ("  "); +    p._post (); +    assert (p.post_id () == "a.b-c_d123"); +  } + +  // idref +  // +  { +    idref_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" a.b-c_d123 "); +    p._characters ("  "); +    p._post (); +    assert (p.post_idref () == "a.b-c_d123"); +  } + +  // idrefs +  // +  { +    strings s; +    s.push_back ("a123"); +    s.push_back ("abc"); + +    idrefs_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" \n\t"); +    p._characters (" a123 "); +    p._characters (" \n\t abc "); +    p._characters ("  "); +    p._post (); +    assert (p.post_idrefs () == s); +  } + +  // language +  // +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" x "); +    p._post (); +    assert (p.post_language () == "x"); +  } + +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" en "); +    p._post (); +    assert (p.post_language () == "en"); +  } + +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" en"); +    p._characters ("-us "); +    p._post (); +    assert (p.post_language () == "en-us"); +  } + +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("one-two-three-four44-seven77-eight888"); +    p._post (); +    assert (p.post_language () == "one-two-three-four44-seven77-eight888"); +  } + + +  // Bad +  // + +  // name +  // +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (".a"); +    assert (test_post_fail (p)); +  } + +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-a"); +    assert (test_post_fail (p)); +  } + +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1a"); +    assert (test_post_fail (p)); +  } + +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a,b"); +    assert (test_post_fail (p)); +  } + +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a b"); +    assert (test_post_fail (p)); +  } + +  { +    name_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a<b"); +    assert (test_post_fail (p)); +  } + +  // nmtoken +  // +  { +    nmtoken_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    nmtoken_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a,b"); +    assert (test_post_fail (p)); +  } + +  { +    nmtoken_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a b"); +    assert (test_post_fail (p)); +  } + +  { +    nmtoken_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a<b"); +    assert (test_post_fail (p)); +  } + +  // nmtokens +  // +  { +    nmtokens_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" "); +    p._characters (" \t\n  "); +    assert (test_post_fail (p)); +  } + +  { +    nmtokens_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("ab a,b"); +    assert (test_post_fail (p)); +  } + +  // ncname +  // +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (""); +    assert (test_post_fail (p)); +  } + +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (".a"); +    assert (test_post_fail (p)); +  } + +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("-a"); +    assert (test_post_fail (p)); +  } + +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (":a"); +    assert (test_post_fail (p)); +  } + +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1a"); +    assert (test_post_fail (p)); +  } + +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("1:a"); +    assert (test_post_fail (p)); +  } + +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a,b"); +    assert (test_post_fail (p)); +  } + +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a b"); +    assert (test_post_fail (p)); +  } + +  { +    ncname_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a<b"); +    assert (test_post_fail (p)); +  } + +  // id +  // +  { +    id_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a b"); +    assert (test_post_fail (p)); +  } + +  // idref +  // +  { +    idref_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a b"); +    assert (test_post_fail (p)); +  } + +  // idrefs +  // +  { +    idrefs_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("  "); +    p._characters (" \t\n "); +    assert (test_post_fail (p)); +  } + +  { +    idrefs_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("ab a<b"); +    assert (test_post_fail (p)); +  } + +  // language +  // +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters (" "); +    assert (test_post_fail (p)); +  } + +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("en-"); +    assert (test_post_fail (p)); +  } + +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("a1"); +    assert (test_post_fail (p)); +  } + +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("en+us"); +    assert (test_post_fail (p)); +  } + +  { +    language_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("en-nine99999"); +    assert (test_post_fail (p)); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/string/makefile b/xsd/tests/cxx/parser/validation/built-in/string/makefile new file mode 100644 index 0000000..5be3c4c --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/string/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/string/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/built-in/uri/driver.cxx b/xsd/tests/cxx/parser/validation/built-in/uri/driver.cxx new file mode 100644 index 0000000..f6de3c2 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/uri/driver.cxx @@ -0,0 +1,55 @@ +// file      : tests/cxx/parser/validation/built-in/uri/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the built-in anyURI type validation. +// +#include <cassert> + +#include <xsd/cxx/parser/validating/exceptions.hxx> +#include <xsd/cxx/parser/validating/xml-schema-pimpl.hxx> + +using namespace xsd::cxx::parser::validating; + +int +main () +{ +  // Good. +  // +  { +    uri_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("  "); +    p._post (); +    assert (p.post_uri () == ""); +  } + +  { +    uri_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("relative"); +    p._post (); +    assert (p.post_uri () == "relative"); +  } + +  { +    uri_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("#id"); +    p._post (); +    assert (p.post_uri () == "#id"); +  } + +  { +    uri_pimpl<char> p; +    p.pre (); +    p._pre (); +    p._characters ("http://www.example.com/foo#bar"); +    p._post (); +    assert (p.post_uri () == "http://www.example.com/foo#bar"); +  } +} diff --git a/xsd/tests/cxx/parser/validation/built-in/uri/makefile b/xsd/tests/cxx/parser/validation/built-in/uri/makefile new file mode 100644 index 0000000..ad53e89 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/built-in/uri/makefile @@ -0,0 +1,65 @@ +# file      : tests/cxx/parser/validation/built-in/uri/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../../build/bootstrap.make + +cxx := driver.cxx + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +$(call include-dep,$(dep)) + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +$(test): driver := $(driver) +$(test): $(driver) +	$(call message,test $$1,$$1,$(driver)) + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) diff --git a/xsd/tests/cxx/parser/validation/choice/driver.cxx b/xsd/tests/cxx/parser/validation/choice/driver.cxx new file mode 100644 index 0000000..87cd0a9 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/driver.cxx @@ -0,0 +1,128 @@ +// file      : tests/cxx/parser/validation/choice/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the choice compositor validation. +// + +#include <string> +#include <fstream> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; +using xml_schema::ro_string; + +struct choice_pimpl: choice_pskel +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  a (string const& v) +  { +    cout << "  a = " << v << endl; +  } + +  virtual void +  b (string const& v) +  { +    cout << "  b = " << v << endl; +  } + +  virtual void +  c (string const& v) +  { +    cout << "  c = " << v << endl; +  } + +  virtual void +  d (string const& v) +  { +    cout << "  d = " << v << endl; +  } + +  virtual void +  _start_any_element (ro_string const& ns,  +                      ro_string const& name, +		      ro_string const*) +  { +    cout << "  any: " << ns << "#" << name << endl +         << "  {" << endl; +  } + +  virtual void +  _any_characters (ro_string const& v) +  { +    cout << "    chars = " << v << endl; +  } + +  virtual void +  _end_any_element (ro_string const&, ro_string const&) +  { +    cout << "  }" << endl; +  } + +  virtual void +  post_choice () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    choice_pimpl choice_p; +    type_pimpl type_p; + +    choice_p.parsers (string_p, string_p, string_p, string_p); +    type_p.parsers (choice_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    try +    { +      ifstream ifs (argv[1]); +      type_p.pre (); +      doc_p.parse (ifs, argv[1], "", xml_schema::flags::dont_validate); +      type_p.post_type (); +    } +    catch (xml_schema::exception const& e) +    { +      cout << "  " << e << endl +           << "}" << endl +           << endl; +    } +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/validation/choice/makefile b/xsd/tests/cxx/parser/validation/choice/makefile new file mode 100644 index 0000000..f113bd5 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/makefile @@ -0,0 +1,89 @@ +# file      : tests/cxx/parser/validation/choice/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +tests := 000 001 002 003 004 + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +test_targets := $(addprefix $(out_base)/.test-,$(tests)) + +$(test): $(test_targets) +$(test_targets): driver := $(driver) + +.PHONY: $(out_base)/.test-% +$(out_base)/.test-%: $(driver) $(src_base)/test.xsd $(src_base)/test-%.xml $(src_base)/test-%.std +	$(call message,test $(out_base)/$*,$(driver) $(src_base)/test-$*.xml | diff -u $(src_base)/test-$*.std -) + + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep))                           \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/validation/choice/test-000.std b/xsd/tests/cxx/parser/validation/choice/test-000.std new file mode 100644 index 0000000..856b7f5 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-000.std @@ -0,0 +1,22 @@ +{ +  a = a +  b = b +} + +{ +  c = c +  d = d +  any: other#any +  { +    chars = any +  } +  a = a +} + +{ +  c = c +  d = d +  d = d +  a = a +} + diff --git a/xsd/tests/cxx/parser/validation/choice/test-000.xml b/xsd/tests/cxx/parser/validation/choice/test-000.xml new file mode 100644 index 0000000..39b9614 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-000.xml @@ -0,0 +1,30 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <choice> +    <a>a</a> + +    <b>b</b> +  </choice> + +  <choice> +    <c>c</c> +    <d>d</d> + +    <o:any>any</o:any> + +    <a>a</a> +  </choice> + +  <choice> +    <c>c</c> +    <d>d</d> + +    <d>d</d> + +    <a>a</a> +  </choice> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/choice/test-001.std b/xsd/tests/cxx/parser/validation/choice/test-001.std new file mode 100644 index 0000000..8a78666 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-001.std @@ -0,0 +1,4 @@ +{ +  :8:12 error: expected element 'a' +} + diff --git a/xsd/tests/cxx/parser/validation/choice/test-001.xml b/xsd/tests/cxx/parser/validation/choice/test-001.xml new file mode 100644 index 0000000..c509e0d --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-001.xml @@ -0,0 +1,10 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> +	 +  <!-- invalid --> +  <choice> +  </choice> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/choice/test-002.std b/xsd/tests/cxx/parser/validation/choice/test-002.std new file mode 100644 index 0000000..1dc1a3a --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-002.std @@ -0,0 +1,11 @@ +{ +  c = c +  d = d +  any: other#any +  { +    chars = any +  } +  a = a +  :14:8 error: unexpected element 'b' +} + diff --git a/xsd/tests/cxx/parser/validation/choice/test-002.xml b/xsd/tests/cxx/parser/validation/choice/test-002.xml new file mode 100644 index 0000000..3b7e663 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-002.xml @@ -0,0 +1,17 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- invalid --> +  <choice> +    <c>c</c> +    <d>d</d> + +    <o:any>any</o:any> + +    <a>a</a> +    <b>b</b> +  </choice> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/choice/test-003.std b/xsd/tests/cxx/parser/validation/choice/test-003.std new file mode 100644 index 0000000..29d5e44 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-003.std @@ -0,0 +1,5 @@ +{ +  c = c +  :9:12 error: expected element 'd' +} + diff --git a/xsd/tests/cxx/parser/validation/choice/test-003.xml b/xsd/tests/cxx/parser/validation/choice/test-003.xml new file mode 100644 index 0000000..ba15c7e --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-003.xml @@ -0,0 +1,11 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- invalid --> +  <choice> +    <c>c</c> +  </choice> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/choice/test-004.std b/xsd/tests/cxx/parser/validation/choice/test-004.std new file mode 100644 index 0000000..4a7530b --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-004.std @@ -0,0 +1,4 @@ +{ +  :8:8 error: expected element 'a' instead of 'x' +} + diff --git a/xsd/tests/cxx/parser/validation/choice/test-004.xml b/xsd/tests/cxx/parser/validation/choice/test-004.xml new file mode 100644 index 0000000..f6960dd --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test-004.xml @@ -0,0 +1,11 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- invalid --> +  <choice> +    <x>x</x> +  </choice> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/choice/test.xsd b/xsd/tests/cxx/parser/validation/choice/test.xsd new file mode 100644 index 0000000..8132bbb --- /dev/null +++ b/xsd/tests/cxx/parser/validation/choice/test.xsd @@ -0,0 +1,24 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="choice"> +    <choice maxOccurs="3"> +      <element name="a" type="string"/> +      <element name="b" type="string" maxOccurs="unbounded"/> +      <sequence> +        <element name="c" type="string" minOccurs="0"/> +	<element name="d" type="string"/> +      </sequence> +      <any namespace="other" maxOccurs="unbounded"/> +    </choice> +  </complexType> + +  <complexType name="type"> +    <sequence> +      <element name="choice" type="t:choice" maxOccurs="unbounded"/> +    </sequence> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> diff --git a/xsd/tests/cxx/parser/validation/makefile b/xsd/tests/cxx/parser/validation/makefile new file mode 100644 index 0000000..5b7b884 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/makefile @@ -0,0 +1,18 @@ +# file      : tests/cxx/parser/validation/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +tests := all any attribute built-in choice restriction sequence + +default   := $(out_base)/ +test      := $(out_base)/.test +clean     := $(out_base)/.clean + +$(default): $(addprefix $(out_base)/,$(addsuffix /,$(tests))) +$(test): $(addprefix $(out_base)/,$(addsuffix /.test,$(tests))) +$(clean): $(addprefix $(out_base)/,$(addsuffix /.clean,$(tests))) + +$(foreach t,$(tests),$(call import,$(src_base)/$t/makefile)) diff --git a/xsd/tests/cxx/parser/validation/restriction/driver.cxx b/xsd/tests/cxx/parser/validation/restriction/driver.cxx new file mode 100644 index 0000000..40a2bc9 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/driver.cxx @@ -0,0 +1,109 @@ +// file      : tests/cxx/parser/validation/restriction/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the restriction compositor validation. +// + +#include <string> +#include <fstream> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; + +struct base_a_pimpl: base_a_pskel +{ +}; + +struct restriction_a_pimpl: restriction_a_pskel +{ +}; + +struct extension_b_pimpl: extension_b_pskel +{ +}; + +struct restriction_b_pimpl: restriction_b_pskel +{ +}; + +struct type_b_pimpl: type_b_pskel +{ +}; + +struct type_r_pimpl: type_r_pskel +{ +}; + + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    base_a_pimpl base_a_p; +    restriction_a_pimpl restriction_a_p; +    extension_b_pimpl extension_b_p; +    restriction_b_pimpl restriction_b_p; +    type_b_pimpl type_b_p; +    type_r_pimpl type_r_p; + +    base_a_p.parsers (string_p, string_p, string_p, +                      string_p, string_p, string_p); + +    restriction_a_p.parsers (string_p, string_p, string_p, +                             string_p, string_p, string_p); + +    extension_b_p.parsers (string_p, string_p, string_p, +                           string_p, string_p); + +    restriction_b_p.parsers (string_p, string_p, string_p, +                             string_p, string_p); + +    type_b_p.parsers (base_a_p, extension_b_p); +    type_r_p.parsers (restriction_a_p, restriction_b_p); + +    xml_schema::document doc_b_p (type_b_p, "test", "root"); +    xml_schema::document doc_r_p (type_r_p, "test", "root"); + +    { +      ifstream ifs (argv[1]); +      type_b_p.pre (); +      doc_b_p.parse (ifs, argv[1], "", xml_schema::flags::dont_validate); +      type_b_p.post_type_b (); +    } + +    try +    { +      ifstream ifs (argv[1]); +      type_r_p.pre (); +      doc_r_p.parse (ifs, argv[1], "", xml_schema::flags::dont_validate); +      type_r_p.post_type_r (); +    } +    catch (xml_schema::exception const& e) +    { +      cout << e << endl; +    } +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/validation/restriction/makefile b/xsd/tests/cxx/parser/validation/restriction/makefile new file mode 100644 index 0000000..66e4d9a --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/makefile @@ -0,0 +1,89 @@ +# file      : tests/cxx/parser/validation/restriction/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +tests := 000 001 002 003 004 005 + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +test_targets := $(addprefix $(out_base)/.test-,$(tests)) + +$(test): $(test_targets) +$(test_targets): driver := $(driver) + +.PHONY: $(out_base)/.test-% +$(out_base)/.test-%: $(driver) $(src_base)/test.xsd $(src_base)/test-%.xml $(src_base)/test-%.std +	$(call message,test $(out_base)/$*,$(driver) $(src_base)/test-$*.xml | diff -u $(src_base)/test-$*.std -) + + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep))                           \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/validation/restriction/test-000.std b/xsd/tests/cxx/parser/validation/restriction/test-000.std new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-000.std diff --git a/xsd/tests/cxx/parser/validation/restriction/test-000.xml b/xsd/tests/cxx/parser/validation/restriction/test-000.xml new file mode 100644 index 0000000..21402b4 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-000.xml @@ -0,0 +1,31 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <restriction-a z="z"> +    <a>a</a> +    <b>b</b> +    <c>c</c> +  </restriction-a> + +  <restriction-a x="x" y="y" z="z"> +    <a>a</a> +    <b>b</b> +    <c>c</c> +  </restriction-a> + +  <restriction-b y="y"> +    <a>a</a> +    <b>b</b> +  </restriction-b> + +  <restriction-b y="y"> +    <a>a</a> +    <c>c</c> +  </restriction-b> + +  <restriction-b x="x" y="y"> +    <a>a</a> +  </restriction-b> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/restriction/test-001.std b/xsd/tests/cxx/parser/validation/restriction/test-001.std new file mode 100644 index 0000000..5077837 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-001.std @@ -0,0 +1 @@ +:7:8 error: expected element 'a' instead of 'b' diff --git a/xsd/tests/cxx/parser/validation/restriction/test-001.xml b/xsd/tests/cxx/parser/validation/restriction/test-001.xml new file mode 100644 index 0000000..4015302 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-001.xml @@ -0,0 +1,11 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- valid base but not restriction: a element --> +  <restriction-a z="z"> +    <b>b</b> +    <c>c</c> +  </restriction-a> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/restriction/test-002.std b/xsd/tests/cxx/parser/validation/restriction/test-002.std new file mode 100644 index 0000000..f12c342 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-002.std @@ -0,0 +1 @@ +:10:19 error: expected attribute 'z' diff --git a/xsd/tests/cxx/parser/validation/restriction/test-002.xml b/xsd/tests/cxx/parser/validation/restriction/test-002.xml new file mode 100644 index 0000000..eb7684c --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-002.xml @@ -0,0 +1,12 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- valid base but not restriction: z attribute --> +  <restriction-a> +    <a>a</a> +    <b>b</b> +    <c>c</c> +  </restriction-a> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/restriction/test-003.std b/xsd/tests/cxx/parser/validation/restriction/test-003.std new file mode 100644 index 0000000..0c65175 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-003.std @@ -0,0 +1 @@ +:11:8 error: unexpected element 'a' diff --git a/xsd/tests/cxx/parser/validation/restriction/test-003.xml b/xsd/tests/cxx/parser/validation/restriction/test-003.xml new file mode 100644 index 0000000..49f18c7 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-003.xml @@ -0,0 +1,16 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- valid base but not restriction: sequence maxOccurs="1" --> +  <restriction-a z="z"> +    <a>a</a> +    <b>b</b> +    <c>c</c> + +    <a>a</a> +    <b>b</b> +    <c>c</c> +  </restriction-a> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/restriction/test-004.std b/xsd/tests/cxx/parser/validation/restriction/test-004.std new file mode 100644 index 0000000..5077837 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-004.std @@ -0,0 +1 @@ +:7:8 error: expected element 'a' instead of 'b' diff --git a/xsd/tests/cxx/parser/validation/restriction/test-004.xml b/xsd/tests/cxx/parser/validation/restriction/test-004.xml new file mode 100644 index 0000000..115cd38 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-004.xml @@ -0,0 +1,10 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- valid extension but not restriction: a element --> +  <restriction-b y="y"> +    <b>b</b> +  </restriction-b> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/restriction/test-005.std b/xsd/tests/cxx/parser/validation/restriction/test-005.std new file mode 100644 index 0000000..e92de14 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-005.std @@ -0,0 +1 @@ +:9:19 error: expected attribute 'y' diff --git a/xsd/tests/cxx/parser/validation/restriction/test-005.xml b/xsd/tests/cxx/parser/validation/restriction/test-005.xml new file mode 100644 index 0000000..e9ab7d9 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test-005.xml @@ -0,0 +1,11 @@ +<t:root xmlns:t="test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- valid extension but not restriction: y attribute --> +  <restriction-b> +    <a>a</a> +    <b>b</b> +  </restriction-b> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/restriction/test.xsd b/xsd/tests/cxx/parser/validation/restriction/test.xsd new file mode 100644 index 0000000..158ded5 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/restriction/test.xsd @@ -0,0 +1,82 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <!-- simple case --> +  <complexType name="base-a"> +    <sequence minOccurs="1" maxOccurs="2"> +      <element name="a" type="string" minOccurs="0"/> +      <element name="b" type="string"/> +      <element name="c" type="string"/> +    </sequence> +    <attribute name="x" type="string"/> +    <attribute name="y" type="string"/> +    <attribute name="z" type="string"/> +  </complexType> + +  <complexType name="restriction-a"> +    <complexContent> +      <restriction base="t:base-a"> +        <sequence minOccurs="1" maxOccurs="1"> +          <element name="a" type="string" minOccurs="1"/> +          <element name="b" type="string"/> +          <element name="c" type="string"/> +        </sequence> +	<!-- Can be ommited if not changed, e.g., 'x'. --> +	<attribute name="y" type="string"/> <!-- But can also be repeated without change. --> +        <attribute name="z" type="string" use="required"/> +      </restriction> +    </complexContent> +  </complexType> + +  <!-- restriction of an extension --> +  <complexType name="base-b"> +    <sequence> +      <element name="a" type="string" minOccurs="0"/> +    </sequence> +    <attribute name="x" type="string"/> +  </complexType> + +  <complexType name="extension-b"> +    <complexContent> +      <extension base="t:base-b"> +        <choice> +          <element name="b" type="string" minOccurs="0"/> +          <element name="c" type="string"/> +        </choice> +        <attribute name="y" type="string"/> +      </extension> +    </complexContent> +  </complexType> + +  <complexType name="restriction-b"> +    <complexContent> +      <restriction base="t:extension-b"> +        <sequence> +	  <sequence> +            <element name="a" type="string" minOccurs="1"/> +          </sequence> +	  <choice> +            <element name="b" type="string" minOccurs="0"/> +            <element name="c" type="string"/> +          </choice> +	</sequence> +        <attribute name="y" type="string" use="required"/> +      </restriction> +    </complexContent> +  </complexType> + +  <complexType name="type-b"> +    <choice maxOccurs="unbounded"> +      <element name="restriction-a" type="t:base-a"/> +      <element name="restriction-b" type="t:extension-b"/> +    </choice> +  </complexType> + +  <complexType name="type-r"> +    <choice maxOccurs="unbounded"> +      <element name="restriction-a" type="t:restriction-a"/> +      <element name="restriction-b" type="t:restriction-b"/> +    </choice> +  </complexType> + +</schema> diff --git a/xsd/tests/cxx/parser/validation/sequence/driver.cxx b/xsd/tests/cxx/parser/validation/sequence/driver.cxx new file mode 100644 index 0000000..2e994b2 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/driver.cxx @@ -0,0 +1,141 @@ +// file      : tests/cxx/parser/validation/sequence/driver.cxx +// author    : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Test the sequence compositor validation. +// + +#include <string> +#include <fstream> +#include <iostream> + +#include "test-pskel.hxx" + +using namespace std; +using namespace test; +using xml_schema::ro_string; + +struct sequence_pimpl: sequence_pskel +{ +  virtual void +  pre () +  { +    cout << "{" << endl; +  } + +  virtual void +  a (string const& v) +  { +    cout << "  a = " << v << endl; +  } + +  virtual void +  b (string const& v) +  { +    cout << "  b = " << v << endl; +  } + +  virtual void +  c (string const& v) +  { +    cout << "  c = " << v << endl; +  } + +  virtual void +  d (string const& v) +  { +    cout << "  d = " << v << endl; +  } + +  virtual void +  e (string const& v) +  { +    cout << "  e = " << v << endl; +  } + +  virtual void +  f (string const& v) +  { +    cout << "  f = " << v << endl; +  } + +  virtual void +  _start_any_element (ro_string const& ns,  +                      ro_string const& name, +		      ro_string const*) +  { +    cout << "  any: " << ns << "#" << name << endl +         << "  {" << endl; +  } + +  virtual void +  _any_characters (ro_string const& v) +  { +    cout << "    chars = " << v << endl; +  } + +  virtual void +  _end_any_element (ro_string const&, ro_string const&) +  { +    cout << "  }" << endl; +  } + +  virtual void +  post_sequence () +  { +    cout << "}" << endl +         << endl; +  } +}; + +struct type_pimpl: type_pskel +{ +}; + +int +main (int argc, char* argv[]) +{ +  if (argc != 2) +  { +    cerr << "usage: " << argv[0] << " test.xml" << endl; +    return 1; +  } + +  try +  { +    xml_schema::string_pimpl string_p; +    sequence_pimpl sequence_p; +    type_pimpl type_p; + +    sequence_p.parsers (string_p, string_p, string_p, +                        string_p, string_p, string_p); +    type_p.parsers (sequence_p); + +    xml_schema::document doc_p (type_p, "test", "root"); + +    try +    { +      ifstream ifs (argv[1]); +      type_p.pre (); +      doc_p.parse (ifs, argv[1], "", xml_schema::flags::dont_validate); +      type_p.post_type (); +    } +    catch (xml_schema::exception const& e) +    { +      cout << "  " << e << endl +           << "}" << endl +           << endl; +    } +  } +  catch (xml_schema::exception const& e) +  { +    cerr << e << endl; +    return 1; +  } +  catch (ios_base::failure const&) +  { +    cerr << "io failure" << endl; +    return 1; +  } +} diff --git a/xsd/tests/cxx/parser/validation/sequence/makefile b/xsd/tests/cxx/parser/validation/sequence/makefile new file mode 100644 index 0000000..53f6c61 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/makefile @@ -0,0 +1,89 @@ +# file      : tests/cxx/parser/validation/sequence/makefile +# author    : Boris Kolpackov <boris@codesynthesis.com> +# copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make + +xsd := test.xsd +cxx := driver.cxx + +tests := 000 001 002 003 004 005 006 + +obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.o)) +dep := $(obj:.o=.o.d) + +driver := $(out_base)/driver +test   := $(out_base)/.test +clean  := $(out_base)/.clean + +# Import. +# +$(call import,\ +  $(scf_root)/import/libxerces-c/stub.make,\ +  l: xerces_c.l,cpp-options: xerces_c.l.cpp-options) + +# Build. +# +$(driver): $(obj) $(xerces_c.l) + +$(obj) $(dep): cpp_options := -I$(src_root)/libxsd +$(obj) $(dep): $(xerces_c.l.cpp-options) + +genf := $(xsd:.xsd=-pskel.hxx) $(xsd:.xsd=-pskel.ixx) $(xsd:.xsd=-pskel.cxx) +gen  := $(addprefix $(out_base)/,$(genf)) + +$(gen): xsd := $(out_root)/xsd/xsd +$(gen): xsd_options := --generate-validation +$(gen): $(out_root)/xsd/xsd + +$(call include-dep,$(dep)) + + +# Convenience alias for default target. +# +$(out_base)/: $(driver) + + +# Test. +# +test_targets := $(addprefix $(out_base)/.test-,$(tests)) + +$(test): $(test_targets) +$(test_targets): driver := $(driver) + +.PHONY: $(out_base)/.test-% +$(out_base)/.test-%: $(driver) $(src_base)/test.xsd $(src_base)/test-%.xml $(src_base)/test-%.std +	$(call message,test $(out_base)/$*,$(driver) $(src_base)/test-$*.xml | diff -u $(src_base)/test-$*.std -) + + +# Clean. +# +$(clean): $(driver).o.clean                                \ +  $(addsuffix .cxx.clean,$(obj))                           \ +  $(addsuffix .cxx.clean,$(dep))                           \ +  $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.cxx.xsd.clean)) + +# Generated .gitignore. +# +ifeq ($(out_base),$(src_base)) +$(gen): | $(out_base)/.gitignore +$(driver): | $(out_base)/.gitignore + +$(out_base)/.gitignore: files := driver $(genf) +$(clean): $(out_base)/.gitignore.clean + +$(call include,$(bld_root)/git/gitignore.make) +endif + +# How to. +# +$(call include,$(bld_root)/cxx/o-e.make) +$(call include,$(bld_root)/cxx/cxx-o.make) +$(call include,$(bld_root)/cxx/cxx-d.make) +$(call include,$(scf_root)/xsd/parser/xsd-cxx.make) + + +# Dependencies. +# +$(call import,$(src_root)/xsd/makefile) diff --git a/xsd/tests/cxx/parser/validation/sequence/test-000.std b/xsd/tests/cxx/parser/validation/sequence/test-000.std new file mode 100644 index 0000000..8a44762 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-000.std @@ -0,0 +1,56 @@ +{ +  c = c +  d = d +  any: test#any +  { +    chars = aaa +  any: #a +  { +    chars = bbb +  } +    chars = ccc +  } +  f = f +  e = e +} + +{ +  a = a +  b = b +  c = c +  d = d +  d = d +  d = d +  any: other#any +  { +    chars = any +  } +  f = f +  e = e +  e = e +} + +{ +  a = a +  b = b +  c = c +  d = d +  d = d +  d = d +  any: other#any +  { +    chars = any +  } +  f = f +  e = e +  e = e +  c = c +  d = d +  any: test#any +  { +    chars = any +  } +  f = f +  e = e +} + diff --git a/xsd/tests/cxx/parser/validation/sequence/test-000.xml b/xsd/tests/cxx/parser/validation/sequence/test-000.xml new file mode 100644 index 0000000..9bcbd7e --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-000.xml @@ -0,0 +1,46 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <sequence> +    <c>c</c> +    <d>d</d> +    <t:any>aaa<a>bbb</a>ccc</t:any> +    <f>f</f> +    <e>e</e> +  </sequence> + +  <sequence> +    <a>a</a> +    <b>b</b> +    <c>c</c> +    <d>d</d> +    <d>d</d> +    <d>d</d> +    <o:any>any</o:any> +    <f>f</f> +    <e>e</e> +    <e>e</e> +  </sequence> + +  <sequence> +    <a>a</a> +    <b>b</b> +    <c>c</c> +    <d>d</d> +    <d>d</d> +    <d>d</d> +    <o:any>any</o:any> +    <f>f</f> +    <e>e</e> +    <e>e</e> + +    <c>c</c> +    <d>d</d> +    <t:any>any</t:any> +    <f>f</f> +    <e>e</e> +  </sequence> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/sequence/test-001.std b/xsd/tests/cxx/parser/validation/sequence/test-001.std new file mode 100644 index 0000000..20dea34 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-001.std @@ -0,0 +1,4 @@ +{ +  :8:14 error: expected element 'a' +} + diff --git a/xsd/tests/cxx/parser/validation/sequence/test-001.xml b/xsd/tests/cxx/parser/validation/sequence/test-001.xml new file mode 100644 index 0000000..67d33ce --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-001.xml @@ -0,0 +1,10 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- fail minOccurs="1" --> +  <sequence> +  </sequence> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/sequence/test-002.std b/xsd/tests/cxx/parser/validation/sequence/test-002.std new file mode 100644 index 0000000..61343e7 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-002.std @@ -0,0 +1,20 @@ +{ +  c = c +  d = d +  any: test#any +  { +    chars = any +  } +  f = f +  e = e +  c = c +  d = d +  any: test#any +  { +    chars = any +  } +  f = f +  e = e +  :20:8 error: unexpected element 'c' +} + diff --git a/xsd/tests/cxx/parser/validation/sequence/test-002.xml b/xsd/tests/cxx/parser/validation/sequence/test-002.xml new file mode 100644 index 0000000..be25fcf --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-002.xml @@ -0,0 +1,27 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- fail maxOccurs="2" --> +  <sequence> +    <c>c</c> +    <d>d</d> +    <t:any>any</t:any> +    <f>f</f> +    <e>e</e> + +    <c>c</c> +    <d>d</d> +    <t:any>any</t:any> +    <f>f</f> +    <e>e</e> + +    <c>c</c> +    <d>d</d> +    <t:any>any</t:any> +    <f>f</f> +    <e>e</e> +  </sequence> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/sequence/test-003.std b/xsd/tests/cxx/parser/validation/sequence/test-003.std new file mode 100644 index 0000000..c4e1e46 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-003.std @@ -0,0 +1,5 @@ +{ +  a = a +  :9:8 error: expected element 'b' instead of 'a' +} + diff --git a/xsd/tests/cxx/parser/validation/sequence/test-003.xml b/xsd/tests/cxx/parser/validation/sequence/test-003.xml new file mode 100644 index 0000000..af7d21d --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-003.xml @@ -0,0 +1,17 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- fail a maxOccurs="1" --> +  <sequence> +    <a>a</a> +    <a>a</a> +    <c>c</c> +    <d>d</d> +    <t:any>any</t:any> +    <f>f</f> +    <e>e</e> +  </sequence> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/sequence/test-004.std b/xsd/tests/cxx/parser/validation/sequence/test-004.std new file mode 100644 index 0000000..f4c1d4d --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-004.std @@ -0,0 +1,4 @@ +{ +  :8:8 error: expected element 'a' instead of 'd' +} + diff --git a/xsd/tests/cxx/parser/validation/sequence/test-004.xml b/xsd/tests/cxx/parser/validation/sequence/test-004.xml new file mode 100644 index 0000000..a58b6d4 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-004.xml @@ -0,0 +1,14 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- fail c minOccurs="1" --> +  <sequence> +    <d>d</d> +    <t:any>any</t:any> +    <f>f</f> +    <e>e</e> +  </sequence> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/sequence/test-005.std b/xsd/tests/cxx/parser/validation/sequence/test-005.std new file mode 100644 index 0000000..9fa7904 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-005.std @@ -0,0 +1,6 @@ +{ +  c = c +  d = d +  :10:13 error: expected element '##targetNamespace#*' instead of 'other1#any' +} + diff --git a/xsd/tests/cxx/parser/validation/sequence/test-005.xml b/xsd/tests/cxx/parser/validation/sequence/test-005.xml new file mode 100644 index 0000000..e3dd03d --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-005.xml @@ -0,0 +1,15 @@ +<t:root xmlns:t="test" +        xmlns:o1="other1" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- fail any namespace="##targetNamespace other" --> +  <sequence> +    <c>c</c> +    <d>d</d> +    <o1:any>any</o1:any> +    <f>f</f> +    <e>e</e> +  </sequence> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/sequence/test-006.std b/xsd/tests/cxx/parser/validation/sequence/test-006.std new file mode 100644 index 0000000..eb79f47 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-006.std @@ -0,0 +1,13 @@ +{ +  c = c +  d = d +  any: test#any +  { +    chars = any +  } +  f = f +  e = e +  e = e +  :14:8 error: unexpected element 'e' +} + diff --git a/xsd/tests/cxx/parser/validation/sequence/test-006.xml b/xsd/tests/cxx/parser/validation/sequence/test-006.xml new file mode 100644 index 0000000..e1ecd69 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test-006.xml @@ -0,0 +1,17 @@ +<t:root xmlns:t="test" +        xmlns:o="other" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="test test.xsd"> + +  <!-- fail e maxOccurs="2" --> +  <sequence> +    <c>c</c> +    <d>d</d> +    <t:any>any</t:any> +    <f>f</f> +    <e>e</e> +    <e>e</e> +    <e>e</e> +  </sequence> + +</t:root> diff --git a/xsd/tests/cxx/parser/validation/sequence/test.xsd b/xsd/tests/cxx/parser/validation/sequence/test.xsd new file mode 100644 index 0000000..8753f54 --- /dev/null +++ b/xsd/tests/cxx/parser/validation/sequence/test.xsd @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test"> + +  <complexType name="sequence"> +    <sequence minOccurs="1" maxOccurs="2"> +      <element name="a" type="string" minOccurs="0"/> +      <sequence> +        <element name="b" type="string" minOccurs="0"/> +        <element name="c" type="string"/> +      </sequence> +      <element name="d" type="string" maxOccurs="unbounded"/> +      <sequence> +        <any namespace="##targetNamespace other"/> +	<element name="f" type="string"/> +      </sequence> +      <element name="e" type="string" maxOccurs="2"/> +    </sequence> +  </complexType> + +  <complexType name="type"> +    <sequence> +      <element name="sequence" type="t:sequence" maxOccurs="unbounded"/> +    </sequence> +  </complexType> + +  <element name="root" type="t:type"/> + +</schema> | 
