2 // assembly: System_test
\r
3 // namespace: MonoTests.System.Text.RegularExpressions
\r
6 // author: Dan Lewis (dlewis@gmx.co.uk)
\r
10 using System.Text.RegularExpressions;
\r
12 using NUnit.Framework;
\r
14 namespace MonoTests.System.Text.RegularExpressions {
\r
16 public class PerlTest : TestCase {
\r
17 public static ITest Suite {
\r
18 get { return new TestSuite (typeof (PerlTest)); }
\r
21 public PerlTest () : this ("System.Text.RegularExpressions Perl testsuite") { }
\r
22 public PerlTest (string name) : base (name) { }
\r
24 public void TestTrials () {
\r
25 foreach (RegexTrial trial in PerlTrials.trials) {
\r
26 string msg = trial.Execute ();
\r
28 Assertion.Fail (msg);
\r
32 protected override void SetUp () { }
\r
33 protected override void TearDown () { }
\r
37 public string pattern;
\r
38 public RegexOptions options;
\r
39 public string input;
\r
41 public Result expected;
\r
42 public uint checksum;
\r
44 public RegexTrial (string pattern, RegexOptions options, string input, Result expected, uint checksum) {
\r
45 this.pattern = pattern;
\r
46 this.options = options;
\r
48 this.expected = expected;
\r
49 this.checksum = checksum;
\r
52 public string Execute () {
\r
54 Regex re = new Regex (pattern, options);
\r
55 Match m = re.Match (input);
\r
58 uint sum = CreateChecksum (re, m);
\r
59 return Report (Result.Pass, sum);
\r
62 return Report (Result.Fail, 0);
\r
65 return Report (Result.Error, 0);
\r
69 public override string ToString () {
\r
71 "Matching input '" + input +
\r
72 "' against pattern '" + pattern +
\r
73 "' with options '" + options + "'.";
\r
78 private static uint CreateChecksum (Regex re, Match m) {
\r
79 Checksum sum = new Checksum ();
\r
81 // group name mapping
\r
83 string[] names = re.GetGroupNames ();
\r
84 foreach (string name in re.GetGroupNames ()) {
\r
86 sum.Add ((uint)re.GroupNumberFromName (name));
\r
91 foreach (Group group in m.Groups) {
\r
92 foreach (Capture cap in group.Captures) {
\r
93 sum.Add ((uint)cap.Index);
\r
94 sum.Add ((uint)cap.Length);
\r
101 private string Report (Result actual, uint sum) {
\r
102 if (actual == expected && sum == checksum)
\r
105 string msg = this.ToString ();
\r
106 if (actual != expected) {
\r
108 " Expected " + expected +
\r
109 ", but result was " + actual + ".";
\r
112 if (sum != checksum)
\r
113 msg += " Bad checksum.";
\r
127 public Checksum () {
\r
131 public uint Value {
\r
132 get { return sum; }
\r
135 public void Add (string str) {
\r
136 for (int i = 0; i < str.Length; ++ i)
\r
140 public void Add (uint n) {
\r
144 public void Add (ulong n, int bits) {
\r
145 ulong mask = 1ul << (bits - 1);
\r
146 for (int i = 0; i < bits; ++ i) {
\r
147 Add ((n & mask) != 0);
\r
152 public void Add (bool bit) {
\r
153 bool top = (sum & 0x80000000) != 0;
\r
155 sum ^= bit ? (uint)1 : (uint)0;
\r
162 private readonly uint key = 0x04c11db7;
\r