@@ -1751,8 +1751,157 @@ mod test {
1751
1751
} ;
1752
1752
}
1753
1753
1754
- // Export a macro for the child modules:
1754
+ /// Tests for https://github.com/tafia/quick-xml/issues/469
1755
+ macro_rules! small_buffers {
1756
+ (
1757
+ #[ $test: meta]
1758
+ $read_event: ident: $BufReader: ty
1759
+ $( , $async: ident, $await: ident) ?
1760
+ ) => {
1761
+ mod small_buffers {
1762
+ use crate :: events:: { BytesCData , BytesDecl , BytesStart , BytesText , Event } ;
1763
+ use crate :: reader:: Reader ;
1764
+ use pretty_assertions:: assert_eq;
1765
+
1766
+ #[ $test]
1767
+ $( $async) ? fn decl( ) {
1768
+ let xml = "<?xml ?>" ;
1769
+ // ^^^^^^^ data that fit into buffer
1770
+ let size = xml. match_indices( "?>" ) . next( ) . unwrap( ) . 0 + 1 ;
1771
+ let br = <$BufReader>:: with_capacity( size, xml. as_bytes( ) ) ;
1772
+ let mut reader = Reader :: from_reader( br) ;
1773
+ let mut buf = Vec :: new( ) ;
1774
+
1775
+ assert_eq!(
1776
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1777
+ Event :: Decl ( BytesDecl :: from_start( BytesStart :: from_content( "xml " , 3 ) ) )
1778
+ ) ;
1779
+ assert_eq!(
1780
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1781
+ Event :: Eof
1782
+ ) ;
1783
+ }
1784
+
1785
+ #[ $test]
1786
+ $( $async) ? fn pi( ) {
1787
+ let xml = "<?pi?>" ;
1788
+ // ^^^^^ data that fit into buffer
1789
+ let size = xml. match_indices( "?>" ) . next( ) . unwrap( ) . 0 + 1 ;
1790
+ let br = <$BufReader>:: with_capacity( size, xml. as_bytes( ) ) ;
1791
+ let mut reader = Reader :: from_reader( br) ;
1792
+ let mut buf = Vec :: new( ) ;
1793
+
1794
+ assert_eq!(
1795
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1796
+ Event :: PI ( BytesText :: new( "pi" ) )
1797
+ ) ;
1798
+ assert_eq!(
1799
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1800
+ Event :: Eof
1801
+ ) ;
1802
+ }
1803
+
1804
+ #[ $test]
1805
+ $( $async) ? fn empty( ) {
1806
+ let xml = "<empty/>" ;
1807
+ // ^^^^^^^ data that fit into buffer
1808
+ let size = xml. match_indices( "/>" ) . next( ) . unwrap( ) . 0 + 1 ;
1809
+ let br = <$BufReader>:: with_capacity( size, xml. as_bytes( ) ) ;
1810
+ let mut reader = Reader :: from_reader( br) ;
1811
+ let mut buf = Vec :: new( ) ;
1812
+
1813
+ assert_eq!(
1814
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1815
+ Event :: Empty ( BytesStart :: new( "empty" ) )
1816
+ ) ;
1817
+ assert_eq!(
1818
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1819
+ Event :: Eof
1820
+ ) ;
1821
+ }
1822
+
1823
+ #[ $test]
1824
+ $( $async) ? fn cdata1( ) {
1825
+ let xml = "<![CDATA[cdata]]>" ;
1826
+ // ^^^^^^^^^^^^^^^ data that fit into buffer
1827
+ let size = xml. match_indices( "]]>" ) . next( ) . unwrap( ) . 0 + 1 ;
1828
+ let br = <$BufReader>:: with_capacity( size, xml. as_bytes( ) ) ;
1829
+ let mut reader = Reader :: from_reader( br) ;
1830
+ let mut buf = Vec :: new( ) ;
1831
+
1832
+ assert_eq!(
1833
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1834
+ Event :: CData ( BytesCData :: new( "cdata" ) )
1835
+ ) ;
1836
+ assert_eq!(
1837
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1838
+ Event :: Eof
1839
+ ) ;
1840
+ }
1841
+
1842
+ #[ $test]
1843
+ $( $async) ? fn cdata2( ) {
1844
+ let xml = "<![CDATA[cdata]]>" ;
1845
+ // ^^^^^^^^^^^^^^^^ data that fit into buffer
1846
+ let size = xml. match_indices( "]]>" ) . next( ) . unwrap( ) . 0 + 2 ;
1847
+ let br = <$BufReader>:: with_capacity( size, xml. as_bytes( ) ) ;
1848
+ let mut reader = Reader :: from_reader( br) ;
1849
+ let mut buf = Vec :: new( ) ;
1850
+
1851
+ assert_eq!(
1852
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1853
+ Event :: CData ( BytesCData :: new( "cdata" ) )
1854
+ ) ;
1855
+ assert_eq!(
1856
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1857
+ Event :: Eof
1858
+ ) ;
1859
+ }
1860
+
1861
+ #[ $test]
1862
+ $( $async) ? fn comment1( ) {
1863
+ let xml = "<!--comment-->" ;
1864
+ // ^^^^^^^^^^^^ data that fit into buffer
1865
+ let size = xml. match_indices( "-->" ) . next( ) . unwrap( ) . 0 + 1 ;
1866
+ let br = <$BufReader>:: with_capacity( size, xml. as_bytes( ) ) ;
1867
+ let mut reader = Reader :: from_reader( br) ;
1868
+ let mut buf = Vec :: new( ) ;
1869
+
1870
+ assert_eq!(
1871
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1872
+ Event :: Comment ( BytesText :: new( "comment" ) )
1873
+ ) ;
1874
+ assert_eq!(
1875
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1876
+ Event :: Eof
1877
+ ) ;
1878
+ }
1879
+
1880
+ #[ $test]
1881
+ $( $async) ? fn comment2( ) {
1882
+ let xml = "<!--comment-->" ;
1883
+ // ^^^^^^^^^^^^^ data that fit into buffer
1884
+ let size = xml. match_indices( "-->" ) . next( ) . unwrap( ) . 0 + 2 ;
1885
+ let br = <$BufReader>:: with_capacity( size, xml. as_bytes( ) ) ;
1886
+ let mut reader = Reader :: from_reader( br) ;
1887
+ let mut buf = Vec :: new( ) ;
1888
+
1889
+ assert_eq!(
1890
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1891
+ Event :: Comment ( BytesText :: new( "comment" ) )
1892
+ ) ;
1893
+ assert_eq!(
1894
+ reader. $read_event( & mut buf) $( . $await) ? . unwrap( ) ,
1895
+ Event :: Eof
1896
+ ) ;
1897
+ }
1898
+ }
1899
+ } ;
1900
+ }
1901
+
1902
+ // Export macros for the child modules:
1755
1903
// - buffered_reader
1756
1904
// - slice_reader
1757
1905
pub ( super ) use check;
1906
+ pub ( super ) use small_buffers;
1758
1907
}
0 commit comments