1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Globalization ;
4+ using System . IO ;
5+
6+ namespace S7 . Net . UnitTest ;
7+
8+ internal static class Responder
9+ {
10+ private const string Comment = "//" ;
11+ private static char [ ] Space = " " . ToCharArray ( ) ;
12+
13+ public static byte [ ] Respond ( RequestResponsePair pair , byte [ ] request )
14+ {
15+ var offset = 0 ;
16+ var matches = new Dictionary < string , byte > ( ) ;
17+ var res = new List < byte > ( ) ;
18+ using var requestReader = new StringReader ( pair . RequestPattern ) ;
19+
20+ string line ;
21+ while ( ( line = requestReader . ReadLine ( ) ) != null )
22+ {
23+ var tokens = line . Split ( Space , StringSplitOptions . RemoveEmptyEntries ) ;
24+ foreach ( var token in tokens )
25+ {
26+ if ( token . StartsWith ( Comment ) ) break ;
27+
28+ if ( offset >= request . Length )
29+ {
30+ throw new Exception ( "Request pattern has more data than request." ) ;
31+ }
32+
33+ var received = request [ offset ] ;
34+
35+ if ( token . Length == 2 && byte . TryParse ( token , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var value ) )
36+ {
37+ // Number, exact match
38+ if ( value != received )
39+ {
40+ throw new Exception ( $ "Incorrect data at offset { offset } . Expected { value : X2} , received { received : X2} .") ;
41+ }
42+ }
43+ else
44+ {
45+ matches [ token ] = received ;
46+ }
47+
48+ offset ++ ;
49+ }
50+ }
51+
52+ if ( offset != request . Length ) throw new Exception ( "Request contained more data than request pattern." ) ;
53+
54+ using var responseReader = new StringReader ( pair . ResponsePattern ) ;
55+ while ( ( line = responseReader . ReadLine ( ) ) != null )
56+ {
57+ var tokens = line . Split ( Space , StringSplitOptions . RemoveEmptyEntries ) ;
58+ foreach ( var token in tokens )
59+ {
60+ if ( token . StartsWith ( Comment ) ) break ;
61+
62+ if ( token . Length == 2 && byte . TryParse ( token , NumberStyles . HexNumber , CultureInfo . InvariantCulture , out var value ) )
63+ {
64+ res . Add ( value ) ;
65+ }
66+ else
67+ {
68+ if ( ! matches . TryGetValue ( token , out var match ) )
69+ {
70+ throw new Exception ( $ "Unmatched token '{ token } ' in response.") ;
71+ }
72+
73+ res . Add ( match ) ;
74+ }
75+ }
76+ }
77+
78+ return res . ToArray ( ) ;
79+ }
80+ }
0 commit comments