1 module tests.match;
2 
3 import unit_threaded;
4 import cucumber.keywords;
5 import cucumber.feature;
6 
7 package string[] matchFuncCalls;
8 
9 @Match(r"^I match a passing step$")
10 void passingStep1() {
11     matchFuncCalls ~= "passingStep1";
12 }
13 
14 @Match(r"^I also match a passing step$")
15 void passingStep2() {
16     matchFuncCalls ~= "passingStep2";
17 }
18 
19 @Match(r"^What about me. I also pass$")
20 void passingStep3() {
21     matchFuncCalls ~= "passingStep3";
22 }
23 
24 @Match(r"I match a failing step$")
25 void failingStep() {
26     matchFuncCalls ~= "failingStep";
27     throw new Exception("Exception: step failed");
28 }
29 
30 private {
31     @Match(r"Never going to see me")
32     void privateStep();
33 }
34 
35 
36 void testMatchPassing12() {
37     matchFuncCalls = [];
38     const results = runFeature!__MODULE__(["Feature: A feature", "  Scenario: A Scenario:",
39                                            "I match a passing step", "I also match a passing step"]);
40     shouldEqual(results.numScenarios, 1);
41     shouldEqual(results.numPassing, 1);
42     shouldEqual(results.numFailing, 0);
43     shouldEqual(results.numPending, 0);
44     shouldEqual(results.numUndefined, 0);
45     shouldEqual(results.toString(), "1 scenario (1 passed)");
46     shouldEqual(matchFuncCalls, ["passingStep1", "passingStep2"]);
47 }
48 
49 void testMatchPassing3() {
50     matchFuncCalls = [];
51     const results = runFeature!__MODULE__(["What about me? I also pass"]);
52     shouldEqual(results.numScenarios, 1);
53     shouldEqual(results.numPassing, 1);
54     shouldEqual(results.numFailing, 0);
55     shouldEqual(results.numPending, 0);
56     shouldEqual(results.numUndefined, 0);
57     shouldEqual(results.toString(), "1 scenario (1 passed)");
58     shouldEqual(matchFuncCalls, ["passingStep3"]);
59 }
60 
61 void testMatchNotPassing() {
62     matchFuncCalls = [];
63     const results = runFeature!__MODULE__(["I match a failing step"]);
64     shouldEqual(results.numScenarios, 1);
65     shouldEqual(results.numPassing, 0);
66     shouldEqual(results.numFailing, 1);
67     shouldEqual(results.numPending, 0);
68     shouldEqual(results.numUndefined, 0);
69     shouldEqual(results.toString(), "1 scenario (1 failed)");
70     shouldEqual(matchFuncCalls, ["failingStep"]);
71 }
72 
73 
74 void testUndefinedWithWrongString() {
75     matchFuncCalls = [];
76     const results = runFeature!__MODULE__(["totally invented string"]);
77     shouldEqual(results.numScenarios, 1);
78     shouldEqual(results.numPassing, 0);
79     shouldEqual(results.numFailing, 0);
80     shouldEqual(results.numPending, 0);
81     shouldEqual(results.numUndefined, 1);
82     shouldEqual(results.toString(), "1 scenario (1 undefined)");
83     shouldEqual(matchFuncCalls, []);
84 }
85 
86 
87 @Match(r"Gotta match pending")
88 void pendingStep() {
89     pending();
90 }
91 
92 void testPending() {
93     matchFuncCalls = [];
94     const results = runFeature!__MODULE__(["Gotta match pending"]);
95     shouldEqual(results.numScenarios, 1);
96     shouldEqual(results.numPassing, 0);
97     shouldEqual(results.numFailing, 0);
98     shouldEqual(results.numPending, 1);
99     shouldEqual(results.toString(), "1 scenario (1 pending)");
100     shouldEqual(matchFuncCalls, []);
101 }