@@ -98,14 +98,84 @@ TEST(ParserInteger, OtherType) {
9898 eminem::Parser parser (std::make_unique<byteme::PerByteSerial<char > >(std::move (reader)), {});
9999 parser.scan_preamble ();
100100
101- std::vector<uint16_t > observed;
102- EXPECT_TRUE (parser.template scan_integer <uint16_t >([&](eminem::Index, eminem::Index, uint16_t val) {
101+ std::vector<std:: uint16_t > observed;
102+ EXPECT_TRUE (parser.template scan_integer <std:: uint16_t >([&](eminem::Index, eminem::Index, std:: uint16_t val) {
103103 observed.push_back (val);
104104 }));
105- std::vector<uint16_t > expected { 33 , 666 , 9 };
105+ std::vector<std:: uint16_t > expected { 33 , 666 , 9 };
106106 EXPECT_EQ (observed, expected);
107107}
108108
109+ TEST (ParserInteger, Overflow) {
110+ // Unsigned.
111+ {
112+ // First we check that it works as a positive control.
113+ std::string input = " %%MatrixMarket matrix coordinate integer general\n 2 2 3\n 1 1 255\n 2 2 0\n 2 1 -0\n " ;
114+ auto reader = std::make_unique<byteme::RawBufferReader>(reinterpret_cast <const unsigned char *>(input.data ()), input.size ());
115+ eminem::Parser parser (std::make_unique<byteme::PerByteSerial<char > >(std::move (reader)), {});
116+ parser.scan_preamble ();
117+
118+ std::vector<std::uint8_t > observed;
119+ parser.scan_integer <std::uint8_t >([&](eminem::Index, eminem::Index, std::uint8_t val){
120+ observed.push_back (val);
121+ });
122+ std::vector<std::uint8_t > expected { 255 , 0 , 0 };
123+ EXPECT_EQ (observed, expected);
124+
125+ // Now testing for the failures.
126+ auto test_overflow = [&](std::string input) -> void {
127+ auto reader = std::make_unique<byteme::RawBufferReader>(reinterpret_cast <const unsigned char *>(input.data ()), input.size ());
128+ eminem::Parser parser (std::make_unique<byteme::PerByteSerial<char > >(std::move (reader)), {});
129+ parser.scan_preamble ();
130+ EXPECT_ANY_THROW ({
131+ try {
132+ parser.scan_integer <std::uint8_t >([&](eminem::Index, eminem::Index, std::uint8_t ){});
133+ } catch (std::exception& e) {
134+ EXPECT_THAT (e.what (), ::testing::HasSubstr (" flow" ));
135+ throw ;
136+ }
137+ });
138+ };
139+ test_overflow (" %%MatrixMarket matrix coordinate integer general\n 2 2 1\n 1 1 256" );
140+ test_overflow (" %%MatrixMarket matrix coordinate integer general\n 2 2 1\n 1 1 1000" );
141+ test_overflow (" %%MatrixMarket matrix coordinate integer general\n 2 2 1\n 1 1 -1" );
142+ }
143+
144+ // Signed.
145+ {
146+ // First we check that it works as a positive control.
147+ std::string input = " %%MatrixMarket matrix coordinate integer general\n 2 2 3\n 1 1 0\n 2 2 127\n 2 1 -128\n " ;
148+ auto reader = std::make_unique<byteme::RawBufferReader>(reinterpret_cast <const unsigned char *>(input.data ()), input.size ());
149+ eminem::Parser parser (std::make_unique<byteme::PerByteSerial<char > >(std::move (reader)), {});
150+ parser.scan_preamble ();
151+ std::vector<std::int8_t > observed;
152+ parser.scan_integer <std::int8_t >([&](eminem::Index, eminem::Index, std::int8_t val){
153+ observed.push_back (val);
154+ });
155+ std::vector<std::int8_t > expected { 0 , 127 , -128 };
156+ EXPECT_EQ (observed, expected);
157+
158+ // Now testing for the failures.
159+ auto test_overflow = [&](std::string input) -> void {
160+ auto reader = std::make_unique<byteme::RawBufferReader>(reinterpret_cast <const unsigned char *>(input.data ()), input.size ());
161+ eminem::Parser parser (std::make_unique<byteme::PerByteSerial<char > >(std::move (reader)), {});
162+ parser.scan_preamble ();
163+ EXPECT_ANY_THROW ({
164+ try {
165+ parser.scan_integer <std::int8_t >([&](eminem::Index, eminem::Index, std::int8_t ){});
166+ } catch (std::exception& e) {
167+ EXPECT_THAT (e.what (), ::testing::HasSubstr (" flow" ));
168+ throw ;
169+ }
170+ });
171+ };
172+ test_overflow (" %%MatrixMarket matrix coordinate integer general\n 2 2 1\n 1 1 128" );
173+ test_overflow (" %%MatrixMarket matrix coordinate integer general\n 2 2 1\n 1 1 1000" );
174+ test_overflow (" %%MatrixMarket matrix coordinate integer general\n 2 2 1\n 1 1 -129" );
175+ test_overflow (" %%MatrixMarket matrix coordinate integer general\n 2 2 1\n 1 1 -1000" );
176+ }
177+ }
178+
109179TEST (ParserInteger, QuitEarly) {
110180 std::string input = " %%MatrixMarket matrix coordinate integer general\n 10 10 3\n 1 2 33\n 4 5 666\n 7 8 9\n " ;
111181 auto reader = std::make_unique<byteme::RawBufferReader>(reinterpret_cast <const unsigned char *>(input.data ()), input.size ());
0 commit comments