aboutsummaryrefslogtreecommitdiff
path: root/tests/cxx/serializer
diff options
context:
space:
mode:
Diffstat (limited to 'tests/cxx/serializer')
-rw-r--r--tests/cxx/serializer/all/driver.cxx108
-rw-r--r--tests/cxx/serializer/all/makefile72
-rw-r--r--tests/cxx/serializer/all/output1
-rw-r--r--tests/cxx/serializer/all/test.xsd27
-rw-r--r--tests/cxx/serializer/built-in/driver.cxx1304
-rw-r--r--tests/cxx/serializer/built-in/makefile79
-rw-r--r--tests/cxx/serializer/built-in/output-long13
-rw-r--r--tests/cxx/serializer/built-in/output-long-long13
-rw-r--r--tests/cxx/serializer/built-in/test.xsd64
-rw-r--r--tests/cxx/serializer/choice/driver.cxx253
-rw-r--r--tests/cxx/serializer/choice/makefile72
-rw-r--r--tests/cxx/serializer/choice/output1
-rw-r--r--tests/cxx/serializer/choice/test.xsd51
-rw-r--r--tests/cxx/serializer/complex/driver.cxx87
-rw-r--r--tests/cxx/serializer/complex/makefile72
-rw-r--r--tests/cxx/serializer/complex/output1
-rw-r--r--tests/cxx/serializer/complex/test.xsd33
-rw-r--r--tests/cxx/serializer/enumeration/boolean.hxx15
-rw-r--r--tests/cxx/serializer/enumeration/driver.cxx74
-rw-r--r--tests/cxx/serializer/enumeration/makefile75
-rw-r--r--tests/cxx/serializer/enumeration/output1
-rw-r--r--tests/cxx/serializer/enumeration/test.map7
-rw-r--r--tests/cxx/serializer/enumeration/test.xsd35
-rw-r--r--tests/cxx/serializer/error-handling/codes/driver.cxx327
-rw-r--r--tests/cxx/serializer/error-handling/codes/makefile72
-rw-r--r--tests/cxx/serializer/error-handling/codes/output20
-rw-r--r--tests/cxx/serializer/error-handling/codes/test.xsd22
-rw-r--r--tests/cxx/serializer/error-handling/exceptions/driver.cxx285
-rw-r--r--tests/cxx/serializer/error-handling/exceptions/makefile72
-rw-r--r--tests/cxx/serializer/error-handling/exceptions/output20
-rw-r--r--tests/cxx/serializer/error-handling/exceptions/test.xsd22
-rw-r--r--tests/cxx/serializer/error-handling/makefile24
-rw-r--r--tests/cxx/serializer/generated-driver/makefile75
-rw-r--r--tests/cxx/serializer/generated-driver/output1
-rw-r--r--tests/cxx/serializer/generated-driver/test-simpl.cxx28
-rw-r--r--tests/cxx/serializer/generated-driver/test-simpl.hxx27
-rw-r--r--tests/cxx/serializer/generated-driver/test.xsd12
-rw-r--r--tests/cxx/serializer/generated-impl/makefile84
-rw-r--r--tests/cxx/serializer/generated-impl/test.xsd193
-rw-r--r--tests/cxx/serializer/list/driver.cxx114
-rw-r--r--tests/cxx/serializer/list/makefile72
-rw-r--r--tests/cxx/serializer/list/output1
-rw-r--r--tests/cxx/serializer/list/test.xsd25
-rw-r--r--tests/cxx/serializer/makefile52
-rw-r--r--tests/cxx/serializer/polymorphism/driver.cxx203
-rw-r--r--tests/cxx/serializer/polymorphism/makefile73
-rw-r--r--tests/cxx/serializer/polymorphism/output1
-rw-r--r--tests/cxx/serializer/polymorphism/test.xsd64
-rw-r--r--tests/cxx/serializer/recursive/driver.cxx135
-rw-r--r--tests/cxx/serializer/recursive/makefile72
-rw-r--r--tests/cxx/serializer/recursive/output1
-rw-r--r--tests/cxx/serializer/recursive/test.xsd27
-rw-r--r--tests/cxx/serializer/reset/driver.cxx281
-rw-r--r--tests/cxx/serializer/reset/makefile72
-rw-r--r--tests/cxx/serializer/reset/output7
-rw-r--r--tests/cxx/serializer/reset/test.xsd27
-rw-r--r--tests/cxx/serializer/restriction/driver.cxx246
-rw-r--r--tests/cxx/serializer/restriction/makefile72
-rw-r--r--tests/cxx/serializer/restriction/output1
-rw-r--r--tests/cxx/serializer/restriction/test.xsd175
-rw-r--r--tests/cxx/serializer/sequence/driver.cxx231
-rw-r--r--tests/cxx/serializer/sequence/makefile72
-rw-r--r--tests/cxx/serializer/sequence/output1
-rw-r--r--tests/cxx/serializer/sequence/test.xsd51
-rw-r--r--tests/cxx/serializer/test-template/driver.cxx48
-rw-r--r--tests/cxx/serializer/test-template/makefile72
-rw-r--r--tests/cxx/serializer/test-template/output1
-rw-r--r--tests/cxx/serializer/test-template/test.xsd12
-rw-r--r--tests/cxx/serializer/union/driver.cxx93
-rw-r--r--tests/cxx/serializer/union/makefile72
-rw-r--r--tests/cxx/serializer/union/output1
-rw-r--r--tests/cxx/serializer/union/test.xsd25
-rw-r--r--tests/cxx/serializer/validation/any/driver.cxx317
-rw-r--r--tests/cxx/serializer/validation/any/makefile72
-rw-r--r--tests/cxx/serializer/validation/any/output9
-rw-r--r--tests/cxx/serializer/validation/any/test.xsd53
-rw-r--r--tests/cxx/serializer/validation/attribute/driver.cxx247
-rw-r--r--tests/cxx/serializer/validation/attribute/makefile72
-rw-r--r--tests/cxx/serializer/validation/attribute/output9
-rw-r--r--tests/cxx/serializer/validation/attribute/test.xsd21
-rw-r--r--tests/cxx/serializer/validation/built-in/date-time/driver.cxx398
-rw-r--r--tests/cxx/serializer/validation/built-in/date-time/makefile61
-rw-r--r--tests/cxx/serializer/validation/built-in/decimal/driver.cxx46
-rw-r--r--tests/cxx/serializer/validation/built-in/decimal/makefile61
-rw-r--r--tests/cxx/serializer/validation/built-in/integer/driver.cxx63
-rw-r--r--tests/cxx/serializer/validation/built-in/integer/makefile61
-rw-r--r--tests/cxx/serializer/validation/built-in/makefile20
-rw-r--r--tests/cxx/serializer/validation/built-in/qname/driver.cxx70
-rw-r--r--tests/cxx/serializer/validation/built-in/qname/makefile61
-rw-r--r--tests/cxx/serializer/validation/built-in/string/driver.cxx485
-rw-r--r--tests/cxx/serializer/validation/built-in/string/makefile61
-rw-r--r--tests/cxx/serializer/validation/choice/driver.cxx114
-rw-r--r--tests/cxx/serializer/validation/choice/makefile72
-rw-r--r--tests/cxx/serializer/validation/choice/output2
-rw-r--r--tests/cxx/serializer/validation/choice/test.xsd21
-rw-r--r--tests/cxx/serializer/validation/element/driver.cxx106
-rw-r--r--tests/cxx/serializer/validation/element/makefile72
-rw-r--r--tests/cxx/serializer/validation/element/output2
-rw-r--r--tests/cxx/serializer/validation/element/test.xsd19
-rw-r--r--tests/cxx/serializer/validation/makefile24
-rw-r--r--tests/cxx/serializer/validation/sequence/driver.cxx102
-rw-r--r--tests/cxx/serializer/validation/sequence/makefile72
-rw-r--r--tests/cxx/serializer/validation/sequence/output1
-rw-r--r--tests/cxx/serializer/validation/sequence/test.xsd21
-rw-r--r--tests/cxx/serializer/wildcard/driver.cxx237
-rw-r--r--tests/cxx/serializer/wildcard/makefile72
-rw-r--r--tests/cxx/serializer/wildcard/output1
-rw-r--r--tests/cxx/serializer/wildcard/test.xsd25
108 files changed, 9292 insertions, 0 deletions
diff --git a/tests/cxx/serializer/all/driver.cxx b/tests/cxx/serializer/all/driver.cxx
new file mode 100644
index 0000000..f781b94
--- /dev/null
+++ b/tests/cxx/serializer/all/driver.cxx
@@ -0,0 +1,108 @@
+// file : tests/cxx/serializer/all/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test the all compositor serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: test_1_sskel
+{
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual bool
+ b_present ()
+ {
+ return true;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+};
+
+struct test_2_simpl: test_2_sskel
+{
+ test_2_simpl ()
+ : i_ (0)
+ {
+ }
+
+ virtual bool
+ all_present ()
+ {
+ return i_++;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+private:
+ int i_;
+};
+
+struct root_simpl: root_sskel
+{
+ virtual void
+ pre ()
+ {
+ n1_ = 0;
+ n2_ = 0;
+ }
+
+ virtual bool
+ test_1_next ()
+ {
+ return n1_++ < 1;
+ }
+
+ virtual bool
+ test_2_next ()
+ {
+ return n2_++ < 2;
+ }
+
+private:
+ int n1_, n2_;
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ test_1_simpl test_1_s;
+ test_2_simpl test_2_s;
+ root_simpl root_s;
+
+ test_1_s.serializers (int_s, int_s);
+ test_2_s.serializers (int_s, int_s);
+ root_s.serializers (test_1_s, test_2_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/all/makefile b/tests/cxx/serializer/all/makefile
new file mode 100644
index 0000000..d73444a
--- /dev/null
+++ b/tests/cxx/serializer/all/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/all/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/all/output b/tests/cxx/serializer/all/output
new file mode 100644
index 0000000..ec04b95
--- /dev/null
+++ b/tests/cxx/serializer/all/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><test-1><a>123</a><b>234</b></test-1><test-2></test-2><test-2><a>123</a><b>234</b></test-2></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/all/test.xsd b/tests/cxx/serializer/all/test.xsd
new file mode 100644
index 0000000..7d369f5
--- /dev/null
+++ b/tests/cxx/serializer/all/test.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="test-1">
+ <all>
+ <element name="a" type="int"/>
+ <element name="b" type="int" minOccurs="0"/>
+ </all>
+ </complexType>
+
+ <complexType name="test-2">
+ <all minOccurs="0">
+ <element name="a" type="int"/>
+ <element name="b" type="int"/>
+ </all>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test-1" type="t:test-1" maxOccurs="unbounded"/>
+ <element name="test-2" type="t:test-2" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/built-in/driver.cxx b/tests/cxx/serializer/built-in/driver.cxx
new file mode 100644
index 0000000..f1d17a1
--- /dev/null
+++ b/tests/cxx/serializer/built-in/driver.cxx
@@ -0,0 +1,1304 @@
+// file : tests/cxx/serializer/built-in/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test built-in type serialization.
+//
+
+#include <stdlib.h> // strtof, strtod
+#include <string.h> // memcpy
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct any_type_simpl: xml_schema::any_type_simpl
+{
+ virtual void
+ _serialize_attributes ()
+ {
+ _attribute ("foo", "one");
+ _attribute ("test", "foo", "two");
+ }
+
+ virtual void
+ _serialize_content ()
+ {
+ _start_element ("test", "inner");
+ _characters ("hello");
+ _end_element ();
+ }
+};
+
+struct any_simple_type_simpl: xml_schema::any_simple_type_simpl
+{
+ virtual void
+ _serialize_content ()
+ {
+ _characters ("hello");
+ }
+};
+
+struct root_simpl: root_sskel
+{
+ virtual void
+ pre ()
+ {
+ boolean_ = 0;
+ byte_ = 0;
+ unsigned_byte_ = 0;
+ short__ = 0;
+ unsigned_short_ = 0;
+ int__ = 0;
+ unsigned_int_ = 0;
+ long__ = 0;
+ unsigned_long_ = 0;
+
+ integer_ = 0;
+ negative_integer_ = 0;
+ non_positive_integer_ = 0;
+ positive_integer_ = 0;
+ non_negative_integer_ = 0;
+
+ float__ = 0;
+ double__ = 0;
+ decimal_ = 0;
+
+ string_ = 0;
+ normalized_string_ = 0;
+ token_ = 0;
+ name_ = 0;
+ nmtoken_ = 0;
+ nmtokens_ = 0;
+ ncname_ = 0;
+ id_ = 0;
+ idref_ = 0;
+ idrefs_ = 0;
+ language_ = 0;
+ uri_ = 0;
+ qname_ = 0;
+
+ base64_binary_ = 0;
+ hex_binary_ = 0;
+
+ gday_ = 0;
+ gmonth_ = 0;
+ gyear_ = 0;
+ gmonth_day_ = 0;
+ gyear_month_ = 0;
+ date_ = 0;
+ time_ = 0;
+ date_time_ = 0;
+ duration_ = 0;
+ }
+
+ virtual bool
+ boolean_next ()
+ {
+ return boolean_ < 2;
+ }
+
+ virtual bool
+ boolean ()
+ {
+ static const bool v[] = {true, false};
+ return v[boolean_++];
+ }
+
+ virtual bool
+ byte_next ()
+ {
+ return byte_ < 4;
+ }
+
+ virtual signed char
+ byte ()
+ {
+ static const signed char v[] = {-128, -123, 0, 127};
+ return v[byte_++];
+ }
+
+ virtual bool
+ unsigned_byte_next ()
+ {
+ return unsigned_byte_ < 3;
+ }
+
+ virtual unsigned char
+ unsigned_byte ()
+ {
+ static const unsigned char v[] = {0, 123, 255};
+ return v[unsigned_byte_++];
+ }
+
+ virtual bool
+ short__next ()
+ {
+ return short__ < 4;
+ }
+
+ virtual short
+ short_ ()
+ {
+ static const short v[] = {-32768, -12345, 0, 32767};
+ return v[short__++];
+ }
+
+ virtual bool
+ unsigned_short_next ()
+ {
+ return unsigned_short_ < 3;
+ }
+
+ virtual unsigned short
+ unsigned_short ()
+ {
+ static const unsigned short v[] = {0, 12345, 65535};
+ return v[unsigned_short_++];
+ }
+
+ virtual bool
+ int__next ()
+ {
+ return int__ < 4;
+ }
+
+ virtual int
+ int_ ()
+ {
+ static const int v[] = {-2147483648, -1234567890, 0, 2147483647};
+ return v[int__++];
+ }
+
+ virtual bool
+ unsigned_int_next ()
+ {
+ return unsigned_int_ < 3;
+ }
+
+ virtual unsigned int
+ unsigned_int ()
+ {
+ static const unsigned int v[] = {0, 1234567890, 4294967295};
+ return v[unsigned_int_++];
+ }
+
+ virtual bool
+ long__next ()
+ {
+ return long__ < 4;
+ }
+
+ virtual bool
+ unsigned_long_next ()
+ {
+ return unsigned_long_ < 3;
+ }
+
+#ifdef XSDE_LONGLONG
+ virtual long long
+ long_ ()
+ {
+ static const long long v[] =
+ {
+ -9223372036854775807LL, -1234567890123456789LL,
+ 0LL, 9223372036854775807LL
+ };
+
+ return long__ == 0 ? (v[long__++] - 1) : v[long__++];
+ }
+
+ virtual unsigned long long
+ unsigned_long ()
+ {
+ static const unsigned long long v[] =
+ {
+ 0ULL, 12345678901234567890ULL, 18446744073709551615ULL
+ };
+
+ return v[unsigned_long_++];
+ }
+#else
+ virtual long
+ long_ ()
+ {
+ static const long v[] = {-2147483647L, -1234567890L, 0L, 2147483647L};
+ return long__ == 0 ? (v[long__++] - 1) : v[long__++];
+ }
+
+ virtual unsigned long
+ unsigned_long ()
+ {
+ static const unsigned long v[] = {0UL, 1234567890UL, 4294967295UL};
+ return v[unsigned_long_++];
+ }
+#endif
+
+ //
+ //
+ virtual bool
+ integer_next ()
+ {
+ return integer_ < 4;
+ }
+
+ virtual long
+ integer ()
+ {
+ static const long v[] = {-2147483647L, -1234567890L, 0L, 2147483647L};
+ return integer_ == 0 ? (v[integer_++] - 1) : v[integer_++];
+ }
+
+ virtual bool
+ negative_integer_next ()
+ {
+ return negative_integer_ < 2;
+ }
+
+ virtual long
+ negative_integer ()
+ {
+ static const long v[] = {-2147483647L, -1234567890L};
+ return negative_integer_ == 0
+ ? (v[negative_integer_++] - 1)
+ : v[negative_integer_++];
+ }
+
+ virtual bool
+ non_positive_integer_next ()
+ {
+ return non_positive_integer_ < 3;
+ }
+
+ virtual long
+ non_positive_integer ()
+ {
+ static const long v[] = {-2147483647L, -1234567890L, 0L};
+ return non_positive_integer_ == 0
+ ? (v[non_positive_integer_++] - 1)
+ : v[non_positive_integer_++];
+ }
+
+ virtual bool
+ positive_integer_next ()
+ {
+ return positive_integer_ < 2;
+ }
+
+ virtual unsigned long
+ positive_integer ()
+ {
+ static const unsigned long v[] = {1234567890UL, 4294967295UL};
+ return v[positive_integer_++];
+ }
+
+ virtual bool
+ non_negative_integer_next ()
+ {
+ return non_negative_integer_ < 3;
+ }
+
+ virtual unsigned long
+ non_negative_integer ()
+ {
+ static const unsigned long v[] = {0UL, 1234567890UL, 4294967295UL};
+ return v[non_negative_integer_++];
+ }
+
+ //
+ //
+ virtual bool
+ float__next ()
+ {
+ return float__ < 9;
+ }
+
+ virtual float
+ float_ ()
+ {
+ static const float v[] = {0.0, 0.0, 0.0, 0.0, 1.0, -1.0,
+ 123.567, -123.567e5, -0.45e-5};
+
+ switch (float__)
+ {
+ case 0:
+ {
+ float__++;
+ return strtof ("INF", 0);
+ }
+ case 1:
+ {
+ float__++;
+ return strtof ("-INF", 0);
+ }
+ case 2:
+ {
+ float__++;
+ return strtof ("NAN", 0);
+ }
+ default:
+ {
+ return v[float__++];
+ }
+ }
+ }
+
+ virtual bool
+ double__next ()
+ {
+ return double__ < 9;
+ }
+
+ virtual double
+ double_ ()
+ {
+ static const double v[] = {0.0, 0.0, 0.0, 0.0, 1.0, -1.0,
+ 123.56789, -123.56789e8, -0.45E-5};
+
+ switch (double__)
+ {
+ case 0:
+ {
+ double__++;
+ return strtod ("INF", 0);
+ }
+ case 1:
+ {
+ double__++;
+ return strtod ("-INF", 0);
+ }
+ case 2:
+ {
+ double__++;
+ return strtod ("NAN", 0);
+ }
+ default:
+ {
+ return v[double__++];
+ }
+ }
+ }
+
+ virtual bool
+ decimal_next ()
+ {
+ return decimal_ < 5;
+ }
+
+ virtual double
+ decimal ()
+ {
+ static const double v[] = {0.0, 1.0, -1.0, 123.56789, -123.56789};
+ return v[decimal_++];
+ }
+
+ //
+ //
+
+#ifdef XSDE_STL
+
+ virtual bool
+ string_next ()
+ {
+ return string_++ < 1;
+ }
+
+ virtual std::string
+ string ()
+ {
+ return " test \n string ";
+ }
+
+ virtual bool
+ normalized_string_next ()
+ {
+ return normalized_string_++ < 1;
+ }
+
+ virtual std::string
+ normalized_string ()
+ {
+ return "test normalized string";
+ }
+
+ virtual bool
+ token_next ()
+ {
+ return token_++ < 1;
+ }
+
+ virtual std::string
+ token ()
+ {
+ return "test token";
+ }
+
+ virtual bool
+ name_next ()
+ {
+ return name_++ < 1;
+ }
+
+ virtual std::string
+ name ()
+ {
+ return "as123:345-.abs";
+ }
+
+ virtual bool
+ nmtoken_next ()
+ {
+ return nmtoken_++ < 1;
+ }
+
+ virtual std::string
+ nmtoken ()
+ {
+ return "1as123:345-.abs";
+ }
+
+ virtual bool
+ nmtokens_next ()
+ {
+ return nmtokens_ < 2;
+ }
+
+ virtual xml_schema::string_sequence*
+ nmtokens ()
+ {
+ using xml_schema::string_sequence;
+
+ switch (nmtokens_++)
+ {
+ case 0:
+ {
+ string_sequence* r = new string_sequence;
+ r->push_back ("one");
+ return r;
+ }
+ case 1:
+ {
+ string_sequence* r = new string_sequence;
+ r->push_back ("one");
+ r->push_back ("two");
+ r->push_back ("three");
+ return r;
+ }
+ default:
+ return 0;
+ }
+ }
+
+ virtual bool
+ ncname_next ()
+ {
+ return ncname_++ < 1;
+ }
+
+ virtual std::string
+ ncname ()
+ {
+ return "as123_345-.abs";
+ }
+
+ virtual bool
+ id_next ()
+ {
+ return id_ < 4;
+ }
+
+ virtual std::string
+ id ()
+ {
+ static const char* v[] = {"as123_345-.abs", "one", "two", "three"};
+ return v[id_++];
+ }
+
+ virtual bool
+ idref_next ()
+ {
+ return idref_++ < 1;
+ }
+
+ virtual std::string
+ idref ()
+ {
+ return "as123_345-.abs";
+ }
+
+ virtual bool
+ idrefs_next ()
+ {
+ return idrefs_ < 2;
+ }
+
+ virtual xml_schema::string_sequence*
+ idrefs ()
+ {
+ using xml_schema::string_sequence;
+
+ switch (idrefs_++)
+ {
+ case 0:
+ {
+ string_sequence* r = new string_sequence;
+ r->push_back ("one");
+ return r;
+ }
+ case 1:
+ {
+ string_sequence* r = new string_sequence;
+ r->push_back ("two");
+ r->push_back ("three");
+ return r;
+ }
+ default:
+ return 0;
+ }
+ }
+
+ virtual bool
+ language_next ()
+ {
+ return language_++ < 1;
+ }
+
+ virtual std::string
+ language ()
+ {
+ return "en-us";
+ }
+
+ virtual bool
+ uri_next ()
+ {
+ return uri_++ < 1;
+ }
+
+ virtual std::string
+ uri ()
+ {
+ return "http://www.example.com/foo#bar";
+ }
+
+ virtual bool
+ qname_next ()
+ {
+ return qname_ < 2;
+ }
+
+ virtual xml_schema::qname
+ qname ()
+ {
+ using xml_schema::qname;
+
+ switch (qname_++)
+ {
+ case 0:
+ {
+ qname r ("g1", "qname");
+ return r;
+ }
+ case 1:
+ {
+ qname r ("qname");
+ return r;
+ }
+ default:
+ return qname ("bad");
+ }
+ }
+
+#else
+
+ virtual bool
+ string_next ()
+ {
+ return string_++ < 1;
+ }
+
+ virtual const char*
+ string ()
+ {
+ return " test \n string ";
+ }
+
+ virtual bool
+ normalized_string_next ()
+ {
+ return normalized_string_++ < 1;
+ }
+
+ virtual const char*
+ normalized_string ()
+ {
+ return "test normalized string";
+ }
+
+ virtual bool
+ token_next ()
+ {
+ return token_++ < 1;
+ }
+
+ virtual const char*
+ token ()
+ {
+ return "test token";
+ }
+
+ virtual bool
+ name_next ()
+ {
+ return name_++ < 1;
+ }
+
+ virtual const char*
+ name ()
+ {
+ return "as123:345-.abs";
+ }
+
+ virtual bool
+ nmtoken_next ()
+ {
+ return nmtoken_++ < 1;
+ }
+
+ virtual const char*
+ nmtoken ()
+ {
+ return "1as123:345-.abs";
+ }
+
+ virtual bool
+ nmtokens_next ()
+ {
+ return nmtokens_ < 2;
+ }
+
+ virtual const xml_schema::string_sequence*
+ nmtokens ()
+ {
+ using xml_schema::string_sequence;
+
+ switch (nmtokens_++)
+ {
+ case 0:
+ {
+ string_sequence* r = new string_sequence ();
+ r->push_back_copy ("one");
+ return r;
+ }
+ case 1:
+ {
+ string_sequence* r = new string_sequence ();
+ r->push_back_copy ("one");
+ r->push_back_copy ("two");
+ r->push_back_copy ("three");
+ return r;
+ }
+ default:
+ return 0;
+ }
+ }
+
+ virtual bool
+ ncname_next ()
+ {
+ return ncname_++ < 1;
+ }
+
+ virtual const char*
+ ncname ()
+ {
+ return "as123_345-.abs";
+ }
+
+ virtual bool
+ id_next ()
+ {
+ return id_ < 4;
+ }
+
+ virtual const char*
+ id ()
+ {
+ static const char* v[] = {"as123_345-.abs", "one", "two", "three"};
+ return v[id_++];
+ }
+
+ virtual bool
+ idref_next ()
+ {
+ return idref_++ < 1;
+ }
+
+ virtual const char*
+ idref ()
+ {
+ return "as123_345-.abs";
+ }
+
+ virtual bool
+ idrefs_next ()
+ {
+ return idrefs_ < 2;
+ }
+
+ virtual const xml_schema::string_sequence*
+ idrefs ()
+ {
+ using xml_schema::string_sequence;
+
+ switch (idrefs_++)
+ {
+ case 0:
+ {
+ string_sequence* r = new string_sequence ();
+ r->push_back_copy ("one");
+ return r;
+ }
+ case 1:
+ {
+ string_sequence* r = new string_sequence ();
+ r->push_back_copy ("two");
+ r->push_back_copy ("three");
+ return r;
+ }
+ default:
+ return 0;
+ }
+ }
+
+ virtual bool
+ language_next ()
+ {
+ return language_++ < 1;
+ }
+
+ virtual const char*
+ language ()
+ {
+ return "en-us";
+ }
+
+ virtual bool
+ uri_next ()
+ {
+ return uri_++ < 1;
+ }
+
+ virtual const char*
+ uri ()
+ {
+ return "http://www.example.com/foo#bar";
+ }
+
+ virtual bool
+ qname_next ()
+ {
+ return qname_ < 2;
+ }
+
+ virtual const xml_schema::qname*
+ qname ()
+ {
+ using xml_schema::qname;
+
+ switch (qname_++)
+ {
+ case 0:
+ {
+ qname* r = new qname ();
+ r->prefix_copy ("g1");
+ r->name_copy ("qname");
+ return r;
+ }
+ case 1:
+ {
+ qname* r = new qname ();
+ r->name_copy ("qname");
+ return r;
+ }
+ default:
+ return 0;
+ }
+ }
+#endif
+
+ //
+ //
+ virtual bool
+ base64_binary_next ()
+ {
+ return base64_binary_ < 6;
+ }
+
+ virtual const xml_schema::buffer*
+ base64_binary ()
+ {
+ xml_schema::buffer* r = new xml_schema::buffer ();
+
+ switch (base64_binary_++)
+ {
+ case 0:
+ {
+ // Empty buffer.
+ //
+ break;
+ }
+ case 1:
+ {
+ const char data[] = "12345abcjk";
+ const size_t size = sizeof (data) - 1;
+ r->size (size);
+ memcpy (r->data (), data, size);
+ break;
+ }
+ case 2:
+ {
+ const char data[] = "a";
+ const size_t size = sizeof (data) - 1;
+ r->size (size);
+ memcpy (r->data (), data, size);
+ break;
+ }
+ case 3:
+ {
+ const char data[] = "ab";
+ const size_t size = sizeof (data) -1;
+ r->size (size);
+ memcpy (r->data (), data, size);
+ break;
+ }
+ case 4:
+ {
+ const char data[] = "abc";
+ const size_t size = sizeof (data) - 1;
+ r->size (size);
+ memcpy (r->data (), data, size);
+ break;
+ }
+ case 5:
+ {
+ const size_t size = 345;
+
+ r->size (size);
+ unsigned char v = 0;
+
+ for (size_t i = 0; i < size; ++i)
+ {
+ r->data ()[i] = static_cast<char> (v++);
+ }
+
+ break;
+ }
+ }
+
+ return r;
+ }
+
+ virtual bool
+ hex_binary_next ()
+ {
+ return hex_binary_ < 3;
+ }
+
+ virtual const xml_schema::buffer*
+ hex_binary ()
+ {
+ xml_schema::buffer* r = new xml_schema::buffer ();
+
+ switch (hex_binary_++)
+ {
+ case 0:
+ {
+ // Empty buffer.
+ //
+ break;
+ }
+ case 1:
+ {
+ const char data[] = "12345abcjk";
+ const size_t size = sizeof (data) - 1;
+ r->size (size);
+ memcpy (r->data (), data, size);
+ break;
+ }
+ case 2:
+ {
+ const size_t size = 345;
+
+ r->size (size);
+ unsigned char v = 0;
+
+ for (size_t i = 0; i < size; ++i)
+ {
+ r->data ()[i] = static_cast<char> (v++);
+ }
+
+ break;
+ }
+ }
+
+ return r;
+ }
+
+ virtual bool
+ gday_next ()
+ {
+ return gday_ < 3;
+ }
+
+ virtual xml_schema::gday
+ gday ()
+ {
+ using xml_schema::gday;
+
+ switch (gday_++)
+ {
+ case 0:
+ return gday (23);
+ case 1:
+ return gday (31, 2, 30);
+ case 2:
+ return gday (15, 0, 0);
+ }
+ }
+
+ virtual bool
+ gmonth_next ()
+ {
+ return gmonth_ < 2;
+ }
+
+ virtual ::xml_schema::gmonth
+ gmonth ()
+ {
+ using xml_schema::gmonth;
+
+ switch (gmonth_++)
+ {
+ case 0:
+ return gmonth (6);
+ case 1:
+ return gmonth (12, 2, 30);
+ }
+ }
+
+ virtual bool
+ gyear_next ()
+ {
+ return gyear_ < 2;
+ }
+
+ virtual ::xml_schema::gyear
+ gyear ()
+ {
+ using xml_schema::gyear;
+
+ switch (gyear_++)
+ {
+ case 0:
+ return gyear (2007);
+ case 1:
+ return gyear (-2007, -2, -30);
+ }
+ }
+
+ virtual bool
+ gmonth_day_next ()
+ {
+ return gmonth_day_ < 2;
+ }
+
+ virtual ::xml_schema::gmonth_day
+ gmonth_day ()
+ {
+ using xml_schema::gmonth_day;
+
+ switch (gmonth_day_++)
+ {
+ case 0:
+ return gmonth_day (6, 15);
+ case 1:
+ return gmonth_day (12, 31, 2, 30);
+ }
+ }
+
+ virtual bool
+ gyear_month_next ()
+ {
+ return gyear_month_ < 2;
+ }
+
+ virtual ::xml_schema::gyear_month
+ gyear_month ()
+ {
+ using xml_schema::gyear_month;
+
+ switch (gyear_month_++)
+ {
+ case 0:
+ return gyear_month (2007, 10);
+ case 1:
+ return gyear_month (-2007, 12, -2, -30);
+ }
+ }
+
+ virtual bool
+ date_next ()
+ {
+ return date_ < 2;
+ }
+
+ virtual ::xml_schema::date
+ date ()
+ {
+ using xml_schema::date;
+
+ switch (date_++)
+ {
+ case 0:
+ return date (2007, 6, 15);
+ case 1:
+ return date (-2007, 12, 31, -2, -30);
+ }
+ }
+
+ virtual bool
+ time_next ()
+ {
+ return time_ < 2;
+ }
+
+ virtual ::xml_schema::time
+ time ()
+ {
+ using xml_schema::time;
+
+ switch (time_++)
+ {
+ case 0:
+ return time (12, 30, 30.0);
+ case 1:
+ return time (23, 59, 59.55, 2, 30);
+ }
+ }
+
+ virtual bool
+ date_time_next ()
+ {
+ return date_time_ < 2;
+ }
+
+ virtual ::xml_schema::date_time
+ date_time ()
+ {
+ using xml_schema::date_time;
+
+ switch (date_time_++)
+ {
+ case 0:
+ return date_time (2007, 6, 15, 12, 30, 30.0);
+ case 1:
+ return date_time (-2007, 12, 31, 23, 59, 59.55, -2, -30);
+ }
+ }
+
+ virtual bool
+ duration_next ()
+ {
+ return duration_ < 7;
+ }
+
+ virtual ::xml_schema::duration
+ duration ()
+ {
+ using xml_schema::duration;
+
+ switch (duration_++)
+ {
+ case 0:
+ return duration (false, 1, 0, 0, 0, 0, 0.0);
+ case 1:
+ return duration (true, 0, 1, 0, 0, 0, 0.0);
+ case 2:
+ return duration (false, 0, 0, 1, 0, 0, 0.0);
+ case 3:
+ return duration (true, 0, 0, 0, 1, 0, 0.0);
+ case 4:
+ return duration (false, 0, 0, 0, 0, 1, 0.0);
+ case 5:
+ return duration (true, 0, 0, 0, 0, 0, 1.1);
+ case 6:
+ return duration (false, 1, 2, 3, 4, 5, 6.7);
+ }
+ }
+
+private:
+ int boolean_;
+ int byte_;
+ int unsigned_byte_;
+ int short__;
+ int unsigned_short_;
+ int int__;
+ int unsigned_int_;
+ int long__;
+ int unsigned_long_;
+
+ int integer_;
+ int negative_integer_;
+ int non_positive_integer_;
+ int positive_integer_;
+ int non_negative_integer_;
+
+ int float__;
+ int double__;
+ int decimal_;
+
+ int string_;
+ int normalized_string_;
+ int token_;
+ int name_;
+ int nmtoken_;
+ int nmtokens_;
+ int ncname_;
+ int id_;
+ int idref_;
+ int idrefs_;
+ int language_;
+ int uri_;
+ int qname_;
+
+ int base64_binary_;
+ int hex_binary_;
+
+ int gday_;
+ int gmonth_;
+ int gyear_;
+ int gmonth_day_;
+ int gyear_month_;
+ int date_;
+ int time_;
+ int date_time_;
+ int duration_;
+};
+
+int
+main ()
+{
+ any_type_simpl any_type_s;
+ any_simple_type_simpl any_simple_type_s;
+
+ xml_schema::boolean_simpl boolean_s;
+
+ xml_schema::byte_simpl byte_s;
+ xml_schema::unsigned_byte_simpl unsigned_byte_s;
+ xml_schema::short_simpl short_s;
+ xml_schema::unsigned_short_simpl unsigned_short_s;
+ xml_schema::int_simpl int_s;
+ xml_schema::unsigned_int_simpl unsigned_int_s;
+ xml_schema::long_simpl long_s;
+ xml_schema::unsigned_long_simpl unsigned_long_s;
+
+ xml_schema::integer_simpl integer_s;
+ xml_schema::negative_integer_simpl negative_integer_s;
+ xml_schema::non_positive_integer_simpl non_sositive_integer_s;
+ xml_schema::positive_integer_simpl positive_integer_s;
+ xml_schema::non_negative_integer_simpl non_negative_integer_s;
+
+ xml_schema::float_simpl float_s;
+ xml_schema::double_simpl double_s;
+ xml_schema::decimal_simpl decimal_s;
+
+ xml_schema::string_simpl string_s;
+ xml_schema::normalized_string_simpl normalized_string_s;
+ xml_schema::token_simpl token_s;
+ xml_schema::name_simpl name_s;
+ xml_schema::nmtoken_simpl nmtoken_s;
+ xml_schema::ncname_simpl ncname_s;
+ xml_schema::id_simpl id_s;
+ xml_schema::idref_simpl idref_s;
+
+ xml_schema::language_simpl language_s;
+ xml_schema::uri_simpl uri_s;
+
+#ifdef XSDE_STL
+ xml_schema::qname_simpl qname_s;
+#else
+ xml_schema::qname_simpl qname_s (true);
+#endif
+
+ xml_schema::idrefs_simpl idrefs_s (true);
+ xml_schema::nmtokens_simpl nmtokens_s (true);
+
+ xml_schema::base64_binary_simpl base64_binary_s (true);
+ xml_schema::hex_binary_simpl hex_binary_s (true);
+
+ xml_schema::gday_simpl gday_s;
+ xml_schema::gmonth_simpl gmonth_s;
+ xml_schema::gyear_simpl gyear_s;
+ xml_schema::gmonth_day_simpl gmonth_day_s;
+ xml_schema::gyear_month_simpl gyear_month_s;
+ xml_schema::date_simpl date_s;
+ xml_schema::time_simpl time_s;
+ xml_schema::date_time_simpl date_time_s;
+ xml_schema::duration_simpl duration_s;
+
+ root_simpl root_s;
+
+ root_s.serializers (any_type_s,
+ any_simple_type_s,
+ boolean_s,
+ byte_s,
+ unsigned_byte_s,
+ short_s,
+ unsigned_short_s,
+ int_s,
+ unsigned_int_s,
+ long_s,
+ unsigned_long_s,
+ integer_s,
+ negative_integer_s,
+ non_sositive_integer_s,
+ positive_integer_s,
+ non_negative_integer_s,
+ float_s,
+ double_s,
+ decimal_s,
+ string_s,
+ normalized_string_s,
+ token_s,
+ name_s,
+ nmtoken_s,
+ nmtokens_s,
+ ncname_s,
+ id_s,
+ idref_s,
+ idrefs_s,
+ language_s,
+ uri_s,
+ qname_s,
+ base64_binary_s,
+ hex_binary_s,
+ gday_s,
+ gmonth_s,
+ gyear_s,
+ gmonth_day_s,
+ gyear_month_s,
+ date_s,
+ time_s,
+ date_time_s,
+ duration_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/built-in/makefile b/tests/cxx/serializer/built-in/makefile
new file mode 100644
index 0000000..78a2055
--- /dev/null
+++ b/tests/cxx/serializer/built-in/makefile
@@ -0,0 +1,79 @@
+# file : tests/cxx/serializer/built-in/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+
+ifeq ($(xsde_longlong),y)
+$(test): $(driver) $(src_base)/output-long-long
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output-long-long -,$(driver))
+else
+$(test): $(driver) $(src_base)/output-long
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output-long -,$(driver))
+endif
+
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/built-in/output-long b/tests/cxx/serializer/built-in/output-long
new file mode 100644
index 0000000..7333c2d
--- /dev/null
+++ b/tests/cxx/serializer/built-in/output-long
@@ -0,0 +1,13 @@
+<g1:root xmlns:g1="test"><any-type foo="one" g1:foo="two"><g1:inner>hello</g1:inner></any-type><any-simple-type>hello</any-simple-type><boolean>true</boolean><boolean>false</boolean><byte>-128</byte><byte>-123</byte><byte>0</byte><byte>127</byte><unsigned-byte>0</unsigned-byte><unsigned-byte>123</unsigned-byte><unsigned-byte>255</unsigned-byte><short>-32768</short><short>-12345</short><short>0</short><short>32767</short><unsigned-short>0</unsigned-short><unsigned-short>12345</unsigned-short><unsigned-short>65535</unsigned-short><int>-2147483648</int><int>-1234567890</int><int>0</int><int>2147483647</int><unsigned-int>0</unsigned-int><unsigned-int>1234567890</unsigned-int><unsigned-int>4294967295</unsigned-int><long>-2147483648</long><long>-1234567890</long><long>0</long><long>2147483647</long><unsigned-long>0</unsigned-long><unsigned-long>1234567890</unsigned-long><unsigned-long>4294967295</unsigned-long><integer>-2147483648</integer><integer>-1234567890</integer><integer>0</integer><integer>2147483647</integer><negative-integer>-2147483648</negative-integer><negative-integer>-1234567890</negative-integer><non-positive-integer>-2147483648</non-positive-integer><non-positive-integer>-1234567890</non-positive-integer><non-positive-integer>0</non-positive-integer><positive-integer>1234567890</positive-integer><positive-integer>4294967295</positive-integer><non-negative-integer>0</non-negative-integer><non-negative-integer>1234567890</non-negative-integer><non-negative-integer>4294967295</non-negative-integer><float>INF</float><float>-INF</float><float>NaN</float><float>0</float><float>1</float><float>-1</float><float>123.567</float><float>-1.23567e+07</float><float>-4.5e-06</float><double>INF</double><double>-INF</double><double>NaN</double><double>0</double><double>1</double><double>-1</double><double>123.56789</double><double>-12356789000</double><double>-4.5e-06</double><decimal>0</decimal><decimal>1</decimal><decimal>-1</decimal><decimal>123.567890000000006</decimal><decimal>-123.567890000000006</decimal><string> test
+ string </string><normalized-string>test normalized string</normalized-string><token>test token</token><name>as123:345-.abs</name><nmtoken>1as123:345-.abs</nmtoken><nmtokens>one</nmtokens><nmtokens>one two three</nmtokens><ncname>as123_345-.abs</ncname><id>as123_345-.abs</id><id>one</id><id>two</id><id>three</id><idref>as123_345-.abs</idref><idrefs>one</idrefs><idrefs>two three</idrefs><language>en-us</language><uri>http://www.example.com/foo#bar</uri><qname>g1:qname</qname><qname>qname</qname><base64_binary></base64_binary><base64_binary>MTIzNDVhYmNqaw==
+</base64_binary><base64_binary>YQ==
+</base64_binary><base64_binary>YWI=
+</base64_binary><base64_binary>YWJj
+</base64_binary><base64_binary>AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4
+OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3Bx
+cnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmq
+q6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj
+5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhsc
+HR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RV
+VldY
+</base64_binary><hex_binary></hex_binary><hex_binary>31323334356162636A6B</hex_binary><hex_binary>000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758</hex_binary><gday>---23</gday><gday>---31+02:30</gday><gday>---15Z</gday><gmonth>--06</gmonth><gmonth>--12+02:30</gmonth><gyear>2007</gyear><gyear>-2007-02:30</gyear><gmonth_day>--06-15</gmonth_day><gmonth_day>--12-31+02:30</gmonth_day><gyear_month>2007-10</gyear_month><gyear_month>-2007-12-02:30</gyear_month><date>2007-06-15</date><date>-2007-12-31-02:30</date><time>12:30:30</time><time>23:59:59.55+02:30</time><date_time>2007-06-15T12:30:30</date_time><date_time>-2007-12-31T23:59:59.55-02:30</date_time><duration>P1Y</duration><duration>-P1M</duration><duration>P1D</duration><duration>-PT1H</duration><duration>PT1M</duration><duration>-PT1.1S</duration><duration>P1Y2M3DT4H5M6.7S</duration></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/built-in/output-long-long b/tests/cxx/serializer/built-in/output-long-long
new file mode 100644
index 0000000..b0f36cc
--- /dev/null
+++ b/tests/cxx/serializer/built-in/output-long-long
@@ -0,0 +1,13 @@
+<g1:root xmlns:g1="test"><any-type foo="one" g1:foo="two"><g1:inner>hello</g1:inner></any-type><any-simple-type>hello</any-simple-type><boolean>true</boolean><boolean>false</boolean><byte>-128</byte><byte>-123</byte><byte>0</byte><byte>127</byte><unsigned-byte>0</unsigned-byte><unsigned-byte>123</unsigned-byte><unsigned-byte>255</unsigned-byte><short>-32768</short><short>-12345</short><short>0</short><short>32767</short><unsigned-short>0</unsigned-short><unsigned-short>12345</unsigned-short><unsigned-short>65535</unsigned-short><int>-2147483648</int><int>-1234567890</int><int>0</int><int>2147483647</int><unsigned-int>0</unsigned-int><unsigned-int>1234567890</unsigned-int><unsigned-int>4294967295</unsigned-int><long>-9223372036854775808</long><long>-1234567890123456789</long><long>0</long><long>9223372036854775807</long><unsigned-long>0</unsigned-long><unsigned-long>12345678901234567890</unsigned-long><unsigned-long>18446744073709551615</unsigned-long><integer>-2147483648</integer><integer>-1234567890</integer><integer>0</integer><integer>2147483647</integer><negative-integer>-2147483648</negative-integer><negative-integer>-1234567890</negative-integer><non-positive-integer>-2147483648</non-positive-integer><non-positive-integer>-1234567890</non-positive-integer><non-positive-integer>0</non-positive-integer><positive-integer>1234567890</positive-integer><positive-integer>4294967295</positive-integer><non-negative-integer>0</non-negative-integer><non-negative-integer>1234567890</non-negative-integer><non-negative-integer>4294967295</non-negative-integer><float>INF</float><float>-INF</float><float>NaN</float><float>0</float><float>1</float><float>-1</float><float>123.567</float><float>-1.23567e+07</float><float>-4.5e-06</float><double>INF</double><double>-INF</double><double>NaN</double><double>0</double><double>1</double><double>-1</double><double>123.56789</double><double>-12356789000</double><double>-4.5e-06</double><decimal>0</decimal><decimal>1</decimal><decimal>-1</decimal><decimal>123.567890000000006</decimal><decimal>-123.567890000000006</decimal><string> test
+ string </string><normalized-string>test normalized string</normalized-string><token>test token</token><name>as123:345-.abs</name><nmtoken>1as123:345-.abs</nmtoken><nmtokens>one</nmtokens><nmtokens>one two three</nmtokens><ncname>as123_345-.abs</ncname><id>as123_345-.abs</id><id>one</id><id>two</id><id>three</id><idref>as123_345-.abs</idref><idrefs>one</idrefs><idrefs>two three</idrefs><language>en-us</language><uri>http://www.example.com/foo#bar</uri><qname>g1:qname</qname><qname>qname</qname><base64_binary></base64_binary><base64_binary>MTIzNDVhYmNqaw==
+</base64_binary><base64_binary>YQ==
+</base64_binary><base64_binary>YWI=
+</base64_binary><base64_binary>YWJj
+</base64_binary><base64_binary>AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4
+OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3Bx
+cnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmq
+q6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj
+5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhsc
+HR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RV
+VldY
+</base64_binary><hex_binary></hex_binary><hex_binary>31323334356162636A6B</hex_binary><hex_binary>000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758</hex_binary><gday>---23</gday><gday>---31+02:30</gday><gday>---15Z</gday><gmonth>--06</gmonth><gmonth>--12+02:30</gmonth><gyear>2007</gyear><gyear>-2007-02:30</gyear><gmonth_day>--06-15</gmonth_day><gmonth_day>--12-31+02:30</gmonth_day><gyear_month>2007-10</gyear_month><gyear_month>-2007-12-02:30</gyear_month><date>2007-06-15</date><date>-2007-12-31-02:30</date><time>12:30:30</time><time>23:59:59.55+02:30</time><date_time>2007-06-15T12:30:30</date_time><date_time>-2007-12-31T23:59:59.55-02:30</date_time><duration>P1Y</duration><duration>-P1M</duration><duration>P1D</duration><duration>-PT1H</duration><duration>PT1M</duration><duration>-PT1.1S</duration><duration>P1Y2M3DT4H5M6.7S</duration></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/built-in/test.xsd b/tests/cxx/serializer/built-in/test.xsd
new file mode 100644
index 0000000..070e62d
--- /dev/null
+++ b/tests/cxx/serializer/built-in/test.xsd
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="root">
+ <sequence>
+ <element name="any-type" type="anyType"/>
+ <element name="any-simple-type" type="anySimpleType"/>
+
+ <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:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/choice/driver.cxx b/tests/cxx/serializer/choice/driver.cxx
new file mode 100644
index 0000000..684f14d
--- /dev/null
+++ b/tests/cxx/serializer/choice/driver.cxx
@@ -0,0 +1,253 @@
+// file : tests/cxx/serializer/choice/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test the choice compositor serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: test_1_sskel
+{
+ test_1_simpl ()
+ : i_ (0)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+ j_ = 0;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return static_cast<choice_arm_tag> (i_++);
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual bool
+ b_present ()
+ {
+ return true;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+ virtual bool
+ c_next ()
+ {
+ return j_++ < 3;
+ }
+
+ virtual int
+ c ()
+ {
+ return j_;
+ }
+
+private:
+ int i_, j_;
+};
+
+struct test_2_simpl: test_2_sskel
+{
+ test_2_simpl ()
+ : i_ (0)
+ {
+ }
+
+ virtual bool
+ choice_present ()
+ {
+ return i_++;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return b_tag;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+private:
+ int i_;
+};
+
+struct test_3_simpl: test_3_sskel
+{
+ virtual void
+ pre ()
+ {
+ i_ = 0;
+ }
+
+ virtual bool
+ choice_next ()
+ {
+ return i_++ < 4;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return i_ % 2 ? a_tag : b_tag;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+private:
+ int i_;
+};
+
+struct test_4_simpl: test_4_sskel
+{
+ test_4_simpl ()
+ : i_ (0)
+ {
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return static_cast<choice_arm_tag> (i_++);
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual choice1_arm_tag
+ choice1_arm ()
+ {
+ return c_tag;
+ }
+
+ virtual int
+ b ()
+ {
+ return 0;
+ }
+
+ virtual int
+ c ()
+ {
+ return 234;
+ }
+
+ virtual int
+ d ()
+ {
+ return 345;
+ }
+
+ virtual int
+ e ()
+ {
+ return 456;
+ }
+
+private:
+ int i_;
+};
+
+struct root_simpl: root_sskel
+{
+ virtual void
+ pre ()
+ {
+ n1_ = 0;
+ n2_ = 0;
+ n3_ = 0;
+ n4_ = 0;
+ }
+
+ virtual bool
+ test_1_next ()
+ {
+ return n1_++ < 3;
+ }
+
+ virtual bool
+ test_2_next ()
+ {
+ return n2_++ < 2;
+ }
+
+ virtual bool
+ test_3_next ()
+ {
+ return n3_++ < 1;
+ }
+
+ virtual bool
+ test_4_next ()
+ {
+ return n4_++ < 3;
+ }
+
+private:
+ int n1_, n2_, n3_, n4_;
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ test_1_simpl test_1_s;
+ test_2_simpl test_2_s;
+ test_3_simpl test_3_s;
+ test_4_simpl test_4_s;
+ root_simpl root_s;
+
+ test_1_s.serializers (int_s, int_s, int_s);
+ test_2_s.serializers (int_s, int_s);
+ test_3_s.serializers (int_s, int_s);
+ test_4_s.serializers (int_s, int_s, int_s, int_s, int_s);
+ root_s.serializers (test_1_s, test_2_s, test_3_s, test_4_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/choice/makefile b/tests/cxx/serializer/choice/makefile
new file mode 100644
index 0000000..41df081
--- /dev/null
+++ b/tests/cxx/serializer/choice/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/choice/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/choice/output b/tests/cxx/serializer/choice/output
new file mode 100644
index 0000000..78a615a
--- /dev/null
+++ b/tests/cxx/serializer/choice/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><test-1><a>123</a></test-1><test-1><b>234</b></test-1><test-1><c>1</c><c>2</c><c>3</c></test-1><test-2></test-2><test-2><b>234</b></test-2><test-3><a>123</a><b>234</b><a>123</a><b>234</b></test-3><test-4><a>123</a></test-4><test-4><c>234</c></test-4><test-4><d>345</d><e>456</e></test-4></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/choice/test.xsd b/tests/cxx/serializer/choice/test.xsd
new file mode 100644
index 0000000..2d7e33d
--- /dev/null
+++ b/tests/cxx/serializer/choice/test.xsd
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="test-1">
+ <choice>
+ <element name="a" type="int"/>
+ <element name="b" type="int" minOccurs="0"/>
+ <element name="c" type="int" maxOccurs="unbounded"/>
+ </choice>
+ </complexType>
+
+ <complexType name="test-2">
+ <choice minOccurs="0">
+ <element name="a" type="int"/>
+ <element name="b" type="int"/>
+ </choice>
+ </complexType>
+
+ <complexType name="test-3">
+ <choice maxOccurs="unbounded">
+ <element name="a" type="int"/>
+ <element name="b" type="int"/>
+ </choice>
+ </complexType>
+
+ <complexType name="test-4">
+ <choice>
+ <element name="a" type="int"/>
+ <choice>
+ <element name="b" type="int"/>
+ <element name="c" type="int"/>
+ </choice>
+ <sequence>
+ <element name="d" type="int"/>
+ <element name="e" type="int"/>
+ </sequence>
+ </choice>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test-1" type="t:test-1" maxOccurs="unbounded"/>
+ <element name="test-2" type="t:test-2" maxOccurs="unbounded"/>
+ <element name="test-3" type="t:test-3" maxOccurs="unbounded"/>
+ <element name="test-4" type="t:test-4" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/complex/driver.cxx b/tests/cxx/serializer/complex/driver.cxx
new file mode 100644
index 0000000..d27aee1
--- /dev/null
+++ b/tests/cxx/serializer/complex/driver.cxx
@@ -0,0 +1,87 @@
+// file : tests/cxx/serializer/complex/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test complex types serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct base_simpl: virtual base_sskel
+{
+ virtual int
+ x ()
+ {
+ return 123;
+ }
+
+ virtual int
+ y ()
+ {
+ return 234;
+ }
+
+ virtual int
+ a ()
+ {
+ return -123;
+ }
+
+ virtual int
+ b ()
+ {
+ return -234;
+ }
+};
+
+struct derived_simpl: derived_sskel
+{
+ derived_simpl ()
+ : derived_sskel (&base_impl_)
+ {
+ }
+
+ virtual int
+ z ()
+ {
+ return 345;
+ }
+
+ virtual int
+ c ()
+ {
+ return -345;
+ }
+
+private:
+ base_simpl base_impl_;
+};
+
+struct root_simpl: virtual root_sskel
+{
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ base_simpl base_s;
+ derived_simpl derived_s;
+ root_simpl root_s;
+
+ base_s.serializers (int_s, int_s, int_s, int_s);
+ derived_s.serializers (int_s, int_s, int_s, int_s, int_s, int_s);
+ root_s.serializers (base_s, derived_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/complex/makefile b/tests/cxx/serializer/complex/makefile
new file mode 100644
index 0000000..75da9e3
--- /dev/null
+++ b/tests/cxx/serializer/complex/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/complex/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/complex/output b/tests/cxx/serializer/complex/output
new file mode 100644
index 0000000..82a19b6
--- /dev/null
+++ b/tests/cxx/serializer/complex/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><base x="123" y="234"><a>-123</a><b>-234</b></base><derived x="123" y="234" z="345"><a>-123</a><b>-234</b><c>-345</c></derived></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/complex/test.xsd b/tests/cxx/serializer/complex/test.xsd
new file mode 100644
index 0000000..c209b92
--- /dev/null
+++ b/tests/cxx/serializer/complex/test.xsd
@@ -0,0 +1,33 @@
+<?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="int"/>
+ <element name="b" type="int"/>
+ </sequence>
+ <attribute name="x" type="int" use="required"/>
+ <attribute name="y" type="int" use="required"/>
+ </complexType>
+
+ <complexType name="derived">
+ <complexContent>
+ <extension base="t:base">
+ <sequence>
+ <element name="c" type="int"/>
+ </sequence>
+ <attribute name="z" type="int" use="required"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="base" type="t:base"/>
+ <element name="derived" type="t:derived"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/enumeration/boolean.hxx b/tests/cxx/serializer/enumeration/boolean.hxx
new file mode 100644
index 0000000..b648a56
--- /dev/null
+++ b/tests/cxx/serializer/enumeration/boolean.hxx
@@ -0,0 +1,15 @@
+// file : tests/cxx/serializer/enumeration/boolean.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef BOOLEAN_HXX
+#define BOOLEAN_HXX
+
+enum boolean
+{
+ FALSE,
+ TRUE
+};
+
+#endif // BOOLEAN_HXX
diff --git a/tests/cxx/serializer/enumeration/driver.cxx b/tests/cxx/serializer/enumeration/driver.cxx
new file mode 100644
index 0000000..ae200ae
--- /dev/null
+++ b/tests/cxx/serializer/enumeration/driver.cxx
@@ -0,0 +1,74 @@
+// file : tests/cxx/serializer/enumeration/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test enumeration type serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct digit_simpl: digit_sskel
+{
+ digit_simpl ()
+ : digit_sskel (&base_impl_)
+ {
+ }
+
+private:
+ xml_schema::int_simpl base_impl_;
+};
+
+struct boolean_simpl: boolean_sskel
+{
+ boolean_simpl ()
+ : boolean_sskel (&base_impl_)
+ {
+ }
+
+ virtual void
+ pre (boolean b)
+ {
+ int i = b;
+ base_impl_.pre (i);
+ }
+
+private:
+ xml_schema::int_simpl base_impl_;
+};
+
+struct root_simpl: root_sskel
+{
+ virtual int
+ digit ()
+ {
+ return 7;
+ }
+
+ virtual ::boolean
+ boolean ()
+ {
+ return TRUE;
+ }
+};
+
+int
+main ()
+{
+ digit_simpl digit_s;
+ boolean_simpl boolean_s;
+ root_simpl root_s;
+
+ root_s.serializers (digit_s, boolean_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/enumeration/makefile b/tests/cxx/serializer/enumeration/makefile
new file mode 100644
index 0000000..2ccb073
--- /dev/null
+++ b/tests/cxx/serializer/enumeration/makefile
@@ -0,0 +1,75 @@
+# file : tests/cxx/serializer/enumeration/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): cpp_options := -I$(out_base) -I$(src_base)
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): xsde_options += --type-map $(src_base)/test.map
+
+$(skel): $(out_root)/xsde/xsde $(src_base)/test.map
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/enumeration/output b/tests/cxx/serializer/enumeration/output
new file mode 100644
index 0000000..4907042
--- /dev/null
+++ b/tests/cxx/serializer/enumeration/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><digit>7</digit><boolean>1</boolean></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/enumeration/test.map b/tests/cxx/serializer/enumeration/test.map
new file mode 100644
index 0000000..73f5d25
--- /dev/null
+++ b/tests/cxx/serializer/enumeration/test.map
@@ -0,0 +1,7 @@
+namespace test
+{
+ include "boolean.hxx";
+
+ digit int int;
+ boolean ::boolean ::boolean;
+}
diff --git a/tests/cxx/serializer/enumeration/test.xsd b/tests/cxx/serializer/enumeration/test.xsd
new file mode 100644
index 0000000..c130f75
--- /dev/null
+++ b/tests/cxx/serializer/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="boolean">
+ <restriction base="int">
+ <enumeration value="0"/>
+ <enumeration value="1"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="digit" type="t:digit"/>
+ <element name="boolean" type="t:boolean"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/error-handling/codes/driver.cxx b/tests/cxx/serializer/error-handling/codes/driver.cxx
new file mode 100644
index 0000000..ba1f6cd
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/codes/driver.cxx
@@ -0,0 +1,327 @@
+// file : tests/cxx/serializer/error-handling/codes/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test error reporting with error codes.
+//
+
+#include <cassert>
+#include <sstream>
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+// bool fail = true;
+
+struct test_simpl: virtual test_sskel
+{
+ test_simpl (int c)
+ : case_ (c)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+ if (case_ == 6)
+ _app_error (case_);
+
+ n_ = 0;
+ }
+
+ virtual void
+ _pre ()
+ {
+ if (case_ == 7)
+ _app_error (case_);
+
+ if (case_ == 19)
+ _end_element ();
+ }
+
+ // Attributes.
+ //
+ virtual bool
+ x_present ()
+ {
+ if (case_ == 8)
+ {
+ _app_error (case_);
+ return false;
+ }
+
+ return true;
+ }
+
+ virtual int
+ x ()
+ {
+ if (case_ == 9)
+ _app_error (case_);
+
+ return -1;
+ }
+
+ virtual int
+ y ()
+ {
+ if (case_ == 10)
+ _app_error (case_);
+
+ return -2;
+ }
+
+ // Elements.
+ //
+ virtual int
+ a ()
+ {
+ if (case_ == 11)
+ _app_error (case_);
+
+ return 1;
+ }
+
+ virtual bool
+ b_present ()
+ {
+ if (case_ == 12)
+ {
+ _app_error (case_);
+ return false;
+ }
+
+ return true;
+ }
+
+ virtual int
+ b ()
+ {
+ if (case_ == 13)
+ _app_error (case_);
+
+ return 2;
+ }
+
+ virtual bool
+ c_next ()
+ {
+ if (case_ == 14)
+ {
+ _app_error (case_);
+ return false;
+ }
+
+ return n_++ < 3;
+ }
+
+ virtual int
+ c ()
+ {
+ if (case_ == 15)
+ _app_error (case_);
+
+ return 2 + n_;
+ }
+
+ virtual void
+ _post ()
+ {
+ if (case_ == 16)
+ _app_error (case_);
+ }
+
+ virtual void
+ post ()
+ {
+ if (case_ == 17)
+ _app_error (case_);
+ }
+
+private:
+ int case_;
+ int n_;
+};
+
+struct root_simpl: root_sskel
+{
+ root_simpl (int c)
+ : case_ (c)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+ if (case_ == 1)
+ _app_error (case_);
+ }
+
+ virtual void
+ _pre ()
+ {
+ if (case_ == 2)
+ _app_error (case_);
+ }
+
+ virtual void
+ test ()
+ {
+ if (case_ == 3)
+ _app_error (case_);
+ }
+
+ virtual void
+ _post ()
+ {
+ if (case_ == 4)
+ _app_error (case_);
+ }
+
+ virtual void
+ post ()
+ {
+ if (case_ == 5)
+ _app_error (case_);
+ }
+
+private:
+ int case_;
+};
+
+struct writer: xml_schema::writer
+{
+ virtual bool
+ write (const char*, size_t)
+ {
+ return false;
+ }
+
+ virtual bool
+ flush ()
+ {
+ return false;
+ }
+};
+
+
+void
+print (xml_schema::serializer_error e)
+{
+ typedef xml_schema::serializer_error error;
+
+ switch (e.type ())
+ {
+ case error::sys:
+ {
+ cout << "sys: " << e.sys_code () << ": " << e.sys_text () << endl;
+ break;
+ }
+ case error::xml:
+ {
+ cout << "xml: " << e.xml_code () << ": " << e.xml_text () << endl;
+ break;
+ }
+#ifdef XSDE_SERIALIZER_VALIDATION
+ case error::schema:
+ {
+ cout << "schema: " << e.schema_code () << ": " << e.schema_text ()
+ << endl;
+ break;
+ }
+#endif
+ case error::app:
+ {
+ cout << "app: " << e.app_code () << endl;
+ break;
+ }
+ default:
+ {
+ cout << "no error" << endl;
+ }
+ }
+}
+
+int
+main ()
+{
+ typedef xml_schema::serializer_error error;
+
+ /*
+ string output ("<g1:root xmlns:g1=\"test\"><test x=\"-1\" y=\"-2\">"
+ "<a>1</a><b>2</b><c>3</c><c>4</c><c>5</c></test></g1:root>");
+ */
+
+ // 1-5 : app errors in the root element serializer
+ // 6-17: app errors in the sub element serializer
+ // 18 : xml error in document serializer
+ // 19 : xml error in sub element serializer
+ // 20 : sys error
+ //
+ for (int i (1); i <= 20; ++i)
+ {
+ xml_schema::int_simpl int_s;
+ test_simpl test_s (i);
+ root_simpl root_s (i);
+
+ test_s.serializers (int_s, int_s, int_s, int_s, int_s);
+ root_s.serializers (test_s);
+
+ xml_schema::document_simpl doc_s (
+ root_s,
+ "test",
+ (i == 18 ? "bad name" : "root"));
+
+ root_s.pre ();
+
+ if (error e = root_s._error ())
+ print (e);
+ else
+ {
+ ostringstream os;
+
+ if (i == 20)
+ {
+ writer w;
+ doc_s.serialize (w);
+ }
+ else
+ doc_s.serialize (os);
+
+ if (error e = doc_s._error ())
+ print (e);
+ else
+ {
+ root_s.post ();
+
+ if (error e = root_s._error ())
+ print (e);
+ }
+ }
+
+ /*
+ {
+ fail = false;
+
+ ostringstream os;
+
+ root_s.pre ();
+ assert (!root_s.error ());
+
+ doc_s.serialize (os);
+ assert (!doc_s._error ());
+
+ root_s.post ();
+ assert (!root_s.error ());
+
+ assert (os.str () == output);
+
+ fail = true;
+ }
+ */
+ }
+}
diff --git a/tests/cxx/serializer/error-handling/codes/makefile b/tests/cxx/serializer/error-handling/codes/makefile
new file mode 100644
index 0000000..bdaca6c
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/codes/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/error-handling/codes/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/error-handling/codes/output b/tests/cxx/serializer/error-handling/codes/output
new file mode 100644
index 0000000..c01aab9
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/codes/output
@@ -0,0 +1,20 @@
+app: 1
+app: 2
+app: 3
+app: 4
+app: 5
+app: 6
+app: 7
+app: 8
+app: 9
+app: 10
+app: 11
+app: 12
+app: 13
+app: 14
+app: 15
+app: 16
+app: 17
+xml: 3: illegal name
+xml: 8: call out of sequence
+sys: 4: write failed
diff --git a/tests/cxx/serializer/error-handling/codes/test.xsd b/tests/cxx/serializer/error-handling/codes/test.xsd
new file mode 100644
index 0000000..530118c
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/codes/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="test">
+ <sequence>
+ <element name="a" type="int"/>
+ <element name="b" type="int" minOccurs="0"/>
+ <element name="c" type="int" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="x" type="int"/>
+ <attribute name="y" type="int" use="required"/>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test" type="t:test"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/error-handling/exceptions/driver.cxx b/tests/cxx/serializer/error-handling/exceptions/driver.cxx
new file mode 100644
index 0000000..3a7437b
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/exceptions/driver.cxx
@@ -0,0 +1,285 @@
+// file : tests/cxx/serializer/error-handling/exceptions/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test error reporting with exceptions.
+//
+
+#include <cassert>
+#include <sstream>
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct app
+{
+ app (int code)
+ : code_ (code)
+ {
+ }
+
+ int
+ code () const
+ {
+ return code_;
+ }
+
+private:
+ int code_;
+};
+
+struct test_simpl: virtual test_sskel
+{
+ test_simpl (int c)
+ : case_ (c)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+ if (case_ == 6)
+ throw app (case_);
+
+ n_ = 0;
+ }
+
+ virtual void
+ _pre ()
+ {
+ if (case_ == 7)
+ throw app (case_);
+
+ if (case_ == 19)
+ _end_element ();
+ }
+
+ // Attributes.
+ //
+ virtual bool
+ x_present ()
+ {
+ if (case_ == 8)
+ {
+ throw app (case_);
+ return false;
+ }
+
+ return true;
+ }
+
+ virtual int
+ x ()
+ {
+ if (case_ == 9)
+ throw app (case_);
+
+ return -1;
+ }
+
+ virtual int
+ y ()
+ {
+ if (case_ == 10)
+ throw app (case_);
+
+ return -2;
+ }
+
+ // Elements.
+ //
+ virtual int
+ a ()
+ {
+ if (case_ == 11)
+ throw app (case_);
+
+ return 1;
+ }
+
+ virtual bool
+ b_present ()
+ {
+ if (case_ == 12)
+ {
+ throw app (case_);
+ return false;
+ }
+
+ return true;
+ }
+
+ virtual int
+ b ()
+ {
+ if (case_ == 13)
+ throw app (case_);
+
+ return 2;
+ }
+
+ virtual bool
+ c_next ()
+ {
+ if (case_ == 14)
+ {
+ throw app (case_);
+ return false;
+ }
+
+ return n_++ < 3;
+ }
+
+ virtual int
+ c ()
+ {
+ if (case_ == 15)
+ throw app (case_);
+
+ return 2 + n_;
+ }
+
+ virtual void
+ _post ()
+ {
+ if (case_ == 16)
+ throw app (case_);
+ }
+
+ virtual void
+ post ()
+ {
+ if (case_ == 17)
+ throw app (case_);
+ }
+
+private:
+ int case_;
+ int n_;
+};
+
+struct root_simpl: root_sskel
+{
+ root_simpl (int c)
+ : case_ (c)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+ if (case_ == 1)
+ throw app (case_);
+ }
+
+ virtual void
+ _pre ()
+ {
+ if (case_ == 2)
+ throw app (case_);
+ }
+
+ virtual void
+ test ()
+ {
+ if (case_ == 3)
+ throw app (case_);
+ }
+
+ virtual void
+ _post ()
+ {
+ if (case_ == 4)
+ throw app (case_);
+ }
+
+ virtual void
+ post ()
+ {
+ if (case_ == 5)
+ throw app (case_);
+ }
+
+private:
+ int case_;
+};
+
+struct writer: xml_schema::writer
+{
+ virtual void
+ write (const char*, size_t)
+ {
+ throw ios_base::failure ("write failed");
+ }
+
+ virtual void
+ flush ()
+ {
+ throw ios_base::failure ("write failed");
+ }
+};
+
+int
+main ()
+{
+
+ // 1-5 : app errors in the root element serializer
+ // 6-17: app errors in the sub element serializer
+ // 18 : xml error in document serializer
+ // 19 : xml error in sub element serializer
+ // 20 : sys error
+ //
+ for (int i (1); i <= 20; ++i)
+ {
+ try
+ {
+ xml_schema::int_simpl int_s;
+ test_simpl test_s (i);
+ root_simpl root_s (i);
+
+ test_s.serializers (int_s, int_s, int_s, int_s, int_s);
+ root_s.serializers (test_s);
+
+ xml_schema::document_simpl doc_s (
+ root_s,
+ "test",
+ (i == 18 ? "bad name" : "root"));
+
+ root_s.pre ();
+
+ ostringstream os;
+
+ if (i == 20)
+ {
+ writer w;
+ doc_s.serialize (w);
+ }
+ else
+ doc_s.serialize (os);
+
+ root_s.post ();
+ }
+ catch (ios_base::failure const&)
+ {
+ cout << "sys: write failed" << endl;
+ }
+ catch (xml_schema::serializer_xml const& e)
+ {
+ cout << "xml: " << e.text () << endl;
+ }
+#ifdef XSDE_SERIALIZER_VALIDATION
+ catch (xml_schema::serializer_schema const& e)
+ {
+ cout << "schema: " << e.text () << endl;
+ }
+#endif
+ catch (app const& e)
+ {
+ cout << "app: " << e.code () << endl;
+ }
+ }
+}
diff --git a/tests/cxx/serializer/error-handling/exceptions/makefile b/tests/cxx/serializer/error-handling/exceptions/makefile
new file mode 100644
index 0000000..19027cc
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/exceptions/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/error-handling/exceptions/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/error-handling/exceptions/output b/tests/cxx/serializer/error-handling/exceptions/output
new file mode 100644
index 0000000..e640bd6
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/exceptions/output
@@ -0,0 +1,20 @@
+app: 1
+app: 2
+app: 3
+app: 4
+app: 5
+app: 6
+app: 7
+app: 8
+app: 9
+app: 10
+app: 11
+app: 12
+app: 13
+app: 14
+app: 15
+app: 16
+app: 17
+xml: illegal name
+xml: call out of sequence
+sys: write failed
diff --git a/tests/cxx/serializer/error-handling/exceptions/test.xsd b/tests/cxx/serializer/error-handling/exceptions/test.xsd
new file mode 100644
index 0000000..530118c
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/exceptions/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="test">
+ <sequence>
+ <element name="a" type="int"/>
+ <element name="b" type="int" minOccurs="0"/>
+ <element name="c" type="int" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="x" type="int"/>
+ <attribute name="y" type="int" use="required"/>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test" type="t:test"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/error-handling/makefile b/tests/cxx/serializer/error-handling/makefile
new file mode 100644
index 0000000..03597f5
--- /dev/null
+++ b/tests/cxx/serializer/error-handling/makefile
@@ -0,0 +1,24 @@
+# file : tests/cxx/serializer/error-handling/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+# license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make
+
+ifeq ($(xsde_exceptions),y)
+tests := exceptions
+else
+tests := codes
+endif
+
+default := $(out_base)/
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+.PHONY: $(default) $(test) $(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/tests/cxx/serializer/generated-driver/makefile b/tests/cxx/serializer/generated-driver/makefile
new file mode 100644
index 0000000..08957fa
--- /dev/null
+++ b/tests/cxx/serializer/generated-driver/makefile
@@ -0,0 +1,75 @@
+# file : tests/cxx/serializer/generated-driver/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o) $(xsd:.xsd=-simpl.o) $(xsd:.xsd=-sdriver.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/$(xsd:.xsd=-sdriver)
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+gen := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx) \
+ $(out_base)/$(xsd:.xsd=-sdriver.cxx)
+
+$(gen): xsde := $(out_root)/xsde/xsde
+$(gen): xsde_options += --generate-test-driver --force-overwrite
+$(gen): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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_simpl_suffix := -simpl
+$(call include,$(scf_root)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/generated-driver/output b/tests/cxx/serializer/generated-driver/output
new file mode 100644
index 0000000..d544e67
--- /dev/null
+++ b/tests/cxx/serializer/generated-driver/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><value>123</value></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/generated-driver/test-simpl.cxx b/tests/cxx/serializer/generated-driver/test-simpl.cxx
new file mode 100644
index 0000000..7acda2c
--- /dev/null
+++ b/tests/cxx/serializer/generated-driver/test-simpl.cxx
@@ -0,0 +1,28 @@
+// file : tests/cxx/serializer/generated-driver/test-simpl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include "test-simpl.hxx"
+
+namespace test
+{
+ // type_simpl
+ //
+
+ void type_simpl::
+ pre ()
+ {
+ }
+
+ int type_simpl::
+ value ()
+ {
+ return 123;
+ }
+
+ void type_simpl::
+ post ()
+ {
+ }
+}
diff --git a/tests/cxx/serializer/generated-driver/test-simpl.hxx b/tests/cxx/serializer/generated-driver/test-simpl.hxx
new file mode 100644
index 0000000..4700a9f
--- /dev/null
+++ b/tests/cxx/serializer/generated-driver/test-simpl.hxx
@@ -0,0 +1,27 @@
+// file : tests/cxx/serializer/generated-driver/test-simpl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef TEST_SIMPL_HXX
+#define TEST_SIMPL_HXX
+
+#include "test-sskel.hxx"
+
+namespace test
+{
+ class type_simpl: public virtual type_sskel
+ {
+ public:
+ virtual void
+ pre ();
+
+ virtual int
+ value ();
+
+ virtual void
+ post ();
+ };
+}
+
+#endif // TEST_SIMPL_HXX
diff --git a/tests/cxx/serializer/generated-driver/test.xsd b/tests/cxx/serializer/generated-driver/test.xsd
new file mode 100644
index 0000000..7ceb607
--- /dev/null
+++ b/tests/cxx/serializer/generated-driver/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="value" type="int"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:type"/>
+
+</schema>
diff --git a/tests/cxx/serializer/generated-impl/makefile b/tests/cxx/serializer/generated-impl/makefile
new file mode 100644
index 0000000..fc6c6b9
--- /dev/null
+++ b/tests/cxx/serializer/generated-impl/makefile
@@ -0,0 +1,84 @@
+# file : tests/cxx/serializer/generated-impl/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+# license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make
+
+# Note that this test only checks compilation of the generated empty
+# implementation and test driver. It may not work with some compilers
+# (missing return statements).
+#
+
+xsd := test.xsd
+
+obj := $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.o) $(xsd:.xsd=-simpl.o) $(xsd:.xsd=-sdriver.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/$(xsd:.xsd=-sdriver)
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+gen := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx) \
+ $(out_base)/$(xsd:.xsd=-simpl.hxx) \
+ $(out_base)/$(xsd:.xsd=-simpl.cxx) \
+ $(out_base)/$(xsd:.xsd=-sdriver.cxx)
+
+$(gen): xsde := $(out_root)/xsde/xsde
+$(gen): xsde_options += --generate-empty-impl --generate-test-driver \
+--force-overwrite
+$(gen): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver)
+ $(call message,test $$1,:,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-simpl.cxx.xsd.clean))
+
+
+# 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_simpl_suffix := -simpl
+$(call include,$(scf_root)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/generated-impl/test.xsd b/tests/cxx/serializer/generated-impl/test.xsd
new file mode 100644
index 0000000..f38c005
--- /dev/null
+++ b/tests/cxx/serializer/generated-impl/test.xsd
@@ -0,0 +1,193 @@
+<?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" use="required"/>
+ </complexType>
+
+ <complexType name="complex-extension">
+ <complexContent>
+ <extension base="t:complex">
+ <sequence>
+ <element name="b" type="string" minOccurs="0"/>
+ <element name="c" type="string" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="y" type="string"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="complex-opt-all">
+ <all minOccurs="0">
+ <element name="a" type="string"/>
+ <element name="b" type="string"/>
+ </all>
+ </complexType>
+
+ <complexType name="complex-opt-seq">
+ <sequence minOccurs="0">
+ <element name="a" type="string"/>
+ <element name="b" type="string"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="complex-seq-seq">
+ <sequence maxOccurs="unbounded">
+ <element name="a" type="string"/>
+ <element name="b" type="string"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="complex-opt-choice">
+ <choice minOccurs="0">
+ <element name="a" type="string"/>
+ <element name="b" type="string"/>
+ </choice>
+ </complexType>
+
+ <complexType name="complex-seq-choice">
+ <choice maxOccurs="unbounded">
+ <element name="a" type="string"/>
+ <element name="b" type="string"/>
+ </choice>
+ </complexType>
+
+ <complexType name="complex-any">
+ <sequence>
+ <any namespace="foo" processContents="skip" minOccurs="0"/>
+ <any namespace="bar" processContents="skip" maxOccurs="unbounded"/>
+ </sequence>
+ <anyAttribute namespace="foo" processContents="skip"/>
+ </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"/>
+
+ <element name="complex-opt-all" type="t:complex-opt-all"/>
+ <element name="complex-opt-seq" type="t:complex-opt-seq"/>
+ <element name="complex-seq-seq" type="t:complex-seq-seq"/>
+ <element name="complex-opt-choice" type="t:complex-opt-choice"/>
+ <element name="complex-seq-choice" type="t:complex-seq-choice"/>
+ <element name="complex-any" type="t:complex-any"/>
+
+ <!-- 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/tests/cxx/serializer/list/driver.cxx b/tests/cxx/serializer/list/driver.cxx
new file mode 100644
index 0000000..7ed5ee1
--- /dev/null
+++ b/tests/cxx/serializer/list/driver.cxx
@@ -0,0 +1,114 @@
+// file : tests/cxx/serializer/list/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test list type serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct int_list_simpl: int_list_sskel
+{
+ int_list_simpl ()
+ : n_ (0)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+ i_ = 0;
+ n_++;
+ }
+
+ virtual bool
+ item_next ()
+ {
+ switch (n_)
+ {
+ case 1:
+ return false;
+ case 2:
+ return i_++ < 1;
+ case 3:
+ return i_++ < 3;
+ default:
+ return false;
+ }
+ }
+
+ virtual int
+ item ()
+ {
+ return i_;
+ }
+
+private:
+ int n_, i_;
+};
+
+struct int_list_base_simpl: int_list_base_sskel
+{
+ int_list_base_simpl ()
+ : int_list_base_sskel (&base_impl_)
+ {
+ }
+
+ virtual int
+ base ()
+ {
+ return 123;
+ }
+
+private:
+ int_list_simpl base_impl_;
+};
+
+struct root_simpl: root_sskel
+{
+ virtual void
+ pre ()
+ {
+ n_ = 0;
+ }
+
+ virtual bool
+ int_list_next ()
+ {
+ return n_++ < 3;
+ }
+
+ virtual bool
+ int_list_base_next ()
+ {
+ return n_++ < 7;
+ }
+
+private:
+ int n_;
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ int_list_simpl int_list_s;
+ int_list_base_simpl int_list_base_s;
+ root_simpl root_s;
+
+ int_list_s.serializers (int_s);
+ int_list_base_s.serializers (int_s, int_s);
+ root_s.serializers (int_list_s, int_list_base_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/list/makefile b/tests/cxx/serializer/list/makefile
new file mode 100644
index 0000000..6d5a876
--- /dev/null
+++ b/tests/cxx/serializer/list/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/list/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/list/output b/tests/cxx/serializer/list/output
new file mode 100644
index 0000000..c1ef004
--- /dev/null
+++ b/tests/cxx/serializer/list/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><int-list></int-list><int-list>1</int-list><int-list>1 2 3</int-list><int-list-base base="123"></int-list-base><int-list-base base="123">1</int-list-base><int-list-base base="123">1 2 3</int-list-base></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/list/test.xsd b/tests/cxx/serializer/list/test.xsd
new file mode 100644
index 0000000..d4aff01
--- /dev/null
+++ b/tests/cxx/serializer/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="int-list">
+ <list itemType="int"/>
+ </simpleType>
+
+ <complexType name="int-list-base">
+ <simpleContent>
+ <extension base="t:int-list">
+ <attribute name="base" type="int" use="required"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="int-list" type="t:int-list" maxOccurs="unbounded"/>
+ <element name="int-list-base" type="t:int-list-base" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/makefile b/tests/cxx/serializer/makefile
new file mode 100644
index 0000000..8d72167
--- /dev/null
+++ b/tests/cxx/serializer/makefile
@@ -0,0 +1,52 @@
+# file : tests/cxx/serializer/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+# license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../build/bootstrap.make
+
+tests := generated-driver generated-impl
+
+ifeq ($(xsde_iostream),y)
+
+tests += \
+all \
+built-in \
+choice \
+error-handling \
+recursive \
+reset \
+restriction \
+sequence \
+test-template \
+wildcard
+
+ifeq ($(xsde_reuse_style),tiein)
+tests += \
+complex \
+enumeration \
+list \
+union
+endif
+
+ifeq ($(xsde_polymorphic),y)
+tests += polymorphism
+endif
+
+endif # xsde_iostream
+
+ifeq ($(xsde_serializer_validation),y)
+tests += validation
+endif
+
+default := $(out_base)/
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+.PHONY: $(default) $(test) $(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/tests/cxx/serializer/polymorphism/driver.cxx b/tests/cxx/serializer/polymorphism/driver.cxx
new file mode 100644
index 0000000..ebb0244
--- /dev/null
+++ b/tests/cxx/serializer/polymorphism/driver.cxx
@@ -0,0 +1,203 @@
+// file : tests/cxx/serializer/polymorphism/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test substitution groups and xsi:type support.
+//
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct base_simpl: base_sskel
+{
+ virtual int
+ a ()
+ {
+ return 1;
+ }
+};
+
+struct interm_type_simpl: interm_type_sskel
+{
+ interm_type_simpl ()
+ : interm_type_sskel (&base_impl_)
+ {
+ }
+
+ virtual int
+ b ()
+ {
+ return 2;
+ }
+
+ base_simpl base_impl_;
+};
+
+struct interm_simpl: interm_sskel
+{
+ interm_simpl ()
+ : interm_sskel (&base_impl_)
+ {
+ }
+
+ virtual int
+ b ()
+ {
+ return 2;
+ }
+
+ base_simpl base_impl_;
+};
+
+struct derived_type_simpl: derived_type_sskel
+{
+ derived_type_simpl ()
+ : derived_type_sskel (&base_impl_)
+ {
+ }
+
+ virtual int
+ c ()
+ {
+ return 3;
+ }
+
+ interm_type_simpl base_impl_;
+};
+
+struct derived_simpl: derived_sskel
+{
+ derived_simpl ()
+ : derived_sskel (&base_impl_)
+ {
+ }
+
+ virtual int
+ c ()
+ {
+ return 3;
+ }
+
+ interm_simpl base_impl_;
+};
+
+struct type_simpl: type_sskel
+{
+ virtual void
+ pre ()
+ {
+ i_ = 0;
+ }
+
+ virtual bool
+ base_next ()
+ {
+ return i_ < 5;
+ }
+
+ virtual void
+ base ()
+ {
+ xml_schema::serializer_context& ctx = _context ();
+
+ switch (i_++)
+ {
+ case 0:
+ {
+ ctx.type_id (base_sskel::_static_type ());
+ break;
+ }
+ case 1:
+ {
+ ctx.type_id (interm_type_sskel::_static_type ());
+ break;
+ }
+ case 2:
+ {
+ ctx.type_id (interm_sskel::_static_type ());
+ break;
+ }
+ case 3:
+ {
+ ctx.type_id (derived_type_sskel::_static_type ());
+ break;
+ }
+ case 4:
+ {
+ ctx.type_id (derived_sskel::_static_type ());
+ break;
+ }
+ }
+ }
+
+private:
+ int i_;
+};
+
+int
+main ()
+{
+#ifdef XSDE_EXCEPTIONS
+ try
+ {
+#endif
+ xml_schema::int_simpl int_s;
+
+ base_simpl base_s;
+ interm_type_simpl interm_type_s;
+ interm_simpl interm_s;
+ derived_type_simpl derived_type_s;
+ derived_simpl derived_s;
+
+ xml_schema::serializer_map_impl map (7);
+ type_simpl type_s;
+
+ base_s.serializers (int_s);
+ interm_type_s.serializers (int_s, int_s);
+ interm_s.serializers (int_s, int_s);
+ derived_s.serializers (int_s, int_s, int_s);
+ derived_type_s.serializers (int_s, int_s, int_s);
+
+ map.insert (base_s);
+ map.insert (interm_type_s);
+ map.insert (interm_s);
+ map.insert (derived_s);
+ map.insert (derived_type_s);
+
+ type_s.base_serializer (map);
+
+ xml_schema::document_simpl doc_s (type_s, "test", "root", true);
+
+ doc_s.add_prefix ("t", "test");
+ doc_s.add_prefix ("xsi", "http://www.w3.org/2001/XMLSchema-instance");
+
+ type_s.pre ();
+ doc_s.serialize (cout);
+
+#ifndef XSDE_EXCEPTIONS
+ if (doc_s._error ())
+ {
+ cerr << "error" << endl;
+ return 1;
+ }
+#endif
+
+ type_s.post ();
+
+ // Test serializer resetting.
+ //
+ doc_s.reset ();
+
+#ifdef XSDE_EXCEPTIONS
+ }
+ catch (xml_schema::serializer_exception const& e)
+ {
+ cerr << e << endl;
+ return 1;
+ }
+#endif
+}
diff --git a/tests/cxx/serializer/polymorphism/makefile b/tests/cxx/serializer/polymorphism/makefile
new file mode 100644
index 0000000..ff2ccbe
--- /dev/null
+++ b/tests/cxx/serializer/polymorphism/makefile
@@ -0,0 +1,73 @@
+# file : tests/cxx/serializer/polymorphism/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): xsde_options += --generate-polymorphic
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/polymorphism/output b/tests/cxx/serializer/polymorphism/output
new file mode 100644
index 0000000..5107439
--- /dev/null
+++ b/tests/cxx/serializer/polymorphism/output
@@ -0,0 +1 @@
+<t:root xmlns:t="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><t:base><a>1</a></t:base><t:base xsi:type="t:interm_type"><a>1</a><b>2</b></t:base><t:interm><a>1</a><b>2</b></t:interm><t:base xsi:type="t:derived_type"><a>1</a><b>2</b><c>3</c></t:base><t:derived><a>1</a><b>2</b><c>3</c></t:derived></t:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/polymorphism/test.xsd b/tests/cxx/serializer/polymorphism/test.xsd
new file mode 100644
index 0000000..d6aa1e3
--- /dev/null
+++ b/tests/cxx/serializer/polymorphism/test.xsd
@@ -0,0 +1,64 @@
+<?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="int"/>
+ </sequence>
+ </complexType>
+
+ <element name="base" type="t:base"/>
+
+ <complexType name="interm_type">
+ <complexContent>
+ <extension base="t:base">
+ <sequence>
+ <element name="b" type="int"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="interm">
+ <complexContent>
+ <extension base="t:base">
+ <sequence>
+ <element name="b" type="int"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <element name="interm" type="t:interm" substitutionGroup="t:base"/>
+
+ <complexType name="derived_type">
+ <complexContent>
+ <extension base="t:interm_type">
+ <sequence>
+ <element name="c" type="int"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="derived">
+ <complexContent>
+ <extension base="t:interm">
+ <sequence>
+ <element name="c" type="int"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <element name="derived" type="t:derived" substitutionGroup="t:interm"/>
+
+ <complexType name="type">
+ <sequence>
+ <element ref="t:base" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:type"/>
+
+</schema>
diff --git a/tests/cxx/serializer/recursive/driver.cxx b/tests/cxx/serializer/recursive/driver.cxx
new file mode 100644
index 0000000..c474191
--- /dev/null
+++ b/tests/cxx/serializer/recursive/driver.cxx
@@ -0,0 +1,135 @@
+// file : tests/cxx/serializer/recursive/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test recursive type serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+
+struct sub_type_simpl: virtual sub_type_sskel
+{
+ sub_type_simpl ()
+ : n_ (0)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+ n_++;
+ }
+
+ // Attributes.
+ //
+ virtual bool
+ name_present ()
+ {
+ return true;
+ }
+
+ virtual int
+ name ()
+ {
+ return n_;
+ }
+
+ // Elements.
+ //
+ virtual bool
+ sub_present ()
+ {
+ return n_ == 1;
+ }
+
+ virtual bool
+ indir_present ()
+ {
+ return n_ == 1;
+ }
+
+ virtual bool
+ sub2_present ()
+ {
+ return n_ == 1;
+ }
+
+ virtual void
+ post ()
+ {
+ n_--;
+ }
+
+private:
+ int n_;
+};
+
+struct indir_type_simpl: virtual indir_type_sskel
+{
+ // Attributes.
+ //
+ virtual bool
+ name_present ()
+ {
+ return true;
+ }
+
+ virtual int
+ name ()
+ {
+ return 123;
+ }
+
+ // Elements.
+ //
+ virtual bool
+ sub_present ()
+ {
+ return true;
+ }
+};
+
+struct test_type_simpl: virtual test_type_sskel
+{
+ // Attributes.
+ //
+ virtual bool
+ name_present ()
+ {
+ return true;
+ }
+
+ virtual int
+ name ()
+ {
+ return 234;
+ }
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ sub_type_simpl sub_s;
+ indir_type_simpl indir_s;
+ test_type_simpl test_s;
+
+ sub_s.serializers (int_s, sub_s, indir_s, sub_s);
+ indir_s.serializers (int_s, sub_s);
+ test_s.serializers (int_s, sub_s);
+
+ xml_schema::document_simpl doc_s (test_s, "test", "root");
+
+ test_s.pre ();
+ doc_s.serialize (cout);
+ test_s.post ();
+
+ // Test serializer resetting.
+ //
+ doc_s.reset ();
+}
diff --git a/tests/cxx/serializer/recursive/makefile b/tests/cxx/serializer/recursive/makefile
new file mode 100644
index 0000000..4de9d93
--- /dev/null
+++ b/tests/cxx/serializer/recursive/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/recursive/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/recursive/output b/tests/cxx/serializer/recursive/output
new file mode 100644
index 0000000..717654f
--- /dev/null
+++ b/tests/cxx/serializer/recursive/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test" name="234"><sub name="1"><sub name="2"></sub><indir name="123"><sub name="2"></sub></indir><sub2 name="2"></sub2></sub></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/recursive/test.xsd b/tests/cxx/serializer/recursive/test.xsd
new file mode 100644
index 0000000..0e915c9
--- /dev/null
+++ b/tests/cxx/serializer/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:int" />
+ </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:int" />
+ </xs:complexType>
+
+ <xs:complexType name="test_type">
+ <xs:sequence>
+ <xs:element name="sub" type="sub_type" />
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:int" />
+ </xs:complexType>
+
+ <xs:element name="test" type="test_type" />
+</xs:schema>
diff --git a/tests/cxx/serializer/reset/driver.cxx b/tests/cxx/serializer/reset/driver.cxx
new file mode 100644
index 0000000..49e5d32
--- /dev/null
+++ b/tests/cxx/serializer/reset/driver.cxx
@@ -0,0 +1,281 @@
+// file : tests/cxx/serializer/reset/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test serializer resetting.
+//
+
+#include <assert.h>
+
+#include <string>
+#include <sstream>
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+bool fail = true;
+
+struct error {};
+
+#ifdef XSDE_REUSE_STYLE_MIXIN
+struct base_simpl: virtual base_sskel
+#else
+struct base_simpl: base_sskel
+#endif
+{
+ base_simpl (unsigned long i)
+ : i_ (i)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+#ifndef XSDE_EXCEPTIONS
+ assert (!_error ());
+#endif
+
+ if (fail && i_ == 3)
+ {
+#ifdef XSDE_EXCEPTIONS
+ throw error ();
+#else
+ _app_error (1);
+#endif
+ }
+ }
+
+private:
+ unsigned long i_;
+};
+
+#ifdef XSDE_REUSE_STYLE_MIXIN
+struct inner_simpl: inner_sskel, base_simpl
+#else
+struct inner_simpl: inner_sskel
+#endif
+{
+ inner_simpl (unsigned long i)
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ : base_simpl (i), i_ (i)
+#else
+ : inner_sskel (&base_impl_), base_impl_ (i), i_ (i)
+#endif
+ {
+ }
+
+ virtual void
+ _pre ()
+ {
+ n_ = 0;
+ }
+
+ virtual bool
+ b_next ()
+ {
+ if (fail && i_ == 6)
+ {
+#ifdef XSDE_SERIALIZER_VALIDATION
+ return false;
+#else
+#ifdef XSDE_EXCEPTIONS
+ throw error ();
+#else
+ _app_error (1);
+#endif
+ return true;
+#endif
+ }
+
+ return n_++ == 0;
+ }
+
+ virtual int
+ b ()
+ {
+ if (fail && i_ == 4)
+ {
+#ifdef XSDE_EXCEPTIONS
+ throw error ();
+#else
+ _app_error (1);
+#endif
+ }
+
+ return 1;
+ }
+
+ virtual void
+ post ()
+ {
+ if (fail && i_ == 5)
+ {
+#ifdef XSDE_EXCEPTIONS
+ throw error ();
+#else
+ _app_error (1);
+#endif
+ }
+ }
+
+private:
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ base_simpl base_impl_;
+#endif
+ unsigned long i_;
+ unsigned long n_;
+};
+
+struct type_simpl: type_sskel
+{
+ type_simpl (unsigned long i)
+ : i_ (i)
+ {
+ }
+
+ virtual void
+ pre ()
+ {
+ if (fail && i_ == 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ throw error ();
+#else
+ _app_error (1);
+#endif
+ }
+ }
+
+ virtual void
+ a ()
+ {
+ if (fail && i_ == 1)
+ {
+#ifdef XSDE_EXCEPTIONS
+ throw error ();
+#else
+ _app_error (1);
+#endif
+ }
+ }
+
+ virtual void
+ post ()
+ {
+ if (fail && i_ == 2)
+ {
+#ifdef XSDE_EXCEPTIONS
+ throw error ();
+#else
+ _app_error (1);
+#endif
+ }
+ }
+
+private:
+ unsigned long i_;
+};
+
+int
+main ()
+{
+ try
+ {
+ for (unsigned long i (0); i < 7; ++i)
+ {
+ xml_schema::int_simpl int_s;
+ inner_simpl inner_s (i);
+ type_simpl type_s (i);
+
+ inner_s.serializers (int_s);
+ type_s.serializers (inner_s);
+
+ xml_schema::document_simpl doc_s (type_s, "test", "root");
+
+ doc_s.add_prefix ("t", "test");
+ doc_s.add_schema ("test", "test.xsd");
+
+ ostringstream ostr;
+
+ cout << i << ": ";
+
+#ifdef XSDE_EXCEPTIONS
+ try
+ {
+ fail = true;
+
+ type_s.pre ();
+ doc_s.serialize (ostr);
+ type_s.post ();
+ assert (false);
+ }
+ catch (error const&)
+ {
+ }
+ catch (xml_schema::serializer_exception const&)
+ {
+ }
+
+ fail = false;
+ doc_s.reset ();
+
+ type_s.pre ();
+ doc_s.serialize (cout);
+ type_s.post ();
+#else
+ do
+ {
+ fail = true;
+
+ type_s.pre ();
+
+ if (type_s._error ())
+ break;
+
+ doc_s.serialize (ostr);
+
+ if (doc_s._error ())
+ break;
+
+ type_s.post ();
+
+ if (type_s._error ())
+ break;
+
+ assert (false);
+ }
+ while (false);
+
+ fail = false;
+ doc_s.reset ();
+
+ type_s.pre ();
+ assert (!type_s._error ());
+
+ doc_s.serialize (cout);
+ assert (!doc_s._error ());
+
+ type_s.post ();
+ assert (!type_s._error ());
+#endif
+
+ cout << endl;
+ }
+ }
+#ifdef XSDE_EXCEPTIONS
+ catch (xml_schema::serializer_exception const& e)
+ {
+ cerr << e << endl;
+ return 1;
+ }
+#endif
+ catch (std::ios_base::failure const&)
+ {
+ cerr << "io failure" << endl;
+ return 1;
+ }
+}
diff --git a/tests/cxx/serializer/reset/makefile b/tests/cxx/serializer/reset/makefile
new file mode 100644
index 0000000..2d87e58
--- /dev/null
+++ b/tests/cxx/serializer/reset/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/reset/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/reset/output b/tests/cxx/serializer/reset/output
new file mode 100644
index 0000000..8e0b569
--- /dev/null
+++ b/tests/cxx/serializer/reset/output
@@ -0,0 +1,7 @@
+0: <t:root xmlns:t="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test test.xsd"><a><b>1</b></a></t:root>
+1: <t:root xmlns:t="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test test.xsd"><a><b>1</b></a></t:root>
+2: <t:root xmlns:t="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test test.xsd"><a><b>1</b></a></t:root>
+3: <t:root xmlns:t="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test test.xsd"><a><b>1</b></a></t:root>
+4: <t:root xmlns:t="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test test.xsd"><a><b>1</b></a></t:root>
+5: <t:root xmlns:t="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test test.xsd"><a><b>1</b></a></t:root>
+6: <t:root xmlns:t="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test test.xsd"><a><b>1</b></a></t:root>
diff --git a/tests/cxx/serializer/reset/test.xsd b/tests/cxx/serializer/reset/test.xsd
new file mode 100644
index 0000000..f368fa0
--- /dev/null
+++ b/tests/cxx/serializer/reset/test.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="base">
+ <sequence>
+ </sequence>
+ </complexType>
+
+ <complexType name="inner">
+ <complexContent>
+ <extension base="t:base">
+ <sequence>
+ <element name="b" type="int" maxOccurs="unbounded"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="type">
+ <sequence>
+ <element name="a" type="t:inner"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:type"/>
+
+</schema>
diff --git a/tests/cxx/serializer/restriction/driver.cxx b/tests/cxx/serializer/restriction/driver.cxx
new file mode 100644
index 0000000..0430765
--- /dev/null
+++ b/tests/cxx/serializer/restriction/driver.cxx
@@ -0,0 +1,246 @@
+// file : tests/cxx/serializer/restriction/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test inheritance-by-restriction serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: test_1_sskel
+{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ test_1_simpl ()
+ : test_1_sskel (0)
+ {
+ }
+#endif
+
+ virtual int
+ optional ()
+ {
+ return 123;
+ }
+
+ virtual int
+ required ()
+ {
+ return 234;
+ }
+};
+
+struct test_2_simpl: test_2_sskel
+{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ test_2_simpl ()
+ : test_2_sskel (0)
+ {
+ }
+#endif
+
+ virtual void
+ pre ()
+ {
+ i_ = 0;
+ }
+
+ virtual int
+ a ()
+ {
+ return 1;
+ }
+
+ virtual bool
+ sequence_next ()
+ {
+ return i_++ < 1;
+ }
+
+ virtual int
+ b ()
+ {
+ return 2;
+ }
+
+ virtual int
+ c ()
+ {
+ return 3;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return e_tag;
+ }
+
+ virtual int
+ d ()
+ {
+ return 4;
+ }
+
+ virtual int
+ e ()
+ {
+ return 5;
+ }
+
+private:
+ int i_;
+};
+
+struct test_3_simpl: test_3_sskel
+{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ test_3_simpl ()
+ : test_3_sskel (0)
+ {
+ }
+#endif
+
+ virtual int
+ a ()
+ {
+ return 1;
+ }
+
+ virtual int
+ b ()
+ {
+ return 2;
+ }
+
+ virtual int
+ c ()
+ {
+ return 3;
+ }
+
+ virtual int
+ d ()
+ {
+ return 4;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return g_tag;
+ }
+
+ virtual int
+ e ()
+ {
+ return 5;
+ }
+
+ virtual int
+ f ()
+ {
+ return 6;
+ }
+
+ virtual int
+ g ()
+ {
+ return 7;
+ }
+
+private:
+ int i_;
+};
+
+struct test_4_simpl: test_4_sskel
+{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ test_4_simpl ()
+ : test_4_sskel (0)
+ {
+ }
+#endif
+
+ virtual int
+ a ()
+ {
+ return 1;
+ }
+
+ virtual int
+ b ()
+ {
+ return 2;
+ }
+
+ virtual int
+ c ()
+ {
+ return 3;
+ }
+
+ virtual int
+ d ()
+ {
+ return 4;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return g_tag;
+ }
+
+ virtual int
+ e ()
+ {
+ return 5;
+ }
+
+ virtual int
+ f ()
+ {
+ return 6;
+ }
+
+ virtual int
+ g ()
+ {
+ return 7;
+ }
+
+private:
+ int i_;
+};
+
+struct root_simpl: root_sskel
+{
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ test_1_simpl test_1_s;
+ test_2_simpl test_2_s;
+ test_3_simpl test_3_s;
+ test_4_simpl test_4_s;
+ root_simpl root_s;
+
+ test_1_s.serializers (int_s, int_s);
+ test_2_s.serializers (int_s, int_s, int_s, int_s, int_s);
+ test_3_s.serializers (int_s, int_s, int_s, int_s, int_s, int_s, int_s);
+ test_4_s.serializers (int_s, int_s, int_s, int_s, int_s, int_s, int_s);
+ root_s.serializers (test_1_s, test_2_s, test_3_s, test_4_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/restriction/makefile b/tests/cxx/serializer/restriction/makefile
new file mode 100644
index 0000000..0a4f081
--- /dev/null
+++ b/tests/cxx/serializer/restriction/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/restriction/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/restriction/output b/tests/cxx/serializer/restriction/output
new file mode 100644
index 0000000..6cb29b4
--- /dev/null
+++ b/tests/cxx/serializer/restriction/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><test-1 optional="123" required="234"></test-1><test-2><a>1</a><b>2</b><c>3</c><e>5</e></test-2><test-3><b>2</b><g>7</g></test-3><test-4><b>2</b><g>7</g></test-4></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/restriction/test.xsd b/tests/cxx/serializer/restriction/test.xsd
new file mode 100644
index 0000000..0557e5e
--- /dev/null
+++ b/tests/cxx/serializer/restriction/test.xsd
@@ -0,0 +1,175 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <!-- attribute restriction -->
+
+ <complexType name="test-1-base">
+ <attribute name="optional" type="int"/>
+ <attribute name="required" type="int" use="required"/>
+ <anyAttribute namespace="foo bar" processContents="skip"/>
+ </complexType>
+
+ <complexType name="test-1">
+ <complexContent>
+ <restriction base="t:test-1-base">
+ <attribute name="optional" type="int" use="required"/>
+ <anyAttribute namespace="foo" processContents="skip"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+
+ <!-- simple content restriction -->
+
+ <complexType name="test-2-base">
+ <sequence>
+ <element name="a" type="int" minOccurs="0"/>
+ <sequence maxOccurs="unbounded">
+ <element name="b" type="int"/>
+ <element name="c" type="int"/>
+ </sequence>
+ <choice>
+ <element name="d" type="int"/>
+ <element name="e" type="int" minOccurs="0"/>
+ </choice>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-2">
+ <complexContent>
+ <restriction base="t:test-2-base">
+ <sequence>
+ <element name="a" type="int" minOccurs="1"/>
+ <sequence maxOccurs="2">
+ <element name="b" type="int"/>
+ <element name="c" type="int"/>
+ </sequence>
+ <choice>
+ <element name="d" type="int"/>
+ <element name="e" type="int" minOccurs="1"/>
+ </choice>
+ </sequence>
+ </restriction>
+ </complexContent>
+ </complexType>
+
+ <!-- more complex content restriction with some parts removed-->
+
+ <complexType name="test-3-base">
+ <sequence>
+ <element name="a" type="int" minOccurs="0"/>
+ <element name="b" type="int"/>
+ <sequence minOccurs="0">
+ <element name="c" type="int"/>
+ <element name="d" type="int"/>
+ </sequence>
+ <choice>
+ <element name="e" type="int" minOccurs="0"/>
+ <element name="f" type="int"/>
+ <element name="g" type="int"/>
+ </choice>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-3">
+ <complexContent>
+ <restriction base="t:test-3-base">
+ <sequence>
+ <element name="b" type="int"/>
+ <choice>
+ <element name="f" type="int"/>
+ <element name="g" type="int"/>
+ </choice>
+ </sequence>
+ </restriction>
+ </complexContent>
+ </complexType>
+
+ <!-- complex content restriction spread over inheritance-by-extension-->
+
+ <complexType name="test-4-base">
+ <sequence>
+ <element name="a" type="int" minOccurs="0"/>
+ <element name="b" type="int"/>
+ </sequence>
+ <anyAttribute namespace="foo bar" processContents="skip"/>
+ </complexType>
+
+ <complexType name="test-4-ext">
+ <complexContent>
+ <extension base="t:test-4-base">
+ <sequence>
+ <sequence minOccurs="0">
+ <element name="c" type="int"/>
+ <element name="d" type="int"/>
+ </sequence>
+ <choice>
+ <element name="e" type="int" minOccurs="0"/>
+ <element name="f" type="int"/>
+ <element name="g" type="int"/>
+ </choice>
+ </sequence>
+ <anyAttribute namespace="baz biz" processContents="skip"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="test-4">
+ <complexContent>
+ <restriction base="t:test-4-ext">
+ <sequence>
+ <sequence>
+ <element name="b" type="int"/>
+ </sequence>
+ <sequence>
+ <choice>
+ <element name="f" type="int"/>
+ <element name="g" type="int"/>
+ </choice>
+ </sequence>
+ </sequence>
+ <anyAttribute namespace="foo" processContents="skip"/>
+ <anyAttribute namespace="baz" processContents="skip"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+
+ <!-- restriction of sequence into optional (compilation only) -->
+
+ <complexType name="test-5-base">
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="a" type="int" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="b" type="int"/>
+ </choice>
+ <any namespace="foo" minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-5">
+ <complexContent>
+ <restriction base="t:test-5-base">
+ <sequence minOccurs="0" maxOccurs="1">
+ <choice minOccurs="0" maxOccurs="1">
+ <element name="a" type="int" minOccurs="0" maxOccurs="1"/>
+ <element name="b" type="int"/>
+ </choice>
+ <any namespace="foo" minOccurs="0" maxOccurs="1" processContents="skip"/>
+ </sequence>
+ </restriction>
+ </complexContent>
+ </complexType>
+
+ <!-- -->
+
+ <complexType name="root">
+ <sequence>
+ <element name="test-1" type="t:test-1"/>
+ <element name="test-2" type="t:test-2"/>
+ <element name="test-3" type="t:test-3"/>
+ <element name="test-4" type="t:test-4"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/sequence/driver.cxx b/tests/cxx/serializer/sequence/driver.cxx
new file mode 100644
index 0000000..ed6c5fb
--- /dev/null
+++ b/tests/cxx/serializer/sequence/driver.cxx
@@ -0,0 +1,231 @@
+// file : tests/cxx/serializer/sequence/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test the sequence compositor serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: test_1_sskel
+{
+ virtual void
+ pre ()
+ {
+ i_ = 0;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual bool
+ b_present ()
+ {
+ return true;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+ virtual bool
+ c_next ()
+ {
+ return i_++ < 3;
+ }
+
+ virtual int
+ c ()
+ {
+ return i_;
+ }
+
+private:
+ int i_;
+};
+
+struct test_2_simpl: test_2_sskel
+{
+ test_2_simpl ()
+ : i_ (0)
+ {
+ }
+
+ virtual bool
+ sequence_present ()
+ {
+ return i_++;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+private:
+ int i_;
+};
+
+struct test_3_simpl: test_3_sskel
+{
+ virtual void
+ pre ()
+ {
+ i_ = 0;
+ }
+
+ virtual bool
+ sequence_next ()
+ {
+ return i_++ < 3;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123 + i_;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234 + i_;
+ }
+
+private:
+ int i_;
+};
+
+struct test_4_simpl: test_4_sskel
+{
+ virtual void
+ pre ()
+ {
+ i_ = 0;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return c_tag;
+ }
+
+ virtual int
+ b ()
+ {
+ return 0;
+ }
+
+ virtual int
+ c ()
+ {
+ return 234;
+ }
+
+ virtual bool
+ sequence_next ()
+ {
+ return i_++ < 3;
+ }
+
+ virtual int
+ d ()
+ {
+ return 345 + i_;
+ }
+
+ virtual int
+ e ()
+ {
+ return 456 + i_;
+ }
+
+private:
+ int i_;
+};
+
+struct root_simpl: root_sskel
+{
+ virtual void
+ pre ()
+ {
+ n1_ = 0;
+ n2_ = 0;
+ n3_ = 0;
+ n4_ = 0;
+ }
+
+ virtual bool
+ test_1_next ()
+ {
+ return n1_++ < 1;
+ }
+
+ virtual bool
+ test_2_next ()
+ {
+ return n2_++ < 2;
+ }
+
+ virtual bool
+ test_3_next ()
+ {
+ return n3_++ < 1;
+ }
+
+ virtual bool
+ test_4_next ()
+ {
+ return n4_++ < 1;
+ }
+
+private:
+ int n1_, n2_, n3_, n4_;
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ test_1_simpl test_1_s;
+ test_2_simpl test_2_s;
+ test_3_simpl test_3_s;
+ test_4_simpl test_4_s;
+ root_simpl root_s;
+
+ test_1_s.serializers (int_s, int_s, int_s);
+ test_2_s.serializers (int_s, int_s);
+ test_3_s.serializers (int_s, int_s);
+ test_4_s.serializers (int_s, int_s, int_s, int_s, int_s);
+ root_s.serializers (test_1_s, test_2_s, test_3_s, test_4_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/sequence/makefile b/tests/cxx/serializer/sequence/makefile
new file mode 100644
index 0000000..a3a109e
--- /dev/null
+++ b/tests/cxx/serializer/sequence/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/sequence/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/sequence/output b/tests/cxx/serializer/sequence/output
new file mode 100644
index 0000000..a76f191
--- /dev/null
+++ b/tests/cxx/serializer/sequence/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><test-1><a>123</a><b>234</b><c>1</c><c>2</c><c>3</c></test-1><test-2></test-2><test-2><a>123</a><b>234</b></test-2><test-3><a>124</a><b>235</b><a>125</a><b>236</b><a>126</a><b>237</b></test-3><test-4><a>123</a><c>234</c><d>346</d><e>457</e><d>347</d><e>458</e><d>348</d><e>459</e></test-4></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/sequence/test.xsd b/tests/cxx/serializer/sequence/test.xsd
new file mode 100644
index 0000000..696a1f2
--- /dev/null
+++ b/tests/cxx/serializer/sequence/test.xsd
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="test-1">
+ <sequence>
+ <element name="a" type="int"/>
+ <element name="b" type="int" minOccurs="0"/>
+ <element name="c" type="int" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-2">
+ <sequence minOccurs="0">
+ <element name="a" type="int"/>
+ <element name="b" type="int"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-3">
+ <sequence maxOccurs="unbounded">
+ <element name="a" type="int"/>
+ <element name="b" type="int"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-4">
+ <sequence>
+ <element name="a" type="int"/>
+ <choice>
+ <element name="b" type="int"/>
+ <element name="c" type="int"/>
+ </choice>
+ <sequence maxOccurs="unbounded">
+ <element name="d" type="int"/>
+ <element name="e" type="int"/>
+ </sequence>
+ </sequence>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test-1" type="t:test-1" maxOccurs="unbounded"/>
+ <element name="test-2" type="t:test-2" maxOccurs="unbounded"/>
+ <element name="test-3" type="t:test-3" maxOccurs="unbounded"/>
+ <element name="test-4" type="t:test-4" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/test-template/driver.cxx b/tests/cxx/serializer/test-template/driver.cxx
new file mode 100644
index 0000000..784f223
--- /dev/null
+++ b/tests/cxx/serializer/test-template/driver.cxx
@@ -0,0 +1,48 @@
+// file : tests/cxx/serializer/test-template/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Insert test description here.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct root_simpl: root_sskel
+{
+ virtual void
+ pre ()
+ {
+ }
+
+ virtual int
+ a ()
+ {
+ return 1234;
+ }
+
+ virtual void
+ post_type ()
+ {
+ }
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ root_simpl root_s;
+
+ root_s.serializers (int_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/test-template/makefile b/tests/cxx/serializer/test-template/makefile
new file mode 100644
index 0000000..28e1f5f
--- /dev/null
+++ b/tests/cxx/serializer/test-template/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/test-template/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/test-template/output b/tests/cxx/serializer/test-template/output
new file mode 100644
index 0000000..509a8ed
--- /dev/null
+++ b/tests/cxx/serializer/test-template/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><a>1234</a></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/test-template/test.xsd b/tests/cxx/serializer/test-template/test.xsd
new file mode 100644
index 0000000..164b72c
--- /dev/null
+++ b/tests/cxx/serializer/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="root">
+ <sequence>
+ <element name="a" type="int"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/union/driver.cxx b/tests/cxx/serializer/union/driver.cxx
new file mode 100644
index 0000000..566b681
--- /dev/null
+++ b/tests/cxx/serializer/union/driver.cxx
@@ -0,0 +1,93 @@
+// file : tests/cxx/serializer/union/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test union type serialization.
+//
+
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct int_bool_union_simpl: virtual int_bool_union_sskel
+{
+ int_bool_union_simpl ()
+ : n_ (0)
+ {
+ }
+
+ virtual void
+ _serialize_content ()
+ {
+ if (n_++ == 0)
+ _characters ("123");
+ else
+ _characters ("false");
+ }
+
+private:
+ int n_;
+};
+
+struct int_bool_base_simpl: int_bool_base_sskel
+{
+ int_bool_base_simpl ()
+ : int_bool_base_sskel (&base_impl_)
+ {
+ }
+
+ virtual int
+ base ()
+ {
+ return 123;
+ }
+
+private:
+ int_bool_union_simpl base_impl_;
+};
+
+struct root_simpl: root_sskel
+{
+ virtual void
+ pre ()
+ {
+ n_ = 0;
+ }
+
+ virtual bool
+ int_bool_union_next ()
+ {
+ return n_++ < 2;
+ }
+
+ virtual bool
+ int_bool_base_next ()
+ {
+ return n_++ < 5;
+ }
+
+private:
+ int n_;
+};
+
+int
+main ()
+{
+ xml_schema::int_simpl int_s;
+ int_bool_union_simpl int_bool_union_s;
+ int_bool_base_simpl int_bool_base_s;
+ root_simpl root_s;
+
+ int_bool_base_s.serializers (int_s);
+ root_s.serializers (int_bool_union_s, int_bool_base_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/union/makefile b/tests/cxx/serializer/union/makefile
new file mode 100644
index 0000000..f361564
--- /dev/null
+++ b/tests/cxx/serializer/union/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/union/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/union/output b/tests/cxx/serializer/union/output
new file mode 100644
index 0000000..70363b0
--- /dev/null
+++ b/tests/cxx/serializer/union/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test"><int-bool-union>123</int-bool-union><int-bool-union>false</int-bool-union><int-bool-base base="123">123</int-bool-base><int-bool-base base="123">false</int-bool-base></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/union/test.xsd b/tests/cxx/serializer/union/test.xsd
new file mode 100644
index 0000000..b5b7707
--- /dev/null
+++ b/tests/cxx/serializer/union/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="int-bool-union">
+ <union memberTypes="int boolean"/>
+ </simpleType>
+
+ <complexType name="int-bool-base">
+ <simpleContent>
+ <extension base="t:int-bool-union">
+ <attribute name="base" type="int" use="required"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="int-bool-union" type="t:int-bool-union" maxOccurs="unbounded"/>
+ <element name="int-bool-base" type="t:int-bool-base" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/validation/any/driver.cxx b/tests/cxx/serializer/validation/any/driver.cxx
new file mode 100644
index 0000000..ecdf7f8
--- /dev/null
+++ b/tests/cxx/serializer/validation/any/driver.cxx
@@ -0,0 +1,317 @@
+// file : tests/cxx/serializer/validation/any/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test any validation.
+//
+
+#include <sstream>
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: virtual test_1_sskel
+{
+ virtual bool
+ any_next ()
+ {
+ return false;
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any (std::string&, std::string&)
+ {
+#else
+ any (const char*&, const char*&, bool&)
+ {
+#endif
+ }
+
+ virtual void
+ serialize_any ()
+ {
+ }
+};
+
+// ##any
+//
+struct test_2_simpl: virtual test_2_sskel
+{
+ virtual void
+#ifdef XSDE_STL
+ any (std::string& ns, std::string& name)
+ {
+#else
+ any (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ ns = "foo";
+ name = "";
+ }
+
+ virtual void
+ serialize_any ()
+ {
+ }
+};
+
+// ##other
+//
+struct test_3_simpl: virtual test_3_sskel
+{
+ test_3_simpl (int state)
+ : state_ (state)
+ {
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any (std::string& ns, std::string& name)
+ {
+#else
+ any (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ switch (state_)
+ {
+ case 2:
+ {
+ // target
+ //
+ ns = "test";
+ name = "x";
+ break;
+ }
+ case 3:
+ {
+ // local
+ //
+ ns = "";
+ name = "x";
+ break;
+ }
+ }
+ }
+
+ virtual void
+ serialize_any ()
+ {
+ }
+
+private:
+ int state_;
+};
+
+// ##local
+//
+struct test_4_simpl: virtual test_4_sskel
+{
+ virtual void
+#ifdef XSDE_STL
+ any (std::string& ns, std::string& name)
+ {
+#else
+ any (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ ns = "foo";
+ name = "x";
+ }
+
+ virtual void
+ serialize_any ()
+ {
+ }
+};
+
+// ##targetNamespace
+//
+struct test_5_simpl: virtual test_5_sskel
+{
+ test_5_simpl (int state)
+ : state_ (state)
+ {
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any (std::string& ns, std::string& name)
+ {
+#else
+ any (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ switch (state_++)
+ {
+ case 5:
+ {
+ // target
+ //
+ ns = "foo";
+ name = "x";
+ break;
+ }
+ case 6:
+ {
+ // local
+ //
+ ns = "";
+ name = "x";
+ break;
+ }
+ }
+ }
+
+ virtual void
+ serialize_any ()
+ {
+ }
+
+private:
+ int state_;
+};
+
+// foo
+//
+struct test_6_simpl: virtual test_6_sskel
+{
+ test_6_simpl (int state)
+ : state_ (state)
+ {
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any (std::string& ns, std::string& name)
+ {
+#else
+ any (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ switch (state_++)
+ {
+ case 7:
+ {
+ // bar
+ //
+ ns = "bar";
+ name = "x";
+ break;
+ }
+ case 8:
+ {
+ // local
+ //
+ ns = "";
+ name = "x";
+ break;
+ }
+ }
+ }
+
+ virtual void
+ serialize_any ()
+ {
+ }
+
+private:
+ int state_;
+};
+
+struct root_simpl: root_sskel
+{
+ root_simpl (int state)
+ : state_ (state)
+ {
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ switch (state_)
+ {
+ case 0:
+ return test_1_tag;
+ case 1:
+ return test_2_tag;
+ case 2:
+ case 3:
+ return test_3_tag;
+ case 4:
+ return test_4_tag;
+ case 5:
+ case 6:
+ return test_5_tag;
+ case 7:
+ case 8:
+ return test_5_tag;
+ default:
+ return choice_arm_tag (state_);
+ }
+ }
+
+private:
+ int state_;
+};
+
+int
+main ()
+{
+ for (int i = 0; i < 9; ++i)
+ {
+#ifdef XSDE_EXCEPTIONS
+ try
+ {
+#endif
+ test_1_simpl test_1_s;
+ test_2_simpl test_2_s;
+ test_3_simpl test_3_s (i);
+ test_4_simpl test_4_s;
+ test_5_simpl test_5_s (i);
+ test_6_simpl test_6_s (i);
+ root_simpl root_s (i);
+
+ root_s.serializers (test_1_s, test_2_s, test_3_s, test_4_s,
+ test_5_s, test_6_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+
+ ostringstream os;
+ doc_s.serialize (os);
+
+#ifndef XSDE_EXCEPTIONS
+ if (xml_schema::serializer_error e = doc_s._error ())
+ {
+ if (e.type () == xml_schema::serializer_error::schema)
+ {
+ cout << "schema: " << e.schema_text () << endl;
+ continue;
+ }
+ }
+#endif
+
+ root_s.post ();
+#ifdef XSDE_EXCEPTIONS
+ }
+ catch (xml_schema::serializer_schema const& e)
+ {
+ cout << "schema: " << e.text () << endl;
+ continue;
+ }
+#endif
+
+ cout << "no error" << endl;
+ }
+}
diff --git a/tests/cxx/serializer/validation/any/makefile b/tests/cxx/serializer/validation/any/makefile
new file mode 100644
index 0000000..2365ef1
--- /dev/null
+++ b/tests/cxx/serializer/validation/any/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/validation/any/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/any/output b/tests/cxx/serializer/validation/any/output
new file mode 100644
index 0000000..cf16193
--- /dev/null
+++ b/tests/cxx/serializer/validation/any/output
@@ -0,0 +1,9 @@
+schema: expected element not encountered
+schema: unexpected element encountered
+schema: unexpected element encountered
+schema: unexpected element encountered
+schema: unexpected element encountered
+schema: unexpected element encountered
+schema: unexpected element encountered
+schema: unexpected element encountered
+schema: unexpected element encountered
diff --git a/tests/cxx/serializer/validation/any/test.xsd b/tests/cxx/serializer/validation/any/test.xsd
new file mode 100644
index 0000000..4457d58
--- /dev/null
+++ b/tests/cxx/serializer/validation/any/test.xsd
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="test-1">
+ <sequence>
+ <any namespace="foo" processContents="skip" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-2">
+ <sequence>
+ <any namespace="##any" processContents="skip"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-3">
+ <sequence>
+ <any namespace="##other" processContents="skip"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-4">
+ <sequence>
+ <any namespace="##local" processContents="skip"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-5">
+ <sequence>
+ <any namespace="##targetNamespace" processContents="skip"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="test-6">
+ <sequence>
+ <any namespace="bar" processContents="skip"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="root">
+ <choice>
+ <element name="test-1" type="t:test-1"/>
+ <element name="test-2" type="t:test-2"/>
+ <element name="test-3" type="t:test-3"/>
+ <element name="test-4" type="t:test-4"/>
+ <element name="test-5" type="t:test-5"/>
+ <element name="test-6" type="t:test-6"/>
+ </choice>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/validation/attribute/driver.cxx b/tests/cxx/serializer/validation/attribute/driver.cxx
new file mode 100644
index 0000000..96a4629
--- /dev/null
+++ b/tests/cxx/serializer/validation/attribute/driver.cxx
@@ -0,0 +1,247 @@
+// file : tests/cxx/serializer/validation/attribute/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test attribute and anyAttribute validation.
+//
+
+#include <sstream>
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: virtual test_1_sskel
+{
+ test_1_simpl (int state)
+ : state_ (state)
+ {
+ }
+
+ virtual int
+ x ()
+ {
+ if (state_ == 0)
+ state_ ++;
+
+ return 123;
+ }
+
+ // ##any
+ //
+ virtual bool
+ any_attribute_next ()
+ {
+ return state_ == 1;
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any_attribute (std::string& ns, std::string& name)
+ {
+#else
+ any_attribute (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ state_++;
+ ns = "foo";
+ name = "";
+ }
+
+ // ##other
+ //
+ virtual bool
+ any_attribute1_next ()
+ {
+ return state_ > 1 && state_ < 4;
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any_attribute1 (std::string& ns, std::string& name)
+ {
+#else
+ any_attribute1 (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ switch (state_++)
+ {
+ case 2:
+ {
+ // target
+ //
+ ns = "test";
+ name = "x";
+ break;
+ }
+ case 3:
+ {
+ // local
+ //
+ ns = "";
+ name = "x";
+ break;
+ }
+ }
+ }
+
+ // ##local
+ //
+ virtual bool
+ any_attribute2_next ()
+ {
+ return state_ == 4;
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any_attribute2 (std::string& ns, std::string& name)
+ {
+#else
+ any_attribute2 (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ state_++;
+ ns = "foo";
+ name = "x";
+ }
+
+ // ##targetNamespace
+ //
+ virtual bool
+ any_attribute3_next ()
+ {
+ return state_ > 4 && state_ < 7;
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any_attribute3 (std::string& ns, std::string& name)
+ {
+#else
+ any_attribute3 (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ switch (state_++)
+ {
+ case 5:
+ {
+ // target
+ //
+ ns = "foo";
+ name = "x";
+ break;
+ }
+ case 6:
+ {
+ // local
+ //
+ ns = "";
+ name = "x";
+ break;
+ }
+ }
+ }
+
+ // foo
+ //
+ virtual bool
+ any_attribute4_next ()
+ {
+ return state_ > 6 && state_ < 9;
+ }
+
+ virtual void
+#ifdef XSDE_STL
+ any_attribute4 (std::string& ns, std::string& name)
+ {
+#else
+ any_attribute4 (const char*& ns, const char*& name, bool& free)
+ {
+ free = false;
+#endif
+ switch (state_++)
+ {
+ case 7:
+ {
+ // bar
+ //
+ ns = "bar";
+ name = "x";
+ break;
+ }
+ case 8:
+ {
+ // local
+ //
+ ns = "";
+ name = "x";
+ break;
+ }
+ }
+ }
+
+private:
+ int state_;
+};
+
+struct root_simpl: root_sskel
+{
+};
+
+int
+main ()
+{
+ for (int i = 0; i < 9; ++i)
+ {
+#ifdef XSDE_EXCEPTIONS
+ try
+ {
+#endif
+ xml_schema::int_simpl int_s;
+ test_1_simpl test_1_s (i);
+ root_simpl root_s;
+
+ if (i != 0)
+ test_1_s.serializers (int_s);
+
+ root_s.serializers (test_1_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+
+ ostringstream os;
+ doc_s.serialize (os);
+
+#ifndef XSDE_EXCEPTIONS
+ if (xml_schema::serializer_error e = doc_s._error ())
+ {
+ if (e.type () == xml_schema::serializer_error::schema)
+ {
+ cout << "schema: " << e.schema_text () << endl;
+ continue;
+ }
+ }
+#endif
+
+ root_s.post ();
+#ifdef XSDE_EXCEPTIONS
+ }
+ catch (xml_schema::serializer_schema const& e)
+ {
+ cout << "schema: " << e.text () << endl;
+ continue;
+ }
+#endif
+
+ cout << "no error" << endl;
+ }
+}
diff --git a/tests/cxx/serializer/validation/attribute/makefile b/tests/cxx/serializer/validation/attribute/makefile
new file mode 100644
index 0000000..586b957
--- /dev/null
+++ b/tests/cxx/serializer/validation/attribute/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/validation/attribute/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/attribute/output b/tests/cxx/serializer/validation/attribute/output
new file mode 100644
index 0000000..2b9de1e
--- /dev/null
+++ b/tests/cxx/serializer/validation/attribute/output
@@ -0,0 +1,9 @@
+schema: expected attribute not encountered
+schema: unexpected attribute encountered
+schema: unexpected attribute encountered
+schema: unexpected attribute encountered
+schema: unexpected attribute encountered
+schema: unexpected attribute encountered
+schema: unexpected attribute encountered
+schema: unexpected attribute encountered
+schema: unexpected attribute encountered
diff --git a/tests/cxx/serializer/validation/attribute/test.xsd b/tests/cxx/serializer/validation/attribute/test.xsd
new file mode 100644
index 0000000..deb3f3b
--- /dev/null
+++ b/tests/cxx/serializer/validation/attribute/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="test-1">
+ <attribute name="x" type="int" use="required"/>
+ <anyAttribute namespace="##any" processContents="skip"/>
+ <anyAttribute namespace="##other" processContents="skip"/>
+ <anyAttribute namespace="##local" processContents="skip"/>
+ <anyAttribute namespace="##targetNamespace" processContents="skip"/>
+ <anyAttribute namespace="foo" processContents="skip"/>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test-1" type="t:test-1"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/validation/built-in/date-time/driver.cxx b/tests/cxx/serializer/validation/built-in/date-time/driver.cxx
new file mode 100644
index 0000000..bdc196e
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/date-time/driver.cxx
@@ -0,0 +1,398 @@
+// file : tests/cxx/serializer/validation/built-in/date-time/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 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 <xsde/cxx/serializer/validating/xml-schema-simpl.hxx>
+
+using namespace xsde::cxx;
+using namespace xsde::cxx::serializer;
+using namespace xsde::cxx::serializer::validating;
+
+int
+main ()
+{
+ using xsde::cxx::time; // Conflicts with system time.
+
+ // gday & time zone
+ //
+ {
+ gday_simpl s;
+ context c (0);
+ s.pre (gday (0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ gday_simpl s;
+ context c (0);
+ s.pre (gday (32));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ gday_simpl s;
+ context c (0);
+ s.pre (gday (15, 15, 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ gday_simpl s;
+ context c (0);
+ s.pre (gday (15, 12, 60));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ gday_simpl s;
+ context c (0);
+ s.pre (gday (15, -12, 30));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ gday_simpl s;
+ context c (0);
+ s.pre (gday (15, 12, -30));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ gday_simpl s;
+ context c (0);
+ s.pre (gday (15, 14, 1));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ // gmonth
+ //
+ {
+ gmonth_simpl s;
+ context c (0);
+ s.pre (gmonth (0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_value);
+ }
+
+ {
+ gmonth_simpl s;
+ context c (0);
+ s.pre (gmonth (13));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_value);
+ }
+
+ // gyear
+ //
+ {
+ gyear_simpl s;
+ context c (0);
+ s.pre (gyear (0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gyear_value);
+ }
+
+ // gmonth_day
+ //
+ {
+ gmonth_day_simpl s;
+ context c (0);
+ s.pre (gmonth_day (0, 15));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ gmonth_day_simpl s;
+ context c (0);
+ s.pre (gmonth_day (6, 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ gmonth_day_simpl s;
+ context c (0);
+ s.pre (gmonth_day (13, 15));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ gmonth_day_simpl s;
+ context c (0);
+ s.pre (gmonth_day (6, 32));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ // gyear_month
+ //
+ {
+ gyear_month_simpl s;
+ context c (0);
+ s.pre (gyear_month (0, 6));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ gyear_month_simpl s;
+ context c (0);
+ s.pre (gyear_month (2007, 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ gyear_month_simpl s;
+ context c (0);
+ s.pre (gyear_month (2007, 32));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ // date
+ //
+ {
+ date_simpl s;
+ context c (0);
+ s.pre (date (0, 6, 15));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ date_simpl s;
+ context c (0);
+ s.pre (date (2007, 0, 15));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ date_simpl s;
+ context c (0);
+ s.pre (date (2007, 13, 15));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ date_simpl s;
+ context c (0);
+ s.pre (date (2007, 6, 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ date_simpl s;
+ context c (0);
+ s.pre (date (2007, 6, 32));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ // time
+ //
+ {
+ time_simpl s;
+ context c (0);
+ s.pre (time (25, 30, 30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ time_simpl s;
+ context c (0);
+ s.pre (time (24, 1, 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ time_simpl s;
+ context c (0);
+ s.pre (time (24, 0, 0.1));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ time_simpl s;
+ context c (0);
+ s.pre (time (12, 60, 30));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ time_simpl s;
+ context c (0);
+ s.pre (time (12, 30, 60.1));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ time_simpl s;
+ context c (0);
+ s.pre (time (12, 30, -30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ // date_time
+ //
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (0, 6, 32, 12, 30, 30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 0, 32, 12, 30, 30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 13, 32, 12, 30, 30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 6, 0, 12, 30, 30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 6, 32, 12, 30, 30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 6, 15, 25, 30, 30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 6, 15, 24, 1, 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 6, 15, 24, 0, 0.1));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 6, 15, 12, 60, 30));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 6, 15, 12, 30, 60.1));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ date_time_simpl s;
+ context c (0);
+ s.pre (date_time (2007, 6, 15, 12, 30, -30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ // duration
+ //
+ {
+ duration_simpl s;
+ context c (0);
+ s.pre (duration (false, 2007, 6, 15, 12, 30, -30.0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+}
diff --git a/tests/cxx/serializer/validation/built-in/date-time/makefile b/tests/cxx/serializer/validation/built-in/date-time/makefile
new file mode 100644
index 0000000..aa45e21
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/date-time/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/serializer/validation/built-in/date-time/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver)
+ $(call message,test $$1,$$1,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep))
+
+
+# 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)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/built-in/decimal/driver.cxx b/tests/cxx/serializer/validation/built-in/decimal/driver.cxx
new file mode 100644
index 0000000..9349e6b
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/decimal/driver.cxx
@@ -0,0 +1,46 @@
+// file : tests/cxx/serializer/validation/built-in/decimal/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test the built-in decimal type validation.
+//
+#include <stdlib.h> // strtod
+#include <cassert>
+
+#include <xsde/cxx/serializer/validating/decimal.hxx>
+
+using namespace xsde::cxx;
+using namespace xsde::cxx::serializer;
+using namespace xsde::cxx::serializer::validating;
+
+int
+main ()
+{
+ {
+ decimal_simpl s;
+ context c (0);
+ s.pre (strtod ("NAN", 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_decimal_value);
+ }
+
+ {
+ decimal_simpl s;
+ context c (0);
+ s.pre (strtod ("INF", 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_decimal_value);
+ }
+
+ {
+ decimal_simpl s;
+ context c (0);
+ s.pre (strtod ("-INF", 0));
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_decimal_value);
+ }
+}
diff --git a/tests/cxx/serializer/validation/built-in/decimal/makefile b/tests/cxx/serializer/validation/built-in/decimal/makefile
new file mode 100644
index 0000000..e4517b6
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/decimal/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/serializer/validation/built-in/decimal/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver)
+ $(call message,test $$1,$$1,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep))
+
+
+# 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)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/built-in/integer/driver.cxx b/tests/cxx/serializer/validation/built-in/integer/driver.cxx
new file mode 100644
index 0000000..e20a561
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/integer/driver.cxx
@@ -0,0 +1,63 @@
+// file : tests/cxx/serializer/validation/built-in/int/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test the built-in integer & friends types validation.
+//
+
+#include <cassert>
+
+#include <xsde/cxx/serializer/validating/negative-integer.hxx>
+#include <xsde/cxx/serializer/validating/non-positive-integer.hxx>
+#include <xsde/cxx/serializer/validating/positive-integer.hxx>
+
+using namespace xsde::cxx::serializer;
+using namespace xsde::cxx::serializer::validating;
+using namespace std;
+
+int
+main ()
+{
+ // negative_integer
+ //
+ {
+ negative_integer_simpl s;
+ context c (0);
+ s.pre (0);
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error ());
+ }
+
+ {
+ negative_integer_simpl s;
+ context c (0);
+ s.pre (1);
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error ());
+ }
+
+ // non_positive_integer
+ //
+ {
+ non_positive_integer_simpl s;
+ context c (0);
+ s.pre (1);
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error ());
+ }
+
+ // positive_integer
+ //
+ {
+ positive_integer_simpl s;
+ context c (0);
+ s.pre (0);
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/serializer/validation/built-in/integer/makefile b/tests/cxx/serializer/validation/built-in/integer/makefile
new file mode 100644
index 0000000..37bd439
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/integer/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/serializer/validation/built-in/integer/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver)
+ $(call message,test $$1,$$1,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep))
+
+
+# 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)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/built-in/makefile b/tests/cxx/serializer/validation/built-in/makefile
new file mode 100644
index 0000000..7fdeec7
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/makefile
@@ -0,0 +1,20 @@
+# file : tests/cxx/serializer/validation/built-in/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+# license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make
+
+tests := date-time decimal integer qname string
+
+default := $(out_base)/
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+.PHONY: $(default) $(test) $(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/tests/cxx/serializer/validation/built-in/qname/driver.cxx b/tests/cxx/serializer/validation/built-in/qname/driver.cxx
new file mode 100644
index 0000000..33ccdc1
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/qname/driver.cxx
@@ -0,0 +1,70 @@
+// file : tests/cxx/serializer/validation/built-in/qname/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test the built-in QName type validation.
+//
+#include <cassert>
+
+#include <xsde/config.h>
+
+// Let the runtime header sort out which version (stl/no-stl) to
+// include.
+//
+#include <xsde/cxx/serializer/validating/xml-schema-simpl.hxx>
+
+using namespace xsde::cxx;
+using namespace xsde::cxx::serializer;
+using namespace xsde::cxx::serializer::validating;
+
+int
+main ()
+{
+ {
+ qname_simpl s;
+ context c (0);
+#ifdef XSDE_STL
+ s.pre (qname ("a b"));
+#else
+ qname qn;
+ qn.name_copy ("a b");
+ s.pre (&qn);
+#endif
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+
+ {
+ qname_simpl s;
+ context c (0);
+#ifdef XSDE_STL
+ s.pre (qname ("ab", "a b"));
+#else
+ qname qn;
+ qn.name_copy ("a b");
+ qn.prefix_copy ("ab");
+ s.pre (&qn);
+#endif
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+
+ {
+ qname_simpl s;
+ context c (0);
+#ifdef XSDE_STL
+ s.pre (qname ("a b", "ab"));
+#else
+ qname qn;
+ qn.name_copy ("ab");
+ qn.prefix_copy ("a b");
+ s.pre (&qn);
+#endif
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+}
diff --git a/tests/cxx/serializer/validation/built-in/qname/makefile b/tests/cxx/serializer/validation/built-in/qname/makefile
new file mode 100644
index 0000000..ec2d802
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/qname/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/serializer/validation/built-in/qname/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver)
+ $(call message,test $$1,$$1,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep))
+
+
+# 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)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/built-in/string/driver.cxx b/tests/cxx/serializer/validation/built-in/string/driver.cxx
new file mode 100644
index 0000000..c1cfe21
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/string/driver.cxx
@@ -0,0 +1,485 @@
+// file : tests/cxx/serializer/validation/built-in/string/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 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 <xsde/config.h>
+
+// Let the runtime header sort out which version (stl/no-stl) to
+// include.
+//
+#include <xsde/cxx/serializer/validating/xml-schema-simpl.hxx>
+
+using namespace xsde::cxx;
+using namespace xsde::cxx::serializer;
+using namespace xsde::cxx::serializer::validating;
+
+int
+main ()
+{
+ // normalized_string
+ //
+ {
+ normalized_string_simpl s;
+ context c (0);
+ s.pre ("aaa\nbbb");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_normalized_string_value);
+ }
+
+ {
+ normalized_string_simpl s;
+ context c (0);
+ s.pre ("aaa\tbbb");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_normalized_string_value);
+ }
+
+ {
+ normalized_string_simpl s;
+ context c (0);
+ s.pre ("aaa\rbbb");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_normalized_string_value);
+ }
+
+ // token
+ //
+ {
+ token_simpl s;
+ context c (0);
+ s.pre ("aaa\nbbb");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_token_value);
+ }
+
+ {
+ token_simpl s;
+ context c (0);
+ s.pre ("aaa\tbbb");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_token_value);
+ }
+
+ {
+ token_simpl s;
+ context c (0);
+ s.pre ("aaa\rbbb");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_token_value);
+ }
+
+ {
+ token_simpl s;
+ context c (0);
+ s.pre ("aaa bbb");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_token_value);
+ }
+
+ {
+ token_simpl s;
+ context c (0);
+ s.pre (" aaa bbb");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_token_value);
+ }
+
+ {
+ token_simpl s;
+ context c (0);
+ s.pre ("aaa bbb ");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_token_value);
+ }
+
+ // name
+ //
+ {
+ name_simpl s;
+ context c (0);
+ s.pre ("");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ {
+ name_simpl s;
+ context c (0);
+ s.pre (".a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ {
+ name_simpl s;
+ context c (0);
+ s.pre ("-a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ {
+ name_simpl s;
+ context c (0);
+ s.pre ("1a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ {
+ name_simpl s;
+ context c (0);
+ s.pre (" a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ {
+ name_simpl s;
+ context c (0);
+ s.pre ("a,b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ {
+ name_simpl s;
+ context c (0);
+ s.pre ("a b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ {
+ name_simpl s;
+ context c (0);
+ s.pre ("a<b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ {
+ name_simpl s;
+ context c (0);
+ s.pre ("a ");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_name_value);
+ }
+
+ // nmtoken
+ //
+ {
+ nmtoken_simpl s;
+ context c (0);
+ s.pre ("");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_nmtoken_value);
+ }
+
+ {
+ nmtoken_simpl s;
+ context c (0);
+ s.pre (" a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_nmtoken_value);
+ }
+
+ {
+ nmtoken_simpl s;
+ context c (0);
+ s.pre ("a,b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_nmtoken_value);
+ }
+
+ {
+ nmtoken_simpl s;
+ context c (0);
+ s.pre ("a b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_nmtoken_value);
+ }
+
+ {
+ nmtoken_simpl s;
+ context c (0);
+ s.pre ("a<b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_nmtoken_value);
+ }
+
+ {
+ nmtoken_simpl s;
+ context c (0);
+ s.pre ("a ");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_nmtoken_value);
+ }
+
+ // nmtokens
+ //
+ {
+ nmtokens_simpl s;
+ context c (0);
+ string_sequence seq;
+ s.pre (&seq);
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_nmtokens_value);
+ }
+
+ {
+ nmtokens_simpl s;
+ context c (0);
+ string_sequence seq;
+#ifdef XSDE_STL
+ seq.push_back ("a,b");
+ seq.push_back ("ab");
+#else
+ seq.push_back_copy ("a,b");
+ seq.push_back_copy ("ab");
+#endif
+ s.pre (&seq);
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_nmtoken_value);
+ }
+
+ // ncname
+ //
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre ("");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre (" a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre (".a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre ("-a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre (":a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre ("1a");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre ("a,b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre ("a b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre ("a:b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre ("a<b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ {
+ ncname_simpl s;
+ context c (0);
+ s.pre ("a ");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_ncname_value);
+ }
+
+ // id
+ //
+ {
+ id_simpl s;
+ context c (0);
+ s.pre ("a b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_id_value);
+ }
+
+ // idref
+ //
+ {
+ idref_simpl s;
+ context c (0);
+ s.pre ("a b");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_idref_value);
+ }
+
+ // idrefs
+ //
+ {
+ idrefs_simpl s;
+ context c (0);
+ string_sequence seq;
+ s.pre (&seq);
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_idrefs_value);
+ }
+
+ {
+ idrefs_simpl s;
+ context c (0);
+ string_sequence seq;
+#ifdef XSDE_STL
+ seq.push_back ("a,b");
+ seq.push_back ("ab");
+#else
+ seq.push_back_copy ("a,b");
+ seq.push_back_copy ("ab");
+#endif
+ s.pre (&seq);
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_idref_value);
+ }
+
+ // language
+ //
+ {
+ language_simpl s;
+ context c (0);
+ s.pre ("");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ language_simpl s;
+ context c (0);
+ s.pre (" ");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ language_simpl s;
+ context c (0);
+ s.pre ("en-");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ language_simpl s;
+ context c (0);
+ s.pre ("a1");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ language_simpl s;
+ context c (0);
+ s.pre ("en+us");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ language_simpl s;
+ context c (0);
+ s.pre ("en-nine99999");
+ s._pre_impl (c);
+ s._serialize_content ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+}
diff --git a/tests/cxx/serializer/validation/built-in/string/makefile b/tests/cxx/serializer/validation/built-in/string/makefile
new file mode 100644
index 0000000..42a7d81
--- /dev/null
+++ b/tests/cxx/serializer/validation/built-in/string/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/serializer/validation/built-in/string/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver)
+ $(call message,test $$1,$$1,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep))
+
+
+# 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)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/choice/driver.cxx b/tests/cxx/serializer/validation/choice/driver.cxx
new file mode 100644
index 0000000..11e1aaa
--- /dev/null
+++ b/tests/cxx/serializer/validation/choice/driver.cxx
@@ -0,0 +1,114 @@
+// file : tests/cxx/serializer/validation/choice/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test choice validation.
+//
+
+#include <sstream>
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: virtual test_1_sskel
+{
+ test_1_simpl (int state)
+ : state_ (state)
+ {
+ }
+
+ virtual bool
+ choice_next ()
+ {
+ return true;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return static_cast<choice_arm_tag> (state_);
+ }
+
+ //
+ //
+ virtual bool
+ choice1_next ()
+ {
+ return false;
+ }
+
+ virtual choice1_arm_tag
+ choice1_arm ()
+ {
+ return a_tag;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+private:
+ int state_;
+};
+
+struct root_simpl: root_sskel
+{
+};
+
+int
+main ()
+{
+ for (int i = 0; i < 2; ++i)
+ {
+#ifdef XSDE_EXCEPTIONS
+ try
+ {
+#endif
+ test_1_simpl test_1_s (i);
+ root_simpl root_s;
+
+ root_s.serializers (test_1_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+
+ ostringstream os;
+ doc_s.serialize (os);
+
+#ifndef XSDE_EXCEPTIONS
+ if (xml_schema::serializer_error e = doc_s._error ())
+ {
+ if (e.type () == xml_schema::serializer_error::schema)
+ {
+ cout << "schema: " << e.schema_text () << endl;
+ continue;
+ }
+ }
+#endif
+
+ root_s.post ();
+#ifdef XSDE_EXCEPTIONS
+ }
+ catch (xml_schema::serializer_schema const& e)
+ {
+ cout << "schema: " << e.text () << endl;
+ continue;
+ }
+#endif
+
+ cout << "no error" << endl;
+ }
+}
diff --git a/tests/cxx/serializer/validation/choice/makefile b/tests/cxx/serializer/validation/choice/makefile
new file mode 100644
index 0000000..79d45eb
--- /dev/null
+++ b/tests/cxx/serializer/validation/choice/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/validation/choice/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/choice/output b/tests/cxx/serializer/validation/choice/output
new file mode 100644
index 0000000..7ec90f4
--- /dev/null
+++ b/tests/cxx/serializer/validation/choice/output
@@ -0,0 +1,2 @@
+schema: expected element not encountered
+schema: unexpected element encountered
diff --git a/tests/cxx/serializer/validation/choice/test.xsd b/tests/cxx/serializer/validation/choice/test.xsd
new file mode 100644
index 0000000..b87d638
--- /dev/null
+++ b/tests/cxx/serializer/validation/choice/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="test-1">
+ <choice maxOccurs="5">
+ <choice maxOccurs="unbounded"> <!-- 1..unbounded-->
+ <element name="a" type="int"/>
+ <element name="b" type="int"/>
+ </choice>
+ </choice>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test-1" type="t:test-1"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/validation/element/driver.cxx b/tests/cxx/serializer/validation/element/driver.cxx
new file mode 100644
index 0000000..b0ff7ed
--- /dev/null
+++ b/tests/cxx/serializer/validation/element/driver.cxx
@@ -0,0 +1,106 @@
+// file : tests/cxx/serializer/validation/element/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test element validation.
+//
+
+#include <sstream>
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: virtual test_1_sskel
+{
+ test_1_simpl (int state)
+ : state_ (state)
+ {
+ }
+
+ virtual bool
+ a_next ()
+ {
+ if (state_ == 0)
+ {
+ state_++;
+ return true;
+ }
+
+ return false;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual bool
+ b_next ()
+ {
+ return false;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+private:
+ int state_;
+};
+
+struct root_simpl: root_sskel
+{
+};
+
+int
+main ()
+{
+ for (int i = 0; i < 2; ++i)
+ {
+#ifdef XSDE_EXCEPTIONS
+ try
+ {
+#endif
+ test_1_simpl test_1_s (i);
+ root_simpl root_s;
+
+ root_s.serializers (test_1_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+
+ ostringstream os;
+ doc_s.serialize (os);
+
+#ifndef XSDE_EXCEPTIONS
+ if (xml_schema::serializer_error e = doc_s._error ())
+ {
+ if (e.type () == xml_schema::serializer_error::schema)
+ {
+ cout << "schema: " << e.schema_text () << endl;
+ continue;
+ }
+ }
+#endif
+
+ root_s.post ();
+#ifdef XSDE_EXCEPTIONS
+ }
+ catch (xml_schema::serializer_schema const& e)
+ {
+ cout << "schema: " << e.text () << endl;
+ continue;
+ }
+#endif
+
+ cout << "no error" << endl;
+ }
+}
diff --git a/tests/cxx/serializer/validation/element/makefile b/tests/cxx/serializer/validation/element/makefile
new file mode 100644
index 0000000..ef916ed
--- /dev/null
+++ b/tests/cxx/serializer/validation/element/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/validation/element/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/element/output b/tests/cxx/serializer/validation/element/output
new file mode 100644
index 0000000..e8e09d0
--- /dev/null
+++ b/tests/cxx/serializer/validation/element/output
@@ -0,0 +1,2 @@
+schema: expected element not encountered
+schema: expected element not encountered
diff --git a/tests/cxx/serializer/validation/element/test.xsd b/tests/cxx/serializer/validation/element/test.xsd
new file mode 100644
index 0000000..7f20008
--- /dev/null
+++ b/tests/cxx/serializer/validation/element/test.xsd
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="test-1">
+ <sequence>
+ <element name="a" type="int" minOccurs="0" maxOccurs="5"/>
+ <element name="b" type="int" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test-1" type="t:test-1"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/validation/makefile b/tests/cxx/serializer/validation/makefile
new file mode 100644
index 0000000..1304574
--- /dev/null
+++ b/tests/cxx/serializer/validation/makefile
@@ -0,0 +1,24 @@
+# file : tests/cxx/serializer/validation/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+# license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make
+
+tests := built-in
+
+ifeq ($(xsde_iostream),y)
+tests += any attribute choice element sequence
+endif
+
+default := $(out_base)/
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+.PHONY: $(default) $(test) $(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/tests/cxx/serializer/validation/sequence/driver.cxx b/tests/cxx/serializer/validation/sequence/driver.cxx
new file mode 100644
index 0000000..562874c
--- /dev/null
+++ b/tests/cxx/serializer/validation/sequence/driver.cxx
@@ -0,0 +1,102 @@
+// file : tests/cxx/serializer/validation/sequence/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test sequence validation.
+//
+
+#include <sstream>
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct test_1_simpl: virtual test_1_sskel
+{
+ test_1_simpl (int state)
+ : state_ (state)
+ {
+ }
+
+ virtual bool
+ sequence_next ()
+ {
+ return true;
+ }
+
+ //
+ //
+ virtual bool
+ sequence1_next ()
+ {
+ return false;
+ }
+
+ virtual int
+ a ()
+ {
+ return 123;
+ }
+
+ virtual int
+ b ()
+ {
+ return 234;
+ }
+
+private:
+ int state_;
+};
+
+struct root_simpl: root_sskel
+{
+};
+
+int
+main ()
+{
+ for (int i = 0; i < 1; ++i)
+ {
+#ifdef XSDE_EXCEPTIONS
+ try
+ {
+#endif
+ test_1_simpl test_1_s (i);
+ root_simpl root_s;
+
+ root_s.serializers (test_1_s);
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+
+ ostringstream os;
+ doc_s.serialize (os);
+
+#ifndef XSDE_EXCEPTIONS
+ if (xml_schema::serializer_error e = doc_s._error ())
+ {
+ if (e.type () == xml_schema::serializer_error::schema)
+ {
+ cout << "schema: " << e.schema_text () << endl;
+ continue;
+ }
+ }
+#endif
+
+ root_s.post ();
+#ifdef XSDE_EXCEPTIONS
+ }
+ catch (xml_schema::serializer_schema const& e)
+ {
+ cout << "schema: " << e.text () << endl;
+ continue;
+ }
+#endif
+
+ cout << "no error" << endl;
+ }
+}
diff --git a/tests/cxx/serializer/validation/sequence/makefile b/tests/cxx/serializer/validation/sequence/makefile
new file mode 100644
index 0000000..e16d8bf
--- /dev/null
+++ b/tests/cxx/serializer/validation/sequence/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/validation/sequence/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/validation/sequence/output b/tests/cxx/serializer/validation/sequence/output
new file mode 100644
index 0000000..3333a0c
--- /dev/null
+++ b/tests/cxx/serializer/validation/sequence/output
@@ -0,0 +1 @@
+schema: expected element not encountered
diff --git a/tests/cxx/serializer/validation/sequence/test.xsd b/tests/cxx/serializer/validation/sequence/test.xsd
new file mode 100644
index 0000000..d7b2517
--- /dev/null
+++ b/tests/cxx/serializer/validation/sequence/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="test-1">
+ <sequence maxOccurs="5">
+ <sequence maxOccurs="unbounded"> <!-- 1..unbounded-->
+ <element name="a" type="int"/>
+ <element name="b" type="int"/>
+ </sequence>
+ </sequence>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <element name="test-1" type="t:test-1"/>
+ </sequence>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>
diff --git a/tests/cxx/serializer/wildcard/driver.cxx b/tests/cxx/serializer/wildcard/driver.cxx
new file mode 100644
index 0000000..195c6a0
--- /dev/null
+++ b/tests/cxx/serializer/wildcard/driver.cxx
@@ -0,0 +1,237 @@
+// file : tests/cxx/serializer/wildcard/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2006-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+// Test wildcard (any & anyAttribute) serialization.
+//
+
+#include <string.h> // strcpy
+#include <iostream>
+
+#include "test-sskel.hxx"
+
+using namespace std;
+using namespace test;
+
+struct content_simpl: virtual content_sskel
+{
+ virtual int
+ x ()
+ {
+ return 123;
+ }
+
+ virtual int
+ a ()
+ {
+ return 321;
+ }
+};
+
+struct root_simpl: virtual root_sskel
+{
+ virtual void
+ pre ()
+ {
+ aa1_ = 0;
+ aa2_ = 0;
+ choice_ = 0;
+ ae1_ = 0;
+ }
+
+ // anyAttribute
+ //
+ virtual bool
+ any_attribute_next ()
+ {
+ return aa2_++ < 1;
+ }
+
+#ifdef XSDE_STL
+ virtual void
+ any_attribute (std::string& ns, std::string& name)
+ {
+ ns = "foo";
+ name = "x";
+ }
+#else
+ virtual void
+ any_attribute (const char*& ns, const char*& name, bool& free)
+ {
+ char* ns_ = new char[4];
+ char* name_ = new char[2];
+
+ strcpy (ns_, "foo");
+ strcpy (name_, "x");
+
+ ns = ns_;
+ name = name_;
+ free = true;
+ }
+#endif
+
+ virtual void
+ serialize_any_attribute ()
+ {
+ _characters ("foo#x");
+ }
+
+ virtual bool
+ any_attribute1_next ()
+ {
+ return aa1_++ < 1;
+ }
+
+#ifdef XSDE_STL
+ virtual void
+ any_attribute1 (std::string& ns, std::string& name)
+ {
+ ns = "";
+ name = "x";
+ }
+#else
+ virtual void
+ any_attribute1 (const char*& ns, const char*& name, bool& free)
+ {
+ ns = "";
+ name = "x";
+ free = false;
+ }
+#endif
+
+ virtual void
+ serialize_any_attribute1 ()
+ {
+ _characters ("##local#x");
+ }
+
+ // any
+ //
+#ifdef XSDE_STL
+ virtual void
+ any (std::string& ns, std::string& name)
+ {
+ ns = "";
+ name = "a";
+ }
+#else
+ virtual void
+ any (const char*& ns, const char*& name, bool& free)
+ {
+ ns = "";
+ name = "a";
+ free = false;
+ }
+#endif
+
+
+ virtual void
+ serialize_any ()
+ {
+ xml_schema::int_simpl int_s;
+ content_simpl content_s;
+
+ content_s.serializers (int_s, int_s);
+
+ content_s.pre ();
+ content_s._pre_impl (_context ());
+ content_s._serialize_attributes ();
+ content_s._serialize_content ();
+ content_s._post_impl ();
+ content_s.post ();
+ }
+
+ virtual bool
+ choice_next ()
+ {
+ return choice_ < 2;
+ }
+
+ virtual choice_arm_tag
+ choice_arm ()
+ {
+ return static_cast<choice_arm_tag> (choice_++);
+ }
+
+ virtual bool
+ any1_next ()
+ {
+ return ae1_ < 3;
+ }
+
+#ifdef XSDE_STL
+ virtual void
+ any1 (::std::string& ns, ::std::string& name)
+ {
+ ns = "foo";
+ name = "a";
+ }
+#else
+ virtual void
+ any1 (const char*& ns, const char*& name, bool& free)
+ {
+ ns = "foo";
+ name = "a";
+ free = false;
+ }
+#endif
+
+ virtual void
+ serialize_any1 ()
+ {
+ xml_schema::int_simpl s;
+
+ s.pre (ae1_++);
+ s._pre_impl (_context ());
+ s._serialize_content ();
+ s._post_impl ();
+ s.post ();
+ }
+
+ virtual bool
+ any2_present ()
+ {
+ return true;
+ }
+
+#ifdef XSDE_STL
+ virtual void
+ any2 (std::string& ns, std::string& name)
+ {
+ ns = "bar";
+ name = "b";
+ }
+#else
+ virtual void
+ any2 (const char*& ns, const char*& name, bool& free)
+ {
+ ns = "bar";
+ name = "b";
+ free = false;
+ }
+#endif
+
+ virtual void
+ serialize_any2 ()
+ {
+ _characters ("bar#b");
+ }
+
+private:
+ int aa1_, aa2_;
+ int choice_;
+ int ae1_;
+};
+
+int
+main ()
+{
+ root_simpl root_s;
+
+ xml_schema::document_simpl doc_s (root_s, "test", "root");
+
+ root_s.pre ();
+ doc_s.serialize (cout);
+ root_s.post ();
+}
diff --git a/tests/cxx/serializer/wildcard/makefile b/tests/cxx/serializer/wildcard/makefile
new file mode 100644
index 0000000..44db0ef
--- /dev/null
+++ b/tests/cxx/serializer/wildcard/makefile
@@ -0,0 +1,72 @@
+# file : tests/cxx/serializer/wildcard/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2006-2009 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=-sskel.o))
+dep := $(obj:.o=.o.d)
+
+xsde.l := $(out_root)/libxsde/xsde/xsde.l
+xsde.l.cpp-options := $(out_root)/libxsde/xsde/xsde.l.cpp-options
+
+driver := $(out_base)/driver
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(driver): $(obj) $(xsde.l)
+
+$(obj) $(dep): $(xsde.l.cpp-options)
+
+skel := $(out_base)/$(xsd:.xsd=-sskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-sskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-sskel.cxx)
+
+$(skel): xsde := $(out_root)/xsde/xsde
+$(skel): $(out_root)/xsde/xsde
+
+$(call include-dep,$(dep))
+
+# Convenience alias for default target.
+#
+.PHONY: $(out_base)/
+$(out_base)/: $(driver)
+
+
+# Test.
+#
+.PHONY: $(test)
+
+$(test): driver := $(driver)
+$(test): $(driver) $(src_base)/output
+ $(call message,test $$1,$$1 | diff -u $(src_base)/output -,$(driver))
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-sskel.cxx.xsd.clean))
+
+
+# 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)/xsde/serializer/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/serializer/wildcard/output b/tests/cxx/serializer/wildcard/output
new file mode 100644
index 0000000..a55bc57
--- /dev/null
+++ b/tests/cxx/serializer/wildcard/output
@@ -0,0 +1 @@
+<g1:root xmlns:g1="test" xmlns:g2="foo" x="##local#x" g2:x="foo#x"><a x="123"><a>321</a></a><g2:a>0</g2:a><g2:a>1</g2:a><g2:a>2</g2:a><g3:b xmlns:g3="bar">bar#b</g3:b></g1:root> \ No newline at end of file
diff --git a/tests/cxx/serializer/wildcard/test.xsd b/tests/cxx/serializer/wildcard/test.xsd
new file mode 100644
index 0000000..074679f
--- /dev/null
+++ b/tests/cxx/serializer/wildcard/test.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="content">
+ <sequence>
+ <element name="a" type="int"/>
+ </sequence>
+ <attribute name="x" type="int" use="required"/>
+ </complexType>
+
+ <complexType name="root">
+ <sequence>
+ <any namespace="##local" processContents="skip"/>
+ <choice maxOccurs="unbounded">
+ <any namespace="foo" processContents="skip" maxOccurs="unbounded"/>
+ <any namespace="bar" processContents="skip" minOccurs="0"/>
+ </choice>
+ </sequence>
+ <anyAttribute namespace="foo" processContents="skip"/>
+ <anyAttribute namespace="##local" processContents="skip"/>
+ </complexType>
+
+ <element name="root" type="t:root"/>
+
+</schema>