mod common;
const XSD_BOOL_ELEMENT: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:boolean"/>
</xs:schema>"#;
const XSD_BOOL_RESTRICTION: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value">
<xs:simpleType>
<xs:restriction base="xs:boolean"/>
</xs:simpleType>
</xs:element>
</xs:schema>"#;
test_validation!(
bool_true_valid,
r#"<?xml version="1.0"?>
<value>true</value>"#,
XSD_BOOL_ELEMENT,
true
);
test_validation!(
bool_false_valid,
r#"<?xml version="1.0"?>
<value>false</value>"#,
XSD_BOOL_ELEMENT,
true
);
test_validation!(
bool_one_valid,
r#"<?xml version="1.0"?>
<value>1</value>"#,
XSD_BOOL_ELEMENT,
true
);
test_validation!(
bool_zero_valid,
r#"<?xml version="1.0"?>
<value>0</value>"#,
XSD_BOOL_ELEMENT,
true
);
test_validation!(
bool_restriction_true_valid,
r#"<?xml version="1.0"?>
<value>true</value>"#,
XSD_BOOL_RESTRICTION,
true
);
test_validation!(
bool_capital_true_invalid,
r#"<?xml version="1.0"?>
<value>True</value>"#,
XSD_BOOL_ELEMENT,
false
);
test_validation!(
bool_yes_invalid,
r#"<?xml version="1.0"?>
<value>yes</value>"#,
XSD_BOOL_ELEMENT,
false
);
test_validation!(
bool_two_invalid,
r#"<?xml version="1.0"?>
<value>2</value>"#,
XSD_BOOL_ELEMENT,
false
);
const XSD_INTEGER: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:integer"/>
</xs:schema>"#;
const XSD_INT: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:int"/>
</xs:schema>"#;
const XSD_NON_NEGATIVE_INTEGER: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:nonNegativeInteger"/>
</xs:schema>"#;
const XSD_POSITIVE_INTEGER: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:positiveInteger"/>
</xs:schema>"#;
test_validation!(
integer_zero_valid,
r#"<?xml version="1.0"?>
<value>0</value>"#,
XSD_INTEGER,
true
);
test_validation!(
integer_positive_valid,
r#"<?xml version="1.0"?>
<value>42</value>"#,
XSD_INTEGER,
true
);
test_validation!(
integer_negative_valid,
r#"<?xml version="1.0"?>
<value>-42</value>"#,
XSD_INTEGER,
true
);
test_validation!(
integer_explicit_plus_valid,
r#"<?xml version="1.0"?>
<value>+42</value>"#,
XSD_INTEGER,
true
);
test_validation!(
integer_decimal_invalid,
r#"<?xml version="1.0"?>
<value>1.5</value>"#,
XSD_INTEGER,
false
);
test_validation!(
integer_alpha_invalid,
r#"<?xml version="1.0"?>
<value>abc</value>"#,
XSD_INTEGER,
false
);
test_validation!(
integer_empty_invalid,
r#"<?xml version="1.0"?>
<value></value>"#,
XSD_INTEGER,
false
);
test_validation!(
integer_exponent_invalid,
r#"<?xml version="1.0"?>
<value>1e2</value>"#,
XSD_INTEGER,
false
);
test_validation!(
int_min_boundary_valid,
r#"<?xml version="1.0"?>
<value>-2147483648</value>"#,
XSD_INT,
true
);
test_validation!(
int_max_boundary_valid,
r#"<?xml version="1.0"?>
<value>2147483647</value>"#,
XSD_INT,
true
);
test_validation!(
int_above_max_invalid,
r#"<?xml version="1.0"?>
<value>2147483648</value>"#,
XSD_INT,
false
);
test_validation!(
int_below_min_invalid,
r#"<?xml version="1.0"?>
<value>-2147483649</value>"#,
XSD_INT,
false
);
test_validation!(
non_negative_integer_zero_valid,
r#"<?xml version="1.0"?>
<value>0</value>"#,
XSD_NON_NEGATIVE_INTEGER,
true
);
test_validation!(
non_negative_integer_positive_valid,
r#"<?xml version="1.0"?>
<value>100</value>"#,
XSD_NON_NEGATIVE_INTEGER,
true
);
test_validation!(
non_negative_integer_negative_invalid,
r#"<?xml version="1.0"?>
<value>-1</value>"#,
XSD_NON_NEGATIVE_INTEGER,
false
);
test_validation!(
positive_integer_one_valid,
r#"<?xml version="1.0"?>
<value>1</value>"#,
XSD_POSITIVE_INTEGER,
true
);
test_validation!(
positive_integer_zero_invalid,
r#"<?xml version="1.0"?>
<value>0</value>"#,
XSD_POSITIVE_INTEGER,
false
);
test_validation!(
positive_integer_negative_invalid,
r#"<?xml version="1.0"?>
<value>-1</value>"#,
XSD_POSITIVE_INTEGER,
false
);
const XSD_DECIMAL: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:decimal"/>
</xs:schema>"#;
test_validation!(
decimal_integer_valid,
r#"<?xml version="1.0"?>
<value>0</value>"#,
XSD_DECIMAL,
true
);
test_validation!(
decimal_fraction_valid,
r#"<?xml version="1.0"?>
<value>1.5</value>"#,
XSD_DECIMAL,
true
);
test_validation!(
decimal_negative_valid,
r#"<?xml version="1.0"?>
<value>-1.5</value>"#,
XSD_DECIMAL,
true
);
test_validation!(
decimal_leading_dot_valid,
r#"<?xml version="1.0"?>
<value>.5</value>"#,
XSD_DECIMAL,
true
);
test_validation!(
decimal_trailing_dot_valid,
r#"<?xml version="1.0"?>
<value>1.</value>"#,
XSD_DECIMAL,
true
);
test_validation!(
decimal_exponent_invalid,
r#"<?xml version="1.0"?>
<value>1e2</value>"#,
XSD_DECIMAL,
false
);
test_validation!(
decimal_alpha_invalid,
r#"<?xml version="1.0"?>
<value>abc</value>"#,
XSD_DECIMAL,
false
);
test_validation!(
decimal_two_dots_invalid,
r#"<?xml version="1.0"?>
<value>1.5.6</value>"#,
XSD_DECIMAL,
false
);
test_validation!(
decimal_empty_invalid,
r#"<?xml version="1.0"?>
<value></value>"#,
XSD_DECIMAL,
false
);
const XSD_DOUBLE: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:double"/>
</xs:schema>"#;
const XSD_FLOAT: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:float"/>
</xs:schema>"#;
test_validation!(
double_integer_valid,
r#"<?xml version="1.0"?>
<value>0</value>"#,
XSD_DOUBLE,
true
);
test_validation!(
double_fraction_valid,
r#"<?xml version="1.0"?>
<value>1.5</value>"#,
XSD_DOUBLE,
true
);
test_validation!(
double_negative_exponent_valid,
r#"<?xml version="1.0"?>
<value>-1.5e-3</value>"#,
XSD_DOUBLE,
true
);
test_validation!(
double_positive_exponent_valid,
r#"<?xml version="1.0"?>
<value>1.2E10</value>"#,
XSD_DOUBLE,
true
);
test_validation!(
double_inf_valid,
r#"<?xml version="1.0"?>
<value>INF</value>"#,
XSD_DOUBLE,
true
);
test_validation!(
double_negative_inf_valid,
r#"<?xml version="1.0"?>
<value>-INF</value>"#,
XSD_DOUBLE,
true
);
test_validation!(
double_nan_valid,
r#"<?xml version="1.0"?>
<value>NaN</value>"#,
XSD_DOUBLE,
true
);
test_validation!(
double_alpha_invalid,
r#"<?xml version="1.0"?>
<value>abc</value>"#,
XSD_DOUBLE,
false
);
test_validation!(
double_two_dots_invalid,
r#"<?xml version="1.0"?>
<value>1.5.6</value>"#,
XSD_DOUBLE,
false
);
test_validation!(
double_lowercase_inf_invalid,
r#"<?xml version="1.0"?>
<value>inf</value>"#,
XSD_DOUBLE,
false
);
test_validation!(
double_empty_invalid,
r#"<?xml version="1.0"?>
<value></value>"#,
XSD_DOUBLE,
false
);
test_validation!(
float_fraction_valid,
r#"<?xml version="1.0"?>
<value>3.14</value>"#,
XSD_FLOAT,
true
);
test_validation!(
float_alpha_invalid,
r#"<?xml version="1.0"?>
<value>abc</value>"#,
XSD_FLOAT,
false
);
const XSD_DATE: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:date"/>
</xs:schema>"#;
test_validation!(
date_simple_valid,
r#"<?xml version="1.0"?>
<value>2026-05-28</value>"#,
XSD_DATE,
true
);
test_validation!(
date_utc_tz_valid,
r#"<?xml version="1.0"?>
<value>2026-05-28Z</value>"#,
XSD_DATE,
true
);
test_validation!(
date_jst_tz_valid,
r#"<?xml version="1.0"?>
<value>2026-05-28+09:00</value>"#,
XSD_DATE,
true
);
test_validation!(
date_bad_month_invalid,
r#"<?xml version="1.0"?>
<value>2026-13-01</value>"#,
XSD_DATE,
false
);
test_validation!(
date_bad_day_invalid,
r#"<?xml version="1.0"?>
<value>2026-02-30</value>"#,
XSD_DATE,
false
);
test_validation!(
date_short_year_invalid,
r#"<?xml version="1.0"?>
<value>26-05-28</value>"#,
XSD_DATE,
false
);
test_validation!(
date_slash_separator_invalid,
r#"<?xml version="1.0"?>
<value>2026/05/28</value>"#,
XSD_DATE,
false
);
test_validation!(
date_alpha_invalid,
r#"<?xml version="1.0"?>
<value>abc</value>"#,
XSD_DATE,
false
);
const XSD_GYEAR: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:gYear"/>
</xs:schema>"#;
test_validation!(
gyear_simple_valid,
r#"<?xml version="1.0"?>
<value>2026</value>"#,
XSD_GYEAR,
true
);
test_validation!(
gyear_utc_tz_valid,
r#"<?xml version="1.0"?>
<value>2026Z</value>"#,
XSD_GYEAR,
true
);
test_validation!(
gyear_jst_tz_valid,
r#"<?xml version="1.0"?>
<value>2026+09:00</value>"#,
XSD_GYEAR,
true
);
test_validation!(
gyear_short_invalid,
r#"<?xml version="1.0"?>
<value>26</value>"#,
XSD_GYEAR,
false
);
test_validation!(
gyear_with_month_invalid,
r#"<?xml version="1.0"?>
<value>2026-05</value>"#,
XSD_GYEAR,
false
);
test_validation!(
gyear_alpha_invalid,
r#"<?xml version="1.0"?>
<value>abc</value>"#,
XSD_GYEAR,
false
);
const XSD_DATETIME: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:dateTime"/>
</xs:schema>"#;
test_validation!(
datetime_simple_valid,
r#"<?xml version="1.0"?>
<value>2026-05-28T10:30:00</value>"#,
XSD_DATETIME,
true
);
test_validation!(
datetime_fractional_seconds_valid,
r#"<?xml version="1.0"?>
<value>2026-05-28T10:30:00.123</value>"#,
XSD_DATETIME,
true
);
test_validation!(
datetime_utc_tz_valid,
r#"<?xml version="1.0"?>
<value>2026-05-28T10:30:00Z</value>"#,
XSD_DATETIME,
true
);
test_validation!(
datetime_jst_tz_valid,
r#"<?xml version="1.0"?>
<value>2026-05-28T10:30:00+09:00</value>"#,
XSD_DATETIME,
true
);
test_validation!(
datetime_space_separator_invalid,
r#"<?xml version="1.0"?>
<value>2026-05-28 10:30:00</value>"#,
XSD_DATETIME,
false
);
test_validation!(
datetime_missing_seconds_invalid,
r#"<?xml version="1.0"?>
<value>2026-05-28T10:30</value>"#,
XSD_DATETIME,
false
);
test_validation!(
datetime_bad_month_invalid,
r#"<?xml version="1.0"?>
<value>2026-13-01T10:30:00</value>"#,
XSD_DATETIME,
false
);
const XSD_NILLABLE_INT: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="value" type="xs:int" nillable="true"/>
</xs:schema>"#;
test_validation!(
nillable_int_xsi_nil_empty_valid,
r#"<?xml version="1.0"?>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"></value>"#,
XSD_NILLABLE_INT,
true
);
test_validation!(
nillable_int_xsi_nil_self_closed_valid,
r#"<?xml version="1.0"?>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>"#,
XSD_NILLABLE_INT,
true
);
test_validation!(
nillable_int_with_value_valid,
r#"<?xml version="1.0"?>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">42</value>"#,
XSD_NILLABLE_INT,
true
);
test_validation!(
nillable_int_with_invalid_value_invalid,
r#"<?xml version="1.0"?>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">abc</value>"#,
XSD_NILLABLE_INT,
false
);