@@ -86,6 +86,8 @@ private slots:
86
86
87
87
void readerApi_data () { arrays_data (); }
88
88
void readerApi ();
89
+ void reparse_data ();
90
+ void reparse ();
89
91
90
92
// chunked string API
91
93
void chunkedString_data ();
@@ -108,8 +110,8 @@ private slots:
108
110
void validation ();
109
111
void strictValidation_data ();
110
112
void strictValidation ();
111
- void resumeParsing_data ();
112
- void resumeParsing ();
113
+ void incompleteData_data ();
114
+ void incompleteData ();
113
115
void endPointer_data ();
114
116
void endPointer ();
115
117
void recursionLimit_data ();
@@ -755,30 +757,25 @@ void tst_Parser::mapsAndArrays()
755
757
" {_ 1: [_ " + expected + " ], \" Hello\" : {_ " + expected + " : (_ )}}" );
756
758
}
757
759
758
- void tst_Parser::readerApi ()
759
- {
760
- QFETCH (QByteArray, data);
761
- QFETCH (QString, expected);
762
-
763
- struct Input {
764
- QByteArray data;
765
- int consumed;
766
- } input = { data, 0 };
760
+ struct Input {
761
+ QByteArray data;
762
+ int consumed;
763
+ };
767
764
768
- CborParserOperations ops;
769
- ops. can_read_bytes = [](void *token, size_t len) {
765
+ static const CborParserOperations byteArrayOps = {
766
+ /* can_read_bytes = */ [](void *token, size_t len) {
770
767
auto input = static_cast <Input *>(token);
771
768
return input->data .size () - input->consumed >= int (len);
772
- };
773
- ops. read_bytes = [](void *token, void *dst, size_t offset, size_t len) {
769
+ },
770
+ /* read_bytes = */ [](void *token, void *dst, size_t offset, size_t len) {
774
771
auto input = static_cast <Input *>(token);
775
772
return memcpy (dst, input->data .constData () + input->consumed + offset, len);
776
- };
777
- ops. advance_bytes = [](void *token, size_t len) {
773
+ },
774
+ /* advance_bytes = */ [](void *token, size_t len) {
778
775
auto input = static_cast <Input *>(token);
779
776
input->consumed += int (len);
780
- };
781
- ops. transfer_string = [](void *token, const void **userptr, size_t offset, size_t len) {
777
+ },
778
+ /* transfer_string = */ [](void *token, const void **userptr, size_t offset, size_t len) {
782
779
// ###
783
780
auto input = static_cast <Input *>(token);
784
781
if (input->data .size () - input->consumed < int (len + offset))
@@ -787,11 +784,60 @@ void tst_Parser::readerApi()
787
784
*userptr = input->data .constData () + input->consumed ;
788
785
input->consumed += int (len);
789
786
return CborNoError;
790
- };
787
+ }
788
+ };
789
+
790
+ void tst_Parser::readerApi ()
791
+ {
792
+ QFETCH (QByteArray, data);
793
+ QFETCH (QString, expected);
794
+
795
+ Input input = { data, 0 };
791
796
792
797
CborParser parser;
793
798
CborValue first;
794
- CborError err = cbor_parser_init_reader (&ops, &parser, &first, &input);
799
+ CborError err = cbor_parser_init_reader (&byteArrayOps, &parser, &first, &input);
800
+ QCOMPARE (err, CborNoError);
801
+
802
+ QString decoded;
803
+ err = parseOne (&first, &decoded);
804
+ QCOMPARE (err, CborNoError);
805
+ QCOMPARE (decoded, expected);
806
+
807
+ // check we consumed everything
808
+ QCOMPARE (input.consumed , data.size ());
809
+ }
810
+
811
+ void tst_Parser::reparse_data ()
812
+ {
813
+ // only one-item rows
814
+ addColumns ();
815
+ addFixedData ();
816
+ }
817
+
818
+ void tst_Parser::reparse ()
819
+ {
820
+ QFETCH (QByteArray, data);
821
+ QFETCH (QString, expected);
822
+
823
+ Input input = { QByteArray (), 0 };
824
+ CborParser parser;
825
+ CborValue first;
826
+ CborError err = cbor_parser_init_reader (&byteArrayOps, &parser, &first, &input);
827
+ QCOMPARE (err, CborErrorUnexpectedEOF);
828
+
829
+ for (int i = 0 ; i < data.size (); ++i) {
830
+ input.data = data.left (i);
831
+ err = cbor_value_reparse (&first);
832
+ if (err != CborErrorUnexpectedEOF)
833
+ qDebug () << " At" << i;
834
+ QCOMPARE (err, CborErrorUnexpectedEOF);
835
+ QCOMPARE (input.consumed , 0 );
836
+ }
837
+
838
+ // now it should work
839
+ input.data = data;
840
+ err = cbor_value_reparse (&first);
795
841
QCOMPARE (err, CborNoError);
796
842
797
843
QString decoded;
@@ -1707,7 +1753,7 @@ void tst_Parser::strictValidation()
1707
1753
QCOMPARE (err, expectedError);
1708
1754
}
1709
1755
1710
- void tst_Parser::resumeParsing_data ()
1756
+ void tst_Parser::incompleteData_data ()
1711
1757
{
1712
1758
addColumns ();
1713
1759
addFixedData ();
@@ -1716,7 +1762,7 @@ void tst_Parser::resumeParsing_data()
1716
1762
addMapMixedData ();
1717
1763
}
1718
1764
1719
- void tst_Parser::resumeParsing ()
1765
+ void tst_Parser::incompleteData ()
1720
1766
{
1721
1767
QFETCH (QByteArray, data);
1722
1768
QFETCH (QString, expected);
0 commit comments