package net.serenitybdd.screenplay.jenkins.actions; import com.google.common.base.Joiner; import net.serenitybdd.screenplay.Action; import net.serenitybdd.screenplay.Actor; import net.serenitybdd.screenplay.targets.Target; import net.serenitybdd.screenplayx.actions.Evaluate; import net.thucydides.core.annotations.Step; import java.util.List; import static java.util.Arrays.asList; import static net.serenitybdd.screenplay.Tasks.instrumented; public class EnterCode { public static EnterCode asFollows(String... lines) { return new EnterCode(asList(lines)); } public Action intoTheCodeMirror(Target editorField) { return instrumented(EnterCodeIntoCodeMirrorEditor.class, editorField, Joiner.on(System.lineSeparator()).join(lines)); } public Action intoThePipelineEditor(Target editorField) { return instrumented(EnterCodeIntoPipelineEditor.class, editorField, Joiner.on(System.lineSeparator()).join(lines)); } public EnterCode(List<String> lines) { this.lines = lines; } private final List<String> lines; public static class EnterCodeIntoCodeMirrorEditor implements Action { private final Target target; private final String code; public EnterCodeIntoCodeMirrorEditor(Target target, String code) { this.target = target; this.code = code; } @Override @Step("{0} enters '#code' into the code editor field") public <T extends Actor> void performAs(T actor) { actor.attemptsTo(Evaluate.javascript( setCodeMirrorValueTo(code), target.resolveFor(actor) )); } private String setCodeMirrorValueTo(String code) { return String.format( "var code_mirror = arguments[0].CodeMirror;" + "if (code_mirror != null) { " + " code_mirror.setValue('%s');" + " code_mirror.save();" + "} else { " + " console.error('CodeMirror object is not present on the', arguments[0], 'element'); " + "}", escapeNewLineCharacters(code)); } private String escapeNewLineCharacters(String code) { return code.replaceAll("\n", "\\\\n"); } } private static class EnterCodeIntoPipelineEditor implements Action { private final Target target; private final String code; public EnterCodeIntoPipelineEditor(Target target, String code) { this.target = target; this.code = code; } @Override @Step("{0} enters '#code' into the pipeline editor field") public <T extends Actor> void performAs(T actor) { target.resolveFor(actor).type(code); } } }