<NME> undefined_step_result_spec.js
<BEF> ADDFILE
<MSG> Add skipped and undefined step results

The AST tree walker was treating undefined and skipped steps as special events (`UndefinedStep` and `SkippedStep` events) which lead to unnecessarily complex code within listeners.

`SkippedStepResult` and `UndefinedStepResult` were added and follow the more generix step result API.

The AST tree walker is still not fully considering those two cases as normal step results: it does not trigger `BeforeStep` and `AfterStep` around undefined and skipped steps yet.

<DFF> @@ -0,0 +1,47 @@
+require('../../support/spec_helper');
+
+describe("Cucumber.Runtime.UndefinedStepResult", function() {
+  var Cucumber = requireLib('cucumber');
+  var stepResult, step;
+
+  beforeEach(function() {
+    step       = createSpy("step");
+    stepResult = Cucumber.Runtime.UndefinedStepResult({step: step});
+  });
+
+  describe("isFailed()", function() {
+    it("is falsy", function() {
+      expect(stepResult.isFailed()).toBeFalsy();
+    });
+  });
+
+  describe("isPending()", function() {
+    it("is falsy", function() {
+      expect(stepResult.isPending()).toBeFalsy();
+    });
+  });
+
+  describe("isSkipped()", function() {
+    it("is falsy", function() {
+      expect(stepResult.isSkipped()).toBeFalsy();
+    });
+  });
+
+  describe("isSuccessful()", function() {
+    it("is falsy", function() {
+      expect(stepResult.isSuccessful()).toBeFalsy();
+    });
+  });
+
+  describe("isUndefined()", function() {
+    it("is truthy", function() {
+      expect(stepResult.isUndefined()).toBeTruthy();
+    });
+  });
+
+  describe("getStep()", function() {
+    it("returns the step passed to the constructor", function() {
+      expect(stepResult.getStep()).toBe(step);
+    });
+  });
+});

{'addition_count': 47, 'commit_subject': 'Add skipped and undefined step results', 'deletion_count': 0, 'file_extension': '.js', 'lang': 'js', 'license': 'mit', 'repo_name': 'cucumber/cucumber-js'}