source: tests/collections/string-istream-manip.cfa @ 8cffa4f

Last change on this file since 8cffa4f was 8cffa4f, checked in by Michael Brooks <mlbrooks@…>, 8 months ago

Support match-failure reporting for string input.

On failed match, assign the empty-string value to the target.
Prior handling did not modify the target,
which in context like char s[10]; sin | exclude("\n", s);,
left s uninitialized, and invalid for strlen, when the input's next character is a newline.
In this case, scanf offers the return value, the count of output arguments written,
to say, "I did not write to your buffer," a feature lost in the pipe abstraction.

Add tests to exercise such cases.

(Prior "leave uninitialized" treatment was discovered by surprise, while debugging a test program for an upcoming commit.)

  • Property mode set to 100644
File size: 2.5 KB
Line 
1
2#include <fstream.hfa>
3#include <collections/string.hfa>
4#include <collections/string_res.hfa>
5
6int main() {
7    /* Keep harmonized with io/manipulatorsInput */
8    {
9        string s = "yyyyyyyyyyyyyyyyyyyy";
10        char sk[] = "abc";
11        sin | "abc " | skip( sk ) | skip( 5 );          sout | "1" | s;
12        sin | s;                                        sout | "2" | s;
13        sin | ignore( s );                              sout | "3" | s;
14        sin | wdi( 8, s );                              sout | "4" | s;
15        sin | ignore( wdi( 8, s ) );                    sout | "5" | s;
16
17        sin | incl( "abc", s );                         sout | "6" | s;
18        sin | excl( "abc", s );                         sout | "7" | s;
19        sin | ignore( incl( "abc", s ) );               sout | "8" | s;
20        sin | ignore( excl( "abc", s ) );               sout | "9" | s;
21        sin | incl( "abc", wdi( 8, s ) );               sout | "10" | s;
22        sin | excl( "abc", wdi( 8, s ) );               sout | "11" | s;
23        sin | ignore( incl( "abc", wdi( 8, s ) ) );     sout | "12" | s;
24        sin | ignore( excl( "abc", wdi( 8, s ) ) );     sout | "13" | s;
25
26                s = "q";
27                sin | incl( "abc", s );                         sout | "14" | s;
28                s = "q";
29                sin | excl( "u", s );                           sout | "15" | s;
30                sin | skip( "u" );
31                sin | "\n";
32        }
33    {
34        string_res s = "yyyyyyyyyyyyyyyyyyyy";
35        char sk[] = "abc";
36        sin | "abc " | skip( sk ) | skip( 5 );          sout | "1" | s;
37        sin | s;                                        sout | "2" | s;
38        sin | ignore( s );                              sout | "3" | s;
39        sin | wdi( 8, s );                              sout | "4" | s;
40        sin | ignore( wdi( 8, s ) );                    sout | "5" | s;
41
42        sin | incl( "abc", s );                         sout | "6" | s;
43        sin | excl( "abc", s );                         sout | "7" | s;
44        sin | ignore( incl( "abc", s ) );               sout | "8" | s;
45        sin | ignore( excl( "abc", s ) );               sout | "9" | s;
46        sin | incl( "abc", wdi( 8, s ) );               sout | "10" | s;
47        sin | excl( "abc", wdi( 8, s ) );               sout | "11" | s;
48        sin | ignore( incl( "abc", wdi( 8, s ) ) );     sout | "12" | s;
49        sin | ignore( excl( "abc", wdi( 8, s ) ) );     sout | "13" | s;
50
51                s = "q";
52                sin | incl( "abc", s );                         sout | "14" | s;
53                s = "q";
54                sin | excl( "u", s );                           sout | "15" | s;
55                sin | skip( "u" );
56                sin | "\n";
57    }
58}
Note: See TracBrowser for help on using the repository browser.