require'v8'require'cucumber/js_support/js_snippets'moduleCucumbermoduleJsSupportdefself.argument_safe_string(string)arg_string=string.to_s.gsub(/[']/,'\\\\\'')"'#{arg_string.gsub("\n",'\n')}'"endclassJsWorlddefinitialize@world=V8::Context.newenddefexecute(js_function,args=[])js_args=args.mapdo|arg|ifarg.is_a?(Ast::Table)"new CucumberJsDsl.Table(#{arg.raw.inspect})"elseJsSupport.argument_safe_string(arg)endend@world.eval("(#{js_function.ToString})(#{js_args.join(',')});")enddefmethod_missing(method_name,*args)@world.send(method_name,*args)endendclassJsStepDefinitiondefinitialize(js_language,regexp,js_function)@js_language,@regexp,@js_function=js_language,regexp.ToString,js_functionenddefinvoke(args)args=@js_language.execute_transforms(args)@js_language.current_world.execute(@js_function,args)enddefarguments_from(step_name)matches=eval_js"#{@regexp}.exec('#{step_name}')"ifmatchesmatches[1..-1].mapdo|match|JsArg.new(match)endendenddeffile_colon_line# Not possible yet to get file/line of js function with V8/therubyracer""endendclassJsHookdefinitialize(js_language,tag_names,js_function)@js_language,@tag_names,@js_function=js_language,tag_names,js_functionenddeftag_expressions@tag_namesenddefinvoke(location,scenario)@js_language.current_world.execute(@js_function)endendclassJsTransformdefinitialize(js_language,regexp,js_function)@js_language,@regexp,@js_function=js_language,regexp.ToString,js_functionenddefmatch(arg)arg=JsSupport.argument_safe_string(arg)matches=eval_js"#{@regexp}.exec(#{arg});"matches?matches[1..-1]:nilenddefinvoke(arg)@js_language.current_world.execute(@js_function,[arg])endendclassJsArgdefinitialize(arg)@arg=argenddefval@argenddefbyte_offsetendendclassJsLanguageincludeLanguageSupport::LanguageMethodsincludeJsSnippetsdefinitialize(step_mother)@step_definitions=[]@world=JsWorld.new@step_mother=step_mother@world["jsLanguage"]=self@world.load(File.dirname(__FILE__)+'/js_dsl.js')enddefload_code_file(js_file)@world.load(js_file)enddefalias_adverbs(adverbs)enddefbegin_scenario(scenario)enddefend_scenarioenddefstep_matches(name_to_match,name_to_format)@step_definitions.mapdo|step_definition|if(arguments=step_definition.arguments_from(name_to_match))StepMatch.new(step_definition,name_to_match,name_to_format,arguments)elsenilendend.compactenddefadd_step_definition(regexp,js_function)@step_definitions<<JsStepDefinition.new(self,regexp,js_function)end#TODO: support multiline arguments when calling steps from within stepsdefexecute_step_definition(name,multiline_argument=nil)@step_mother.step_match(name).invoke(multiline_argument)end#TODO: support multiple tag_namesdefregister_js_hook(phase,js_function,tag_name=nil)tag_names=tag_name?[tag_name]:[]add_hook(phase,JsHook.new(self,tag_names,js_function))enddefregister_js_transform(regexp,js_function)add_transform(JsTransform.new(self,regexp,js_function))enddefcurrent_world@worldendendendend