aboutsummaryrefslogtreecommitdiff
path: root/tests/cxx/parser/validation/built-in
diff options
context:
space:
mode:
Diffstat (limited to 'tests/cxx/parser/validation/built-in')
-rw-r--r--tests/cxx/parser/validation/built-in/any-type/driver.cxx187
-rw-r--r--tests/cxx/parser/validation/built-in/any-type/makefile82
-rw-r--r--tests/cxx/parser/validation/built-in/any-type/test-000.std113
-rw-r--r--tests/cxx/parser/validation/built-in/any-type/test-000.xml41
-rw-r--r--tests/cxx/parser/validation/built-in/any-type/test.xsd31
-rw-r--r--tests/cxx/parser/validation/built-in/binary/driver.cxx176
-rw-r--r--tests/cxx/parser/validation/built-in/binary/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/boolean/driver.cxx150
-rw-r--r--tests/cxx/parser/validation/built-in/boolean/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/byte/driver.cxx280
-rw-r--r--tests/cxx/parser/validation/built-in/byte/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/date-time/driver.cxx1833
-rw-r--r--tests/cxx/parser/validation/built-in/date-time/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/float/driver.cxx309
-rw-r--r--tests/cxx/parser/validation/built-in/float/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/int/driver.cxx116
-rw-r--r--tests/cxx/parser/validation/built-in/int/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/integer/driver.cxx317
-rw-r--r--tests/cxx/parser/validation/built-in/integer/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/long-long/driver.cxx118
-rw-r--r--tests/cxx/parser/validation/built-in/long-long/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/long/driver.cxx106
-rw-r--r--tests/cxx/parser/validation/built-in/long/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/makefile35
-rw-r--r--tests/cxx/parser/validation/built-in/qname/driver.cxx132
-rw-r--r--tests/cxx/parser/validation/built-in/qname/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/short/driver.cxx116
-rw-r--r--tests/cxx/parser/validation/built-in/short/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/string/driver.cxx613
-rw-r--r--tests/cxx/parser/validation/built-in/string/makefile61
-rw-r--r--tests/cxx/parser/validation/built-in/uri/driver.cxx66
-rw-r--r--tests/cxx/parser/validation/built-in/uri/makefile61
32 files changed, 5614 insertions, 0 deletions
diff --git a/tests/cxx/parser/validation/built-in/any-type/driver.cxx b/tests/cxx/parser/validation/built-in/any-type/driver.cxx
new file mode 100644
index 0000000..6aadd78
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/any-type/driver.cxx
@@ -0,0 +1,187 @@
+// file : tests/cxx/parser/validation/built-in/any-type/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 anyType and anySimpleType validation.
+//
+
+#include <string>
+#include <iostream>
+
+#include "test-pskel.hxx"
+
+using namespace std;
+using namespace test;
+using xml_schema::ro_string;
+
+struct any_type_pimpl: xml_schema::any_type_pimpl
+{
+ virtual void
+ pre ()
+ {
+ cout << "{" << endl;
+ }
+
+ virtual void
+#ifndef XSDE_POLYMORPHIC
+ _start_any_element (ro_string const&, ro_string const& n)
+#else
+ _start_any_element (ro_string const&, ro_string const& n, const char*)
+#endif
+ {
+ cout << " start any element '" << n << "'" << endl;
+ }
+
+ virtual void
+ _end_any_element (ro_string const&, ro_string const& n)
+ {
+ cout << " end any element '" << n << "'" << endl;
+ }
+
+ virtual void
+ _any_attribute (ro_string const&,
+ ro_string const& n,
+ ro_string const& v)
+ {
+ cout << " any attribute " << n << " = '" << v << "'" << endl;
+ }
+
+ virtual void
+ _any_characters (ro_string const& s)
+ {
+ cout << " any text: '" << s << "'" << endl;
+ }
+
+ virtual void
+ post_any_type ()
+ {
+ cout << "}" << endl
+ << endl;
+ }
+};
+
+struct any_simple_type_pimpl: xml_schema::any_simple_type_pimpl
+{
+ virtual void
+ pre ()
+ {
+ cout << "{" << endl;
+ }
+
+ virtual void
+ _any_characters (ro_string const& s)
+ {
+ cout << " any text: '" << s << "'" << endl;
+ }
+
+ virtual void
+ post_any_simple_type ()
+ {
+ cout << "}" << endl
+ << endl;
+ }
+};
+
+struct any_extension_pimpl: any_extension_pskel
+{
+ any_extension_pimpl ()
+ : any_extension_pskel (&base_impl_)
+ {
+ }
+
+#ifdef XSDE_STL
+ virtual void
+ x (const string& v)
+ {
+ cout << " x = " << v << endl;
+ }
+#else
+ virtual void
+ x (char* v)
+ {
+ cout << " x = " << v << endl;
+ delete[] v;
+ }
+#endif
+
+private:
+ any_type_pimpl base_impl_;
+};
+
+struct any_simple_extension_pimpl: any_simple_extension_pskel
+{
+ any_simple_extension_pimpl ()
+ : any_simple_extension_pskel (&base_impl_)
+ {
+ }
+
+#ifdef XSDE_STL
+ virtual void
+ x (const string& v)
+ {
+ cout << " x = " << v << endl;
+ }
+#else
+ virtual void
+ x (char* v)
+ {
+ cout << " x = " << v << endl;
+ delete[] v;
+ }
+#endif
+
+private:
+ any_simple_type_pimpl base_impl_;
+};
+
+struct type_pimpl: type_pskel
+{
+};
+
+int
+main (int argc, char* argv[])
+{
+ if (argc != 2)
+ {
+ cerr << "usage: " << argv[0] << " test.xml" << endl;
+ return 1;
+ }
+
+ try
+ {
+ xml_schema::string_pimpl string_p;
+
+ any_type_pimpl any_type_p;
+ any_simple_type_pimpl any_simple_type_p;
+
+ any_extension_pimpl any_extension_p;
+ any_simple_extension_pimpl any_simple_extension_p;
+
+ type_pimpl type_p;
+
+ any_extension_p.parsers (string_p);
+ any_simple_extension_p.parsers (string_p);
+
+ type_p.parsers (any_simple_type_p,
+ any_type_p,
+ any_extension_p,
+ any_simple_extension_p);
+
+ xml_schema::document_pimpl doc_p (type_p, "test", "root");
+
+ type_p.pre ();
+ doc_p.parse (argv[1]);
+ type_p.post_type ();
+ }
+ catch (xml_schema::parser_exception const& e)
+ {
+ cerr << e << endl;
+ return 1;
+ }
+ catch (ios_base::failure const&)
+ {
+ cerr << "io failure" << endl;
+ return 1;
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/any-type/makefile b/tests/cxx/parser/validation/built-in/any-type/makefile
new file mode 100644
index 0000000..951454e
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/any-type/makefile
@@ -0,0 +1,82 @@
+# file : tests/cxx/parser/validation/built-in/any-type/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
+
+tests := 000
+
+obj := $(addprefix $(out_base)/,$(cxx:.cxx=.o) $(xsd:.xsd=-pskel.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=-pskel.hxx) \
+ $(out_base)/$(xsd:.xsd=-pskel.ixx) \
+ $(out_base)/$(xsd:.xsd=-pskel.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.
+#
+test_targets := $(addprefix $(out_base)/.test-,$(tests))
+
+.PHONY: $(test)
+$(test): $(test_targets)
+
+
+$(test_targets): driver := $(driver)
+
+.PHONY: $(out_base)/.test-%
+$(out_base)/.test-%: $(driver) $(src_base)/test.xsd $(src_base)/test-%.xml $(src_base)/test-%.std
+ $(call message,test $(out_base)/$*,$(driver) $(src_base)/test-$*.xml | diff -u $(src_base)/test-$*.std -)
+
+
+# Clean.
+#
+.PHONY: $(clean)
+
+$(clean): $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(obj)) \
+ $(addsuffix .cxx.clean,$(dep)) \
+ $(addprefix $(out_base)/,$(xsd:.xsd=-pskel.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/parser/xsd-cxx.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/xsde/makefile)
+$(call import,$(src_root)/libxsde/xsde/makefile)
diff --git a/tests/cxx/parser/validation/built-in/any-type/test-000.std b/tests/cxx/parser/validation/built-in/any-type/test-000.std
new file mode 100644
index 0000000..9e263c0
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/any-type/test-000.std
@@ -0,0 +1,113 @@
+{
+ any text: '123abc'
+}
+
+{
+ any text: '
+'
+ any text: ' '
+ start any element 'any'
+ end any element 'any'
+ any text: '
+'
+ any text: ' '
+}
+
+{
+ any text: '
+'
+ any text: ' '
+ start any element 'any'
+ any attribute x = 'xxx'
+ any text: 'aaa'
+ start any element 'a'
+ any text: 'bbb'
+ end any element 'a'
+ any text: 'ccc'
+ end any element 'any'
+ any text: '
+'
+ any text: ' '
+}
+
+{
+ any attribute x = 'x'
+ any text: '
+'
+ any text: ' '
+ start any element 'a'
+ any text: 'a'
+ end any element 'a'
+ any text: '
+'
+ any text: ' '
+ start any element 'any'
+ any attribute x = 'xxx'
+ any text: 'aaa'
+ start any element 'a'
+ any text: 'bbb'
+ end any element 'a'
+ any text: 'ccc'
+ end any element 'any'
+ any text: '
+'
+ any text: ' '
+}
+
+{
+ any text: '
+'
+ any text: ' '
+ start any element 'any'
+ end any element 'any'
+ any text: '
+'
+ any text: ' '
+}
+
+{
+ any text: '
+'
+ any text: ' '
+ start any element 'any'
+ any attribute x = 'xxx'
+ any text: 'aaa'
+ start any element 'a'
+ any text: 'bbb'
+ end any element 'a'
+ any text: 'ccc'
+ end any element 'any'
+ any text: '
+'
+ any text: ' '
+}
+
+{
+ x = x
+ any text: '
+'
+ any text: ' '
+ start any element 'a'
+ any text: 'a'
+ end any element 'a'
+ any text: '
+'
+ any text: ' '
+ start any element 'any'
+ any attribute x = 'xxx'
+ any text: 'aaa'
+ start any element 'a'
+ any text: 'bbb'
+ end any element 'a'
+ any text: 'ccc'
+ end any element 'any'
+ any text: '
+'
+ any text: ' '
+}
+
+{
+ x = x
+ any text: 'abc123'
+}
+
diff --git a/tests/cxx/parser/validation/built-in/any-type/test-000.xml b/tests/cxx/parser/validation/built-in/any-type/test-000.xml
new file mode 100644
index 0000000..7875b7e
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/any-type/test-000.xml
@@ -0,0 +1,41 @@
+<t:root xmlns:t="test"
+ xmlns:o="other"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="test test.xsd"
+ as="123abc">
+
+ <!-- test dispatching of anyType nested elements and attributes -->
+
+ <a>
+ <o:any/>
+ </a>
+
+ <a>
+ <o:any x="xxx">aaa<a>bbb</a>ccc</o:any>
+ </a>
+
+ <a x="x">
+ <a>a</a>
+ <o:any x="xxx">aaa<a>bbb</a>ccc</o:any>
+ </a>
+
+ <!-- anyType extension -->
+
+ <a-extension>
+ <o:any/>
+ </a-extension>
+
+ <a-extension>
+ <o:any x="xxx">aaa<a>bbb</a>ccc</o:any>
+ </a-extension>
+
+ <a-extension x="x">
+ <a>a</a>
+ <o:any x="xxx">aaa<a>bbb</a>ccc</o:any>
+ </a-extension>
+
+ <!-- anySimpleType extension -->
+
+ <as-extension x="x">abc123</as-extension>
+
+</t:root>
diff --git a/tests/cxx/parser/validation/built-in/any-type/test.xsd b/tests/cxx/parser/validation/built-in/any-type/test.xsd
new file mode 100644
index 0000000..86a4e13
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/any-type/test.xsd
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:t="test" targetNamespace="test">
+
+ <complexType name="any-extension">
+ <complexContent mixed="true">
+ <extension base="anyType">
+ <attribute name="x" type="string"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="any-simple-extension">
+ <simpleContent>
+ <extension base="anySimpleType">
+ <attribute name="x" type="string"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="type">
+ <choice maxOccurs="unbounded">
+ <element name="a" type="anyType"/>
+ <element name="a-extension" type="t:any-extension"/>
+ <element name="as-extension" type="t:any-simple-extension"/>
+ </choice>
+ <attribute name="as" type="anySimpleType"/>
+ </complexType>
+
+ <element name="root" type="t:type"/>
+
+</schema>
diff --git a/tests/cxx/parser/validation/built-in/binary/driver.cxx b/tests/cxx/parser/validation/built-in/binary/driver.cxx
new file mode 100644
index 0000000..23dbf45
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/binary/driver.cxx
@@ -0,0 +1,176 @@
+// file : tests/cxx/parser/validation/built-in/binary/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 base64Binary and hexBinary types validation.
+//
+#include <cassert>
+#include <string.h> // memcpy
+
+#include <xsde/cxx/parser/validating/base64-binary.hxx>
+#include <xsde/cxx/parser/validating/hex-binary.hxx>
+
+using namespace xsde::cxx;
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+bool
+compare (buffer* x, const char* p, size_t n)
+{
+ buffer b;
+ b.size (n);
+ memcpy (b.data (), p, n);
+
+ bool r = *x == b;
+ delete x;
+ return r;
+}
+
+int
+main ()
+{
+ // Good.
+ //
+
+ // hexBinary
+ //
+ {
+ context c (0);
+ hex_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ compare (p.post_hex_binary (), "", 0));
+ }
+
+ {
+ context c (0);
+ hex_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n313");
+ p._characters ("23334356162636a6b ");
+ p._post ();
+ assert (!c.error_type () &&
+ compare (p.post_hex_binary (), "12345abcjk", 10));
+ }
+
+ // base64Binary
+ //
+ {
+ context c (0);
+ base64_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("MTIzND ");
+ p._characters ("VhYmNqaw = = ");
+ p._post ();
+ assert (!c.error_type () &&
+ compare (p.post_base64_binary (), "12345abcjk", 10));
+ }
+
+ {
+ context c (0);
+ base64_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("YQ==");
+ p._post ();
+ assert (!c.error_type () &&
+ compare (p.post_base64_binary (), "a", 1));
+ }
+
+ {
+ context c (0);
+ base64_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("YWI=");
+ p._post ();
+ assert (!c.error_type () &&
+ compare (p.post_base64_binary (), "ab", 2));
+ }
+
+ {
+ context c (0);
+ base64_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("YWJj");
+ p._post ();
+ assert (!c.error_type () &&
+ compare (p.post_base64_binary (), "abc", 3));
+ }
+
+ // Bad
+ //
+
+ // hexBinary
+ //
+ {
+ context c (0);
+ hex_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("313");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_hex_binary_value);
+ }
+
+ {
+ context c (0);
+ hex_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("313233343X6162636a6b");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_hex_binary_value);
+ }
+
+ // base64Binary
+ //
+ {
+ context c (0);
+ base64_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_base64_binary_value);
+ }
+
+ {
+ context c (0);
+ base64_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("YQ");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_base64_binary_value);
+ }
+
+ {
+ context c (0);
+ base64_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("==");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_base64_binary_value);
+ }
+
+ {
+ context c (0);
+ base64_binary_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("MTIzNDVhYmNqaw=A");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_base64_binary_value);
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/binary/makefile b/tests/cxx/parser/validation/built-in/binary/makefile
new file mode 100644
index 0000000..5a07676
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/binary/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/binary/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/parser/validation/built-in/boolean/driver.cxx b/tests/cxx/parser/validation/built-in/boolean/driver.cxx
new file mode 100644
index 0000000..7f08ed6
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/boolean/driver.cxx
@@ -0,0 +1,150 @@
+// file : tests/cxx/parser/validation/built-in/boolean/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 boolean type validation.
+//
+#include <cassert>
+
+#include <xsde/cxx/parser/validating/boolean.hxx>
+
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ // Good.
+ //
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("true");
+ p._post ();
+ assert (!c.error_type () && p.post_boolean ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1");
+ p._post ();
+ assert (!c.error_type () && p.post_boolean ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("false");
+ p._post ();
+ assert (!c.error_type () && !p.post_boolean ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && !p.post_boolean ());
+ }
+
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" true ");
+ p._post ();
+ assert (!c.error_type () && p.post_boolean ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" ");
+ p._characters (" \n ");
+ p._characters (" fa");
+ p._characters ("l");
+ p._characters ("se ");
+ p._characters (" \n ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () && !p.post_boolean ());
+ }
+
+ // Bad
+ //
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ //p._characters ("");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" ");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" ");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("fal");
+ p._characters ("s ");
+ p._characters ("e");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ boolean_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("01");
+ p._post ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/boolean/makefile b/tests/cxx/parser/validation/built-in/boolean/makefile
new file mode 100644
index 0000000..b844e00
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/boolean/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/boolean/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/parser/validation/built-in/byte/driver.cxx b/tests/cxx/parser/validation/built-in/byte/driver.cxx
new file mode 100644
index 0000000..26f5a12
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/byte/driver.cxx
@@ -0,0 +1,280 @@
+// file : tests/cxx/parser/validation/built-in/byte/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 byte and unsigned byte types validation.
+//
+#include <cassert>
+
+#include <xsde/cxx/parser/validating/byte.hxx>
+#include <xsde/cxx/parser/validating/unsigned-byte.hxx>
+
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ // Good.
+ //
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("123");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == 123);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("\t +123 \n ");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == 123);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-123");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == -123);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+123");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == 123);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0000000000000000123");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == 123);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+0000000000000000123");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == 123);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-0000000000000000123");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == -123);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("\t \n");
+ p._characters (" -");
+ p._characters ("00000");
+ p._characters ("001");
+ p._characters ("23 \n\t");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == -123);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-128");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == -128);
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("127");
+ p._post ();
+ assert (!c.error_type () && p.post_byte () == 127);
+ }
+
+ {
+ context c (0);
+ unsigned_byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+123");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_byte () == 123);
+ }
+
+ {
+ context c (0);
+ unsigned_byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_byte () == 0);
+ }
+
+ {
+ context c (0);
+ unsigned_byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("255");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_byte () == 255);
+ }
+
+ // Bad
+ //
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n \t ");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("++01");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--01");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-01");
+ p._characters (" ");
+ p._characters ("23 ");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ unsigned_byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-123");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // Ranges
+ //
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-129");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("128");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ unsigned_byte_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("256");
+ p._post ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/byte/makefile b/tests/cxx/parser/validation/built-in/byte/makefile
new file mode 100644
index 0000000..855095f
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/byte/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/byte/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/parser/validation/built-in/date-time/driver.cxx b/tests/cxx/parser/validation/built-in/date-time/driver.cxx
new file mode 100644
index 0000000..43b23f3
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/date-time/driver.cxx
@@ -0,0 +1,1833 @@
+// file : tests/cxx/parser/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/parser/validating/xml-schema-pimpl.hxx>
+
+using namespace xsde::cxx;
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ using xsde::cxx::time;
+
+ // Good.
+ //
+
+ // gday & time zone parsing
+ //
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("---1");
+ p._characters ("2+12:00");
+ p._post ();
+ assert (p.post_gday () == gday (12, 12, 0));
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---01");
+ p._post ();
+ assert (p.post_gday () == gday (1));
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---31");
+ p._post ();
+ assert (p.post_gday () == gday (31));
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---15Z");
+ p._post ();
+ assert (p.post_gday () == gday (15, 0, 0));
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---15-14:00");
+ p._post ();
+ assert (p.post_gday () == gday (15, -14, -0));
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---15-12:59");
+ p._post ();
+ assert (p.post_gday () == gday (15, -12, -59));
+ }
+
+ // gmonth
+ //
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("--1");
+ p._characters ("0+12:00");
+ p._post ();
+ assert (p.post_gmonth () == gmonth (10, 12, 0));
+ }
+
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--01");
+ p._post ();
+ assert (p.post_gmonth () == gmonth (1));
+ }
+
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--12Z");
+ p._post ();
+ assert (p.post_gmonth () == gmonth (12, 0, 0));
+ }
+
+ // gyear
+ //
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("20");
+ p._characters ("07+12:00");
+ p._post ();
+ assert (p.post_gyear () == gyear (2007, 12, 0));
+ }
+
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0001");
+ p._post ();
+ assert (p.post_gyear () == gyear (1));
+ }
+
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-20000Z");
+ p._post ();
+ assert (p.post_gyear () == gyear (-20000, 0, 0));
+ }
+
+ // gmonth_day
+ //
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("--1");
+ p._characters ("0-28+12:00 ");
+ p._post ();
+ assert (p.post_gmonth_day () == gmonth_day (10, 28, 12, 00));
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--12-31");
+ p._post ();
+ assert (p.post_gmonth_day () == gmonth_day (12, 31));
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--01-01Z");
+ p._post ();
+ assert (p.post_gmonth_day () == gmonth_day (1, 1, 0, 0));
+ }
+
+ // gyear_month
+ //
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("200");
+ p._characters ("7-12+12:00 ");
+ p._post ();
+ assert (p.post_gyear_month () == gyear_month (2007, 12, 12, 0));
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-2007-10");
+ p._post ();
+ assert (p.post_gyear_month () == gyear_month (-2007, 10));
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("20007-10Z");
+ p._post ();
+ assert (p.post_gyear_month () == gyear_month (20007, 10, 0, 0));
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-20007-01");
+ p._post ();
+ assert (p.post_gyear_month () == gyear_month (-20007, 1));
+ }
+
+ // date
+ //
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("200");
+ p._characters ("7-12-26+12:00 ");
+ p._post ();
+ assert (p.post_date () == date (2007, 12, 26, 12, 0));
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-2007-10-15");
+ p._post ();
+ assert (p.post_date () == date (-2007, 10, 15));
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("20007-12-31Z");
+ p._post ();
+ assert (p.post_date () == date (20007, 12, 31, 0, 0));
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-20007-01-01");
+ p._post ();
+ assert (p.post_date () == date (-20007, 1, 1));
+ }
+
+ // time
+ //
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("12:");
+ p._characters ("46:23.456+12:00 ");
+ p._post ();
+ assert (p.post_time () == time (12, 46, 23.456, 12, 0));
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("12:13:14");
+ p._post ();
+ assert (p.post_time () == time (12, 13, 14.0));
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("12:13:14Z");
+ p._post ();
+ assert (p.post_time () == time (12, 13, 14.0, 0, 0));
+ }
+
+ // date_time
+ //
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("200");
+ p._characters ("7-12-26T12:13:14.123+12:00 ");
+ p._post ();
+ assert (p.post_date_time () ==
+ date_time (2007, 12, 26, 12, 13, 14.123, 12, 0));
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-2007-10-15T12:13:14");
+ p._post ();
+ assert (p.post_date_time () == date_time (-2007, 10, 15, 12, 13, 14.0));
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("20007-12-31T12:13:14Z");
+ p._post ();
+ assert (p.post_date_time () ==
+ date_time (20007, 12, 31, 12, 13, 14.0, 0, 0));
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-20007-01-01T12:13:14");
+ p._post ();
+ assert (p.post_date_time () == date_time (-20007, 1, 1, 12, 13, 14.0));
+ }
+
+ // duration
+ //
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \t\n ");
+ p._characters ("-P200");
+ p._characters ("7Y13M32DT25H61M61.123S ");
+ p._post ();
+ assert (p.post_duration () ==
+ duration (true, 2007, 13, 32, 25, 61, 61.123));
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P1Y");
+ p._post ();
+ assert (p.post_duration () == duration (false, 1, 0, 0, 0, 0, 0.0));
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P1M");
+ p._post ();
+ assert (p.post_duration () == duration (false, 0, 1, 0, 0, 0, 0.0));
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P1D");
+ p._post ();
+ assert (p.post_duration () == duration (false, 0, 0, 1, 0, 0, 0.0));
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("PT1H");
+ p._post ();
+ assert (p.post_duration () == duration (false, 0, 0, 0, 1, 0, 0.0));
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("PT1M");
+ p._post ();
+ assert (p.post_duration () == duration (false, 0, 0, 0, 0, 1, 0.0));
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("PT1.1S");
+ p._post ();
+ assert (p.post_duration () == duration (false, 0, 0, 0, 0, 0, 1.1));
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P1YT1S");
+ p._post ();
+ assert (p.post_duration () == duration (false, 1, 0, 0, 0, 0, 1.0));
+ }
+
+ // Bad
+ //
+
+ // gday & time zone parsing
+ //
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---1");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---32");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---2X");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---12asd");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---12X");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---1212:00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---12+2:00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---12+1200");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---12+15:00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---12+12:60");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ {
+ context c (0);
+ gday_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("---12+14:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gday_value);
+ }
+
+ // gmonth
+ //
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_value);
+ }
+
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_value);
+ }
+
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_value);
+ }
+
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--13");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_value);
+ }
+
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--1X");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_value);
+ }
+
+ {
+ context c (0);
+ gmonth_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--11+12:3o");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_value);
+ }
+
+ // gyear
+ //
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_value);
+ }
+
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("207");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_value);
+ }
+
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-207");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_value);
+ }
+
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-0000");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_value);
+ }
+
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("20X7");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_value);
+ }
+
+ {
+ context c (0);
+ gyear_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007+12:3o");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_value);
+ }
+
+ // gmonth_day
+ //
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-12-12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--1212");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--12?12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--00-12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--12-00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--13-23");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--12-32");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--1X-12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--12-2X");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ {
+ context c (0);
+ gmonth_day_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("--11-11+12:3o");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gmonth_day_value);
+ }
+
+ // gyear_month
+ //
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("207-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-207-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0000-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("20X7-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007?12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-0");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-13");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-1X");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ {
+ context c (0);
+ gyear_month_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01+12:3o");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_gyear_month_value);
+ }
+
+ // date
+ //
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("207-01-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-207-01-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0000-01-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("20X7-01-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007?01-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-0-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-00-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-13-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-1X-01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10?12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-0");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-32");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-2X");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ {
+ context c (0);
+ date_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01+12:3o");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_value);
+ }
+
+ // time
+ //
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1:01:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2X:01:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23?01:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:0:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:60:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:4X:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:10");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:10?12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:10:");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:10:0");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:10:01.");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:10:60");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:10:2X");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("24:01:00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("24:00:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ {
+ context c (0);
+ time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:01:01+12:3o");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_time_value);
+ }
+
+ // date_time
+ //
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("207-01-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-207-01-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0000-01-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("20X7-01-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007?01-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-0-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-00-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-13-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-1X-01T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10?12T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-0T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-00T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-32T12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-10-2XT12:13:14");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T1:01:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T2X:01:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23?01:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:0:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:60:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:4X:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:10");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:10?12");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:10:");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:10:0");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:10:01.");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:10:60");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T23:10:2X");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T24:01:00");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T24:00:01");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("23:01:01+12:3o");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ {
+ context c (0);
+ date_time_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007-01-01T12:13:14+12:3o");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_date_time_value);
+ }
+
+ // duration
+ //
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ // p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2007Y");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-2007Y");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P-2007Y");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P-1M");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P-1D");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("PT-1H");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("PT-1M");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("PT-1.1S");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P1H1M1S");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P1M1Y");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("PT1S1H");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("PT1H1Y");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P1Ygarbage");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+
+ {
+ context c (0);
+ duration_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("P1YT");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_duration_value);
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/date-time/makefile b/tests/cxx/parser/validation/built-in/date-time/makefile
new file mode 100644
index 0000000..7e0b597
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/date-time/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/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/parser/validation/built-in/float/driver.cxx b/tests/cxx/parser/validation/built-in/float/driver.cxx
new file mode 100644
index 0000000..852d158
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/float/driver.cxx
@@ -0,0 +1,309 @@
+// file : tests/cxx/parser/validation/built-in/float/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 float, double, and decimal types validation.
+//
+#include <math.h>
+#include <cassert>
+
+#include <xsde/cxx/parser/validating/float.hxx>
+#include <xsde/cxx/parser/validating/double.hxx>
+#include <xsde/cxx/parser/validating/decimal.hxx>
+
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ // Good.
+ //
+
+ // float
+ //
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" 0000123.456 ");
+ p._post ();
+ assert (!c.error_type () && p.post_float () == 123.456F);
+ }
+
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-12.345E2");
+ p._post ();
+ assert (!c.error_type () && p.post_float () == -12.345E2F);
+ }
+
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_float () == 0.0F);
+ }
+
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-0");
+ p._post ();
+ assert (!c.error_type () && p.post_float () == -0.0F);
+ }
+
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("INF");
+ p._post ();
+ assert (!c.error_type () && isinf (p.post_float ()));
+ }
+
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-INF");
+ p._post ();
+ assert (!c.error_type () && isinf (p.post_float ()));
+ }
+
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("NaN");
+ p._post ();
+ assert (!c.error_type () && isnan (p.post_float ()));
+ }
+
+ // double
+ //
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" 0000123.456789 ");
+ p._post ();
+ assert (!c.error_type () && p.post_double () == 123.456789);
+ }
+
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-12.3456789E2");
+ p._post ();
+ assert (!c.error_type () && p.post_double () == -12.3456789E2);
+ }
+
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_double () == 0.0);
+ }
+
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-0");
+ p._post ();
+ assert (!c.error_type () && p.post_double () == -0.0);
+ }
+
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("INF");
+ p._post ();
+ assert (!c.error_type () && isinf (p.post_double ()));
+ }
+
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-INF");
+ p._post ();
+ assert (!c.error_type () && isinf (p.post_double ()));
+ }
+
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("NaN");
+ p._post ();
+ assert (!c.error_type () && isnan (p.post_double ()));
+ }
+
+ // decimal
+ //
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" 0000123.456789 ");
+ p._post ();
+ assert (!c.error_type () && p.post_decimal () == 123.456789);
+ }
+
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-123.45678912345");
+ p._post ();
+ assert (!c.error_type () && p.post_decimal () == -123.45678912345);
+ }
+
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_decimal () == 0.0);
+ }
+
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-0");
+ p._post ();
+ assert (!c.error_type () && p.post_decimal () == -0.0);
+ }
+
+
+ // Bad
+ //
+
+ // float
+ //
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+INF");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ float_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1.45 E2");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // double
+ //
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+INF");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ double_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1.45 E2");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // decimal
+ //
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("INF");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+INF");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-INF");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("NaN");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ decimal_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1.45 2");
+ p._post ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/float/makefile b/tests/cxx/parser/validation/built-in/float/makefile
new file mode 100644
index 0000000..0e5231e
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/float/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/float/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/parser/validation/built-in/int/driver.cxx b/tests/cxx/parser/validation/built-in/int/driver.cxx
new file mode 100644
index 0000000..2395b04
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/int/driver.cxx
@@ -0,0 +1,116 @@
+// file : tests/cxx/parser/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 int and unsigned int types validation.
+//
+#include <cassert>
+
+#include <xsde/cxx/parser/validating/int.hxx>
+#include <xsde/cxx/parser/validating/unsigned-int.hxx>
+
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ // Good.
+ //
+ {
+ context c (0);
+ int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-2147483648");
+ p._post ();
+ assert (!c.error_type () && p.post_int () == -2147483648);
+ }
+
+ {
+ context c (0);
+ int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_int () == 0);
+ }
+
+ {
+ context c (0);
+ int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2147483647");
+ p._post ();
+ assert (!c.error_type () && p.post_int () == 2147483647);
+ }
+
+ {
+ context c (0);
+ unsigned_int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_int () == 0);
+ }
+
+ {
+ context c (0);
+ unsigned_int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("4294967295");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_int () == 4294967295);
+ }
+
+ // Bad
+ //
+
+ {
+ context c (0);
+ unsigned_int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-123");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+
+ // Ranges
+ //
+ {
+ context c (0);
+ int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-2147483649");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2147483648");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ unsigned_int_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("4294967296");
+ p._post ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/int/makefile b/tests/cxx/parser/validation/built-in/int/makefile
new file mode 100644
index 0000000..0fc4608
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/int/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/int/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/parser/validation/built-in/integer/driver.cxx b/tests/cxx/parser/validation/built-in/integer/driver.cxx
new file mode 100644
index 0000000..9676046
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/integer/driver.cxx
@@ -0,0 +1,317 @@
+// file : tests/cxx/parser/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 <limits.h>
+
+#include <string>
+#include <sstream>
+#include <cassert>
+
+#include <xsde/cxx/parser/validating/integer.hxx>
+#include <xsde/cxx/parser/validating/negative-integer.hxx>
+#include <xsde/cxx/parser/validating/non-positive-integer.hxx>
+#include <xsde/cxx/parser/validating/positive-integer.hxx>
+#include <xsde/cxx/parser/validating/non-negative-integer.hxx>
+
+using namespace std;
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ // Good.
+ //
+
+ std::string min;
+ std::string max;
+ std::string umax;
+
+ {
+ ostringstream ostr;
+ ostr << LONG_MIN;
+ min = ostr.str ();
+ }
+
+ {
+ ostringstream ostr;
+ ostr << LONG_MAX;
+ max = ostr.str ();
+ }
+
+ {
+ ostringstream ostr;
+ ostr << ULONG_MAX;
+ umax = ostr.str ();
+ }
+
+ // integer
+ //
+ {
+ context c (0);
+ integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (min.c_str ());
+ p._post ();
+ assert (!c.error_type () && p.post_integer () == LONG_MIN);
+ }
+
+ {
+ context c (0);
+ integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_integer () == 0);
+ }
+
+ {
+ context c (0);
+ integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (max.c_str ());
+ p._post ();
+ assert (!c.error_type () && p.post_integer () == LONG_MAX);
+ }
+
+ // negative_integer
+ //
+ {
+ context c (0);
+ negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (min.c_str ());
+ p._post ();
+ assert (!c.error_type () && p.post_negative_integer () == LONG_MIN);
+ }
+
+ {
+ context c (0);
+ negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-1");
+ p._post ();
+ assert (!c.error_type () && p.post_negative_integer () == -1);
+ }
+
+ // non_positive_integer
+ //
+ {
+ context c (0);
+ non_positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (min.c_str ());
+ p._post ();
+ assert (!c.error_type () && p.post_non_positive_integer () == LONG_MIN);
+ }
+
+ {
+ context c (0);
+ non_positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+0");
+ p._post ();
+ assert (!c.error_type () && p.post_non_positive_integer () == 0);
+ }
+
+ // positive_integer
+ //
+ {
+ context c (0);
+ positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1");
+ p._post ();
+ assert (!c.error_type () && p.post_positive_integer () == 1);
+ }
+
+ {
+ context c (0);
+ positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (umax.c_str ());
+ p._post ();
+ assert (!c.error_type () && p.post_positive_integer () == ULONG_MAX);
+ }
+
+ // non_negative_integer
+ //
+ {
+ context c (0);
+ non_negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-0");
+ p._post ();
+ assert (!c.error_type () && p.post_non_negative_integer () == 0);
+ }
+
+ {
+ context c (0);
+ non_negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (umax.c_str ());
+ p._post ();
+ assert (!c.error_type () && p.post_non_negative_integer () == ULONG_MAX);
+ }
+
+
+ // Bad
+ //
+
+ std::string past_min (min);
+ std::string past_max (max);
+ std::string past_umax (umax);
+
+ assert (*past_min.rbegin () != '9');
+ assert (*past_max.rbegin () != '9');
+ assert (*past_umax.rbegin () != '9');
+
+ (*past_min.rbegin ())++;
+ (*past_max.rbegin ())++;
+ (*past_umax.rbegin ())++;
+
+ // integer
+ //
+ {
+ context c (0);
+ integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (past_min.c_str ());
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (past_max.c_str ());
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // negative_integer
+ //
+ {
+ context c (0);
+ negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (past_min.c_str ());
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-0");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // non_positive_integer
+ //
+ {
+ context c (0);
+ non_positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (past_min.c_str ());
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ non_positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // positive_integer
+ //
+ {
+ context c (0);
+ positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-1");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("+0");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ positive_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (past_umax.c_str ());
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // non_negative_integer
+ //
+ {
+ context c (0);
+ non_negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-1");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ non_negative_integer_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (past_umax.c_str ());
+ p._post ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/integer/makefile b/tests/cxx/parser/validation/built-in/integer/makefile
new file mode 100644
index 0000000..8e5fa68
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/integer/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/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/parser/validation/built-in/long-long/driver.cxx b/tests/cxx/parser/validation/built-in/long-long/driver.cxx
new file mode 100644
index 0000000..3ddf6d9
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/long-long/driver.cxx
@@ -0,0 +1,118 @@
+// file : tests/cxx/parser/validation/built-in/long-long/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 long and unsigned long types validation.
+//
+#include <cassert>
+
+#include <xsde/cxx/parser/validating/long-long.hxx>
+#include <xsde/cxx/parser/validating/unsigned-long-long.hxx>
+
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ // Good.
+ //
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-9223372036854775808");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_long () == (-9223372036854775807LL - 1));
+ }
+
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_long () == 0);
+ }
+
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("9223372036854775807");
+ p._post ();
+ assert (!c.error_type () && p.post_long () == 9223372036854775807LL);
+ }
+
+ {
+ context c (0);
+ unsigned_long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_long () == 0);
+ }
+
+ {
+ context c (0);
+ unsigned_long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("18446744073709551615");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_unsigned_long () == 18446744073709551615ULL);
+ }
+
+ // Bad
+ //
+
+ {
+ context c (0);
+ unsigned_long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-123");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+
+ // Ranges
+ //
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-9223372036854775809");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("9223372036854775808");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ unsigned_long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("18446744073709551616");
+ p._post ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/long-long/makefile b/tests/cxx/parser/validation/built-in/long-long/makefile
new file mode 100644
index 0000000..948c89a
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/long-long/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/long-long/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/parser/validation/built-in/long/driver.cxx b/tests/cxx/parser/validation/built-in/long/driver.cxx
new file mode 100644
index 0000000..0312b3b
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/long/driver.cxx
@@ -0,0 +1,106 @@
+// file : tests/cxx/parser/validation/built-in/long/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 long and unsigned long types validation (32 bit fall-back).
+//
+#include <cassert>
+
+#include <xsde/cxx/parser/validating/long.hxx>
+#include <xsde/cxx/parser/validating/unsigned-long.hxx>
+
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main (int argc, char* argv[])
+{
+ // Good.
+ //
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-2147483648");
+ p._post ();
+ assert (!c.error_type () && p.post_long () == -2147483648);
+ }
+
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_long () == 0);
+ }
+
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2147483647");
+ p._post ();
+ assert (!c.error_type () && p.post_long () == 2147483647);
+ }
+
+ {
+ context c (0);
+ unsigned_long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_long () == 0);
+ }
+
+ {
+ context c (0);
+ unsigned_long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("4294967295");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_long () == 4294967295);
+ }
+
+ // Bad
+ //
+
+ {
+ context c (0);
+ unsigned_long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-123");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+
+ // Ranges
+ //
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-2147483649");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ long_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("2147483648");
+ p._post ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/long/makefile b/tests/cxx/parser/validation/built-in/long/makefile
new file mode 100644
index 0000000..e050feb
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/long/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/long/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/parser/validation/built-in/makefile b/tests/cxx/parser/validation/built-in/makefile
new file mode 100644
index 0000000..0e6b3aa
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/makefile
@@ -0,0 +1,35 @@
+# file : tests/cxx/parser/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 := binary boolean byte date-time float int integer qname short \
+string uri
+
+ifeq ($(xsde_iostream),y)
+ifeq ($(xsde_exceptions),y)
+ifeq ($(xsde_reuse_style),tiein)
+tests += any-type
+endif
+endif
+endif
+
+ifeq ($(xsde_longlong),y)
+tests += long-long
+else
+tests += long
+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/parser/validation/built-in/qname/driver.cxx b/tests/cxx/parser/validation/built-in/qname/driver.cxx
new file mode 100644
index 0000000..f3acc6b
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/qname/driver.cxx
@@ -0,0 +1,132 @@
+// file : tests/cxx/parser/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/parser/validating/xml-schema-pimpl.hxx>
+
+using namespace xsde::cxx;
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+#ifdef XSDE_STL
+bool
+compare (const qname& x, const char* p, const char* n)
+{
+ return x == qname (p, n);
+}
+#else
+bool
+compare (qname* x, const char* p, const char* n)
+{
+ qname y;
+ y.prefix_copy (p);
+ y.name_copy (n);
+
+ bool r = *x == y;
+ delete x;
+ return r;
+}
+#endif
+
+int
+main ()
+{
+ // Good.
+ //
+ {
+ context c (0);
+ qname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" xsi");
+ p._characters (":");
+ p._characters ("schemaLocation");
+ p._post ();
+ assert (!c.error_type () &&
+ compare (p.post_qname (), "xsi", "schemaLocation"));
+ }
+
+ {
+ context c (0);
+ qname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("schemaLocation");
+ p._post ();
+ assert (!c.error_type () &&
+ compare (p.post_qname (), "", "schemaLocation"));
+ }
+
+
+ // Bad
+ //
+ {
+ context c (0);
+ qname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ //p._characters ("");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+
+ {
+ context c (0);
+ qname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (":");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+
+ {
+ context c (0);
+ qname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("xsi:");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+
+ {
+ context c (0);
+ qname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (":schemaLocation");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+
+ {
+ context c (0);
+ qname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("x?i:schemaLocation");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+
+ {
+ context c (0);
+ qname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("xsi:schema Location");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_qname_value);
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/qname/makefile b/tests/cxx/parser/validation/built-in/qname/makefile
new file mode 100644
index 0000000..eed5151
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/qname/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/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/parser/validation/built-in/short/driver.cxx b/tests/cxx/parser/validation/built-in/short/driver.cxx
new file mode 100644
index 0000000..6822f61
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/short/driver.cxx
@@ -0,0 +1,116 @@
+// file : tests/cxx/parser/validation/built-in/short/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 short and unsigned short types validation.
+//
+#include <cassert>
+
+#include <xsde/cxx/parser/validating/short.hxx>
+#include <xsde/cxx/parser/validating/unsigned-short.hxx>
+
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ // Good.
+ //
+ {
+ context c (0);
+ short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-32768");
+ p._post ();
+ assert (!c.error_type () && p.post_short () == -32768);
+ }
+
+ {
+ context c (0);
+ short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_short () == 0);
+ }
+
+ {
+ context c (0);
+ short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("32767");
+ p._post ();
+ assert (!c.error_type () && p.post_short () == 32767);
+ }
+
+ {
+ context c (0);
+ unsigned_short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("0");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_short () == 0);
+ }
+
+ {
+ context c (0);
+ unsigned_short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("65535");
+ p._post ();
+ assert (!c.error_type () && p.post_unsigned_short () == 65535);
+ }
+
+ // Bad
+ //
+
+ {
+ context c (0);
+ unsigned_short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-1234");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+
+ // Ranges
+ //
+ {
+ context c (0);
+ short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-32769");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("32768");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ unsigned_short_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("65536");
+ p._post ();
+ assert (c.schema_error ());
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/short/makefile b/tests/cxx/parser/validation/built-in/short/makefile
new file mode 100644
index 0000000..d82fc91
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/short/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/short/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/parser/validation/built-in/string/driver.cxx b/tests/cxx/parser/validation/built-in/string/driver.cxx
new file mode 100644
index 0000000..06a4708
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/string/driver.cxx
@@ -0,0 +1,613 @@
+// file : tests/cxx/parser/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/parser/validating/xml-schema-pimpl.hxx>
+
+using namespace xsde::cxx;
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+bool
+compare (const string_sequence* x, const string_sequence& y)
+{
+ bool r = *x == y;
+ delete x;
+ return r;
+}
+
+int
+main ()
+{
+ // We are going to leak a bit of memory in the no-STL case.
+ //
+ using std::string;
+
+ // Good.
+ //
+
+ // string
+ //
+ {
+ context c (0);
+ string_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" aaa ");
+ p._characters ("bbb");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_string () == string (" \n\t aaa bbb "));
+ }
+
+ // normalized_string
+ //
+ {
+ context c (0);
+ normalized_string_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" aaa \n\t ");
+ p._characters (" bbb");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_normalized_string () == string (" aaa bbb "));
+ }
+
+ // token
+ //
+ {
+ context c (0);
+ token_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" aaa \n\t ");
+ p._characters (" bbb \n\t");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_token () == string ("aaa bbb"));
+ }
+
+ // name
+ //
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" a:b-c_d123 ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_name () == string ("a:b-c_d123"));
+ }
+
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" _12 ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_name () == string ("_12"));
+ }
+
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" :12 ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_name () == string (":12"));
+ }
+
+ // nmtoken
+ //
+ {
+ context c (0);
+ nmtoken_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" 123a:b-c_d123 ");
+ p._characters (" \n\t");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_nmtoken () == string ("123a:b-c_d123"));
+ }
+
+ // nmtokens
+ //
+ {
+ context c (0);
+ string_sequence s;
+#ifdef XSDE_STL
+ s.push_back ("123");
+ s.push_back ("abc");
+#else
+ s.push_back_copy ("123");
+ s.push_back_copy ("abc");
+#endif
+
+ nmtokens_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" 123 ");
+ p._characters (" \n\t abc ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () && compare (p.post_nmtokens (), s));
+ }
+
+ // ncname
+ //
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" a.b-c_d123 ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_ncname () == string ("a.b-c_d123"));
+ }
+
+ // id
+ //
+ {
+ context c (0);
+ id_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" a.b-c_d123 ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_id () == string ("a.b-c_d123"));
+ }
+
+ // idref
+ //
+ {
+ context c (0);
+ idref_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" a.b-c_d123 ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_idref () == string ("a.b-c_d123"));
+ }
+
+ // idrefs
+ //
+ {
+ context c (0);
+ string_sequence s;
+#ifdef XSDE_STL
+ s.push_back ("a123");
+ s.push_back ("abc");
+#else
+ s.push_back_copy ("a123");
+ s.push_back_copy ("abc");
+#endif
+
+ idrefs_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" \n\t");
+ p._characters (" a123 ");
+ p._characters (" \n\t abc ");
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () && compare (p.post_idrefs (), s));
+ }
+
+ // language
+ //
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" x ");
+ p._post ();
+ assert (!c.error_type () && p.post_language () == string ("x"));
+ }
+
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" en ");
+ p._post ();
+ assert (!c.error_type () && p.post_language () == string ("en"));
+ }
+
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" en");
+ p._characters ("-us ");
+ p._post ();
+ assert (!c.error_type () && p.post_language () == string ("en-us"));
+ }
+
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("one-two-three-four44-seven77-eight888");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_language () ==
+ string ("one-two-three-four44-seven77-eight888"));
+ }
+
+ // Bad
+ //
+
+ // name
+ //
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (".a");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-a");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1a");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a,b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ name_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a<b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // nmtoken
+ //
+ {
+ context c (0);
+ nmtoken_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ nmtoken_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a,b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ nmtoken_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ nmtoken_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a<b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // nmtokens
+ //
+ {
+ context c (0);
+ nmtokens_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" ");
+ p._characters (" \t\n ");
+ p._post_impl ();
+ assert (c.schema_error () == schema_error::invalid_nmtokens_value);
+ }
+
+ {
+ context c (0);
+ nmtokens_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("ab a,b");
+ p._post_impl ();
+ assert (c.schema_error () == schema_error::invalid_nmtoken_value);
+ }
+
+ // ncname
+ //
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (".a");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("-a");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (":a");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("1a");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a:b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a,b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ {
+ context c (0);
+ ncname_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a<b");
+ p._post ();
+ assert (c.schema_error ());
+ }
+
+ // id
+ //
+ {
+ context c (0);
+ id_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a b");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_id_value);
+ }
+
+ // idref
+ //
+ {
+ context c (0);
+ idref_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a b");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_idref_value);
+ }
+
+ // idrefs
+ //
+ {
+ context c (0);
+ idrefs_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" ");
+ p._characters (" \t\n ");
+ p._post_impl ();
+ assert (c.schema_error () == schema_error::invalid_idrefs_value);
+ }
+
+ {
+ context c (0);
+ idrefs_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("ab a<b");
+ p._post_impl ();
+ assert (c.schema_error () == schema_error::invalid_idref_value);
+ }
+
+ // language
+ //
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" ");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("en-");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("a1");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("en+us");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+
+ {
+ context c (0);
+ language_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("en-nine99999");
+ p._post ();
+ assert (c.schema_error () == schema_error::invalid_language_value);
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/string/makefile b/tests/cxx/parser/validation/built-in/string/makefile
new file mode 100644
index 0000000..27fc822
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/string/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/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/parser/validation/built-in/uri/driver.cxx b/tests/cxx/parser/validation/built-in/uri/driver.cxx
new file mode 100644
index 0000000..5d1f91a
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/uri/driver.cxx
@@ -0,0 +1,66 @@
+// file : tests/cxx/parser/validation/built-in/uri/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 anyURI type validation.
+//
+#include <string>
+#include <cassert>
+
+// Let the runtime header sort out which version (stl/no-stl) to
+// include.
+//
+#include <xsde/cxx/parser/validating/xml-schema-pimpl.hxx>
+
+using namespace xsde::cxx::parser;
+using namespace xsde::cxx::parser::validating;
+
+int
+main ()
+{
+ using std::string;
+
+ // Good.
+ //
+ {
+ context c (0);
+ uri_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters (" ");
+ p._post ();
+ assert (!c.error_type () && p.post_uri () == string (""));
+ }
+
+ {
+ context c (0);
+ uri_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("relative");
+ p._post ();
+ assert (!c.error_type () && p.post_uri () == string ("relative"));
+ }
+
+ {
+ context c (0);
+ uri_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("#id");
+ p._post ();
+ assert (!c.error_type () && p.post_uri () == string ("#id"));
+ }
+
+ {
+ context c (0);
+ uri_pimpl p;
+ p.pre ();
+ p._pre_impl (c);
+ p._characters ("http://www.example.com/foo#bar");
+ p._post ();
+ assert (!c.error_type () &&
+ p.post_uri () == string ("http://www.example.com/foo#bar"));
+ }
+}
diff --git a/tests/cxx/parser/validation/built-in/uri/makefile b/tests/cxx/parser/validation/built-in/uri/makefile
new file mode 100644
index 0000000..09da436
--- /dev/null
+++ b/tests/cxx/parser/validation/built-in/uri/makefile
@@ -0,0 +1,61 @@
+# file : tests/cxx/parser/validation/built-in/uri/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)