package gherkin.formatter; import static gherkin.util.FixJava.readResource; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import gherkin.JSONParser; import gherkin.deps.com.google.gson.Gson; import gherkin.formatter.model.Comment; import gherkin.formatter.model.DocString; import gherkin.formatter.model.Feature; import gherkin.formatter.model.Match; import gherkin.formatter.model.Result; import gherkin.formatter.model.Scenario; import gherkin.formatter.model.Step; import gherkin.formatter.model.Tag; import java.io.PrintStream; import java.io.StringReader; import java.util.Collections; import java.util.List; import java.util.Map; import org.junit.Test; public class JSONFormatterTest { @Test public void shouldNotCloseProvidedStreamInDone() { PrintStream out = mock(PrintStream.class); Formatter formatter = new JSONFormatter(out); formatter.done(); verify(out, never()).close(); } @Test public void shouldFlushAndCloseProvidedStreamInClose() { PrintStream out = mock(PrintStream.class); Formatter formatter = new JSONFormatter(out); formatter.close(); verify(out).flush(); verify(out).close(); } @Test public void should_roundtrip_this_json() { // From json_parser_spec.rb String json = readResource("/gherkin/formatter/model/complicated.json"); checkJson(json); } private void checkJson(String json) { Appendable io = new StringBuilder(); JSONPrettyFormatter f = new JSONPrettyFormatter(io); JSONParser p = new JSONParser(f, f); p.parse(json); f.done(); Gson gson = new Gson(); List expected = gson.fromJson(new StringReader(json), List.class); List actual = gson.fromJson(new StringReader(io.toString()), List.class); assertEquals(expected, actual); } @SuppressWarnings("rawtypes") @Test public void testAllStepsFirstOrderingOfCalls() { StringBuilder stringBuilder = new StringBuilder(); JSONFormatter jsonFormatter = new JSONPrettyFormatter(stringBuilder); Feature feature = feature("Test Feature"); Scenario scenario = scenario("Test Scenario"); Step step1 = step("Given", "Step 1"); Step step2 = step("Given", "Step 2"); final byte[] data1 = new byte[] {1, 2, 3}; String text1 = "text1"; String text2 = "text2"; final byte[] data2 = new byte[] {4}; Result step1Result = result("passed"); Result step2Result = result("failed"); jsonFormatter.uri(uri()); jsonFormatter.feature(feature); jsonFormatter.startOfScenarioLifeCycle(scenario); jsonFormatter.before(match(), result("passed")); jsonFormatter.scenario(scenario); jsonFormatter.step(step1); jsonFormatter.step(step2); jsonFormatter.match(match()); jsonFormatter.embedding("mime-type", data1); jsonFormatter.write(text1); jsonFormatter.result(step1Result); jsonFormatter.match(match()); jsonFormatter.write(text2); jsonFormatter.embedding("mime-type-2", data2); jsonFormatter.result(step2Result); jsonFormatter.endOfScenarioLifeCycle(scenario); jsonFormatter.eof(); jsonFormatter.done(); jsonFormatter.close(); Gson gson = new Gson(); List result = gson.fromJson(stringBuilder.toString(), List.class); Map featureJson = (Map) result.get(0); assertEquals(feature.getName(), featureJson.get("name")); Map scenarioJson = (Map) ((List) featureJson.get("elements")).get(0); assertEquals(scenario.getName(), scenarioJson.get("name")); Map step1Json = (Map) ((List)scenarioJson.get("steps")).get(0); assertJsonStepData(step1, step1Result, step1Json); Map step2Json = (Map) ((List)scenarioJson.get("steps")).get(1); assertJsonStepData(step2, step2Result, step2Json); } @SuppressWarnings("rawtypes") @Test public void testOneStepAtTheTimeOrderingOfCalls() { StringBuilder stringBuilder = new StringBuilder(); JSONFormatter jsonFormatter = new JSONPrettyFormatter(stringBuilder); Feature feature = feature("Test Feature"); Scenario scenario = scenario("Test Scenario"); Step step1 = step("Given", "Step 1"); Step step2 = step("Given", "Step 2"); final byte[] data1 = new byte[] {1, 2, 3}; String text1 = "text1"; String text2 = "text2"; final byte[] data2 = new byte[] {4}; Result step1Result = result("passed"); Result step2Result = result("failed"); jsonFormatter.uri(uri()); jsonFormatter.feature(feature); jsonFormatter.startOfScenarioLifeCycle(scenario); jsonFormatter.before(match(), result("passed")); jsonFormatter.scenario(scenario); jsonFormatter.step(step1); jsonFormatter.match(match()); jsonFormatter.embedding("mime-type", data1); jsonFormatter.write(text1); jsonFormatter.result(step1Result); jsonFormatter.step(step2); jsonFormatter.match(match()); jsonFormatter.write(text2); jsonFormatter.embedding("mime-type-2", data2); jsonFormatter.result(step2Result); jsonFormatter.endOfScenarioLifeCycle(scenario); jsonFormatter.eof(); jsonFormatter.done(); jsonFormatter.close(); Gson gson = new Gson(); List result = gson.fromJson(stringBuilder.toString(), List.class); Map featureJson = (Map) result.get(0); assertEquals(feature.getName(), featureJson.get("name")); Map scenarioJson = (Map) ((List) featureJson.get("elements")).get(0); assertEquals(scenario.getName(), scenarioJson.get("name")); Map step1Json = (Map) ((List)scenarioJson.get("steps")).get(0); assertJsonStepData(step1, step1Result, step1Json); Map step2Json = (Map) ((List)scenarioJson.get("steps")).get(1); assertJsonStepData(step2, step2Result, step2Json); } @SuppressWarnings("rawtypes") @Test public void testBeforeHooks() { StringBuilder stringBuilder = new StringBuilder(); JSONFormatter jsonFormatter = new JSONPrettyFormatter(stringBuilder); Feature feature = feature("Test Feature"); Scenario scenario1 = scenario("Test Scenario 1"); Scenario scenario2 = scenario("Test Scenario 2"); jsonFormatter.uri(uri()); jsonFormatter.feature(feature); jsonFormatter.startOfScenarioLifeCycle(scenario1); jsonFormatter.before(match(), result("passed")); jsonFormatter.scenario(scenario1); jsonFormatter.endOfScenarioLifeCycle(scenario1); jsonFormatter.startOfScenarioLifeCycle(scenario2); jsonFormatter.before(match(), result("passed")); jsonFormatter.scenario(scenario2); jsonFormatter.endOfScenarioLifeCycle(scenario2); jsonFormatter.eof(); jsonFormatter.done(); jsonFormatter.close(); Gson gson = new Gson(); List result = gson.fromJson(stringBuilder.toString(), List.class); Map featureJson = (Map) result.get(0); assertEquals(feature.getName(), featureJson.get("name")); Map scenarioJson = (Map) ((List) featureJson.get("elements")).get(0); assertEquals(scenario1.getName(), scenarioJson.get("name")); List beforeHooks = (List) scenarioJson.get("before"); assertEquals(1, beforeHooks.size()); scenarioJson = (Map) ((List) featureJson.get("elements")).get(1); assertEquals(scenario2.getName(), scenarioJson.get("name")); beforeHooks = (List) scenarioJson.get("before"); assertEquals(1, beforeHooks.size()); } private void assertJsonStepData(Step step, Result stepResult, Map stepJson) { assertEquals(step.getName(), stepJson.get("name")); List embeddings1 = (List)stepJson.get("embeddings"); assertNotNull("embeddings", embeddings1); assertEquals("embeddings size", embeddings1.size(), 1); List output1 = (List)stepJson.get("output"); assertNotNull("output", output1); assertEquals("output size", output1.size(), 1); Map step1ResultJson = (Map) stepJson.get("result"); assertEquals(stepResult.getStatus(), step1ResultJson.get("status")); } private String uri() { return "uri"; } private Feature feature(String featureName) { return new Feature(Collections.<Comment>emptyList(), Collections.<Tag>emptyList(), "", featureName, "", 12, ""); } private Scenario scenario(String scenarioName) { return new Scenario(Collections.<Comment>emptyList(), Collections.<Tag>emptyList(), "", scenarioName, "", 13, ""); } private Step step(String keyword, String stepName) { return new Step(Collections.<Comment>emptyList(), keyword, stepName, 14, null, new DocString("", "", 52)); } private Match match() { return new Match(null, null); } private Result result(String status) { return new Result(status, 565L, ""); } }